首页 > 学院 > 开发设计 > 正文

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

2019-11-15 00:56:22
字体:
来源:转载
供稿:网友
利用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;    }        }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表