【问题标题】:Places where JavaBeans are used?使用JavaBeans的地方?
【发布时间】:2010-12-16 04:53:03
【问题描述】:

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

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

  • Wep 应用程序
  • 独立应用程序

【问题讨论】:

  • 我希望您不要混淆“Java bean”和“企业 Java Bean 或 EJB”。
  • 其实我不知道 bean 本身那么我怎么能和 EJB 混淆..它有什么特别之处吗..

标签: java javabeans


【解决方案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);
    }
}

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

在例如 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 页面中,您可以通过遵循 Javabean 约定的 EL访问它来显示数据:

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

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

另见:

【讨论】:

  • 很好的解释,通常感谢这个实现 Serializable 本身并不是强制性的,但如果您希望能够在 Java 内存之外持久化或传输 Javabean,例如,它非常有用。在硬盘中或通过网络。
  • 但是在 java doc 中提到我们应该实现序列化所以你能说清楚吗?
  • @SSP: 1) 没有 javadoc。 2)“应该”!=“必须”。
【解决方案2】:

豆子本身

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

  • 它们很好地序列化。
  • 可以使用反射来实例化。
  • 可以很容易地使用反射进行控制。
  • 适合封装来自业务代码的实际数据。
  • 通用约定意味着任何人都可以使用您的 bean,并且您可以在没有任何文档/手册的情况下轻松且一致地使用其他人的 Bean。
  • 非常接近POJOs,这实际上意味着系统不同部分之间的互操作性更高。

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

Web 应用程序中的 Bean

如果您考虑 Web 应用程序上下文中的“普通”JavaBean,它们比在腿上穿鞋更有意义。由于 Servlet 规范要求会话是可序列化的,这意味着您应该将数据作为可序列化的东西存储在会话中 - 为什么不把它变成一个 bean!只需将您的 SomeBusinessDataBean 放入会话中,您就可以开始了,非常简单,符合规范且方便。

在应用程序周围传输数据也很容易,因为 JavaBeans 可以帮助您完全解耦应用程序的各个部分。将 JavaBeans 视为一个字母,将应用程序的各种子系统视为一个非常大的公司中的部门:A 部门将一堆数据邮寄给 B 部门,B 部门不知道 - 甚至不关心 - 数据的来源是应有的,并且可以打开这封信,从中读取内容并根据该数据执行其操作。

独立应用程序中的 Bean

实际上,上面的内容也适用于独立应用程序,唯一的区别是您可能会更加混乱 UI,因为独立应用程序具有状态 UI:s 而 Web 应用程序具有 statelss UI:s 在某些情况下仅模拟有状态用户界面:s。由于这种差异,独立应用程序更容易弄得一团糟,但这完全是另一个话题,并且根本与 JavaBeans 没有直接关系。

【讨论】:

    【解决方案3】:

    一颗豆子不算什么,真的。要使一个类成为“bean”,它所需要的只是:

    • 有一个公共的、无参数的构造函数
    • 可序列化(直接或通过其超类之一实现 Serializable 接口)。

    为此,您可以为符合特定命名约定的类的属性添加 getter 和 setter,如果您希望在某些情况下可以发现字段(例如,使该类成为您可以从视觉对象拖放的对象例如,您的 IDE 中的编辑器)。

    您可以直接从 Sun here 找到更多信息。

    【讨论】:

      【解决方案4】:

      Java Bean 是一种软件组件,其设计目的是可在各种不同的环境中重复使用。对 Bean 的能力没有限制。它可以执行简单的功能,例如检查文档的拼写,也可以执行复杂的功能,例如预测股票投资组合的表现。一个 Bean 可能对最终用户可见。一个例子是图形用户界面上的按钮。 Bean 也可能对用户不可见。实时解码多媒体信息流的软件就是这种类型的构建块的一个例子。最后,可以将 Bean 设计为在用户的工作站上自主工作或与一组其他分布式组件合作工作。从一组数据点生成饼图的软件是可以在本地执行的 Bean 的一个示例。但是,从股票或商品交易所提供实时价格信息的 Bean 需要与其他分布式软件合作才能获取其数据。

      我们将很快看到软件开发人员必须对类进行哪些特定更改才能使其可用作 Java Bean。然而,Java 设计者的目标之一是让这项技术易于使用。因此,代码更改很少。

      Java Bean 的优点

      软件组件架构提供了处理软件构建块的标准机制。以下列表列举了 Java 技术为组件开发人员提供的一些具体好处:

      • Bean 获得了 Java“一次编写,随处运行”范式的所有好处。
      • 向应用程序公开的 Bean 的属性、事件和方法 builder 工具是可以控制的。
      • 一个 Bean 可能被设计为在不同的语言环境中正确运行,这使得它 在全球市场上很有用。
      • 可以提供辅助软件来帮助人们配置 Bean。这个软件是 仅在设置该组件的设计时参数时才需要。它 不需要包含在运行时环境中。
      • Bean 的配置设置可以保存在持久存储中并恢复 稍后。
      • Bean 可以注册以接收来自其他对象的事件,并且可以生成事件 被发送到其他对象。

      这是一个简单的 Javabean 示例:

      public class MyBean implements java.io.Serializable
      {
      
             protected  int theValue;
      
             public MyBean()
             {
             }
      
             public void setMyValue(int newValue)
             {
                 theValue = newValue;
             }
      
            public int getMyValue()
            {
                 return theValue;
            }
      
      }
      

      这是一个名为 MyBean 的真实 Bean,它具有将由 JavaBeans 持久性机制自动保存和恢复的状态(变量 theValue),并且它具有一个名为 MyValue 的属性,可供可视化编程环境使用。此 Bean 没有任何可视化表示,但这不是 JavaBean 组件的要求。

      【讨论】:

        猜你喜欢
        • 2013-04-10
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        相关资源
        最近更新 更多