JavaBeans被使用的场所?

203

什么是JavaBean,为什么我需要它?既然我可以使用类和接口结构创建所有应用程序,那为什么我需要Bean?你能否举例说明,在某些情况下使用Bean比使用类和接口更为重要?

请在以下上下文中解释Bean的必要性:

  • Web应用程序
  • 独立应用程序

11
希望你不要混淆“Java beans”和“企业级JavaBean或EJB”的区别。 - Rahul
64
实际上,我不了解豆子本身,那我怎么会把它与EJB混淆呢?它是否有什么特殊之处呢? - Sidharth
4个回答

199

它们通常只代表现实世界的数据。这里是一个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的内存之外持久化或传输Javabeans,比如在硬盘或网络上,那么它非常有用。

例如在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>

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

另请参阅:


13
解释得很好,通常感谢这个。实现Serializable接口本身并不强制要求,但如果您想将JavaBean保留或传输到Java内存之外,例如存储在硬盘上或通过网络传输,则非常有用。 - Aman Gupta
但是在Java文档中提到了我们应该实现序列化,您能否请明确一下? - SSP
11
@SSP: 1) 没有 Javadoc. 2) "should" 不等于 "must". - BalusC

66

JavaBean概述

JavaBean无处不在,几乎所有稍微大一点的库都使用这个约定来自动化事务。以下是使用JavaBean的几个理由:

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

当然还有企业JavaBean,但这是完全不同的问题,不应与普通JavaBean混淆。我只是想提到EJB,因为名称相似,很容易混淆两者。

Web应用中的JavaBean

如果你考虑在Web应用程序上下文中的“常规”JavaBean,则它们比脚踩鞋子更有意义。由于Servlet规范要求会话可序列化,因此应将数据存储在会话中作为可序列化的内容 - 为什么不将其设置为bean呢?只需将SomeBusinessDataBean放入会话中即可轻松实现符合规范和方便的操作。

此外,传输该数据也很容易,因为JavaBean可以帮助您完全解耦应用程序的各个部分。请将JavaBean视为信件,将应用程序的各个子系统视为非常大型公司的部门:Dept.A向Dept.B邮寄一些数据,Dept.B无需知道(或者甚至关心)数据来自何处,只需打开信件,阅读其中的内容并基于该数据执行其操作。

独立应用程序中的JavaBean

实际上,以上内容也适用于独立应用程序,唯一的区别是您可以更加混乱地处理用户界面,因为独立应用程序具有有状态的用户界面(UI),而Web应用程序具有无状态的用户界面,有时仅模拟有状态的用户界面。由于这种差异,在独立应用程序中更容易搞乱,但这是一个完全不相关于JavaBeans的话题。


53

其实,一个Java Bean并不需要太多。要使一个类成为"Bean",它需要满足以下条件:

  • 具有公共的无参数构造函数
  • 可以序列化(通过实现Serializable接口来实现,可以直接实现、也可以通过其父类之一实现)。

另外,如果你想在某些情况下让该类的属性可被发现,如在IDE中的可视化编辑器中拖放此类对象,则可以添加符合特定命名约定的属性的getter和setter。

你可以从Sun的这里获取更多信息。


15
Java Bean 是一种软件组件,旨在在各种不同的环境中可重复使用。Bean 的功能没有限制,可以执行简单的功能,例如检查文档的拼写,也可以执行复杂的功能,例如预测股票投资组合的性能。Bean 可以对终端用户可见,例如图形用户界面上的按钮;也可以对用户不可见,例如用于实时解码多媒体信息流的软件组件。最后,Bean 可以设计成在用户的工作站上自主工作或与其他分布式组件协作工作。从一组数据点生成饼图的软件是可以本地执行的 Bean 的一个例子。但是,提供股票或商品交易的实时价格信息的 Bean 需要与其他分布式软件合作以获取其数据。
稍后我们将看到开发人员必须对类进行哪些具体更改才能将其用作 Java Bean。然而,Java 设计者的目标之一是使使用这项技术变得容易。因此,代码更改很小。
Java Bean 的优点包括:
- Bean 获得了 Java 的“编写一次,随处运行”的范例的所有好处。 - 暴露给应用程序构建器工具的 Bean 的属性、事件和方法可以被控制。 - Bean 可以被设计为在不同的区域设置下正确运行,这使得它在全球市场上非常有用。 - 可以提供辅助软件来帮助人们配置 Bean。此软件仅在设置该组件的设计时参数时需要。它不需要包含在运行时环境中。 - Bean 的配置设置可以保存在持久存储器中,并在以后的某个时间恢复。 - Bean 可以注册接收来自其他对象的事件,并生成发送到其他对象的事件。
以下是一个简单的 Java Bean 示例:
public class MyBean implements java.io.Serializable
{

       protected  int theValue;

       public MyBean()
       {
       }

       public void setMyValue(int newValue)
       {
           theValue = newValue;
       }

      public int getMyValue()
      {
           return theValue;
      }

}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接