JavaBean规范
1. JavaBean规范
- 类必须是具体的和公共的。
- 有无参的构造方法。
- 可能有getter和setter方法。
2. JavaBean的反(自)省机制
我们拿到一个JavaBean,就可以拿到它的可读和可写的属性 或者属性名,字段。一般来说我们需要拿到可读可写属性;有个这些属性,可以通过反射去完成读写功能。可以通过Introspector类可以拿到一个BeanInfo对象。
在JavaBean上进行内省,了解其所有属性、公开的方法和事件。
static BeanInfo getBeanInfo(Class<?> beanClass)
- BeanInfo类
MethodDescriptor[] getMethodDescriptors() 获取bean中所有的方法。
PropertyDescriptor[] getPropertyDescriptors() 获取bean中所有的字段(包括class字段)。
- 应用
//获取到bean对象信息
BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);
//获取到bean的字段
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
//打印每个bean的字段信息
System.out.println(propertyDescriptor);
//获取每个字段对应的读的方法
System.out.println(propertyDescriptor.getReadMethod());
//获取每个字段对应的写的方法
System.out.println(propertyDescriptor.getWriteMethod());
}
3. BeanUtils工具类
- 需要导入的包
commons-beanutils-1.9.2.jar
commons-logging-1.2.jar
commons-collections-3.1.jar
- maven依赖
<!--拷贝beanutil属性的包-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
beanutils类主要用于对象的属性拷贝:1、同一个类之间的属性拷贝;2、不同类之间属性拷贝;3、把Map里面的元素拷贝到对象中去。
基于这种优势,在servlet中,request携带前台的数据封装在一个map集合中,我们可以将这个map集合中的数据拷贝到JavaBean对象中,因此我们可以设计一个工具类来专门实现对象属性的拷贝工作。
- 自定义的BeanUtil工具类
import org.apache.commons.beanutils.BeanUtils;//导入beanutils类
import javax.servlet.http.HttpServletRequest;
public class BeanUtil {
//通过泛型指定将要new的bean类型
public static <T> T getBean(HttpServletRequest request,Class<T> cls){
T t = null;
try {
//创建一个指定类型的bean对象
t = cls.newInstance();
//将request对象携带的数据拷贝到bean对象中
BeanUtils.copyProperties(t,request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
- servlet中的使用
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = BeanUtil.getBean(req, User.class);
System.out.println(user);
}
}