Servlet 如何工作

简介: 我们已经清楚了 Servlet 是如何被加载的、初始化及其体系结构,现在的问题就是它是如何被调用的.用户从浏览器向服务器发起的一个请求通常会包含如下信息http://hostname: port /contextpath/servletpathh...

我们已经清楚了 Servlet 是如何被加载的、初始化及其体系结构,现在的问题就是它是如何被调用的.

用户从浏览器向服务器发起的一个请求通常会包含如下信息
http://hostname: port /contextpath/servletpath

  • hostname 和 port:与服务器建立 TCP 连接
  • URL:选择在服务器中哪个子容器服务用户的请求

服务器是如何根据这个 URL 到达正确的 Servlet 容器中的呢?

  • 在 Tomcat7 中这件事很容易解决,因为这种映射工作有专门的一个类来完成 org.apache.tomcat.util.http.mapper.
    该类保存了 Tomcat 的 Container 容器中所有子容器的信息.
    org.apache.catalina.connector.Request 类进入 Container 容器之前,mapper 会根据这次请求的 hostnanecontextpathhostcontext 容器设置到 RequestmappingData 属性中,如下图所示.
    所以当 Request进入 Container 容器之前,它要访问哪个子容器就已经确定了.
    img_1b6ffa4d6a0068d3917dedd12f267936.png
    Request 的 Mapper 类关系图

可能你有疑问,mapper 中怎么会有容器的完整关系?
这要回到http://upload-images.jianshu.io/upload_images/4685968-f4c4cc6126fe8e14.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700中 第 19 步 MapperListener 类的初始化过程,下面是其的init 方法代码

 public void init() { 
        findDefaultHost(); 
        Engine engine = (Engine) connector.getService().getContainer(); 
        engine.addContainerListener(this); 
        Container[] conHosts = engine.findChildren(); 
        for (Container conHost : conHosts) { 
            Host host = (Host) conHost; 
            if (!LifecycleState.NEW.equals(host.getState())) { 
                host.addLifecycleListener(this); 
                registerHost(host); 
            } 
        } 
 }

这段代码的作用就是将 MapperListener 作为一个监听者加到整个 Container 容器的每个子容器中.
如此,任何一个容器发生变化,MapperListener 都将会被通知到,相应的保存容器关系的 MapperListener 的 mapper 属性也会被修改.
在for 循环中就是将 host 及下面的子容器注册到 mapper 中.


img_5afa42c5b0803465b64d6bcb6aa412f8.png
Request 在容器中的路由图

上图描述了一次 Request 请求如何达到最终的 Wrapper 容器.
我们现在知道了请求是如何达到正确的 Wrapper 容器,但在请求到达最终的 Servlet 前还要完成一些步骤,必须要执行 Filter 链以及通知你在 web.xml 中定义的 listener.

接下来就要执行 Servlet 的 service 方法了,通常我们自定义的 servlet 并不直接实现 javax.servlet.servlet 接口,而是去继承更简单的 HttpServlet 或 GenericServlet,我们可以有选择的覆盖相应方法去实现我们要完成的工作.

Servlet 的确已经能够帮我们完成所有的工作了,但是现在的 web 应用很少有直接将交互的全部页面用 servlet 来实现,而是采用更加高效的 MVC 框架来实现.
这些 MVC 框架基本的原理都是将所有的请求都映射到一个 Servlet,然后去实现 service 方法,这个方法也就是 MVC 框架的入口.

当 Servlet 从 Servlet 容器中移除时,也就表明该 Servlet 的生命周期结束,这时 Servlet 的 destroy 方法将被调用,善后.

目录
相关文章
|
7月前
|
存储 缓存 安全
Servlet与JSP在Java服务器端开发中的实践与优化
【6月更文挑战第23天】本文探讨了Java中Servlet与JSP在在线书店系统开发中的应用,强调了它们在动态网站构建和Web效率中的作用。通过实例,展示了Servlet如何作为控制器处理用户登录,JSP则利用EL表达式呈现数据。此外,文章提及了性能优化如分页和缓存,以及安全措施如防止SQL注入和XSS攻击,强调了全面掌握和应用这些技术的重要性,以创建高效、安全的Web应用。
62 7
|
8月前
|
Java 关系型数据库 MySQL
Servlet 教程 之 Servlet 有用的资源
探索Servlet世界:访问Sun's Site获取官方资料,Tomcat作为开源JSP引擎,搭配MySQL Connector/J实现数据库连接。深入学习Java编程,参考The Java Tutorials及Java 2 SDK文档,免费下载Java并关注Sun Developer Network获取最新资源。
58 1
|
8月前
|
Java
Servlet 教程 之 Servlet 生命周期 4
Servlet生命周期包括初始化、服务和销毁三个阶段:init()方法在创建时调用,service()方法处理客户端请求,destroy()方法在销毁前执行。对于POST请求,doPost()方法处理HTML表单数据。当Servlet不再使用时,由JVM的垃圾回收器自动清理。
49 5
|
8月前
|
Java
Servlet 教程 之 Servlet 生命周期 3
Servlet生命周期包括初始化(init())、服务(service())和销毁(destroy())三个阶段。doGet()方法处理GET请求,接收HttpServletRequest和HttpServletResponse参数。当Servlet不再使用时,由JVM的垃圾回收器自动清理。
60 5
|
8月前
|
Java 容器
Servlet 教程 之 Servlet 生命周期 2
Servlet生命周期包括初始化(init())、处理请求(service())、销毁(destroy())和垃圾回收。service()方法是核心,容器调用它来响应客户端请求,并根据HTTP类型调用doGet()或doPost()。当请求处理完毕,servlet会被销毁,最终由JVM的垃圾回收器清理。
57 5
|
8月前
|
Java 数据库连接
Servlet 教程 之 Servlet 生命周期 5
Servlet生命周期包括初始化(init())、服务(service())和销毁(destroy())三个阶段。destroy()方法在Servlet即将销毁时执行,用于资源释放和清理工作,如关闭数据库连接。之后,Servlet对象等待垃圾回收。
79 4
|
8月前
|
Java 容器
Servlet 教程 之 Servlet 生命周期 6
Servlet生命周期包括初始化(init())、处理请求(service())和销毁(destroy())。当首个请求到达时,容器加载Servlet并调用init()。之后,多个线程共享同一Servlet实例,每个线程独立调用service()处理请求。最后,销毁前调用destroy(),实例由JVM回收。
39 2
|
8月前
|
Java
Servlet 教程 之 Servlet 生命周期 1
Servlet生命周期包括初始化、服务和销毁三个阶段:init()方法在Servlet创建时调用,仅初始化一次;service()方法处理客户端请求,每次请求都创建新线程;destroy()方法在Servlet销毁前执行。Servlet实例在首次请求时创建,可通过配置在服务器启动时加载。init()方法用于设置一次性初始化数据。
106 3
|
Java API
Servlet的环境及实现Servlet的三种方式
Servlet的环境及实现Servlet的三种方式
174 0
|
前端开发 Java 应用服务中间件
带你着手「Servlet」
有了前边文章为我们奠定下的网络基础,我们就可以开始学习Servlet的知识了,在部署一个Java的Servlet程序时,必须要有的开发工具是Tomcat,需要自行完成Tomcat的配置,并掌握maven仓库的配置方法,下边我们也会进行演示,这些具体的流程该如何来进行。
167 0
带你着手「Servlet」

热门文章

最新文章