反射的实例(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 错误是由于对应的类里面覆盖了无参构造而导致无法实例化!