反射

反射的实例(Baseservlet通用)

将所有的参数包装成一个对象(不考虑一个键多个值的情况)

package com.yc.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

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

import com.google.gson.Gson;


public class BaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		super.service(request, response);
	}

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

	protected <T> T parseMap(HttpServletRequest request, Class<T> c) throws Exception {
		T t = c.newInstance();//调用c的无参构造方法
		//1.从request 中取出map
		Map<String, String[]> map = request.getParameterMap();
		//entry条目的set集合
		Set<Entry<String, String[]>> set = map.entrySet();
		//用迭代器迭代map中所有的元素
		Iterator<Entry<String, String[]>> ite = set.iterator();
		//取出c的方法
		Method[] ms = c.getMethods();
		//2.利用反射来创建t
		while (ite.hasNext()) {
			Entry<String, String[]> entry = ite.next();
			String key = entry.getKey();
			String[] values = entry.getValue();
			String value = null;
			if (values.length != 1) {
				continue;
			}
			value = values[0];
			System.out.println("传递的参数" + key + ", 值为:" + value);
			Method m = findMethod(ms, key);
			if (m == null) {
				continue;
			}
			System.out.println("找到要激活的方法" + m.getName());
			String typeName = m.getParameterTypes()[0].getName();
			System.out.println(typeName);

			if ("java.lang.Integer".equals(typeName) || "int".equals(typeName)) {
				m.invoke(t, Integer.parseInt(value));
			} else if ("java.lang.Double".equals(typeName) || "double".equals(typeName)) {
				m.invoke(t, Double.parseDouble(value));
			} else if ("java.lang.Float".equals(typeName) || "float".equals(typeName)) {
				m.invoke(t, Float.parseFloat(value));
			} else if ("java.lang.Long".equals(typeName) || "long".equals(typeName)) {
				m.invoke(t, Long.parseLong(value));
			} else {
				m.invoke(t, value);
			}
		}
		return t;
	}

	private Method findMethod(Method[] ms, String key) {
		for (Method m : ms) {
			String methodName = "set" + key;
			if (m.getName().equalsIgnoreCase(methodName)) {
				return m;
			}
		}

		return null;
	}
	//以Json格式写入          ps:用的是gson的jar包
	protected void writeJson(Object obj, HttpServletResponse response) throws IOException {
		response.setContentType("application/json");
		PrintWriter out = response.getWriter();
		Gson gson = new Gson();
		String s = gson.toJson(obj);
		out.println(s);
		out.flush();
		out.close();
	}
}

创建一个servlet继承BaseServlet 通过super调用父类的parseMap方法

package com.yc.web.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.User;

@WebServlet("/user.do")
public class UserServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String op = request.getParameter("op");
		if("add".equals(op)){
			try {
				addOp(request,response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	private void addOp(HttpServletRequest request, HttpServletResponse response) throws Exception {
		User user = super.parseMap(request, User.class);
		System.out.println(user);
	}
}

注意:需要调用JavaBean中的无参构造方法,当出现java.lang.InstantiationException 错误是由于对应的类里面覆盖了无参构造而导致无法实例化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值