欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

优化Servlet

程序员文章站 2022-10-03 19:51:15
优化Servlet用UserServlet专门处理关于User模块的功能,在这个UserServlet里面提供很多方法,完成不同的功能,优化Servlet的目的就是减少Servlet的数量,讲一个功能一个Servlet优化为一个模块一个Servlet,也相当于是数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求优化Servlet的方法:我们写一个BaseServlet继承HttpServlet,重新service()方法。然后其他Servlet继承 BaseSe...

优化Servlet

用UserServlet专门处理关于User模块的功能,在这个UserServlet里面提供很多方法,完成不同的功能,

优化Servlet的目的就是减少Servlet的数量,讲一个功能一个Servlet优化为一个模块一个Servlet,也相当于是数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求

优化Servlet的方法:

我们写一个BaseServlet继承HttpServlet,重新service()方法。然后其他Servlet继承 BaseServlet。

8 然后在BaseServle中的service方法里面进行分发。

9 具体,就是获取不同servlet的请求路径,截取出来方法名,因为我们可以规定,不同模块的 servlet的请求路径为一个二级路径,例如:UserServlet 的请求路径 /user/* 那么当前台请求 路径为 /user/add 那就是想要

10 UserServlet中的add方法执行。 如果请求路径为 /user/find 那就是想让UserServlet的 find方法执行。

11 那么我们在BaseServlet中获取请求路径,截取出方法名,通过反射的方式,让子类Servlet中 的方法执行。

12 BaseServlet的抽取

1.创建一个BaseServlet继承HttpServlet,但是不要给BaseServlet写任何路径,因为我们不直接 请求BaseServlet,而是请求他的子类,当请求他的子类时,那么父类BaseServlet中的service()方法就会执行。

2 2.重新service()方法。

3 3.在service()方法中获取请求路径,那么这里有一个问题,我在父类BaseServlet中怎么获取子类 Servlet的对 象,其实使用this就可以,this就代表这个子类Servlet,我们等会可以测试看下。

4 4.从请求路径中截取方法名出来 例如请求路径是 xxxx/user/add 我们把add截取出来。

5 5.通过反射获取add方法对象,并调用执行。

BaseServlet代码的实现
package org.westos.travel.web.servlet;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
  public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在这里完成方法的分发
        //1.获取请求路径
        String uri = request.getRequestURI();
        System.out.println("请求Uri"+uri);

        //2.获取方法名称
        String methodName = uri.substring(uri.lastIndexOf("/") + 1);
        System.out.println(methodName);

        //3.获取方法对象
        System.out.println(this);//this代表的是userServlet,
        try {
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //4。执行方法
            method.invoke(this,request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

   public void writeValue(Object obj, HttpServletResponse response) throws IOException {

       ObjectMapper mapper =  new ObjectMapper();

      response.setContentType("application/json;charset utf-8");

        mapper.writeValue(response.getOutputStream(), obj);

        }



     //提供把对象转换成json字符串的方法

          public String ObjectToJson(Object obj) throws JsonProcessingException {

        ObjectMapper mapper =  new ObjectMapper();

        String json =  mapper.writeValueAsString(obj);

       return json;

       }

}
将所有子类要用到的方法,抽取到这个类中。

本文地址:https://blog.csdn.net/qq_46466568/article/details/109643153