我正在使用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,我不希望搜索参数混乱网址。有什么想法吗?
答案 0 :(得分:0)
那是因为@ModelAttribute
仅绑定帖子参数中的值。您的修改搜索&#39; link是对/search
的GET请求,该请求从未包含searchParameters
的任何值。
您需要一些在请求中保留searchParameters的机制,例如using HttpSession (@SessionAttributes
annotation)