网 上 书 城

3. 局部优化

3.1优化一(整合Servlet):

  • 现在我们的项目是一个请求对应一个Servlet,我们能不能将多个请求对应一个Servlet呢?比如用户登录、注册的LoginServlet、RegistServlet使用一个UserServlet代替:
  • 在用户发送请求的URL地址后面添加一个method请求参数,在UserServlet中添加两个方法login()和regist()。但是,两个方法的格式与doGet和doPost要保持一致,可以复制一个doGet或doPost方法,将方法名改为login或regist。
  • 登录表单提交到UserServlet?method=login,注册表单提交到UserServlet?method=regist。在UserServlet的doGet方法中获取请求参数,在doPost方法中调用doGet方法;在doGet方法中使用if else语句判断method的值,如果是login就调用login方法,如果是regist就调用regist方法。
  • 在UserServlet中创建UserService对象,将LoginServlet、RegistServlet的doPost方法中的内容分别复制到UserServlet的login方法和regist方法中即可实现之前的登录注册功能。

3.2优化二(动态调用方法):

  • 在优化一中实现了多个请求对应一个Servlet的需求,但是我们在UserServlet中每添加一个方法就要在doGet方法中添加一个 else if语句!而且我们发现我们获取的请求参数的值正好是UserServlet中的方法名那么我们能不能通过请求参数动态的调用对应的方法呢
    • 通过反射的形式动态获取方法对象,这样我们再添加新的方法时就不需要再写ifelse语句了,但是新添加的方法的格式仍需要与doGet或者doPost的格式一致。
      • 根据请求方式获取方法名
        • String methodName= request.getParameter("method");
      • 根据方法名获取方法的对象,getDeclaredMethod()方法用来获取当前类中的某一个方法;第一个参数是方法名,第二个参数是方法的参数类型
        • Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
      • 设置访问权限
      • setAccessible(true);
      • 调用方法。invoke()方法用来调用一个方法;第一个参数是要调用哪个对象的方法,第二个参数是调用方法需要传的参数
        • invoke(this, request,response);

3.3优化三(创建BaseServlet):

  • 在优化二中我们实现了动态调用对应方法的需求,但是以后每次创建Servlet的时候都需要将以上代码重写一遍,那么我们为何不把以上代码单独放到一个Servlet中,我们给它命名为BaseServlet,以后再创建Servlet时直接让它继承BaseServlet即可。
    • 创建一个专门用来被其他Servlet继承的BaseServlet
    • 但是不可以重写BaseServlet中的doGet和doPost方法