使用JavaBeans的地方?


171

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

请在以下上下文中说明Bean的必要性:

  • 湿应用
  • 独立应用

10
我希望您不要在“ Java Bean”和“ Enterprise Java Beans或EJB”之间混淆。
拉胡尔

53
实际上我不了解bean本身,那么我该如何与EJB混淆..它有什么特别之处..
Sidharth

Answers:


177

它们通常仅代表真实世界的数据。这是一个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并不是强制性的,但是如果您希望能够将Javabean持久化或转移到Java内存之外(例如在硬盘中或通过网络),则实现非常有用。

例如,在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访问它,它遵循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>

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

也可以看看:


11
很好的解释,并且通常要感谢这个实现。Serializable本身并不是强制性的,但是如果您希望能够将Javabean持久化或转移到Java内存之外(例如在硬盘或网络中),则非常有用。
2013年

但是在java doc中提到要实现序列化,所以您能说清楚吗?
SSP 2014年

8
@SSP:1)没有javadoc。2)“应该”!=“必须”。
BalusC

61

豆本身

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

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

当然,还有Enterprise JavaBean,这完全是另一回事,不应与普通JavaBean混合使用。我只想提到EJB:s,因为它们的名称很相似,而且很容易混淆这两个名称。

Web应用程序中的Bean

如果您在Web应用程序上下文中考虑“普通” JavaBean,那么它们比穿鞋子更有意义。由于Servlet规范要求会话必须是可序列化的,所以这意味着您应该将数据存储在会话中,并以可序列化的方式存储-为什么不把它做成bean!只需将SomeBusinessDataBean放入会话中,您就可以轻松,轻松,符合规范和方便地进行工作。

由于JavaBeans可以帮助您完全分离应用程序的各个部分,因此在应用程序周围传输数据也很容易。可以将JavaBeans视为一个字母,将应用程序的各个子系统视为一个大型公司中的部门:Dept.A将大量数据邮寄到Bept.B,Dept.B不知道- 甚至不关心 -数据来自何处可以打开信件,从信件中读取内容,然后根据该数据执行操作。

独立应用程序中的Bean

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


50

豆真的没什么。为了使一个类成为“ bean”,它所需要的只是:

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

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

您可以在此处直接从Sun找到更多信息


15

Java Bean是一种软件组件,其设计旨在可以在各种不同的环境中重用。Bean的功能没有限制。它可以执行简单的功能(例如检查文档的拼写),也可以执行复杂的功能(例如预测股票投资组合的绩效)。Bean对最终用户可能是可见的。一个示例是图形用户界面上的按钮。Bean也可能对用户不可见。实时解码多媒体信息流的软件就是此类构造块的一个示例。最后,可以将Bean设计为在用户的工作站上自主工作,或者与一组其他分布式组件协同工作。从一组数据点生成饼图的软件是可以在本地执行的Bean的示例。然而,

不久我们将看到软件开发人员必须对类进行哪些特定更改,以便可以将其用作Java Bean。但是,Java设计人员的目标之一是使其易于使用该技术。因此,代码更改很小。

Java Bean的优点

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

  • Bean获得Java的“一次写入,随处运行”范例的所有好处。
  • 可以控制暴露给应用程序构建器工具的Bean的属性,事件和方法。
  • 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,具有状态(变量theValue),状态将由JavaBeans持久性机制自动保存和恢复,并且它具有一个名为MyValue的属性,该属性可由可视编程环境使用。该Bean没有任何视觉表示,但是JavaBean组件不是必需的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.