JavaBean和内省
JavaBean是一个遵循特定的写法的java类
1. 必须有一个无参的构造方法
2.属性私有化
3.私有你给的属性必须通过public类型的方法暴露给其他程序,并且方法的命名也必须遵守一定的命名规范。
访问JavaBean属性的两种方式
1.直接调用bean的setXXX或getXXX
2.通过内省技术访问(java bean包提供了内省的API)
* 内省技术是基于反射技术的
*通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后通过反射机制来调用这些方法。
public class User(0
{
private String username;
private String password;
public void setUsername(){}
}
< jsp:useBean id="user" class ="vo.user"></ jsp:useBean>
< jsp:setProperty property ="name" name="user"/>
< jsp:setProperty property ="password" name="user"/>
< jsp:getProperty property ="name" name="user" />
<jsp:getProperty property ="password" name="user" />
自己写的使用内省的方式反射用户信息 javabean格式的用户信息
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取输入的数据
Map<String, String[]> map = request.getParameterMap();
user usr = new user();
try {
populate(map, usr);
} catch (Exception e) {
e.printStackTrace();
}
response.getWriter().write(usr.getName());
response.getWriter().write(usr.getPassword());
}
/**
* 封装完整的数据 通过内省的方式封装数据
*
* @param map
* @param usr
* @throws IntrospectionException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
private void populate(Map<String, String[]> map, user usr)
throws IntrospectionException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
// 获取类的信息
BeanInfo info = Introspector.getBeanInfo(usr.getClass());
// 获取属性列表
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
// 获取到属性名称
String name = pd.getName();
if (map.containsKey(name)) {
// 获取属性写的方法
Method m = pd.getWriteMethod();
m.invoke(usr, map.get(name)[0]);
}
}
}
使用javabean的jar包如下:
/**
* 使用BeanUtils操作
*
* @author sunyb
*
*/
public class userBeanUtilServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取请求参数
Map<String, String[]> map = request.getParameterMap();
// 对象实例化
user usr = new user();
// 完成注册
ConvertUtils. register((Converter) new MyDateConverter(), Date.class );
// 完成封装
try {
BeanUtils. populate(usr, map);
} catch (Exception e) {
e.printStackTrace();
}
response.getWriter().write(usr.getName());
response.getWriter().write(usr.getPassword());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
但是如果有日期时还要自己封闭一个 DateConvert处理类来用于javaBeanUtils注册当遇到 有日期格式的数据属性时,使用自己定义的类来处理
自己的类要实现接口
Converter
package utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.sun.org.apache.commons.beanutils.Converter;
public class MyDateConverter implements Converter {
@Override
public Object convert (Class clazz, Object obj) {
// 把传入对象转换成日期,返回
String sDate = (String) obj;
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
try {
date = (Date) sdf.parse(sDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
}