package cn.itcast.servlet;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.Person;
/**
* 通过 内省实现 jsp:setProperty 相同效果
*
*
*/
public class IntrospectorServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 将请求参数 ,自动封装 JavaBean对象中
request.setCharacterEncoding("utf-8");
// 封装目标对象
Person person = new Person();
// 请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
try {
setProperty(person, parameterMap);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(person.getName());
System.out.println(person.getAge());
}
// 将请求参数中 map的key 与传入对象属性名称 比较,如果一致,将参数的值赋值给对象属性
private void setProperty(Object obj, Map<String, String[]> parameterMap)
throws Exception {
// 内省获得BeanInfo
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
// 获得所有属性描述器
PropertyDescriptor[] propertyDescriptors = beanInfo
.getPropertyDescriptors();
// 遍历所有属性
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
// 获得属性名称
String propertyName = propertyDescriptor.getName();
// 判断属性在map中是否存在对应值
if (parameterMap.containsKey(propertyName)) {
// 获得map参数值
String value = parameterMap.get(propertyName)[0];
// 获得属性写方法
Method setter = propertyDescriptor.getWriteMethod();
// 将value 写到属性中
setter.invoke(obj, value);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package cn.itcast.jsp;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PackageServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* //传统方法封装数据
//解决向页面输出中文乱码问题,设置浏览器打开页面时采用的编码格式;设置页面response缓冲区乱码问题
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
//获取请求中的数据
String name = request.getParameter("usename");
String password = request.getParameter("password");
//封装数据
Use use = new Use();
use.setUsename(name);
use.setPassword(password);
//想页面输出
response.getWriter().write(use.getUsename()+ use.getPassword());*/
//传统方法封装数据
//获取表单数据
Map<String,String[]> map = request.getParameterMap();
//创建对象
Use use = new Use();
//自己编写封装数据方法
try {
populate(map,use);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//完成数据封装,控制台输出显示
System.out.println(use.getUsename() + use.getPassword());
}
/**
* 完成数据封装
* @param map
* @param use
* @throws Exception
*/
private void populate(Map<String, String[]> map, Use use) throws Exception {
//利用内省;通过Introspector的静态方法获取类信息
BeanInfo info = Introspector.getBeanInfo(use.getClass());
//获取属性描述 BeanInfo
PropertyDescriptor[] pdfs = info.getPropertyDescriptors();
//循环遍历,获取属性名称
for(PropertyDescriptor pdf: pdfs) {
//获取属性名称
String name = pdf.getName();
//判断,封装数据
if(map.containsKey(name)) {
//获取属性的写方法
Method m = pdf.getWriteMethod();
//执行
m.invoke(use, map.get(name)[0]);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}