zoukankan      html  css  js  c++  java
  • 利用反射实现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 }
  • 相关阅读:
    HashMap代码示例
    ArrayList代码示例
    ArrayList&LinkedList&Map&Arrays
    Calendar日历小程序
    System & Runtime &Math
    基本类型的封装类
    开发规范
    P1607 [USACO09FEB]庙会班车Fair Shuttle
    P2869 [USACO07DEC]美食的食草动物Gourmet Grazers
    Set,Multiset,Iterator(迭代器)详解
  • 原文地址:https://www.cnblogs.com/jixiaohua/p/10421130.html
Copyright © 2011-2022 走看看