Hello,
I've already searched on Stackoverflow with no luck;
I want to make one filter form in which user enters data and according to that data, I want to show results in Struts2 jQGrid.
By default when page loads, Struts2 jQGrid already have action url having all data.
I tried setting target of form and
See code:
> <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>
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;
}
}
Now form submitted successfully, action also executed successfully, but the grid becomes empty after execution of action.
I didnt get what is happening.
Provide me another way, if this way is not suitable. In short i ve to implement filter functionality by providing form, and when user click on form submit button, i want to show filtered data in grid. (Please also careful that i dont want to use grid's own filter functionality).
Thank you.