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等内容。