Servlet学习

HttpServlet的继承关系:

Servlet <-- GenericServlet <-- HttpServlet

Http请求常用的4种字段类型:

GET (读取)

POST (保存)

PUT (修改)

DELETE (删除)

1. 官方提供的HttpServlet

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("GET");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("POST");
    }
}

2. 为什么使用doGet、doPost,而不是直接用service方法?

  首先, HttpServlet中的doGetdoPost方法是service方法的进一步处理。Servlet接口中一共5中方法,但实际开发中常用的只是service方法。因此需要进行一定的代码冗余处理。

Servlet接口中的5种方法:

public interface Servlet {
    void init(javax.servlet.ServletConfig servletConfig) throws javax.servlet.ServletException;

    javax.servlet.ServletConfig getServletConfig();
    
    // 常用
    void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws javax.servlet.ServletException, java.io.IOException;

    java.lang.String getServletInfo();

    void destroy();
}

doGetdoPost方法的处理思路:
对service方法进行http字段判别即可:

自己写一个MyHttpServlet类, 继承关系如下:
service <-- MyGenericServlet <-- MyHttpServlet

  1. MyGenericServlet实现Servlet接口;
  2. MyHttpServlet继承MyGenericServlet:
public class MyHttpServlet extends MyGenericServlet{
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 判定 http 方法字段类型
        String method = request.getMethod();
        // 注意 http 方法字段全为大写
        switch (method) {
            case "GET":
                this.doGet(request, response);
                break;
            case "POST":
                this.doPost(request, response);
                break;
    }
    
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
        // TO do
    }
    
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
        // TO do
    }
}

  官方HttpServletdoGet方法对rep使用的是HttpServletRequest类型, 而Servlet提供的是ServletRequest类型。 查看源码可知:HttpServletRequest又是ServletRequest的子类。所以将ServletRequest向下转为HttpServletRequest类型即可。

  1. 最后创建一个Servlet实例继承MyHttpServlet就能实现doGetdoPost方法:
public class helloServlet extends MyHttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
        res.getWriter().write("hello Get!");
    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
        res.getWriter().write("hello Post!");
    }
}
posted @ 2020-06-22 19:45  Maverickos  阅读(42)  评论(0编辑  收藏  举报