JavaWeb基础之JavaBean
1.JavaBean规范
(1)广义:所有的类都是JavaBean,狭义:遵循某一规范的类
(2)JavaBean是一种Java语言写成的可重用组件(类),必须遵循一定的规范:
- 类必须使用public修饰符,一个文件一个类
- 必须保证有公共无参数构造器
- 包含了属性的操作手段(给属性赋值,获取属性值)
//演示JavaBean
public class User {
private Long id;
private String firstName;
private String lastName;
public User() {
super();
// TODO Auto-generated constructor stub
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
2.JavaBean分类
(1)复杂:UI,比如Button,Panel,Window类
(2)简单:domain,dao,service组件,封装数据,操作数据操作功能,逻辑运算等.
3.JavaBean成员以及属性
(1)成员:
1):方法:Method
2):事件:event
3):属性:property
(2)属性:
1):attribute:表示状态,Java中只有注解中的抽象方法有该概念,很多人把字段(Field)称之为属性(attribute),学术上讲这是完全错误的.
2):property: 表示状态,但是不是字段,是属性的操作方法(getter/setter)决定的,框架中使用的大多是是属性.
(3)设置属性值(setter方法):
public void setXxx(数据类型 变量){
把参数变量赋值给字段操作;
}
若:setName---->属性:name
若:setUserName---->属性:userName
若:setISBN-------->属性:ISBN(第一第二个字母都大写,后面的字母照写)
(4)获取属性值(getter方法):
public 数据类型 getXxx(){
返回一个结果值/返回一个字段存储的值;
}
若:getName---->属性:name
若:getUserName---->属性:userName
若:getISBN-------->属性:ISBN
若:数据类型是boolean,则不叫get方法,而是is方法.
4.Lombok插件
(1)Lombok是什么?
Lombok是一款小巧的代码生成工具。官方网址:http://projectlombok.org/
LomBok主要特性有:自动生成默认的getter/setter方法、自动化的资源管理(通过@Cleanup注解)及注解驱动的异常处理等。目前在国外广泛应用。
LomBok它和jquery一样,目标是让程序员写更少的代码,以及改进一些原始语法中不尽人意的地方。Lombok能做到这一点。既不是用annotations process,也不是用反射。而是直接黑到了编译过程中。所以对运行效率没有任何影响,我们可以通过反编译class文件进行验证。
(2)为何项目中要引入Lombok(让程序员编写更少的代码):
主要为以下三点:
- 提高开发效率
- 使代码直观、简洁、明了、减少了大量冗余代码(一般可以节省60%-70%以上的代码)
- 极大减少了后期维护成本
如何安装,如何使用
1:java -jar lombok.jar(指定路径cmd输入)
2:在Java项目中导入lombok.jar包
3:使用注解@Setter/@Getter/@ToString/@Data/@AllArgsConstructor/@NoArgsConstructor等
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
private Long id;
private String firstName;
private String lastName;
private boolean man;
}
5.Introspector
(1)Introspector:内省/自省:获取和操作JavaBean中的属性.
操作JavaBean的属性:
1):获取属性相关信息.属性名,属性类型
2):给属性设置数据,调用setter方法.
3):获取属性的数据,调用getter方法
(2)java.beans.Introspector接口:
常用API:
static BeanInfo getBeanInfo(Class<?> beanClass) : 获取字节码对象对应的JavaBean信息
static BeanInfo getBeanInfo(Class<?> beanClass, Class<?> stopClass)
(3)java.beans.BeanInfo接口:
常用API:
PropertyDescriptor[] getPropertyDescriptors() : 获取所有的属性描述器
(4)java.beans.PropertyDescriptor接口:
常用API:
String getName() : 获得属性的名称
Class<?> getPropertyType() : 获得属性的类型
Method getReadMethod() : 获得用于读取属性值的方法
Method getWriteMethod() : 获得用于设置属性值的方法
IntrospectorDemo.java(读取上面Person类)
public class IntrospectorDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//需求:获取Person类中的属性
//1:通过Introspector分析出字节码对象的信息BeanInfo
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
//2:通过调用BeanInfo的方法获取对象的属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//获取属性的名称
String name = pd.getName();
System.out.println("属性名:" + name);
if(name.equals("fullName")) {
Method method = pd.getReadMethod();
Object obj = method.invoke(new User());
System.out.println(obj);
}
//获取属性的类型
System.out.println("属性类型:" + pd.getPropertyType());
//获取操作属性的方法getter/setter
System.out.println("读属性的方法:" + pd.getReadMethod());
System.out.println("写属性的方法:" + pd.getWriteMethod());
System.out.println("---------");
}
}
}
运行结果:
6.JavaBean和Map之间的转换
(1)JavaBean和 Map相互转换:
Map是由key-value组成,key是不能重复的.
JavaBean是由属性名和属性值组成,属性名是不同的.
如果把JavaBean的属性名看做是Map的key,把属性值看做是Map的value,那么一个Map对象和一个JavaBean是等级的.
(2)把JavaBean转换为Map对象.
public static Map<String,Object> bean2map(Object bean){}
(3)把Map对象转换为JavaBean.
public static T map2bean(Map<String,Object> beanMap,Class beanType){}
BeanUtil.java
/*
* 通过JavaBean和Map的转换方法
* @author Jie
*/public class BeanUtil {
//把JavaBean转换为Map对象
public static Map<String,Object> bean2map(Object bean) throws Exception{
Map<String,Object> map = new HashMap<>();
//1.获取对象的真实类型
Class<?> clz = bean.getClass();
BeanInfo beanInfo = Introspector.getBeanInfo(clz, Object.class);
//2.获取类型的属性描述器
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//3.获取属性的名字
String key = pd.getName();
//4.获取属性的值getter方法
Method method = pd.getReadMethod();
Object value = method.invoke(bean);
map.put(key, value);
}
return map;
}
//把Map对象转换为JavaBean.
public static <T> T map2bean(Map<String,Object> beanMap,Class <T> beanType) throws Exception{
@SuppressWarnings("deprecation")
T obj = beanType.newInstance();
//1.获取属性描述器
BeanInfo beanInfo = Introspector.getBeanInfo(beanType, Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//2.获取属性的名字
String key = pd.getName();
Object value = beanMap.get(key);
//3.获取写属性的方法setter方法
Method method = pd.getWriteMethod();
method.invoke(obj, value);
}
return obj;
}
}
7.BeanUtils
(1)第三方开源组织apache提供的快捷操作JavaBean属性的工具类
BeanUtilsDemo.java
public class BeanUtilsDemo {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Person p = new Person(1L, "尼玛", "王", true);
Map<String,String> map = BeanUtils.describe(p);
System.out.println(map);
System.out.println("-----------");
Person p2 = new Person();
System.out.println(p2);
//拷贝全部属性
BeanUtils.populate(p2, map);
System.out.println(p2);
System.out.println("-----------");
Person p3 = new Person();
System.out.println(p3);
//拷贝全部属性
BeanUtils.copyProperties(p3, p2);
System.out.println(p3);
}
}
运行结果:
(2)当转换的类型不是常用类型时需要自己注册转换器,如String -> Date
使用CovertUtils注册创建一个日期格式转换器
ConvertUtils.register方法(了解即可)
public class BeanUtilsDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Person p = new Person(1L, "尼玛", "王", true, null);
Map<String, String> map = BeanUtils.describe(p);
System.out.println(map);
System.out.println("-----------");
ConvertUtils.register(new Converter() {
@Override
public <T> T convert(Class<T> clz, Object value) {
try {
//参数1:类型 参数2:需要转换的值
SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
java.util.Date date = format.parse((String) value);
return (T)date;
} catch (ParseException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}, java.util.Date.class);
//拷贝单个属性
BeanUtils.copyProperty(p, "birthday", "2014-10-10");
System.out.println(p);
}
}
运行结果: