代码改变世界

Servlet原理

2022-12-14 09:16  杭伟  阅读(75)  评论(0编辑  收藏  举报

Servlet的本质是一个Java接口,定义了一套处理网络请求的规范。

最主要的是两个生命周期方法init()和destory(),以及一个处理请求的service()。

因为处理一个网络请求,绕不开:初始化?请求处理?销毁? 这三个基本面。

其中:init()和destory()方法各自执行一次,service会在每次有新请求到来时被调用。

Servlet并不能直接和客户端打交道。

那请求是如何到达servlet的呢?答案是:servlet容器。

比如tomcat。tomcat监听端口,请求过来后,根据url信息,转发给相应servlet进行处理,servlet调用servlet的service()方法,返回response对象,tomcat再将response对象返回给客户端。

所谓的Request和Response其实是Tomcat传给的Servlet,所以servlet更偏向于业务代码。

Request和Response已经被Tomcat封装好,所以在意网络请求部分的内容,应该去看tomcat的源码。

到这里servlet的部分就已经结束了。

**当下Spring全家桶大行其道, Servlet开始退居幕后,取而代之的是更加方便的SpringMVC。而SpringMVC的核心组件DispatcherServlet其实本质就是一个Servlet。

 回顾servlet:

上述servlet相关方法的参数主要有三个:ServletConfig,ServletRequest,ServletResponse

ServletConfig:web.xml,tomcat帮我们解析了。。

ServletRequest和ServletResponse:tomcat处理并封装。其中response由tomcat转发进来是空,由servlet填充,再由tomcat返回给客户端。

 

Java Servlet封装:

浏览器发送请求基本是两种:get和post,但我们无需自行判断处理。一般是自定义一个Servlet继承HttpServlet,继承关系如图:

 因为HttpServlet已经帮我们封装好。所以自定义servlet只需关注具体业务逻辑即可。

 1 @WebServlet(name = "helloServlet", value = "/hello-servlet")
 2 public class HelloServlet extends HttpServlet {
 3     private String message;
 4     public void init() {
 5         message = "Hello World!";
 6     }
 7     public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
 8         response.setContentType("text/html");
 9         // Hello
10         PrintWriter out = response.getWriter();
11         out.println("<html><body>");
12         out.println("<h1>" + message + "</h1>");
13         out.println("</body></html>");
14     }
15     public void destroy() {
16     }
17 }

 

参考文献:

An introduction to Tomcat servlet interactions

How Spring MVC Really Works