我的jsp中有一个下拉框,带有搜索按钮。在此下拉菜单和搜索按钮下方的同一个jsp上单击搜索按钮时,我显示的数据表从下拉列表中获取所选值,并显示与该键匹配的所有结果。
JSP:
<form:form action="/search" modelAttribute="myModel" method="post">
<form:select path="categorySearched">
<form:option option="0" label="--Select--">
<form:options items="${myModel.categoryList}" itemLabel="name" itemValue="id"/>
</form:select>
<button type="submit">Search</button>
</form:form>
<form:form action="/edit" modelAttribute="myModel" method="post">
<c:forEach var=""... -------------------------->>>>> data table displayed properly
</form:form>
控制器:
@RequestMapping(value = "/showSearchPage", method = RequestMethod.GET)
public String showSearch(@ModelAttribute("myModel") MyModel myModel){
//call from db to get list of category type objects
myModel.setCategoryList(categories);
return "SearchPage";
}
@RequestMapping(value = "/search", method = RequestMethod.POST)
public String searchGoals(@ModelAttribute("myModel") MyModel myModel) throws Exception {
System.out.println(goalModel.getCategoryList());------------>> null; want this to have all objects in the list
..................
return "SearchPage";
}
为MyModel:
private List<Category> categoryList;
private String categorySearched;
Catgory:
private String id;
private String name;
正如您在搜索中看到的那样,我将返回“SearchPage”并显示相同的页面。
我想重新填充搜索下拉而不再调用数据库。这是因为我可以从下拉列表中的不同选择中再次更改搜索条件。
请帮我将类别对象从下拉列表绑定到模型。其他一切都按预期工作。只有当我点击搜索按钮并重新加载页面时,才会填充下拉列表。
答案 0 :(得分:0)
当您处理/search
请求时,所有类别的列表都无处可去:您不想从数据库中获取它并且它不是来自请求参数。因为当你写:
@RequestMapping(value = "/search", method = RequestMethod.POST)
public String searchGoals(@ModelAttribute("myModel") MyModel myModel)
Spring创建一个新的MyModel并使用请求参数填充它。
如果请求足够简单,那么更简单的解决方案是在服务级别缓存getCategories(xxx)
方法。这样,您可以多次调用它而无需从db重新加载它。例如,EhCache在Spring中很好地集成。优点:您只需在代码中写入您希望日期和框架处理缓存
另一种方法是使用@SessionAttribute
。如果你添加
@SessionAttributes("myModel")
在控制器类声明之上,您要求Spring在会话中存储模型属性myModel
并从那里获取它,而不是在每个请求上重新创建一个新属性。它应该满足您的要求但有缺点:当不再需要时,没有简单可靠的方法从请求中清除属性。您可以自行决定是否可以浪费一些会话内存,具体取决于预期的同时会话数,服务器内存,......