自动封装Servlet HttpServletRequest请求成为一个POJO对象

  自己写了个小工具类,将Servlet里面的HttpServletRequest请求封装成为一个POJO对象,可以复习一下Java的反射原理,开发中这个没什么用,毕竟都用MVC框架,框架都自带这种功能,而且更为强大,不过框架也应该是采用这种原理,通过这个也能对框架窥测一二。

  这是工具类:通过传入POJO的Class对象来自动封装一个POJO。

package com.xxx.xxx.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

public class PackObject<T> {
    Class<T> c;

    public static <T> T getObject(HttpServletRequest request, Class<T> c) {

        T t = null;
        try {
            t = c.newInstance(); // 实例化参数对象
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        }

        @SuppressWarnings("rawtypes")
        Enumeration e = request.getParameterNames(); // 所有请求参数

        Method[] methods = c.getDeclaredMethods(); // 参数对象的所有方法

        // 根据对象的set方法的参数类型去将请求的值做相应转换
        while (e.hasMoreElements()) {
            String paramName = e.nextElement().toString();
            String setParamName = reverseParamName(paramName); //将参数名字转换成set方法名字,如:id 转换成 setId
            
            for (Method method : methods) {
                if (setParamName.equals(method.getName())) {
                    try {
                        Class<?> paramType = (method.getParameterTypes())[0]; //得到set方法参数类型
                        String value = request.getParameter(paramName); 
                        adapter(t, method, paramType, value); //通过适配器将值注入进POJO里面
                    } catch (IllegalArgumentException e1) {
                        e1.printStackTrace();
                    } catch (IllegalAccessException e1) {
                        e1.printStackTrace();
                    } catch (InvocationTargetException e1) {
                        e1.printStackTrace();
                    } catch (SecurityException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        }
        return t;
    }

    private static String reverseParamName(String paramName) {
        char firstChar = paramName.charAt(0);
        char toUpper = Character.toUpperCase(firstChar);
        String setParamName = "set" + String.valueOf(toUpper)
                + paramName.substring(1);
        return setParamName;
    }

    private static <T> void adapter(T t, Method method, Class<?> paramType,
            String value) throws IllegalAccessException,
            InvocationTargetException {
        if (paramType == String.class) {
            method.invoke(t, value);
        } else if (paramType == Integer.class || paramType == int.class) {
            method.invoke(t, Integer.parseInt(value));
        } else if (paramType == Long.class || paramType == long.class) {
            method.invoke(t, Long.parseLong(value));
        } else if (paramType == Boolean.class || paramType == boolean.class) {
            method.invoke(t, Boolean.parseBoolean(value));
        } else if (paramType == Short.class || paramType == short.class) {
            method.invoke(t, Short.parseShort(value));
        } else if (paramType == Float.class || paramType == float.class) {
            method.invoke(t, Float.parseFloat(value));
        } else if (paramType == Double.class || paramType == double.class) {
            method.invoke(t, Double.parseDouble(value));
        } else if (paramType == Character.class || paramType == char.class) {
            char[] cs = value.toCharArray();
            if (cs.length > 1) {
                throw new IllegalArgumentException("参数长度太大");
            }
            method.invoke(t, value.toCharArray()[0]);
        }
    }
}

  POJO类:

package com.xxx.xxx.util;

public class User {
    private int id;
    private String name;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", password=" + password
                + "]";
    }

}

  Servlet:

package com.xxx.xxx.util;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        User user = PackObject.getObject(request, User.class);
        System.out.println(user);
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

  页面:分别输入id:123,name:Jay,password:Jolin

    <form action="UserServlet">
        id:<input name="id" /><br />
        name:<input name="name" /><br />
        password:<input name="password" type="password" /><br />
        <input type="submit" value="submit" />
    </form>

  结果:User [id=123, name=Jay, password=Jolin]

  只测了下int类型和String类型没有问题,没什么问题。

posted @ 2014-08-07 00:59  神一样的存在  阅读(5129)  评论(1编辑  收藏  举报