日期:2014-05-18  浏览次数:20710 次

j2ee中,servlet被首次加载,生成对象后,一次连接完成,对象是否被清除;第二次请求,又是个什么情况,请高手说说它的运作机理
最好基于多线程的角度来考虑

谢谢了

------解决方案--------------------

这个问题很有意义!

他将牵扯到Servlet的编程模型以及 Servlet 的内在运行机制 !
对于对 servlet 的底层认识很是有必要 !

首先 Tomcat 服务器启动时 容器加载 Servlet 实例
同时 调用初始化方法 into(); 

然后 Servlet 等待服务, 当客户端发送一个请求时
调用实例的服务方法 Serice();(方法本身进行判断是Post请求呢 还是请求Get请求,然后调用相关方法。 如doPost() )

直到服务器关闭,然后调用系统的垃圾回收机制方法 destroy();

进行销毁, 整个过程是一种基于 " 一次实例 ,多次服务 " 的。

愿我对于 Servlet 的底层以及 原理性的运行机制对于你 对于Servlet的认识有一个更加深入的理解 !
谢谢.....
------解决方案--------------------
对我2楼的贴子发表更正.
Servlet如3楼所说,servlet一般只会有一个实例,每次交互并不会消除.servlet是作为一个媒介,而内容责是request和response

------解决方案--------------------
1. 这可否理解为你说的:每个servlet都是一个线程
你的理解与我的有些偏差,servlet不是web服务器生成的,web服务器是根据请求中的URL中找到正确Servlet,web服务器为其创建或者分配一个线程,同时把2创建的两个对象(request,response)传递给该线程.
2. 他把request和response对象分别发送到服务端和客户端
request,response是在服务器端生成的,web服务器主线程对用户的请求做出响应创建两个对象:HttpServletRequest和HttpServletResponse;
3.servlet把request和response发送到服务端和客户端后被清除
这点我也不是很清楚,不过上网查了下,servlet对象在执行交互后是会调用destory()方法然后被清楚的,也就是一次请求发送后,当servlet 的service 方法内的所有线程都退出的时候,servlet对象被消除.
------解决方案--------------------
同意3楼的大部分看法,不过对destroy()方法执行的时间保留意见。
请参看http://topic.csdn.net/u/20081017/15/26842176-f322-4a8d-9b93-eb8ff0ed9c2b.html
------解决方案--------------------
好贴

我和11楼的朋友站在同一战壕

呵呵


等待高人继续指点啊

其实很多东西都是这样,我觉得自己很明白了

但是一较真,就又糊涂了

很好的帖子啊

留名
------解决方案--------------------
探讨
引用:
< <jsp网络编程>> 上有一句话,
”web容器只会构建唯一一个Servlet对象,但所有的处理对都由它完成“

我的理解,Servlet中的request,response包含当前线程的锁,在多线程的情况下,Servlet虽然是同一个对象,可是request和response不是,他们分别拥有各自线程的锁,所以当多个线程对Servlet进行调用的时候,request和response是分别对应的当前线程的锁,这样就不会导致线程1可以访…

------解决方案--------------------
请参考我们教程中的相关内容
http://family168.com/tutorial/jsp/html/jsp-ch-14.html
------解决方案--------------------
servlet是首次加载后,生成了相关对象保存在web容器中,该对象是灌注整个web容器的始终,直到web容器关闭。可以参考servlet的生命周期,该对象被实例化后保存在web容器中,当有请求时web容器先截获,然后web容器开启一条线程去servlet的map集合里根据request报头寻找相关的servlet处理请求,该线程是一直处理该request,直到处理结束,响应请求。该线程结束,但是servlet对象是不会被销毁的,他还是保留在web容器中。多个请求同一servlet时就是开启多条线程响应请求。
------解决方案--------------------
真的没有人了解JAVA线程池吗?

servlet在线程池中只起着Callbale的作用。
 一次请求进来首先被转换成RequestTask对象放在请求对列中。
只有处理线程从队列中get这个RequestTask并调用它的业务方法时,才会调用对应的servlet的服务方法。

在同一时刻,一个servlet只有一个实例(2.4以前可以有多少实例来实现单线程安全的servlet),但在容器生命
周期内,不是只有一个实例。因为容器可以根据需要对长时间没有被请求的servlet实例销毁,在必要的时候再生成。

client request-> listener->put RequestTask(ServletHandler) into Queue

WorkThread -> take RequestTask ->wrap Request/Response -> invoke Callbale(service method).