这几天一直在研究java的反射机制,正好作业需要写servlet,为了增加一点难度,就用java的反射机制来映射获取前端post或get过来的参数
1.该方式有点像struts2 利用映射获取前端的参数,目前只能映射javabean的Integer,String两种类型。有兴趣的同学可以自行添加别的类的判断
直接上代码,映射方式被我封装成了一个BaseServlet
2.直接用get方式访问http://localhost:8080/webTest/query?student.sname=1&student.sage=12
参数可以缺省,也可以利用post方式,这边为方便调用,就只用了get
3.得到的结果
1 package mangues.base; 2 3 import java.io.IOException; 4 import java.lang.reflect.Method; 5 import java.util.ArrayList; 6 import java.util.List; 7 import java.util.Map; 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 import mangues.model.Student; 14 15 /** 16 * 17 * @ClassName: BaseServlet 18 * @Description: 自定义servlet基类,实现参数的映射 19 * @author mangues 20 * @date 2015-7-21 21 */ 22 public abstract class BaseServlet extends HttpServlet { 23 PRivate List<String> var = null; // 存储字段名 24 private List<String> vars = null; // 存储字段名 25 private List<Method> ms = null; // 方法 26 27 @Override 28 public void init() throws ServletException { 29 super.init(); 30 getVar(); 31 } 32 33 // 是否自定义变量 34 private boolean isParameter(String mName) { 35 String con[] = { "getServletContext", "getServletConfig", 36 "getServletName", "getInitParameter", "getInitParameterNames", 37 "getServletInfo" }; 38 if (mName.startsWith("set") && !mName.startsWith("getClass")) { 39 for (String nameString : con) { 40 if (mName.equals(nameString)) { 41 return false; 42 } 43 } 44 return true; 45 } else { 46 return false; 47 } 48 49 } 50 //初始化 51 private void getVar() { 52 var = new ArrayList<String>(); 53 vars = new ArrayList<String>(); 54 ms = new ArrayList<Method>(); 55 Class classType = this.getClass(); 56 Method method[] = classType.getMethods(); 57 for (Method m : method) { // 遍历方法 58 String mName = m.getName(); // 方法名 59 if (isParameter(mName)) { 60 try { 61 // 获取字段名 62 String fieldName = mName.substring(3, mName.length()) 63 .toLowerCase(); 64 vars.add(fieldName); 65 String ds = m.toString(); 66 int i = ds.indexOf("("); 67 int j = ds.indexOf(")"); 68 String str = ds.substring(i + 1, j); 69 var.add(str); 70 ms.add(m); 71 } catch (Exception e) { 72 e.printStackTrace(); 73 } 74 75 } 76 } 77 } 78 79 public void doGet(HttpServletRequest request, HttpServletResponse response) 80 throws ServletException, IOException { 81 doPost(request, response); 82 } 83 84 public void doPost(HttpServletRequest request, HttpServletResponse response) 85 throws ServletException, IOException { 86 request.setCharacterEncoding("utf-8"); 87 response.setCharacterEncoding("utf-8"); 88 Map<String, String[]> map = request.getParameterMap(); // 这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象 89 for (int i = 0; i < vars.size(); i++) { 90 String strs = vars.get(i); // 遍历出变量名 91 String str = var.get(i); // 遍历出bean位置 92 Method mehMethod = ms.get(i); // 方法 93 String parameterKey; 94 Class classType; 95 try { 96 classType = Class.forName(str); 97 Object o = classType.newInstance(); 98 Method[] methods = classType.getMethods(); // 获取方法 99 for (Method m : methods) { // 遍历方法100 String mName = m.getName(); // 方法名101 if (mName.startsWith("set")) {102 // 获取字段名103 String fieldName = mName.substring(3, mName.length())104 .toLowerCase();105 parameterKey = strs + "." + fieldName;106 // 赋值107 if (map.get(parameterKey) != null) {108 String key[] = map.get(parameterKey);109 String ds = m.toString();110 int i1 = ds.indexOf("(");111 int j1 = ds.indexOf(")");112 String str1 = ds.substring(i1 + 1, j1);113 if (str1.equals("java.lang.Integer")114 || str1.equals("int")) {115 // 如果是int类型116 int ip = Integer.parseInt(key[0]);117 m.invoke(o, ip);118 } else {119 m.invoke(o, key[0]);120 }121 122 }123 }124 }125 if (o != null) {126 127 mehMethod.invoke(this, o);128 }129 130 } catch (Exception e) {131 // TODO Auto-generated catch block132 e.printStackTrace();133 }134 }135 136 manguesPost(request, response);137 }138 139 protected abstract void manguesPost(HttpServletRequest request,140 HttpServletResponse response);141 }
下面是 一个简单的继承servlet,只需要利用get方式访问
package mangues.servlet;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mangues.base.BaseServlet;import mangues.model.Student;@WebServlet(urlPatterns = { "/query" })public class AddServlet extends BaseServlet { private Student student; public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } @Override protected void manguesPost(HttpServletRequest request, HttpServletResponse response) { System.out.println(student.getSname()); }}
下面是需要映射的Bean
package mangues.model;public class Student { private String sno; //学号 private String sname;//姓名 private Integer sage; //年龄 private String ssex; //性别 public Student() { super(); } public Student(String sno, String sname, Integer sage, String ssex) { super(); this.sno = sno; this.sname = sname; this.sage = sage; this.ssex = ssex; } public String getSno() { return sno; } public void setSno(String sno) { this.sno = sno; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Integer getSage() { return sage; } public void setSage(Integer sage) { this.sage = sage; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } }
新闻热点
疑难解答