利用反射实现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 }
复制代码
posted @   jixhua  阅读(621)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示