JavaWeb--JavaBean与内省

一、JavaBean

(一)什么是JavaBean

JavaBean是一个遵循特定写法的普通java类,也称之为简单java对象--POJO(Plain Ordinary Java Object),是Java程序设计中一种设计模式,是一种基于 Java 平台的软件组件思想。

(二)JavaBean规范

1、有无参的构造函数

2、成员属性私有化

3、封装的属性如果需要被外所操作,必须编写public类型的setter、getter方法

4、可以有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定!而不是成员名称!

(三)为什么需要使用Javabean

使用javaBean的好处就是:封装,重用,可读

下面引用知乎一段回答:

JaveBean你可以理解为一辆货车,在你的java端和web页面进行数据传递的载体,你当然可以每个变量单独传递,或者使用集合传递,但是javabean可以使你的数据更有可读性,方便开发时明确变量的意义,也使其他阅读你代码的人能直接你的意图

如果把bean类与数据库联合使用,一张表使用bean类,可以使你的代码更加简洁高效,易于理解,现在大多数框架都会使用这种机制。

二、java中的内省概述

(一)什么是java中的内省

内省(Introspector) 是Java中提供的一套API,用来访问JavaBean 属性的 getter/setter 方法,从而操纵JavaBean的属性。内省机制是通过反射来实现的。

(二)、为什么需要内省

内省的出现有利于了对类对象属性的操作,减少了代码的数量。

三、如何使用内省

现有一个如下的JavaBean对象

public class Person {
	private String name;
	private int age;
	
	public Person() {
		super();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", gender=" + gender
				+ "]";
	}
}
(一)给bean对象中的name属性赋值
public class Demo1 {
	
	@Test
	public void test2() throws Exception{
        //创建bean对象
		Person bean = new Person();	
		
		//利用Introspector来获取BeanInfo
		BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
		
		//利用beanInfo来获取PropertyDescriptor
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		
		//使用PropertyDescriptor对属性进行操作
		for(PropertyDescriptor pd:pds){
			if("name".equals(pd.getName())){
				Method writeMethod = pd.getWriteMethod();
				writeMethod.invoke(bean, "张三");
				break;
			}
		}
		System.out.println(bean);
	}
}
(二)将Map数据封装到User对象中

User:

public class User {
	private String username;
	private String 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 + "]";
	}
}
public class Demo3 {
	@Test
	public void test() throws Exception{
		//创建bean对象
		User bean = new User();
		//创建map对象
		Map<String, String> map = new HashMap<String, String>();
		map.put("username", "张三");
		map.put("password", "123");
		
		//通过Introspector获取BeanInfo对象
		BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
		//通过BeanInfo对象获取PropertyDescriptor数组
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		//通过遍历每一个PropertyDescriptor获取相应的set/get方法,来操作属性
		for(PropertyDescriptor pd:pds){
			String name = pd.getName();		//获取标签名
			String value = map.get(name);	//获取值
			if(value != null){
				Method writeMethod = pd.getWriteMethod();
				writeMethod.invoke(bean, value);
			}
		}
		System.out.println(bean);
	}
}
(三)使用commons-beanutils来操作bea对象

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

使用beanutils需要的jar包:

1、commons-beanutils.jar:点击前往下载

2、commons-logging.jar:点击前往下载

使用BeanUtils给属性赋值

@Test
public void test() throws Exception{
	User user = new User();
			
	BeanUtils.setProperty(user, "username", "admin");
	BeanUtils.setProperty(user, "password", "admin123");	
}

使用BeanUtils来获取属性

@Test
public void test() throws Exception{
	User user = new User("admin", "admin123");
		
	String username = BeanUtils.getProperty(user, "username");
	String password = BeanUtils.getProperty(user, "password");		
}

使用将Map数据封装到User对象中

@Test
public void test() throws Exception{
	Map<String,String> map = new HashMap<String,String>();
	map.put("username", "admin");
	map.put("password", "admin123");
		
	User user = new User();

	BeanUtils.populate(user, map);	
}

注意:Map中的键必须和JavaBean(即:此处的User类)的属性名相同

(四)在BeanUtils的基础上再进行封装

在方法只需传递需要封装的map对象和JavaBean对象的Class对象

/**
* 
* @param map:需要转换的map对象
* @param c:JavaBean的Class对象
* @return
*/
public static <T> T toBean(Map map, Class<T> c){
	try {
		//创建指定类型的JavaBean对象
		T bean = c.newInstance();
		//把数据封装到bean中
		BeanUtils.populate(bean, map);
		//返回bean对象
		return bean;
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}
@Test
public void test(){
	//创建map对象
	Map<String, String> map = new HashMap<String, String>();
	map.put("username", "张三");
	map.put("password", "123");
		
	User bean = toBean(map,User.class);
	System.out.println(bean);
}

该方法可以非常方便的将map转换为bean对象。

如:在处理表单提交过来的参数时,就可以将其方便的转换。

User bean = toBean(request.getParameterMap(), User.class);

四、JSP中与JavaBean有关的标签

<jsp:useBean>:创建或查询bean
	- <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="session"/> 
	  在session域中查找名为user1的bean,如果不存在,创建之
    - <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="session"/>
<jsp:setProperty>
    - <jsp:setProperty property="username" name="user1" value="admin"/> 
      设置名为user1的这个javabean的username属性值为admin
<jsp:getProperty>
    - <jsp:getProperty property="username" name="user1"/> 获取名为user1的javabean的名为username属性值

Java新手,若有错误,欢迎指正!

posted @ 2020-04-18 11:43  跑调大叔!  阅读(197)  评论(0编辑  收藏  举报