Как использовать сетку struts2 с отправкой формы
Я уже искал на Stackru без удачи;
Я хочу создать одну форму фильтра, в которую пользователь вводит данные, и в соответствии с этими данными я хочу показать результаты в 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;
});
На самом деле я видел такой стиль в другом вопросе stackru ( здесь), и я не знаю, что написать в функции выше.
Благодарю вас
РЕДАКТИРОВАТЬ #1
Я изменил код как:
<sj:a targets="filterGrid"
button="true"
key="global.item.list.form.submit"
formIds="filterForm"
onSuccessTopics="reloadGrid" />
<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">
Форма отправляется, данные json также принимаются, но в сетке ничего не отображается, даже при перезагрузке
РЕДАКТИРОВАТЬ № 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");
});
Теперь, что проблема, которую я не мог понять... Плз, предоставьте мне решение.. плз
1 ответ
Вы должны использовать фильтры для фильтрации столбца, и на основе ваших фильтров ваша сетка будет заполнять данные.
Попробуйте что-то вроде этого
<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>
Затем примените фильтры к каждому столбцу, который будет фильтровать вашу сетку с очень удобным