JavaBean简介

清疚 2021-06-17 13:13 516阅读 0赞

一、JavaBean概述

1. 什么是JavaBean

JavaBean是一种规范,也就是对类的要求。
它要求Java类的成员变量提供getter/setter方法,这样的成员变量被称之为JavaBean属性。JavaBean还要求类必须提供仅有的无参构造器。

例如下面这个Person类:

  1. public class Person {
  2. private String name;
  3. private int age;
  4. private String gender;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public String getGender() {
  18. return gender;
  19. }
  20. public void setGender(String gender) {
  21. this.gender = gender;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
  26. }
  27. public Person() {
  28. super();
  29. }
  30. public Person(String name, int age, String gender) {
  31. super();
  32. this.name = name;
  33. this.age = age;
  34. this.gender = gender;
  35. }
  36. }

2. JavaBean属性

JavaBean属性是具有get/set方法的成员变量。

  • 也可以只提供get方法,这样的属性叫只读属性;
  • 也可以只提供set方法,这样的属性叫只写属性;
  • 如果属性类型为boolean类型,那么读方法的格式可以是get或is。例如名为abc的boolean类型的属性,它的读方法可以是getAbc(),也可以是isAbc()

JavaBean属性名的要求,前两个字母要么都大写,要么都小写:

  1. private class User{
  2. private String iD; //错误的
  3. private String ID;
  4. private String Qq; //错误的
  5. private String QQ;
  6. }

还有一种可能,JavaBean存在属性,但是不存在这个成员变量,例如:

  1. public class User{
  2. Public String getUsername(){
  3. return "ZhangSan";
  4. }
  5. }

还可以属性名称与成员变量的名称不一样:

  1. public class User {
  2. private String hello;
  3. public String getUsername() {
  4. return hello;
  5. }
  6. public void setUsername(String username) {
  7. this.hello = username;
  8. }
  9. }

上面这个例子中,有getUsername()setUsername()方法,所以就有一个名为username的属性,但是没有这样的成员变量,这样也是可以的,而且,属性的名称为username,而不是hello。
也就是说,Javabean的属性名称取决于方法名称,而不是成员变量的名称。但是一般不这么做。

二、内省(了解)

内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作的一组API。例如User类有名为username的JavaBean属性,通过两个Method对象(一个是getUsenrmae(),一个是setUsername())来操作User对象。

我们举一个例子:
现在有一个Map,内容如下:

  1. Map<String,String> map = new HashMap<String,String>();
  2. map.put("username", "admin");
  3. map.put("password", "admin123");

有一个User类:

  1. public class User {
  2. private String username;
  3. private String password;
  4. public User(String username, String password) {
  5. this.username = username;
  6. this.password = password;
  7. }
  8. public User() {
  9. }
  10. public String getUsername() {
  11. return username;
  12. }
  13. public void setUsername(String username) {
  14. this.username = username;
  15. }
  16. public String getPassword() {
  17. return password;
  18. }
  19. public void setPassword(String password) {
  20. this.password = password;
  21. }
  22. public String toString() {
  23. return "User [username=" + username + ", password=" + password + "]";
  24. }
  25. }

现在需要把map的数据封装到一个User对象中!User类有两个JavaBean属性,一个叫username,另一个叫password。
你可能想到的是反射,通过map的key来查找User类的Field!这么做是没有问题的,但我们要知道类的成员变量是私有的,虽然也可以通过反射去访问类的私有的成员变量,但我们也要清楚反射访问私有的东西是有“危险”的,所以还是建议通过getUsername和setUsername来访问JavaBean属性。

2.1 内省获取BeanInfo

通过java.beans.Introspector的getBeanInfo()方法来获取java.beans.BeanInfo实例。

  1. BeanInfo beanInfo = Introspector.getBeanInfo(User.class);

2.2 得到所有属性描述符(PropertyDescriptor)

通过BeanInfo可以得到这个类的所有JavaBean属性的PropertyDescriptor对象。然后就可以通过PropertyDescriptor对象得到这个属性的getter/setter方法的Method对象了。

  1. PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

每个PropertyDescriptor对象对应一个JavaBean属性:

  • String getName():获取JavaBean属性名称;
  • Method getReadMethod:获取属性的读方法;
  • Method getWriteMethod:获取属性的写方法。

2.3 完成Map数据封装到User对象中

完整的代码:

  1. public void fun1() throws Exception {
  2. Map<String,String> map = new HashMap<String,String>();
  3. map.put("username", "admin");
  4. map.put("password", "admin123");
  5. // 获取User类型的BeanInfo实例
  6. BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
  7. // 获取User类型的所有JavaBean属性的属性描述符对象
  8. PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
  9. // 创建User实例
  10. User user = new User();
  11. // 循环遍历每个属性描述符对象
  12. for(PropertyDescriptor pd : pds) {
  13. // 获取JavaBean属性名
  14. String name = pd.getName();
  15. // 获取Map中对应属性的值
  16. String value = map.get(name);
  17. // 如果在Map中存在这个属性的值
  18. if(value != null) {
  19. // 获取该属性的写方法
  20. Method writeMethod = pd.getWriteMethod();
  21. // 把Map中的值写入到user对象的对应属性中
  22. writeMethod.invoke(user, value);
  23. }
  24. }
  25. System.out.println(user);
  26. }

三、commons-beanutils

提到内省,不能不提commons-beanutils这个工具。它底层使用了内省,对内省进行了大量的简化!
使用beanutils需要的jar包:

  • commons-beanutils.jar;
  • commons-logging.jar;

3.1 设置JavaBean属性

  1. User user =new User();
  2. BeanUtils.setProperty(user, "username", "admin");
  3. BeanUtils.setProperty(user, "password", "admin123");
  4. System.out.println(user);

3.2 获取JavaBean属性

  1. User user = new User("admin", "admin123");
  2. String username = BeanUtils.getProperty(user, "username");
  3. String password = BeanUtils.getProperty(user, "password");
  4. System.out.println("username=" + username + ", password=" + password);

3.3 封装Map数据到JavaBean对象中

  1. Map<String,String> map = new HashMap<String,String>();
  2. map.put("username", "admin");
  3. map.put("password", "admin123");
  4. User user = new User();
  5. BeanUtils.populate(user, map);
  6. System.out.println(user);

四、JSP与JavaBean相关的动作标签

在JSP中与JavaBean相关的标签有:

  • <jsp:useBean>:创建JavaBean对象;
  • <jsp:setProperty>:设置JavaBean属性;
  • <jsp:getProperty>:获取JavaBean属性;

4.1<jsp:useBean>

<jsp:useBean>标签的作用是创建JavaBean对象:

  • 在当前JSP页面创建JavaBean对象;
  • 把创建的JavaBean对象保存到域对象中;

上面代码表示在当前JSP页面中创建User类型的对象,并且把它保存到page域中了。下面我们把jsp:useBean标签翻译成Java代码:

  1. <%
  2. cn.itcast.domain.User user1 = new cn.itcast.domain.User();
  3. pageContext.setAttribute("user1", user1);
  4. %>

这说明我们可以在JSP页面中完成下面的操作:

  1. <jsp:useBean id="user1" class="cn.itcast.domain.User" />
  2. <%=user1 %>
  3. <%
  4. out.println(pageContext.getAttribute("user1"));
  5. %>

<jsp:useBean>标签默认是把JavaBean对象保存到page域,还可以通过scope标签属性来指定保存的范围:

  1. <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="page"/>
  2. <jsp:useBean id="user2" class="cn.itcast.domain.User" scope="request"/>
  3. <jsp:useBean id="user3" class="cn.itcast.domain.User" scope="session"/>
  4. <jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>

<jsp:useBean>标签其实不一定会创建对象!!!其实它会先在指定范围中查找这个对象,如果对象不存在才会创建,我们需要重新对它进行翻译:

  1. <jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>
  2. <%
  3. cn.itcast.domain.User user4 = (cn.itcast.domain.User)application.getAttribute("user4");
  4. if(user4 == null) {
  5. user4 = new cn.itcast.domain.User();
  6. application.setAttribute("user4", user4);
  7. }
  8. %>

4.2 <jsp:setProperty><jsp:getProperty>

<jsp:setProperty>标签的作用是给JavaBean设置属性值,而<jsp:getProperty>是用来获取属性值。在使用它们之前需要先创建JavaBean:

  1. <jsp:useBean id="user1" class="cn.itcast.domain.User" />
  2. <jsp:setProperty property="username" name="user1" value="admin"/>
  3. <jsp:setProperty property="password" name="user1" value="admin123"/>
  4. 用户名:<jsp:getProperty property="username" name="user1"/><br/>
  5. 密 码:<jsp:getProperty property="password" name="user1"/><br/>

end.

发表评论

表情:
评论列表 (有 0 条评论,516人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Enterprise JavaBean 简介

    Enterprise JavaBean 简介 在顶层我们使用的框架是面向服务的,而在其之下的开发方法面向组件,最基层的便是面向对象面向过程的JAVA编程。 面向过

    相关 JavaBean

    JavaBean是一种Java语言写成的可重用组件。 所谓javaBean,是指符合如下标准的Java类: 类是公共的 有一个无参的公共的构造器 有属性,且有对应

    相关 JavaBean

    1、内省了解 JavaBean JavaBean 是一种特殊的 Java 类,主要用于传递数据信息,这种java 类中的方法主要 用于访问私有的字段,且方法名符合某种命名规

    相关 JavaBean

    一、什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化。

    相关 JavaBean简介

    一、JavaBean概述 1. 什么是JavaBean JavaBean是一种规范,也就是对类的要求。 它要求Java类的成员变量提供getter/sett...

    相关 JavaBean

    简介: JavaBean就是符合某种特定规范Java类。 使用JavaBean可以解决代码的重复编写,减少代码冗余,功能区分明确,提高代码的维护性。 设计原则: 1)提供...