设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4335|回复: 0
打印 上一主题 下一主题

[java基础] Servlet运行过程

[复制链接]

29

主题

0

好友

92

积分

注册会员

Rank: 2

性别
保密
跳转到指定楼层
楼主
发表于 2013-6-13 10:30:50 |只看该作者 |倒序浏览
Servlet运行过程
1.Web浏览器-->发出http请求-->Web容器-->首次访问的话创建目标Servlet对象-->Servlet
2.Web容器-->创建请求和响应对象(request和response)-->调用Servlet的service(ServletResquest,ServletRespons)并且将刚才创建的请求对象和响应对象对象传递给Servlet
3.Servlet程序从请求对象中读取请求信息,将响应信息写入到响应对象当中;

4、service方法结束,程序返回到web容器->web容器从相应对象中读取响应信息->将响应星系生成HTTP消息返回给浏览器
    Servlet、Servlet容器(Web容器)与Servlet API关系
Servlet API只是提供了一组类似于HttpServletRequest、HttpServletResponse的接口定义,而没有这些接口的实现类,具体实现是由各个Web容器来完成的;而Servlet本身不需要关注Servlet容器是如何实现这些接口的,也不需要知道Web容器实现这些接口的具体实现类的名字。
虽然Servlet源程序中引用的是Servlet API,但Servlet运行时真正调用的对象是由Servlet容器中的实现类创建的,所以将Servlet API的jar包增加到CLASSPATH环境变量中,只能保证Servlet程序可以被成功编译,但不能让Servlet程序离开Servlet容器运行

Servlet的线程安全问题

    Servlet引擎采用多线程模式运行,它为并发的每个访问请求都使用一个单独的线程来进行响应,但带来了线程安全问题(例如,多个请求同时并发访问同一个Servlet的时候)。
如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用它的service()方法。
signleThreadModel接口中没有定义任何方法,所以我们只需要在Servlet类定义中增加实现SingleThreadModel接口的声明即可。不过,现在已经作废了。

    原理(为什么弃用):对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。这样同时有多个Servlet实例对象在运行,不会出现多个请求同时调用一个Servlet对象;而多个Servlet实例对象共同组成了一个Servlet对象池,当Web容器接收到针对某个Servlet的请求时,就从对象池中挑选一个空闲的实例对象进行响应。由此可见,实现了SingleThreadModel接口的Servlet并不能真正解决线程安全的问题。因为Servlet引擎会创建多个Servlet实例对象,多个并发的请求分别由不同的Servlet实例对象进行处理或者单个Servlet对象逐个依次排队处理,而真正意义上的多线程安全问题是指一个Servlet对象被多个线程同时调用时的问题。
      
推荐方法:涉及到多个并发的service()方法调用Servlet有线程安全问题的,最好在service方法中编写多线程同步控制代码,而不要采用实现了SingleThreadModel接口的单线程运行模式。

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分
您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-4-30 14:37 , Processed in 0.112441 second(s), 28 queries .

回顶部