【问题标题】:Passing parameters from JSP to Controller in URL issue在 URL 问题中将参数从 JSP 传递到控制器
【发布时间】:2014-07-10 09:10:25
【问题描述】:

我想更新一些用户的数据,但在从 JSP 下拉菜单中接收参数时遇到问题。我想从“Enter PC”块接收输入的 compId 并将其作为 PathVariable 传递。但它没有被看到。如果我硬编码 action="${app}/adminEdit.do/${user.userId}/${any number}" 它可以工作。所以,问题是——现在要从下拉列表中获取此参数并将其设置为路径?提前致谢。

Update.jsp sn-p

<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);
 }  

【问题讨论】:

  • 您遇到什么类型的错误?和If I hardcode action="${app}/adminEdit.do/${user.userId}/${any number}" it works. - 这是什么意思?
  • 我收到 404 错误,因为路径错误 localhost:8080/adminEdit.do/2/ - 没有第二个 PathVariable。关于硬编码 - 这意味着,如果我自己设置值,我会得到正确的路径 localhost:8080/adminEdit.do/2/5 (或任何数字) 这意味着控制器被传递了两个变量。希望现在更清楚了。
  • 表示您的问题没有正确传递第二个参数,它是空白的..
  • 你能告诉我们这里的usercomp是什么吗?
  • 在你的第一个组合中${user.computers} 在那里,在第二个组合中${computers}

标签: java spring jsp url model-view-controller


【解决方案1】:

你不能。

你只是忘记了那件事是在不同的时间写的。

<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/

所以...尝试使用&lt;sf:select&gt;&lt;sf:checkboxes&gt; 标记从表单的输入字段中获取comp.compid

【讨论】:

  • 是的,我也尝试为 FORM 设置值,但不知何故没有设置它们。好的,谢谢。我会这样工作。
【解决方案2】:

好吧,经过长时间的搜索,我发现现在我可以将参数从 JSP 传递到 Controller。有特殊的类 CustomCollectionEditor 可以帮助传递多个选择值。 这是一个很好的例子https://blog.codecentric.de/en/2009/07/multiple-selects-mit-spring-mvc-2/

还有我的sn-p:

 @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;
            }
        });
    }

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 2019-04-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多