【问题标题】:Retain Form Search values in Spring MVC在 Spring MVC 中保留表单搜索值
【发布时间】:2014-12-09 20:18:18
【问题描述】:

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

我有一个搜索页面。提交后,会出现一个搜索结果页面。我在搜索结果页面上有一个链接(Revise Search),可以将用户带回搜索页面。

我正在尝试使用用户最初键入的搜索条件显示搜索表单,但保存搜索请求参数的 @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>

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

【问题讨论】:

    标签: java spring jsp spring-mvc


    【解决方案1】:

    那是因为@ModelAttribute 只绑定来自 post 参数的值。您的“修改搜索”链接是对 /search 的 GET 请求,其中从未包含任何 searchParameters 值。

    您需要一些跨请求持久化 searchParameters 的机制,例如 using HttpSession (@SessionAttributes annotation)

    【讨论】:

    • 谢谢@gerrytan 我的应用程序还有另一个具有相似值的搜索表单。我想知道是否可以将其用作会话对象。然后,每次用户从一种形式切换到另一种形式时,我都必须清除这些值。我会尽力让你知道
    • 如果你找到了解决办法,可以分享一下吗?
    猜你喜欢
    • 2013-11-09
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多