[英]Passing parameters from JSP to Controller in URL issue
我想更新一些用戶的數據,並且從JSP下拉菜單接收參數時遇到問題。 我想從“ Enter PC”塊接收輸入的compId並將其作為PathVariable傳遞。 但是沒有看到。 如果我對action =“ $ {app} /adminEdit.do / $ {user.userId} / $ {any number} ”進行硬編碼,則它可以正常工作。 因此,問題是–現在要從下拉列表中獲取此參數並將其設置為path? 提前致謝。
Update.jsp片段
<c:set var="app" value="${pageContext.request.contextPath}"/>
............
<DIV class="admin_redaction_block">
<sf:form name="adminUserUpdate"
method="POST"
modelAttribute="userForm"
action="${app}/adminEdit.do/${user.userId}/${comp.compId}"
enctype="application/x-www-form-urlencoded">
<c:if test="${not empty errorMsg}">
<div class="error">
<c:out value="${errorMsg}"/>
</div>
</c:if>
<sf:label path="password"><strong>Enter new password:</strong></sf:label> <br>
<sf:input path="password" type="text" size="20"/><br>
<sf:errors path="password" cssClass="error"/>
<br>
<sf:label path="email"><strong>Enter new Email:</strong></sf:label> <br>
<sf:input path="email" type="text" size="20"/><br>
<sf:errors path="email" cssClass="error"/>
<strong>PC Assigned:</strong>
<h3 class="h3">
<td>
<c:choose>
<c:when test="${user.computers!= null && !user.computers['empty']}">
<c:forEach items="${user.computers}" var="comp">
<c:out value="${comp.pcName}"/>
</c:forEach>
</c:when>
<c:otherwise>
<p class="h3_error">No PC Assigned</p>
</c:otherwise>
</c:choose>
</td>
</h3>
<sf:label path="computers">Enter PC:</sf:label> <br>
<sf:select path="computers" size="3">
<c:forEach items="${computers}" var="comp">
<sf:option value="${comp.compId}">
<c:out value="${comp.compId}"/>
</sf:option>
</c:forEach>
</sf:select>
<br> <br>
<input type="SUBMIT" name="SUBMIT" value="Update User"/>
</sf:form>
控制者
@RequestMapping(value = "/adminEdit.do/{userId}/{compId}", method = RequestMethod.POST)
public ModelAndView updateUserProcess(@ModelAttribute(value = "userForm")
UserForm userForm,
@PathVariable("userId") Integer userId,
@PathVariable("compId") Integer compId,
BindingResult result, Model model,
HttpSession session,
HttpServletRequest request) {
User user = userService.getUserById(userId);
model.addAttribute("computers", computerService.getAllComputers());
............
model.addAttribute("userForm", userForm);
return updatingUser(user, model, userForm);
}
你不能。
您只是忘記了事情是在不同的時間寫的。
<sf:form name="adminUserUpdate" ...
action="${app}/adminEdit.do/${user.userId}/${comp.compId}" ...>
是在回答生成表單的請求時寫的 。 那時,您的應用程序(服務器端)僅在生成HTML頁面,而$comp.compid}
不存在。 您可以通過在瀏覽器中查看頁面的HTML源代碼來進行驗證。
稍后,當您單擊submit
按鈕時,瀏覽器將從輸入字段中收集數據編碼為全部,並通過POST請求將其發送到操作URL 而不進行更改 。 瀏覽器甚至都不知道您在jsp中寫了${app}/adminEdit.do/${user.userId}/${comp.compId}
:瀏覽器僅接收純文本字符串localhost:8080/adminEdit.do/2/
因此...嘗試使用<sf:select>
或<sf:checkboxes>
標記從表單的輸入字段獲取comp.compid
。
好了,經過長時間的搜索,我發現現在可以將參數從JSP傳遞到Controller。 有特殊的類CustomCollectionEditor ,它可以幫助傳遞甚至多個選擇值。 這是一個很好的例子https://blog.codecentric.de/en/2009/07/multiple-selects-mit-spring-mvc-2/
和我的代碼段:
@InitBinder("userForm")
private void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Set.class, "computers", new CustomCollectionEditor(Set.class) {
@Override
protected Object convertElement(Object element) {
String pcName = null;
Set<Computer> computerSet = new LinkedHashSet<>();
if (element instanceof String && !((String) element).equals("")) {
pcName = (String) element;
}
return pcName != null ? computerService.getComputerByName(pcName) : null;
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.