昨晚我在群里问了个问题,没人回答,也许是我过于执着,仍是要说一说!对我我的而言也是一种学习态度,课上讲的专业术语,老师不讲,本身也要搞明白,这倒底是什么,任何老师都会在课上讲,上下文对象,资源路径等等!web
答案是:上下文 /day3 资源名 /hello浏览器
这个就要从发布项目提及,咱们在eclipse中将项目同步或发布到tomcat发生了什么?好下图的操做,倒底给tomcat带去什么样的变化!缓存
能够说每发布一个项目,都会生成一个上下文配置,咱们能够试一个发布一个项目,而后到tomcat 下的conf中找到server.xml,打开看一下,会有相似这样的节点产生:tomcat
<Context docBase="D:\JavaApps\Servlet\webapp" path="day3"/> <Context docBase="D:\JavaApps\Servlet\webapp1" path="day4"/>
每一行表明一个项目!其中docBase表示真实项目路径 path表明上下文也就是访问的根路径!app
知道了上面这个问题,咱们就能够知道tomcat如何解析了!eclipse
一、浏览器先发送请求:http://localhost:80/day3/hellowebapp
二、DNS解析域名post
三、Tomcat解析请求:/day3/hello 获得上下文 /day3 资源名 /hello学习
四、解析Tomcat根/conf/server.xml文件,获取其中全部的上下文元素,并找到path属性为/day3的元素,再读取该元素,再获取docBase属性值,该属性值就是当前访问的WEB项目的根路径url
五、从该web的根路径/WEB-INF下找到web.xml文件
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.gwd.aa.He</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
六、读取web.xml文件,获取全部的
七、经过/hello,找到当前Servlet的全限定名com.gwd.aa.He
八、从Servlet的实例缓冲池中去获取com.gwd.aa.He对应的对象.(这就是为何init只执行一次的缘由)
Map<String,Servlet> cache = .....; Servlet obj = cache.get("com.gwd.aa.He"); if(obj == null{ //第一次请求:GOTO 9. }else{ //非第一次请求:GOTO 12;
九、使用反射建立Servlet对象.
Servlet obj = Class.forName("com.gwd.aa.He").newInstance();
十、把建立的Servlet对象,存储到Servlet实例缓存池中,供下一次请求使用.
cache.put("com.gwd.aa.He",obj);
十一、容器建立ServletConfig对象,并调用init方法,来完成初始化操做.
obj.init(config);
十二、容器建立ServletRequest和ServletResponse对象,并调用service方法,处理请求.
obj.service(req,resp);
1三、在service方法中,对当前请求的客户端作相应.
作doget和dopost处理(底程是个模板方法),这个能够本身写个模板方法体验一下!
前者当前项目有效,后者对当前servlet有效,拿xml初始参数来讲ServletConfig只能获取当前Servlet的参数,而Servletcontext获取的是整个项目共有的设置,咱们开发中通常用Servletcontext,由于ServletConfig太麻烦,每个url都要单独配!
今日能够扩展的(模板方法 ServletConfig经常使用方法 Servletcontext经常使用方法 servlet继承体系 )