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新手,若有错误,欢迎指正!