什么是上下文?什么是资源名,请求流程是怎么样的?

什么是上下文?什么是资源名,请求流程是怎么样的?

昨晚我在群里问了个问题,没人回答,也许是我过于执着,还是要说一说!对我个人而言也是一种学习态度,课上讲的专业术语,老师不讲,自己也要搞明白,这倒底是什么,任何老师都会在课上讲,上下文对象,资源路径等等!

那么,http://localhost:80/day3/hello 这个路径哪个是上下文,哪个是资源名称?

答案是:上下文 /day3 资源名 /hello

第2个问题,如何通过上下文和资源名找到对应的servlet?

这个就要从发布项目说起,我们在eclipse中将项目同步或发布到tomcat发生了什么?好下图的操作,倒底给tomcat带去什么样的变化!

可以说每发布一个项目,都会生成一个上下文配置,我们可以试一个发布一个项目,然后到tomcat 下的conf中找到server.xml,打开看一下,会有类似这样的节点产生:

<Context docBase="D:\JavaApps\Servlet\webapp" path="day3"/>
<Context docBase="D:\JavaApps\Servlet\webapp1" path="day4"/>

每一行代表一个项目!其中docBase表示真实项目路径 path代表上下文也就是访问的根路径!

知道了上面这个问题,我们就可以知道tomcat如何解析了!

tomcat 解析流程:

1、浏览器先发送请求:http://localhost:80/day3/hello

2、DNS解析域名

3、Tomcat解析请求:/day3/hello 得到上下文 /day3 资源名 /hello

4、解析Tomcat根/conf/server.xml文件,获取其中所有的上下文元素,并找到path属性为/day3的元素,再读取该元素,再获取docBase属性值,该属性值就是当前访问的WEB项目的根路径

5、从该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>

6、读取web.xml文件,获取所有的

7、通过/hello,找到当前Servlet的全限定名com.gwd.aa.He

8、从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;

9、使用反射创建Servlet对象.

  Servlet obj = Class.forName("com.gwd.aa.He").newInstance();

10、把创建的Servlet对象,存储到Servlet实例缓存池中,供下一次请求使用.

    cache.put("com.gwd.aa.He",obj);

11、容器创建ServletConfig对象,并调用init方法,来完成初始化操作.

   obj.init(config);

12、容器创建ServletRequest和ServletResponse对象,并调用service方法,处理请求.

   obj.service(req,resp);

13、在service方法中,对当前请求的客户端做相应.

做doget和dopost处理(底程是个模板方法),这个可以自己写个模板方法体验一下!

Servletcontext对象和ServletConfig对象的区别

前者当前项目有效,后者对当前servlet有效,拿xml初始参数来说ServletConfig只能获取当前Servlet的参数,而Servletcontext获取的是整个项目共有的设置,我们开发中一般用Servletcontext,因为ServletConfig太麻烦,每一个url都要单独配!

今日可以扩展的(模板方法 ServletConfig常用方法 Servletcontext常用方法 servlet继承体系 )

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值