zoukankan      html  css  js  c++  java
  • 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新手,若有错误,欢迎指正!

  • 相关阅读:
    vscode里的NPM脚本
    Vue之生命周期activated与created使用
    分享10个超棒的设计素材网站
    使用node搭建静态资源服务器
    vue 动态组件的传值
    一文带你入门正则表达式
    一文告诉你git如何使用
    一文告诉你三种常见跨域解决方案
    一文告诉你原型与原型链是什么?
    一文告诉你 Event Loop 是什么?
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12724930.html
Copyright © 2011-2022 走看看