你的位置:首页 > Java教程

[Java教程]利用java类的反射机制,实现了 映射 获得post(get)的参数 的BaseServlet


这几天一直在研究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;  }    }

 




去贵州的旅游团价格去贵州旅游必去景点去贵州旅游要多少钱去贵州旅游最佳路线去贵州旅游最佳时间南海影视城最新活动时间?佛山南海影视城4月有什么优惠? 桂林神龙水世界酒店住宿多少钱?神龙水世界景区有住的地方吗? 南海影视城五一有什么活动?佛山南海影视城好玩活动介绍? 广西桂林神龙水世界在哪里?神龙水世界怎么去? 3月松山湖桃花开了吗?2015松山湖桃花几月最好看? 2015马降龙碉楼旗袍节时间?开平碉楼穿旗袍免门票时间? 马降龙碉楼旗袍节有什么好玩的?开平碉楼旗袍节活动介绍? 香市动物园自驾游攻略?东莞香市动物园怎么去? 云南大海草山怎么去? 秋日下江南 盘点江苏六大经典园林 广西龙脊美景 我在金秋遇见你 唐蕃古道雅家梗 甘孜高原静谧之地 2015年七夕去马尔代夫玩好不好? 去一次迪拜要带多少钱? 曼谷玉佛寺门票多少钱?曼谷玉佛寺有那些禁忌? 2015年欧洲有哪几个国家对中国免签证? IDT5V9910A-2SOG Datasheet IDT5V9910A-2SOG Datasheet IDT71V3558XS133PFGI8 Datasheet IDT71V3558XS133PFGI8 Datasheet IDT72V3650L15PF Datasheet IDT72V3650L15PF Datasheet 大兴安岭到香港旅游价格 大兴安岭到香港旅游价格 大兴安岭到香港旅游价格 深圳到香港旅游价格 深圳到香港旅游价格 深圳到香港旅游价格 徐州到香港旅游价格 徐州到香港旅游价格 徐州到香港旅游价格