1. JSP和Servlet
- JSP = HTML + Java(HTML代码里嵌有Java代码)
- Servlet = Java + HTML(Java代码里写html代码/标签,如
out.write("<HTML>")
) - JSP的特点在于视图,Servlet的特点在于实现控制逻辑;最原始的Servlet要返回视图的话,需要写大量
out.write("<HTML>")
…非常不方便 - JSP本质就是一个Servlet,做的工作就是把JSP里的html + Java代码翻译回原始的形式
- JSP的工作原理:JSP -> 翻译 -> Servlet(Java) -> 编译 -> Class (最终执行的文件)
2. Servlet生命周期
- Servlet是单例模式(单实例),可以被很多客户端访问。这个单利是由web容器产生,比如Tomcat,JBOSS,weblogic等
- 生命周期的流程:创建对象–>初始化–>
service()
–>doXXX()
–>销毁 - 创建对象的时机分为两种:
-
- 默认是第一次访问该Servlet的时候创建
-
- 也可以通过配置web.xml,来改变创建时机,比如
DispatcherServlet
(SpringMVC前端控制器)就是一个例子,DispatcherServlet
不可以是谁来访问他,他才创建,应该在容器启动的时候就去创建,所以应当在web.xml中配置他:<load-on-startup>1</load-on-startup>
。
- 也可以通过配置web.xml,来改变创建时机,比如
- 执行的次数:对象的创建只有一次,单例;初始化一次;销毁一次;中间的
service()
会有多次
3. Servlet内部的service()
根据是什么方法(GET、POST)来作判断并调用具体的方法和业务
4. Servlet的线程安全问题
- Servlet不是线程安全的
- 构成线程不安全三个因素:
-
- 多线程的环境(有多个客户端,同时访问Servlet)
-
- 多个线程共享资源,比如一个单例对象(Servlet是单例的)
-
- 这个单例对象是有状态的(比如在Servlet方法中采用全局变量,并且以该变量的运算结果作为下一步操作的判断依据)
- 由于Servlet在Tomcat中是以单例模式存在的,所有的线程共享实例变量。多个线程对共享资源的访问就造成了线程不安全问题。
- 解决办法:在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的
参考: