在学习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); } } }
有任何问题请留言或私信,整理不易,有帮助的话,点个赞再走趴!