当前位置: 首页 > 知识库问答 >
问题:

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

雷锋
2023-03-14

我是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>
    

    用户控制器.java

    @RequestMapping(value = "/html" target="_blank">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";
    }
    

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

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

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

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

    任何帮助将不胜感激。

共有1个答案

靳越
2023-03-14

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

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

    // Getters and setters
}

然后我会像这样修改你的控制器方法(缺少一些代码,但这应该给你这个想法)。

@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 属性采用包含要绑定到的属性的名称(或路径)的字符串,您正在向其传递一些变量。此外,您有变量切换了您的

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

 类似资料:
  • 我用的是IntelliJ IDEA Pro 13.1.2。从未使用过13以下的任何版本。 当试图从IDE运行时,我得到以下消息:

  • 我想将模型数据列表发送到springMVC。 基本思想是: 创建一个包装器 Java POJO 以包含目标 POJO 的列表作为字段。 然后使用 获取请求参数。 HTML代码:(单一模型的) SportsFieldListWrapper.java: 控制器方法: 运动场.java: 我试图创建一个可重用的通用包装器,这样就避免了为每种类型创建一个包装器。 ListParamWrapper.java

  • ModelForm class ModelForm 如果你正在构建一个数据库驱动的应用,那么你应该会有与Django 的模型紧密映射的表单。举个例子,你也许会有个BlogComment 模型,并且你还想创建一个表单让大家提交评论到这个模型中。 在这种情况下,在表单中定义字段将是冗余的,因为你已经在模型中定义了字段。 基于这个原因,Django 提供一个辅助类来让你可以从Django 的模型创建表单

  • 本文向大家介绍简述JavaScript对传统文档对象模型的支持,包括了简述JavaScript对传统文档对象模型的支持的使用技巧和注意事项,需要的朋友参考一下  这是将其在JavaScript语言早期版本中引入的模型。大家都被所有浏览器都支持,但只允许访问文件的某些关键部分,如表单,表单元素和图像。 该模型提供了若干个只读属性,如标题,URL和上次更改提供关于文档整体的信息。除了有由该模型可用于设

  • 这以前适用于.NET 4.6上的ASP.NET MVC 5。

  • 问题内容: 我正在尝试实现朴素的高斯,并在执行时遇到不受支持的操作数类型错误。输出: 这是代码 问题答案: 您不能从列表中减去列表。 简单的方法是使用: 您也可以使用列表推导,但需要在函数中更改代码:

  • Threejs所谓模型,如果你使用过三维软件,就是你三维软件中常说的三维模型,当然了,对于大多数前端程序员而言,不了解计算机图形学的情况下,没有使用过任何三维软件的情况下,并没有三维模型的概念。从Three.js角度来说,Threejs模型对象就是由Threejs几何体Geometry和Threejs材质Material构成,材质主要设置三维模型的颜色等外观样式,几何体主要是通过顶点坐标数据表达三

  • SHA 所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)“对象名”来索引的,对象名看起来像这样: 6ff87c4664981e4397625791c8ea3bbb5f2279a3 你会在Git里到处看到这种“40个字符”字符串。每一个“对象名”都是对“对象”内容做SHA1哈希计算得来的,(SHA1是一种密码学的哈希算法)。这样就意味着两个不同内容的对象不可能有相同的“对