Spring MVC 预填充复选框

2024-02-28

首先是一些背景信息。获得了相当标准的用户角色关系,其中用户可以拥有多个角色。我将角色定义为用户类中的一组。现在我知道 html 表单将所有值都作为字符串,并且尝试获取值,因为我的自定义 Role 对象不起作用。我实现了一个 initbinder 将 id 转换回对象,以便我可以从复选框中检索所选值,该部分有效。

但我似乎无法以其他方式回去。我从数据库中检索已具有角色的用户,并希望使用用户拥有的所有角色预先填充角色复选框。基于这个例子:

复选框示例 http://www.mkyong.com/spring-mvc/spring-mvc-checkbox-and-checkboxes-example/

他们说:

形式:checkboxes items =“$ {dynamic-list}”path =“property-to-store”

对于多个复选框,只要“path”或“property”值为 等于任何“复选框值 – ${dynamic-list}”,匹配的 复选框将被自动选中。

我对此的解释是,我应该能够向其提供一组所有角色,并将路径定义为用户对象中的角色,并且它应该与它们匹配,从而导致复选框预先填充。

每个示例似乎都将动态​​列表的值作为 String[]。嗯,这很棒,但是对于我们定义为集合的自定义对象来说,这是如何工作的呢?我仍然可以对复选框使用这一行定义吗?或者我是否还需要在视图中进行某种数据绑定?

这是我的用户 dto、用户控制器、自定义表单活页夹和用户编辑页面。

User DTO

@Entity
@Table
public class User extends BaseDto
{
   @Column(updatable = false) @NotBlank
   private String username;

   @Column(name = "encrypted_password") @Size(min = 6, message = "password must be at least 6 characters") @Pattern(regexp = "^\\S*$", message = "invalid character detected")
   private String password;

   @Column(name = "first_name")
   private String firstName;

   @Column(name = "last_name")
   private String lastName;

   @Column @NotNull
   private boolean enabled;

   @Column @Email @NotBlank
   private String email;

   @Transient
   private String confirmPassword;

   @ManyToMany(targetEntity = Role.class, fetch = FetchType.EAGER, cascade = CascadeType.REFRESH) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"),
      inverseJoinColumns = @JoinColumn(name = "role_id"))
   private Set<Role> roles;

   public User()
   {
   }

   public User(final String usernameIn, final String passwordIn, final String firstNameIn, final String lastNameIn, final String emailIn, final boolean enabledIn)
   {
      username = usernameIn;
      password = passwordIn;
      firstName = firstNameIn;
      lastName = lastNameIn;
      email = emailIn;
      enabled = enabledIn;
   }

   public String getUsername()
   {
      return username;
   }

   public void setUsername(final String usernameIn)
   {
      username = usernameIn;
   }

   public String getPassword()
   {
      return password;
   }

   public void setPassword(final String passwordIn)
   {
      password = passwordIn;
   }

   public String getFirstName()
   {
      return firstName;
   }

   public void setFirstName(final String firstNameIn)
   {
      firstName = firstNameIn;
   }

   public String getLastName()
   {
      return lastName;
   }

   public void setLastName(final String lastNameIn)
   {
      lastName = lastNameIn;
   }

   public String getEmail()
   {
      return email;
   }

   public void setEmail(final String emailIn)
   {
      email = emailIn;
   }

   public String getConfirmPassword()
   {
      return confirmPassword;
   }

   public void setConfirmPassword(final String confirmPasswordIn)
   {
      confirmPassword = confirmPasswordIn;
   }

   public boolean isEnabled()
   {
      return enabled;
   }

   public void setEnabled(final boolean enabledIn)
   {
      enabled = enabledIn;
   }

   public Set<Role> getRoles()
   {
      return roles;
   }

   public void setRoles(final Set<Role> rolesIn)
   {
      roles = rolesIn;
   }
}

用户控制器

@Controller @RequestMapping("/user")
public class UserController
{
   @Autowired private UserService userService;
   @Autowired private UserDao userDao;
   @Autowired private RoleDao roleDao;

   @InitBinder
   public void bindForm(final WebDataBinder binder)
   {
      binder.registerCustomEditor(Set.class, "roles", new CustomFormBinder<RoleDao>(roleDao, Set.class));
   }

   @RequestMapping(method = RequestMethod.GET)
   public String index(final ModelMap modelMap)
   {
      return "/user/index";
   }

   @RequestMapping(value = "/create", method = RequestMethod.GET)
   public String create(final ModelMap modelMap)
   {
      modelMap.addAttribute("userInstance", new User());
      modelMap.addAttribute("validRoles",  new HashSet<Role>(roleDao.findAll()));

      return "/user/create";
   }

   @RequestMapping(value = "/save", method = RequestMethod.POST)
   public String save(final ModelMap modelMap, @Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult)
   {
      // TODO move to service validation
      if (user.getPassword() == null || !user.getPassword().equals(user.getConfirmPassword()) )
      {
         bindingResult.addError(new FieldError("userInstance", "password", "password fields must match"));
         bindingResult.addError(new FieldError("userInstance", "confirmPassword", "password fields must match"));
      }
      if (user.getRoles() == null || user.getRoles().isEmpty())
      {
         bindingResult.addError(new FieldError("userInstance", "roles", "Must select at least one role for a User"));
      }
      if (bindingResult.hasErrors())
      {
         modelMap.addAttribute("validRoles",  new HashSet<Role>(roleDao.findAll()));
         return "/user/create";
      }

      userService.save(user);
      return "redirect:/user/list";
   }

   @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
   public String edit(@PathVariable final Integer id, final ModelMap modelMap)
   {
      final User user = userDao.find(id);

      if (user != null)
      {
         modelMap.addAttribute("userInstance", user);
         modelMap.addAttribute("validRoles",  new HashSet<Role>(roleDao.findAll()));
         return "/user/edit";
      }
      return "redirect:/user/list";
   }

   @RequestMapping(value = "/edit", method = RequestMethod.GET)
   public String editCurrent(final ModelMap modelMap)
   {
      return edit(userService.getLoggedInUser().getId(), modelMap);
   }

   @RequestMapping(value = "/update", method = RequestMethod.POST)
   public String update(@Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult)
   {
      if (bindingResult.hasErrors())
      {
         return "/user/edit";
      }

      userService.save(user);
      return "redirect:/user/list";
   }

   @ModelAttribute("userInstances")
   @RequestMapping(value = "/list", method = RequestMethod.GET)
   public List<User> list()
   {
      return userDao.findAll();
   }
}

定制表格活页夹

public class CustomFormBinder<T extends GenericDao> extends CustomCollectionEditor
{
   private final T dao;

   private static final Logger LOG = LoggerFactory.getLogger(CustomFormBinder.class);

   public CustomFormBinder(final T daoIn, final Class collectionType)
   {
      super(collectionType, true);
      dao = daoIn;
   }

   @Override
   protected Object convertElement(final Object element)
   {
      try
      {
         // forms should return the id as the itemValue
         return dao.find(Integer.valueOf(element.toString()));
      }
      catch (NumberFormatException e)
      {
         LOG.warn("Unable to convert " + element + " to an integer");
         return null;
      }
   }

}

用户编辑视图

    <html>
    <head>
        <title>Create User</title>
    </head>
    <body>

    <c:url value="/user/update" var="actionUrl"/>
    <form:form method="post" commandName="userInstance" action="${actionUrl}">
        <h1>Edit User ${userInstance.username}</h1>

        <div>
            <form:label path="username">Username:</form:label>
            <form:input path="username" id="username" readonly="true"/>
        </div>

        <div>
            <form:label path="password">Password:</form:label>
            <form:input path="password" id="password" type="password" readonly="true"/>
            <tag:errorlist path="userInstance.password" cssClass="formError"/>
        </div>

        <div>
            <form:label path="firstName">First Name:</form:label>
            <form:input path="firstName" id="firstName"/>
            <tag:errorlist path="userInstance.firstName" cssClass="formError"/>
        </div>

        <div>
            <form:label path="lastName">Last Name:</form:label>
            <form:input path="lastName" id="lastName"/>
            <tag:errorlist path="userInstance.lastName" cssClass="formError"/>
        </div>

        <div>
            <form:label path="email">Email:</form:label>
            <form:input path="email" id="email" size="30"/>
            <tag:errorlist path="userInstance.email" cssClass="formError"/>
        </div>

        <div>
         **<%--Want to Pre Populate these checkboxed--%>   
<form:checkboxes title="Assigned Roles:" path="roles" id="roles" items="${validRoles}" itemLabel="displayName" itemValue="id" element="div"/>**
            <tag:errorlist path="userInstance.roles" cssClass="formError"/>
        </div>

        <form:hidden path="enabled"/>
        <form:hidden path="id"/>
        <form:hidden path="version"/>

        <div class="submit">
            <input type="submit" value="Update"/>
            <a href="<c:url value='/user/list'/>" class="cancel">Cancel</a>
        </div>
    </form:form>

    </body>
    </html>

您需要一个正确实现的 equals 方法Role!

如果这还不够,看看课程oorg.springframework.web.servlet.tags.form.AbstractCheckedElementTag https://fisheye.springsource.org/browse/spring-framework/trunk/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/AbstractCheckedElementTag.java?hb=true。方法void renderFromValue(Object item, Object value, TagWriter tagWriter)是设置检查标志的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MVC 预填充复选框 的相关文章

随机推荐

  • VB6.dll获取调用应用程序路径

    我正在从 VB6 制作一个 dll 我需要知道将使用该 dll 的应用程序的路径 但我不知道如何执行此操作直接来自 dll 有人知道该怎么做吗 先感谢您 嗯 这似乎可以作为 DLL 工作 Option Explicit Private Co
  • &&评估问题

    据我所知 逻辑上 工作原理如下 var test false var foo test 42 这段代码 将分配42 to foo only如果第一个条件被评估为true 所以在这个例子中 foo将保持其当前值 我想知道为什么这个片段根本不起
  • “死内核”Anaconda-Jupyter 紧贴 C++ Windows

    我新安装了 Anaconda v 4 3 1 并使用 conda 命令在 Jupyter 上安装 C 内核的 cling 我用了conda install c conda forge cling 0 3 post 我使用的是 Windows
  • 将全天活动添加到 Google 日历的链接

    所以我看了看添加到 Google 日历的链接 https stackoverflow com questions 10488831 link to add to google calendar 但我想对全天活动做同样的事情 我试过做date
  • ExecutorService,如何知道所有线程何时完成而不阻塞主线程?

    我有一个多线程实现 我创建一个 ExecutorService 并提交要执行的任务 我想知道所有线程何时提交完成而不阻塞主线程和 UI 我试过了ExecutorService awaitTermination 但它会阻塞主线程和 UI 我已
  • 双线性插值

    我得到了通过双线性插值缩放图像的代码 我知道这是可行的 但我无法弄清楚如果近似像素值是边缘 边缘我的意思是它在最后一行或最后一列 像素中的一件事会怎样输入图像然后我可以 gt 坐标 x 1 y 1 的像素 这应该会导致数组索引超出范围错误
  • 如何将数组缓冲区数据与 string/json 一起发送到 NodeJS 服务器

    我需要在一个请求中将客户端页面的图像数据 作为数组缓冲区读取 以及页面生成的附加字符串 json 信息发送到 NodeJS 服务器 我需要在一个请求中处理这两个部分 因为服务器的进一步图像处理取决于发送的字符串 json 有哪些方法可以由客
  • 使用 py.test 在 Python 中测试正则表达式

    正则表达式对我来说仍然是一门黑暗艺术 但我认为这是需要练习的事情之一 因此 我更关心能够生成 py test 函数来显示我的正则表达式失败的地方 我当前的代码是这样的 my regex re compile
  • 与集合和泛型相关的 Java 10 迁移问题

    继续我之前在链接中的查询 Java 10 上的 Swing 问题 https stackoverflow com questions 51555030 swing issue on java 10 noredirect 1 comment9
  • 性能测试 OpenLayers 与 Leaflet

    我想比较 OpenLayers 和 Leaflet 之间的性能 我想测试诸如渲染矢量文件 底图 显示大量标记等最快的东西 我可以自己设置这个例子 但我不知道如何实际测量它们之间的速度差异 在哪里可以看到执行将矢量数据加载到地图等任务实际需要
  • 单独项目中的 nHibernate 域模型和映射文件

    有没有办法将域对象和映射文件分离到两个单独的项目中 我想创建一个名为 MyCompany MyProduct Core 的项目 其中包含我的域模型 以及另一个名为 MyCompany MYProduct Data Oracle 的项目 其中
  • GKE 入口 https 重定向 - FrontendConfig 无法识别

    我有一个同时包含 Http 和 Https 的 GKE 入口 我想将流量从端口 80 重定向到端口 443 我找到了这个 https github com kubernetes ingress gce issues 1075 https g
  • 无法加载配置“airbnb”以扩展 - gitlab ci

    我尝试以各种方式进行和重做 Airbnb eslint 安装 但我总是在 GitLab ci 中遇到此构建错误 它适用于我当地的环境 我使用 create react app 创建了项目 单独安装了依赖项 以免覆盖 eslint 版本 但我
  • 如何将 stderr out 和 stdout out 重新定义为单独的日志?

    如何使用日志记录模块重新定义 stderr out 和 stdout out 以单独记录文件 例如 stderr log 和 stdout log 文件 您可以简单地替换sys stdout and sys stderr使用自定义的类似文件
  • Firestore 强制用户编写 id 等于其自己的 uid 的文档的规则

    我想保证用户只能添加与其 auth uid 具有相同 id 的文档 例如 ID 为 1X0T6xC6hhRN5H02zLCN6SQtwby2 的用户只能创建 更新文档 salesmen 1X0T6xC6hhRN5H02zLCN6SQtwby
  • 如何为 Kubernetes 集群确定合适的 pod CIDR 值?

    我正在启动一个 kubernetes 集群 kubeadm init pod network cidr 192 168 1 0 16 apiserver advertise address 192 168 0 33 我对网络概念或 CIDR
  • Nuget.exe 安装 — Microsoft.CSharp 已经具有 System.Dynamic.Runtime 的依赖项

    我们通过 CI 构建中的 PowerShell 预构建脚本安装一些包 最近 我们收到了部分成功的电子邮件通知 其中提供了以下信息 Microsoft CSharp 已经具有为 System Dynamic Runtime 定义的依赖项 以下
  • YAML Jackson - 数组的锚键

    我正在尝试将 YAML 文件解析为对象 尽管 Online YAML 解析器告诉我它可以按照我想要的方式进行解析 但 Jackson YAML 解析器拒绝给我我想要的东西 这是 YAML 文件 nom service1 etats e1s1
  • 为什么 MultiMap 中不保留插入顺序?

    public class MultiMap Test public static void main String args Multimap
  • Spring MVC 预填充复选框

    首先是一些背景信息 获得了相当标准的用户角色关系 其中用户可以拥有多个角色 我将角色定义为用户类中的一组 现在我知道 html 表单将所有值都作为字符串 并且尝试获取值 因为我的自定义 Role 对象不起作用 我实现了一个 initbind