Java Servlet教程—Servlet 是如何工作的?
了解 Servlet 如何工作对于理解 Servlet 是非常重要的。下面,我们将了解第一个 Servlet 程序的内部细节。
服务器会检查是否是首次请求该 Servlet。
如果是,Web 容器将执行以下任务:
- 加载 Servlet 类。
- 实例化 Servlet 类。
- 调用 init 方法并传递 ServletConfig 对象。
否则,
- 调用 service 方法并传递请求和响应对象。
当 Web 容器需要移除 Servlet 时(例如在停止服务器或卸载项目时),它会调用 destroy 方法。
Web 容器如何处理 Servlet 请求?
Web 容器负责处理请求。让我们看看它是如何处理请求的。
- 将请求与 web.xml 文件中的 Servlet 映射。
- 为此请求创建请求和响应对象。
- 在线程上调用 service 方法。
- 公共 service 方法内部调用受保护的 service 方法。
- 受保护的 service 方法根据请求类型调用 doGet 方法。
- doGet 方法生成响应,并将其传递给客户端。
- 发送响应后,Web 容器会删除请求和响应对象。线程被保存在线程池中或根据服务器的实现被删除。
公共 service 方法中写了什么?
公共 service 方法将 ServletRequest 对象转换为 HttpServletRequest 类型,将 ServletResponse 对象转换为 HttpServletResponse 类型。然后,调用 service 方法并传递这些对象。让我们看看内部代码:
1. **public void** service(ServletRequest req, ServletResponse res)
2. **throws** ServletException, IOException
3. {
4. HttpServletRequest request;
5. HttpServletResponse response;
6. **try**
7. {
8. request = (HttpServletRequest) req;
9. response = (HttpServletResponse) res;
10. }
11. **catch**(ClassCastException e)
12. {
13. **throw new** ServletException("非 HTTP 请求或响应");
14. }
15. service(request, response);
16. }
受保护的 service 方法中写了什么?
受保护的 service 方法会检查请求的类型,如果请求类型是 GET,则调用 doGet 方法,如果请求类型是 POST,则调用 doPost 方法,以此类推。让我们看看内部代码:
1. **protected void** service(HttpServletRequest req, HttpServletResponse resp)
2. **throws** ServletException, IOException
3. {
4. String method = req.getMethod();
5. **if**(method.equals("GET"))
6. {
7. **long** lastModified = getLastModified(req);
8. **if**(lastModified == -1L)
9. {
10. doGet(req, resp);
11. }
12. ....
13. // 其余代码
14. }
15. }
这些详细步骤展示了 Servlet 的工作原理,从接收请求到生成并发送响应的整个流程。