表单数据封装

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);
    }

}
 

发布了48 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/live801/article/details/103917611