Servlet运行原理

参考:https://blog.csdn.net/qq_19782019/article/details/80292110

建议先看另一个博文,了解servlet规范https://www.cnblogs.com/zhenjingcool/p/15877274.html

Java Servlet(Java Server Applet)是服务器端小程序。用于生成动态web内容。其和Java Applet区别是运行于服务端。

 

0 容器

容器是Servlet实例生存的地方,Servlet实例在容器中创建、存活、销毁。

容器的另外一个作用是接收http请求,把请求封装成ServletRequest对象;把响应封装成ServletResponse对象。

1 Servlet

public interface Servlet {
    public void init(ServletConfig config) throws ServletException;

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    
    public void destroy();
    
    public ServletConfig getServletConfig();
    
    public String getServletInfo();
}

该接口定义了几个方法,

当首次请求该Servlet时,容器将加载该Servlet,并实例化该Servlet,并调用init方法

当有请求访问时,容器将请求封装成ServletRequest,并提供一个ServletResponse对象。然后容器调用该Servlet的service方法。

当容器关闭时,容器将调用Servlet的destroy方法。

2 ServletRequest

 只列出了一部分方法

public interface ServletRequest {
    public String getCharacterEncoding();

    public int getContentLength();

    public String getContentType();

    public ServletInputStream getInputStream() throws IOException; 

    public String getParameter(String name);
    
    public BufferedReader getReader() throws IOException;
    
    public ServletContext getServletContext();
}

Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法

3 ServletResponse

public interface ServletResponse {
    public String getCharacterEncoding();
    
    public String getContentType();
    
    public ServletOutputStream getOutputStream() throws IOException;

    public PrintWriter getWriter() throws IOException;

    public void setCharacterEncoding(String charset);

    public void setContentType(String type);
}

Servlet的service方法的第二个参数,可以通过它向浏览器返回数据。

4 ServletContextListener

这个接口只有两个方法,当容器启动时,会调用contextInitialized方法。当容器销毁时会调用contextDestroyed方法。

public interface ServletContextListener extends EventListener {
    default public void contextInitialized(ServletContextEvent sce) {}

    default public void contextDestroyed(ServletContextEvent sce) {}
}

 

5 Filter

过滤器,对请求进行过滤作用,当请求到达过滤器时,将执行doFilter方法。

public interface Filter {

    default public void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    default public void destroy() {}
}

注意,doFilter方法中有一个FilterChain参数。为一个过滤链。过滤链执行的基本过程是,如果我们在web.xml中配置了多个过滤器,则容器会为我们创建一个FilterChain,表示一个过滤链。我们将会从第一个过滤器执行doFilter方法,并且一定要写上这一句代码chain.doFilter才会执行过滤链的下一个过滤器,不然过滤链执行将到此为止。

6 web.xml

web.xml也是Servlet规范里的东西,其结构在Servlet规范中都有说明。在Servlet规范中,web.xml也叫部署描述文件(Deployment Descriptor)。

该文件中我们配置所有的Servlet、Filter、Listener、ErrorPage、mainPage等内容。

 

posted @ 2022-02-10 15:28  zhenjingcool  阅读(63)  评论(0编辑  收藏  举报