gpt4 book ai didi

Spring MVC 表单不受模型对象支持

转载 作者:行者123 更新时间:2023-12-04 15:22:08 25 4
gpt4 key购买 nike

我对 Spring MVC 很陌生,所以请放轻松。

我很难理解如何在 Spring MVC 中实现以下要求:

  • JSP 列表形式,从数据库中列出用户(服务、存储库的东西都正常工作)。
  • 表单不受模型属性对象的支持。这是一个列表/查找表格!
  • 我需要列出与从几个“过滤器”字段中获取的某些条件相匹配的用户,例如:
  • 地区(下拉列表)
  • 用户存档了吗? (是/否下拉列表)

  • 用户列表.jsp
    <spring:url value="strFormAction" var="/rest/security/user/list" />
    <form:form id="userListForm" method="GET" action="${strFormAction}" modelAttribute="user">

    <form:select id="strRegionId" path="${strRegionId}" cssClass="form-control" onchange="updateUsersList('1');">
    <spring:message var="strSelectRegionLabel" code="select.region" />
    <form:option value="0" label="${strSelectRegionLabel}" />
    <form:options items="${regions}" itemValue="intId" itemLabel="strNameFr" />
    </form:select>

    <form:select id="strArchived" path="${strArchived}" cssClass="form-control">
    <spring:message var="strYesLabel" code="yes" />
    <form:option value="true" label="${strYesLabel}"/>

    <spring:message var="strNoLabel" code="no" />
    <form:option value="false" label="${strNoLabel}"/>
    </form:select>

    <table>

    ...

    <c:forEach items="${users}" var="user">
    ...rows generated here...
    </c:forEach>
    ...
    </table>

    </form:form>

    用户 Controller .java
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String processUserList( @ModelAttribute("user") User user,
    @RequestParam(value = "strRegionId", required = false) String strRegionId,
    @RequestParam(value = "strArchived", required = false) String strArchived,
    @RequestParam(value = "strSortBy", required = false) String strSortBy,
    Model model) {

    int intRegionId = strRegionId != null && strRegionId.equals("0") == false ? Integer.valueOf(strRegionId) : 0;
    boolean booArchived = strArchived != null && strArchived.length() > 0 ? Boolean.valueOf(strArchived) : false;
    int intSortBy = strSortBy != null && strSortBy.length() > 0 ? Integer.valueOf(strSortBy) : 1;

    List<Region> regions = this.locationService.lstRegions();
    model.addAttribute("strRegionId", String.valueOf(intRegionId));
    model.addAttribute("strArchived", String.valueOf(booArchived));
    model.addAttribute("strSortBy", String.valueOf(intSortBy));

    List<User> users = this.securityService.listUsersByRegionAndArchiveState(intRegionId, booArchived, intSortBy);

    model.addAttribute("user", new User());
    model.addAttribute("users", users);
    model.addAttribute("regions", regions);

    return "user/userList";
    }

    如果不在表单中提供 modelAttribute,我似乎根本无法使用 Spring 表单 taglib。然后我从我的 Controller 中放置了一个虚拟模型属性,但现在我得到了:

    javax.servlet.ServletException:javax.servlet.jsp.JspException:org.springframework.beans.NotReadablePropertyException:bean 类 [spring4base.model.security.User] 的无效属性“0”:Bean 属性“0”不可读或具有无效的 getter 方法:getter 的返回类型是否与 setter 的参数类型匹配?

    正如我之前所说,该页面并不意味着由任何特定的 POJO 支持。这是一个搜索页面,它必须根据先前选择的过滤器(区域、归档状态)返回用户列表(用户实体 bean)。每次更改下拉列表时,表单都必须自行提交(用户选择一个区域,提交在同一个映射上完成,然后用户列表仅重新加载来自该特定区域的用户)。

    我来自 Struts 1,我们需要为每个页面创建 ActionForm。从我从文档中读到的内容来看,这些天不需要表格,所以我真的很期待解决这个问题。

    任何帮助将不胜感激。

    最佳答案

    我只会创建包含您的搜索条件的辅助类,例如:

    public class UserSearchCriteria {
    private String regionId;
    private Boolean archived;
    private String sortBy;

    // Getters and setters
    }

    然后我会像这样修改你的 Controller 方法(缺少一些代码,但这应该会给你这个想法)。
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String processUserList(@ModelAttribute("searchCriteria") UserSearchCriteria userSearchCriteria, Model model) {
    // Retrieve users and perform filtering based on search criteria
    List<User> users = this.securityService.listUsers(searchCriteria);

    model.addAttribute("users", users);
    model.addAttribute("regions", regions);

    return "user/userList";
    }

    然后你会像这样使用你的过滤表单:
    <spring:url value="/rest/security/user/list" var="formAction" />
    <form:form id="userListForm" method="GET" action="${formAction}" modelAttribute="searchCriteria">

    <form:select path="regionId" cssClass="form-control" onchange="updateUsersList('1');">
    <spring:message var="strSelectRegionLabel" code="select.region" />
    <form:option value="0" label="${strSelectRegionLabel}" />
    <form:options items="${regions}" itemValue="intId" itemLabel="strNameFr" />
    </form:select>

    <form:select path="archived" cssClass="form-control">
    <spring:message var="strYesLabel" code="yes" />
    <form:option value="true" label="${strYesLabel}"/>

    <spring:message var="strNoLabel" code="no" />
    <form:option value="false" label="${strNoLabel}"/>
    </form:select>

    您的代码段中的表单中有几个错误。例如 path属性接受包含要绑定(bind)的属性的名称(或路径)的字符串,您正在向它传递一些变量。你也有 valuevar切换到您的 <spring:url>我认为。

    试试吧,它不是完整的解决方案,但希望它能给你一些关于如何实现它的指导。如果您遇到任何问题,请发表评论,我会更新答案。

    关于Spring MVC 表单不受模型对象支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852509/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com