Spring mvc dropdown box-将选项对象(未选择选项)的列表绑定到控制器

时间:2015-07-08 13:50:24

标签: spring-mvc dropdownbox

我的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”并显示相同的页面。

我想重新填充搜索下拉而不再调用数据库。这是因为我可以从下拉列表中的不同选择中再次更改搜索条件。

请帮我将类别对象从下拉列表绑定到模型。其他一切都按预期工作。只有当我点击搜索按钮并重新加载页面时,才会填充下拉列表。

1 个答案:

答案 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并从那里获取它,而不是在每个请求上重新创建一个新属性。它应该满足您的要求但有缺点:当不再需要时,没有简单可靠的方法从请求中清除属性。您可以自行决定是否可以浪费一些会话内存,具体取决于预期的同时会话数,服务器内存,......