【问题标题】:Want to display enum name corresponding to value in jsp想在jsp中显示对应值的枚举名
【发布时间】:2016-10-14 17:17:01
【问题描述】:

我是 Spring 新手,试图在表格中填充用户详细信息,该表格将显示系统用户的一些基本信息 表结构是

Firstname   Lastname    Email   Phone Number    Role    State

我正在使用 Spring 4 和 Hibernate 4。

我的模型课

@Entity
@Table(name = "USERS")
public class User {

@Id
    @Column(name = "USER_ID")
    private String userId;

    @Column(name = "PASSWORD")
    private String password;

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

    @Column(name = "MIDDLE_NAME")
    private String middleName;

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

    @Column(name = "EMAIL")
    private String email;

    @Column(name = "PHONE")
    private String phone;

    @Column(name = "STATE")
    private int state=State.ACTIVE.getState();

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "USER_ROLE_MAP", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = {
            @JoinColumn(name = "ROLE_ID") })
    private Set<Role> blogRoles = new HashSet<>();

/*getters and setter and other utility methods are remove*/

用户列表的My Controller方法

@RequestMapping(value = "/listUser", method = RequestMethod.GET)
    public ModelAndView showAllUsers() {
        System.out.println("start login");

        ModelAndView modelAndView=new ModelAndView("listUser");

        List<User> userList=userService.findAll();
        System.out.println("user List controler "+userList);

        modelAndView.addObject("currentUser", getPrincipal());
        modelAndView.addObject("userList", userList);

        return modelAndView;
    }

我的Jsp代码显示用户列表数据

 <c:forEach items="${userList}" var="user">
    <tr>
        <td>${user.firstName}</td>
        <td>${user.lastName}</td>
        <td>${user.email}</td>
        <td>${user.phone}</td>
        <td>
            <c:forEach items="${user.blogRoles}" var="role">                                                                  
                ${role.roleType}
            </c:forEach>
        </td>
        <td>${user.state}</td>
    </tr>
</c:forEach>

现在我有一个枚举,其中包含有关用户状态的信息

public enum State {

    ACTIVE(1), INACTIVE(2), LOCKED(3), DELETED(4);

    private int state;

    private State(int state) {
        this.state = state;
    }

    public int getState() {
        return state;
    }

    @Override
    public String toString(){
        return this.name();
    }

    public String getName(){
        return this.name();
    }

}

在 JSP 中,state 以整数形式出现

我想显示name,对应state的字符串值,它是一个由spring注入并由hibernate从DB中获取的整数。

我知道有一些方法可以做到这一点,比如我可以从枚举创建一个映射并将其对象发送到 JSP 或定义我自己的自定义 TLD。

但我对这些解决方案仍然不满意,有没有更好的方法来显示价值,用一些更标准的方式或使用 spring 和 EL 的一些特性?

任何建议和帮助都会得到充分的帮助,谢谢。

【问题讨论】:

  • 您可能会尝试在模型中定义一个名为 getStateName 的方法并返回 enum.name 方法。然后从jsp使用user.stateName?我对 jsp 不熟悉,但是使用 spring 这会起作用。
  • @alan7678 那么如何在JSP中使用EL访问这个方法返回的值呢?
  • 如何将 stateName 私有字段添加到您的 User 对象,然后在将其发送到 JSP 页面进行渲染之前,使用 state Integer 中的正确 String 值设置 stateName?哦,stateName 字段不会持久化到数据库中,即不会由 Hibernate 会话管理
  • @Mechkov 如果在 User 类 Hibernate 中添加一个私有字段,请尝试在 DB 中找到它,但不存在因此触发异常。

标签: java spring hibernate jsp enums


【解决方案1】:

这是使其工作的一种方法。在您的User 类中,添加名为stateName@Transient 实例变量。 @Transient 表示 Hibernate/JPA 不会尝试将此字段保存在数据库中!您只会将它用于您的 UI/JSP 目的。

@Entity
@Table(name = "USERS")
public class User {    

    @Column(name = "STATE")
    private int state=State.ACTIVE.getState();

    @Transient
    private String stateName;

因此,当从 DB 填充 User 对象时,您可能希望使用枚举中的正确 STATE 填充 stateName 字段。

类似:

user.setStateName(/*get the STATE by the INTEGER id*/)

然后,您可以在JSP 页面中呈现它,例如:

<td>${user.state}</td>
<td>${user.stateName}</td>

希望对您有所帮助!

推荐

永远不要将Domain 模型发送到UI,始终将Proxy/Transfer 对象用于UI 目的。

【讨论】:

  • 你说的Proxy/Transfer是指View和Model之间的接口层和服务层吗?
  • 有点像 API 层,有自己的模型,类似于域模型,应该保留在应用程序内部
  • 没问题!祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2014-04-04
  • 2022-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多