阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

JavaBean

162次阅读
没有评论

共计 5976 个字符,预计需要花费 15 分钟才能阅读完成。

1、JavaBean 概述

1.1、什么是 JavaBean

JavaBean 是一种规范,也就是对类的要求。它要求 Java 类的成员变量提供 getter/setter 方法,这样的成员变量被称之为 JavaBean 属性。

JavaBean 还要求类必须提供仅有的无参构造器,例如:public User() {…}

User.java

public class User {private String username; private String password; public String getUsername() {return username; } public void setUsername(String username) {this.username = username; } public String getPassword() {return password; } public void setPassword(String password) {this.password = password; } }

1.2、JavaBean 属性

JavaBean 属性是具有 getter/setter 方法的成员变量。

l 也可以只提供 getter 方法,这样的属性叫只读属性;

l 也可以只提供 setter 方法,这样的属性叫只写属性;

l 如果属性类型为 boolean 类型,那么读方法的格式可以是 get 或 is。例如名为 abc 的 boolean 类型的属性,它的读方法可以是 getAbc(),也可以是 isAbc();

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

public class User {private String iD; private String ID; private String qQ; private String QQ; … }

JavaBean 可能存在属性,但不存在这个成员变量,例如:

public class User {public String getUsername() {return "zhangSan"; } }

上例中 User 类有一个名为 username 的只读属性!但 User 类并没有 username 这个成员变量!

还可以并变态一点:

public class User {private String hello; public String getUsername() {return hello; } public void setUsername(String username) {this.hello = username; } }

上例中 User 类中有一个名为 username 的属性,它是可读可写的属性!而 Use 类的成员变量名为 hello!也就是说 JavaBean 的属性名取决与方法名称,而不是成员变量的名称。但通常没有人做这么变态的事情。

2、内省(了解)

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

如果你还不能理解内省是什么,那么我们通过一个问题来了解内省的作用。现在我们有一个 Map,内容如下:

Map<String,String> map = new HashMap<String,String>(); map.put("username", "admin"); map.put("password", "admin123");
public class User {
	private String username;
	private String password;

	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}
	public User() {}
	public String getUsername() {return username;}
	public void setUsername(String username) {this.username = username;}
	public String getPassword() {return password;}
	public void setPassword(String password) {this.password = password;}
	public String toString() {return "User [username=" + username + ", password=" + password + "]";
	}
}

现在需要把 map 的数据封装到一个 User 对象中!User 类有两个 JavaBean 属性,一个叫 username,另一个叫 password。

你可能想到的是反射,通过 map 的 key 来查找 User 类的 Field!这么做是没有问题的,但我们要知道类的成员变量是私有的,虽然也可以通过反射去访问类的私有的成员变量,但我们也要清楚反射访问私有的东西是有“危险”的,所以还是建议通过 getUsername 和 setUsername 来访问 JavaBean 属性。

2.1、内省之获取 BeanInfo

我们这里不想去对 JavaBean 规范做过多的介绍,所以也就不在多介绍 BeanInfo 的“出身”了。你只需要知道如何得到它,以及 BeanInfo 有什么。

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

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

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

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

PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

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

l String getName():获取 JavaBean 属性名称;

l Method getReadMethod:获取属性的读方法;

l Method getWriteMethod:获取属性的写方法。

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

	public void fun1() throws Exception {Map<String,String> map = new HashMap<String,String>();
		map.put("username", "admin");
		map.put("password", "admin123");
		
		BeanInfo beanInfo = Introspector.getBeanInfo(User.class); 
		
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); 
		
		User user = new User(); 
		for(PropertyDescriptor pd : pds)  {String name = pd.getName(); 
			String value = map.get(name); 
			if(value != null)  {Method writeMethod = pd.getWriteMethod(); 
				writeMethod.invoke(user, value); 
			}
		}
		
		System.out.println(user);
	}

3、commons-beanutils

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

使用 beanutils 需要的 jar 包:

l commons-beanutils.jar;

l commons-logging.jar;

3.1、设置 JavaBean 属性

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

3.2、获取 JavaBean 属性

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

3.3、封装 Map 数据到 JavaBean 对象中

		Map<String,String> map = new HashMap<String,String>();
		map.put("username", "admin");
		map.put("password", "admin123");
		
		User user = new User();

		BeanUtils.populate(user, map); 
		
		System.out.println(user);

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

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

l jsp:useBean:创建 JavaBean 对象;

l jsp:setProperty:设置 JavaBean 属性;

l jsp:getProperty:获取 JavaBean 属性;

我们需要先创建一个 JavaBean 类:

User.java

public class User {
	private String username;
	private String password;

	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}
	public User() {}
	public String getUsername() {return username;}
	public void setUsername(String username) {this.username = username;}
	public String getPassword() {return password;}
	public void setPassword(String password) {this.password = password;}
	public String toString() {return "User [username=" + username + ", password=" + password + "]";
	}
}

4.1、<jsp:useBean>

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

l 在当前 JSP 页面创建 JavaBean 对象;

l 把创建的 JavaBean 对象保存到域对象中;

<jsp:useBean id="user1" class="cn.itcast.domain.User" />

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

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

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

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

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

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

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

<jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>
<% cn.itcast.domain.User user4 = (cn.itcast.domain.User)application.getAttribute("user4"); if(user4 == null) {user4 = new cn.itcast.domain.User(); application.setAttribute("user4", user4); } %>

4.2、<jsp:setProperty> 和 <jsp:getProperty>

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

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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计5976字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中