栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring MVC使用form:checkbox绑定数据

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC使用form:checkbox绑定数据

我的猜测是 您缺少 RoleEntity类上

equals
and
hashpre
方法的实现

当绑定值的类型为array或java.util.Collection时,如果绑定的Collection中存在已配置的setValue(Object)值,则将input(checkbox)标记为“
checked”。

这是正确的,但是要检查

HashSet
您是否需要
equals
hashpre
正确实施。

就像进行快速测试以查看是否是问题一样,替换此行:

model.addAttribute("roleList", roleList);

用这一行:

model.addAttribute("roleList", userEntity.getRoles());

您是否选中了所有复选框?如果是,则您没有提供您自己的

equals
hashpre
而是使用默认值(继承自的默认值
Object
)。

缺省情况下

equals
比较身份,这意味着一个变量与另一个变量拥有相同的实例。平等意味着可以说两个不同的对象包含相同的状态或具有相同的含义。

使用

model.addAttribute("roleList",userEntity.getRoles())
触发器会默认
equals
方法返回true,因为列表和您检查列表中是否存在的值是相同的(两个相同的对象始终相等)。

但是在您的情况下,您将

userEntityService.findById
一个和
roleEntityService.findAll
另一个用于不同的对象。在这一点上,您必须使用适当的相等性测试而不是身份。

您已经

equals
/
hashpre
实施了吗?

根据您的代码, 这是一个有效的示例:

控制器:

import java.util.Arrays;import java.util.Collections;import java.util.HashSet;import java.util.List;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controllerpublic class SomeController {    @RequestMapping(value = "/something", method = { RequestMethod.GET, RequestMethod.POST })    public String handle(Model model) {        UserEntity userEntity = new UserEntity();        userEntity.setRoles(new HashSet<RoleEntity>());        Collections.addAll(userEntity.getRoles(),new RoleEntity(1, "one"),new RoleEntity(3, "three"));        model.addAttribute("userAttribute", userEntity);        List<RoleEntity> roleList = Arrays.asList(       new RoleEntity(1, "one"),        new RoleEntity(2, "two"),        new RoleEntity(3, "three")   );        model.addAttribute("roleList", roleList);        return "view";    }}

用户类别:

import java.util.HashSet;import java.util.Set;public class UserEntity {    private Set<RoleEntity> roles = new HashSet<RoleEntity>();    public Set<RoleEntity> getRoles() {        return roles;    }    public void setRoles(Set<RoleEntity> roles) {        this.roles = roles;    }}

角色类(请 注意

equals
hashpre
方法
;如果删除它们,该示例将不再起作用):

public class RoleEntity {    private long id;    private String name;    @Override    public int hashCode() {        return new Long(id).hashCode();    }    @Override    public boolean equals(Object obj) {        if (obj == null) { return false;        }        if (! (obj instanceof RoleEntity)) { return false;        }        return this.id == ((RoleEntity)obj).getId();    }    public RoleEntity(long id, String name) {        this.id = id;        this.name = name;    }    public long getId() {        return id;    }    public void setId(long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

视图:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><form:form modelAttribute="userAttribute" method="POST" action="/something">    <table align="center">        <tr> <td>ID</td> <td>Role Name</td>        </tr>        <c:forEach items="${roleList}" var="role"> <tr>     <td><form:checkbox path="roles" value="${role}" label="${role.id}" /></td>     <td><c:out value="${role.name}" /></td> </tr>        </c:forEach>    </table></form:form>

PS关于JSP的一项观察。
如果您

value="${role}"
对form:checkbox进行操作,则将获得HTML复选框属性,例如
value="your.pack.age.declaration.RoleEntity@1"
,稍后可能会给您带来其他麻烦的HTML复选框属性。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568741.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号