码迷,mamicode.com
首页 > 其他好文 > 详细

Servlet学习(2)

时间:2014-07-26 15:01:20      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:servlet   线程安全   

1.Servlet的生命的周

  (1)当浏览器第一次访问Servlet时,服务器会根据浏览器访问的路径,在web.xml文件中找到该Servlet的全路径,然后利用反射去调用方法。
  (2)调用init()为Servlet作初始化工作
  (3)调用doXxxxx()为浏览器响应
  (4)如果浏览器再次访问相同的Servlet,直实现从服务端维护的Servlet实例集合中取得对应的实现,为浏览器响应
  (5)同一个Servlet实例,在服务端只有一个
  (6)服务器在决定销毁Servlet实例之前,调用destory()方法,每个Servlet实例只会调用一次,通常子关闭Web应用之时销毁Servlet。

2.Servlet的一些细节

(1).浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头
  2)一个Servlet的url-pattern可以是1个或多个,有二种形式;
a)*.xx
        b)/xx/*
        注意:/*不能一起直接使用
  3)/*和*.do的优先级高

例如:

  对于如下的一些映射关系:
Servlet1 映射到 /abc/* 
Servlet2 映射到 /* 
Servlet3 映射到 /abc 
Servlet4 映射到 *.do 
问题:
1>当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
2>当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
3>当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
4>当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
5>当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
  4)程序员编写的Servlet其实是由tomcat容器中的Servlet引擎来处理的,引擎会产生对应的HttpServletRequest和 HttpServletResponse对应传入到Servlet的doXxxx()方法中
  5)通过在web.xml文件中配置代码,让Servlet在部署时就创建
    <servlet>
      <servlet-name>Demo</servlet-name>
      <servlet-class>cn.wwh.www.web.servlet.Demo</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  数字小的先加载,数据大的后加载,最小为0,如果为负数和没有设置一样,需要在浏览器第一次访问时创建 
  6)url-pattern为/的servlet是一个缺省的servlet,用于处理当前web应用下,访问路径错误的请求任何web服务端都有一个缺省的servlet来处理
  7)每个线程会共享同一个Servlet的实例变量,所以要对敏感数据加锁
    产生线程安全条件如下:
1>单例
2>实例变量
        3>实例变量进行修改操作

以上三个条件必须同时具体,才能出现线程安全问题。
    通过加锁的方式,对敏感数据块进行代码同步(这种方式能彻底解决线程安全问题) 
    如果你实现SingleThreadModel来解决线程安全有二个不足之处:

a)SingleThreadModel接口的值与web服务器最多接收的线程数有关,可能会出现大值变小值的情况
b)SingleThreadModel接口如果发现某个线程正在占用该Servlet实例,会自动创建一个新的Servlet实例为浏览器服务,
  这就违背了Servlet单例的原则

在J2EE关于SingleThreadModel中的API解释:

公用接口 SingleThreadModel

确保 servlet一次只处理一个请求。该接口没有方法.

如果一个servlet实现了其接口,你应保证 不会有两个线程将会在其 servlet的service 方法里同时执行.servlet容器能够保证这一点, 通过同步到该servlet单一实例的访问 ,或通过保持有一个servlet实例的池子,并把每一个新的请求分配给一个空闲的servlet 。

如果一个servlet实现了其接口,那么这个servlet将是线程安全的。但是,该接口不会防止 由于servlet访问譬如静态类变量或servlet范围之外的类这样的共享资源而导致的同步问题。 

Servlet学习(2),布布扣,bubuko.com

Servlet学习(2)

标签:servlet   线程安全   

原文地址:http://blog.csdn.net/u011662320/article/details/38143463

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!