JavaWeb基础知识总结. (20)

上例中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

package cn.itcast.domain;

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=http://www.likecs.com/"user1" class=http://www.likecs.com/"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=http://www.likecs.com/"user1" class=http://www.likecs.com/"cn.itcast.domain.User" />

<%=user1 %>

<%

out.println(pageContext.getAttribute("user1"));

%>

 

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

<jsp:useBean id=http://www.likecs.com/"user1" class=http://www.likecs.com/"cn.itcast.domain.User" scope=http://www.likecs.com/"page"/>

<jsp:useBean id=http://www.likecs.com/"user2" class=http://www.likecs.com/"cn.itcast.domain.User" scope=http://www.likecs.com/"request"/>

<jsp:useBean id=http://www.likecs.com/"user3" class=http://www.likecs.com/"cn.itcast.domain.User" scope=http://www.likecs.com/"session"/>

<jsp:useBean id=http://www.likecs.com/"user4" class=http://www.likecs.com/"cn.itcast.domain.User" scope=http://www.likecs.com/"applicatioin"/>

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfdw.html