Servlet基础知识
Servlet基础知识
主题
概念
Servlet生命周期
Servlet线程安全
JSP与Servlet
参考资料
概念
Servlet通常被称为服务端小程序,是运行在服务器端的程序,用于处理及响应客户端的请求。
Servlet是个特殊的Java类,这个Java类必须继承HttpServlet。每个Servlet可以响应客户端的请求。Servlet提供不同的方法(doGet,doPost,doPut,doDelete)用于响应客户端不同类型的请求。
自MVC规范出现后,Servlet的职责仅仅用于作为控制器使用,不再作为视图层角色使用。
Servlet生命周期
Servlet在容器中运行时,Servlet实例的创建及销毁都不是由程序员决定的,而是由Web容器进行控制的,即Servlet的生命周期是由Web容器负责的。
当启动Servlet容器时,容器首先去查找一个配置文件web.xml,这个文件中记录了核心提供服务的Servlet。每个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一个实例。所以,每个Servlet类必须有一个公共的无参数的构造器。
创建Servlet实例有两个时机:
客户端第一次请求某个Servlet时,容器创建该Servlet的实例;
Web应用启动时立即创建Servlet实例,即load-on-startup Servlet;
每个Servlet的运行都遵循如下生命周期:
创建Servlet实例,由Web容器创建;
Web容器调用Servlet的init方法,对Servlet进行初始化,
Servlet容器初始化后,将一直存在于容器中,用于响应用户请求。根据客户端请求类型调用相应的方法,或者统一调用service方法。service方法是Servlet的核心。
Web容器决定销毁Servlet时,调用Servlet的destroy方法,通常在关闭Web应用的时候销毁Servlet。
Servlet线程安全
Servlet体系结构是建立在Java多线程机制之上的。
当Servlet被某个客户端第一次请求时,Servlet容器将会实例化这个Servlet。当有新的客户端请求该Servlet时,一般不会再实例化这个Servlet,也就是有多个线程在使用这个实例。
Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。
JSP与Servlet
JSP的本质就是Servlet,开发者把编写好的JSP页面部署在Web容器中之后,Web容器会将JSP编译成对应的Servlet。
Servlet和JSP的区别
Servlet没有内置对象,JSP中的内置对象都必须由程序显式创建,是由Web容器创建的,进行默认初始化。
对于静态的HTML标签,Servlet必须使用页面输出流(out对象代表一个JSP页面输出流,通常用于在页面上输出变量值及常量)逐行创建。
Servlet主要用于控制逻辑,JSP侧重于视图。在MVC模式中,Servlet仅作为控制器使用,JSP则作为表现层技术,Model通常由JavaBean充当。
参考资料
http://developer.51cto.com/art/200907/133827.htm
轻量级J2EE企业应用实战