什么是JavaBean,为什么我需要它?既然我可以使用类和接口结构创建所有应用程序,那为什么我需要Bean?你能否举例说明,在某些情况下使用Bean比使用类和接口更为重要?
请在以下上下文中解释Bean的必要性:
- Web应用程序
- 独立应用程序
它们通常只代表现实世界的数据。这里是一个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>
这有意义吗?你看,它是一种公约,你可以在任何地方使用它来存储、传输和访问数据。
JavaBean无处不在,几乎所有稍微大一点的库都使用这个约定来自动化事务。以下是使用JavaBean的几个理由:
当然还有企业JavaBean,但这是完全不同的问题,不应与普通JavaBean混淆。我只是想提到EJB,因为名称相似,很容易混淆两者。
如果你考虑在Web应用程序上下文中的“常规”JavaBean,则它们比脚踩鞋子更有意义。由于Servlet规范要求会话可序列化,因此应将数据存储在会话中作为可序列化的内容 - 为什么不将其设置为bean呢?只需将SomeBusinessDataBean放入会话中即可轻松实现符合规范和方便的操作。
此外,传输该数据也很容易,因为JavaBean可以帮助您完全解耦应用程序的各个部分。请将JavaBean视为信件,将应用程序的各个子系统视为非常大型公司的部门:Dept.A向Dept.B邮寄一些数据,Dept.B无需知道(或者甚至关心)数据来自何处,只需打开信件,阅读其中的内容并基于该数据执行其操作。
实际上,以上内容也适用于独立应用程序,唯一的区别是您可以更加混乱地处理用户界面,因为独立应用程序具有有状态的用户界面(UI),而Web应用程序具有无状态的用户界面,有时仅模拟有状态的用户界面。由于这种差异,在独立应用程序中更容易搞乱,但这是一个完全不相关于JavaBeans的话题。
其实,一个Java Bean并不需要太多。要使一个类成为"Bean",它需要满足以下条件:
另外,如果你想在某些情况下让该类的属性可被发现,如在IDE中的可视化编辑器中拖放此类对象,则可以添加符合特定命名约定的属性的getter和setter。
你可以从Sun的这里获取更多信息。
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组件的要求。