我想更新一些用户的数据,并且在JSP下拉菜单中遇到接收参数的问题。我想从“输入PC”块接收输入的compId并将其作为PathVariable传递。但它没有被看到。如果我硬编码 action =“$ {app} /adminEdit.do / $ {user.userId} / $ {any number} ”,则可以使用。所以,问题是 - 现在从下拉列表获取此参数并将其设置为路径?提前谢谢。
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);
}
答案 0 :(得分:2)
你不能。
你只是忘了在不同时间写的东西。
<sf:form name="adminUserUpdate" ...
action="${app}/adminEdit.do/${user.userId}/${comp.compId}" ...>
是在回答生成表单的请求时编写的。那时,您的应用(服务器端)只是生成一个HTML页面,$comp.compid}
不存在。您可以通过在浏览器中查看页面的HTML源代码来验证它。
稍后,当您点击submit
按钮时,浏览器会从输入字段中收集数据 编码所有并通过POST请求将其发送到操作网址而不进行更改即可。浏览器甚至不知道你在jsp中写了${app}/adminEdit.do/${user.userId}/${comp.compId}
:它只收到一个纯文本字符串localhost:8080/adminEdit.do/2/
所以...尝试使用comp.compid
或<sf:select>
代码从表单的输入字段中获取<sf:checkboxes>
。
答案 1 :(得分:2)
好了,经过长时间的搜索,我发现现在我可以将参数从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;
}
});
}