自己写了个小工具类,将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类型没有问题,没什么问题。

自动封装Servlet HttpServletRequest请求成为一个POJO对象的更多相关文章

  1. Servlet入门总结及第一个Servlet程序

    目录 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 ...

  2. day05 Servlet 开发和 ServletConfig 与 ServletContext 对象

    day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...

  3. Servlet第四篇【request对象常用方法、应用】

    什么是HttpServletRequest HttpServletRequest**对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,**HTTP请求头中的所有信息都封装在这个对象中,开发人 ...

  4. Servlet(八):ServletContext对象和ServletConfig对象

    ServletContext 对象:问题: Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?解决: 使用 Serv ...

  5. Struts2第四篇【请求数据自动封装、Action得到域对象】

    前言 前三篇的Struts博文基本把Struts的配置信息讲解完了-..本博文主要讲解Struts对数据的处理 一般地,我们使用Servlet的时候都是分为几个步骤的: 得到web层的数据.封装数据 ...

  6. struts中的请求数据自动封装

    Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中.该工作主要是由Parameters拦截器做的.而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作.在st ...

  7. Struts2 请求数据的自动封装 及 自定义转换器类

    请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...

  8. Servlet的请求HttpServletRequest

    一.从容器到HttpServlet 1.web容器作了什么 web容器做的事情就是,创建Servlet实例,并完成Servlet的名称注册及URL模式的对应.在请求来到时,web容器会转发给正确的Se ...

  9. Struts2(接受表单参数)请求数据自动封装和数据类型转换

    Struts2请求数据自动封装: (1)实现原理:参数拦截器 (2)方式1:jsp表单数据填充到action中的属性:        普通的成员变量,必须给set,get可以不给的.    注意点,A ...

随机推荐

  1. 8、JavaScript深入浅出——数据类型

    一.六种数据类型 Javascript是弱类型. 五种原始类型和一种对象类型: number String boolean null undefined Object 二.隐式转换 +与-的运算举例: ...

  2. python 子类继承父类的__init__方法

    父类A class A(object): def __init__(self, name): self.name=name print "name:", self.name def ...

  3. Vue.2.0.5-计算属性

    计算属性 在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> { ...

  4. linix container & cgroup note

    1,Containers can run instructions native to the core CPU without any special interpretation mechanis ...

  5. [c++基本语法]——构造函数初始化列表

    c++构造函数初始化成员变量列表: #pragma once class Node { public: int data; // 权值 Node *parent; // 父节点 Node *left; ...

  6. [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. php CI框架目录结构及运行机制

    CI目录结构   CI主要组成部分为,application(应用文件夹).system(系统文件夹)和index.php入口文件.     应用文件夹中主要是存放控制器.模型和视图等,系统文件夹中主 ...

  8. 侧菜单栏的实现SlidingPaneLayout

    SlidingPaneLayout分为两部分,上面的 左划出部分和没划出的时候 <?xml version="1.0" encoding="utf-8"? ...

  9. Spring 中的 Bean 配置

    内容提要 •IOC & DI 概述 •配置 bean –配置形式:基于 XML 文件的方式:基于注解的方式 –Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & ...

  10. c++中的传参问题

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...