zoukankan      html  css  js  c++  java
  • 利用反射优化Servlet抽象出父类BaseServlet

      在编写servlet的时候发现每个servlet里面的doPost方法都如:

        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }

      而在doGet方法中大多是对uri的跳转   

      (通过在uri后面加上method参数可以定位到不同的方法,这样就可以少写一些servlet)

      如果新增模块,则该模块的Servlet中也同样包含相同的代码,因此,代码过度冗余,需要优化。

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取客户端请求的方法名
            String methodName = request.getParameter("method");
            //根据名称判断调用的方法
            if("categoryList".equals(methodName))
            {
                categoryList(request,response);
            }else if("index".equals(methodName))
            {
                index(request,response);
            }else if("productInfo".equals(methodName))
            {
                productInfo(request,response);
            }else if("productList".equals(methodName))
            {
                productList(request,response);
            }
        }

      抽象出父类BaseServlet,并且在BaseServlet中使用反射机制实现方法的调用

    public class BaseServlet extends HttpServlet {
        private static final long serialVersionUID = 7978401768598506854L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.获取方法名
            String methodName = request.getParameter("method");
            //2.得到请求Servlet的字节码
            Class clazz = this.getClass();
            try {
                //3.根据字节码和方法名获取方法对象 所有方法参数均为HttpServletRequest和HttpServletResponse类型
                Method method = clazz.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                method.setAccessible(true);   //设置方法均直接访问
                //4.调用method方法,实现其中的功能
                method.invoke(this, request, response);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }}

       然后再写servlet就只用写具体的方法就行了

    @WebServlet("/user")
    @SuppressWarnings("unused")
    public class UserServlet extends BaseServlet {
        private static final long serialVersionUID = 7665438418738590582L;
        
        private UserService userService = new UserServiceImpl();
        
        //安全退出
        private void logout(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.getSession().invalidate();
            //涉及 - cookie  - 清除cookie
            response.sendRedirect(request.getContextPath() + "/index");
        }
        
        //用户登录
        private void login(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //自动登录  -  记住用户名
            
            User user = userService.login(username, password);
            if(user != null) {   //成功
                request.getSession().setAttribute("user", user); 
                response.sendRedirect(request.getContextPath() + "/index");
            } else {
                request.setAttribute("info", "用户名或密码错误!");
                request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            }
        }
        
        //email - 账号激活
        private void active(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String activeCode = request.getParameter("activeCode");
            userService.active(activeCode);
            request.setAttribute("info", "账号激活成功, 请登录!");
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); 
        }
        
        /**  
        * @Title: register  
        * @Description: 用户注册
        */
        private void register(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //调用service
            Map<String, String[]> paramMap = request.getParameterMap();
            userService.register(paramMap);
            
            //跳转至首页|登录页面
            request.getRequestDispatcher("/WEB-INF/jsp/registerSuccess.jsp").forward(request, response); 
        }
    
    }
  • 相关阅读:
    当期所得税费用总额
    所得税净利润算法
    [AGC028B]Removing Blocks 概率与期望
    bzoj 4319: cerc2008 Suffix reconstruction 贪心
    bzoj 2430: [Poi2003]Chocolate 贪心
    BZOJ 2839: 集合计数 广义容斥
    luogu 5505 [JSOI2011]分特产 广义容斥
    CF504E Misha and LCP on Tree 后缀自动机+树链剖分+倍增
    CF798D Mike and distribution 贪心
    CF707D Persistent Bookcase 可持久化线段树
  • 原文地址:https://www.cnblogs.com/luffyxin/p/9889293.html
Copyright © 2011-2022 走看看