关于实现Servlet的多请求响应与抽象类中使用的jdk动态代理的一些理解

在学习javaweb的过程中,由于访问Servlet时定义多个Servlet显得十分繁琐,当业务逻辑操作有很多时,为避免Servlet的冗余,提高代码的可读性,我使用了动态代理机制实现一个Servlet可以实现多个业务逻辑操作。

通过创建一个Servlet的抽象类,其他Servlet通过继承这个抽象类,来实现业务逻辑的操作。抽象类中使用动态代理机制获取页面中传递的指定方法名,来执行不同的业务方法。

以下是我对动态代理机制的一些见解

由于是实现类中会包含抽象类中的方法,所以在访问Servlet时,这个this
所指定的就是所访问的Servlet这个类,并不是指抽象类。
明白这一点十分重要

  • this.getClass() : getClass()方法是获得调用该方法的对象的类 。这里使用this调用该方法就是指获取所访问的Servlet类。
  • getDeclaredMethod(String name, Class<?>... parameterTypes):这个方法是指获得方法名为第一个参数name所指定的方法,后面的这个参数是name方法中的参数代表的类。当无参构造时,是获取本类中所有的方法。如果需要深入了解,请查看api文档
  • this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class) :解读这个方法,就是通过反射获得这个Servlet类中方法名为name,参数类型为指定类的方法。
  • invoke():根据传入的对象实例,通过配置的实参参数来调用方法。
  • method.invoke(this,request,response):在这里是指通过方法的对象实例,也就是这个Servlet实现类执行上面定义的method对象所指定的方法。
public abstract class BaseServlet extends HttpServlet {

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

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");//页面中传递过来的参数,用来指定Servlet处理哪种业务与进行响应
        try{
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            method.invoke(this,request,response);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

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

举个栗子,说明Servlet可以处理多个业务
我这边在一个Servlet中定义了两个方法,可以分别实现登录和注册功能
当然,你也可以添加其他Servlet,继承抽象类Servlet,通过页面中传递过来的参数,实现多种不同业务的处理与响应

@WebServlet("/userServlet")
public class UserServlet extends BaseServlet {

    private UserService userService = new UserServiceImpl();

    protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = WebUtil.copyParamToBean(request.getParameterMap(),new User());

        User loginUser = userService.login(new User(user.getUsername(), user.getPassword(), null));
        if (loginUser == null){
            request.setAttribute("msg","用户名或密码错误!");
            request.setAttribute("username",user.getUsername());
            request.getRequestDispatcher("pages/user/login.jsp").forward(request,response);
        }else {
            request.getSession().setAttribute("user",loginUser);
            request.getRequestDispatcher("pages/user/regist_success.jsp").forward(request,response);
        }
    }

    protected void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Session中的验证码
        String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
        request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
        //获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        String code = request.getParameter("code");

        //判断验证码是否正确,正确后再进行登入操作
        if (token != null && token.equalsIgnoreCase(code)){
            //检查用户名是否可用
            if (userService.existUserName(username)){
                //不可用
                request.setAttribute("msg","用户名已存在!");
                request.setAttribute("username",username);
                request.setAttribute("email",email);
                request.getRequestDispatcher("pages/user/regist.jsp").forward(request,response);
            }else {
                //可用
                User loginUser = new User(username,password,email);
                userService.registerUser(loginUser);
                request.getSession().setAttribute("user",loginUser);
                request.getRequestDispatcher("pages/user/regist_success.jsp").forward(request,response);
            }
        }else {
            request.setAttribute("msg","验证码错误!");
            request.setAttribute("username",username);
            request.setAttribute("email",email);
            request.getRequestDispatcher("pages/user/regist.jsp").forward(request,response);
        }
    }
}

有任何问题请留言或私信,整理不易,有帮助的话,点个赞再走趴!

上一篇:Matlab:meshgrid函数在图形学的应用细节?


下一篇:JS语句创建简单表格