保留Spring MVC中的表单搜索值

时间:2014-12-09 20:18:19

标签: java spring jsp spring-mvc

我正在使用Spring MVC 4开发Web应用程序。

我有一个搜索页面。提交后,将显示搜索结果页面。我在搜索结果页面上有一个链接(修改搜索),该链接会将用户带回搜索页面。

我正在尝试使用用户最初键入的搜索条件显示搜索表单,但保存搜索请求参数的@ModelAttribute对象为空。

这是我的控制器和视图(jsp)代码的相关部分

@Controller
public class MySearchController extends MyController {

@Autowired
SearchService searchService;

@RequestMapping(value = "/search", method = RequestMethod.GET)
public String search(Model model,
        @ModelAttribute("searchParams") SearchParams searchParams,
        BindingResult bindingResult) throws Exception {

    model.addAttribute("city", searchParams.getCity());
    model.addAttribute("zip", searchParams.getZip());

    return "search.def";
}

@RequestMapping(value="/submitSearch")
public String submitSearch(Model model,@Valid @ModelAttribute("searchParams") SearchParams searchParams, BindingResult bindingResult, HttpServletRequest request) 
                throws Exception{

    // perform Search
    List searchResults = searchService.find(searchParams.getCity(), searchParams.getZip());
    model.addAttribute("searchResults", searchResults);
    model.addAttribute("searchParams", searchParams);

    return "results.def";
}

}

search.def将映射到search.jsp

<form:form action="submitSearch" modelAttribute="searchParams" method="GET" id="userSearchForm" >
        <table id="search" class="display" border="0" cellpadding="0" width="60%" valign="top">
        <tbody>
            <tr id="name">
                <td><label for="city">City:</label></td> 
                <td><form:input id="city" path="city" type="text" /></td> 
            </tr>
            <tr id="age">
                <td><label for="zip"><br/>Zip:</label></td> 
                <td><form:input type="text" path="zip" /> </td>
            </tr>

    </table>
    <input id="submit_button" type="submit" name="submitButton" value="Search" > <br/>
    </form:form>

results.def将映射到results.jsp     

<div class="resultHeader">
    <ul>
        <li><a href="search">Revise search</a></li>
    </ul>
</div>

<table id="resultsBody" class="display" valign="top" width="100%">
    <thead>
    <tr id="results_header" class="thhead">
        <th>Name</th>
        <th>Type</th>
        <th>Identifier</th>
    </tr>
    </thead>
    <tbody>
        <c:forEach var="result" items="${searchResults}" varStatus="rowNum">
            <td><c:out value="${result.customerName}"></c:out></td>
            <td><c:out  value="${result.customerType}"></c:out></td>
            <td><c:out  value="${result.customerIdentifier}"></c:out></td></tr>
    </c:forEach>
    </tbody>
  < /table>


 </div>

现在,当我点击结果页面中的修改搜索链接时,searchParams对象始终保持为空。我如何保留原始值? @ModelAttribute,我猜只是请求范围。我是否必须添加它以逐个传递搜索参数作为请求参数? / search是一个GET,我不希望搜索参数混乱网址。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

那是因为@ModelAttribute仅绑定帖子参数中的值。您的修改搜索&#39; link是对/search的GET请求,该请求从未包含searchParameters的任何值。

您需要一些在请求中保留searchParameters的机制,例如using HttpSession (@SessionAttributes annotation)