servlet是单例,线程安全,
每次请求都是由第一个请求到来后建立的那个servlet招呼,所以servlet里面不能有成员变量;
struts2是通过一个servlet负责招待每个到来的线程,
并为这个线程向action工厂要一个全新的action,并把它们俩放进一个叫Threadlocal的容器中,直到线程断掉,这些东西才被gc这个收垃圾的收走。
所以struts2是多线程的。当然struts2实现上复杂很多,比如负责各种转换的拦截器
可以说Struts2本质还是一个Servlet
(在S1中用于整体控制的是一个Servlet;S2中是一个Filter,其实也可把它看作是Servlet),
只是对Servlet进一步的封装罢了打个比方:
做Web项目,好比建房子。Servlet好比木材,用一根根的木材搭,也可盖起房子,只是速度慢而已;
而Struts2好比是用木材做好的一个房子大概结构,要建房子时,只需把它拿过来,再往其里面添砖加瓦,修修补补,就能很快盖好房子,这要比直接使用Servlet要快得多
比喻可能不是很贴切,但它们的关系差不多是这样的。