使用JavaBean的地方?

2022-08-31 06:24:56

什么是JavaBean,为什么我需要它?既然我可以创建具有类和接口结构的所有应用程序?为什么我需要豆类?你能给我一些例子,其中bean是必不可少的,而不是类和接口吗?

请在以下上下文中解释豆子的本质:

  • Wep 应用程序
  • 独立应用

答案 1

它们通常只代表现实世界的数据。下面是一个简单的 Javabean 示例:

public class User implements java.io.Serializable {

    // Properties.
    private Long id;
    private String name;
    private Date birthdate;

    // Getters.
    public Long getId() { return id; }
    public String getName() { return name; }
    public Date getBirthdate() { return birthdate; }

    // Setters.
    public void setId(Long id) { this.id = id; }
    public void setName(String name) { this.name = name; }
    public void setBirthdate(Date birthdate) { this.birthdate = birthdate; }

    // Important java.lang.Object overrides.
    public boolean equals(Object other) {
        return (other instanceof User) && (id != null) ? id.equals(((User) other).id) : (other == this);
    }
    public int hashCode() {
        return (id != null) ? (getClass().hashCode() + id.hashCode()) : super.hashCode();
    }
    public String toString() {
        return String.format("User[id=%d,name=%s,birthdate=%d]", id, name, birthdate);
    }
}

实现本身不是强制性的,但如果您希望能够将Javabean持久化或传输到Java的内存之外,例如在硬盘中或通过网络中,则实现非常有用。Serializable

例如,在 DAO 类中,您可以使用它来创建用户列表,其中将表的数据存储在数据库中:user

List<User> users = new ArrayList<User>();
while (resultSet.next()) {
    User user = new User();
    user.setId(resultSet.getLong("id"));
    user.setName(resultSet.getString("name"));
    user.setBirthdate(resultSet.getDate("birthdate"));
    users.add(user);
}
return users;

例如,在 Servlet 类中,您可以使用它将数据从数据库传输到 UI:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    List<User> users = userDAO.list();
    request.setAttribute("users", users);
    request.getRequestDispatcher("users.jsp").forward(request, response);
}

例如,在 JSP 页面中,您可以通过 EL 访问它,该 EL 遵循 Javabean 约定,以显示数据:

<table>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Birthdate</th>
    </tr>
    <c:forEach items="${users}" var="user">
        <tr>
            <td>${user.id}</td>
            <td><c:out value="${user.name}" /></td>
            <td><fmt:formatDate value="${user.birthdate}" pattern="yyyy-MM-dd" /></td>
        </tr>
    </c:forEach>
</table>

这有意义吗?你看,这是一种约定,你可以在任何地方使用它来存储传输访问数据。

另请参阅:


答案 2

豆类本身

JavaBeans无处不在,它们是一种约定,几乎每个稍大的库都使用这些约定来自动化事情。以下是应该使用 JavaBean 的几个原因:

  • 它们很好地序列化。
  • 可以使用反射进行实例化。
  • 否则,可以很容易地使用反射进行控制。
  • 适用于封装业务代码中的实际数据。
  • 常见的约定意味着任何人都可以使用您的BEAN,并且您可以使用其他人的BEAN,而无需任何类型的文档/手册,轻松且一致地使用。
  • 非常接近POJO,这实际上意味着系统不同部分之间的互操作性更高。

当然,还有Enterprise JavaBeans,这是另一回事,不应该与普通的JavaBeans混合在一起。我只是想提到EJB:s,因为这些名字很相似,很容易混淆这两者。

Web 应用程序中的 Bean

如果你在Web应用程序上下文中考虑“正常”的JavaBeans,它们比在你的腿上穿鞋更有意义。由于Servlet规范要求会话可序列化,这意味着您应该将数据存储在会话中作为可序列化的东西 - 为什么不让它成为bean呢!只需将您的SomeBusinessDataBean放入会话中,您就可以开始了,可笑地容易,符合规范且方便。

此外,在应用程序周围传输这些数据也很容易,因为 JavaBeans 可以帮助您完全分离应用程序的各个部分。将JavaBeans视为一封信,并将应用程序的各个子系统视为一个非常大的公司内的部门:Dept.A将一堆数据邮寄给Dept.B,Dept.B不知道 - 甚至不关心 - 数据来自哪里,就像它应该的那样,可以打开这封信,从中读取内容并根据这些数据做它的事情。

独立应用程序中的 Bean

实际上,上述内容也适用于独立应用程序,唯一的区别是,您可以更多地弄乱UI,因为独立应用程序具有有状态UI:s,而Web应用程序具有状态UI:s,在某些情况下仅模拟有状态UI:s。由于这种差异,使用独立应用程序更容易弄乱,但这值得另一个主题,并且与JavaBeans根本不直接相关。


推荐