欢迎大家来到IT世界,在知识的湖畔探索吧!
上一篇讲了用户输入url点击回车后DNS解析及CDN相关内容,这一次继续往下讲,讲一个很重要的内容–SERVLET,先上两张图。
先看图2-2,我们定义了一个TestServlet类,继承了HttpServlet,并在web.xml做了配置,其中<servlet>标签是在项目中声明了类的存在,而<servlet-mapping>则是给外界提供了一个调用这个类的入口。再看图2-1,当我在浏览器输入了http://localhost:8080/sd后,服务端接收到我的请求,根据这个url找到了<url-pattern>为“sd”的servlet,并将请求内容送到了TestServlet中,TestServlet经过各种处理后,将响应信息(可能是html,可能是json数据等)返回给了浏览器。这就是servlet的简要运行过程,当然整个过程不会这么简单,下面我们来详细说一说。
Tomcat开始启动时会将web.xml的各个配置项解析成相应的属性保存在WebXml对象中,然后将这些属性设置到Context容器中,其中包括servlet对象,它会被包装成Context容器中的StandardWrapper,也就是说在Tomcat里面,Context容器直接管理Servlet在容器中的包装类Wrapper,所以Context容器如何运行将直接影响Servlet的工作方式。
Wrapper. loadServlet方法会获取servletClass然后把它交给InstanceManager去创建一个基于servletClass.class的对象,2-2中的是DefaultServlet,如果是jsp就会是JspServlet,这两个配置可以在Tomcat的conf/web.xml里看到。对象创建好后就要开始初始化了,初始化Servlet在StandardWrapper的initServlet方法中,这个方法很简单,就是调用Servlet的init()方法,同时把包装了StandardWrapper对象的StandardWrapperFacade作为ServletConfig传给Servlet,这样Servlet对象就初始化完成了。
那么服务端接收到url请求时,又是怎么找到对应的servlet呢?Tomcat中有这样一个类org.apache.tomcat.util.http.mapper,它保存了Tomcat的Container容器中的所有子容器信息,org.apache.catalina.connector.Request类在进入Container容器之前,Mapper会根据请求的url匹配每个Servlet中配置的<url-pattern>将host和context容器设置到Request的mappingData属性中,所以当Request进入Container容器之前,它要访问哪个子容器就已经确定了。
总结一下,浏览器发送请求到服务端,服务端根据url找到对应的servlet,servlet生成数据后将数据返回给服务端,服务端再将响应数据给浏览器。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/34248.html