Servlet是97年由sun公司发布的,虽然现在J2EE技术已经发生了很大的变化,但是Servlet等这些核心技术依然在各新技术中展现着他们旺盛的生命力,我们很有必要来详细学习下Servlet,以便于我们更好的理解在其之上发展起来的新技术。
作用:运行在服务端,负责处理、响应客户端的请求。
使用Java Servlet需要导入两个包-
javax.servlet.*:存放于HTTP协议无关的一般性Servlet类;
javax.servlet.http.*:继承javax.servlet.*,增加了与HTTP协议有关的功能。
所有Servlet都必须实现javax.servlet.Servlet接口,通常选择继承javax.servlet.GenericServlet或javax.servlet.http.HttpServlet。具体选择继承哪个类根据自己写的Servlet类是否与HTTP协议相关。得到servlet-api.jar,可以在tomcat安装目录中的lib文件夹下找到,导入项目中即可使用。
优点:可移植-因为是纯java开发的;功能强大-可以调用Java API中大量的功能模块;性能好-利用线程处理请求;安全性好。
生命周期:
1. 加载和实例化:当服务器启动或者客户端发出请求服务时,服务器提供的容器Container会加载和实例化一个Servlet.
2. 初始化:在载入Servlet后需要进行初始化,主要是读取配置信息(如初始化JDBC的连接)、读取一些固定存储的数据。这一过程中主要使用了javax.servlet.Servlet接口中的init(ServletConfig config)方法,init方法获得一个Servlet配置对象ServletConfig,此对象由Servlet容器生成,servlet可以通过此对象获得相关参数。例子如下:
在web.xml中配置如下-
user为参数名,Jack为参数user的值。在HelloServlet的init(ServletConfig config)中可以用config.getInitParameter("user")取得user的值Jack。既然都讲到ServletConfig,我们扩展下,来认识下ServletConfig的其他方法。
public Enumeration getInitParameterNames():返回包含有String的列表对象,包括Servlet的所有初始化参数名。
根据参数名我们可以利用方法getInitParameter(string)获得各参数的初始化值。
public ServletContext getServletContext(),得到ServletContext(Servlet环境对象)。ServletContext作用就很大了,详解见后。
3. 处理请求:我们通常使用的是继承自HttpServlet类的方法doPost(HttpServletRequest,HttpServletResponse)和方法doGet
(HttpServletRequest,HttpServletResponse),以及继承自Servlet接口的方法service(ServletRequest,ServletResponse)来进行
请求的处理和响应。至于HttpServletRequest,HttpServletResponse的方法可参见API,或者参见后续文章。
4. 服务结束:即Servlet被销毁。当容器没有限定一个加载的Servlet能存活多久时,一个Servlet实例可能只在容器中存活几毫秒
或者其他更长的任意时间。一旦servlet的destroy()方法被调用时,servlet将释放所有占有资源并被移除容器。
ServletContext详解:
ServletContext是servlet与servlet容器(Web应用服务器如tomcat提供的servlet运行空间)之间直接通信的接口。servlet容器在启动一个web应用时,会为它创建一个ServletContext对象,即每个应用有且仅有一个自己的ServletContext对象。所有的该Web应用的Servlet都共享一个ServletContext对象,通过它来访问容器中的各种资源。如何使用呢?见下!
a.在Web应用范围内存取共享数据
a.1 public void setAttribute(String name, Object o):在servletContext对象中存放一个java数据对象o,其对应的关键字为name。稍后可以在其他地方利用servletContext的方法getAttribute(String name)获得先前存放的数据对象o。
a.2 getAttributeNames():返回Enumeration对象,包含了存放在ServletContext对象中的属性名。根据属性名可以获得数据对象。removeAttribute(String name):根据属性名,删除servletcontext对象中存放的数据对象。
b.访问当前web应用的资源
b.1 getContextpath():返回当前应用的URL
b.2 getInitParameter(string name):获得web.xml中<context-param>元素设置的初始化参数。getInitParameterNames():返回一
个包含初始化参数的Enumeration对象。
b.3 getServletContextName():返回web应用的名字,即web.xml中<display-name>元素的值。
b.4 public RequestDispatcher getRequestDispatcher(String uripath):获得指定路径下的资源(如servlet,jsp等)对应的
RequestDispatcher对象,它封装由一个特定URL定义的服务器资源,常用的方法是requestDispatcher.forward(ServletRequest,
ServletResponse)来向客户做出响应。
c. 访问servlet容器的相关信息-ServletContext getContext(String url):根据url,返回当前servlet容器中其他web应用的servletContext对象。
d.访问服务器端的文件系统资源
d.1 String getRealPath(String path):根据虚拟路径(相对路径),返回服务器端文件系统中的真实路径。
d.2 InputStream getResourceAsStream(String url):返回Url指定的文件的输入流(把文件转变成输入流)。
e.除了在ServletConfig中用getServletContext()获得ServletContext对象外,还可以利用HttpSession,PageContext,GenericServlet(HttpServlet继承GenericServlet)的getServletContext()方法获得web应用的ServletContext对象。
Servlet接口方法介绍:
1。 public void init(ServletConfig config):在Servlet实例化之后,在进行其他方法之前调用init方法。
2。 public void service(ServletRequest request,ServletResponse response):用此方法来响应请求。
3。 public destroy():销毁servlet,进行垃圾收集,如果servlice()方法没有结束,destroy()方法不能被调用。
Servlet-api下载地址:http://download.csdn.net/source/2727272