JavaBean

本文详细介绍了 JavaBean 的规范及其历史背景,并解释了 JavaBean 在 Web 开发中的作用及如何确保向后兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaBean规范

官方网站下载

JavaBean类是一个特殊的类

它必须满足以下条件,
1.属性私有
2.读写方法公有
3.必须要有无参构造器,而且只能有这一个构造器


JavaBean的历史

现在大多都是从web开发起步的,可能对swing不是很了解。java bean分四种,最早是用作swing的,作为一个控件,类似VB,可以直接拖放,他会定义一系列属性,方法,和事件,一个基本的swing组件,我是用4个类实现的,还不包括事件的实现中使用的一些类。
上面说的javabean是最简单的一种,主要是在web中使用,也是现在最实用的一种,因为,java的桌面程序的失败。另外3种bean也就很少被提起了,你可以找一些比较老的书籍看看,上面会有的。




JavaBean的作用

Java语言欠缺属性、事件、多重继承功能。所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码。Java Bean正是编写这套胶水代码的惯用模式或约定。这些约定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵守上述约定的类可以用于若干工具或库。

举个例子,假如有人要用Java实现一个单向链表类,可能会这样写:
// 编译成 java-int-list_1.0.jar
public final class JavaIntList {
  static class Node {
    public Node next;
    public int value;
  }
  public Node head;
  public int size;
}
上述实现为了能够快速获取链表的大小,把链表大小缓存在size变量中。用法如下:
JavaIntList myList = new JavaIntList();
System.out.println(myList.size);
JavaIntList的作者很满意,于是开源了java-int-list库的1.0版。文件名是java-int-list_1.0.jar。发布后,吸引了许多用户来使用java-int-list_1.0.jar。
有一天,作者决定要节省内存,不要缓存size变量了,把代码改成这样:
// 编译成 java-int-list_2.0.jar
public final class JavaIntList {
  static final class Node {
    public Node next;
    public int value;
  }
  public Node head;
  public int getSize() {
    Node n = head;
    int i = 0;
    while (n != null) {
      n = n.next;
      i++;
    }
    return i;
  }
}
然后发布了2.0版:java-int-list_2.0.jar。发布后,原有java-int-list_1.0.jar的用户纷纷升级版本到2.0。这些用户一升级,就发现自己的程序全部坏掉了,说是找不到什么size变量。于是这些用户就把作者暴打一顿,再也不敢用java-int-list库了。

这个故事告诉我们,如果不想被暴打致死,你就必须保持向后兼容性。太阳公司在设计Java语言时,也懂得这个道理。所以Java标准库中,绝对不会出现public int size这样的代码,而一定会一开始就写成:
private int size;
public int getSize() { return size; }
让用户一开始就使用getSize,以便有朝一日修改getSize实现时,不破坏向后兼容性。这种public int getSize() { return size; }的惯用手法,就是Java Bean。

现在是2014年,C#、Scala等比Java新的面向对象语言自身就提供了语言特性来实现这些常用需求,所以根本不需要Java Bean这样繁琐的约定。

比如,假如有个Scala版的ScalaIntList:
// 编译成 scala-int-list_1.0.jar
object ScalaIntList {
  final case class Node(next: Node, value: Int)
}
final class ScalaIntList {
  var head: ScalaIntList.Node = null
  var size: Int = 0
}
用户这样用:
val myList = new ScalaIntList
println(myList.size)
有一天你心血来潮改成这样:
// 编译成 scala-int-list_2.0.jar
object ScalaIntList {
  final case class Node(next: Node, value: Int)
}
final class ScalaIntList {
  var head: ScalaIntList.Node = null
  final def size: Int = {
    var n = head
    var i = 0
    while (n != null) {
      n = n.next
      i++
    }
    i
  }
}
用户还是照样能用,根本不破坏向后兼容性。所以Scala程序只要不考虑和Java交互,一般就不需要类似Java Bean这样的约定。

顺便说一句,向后兼容性分为源代码级和二进制级,Scala的var或val改为final def的话,无论源代码级的向后兼容性,还是二进制级的向后兼容性,都不遭受破坏。但C#的字段改为属性的话,虽然不破坏源代码级的向后兼容性,但是会破坏二进制级的向后兼容性。这是C#的设计缺陷,导致微软的编码规范不得不禁止使用公有字段。




JavaBean在jsp中的应用

jsp的标准动作元素useBean、getAttribute/setAttribute(共20个标准动作元素)


参考:《head first servlet&jsp》第八章
<think>好的,用户想了解JavaBean的概念、用法和示例。首先,我需要根据用户提供的引用内容来整理答案。用户给出了四个引用,其中引用1提到JavaBean的基础使用方法和与JSP的结合,引用2详细讲解了属性和方法元素,引用3是用户自己的学习笔记,引用4则涉及JSP标签的使用。 首先,JavaBean的概念。根据引用1,广义上符合规范的Java类都是JavaBean,而引用2提到它是可重用组件,封装数据和行为。需要解释JavaBean的核心特征,比如私有属性、公共的getter和setter,以及无参构造器。这里要确保概念部分准确,并引用正确的来源。 接下来是使用方法。引用2中的示例代码展示了如何定义属性及其访问方法,引用1提到了与JSP结合使用,如useBean标签。需要分步骤说明:定义JavaBean、在JSP中使用标准动作标签访问。要提到useBean、setProperty和getProperty标签,参考引用4中的语法。 然后是示例部分。结合引用2的Person类和引用4中的JSP标签,展示如何在实际JSP页面中使用JavaBean。可能需要给出代码示例,说明如何实例化Bean、设置和获取属性。 最后生成相关问题。根据用户提供的示例,问题应该围绕JavaBean的特性、与普通类的区别、JSP中的使用以及实际应用场景。需要确保问题覆盖用户可能感兴趣的方面,并引导深入学习。 检查是否有遗漏或错误。例如,确保提到JavaBean必须有无参构造器,这在引用2的示例中虽然没有显式写出,但根据规范是必须的。另外,JSP标准动作的使用方法是否正确,引用4中的语法是否正确。可能还需要确认用户是否需要更多实际应用场景的例子,但根据引用内容,现有的信息应该足够。 总结回答的结构:概念、核心规范、使用方法、示例代码、相关问题。确保每个部分都有对应的引用标注,如引用1、引用2等,并且格式正确,使用中文,数学表达式使用$...$,但当前问题不涉及数学公式,所以可能不需要。最后验证是否符合用户的所有指令,特别是系统级指令中的引用标识和结构要求。</think>### JavaBean概念及使用方法详解 #### 一、JavaBean核心概念 JavaBean是Java语言中一种可重用的组件规范,主要用于封装数据和业务逻辑。广义上,符合以下规范的Java类都可称为JavaBean: 1. 包含无参构造函数 2. 属性私有化(private修饰) 3. 通过公共的getter/setter方法访问属性[^2] 4. 实现`java.io.Serializable`接口(非强制但推荐) 其核心作用是实现数据封装与业务逻辑分离,尤其在JSP开发中用于解耦视图层与数据处理层[^1][^3] #### 二、核心规范详解 1. **属性定义** 采用私有属性+公共访问方法的模式: ```java public class User { private String username; // 私有属性 private int level; // 公共getter方法 public String getUsername() { return username; } // 公共setter方法 public void setUsername(String name) { this.username = name; } } ``` 2. **方法规范** - Getter方法命名:`getXxx()`(布尔类型可用`isXxx()`) - Setter方法命名:`setXxx()` - 方法访问修饰符必须为`public`[^2] #### 三、JSP中的使用步骤 1. **定义JavaBean** 创建符合规范的Java类并编译到`WEB-INF/classes`目录 2. **在JSP中调用** 使用标准动作标签操作JavaBean: ```jsp <%-- 实例化Bean --%> <jsp:useBean id="user" class="com.example.User" scope="session"/> [^4] <%-- 设置属性值 --%> <jsp:setProperty name="user" property="username" value="John"/> <%-- 获取属性值 --%> <jsp:getProperty name="user" property="username"/> ``` #### 四、典型应用场景 1. 表单数据处理(自动映射请求参数到Bean属性) 2. 业务逻辑封装(如数据验证、数据库操作) 3. 实现MVC架构中的Model层[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值