利用反射实现Servlet公共类的抽取
一次请求的执行过程:
请求:发送请求地址-->到达web.xml中,找到地址对应的servlet类-->通过反射调用该类的构造函数,创建该servlet类的对象-->通过当前对象调用该servlet的init方法-->发现没有-->从其父类HttpServlet找init,还是没有-->再找其父类GenericServlet,有init,调用该init方法加载当前servlet类-->调用当前servlet的service方法-->发现没有,找父类HttpServlet-->父类有该方法,调用它,service中获取请求方式-->然后调用do post()方法,当前servlet的do post()方法-->最后销毁,调用disdroy。嗯,其实调用父类的init,service方法这种说貌似不妥,应该是调用继承自父类的这两个方法
对原本的service方法进行重写,利用反射调用子类的具体执行方法
1 package com.jixh.ss.web.base; 2 3 import java.io.IOException; 4 import java.lang.reflect.Method; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class BaseServlet extends HttpServlet { 12 13 private static final long serialVersionUID = 1L; 14 15 @Override 16 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 17 18 // localhost:8080/store/productServlet?method=updateUser,url中必须带有所要调用的子类具体方法的方法名 19 String method = req.getParameter("method"); 20 21 if (null == method || "".equals(method) || method.trim().equals("")) { 22 method = "execute"; 23 } 24 25 // 注意:此处的this代表的是子类的对象 26 // System.out.println(this); 27 // 子类对象字节码对象 28 @SuppressWarnings("rawtypes") 29 Class clazz = this.getClass(); 30 31 try { 32 // 查找子类对象对应的字节码中的名称为method的方法.这个方法的参数类型是:HttpServletRequest.class,HttpServletResponse.class 33 @SuppressWarnings("unchecked") 34 Method md = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class); 35 if(null!=md){ 36 String jspPath = (String)md.invoke(this, req, resp); 37 if (null != jspPath) { 38 req.getRequestDispatcher(jspPath).forward(req, resp); 39 } 40 } 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 45 } 46 47 // 默认方法 48 public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 49 return null; 50 } 51 52 }
子类Servlet只进行具体的业务处理
1 package com.jixh.ss.web.servlet; 2 3 import java.util.List; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 import com.jixh.peanut.domian.FirstMenu; 9 import com.jixh.peanut.domian.User; 10 import com.jixh.peanut.domian.UserPower; 11 import com.jixh.peanut.service.MenueService; 12 import com.jixh.peanut.service.UserService; 13 import com.jixh.peanut.service.impl.MenueServiceImpl; 14 import com.jixh.peanut.service.impl.UserServiceImpl; 15 import com.jixh.peanut.util.DateUtils; 16 import com.jixh.peanut.util.UUIDUtils; 17 import com.jixh.peanut.web.base.BaseServlet; 18 19 import net.sf.json.JSONObject; 20 21 22 public class userServlet extends BaseServlet { 23 private static final long serialVersionUID = 1L; 24 25 26 // 修改用户 27 public String updateUser(HttpServletRequest request, HttpServletResponse response) { 28 try { 29 // 允许跨域访问的响应头 30 response.setHeader("Access-Control-Allow-Origin", "*"); 31 32 String username = request.getParameter("username"); 33 String password = request.getParameter("password"); 34 // 验证用户名密码 35 UserService userService = new UserServiceImpl(); 36 User user = userService.userLoging(username, password); 37 if (user != null) { 38 // 验证通过,进行下一步 39 String uid = (String) request.getSession().getAttribute("thisUser"); 40 String utype = request.getParameter("utype"); 41 int ustate = Integer.parseInt(request.getParameter("ustate")); 42 String powerIdArray = request.getParameter("powerIdArray"); 43 System.out.println(uid+"=="+username + "==" + password + "==" + utype + "==" + ustate + "==" + powerIdArray); 44 //修改用户表 45 boolean result = userService.updateUser(uid, utype, ustate); 46 System.out.println("修改用户结果为"+result); 47 if(result) { 48 response.getWriter().write("success"); 49 }else { 50 response.getWriter().write("faild"); 51 } 52 } else { 53 // 直接响应 54 response.getWriter().write("error"); 55 } 56 } catch (Exception e) { 57 e.printStackTrace(); 58 } 59 return null; 60 } 61 }