2013-03-19 2 views
0

Я уже искал Stackoverflow без везения;Как использовать сетку struts2 с отправкой формы

Я хочу сделать одну форму фильтра, в которой пользователь вводит данные, и в соответствии с этими данными я хочу показать результаты в Struts2 jQGrid.

По умолчанию при загрузке страницы Struts2 jQGrid уже имеет URL-адрес действия, имеющий все данные.

Я попытался установить цель формы и <sj:a>, но это не сработало.

См код:

Это моя Сетка:

<sjg:grid gridModel="items" 
          href="%{itemsUrl}" 
          caption="Items" 
          id="filterGrid" 
          dataType="json" 
          rownumbers="true" 
          pager="true" 
          navigator="false" 
          rowList="10, 15, 20" 
          rowNum="10" 
          viewrecords="true" 
          loadonce="true" 
          formIds="filterForm" 

          > 
    <sjg:gridColumn name="item.itemname" title="Item Name"></sjg:gridColumn> 
    <sjg:gridColumn name="shelves.shelfname" title="Shelf Name"></sjg:gridColumn> 
    <sjg:gridColumn name="quantity" title="Available Qauntity"></sjg:gridColumn> 
    <sjg:gridColumn name="item.itemprice" title="Item Price"></sjg:gridColumn> 
</sjg:grid> 

Моя форма:

<s:form id="filterForm" action="%{filterUrl}"> 
    <table style="width:100%"> 
     <tr> 
      <td colspan="4"> 
       <s:textfield key="global.item.list.name" name="nameContains" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <s:textfield key="global.item.list.pricefrom" name="priceFrom" /> 
      </td> 
      <td colspan="2"> 
       <s:textfield key="global.item.list.priceto" name="priceTo" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="4"> 
       <s:select cssStyle="width: 100%" id="SelectCategoryList" 
        multiple="true" list="categoryList" listKey="categoryId" listValue="categoryType" 
        headerKey="-1" headerValue="Select Type" key="global.add.item.type" 
        loadingText="Item Types Loading..." /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="4"> 
       <div id="fields"></div> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="4"> 
       <sj:a targets="filterGrid" button="true" 
        key="global.item.list.form.submit" onClickTopics="reloadMyGrid" /> 
     </tr> 
    </table> 
</s:form> 

и функции Ajax reloadTopics:

$.subscribe("reloadMyGrid", function() { 
     //alert("df") 
     $("#filterForm").submit(); 
     $("#filterGrid").trigger("reloadGrid"); 
     return false; 
     }); 

На самом деле я видел такие стиль в другом stackoverflow вопрос (here), и я не знаю, что писать в выше функции.

Спасибо

EDIT # 1


Я ве изменен код, как:

<sj:a targets="filterGrid" 
     button="true" 
     key="global.item.list.form.submit" 
     formIds="filterForm" 
     onSuccess‌​Topics="reloadGrid" /> 

<sjg:grid gridModel="items" 
      href="%{itemsUrl}" 
      caption="Items" 
      id="filterGrid" 
      dataType="j‌​son" 
      rownumbers="true" 
      pager="true" 
      navigator="false" 
      rowList‌​="10, 15, 20" 
      rowNum="10" 
      viewrecords="true"> 

форма получает представлены данные JSON также получены, но сетка не отображается все, даже путем перегрузки

EDIT # 2

После изменения моего полного кода является:

<s:url id="filterUrl" action="ListItemFilter" /> 
       <s:form id="filterForm" action="%{filterUrl}"> 
        <table style="width:100%"> 
         <tr> 
          <td colspan="4"> 
           <s:textfield key="global.item.list.name" name="nameContains" /> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="2"> <s:textfield key="global.item.list.pricefrom" name="priceFrom" /> </td> 
          <td colspan="2"> <s:textfield key="global.item.list.priceto" name="priceTo" /> </td> 
         </tr> 
         <tr> 
          <td colspan="4"> 
           <s:select 
            cssStyle="width: 100%" 

            id="SelectCategoryList" 
            multiple="true" 
            list = "categoryList" 
            listKey = "categoryId" 
            listValue = "categoryType" 
            headerKey="-1" 
            headerValue="Select Type" 
            key = "global.add.item.type" 
            loadingText="Item Types Loading..." 
           /> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="4"> 
           <div id="fields"></div> 
          </td> 
         </tr> 
         <tr> 
          <td colspan="4"> <sj:a targets="filterGrid" 
          button="true" 
          key="global.item.list.form.submit" 
          formIds="filterForm" 
          onSuccessTopics="reloadGrid" 
          /> 
         </tr> 
        </table> 
       </s:form> 

<s:url id="itemsUrl" action="ListItems" />  
     <div class="gridSection"> 
     <sjg:grid gridModel="items" 
         href="%{itemsUrl}" 
         caption="Items" 
         id="filterGrid" 
         dataType="json" 
         rownumbers="true" 
         pager="true" 
         navigator="false" 
         rowList="10, 15, 20" 
         rowNum="10" 
         viewrecords="true"      
         > 
       <sjg:gridColumn name="item.itemname" title="Item Name"></sjg:gridColumn> 
       <sjg:gridColumn name="shelves.shelfname" title="Shelf Name"></sjg:gridColumn> 
       <sjg:gridColumn name="quantity" title="Available Qauntity"></sjg:gridColumn> 
       <sjg:gridColumn name="item.itemprice" title="Item Price"></sjg:gridColumn> 
      </sjg:grid> 
     </div> 

struts.xml:

<action name="ListItems" class="com.acty.libsys.actions.ListItemsAction"> 
<result name="success" type="json"></result> 
</action> 
<action name="ListItemFilter" class="com.acty.libsys.actions.ListItemsAction" method="filter"> 
    <result name="success" type="json"></result> 
</action> 

и действие:

public class ListItemsAction extends ActionSupport { 
    private static final long serialVersionUID = 1L; 

    private List<ItemCategory> categoryList; 

    public List<ItemCategory> getCategoryList() { 
     return categoryList; 
    } 

    public void setCategoryList(List<ItemCategory> categoryList) { 
     this.categoryList = categoryList; 
    } 

    public String execute() { 
     serviceProvider.openConnection(); 
     /*This will be available to select box of ListItem.jsp*/ 
     categoryList = serviceProvider.getItemCategoryMapper().selectByExample(null); 
     items = serviceProvider.getShelfItemsMapper().selectItemsFromShelf();System.out.println("fidddds "+items); 
     serviceProvider.closeConnection(); 
     return SUCCESS; 
    } 

    public String filter() { 
     ShelfItemsExample example = new ShelfItemsExample(); 

     if(!("".equals(nameContains))) 
      example.createCriteria().andItemnameIsLike(nameContains); 
     if(priceFrom != null && priceTo != null) 
      example.createCriteria().andItemPriceBetween(priceFrom, priceTo); 

     System.out.println("nameContains "+nameContains + " priceFrom " + priceFrom); 
     if(itemCategoryFields != null && !(itemCategoryFields.isEmpty())) { 
      List<String> fieldIds = new ArrayList<String>(); 
      List<String> fieldValues = new ArrayList<String>(); 

      for(Map.Entry<String, String> entry: itemCategoryFields.entrySet()){ 
       fieldIds.add(entry.getKey()); 
       fieldValues.add(entry.getValue()); 
      } 
      example.createCriteria().andFieldIdIn(fieldIds); 

      example.setCondition(fieldValues); 
     }  

     serviceProvider.openConnection(); 
     items = serviceProvider.getShelfItemsMapper().selectFiltered(example); 
     System.out.println("fids "+items); 
     serviceProvider.closeConnection(); 
     return SUCCESS; 
    } 

    public void setItems(List<ShelfItems> items) { 
     this.items = items; 
    } 

    /* Used when filter button clicked*/ 
    private String nameContains; 
    private BigDecimal priceFrom; 
    private BigDecimal priceTo; 

    private Map<String, String> itemCategoryFields; 

    public String getNameContains() { 
     return nameContains; 
    } 

    public void setNameContains(String nameContains) { 
     this.nameContains = nameContains; 
    } 

    public BigDecimal getPriceFrom() { 
     return priceFrom; 
    } 

    public void setPriceFrom(BigDecimal priceFrom) { 
     this.priceFrom = priceFrom; 
    } 

    public BigDecimal getPriceTo() { 
     return priceTo; 
    } 

    public void setPriceTo(BigDecimal priceTo) { 
     this.priceTo = priceTo; 
    } 

    public Map<String, String> getItemCategoryFields() { 
     return itemCategoryFields; 
    } 

    public void setItemCategoryFields(Map<String, String> itemCategoryFields) { 
     this.itemCategoryFields = itemCategoryFields; 
    } 

    /* used when first the form loads*/ 
    private List<ShelfItems> items; 

    public List<ShelfItems> getItems() { 
     return items; 
    } 

    private DataServiceProviderInterface serviceProvider; 

    public DataServiceProviderInterface getServiceProvider() { 
     return serviceProvider; 
    } 

    public void setServiceProvider(DataServiceProviderInterface serviceProvider) { 
     this.serviceProvider = serviceProvider; 
    } 
} 

и ива также написано

$.subscribe("reloadGrid", function(){ 
    $("filterGrid").trigger("reloadGrid");alert("DF"); 
}); 

Теперь, Что проблема я не мог понять ... Plz предоставить мне solution..plz

+0

Вы видели части сетки в Struts2-JQuery плагин Showcase? http://struts.jgeppert.com/struts2-jquery-showcase/index.action –

+0

Спасибо, мистер Андреа, мне очень помогли. Но опять-таки проблема. я ве изменил код, как: Форма отправляется, данные json также получены, но сетка не показывает ничего, даже перезагружая – Jaydeep

+0

Где вы определяете '% {itemsUrl}' и '% {filterUrl}'? Отправьте два '' ', если они существуют. Если они этого не сделают, мы выяснили (одну из) проблему (проблемы). –

ответ

0

вы должны использовать фильтры для фильтрации столбцов и на основе ваших фильтров ваша сетка будет заполнить данные.

Try что-то вроде этого

<sjg:grid gridModel="items" 
          href="%{itemsUrl}" 
          caption="Items" 
          id="filterGrid" 
          dataType="json" 
          rownumbers="true" 
          pager="true" 
          navigator="false" 
          rowList="10, 15, 20" 
          rowNum="10" 
          viewrecords="true" 
          loadonce="true" 
          formIds="filterForm" 

          filter="true" 
          filterOptions="{stringResult :true, 
          searchOnEnter : true, 
          enableClear : true}" 


          > 
    <sjg:gridColumn name="item.itemname" title="Item Name"></sjg:gridColumn> 
    <sjg:gridColumn name="shelves.shelfname" title="Shelf Name"></sjg:gridColumn> 
    <sjg:gridColumn name="quantity" title="Available Qauntity"></sjg:gridColumn> 
    <sjg:gridColumn name="item.itemprice" title="Item Price"></sjg:gridColumn> 
</sjg:grid> 

Затем примените фильтры на каждом столбце, который будет фильтровать сетку с очень удобной

+0

Здравствуйте, прочитали ли вы информацию, которую я внимательно прочитал ??, Я уже сказал, что мне нужно фильтровать только с помощью формы. Поэтому, когда пользователь нажимает кнопку отправки формы, я хочу показать данные в сетке. Так что, пожалуйста, дайте мне решение для этого. – Jaydeep

Смежные вопросы