写这文章,实际是在深入学习spring的时候,遇到一个问题,applicationContext一次启动只能创建一次,在web应用中,存在一个ServletContext,生命周期随着web加载而创建,关闭而销毁,并且只存在一个,简直完美。
所以,applicationContext是随着ServletContext一起启动消灭的,并且applicationContext存在ServletContext域中,所以才有这本文。
先总结要点
1.servlet介绍
2.Servlet做一个web项目,Servlet生命周期和方法里面的参数意思
3.Servlet配置
4.标签
5.httpServlet
6.ServletContext对象
part1:【servlet介绍】
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。
servlet规范:包含三个技术点
1.servlet技术
2.filter技术—过滤器
3.listener技术—监听器
part2:【Servlet做一个web项目】
1.在tomcat lib下找到servlet的jar包,导入。
2.新建一个web项目
3.在web.xml里面配置一个servlet
图一
图二
图三
流程大概就是:
访问的时候,请求会发到tomcat服务上,然后tomcat识别出请求路径,封装好requset和response,然后创建servlet对象,调用(ServletRequest req, ServletResponse res)方法。
init(ServletConfig config):cinfig包含了配置的所有信息
(ServletRequest req, ServletResponse res):req包含了请求的所有参数,res包含了响应的参数
【servlet生命周期】
1.初次访问的时候,出生
2.响应客户端请求调用service
3.服务关闭的时候销毁
part3 【Servlet配置-url-pattern】
1.完全匹配,访问资源要和配置资源完全匹配才能访问到。
这个很好理解,如上图二图三所示,在web.xml里面配置的路径是servletDemo,那么访问的时候,http://localhost:8080/Servlet/servletDemo 全匹配上才能访问到ServletDemo这个类下的方法。
2.目录匹配,/虚拟目录/* *代表任意
3.扩张名匹配 *.扩展名
【补充说一个缺省的servlet】org.apache.catalina.servlets.DefaultServlet
当我们在输入test1.txt的时候,在项目web.xml中找不到一个有关test1.txt的匹配,这时候,会去tomcat下,找tomcat的web.xml
这里面配置了一个 / 对应了default这个别名类。如下如图。
DefaultServlet会去/默认的根路径下找一个名为test1.txt的文件。
如果/a,就到根目录下a路径下找一个tese1.txt的文件。
【Servlet配置-】
Servlet默认第一次访问的时候才去创建,当然,我们还可以用load-on-startup标签去设置它的优先级,让它随着项目启动而创建。
注意看左边,启动还没访问,就执行了init方法。
part4【 】
如下图所示,会默认去找web.xml里面配置的index.html,找不到接着找index.htm.
part5 【httpServlet】
在web.xml里面配置好了HttpServlet之后,发起一个请求。
然后去找一个service来处理业务,但是HttpServletDemo里面没有service这个方法啊。
儿子没有这个方法,就去找他爹,他爹没有这个方法,就去找他爷,一级一级往上找。
找的时候,会发现,在HttpServlet里面就有一个public void service(ServletRequest req, ServletResponse res)方法,如图四所示,之后强转过后去找protected void service(HttpServletRequest req, HttpServletResponse resp),如图五,这个方法在从request里面获取此次请求的类型,最后调用的就是doGet方法了。
图四
图五
part6 【ServletContext对象】
ServletContext代表一个web应用的环境对象,内部封装的是web应用的信息,一个web应用只有一个ServletContext.并且随着web的加载而创建,关闭而销毁。
一个web项目只有一个ServletContext,但可以多个servlet.
1.获取web应用全局的初始化参数
getServletContext().getInitParameter(“webName”)
2.获取web应用中任何资源的绝对路径
getServletContext().getRealPath(keyname);
WebContext下的test1.txt会直接加载在图六结构下
WEB-INF下的test2.txt,会加载在WEB-INF下,如图七所示
src里面的test3.txt,会加载在WEB-INF下的classes文件夹下,如图八
图六
图七
图八
3.servletContext是一个域对象。那么是可以往域里面存设置,全局共享的。
存
config.getServletContext().setAttribute(“time”, new Date());
取
getServletContext().getAttribute(“time”)
看最后一张图,getServletContext()底层,其实是config.getServletContext();
1.先访问ServletDemo,执行一次init方法。
2.在访问HttpServletDemo,这样就完成演示,获取到域对象里面的值。