在典型的J2EE中,我们的应用是通过应用服务器(如TOMCAT、JBOSS、WEBLOGIC等)来加载启动的。如果我们需要在JSP之外做些额外的操作,这些操作并不依赖客户端的请求而执行,那么,我们就需要一个途径来告知服务器,如何来实现自己的操作。而我们程序内部与WEB服务器之间交互信息的途径就是web.xml里面的配置。在这里面,提供了三个接口配置来实现我们自己的需要。这三个接口是:servlet、filter、listener。
前面的jsp所生成的java代码中我们已经看到了servlet的一个子类的结构。给我们的最直观的感觉是,所有的html都需要用out.write()或out.print()来输出,正是因为这个原因,才使得jsp大为流行,因为对于jsp来说,java编码人员和界面设计人员(美工)都可以很容易的修改。但jsp编程并不会取代servlet编程。我们可以定义一个servlet并使其在web应用启动后开始启动,这是jsp所做不到的,jsp只能在客户端发送请求后才能启动。
一个典型的servlet,包含以下方法:
void init(ServletConfig config) : 初始化servlet,根据ServletConfig传入的配置参数,来初始化相关信息。在servlet容器启动该servlet时执行,在一个servlet的生命周期内,这个方法只会执行一次;
void destroy() : 销毁servlet,释放servlet所占用的资源,如数据库链接等。在servlet容器停止该servlet时执行,在一个servlet的生命周期内,这个方法只会执行一次。
void service(ServletRequest req, ServletResponse res):处理请求并作出响应。当servlet容器指示改servlet对请求作出应答时,改方法被执行,在一个servlet的生命周期内,这个方法可以执行多次。
String getServletInfo(): 返回该servlet的说明信息,如作者,版本等,当然,也可以声明都不做。
ServletConfig getServletConfig(): 返回该servlet的配置信息。一般可以直接返回init时传入的config信息。
典型的servlet用在初始化信息、启动后台线程、执行特定请求(不需要html页面的返回信息,如输出验证码、AJAX服务端等)场合。
下面这个例子将数据库链接信息配置到web.xml中,并由servlet读取配置。
配置信息:
<servlet> <description>init system parameters</description> <servlet-class>com.hx.servlet.SystemInitServlet</servlet-class> <init-param> <param-name>DRIVER_CLASS</param-name> <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value> </init-param> <init-param> <param-name>CONN_URL</param-name> <param-value>jdbc:odbc:hxdb</param-value> </init-param> <init-param> <param-name>CONN_USERNAME</param-name> <param-value>sa</param-value> </init-param> <init-param> <param-name>CONN_PASSWORD</param-name> <param-value>sa</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
SystemInitServlet类中读取这些信息:
package com.hx.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
*/
public class SystemInitServlet implements Servlet {
private ServletConfig config;
private static String DRIVER_CLASS;
private static String CONN_URL;
private static String CONN_USERNAME;
private static String CONN_PASSWORD;
/* (non-Javadoc)
* @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
*/
public void init(ServletConfig servletConfig) throws ServletException {
config = servletConfig;
DRIVER_CLASS = servletConfig.getInitParameter("DRIVER_CLASS");
CONN_URL = servletConfig.getInitParameter("CONN_URL");
CONN_USERNAME = servletConfig.getInitParameter("CONN_USERNAME");
CONN_PASSWORD = servletConfig.getInitParameter("CONN_PASSWORD");
System.out.println("system init servlet processed successfully.DRIVER_CLASS=" + DRIVER_CLASS + ",CONN_URL=" + CONN_URL + ",CONN_USERNAME=" + CONN_USERNAME + ",CONN_PASSWORD=" + CONN_PASSWORD);
}
/**
*/
public static String getDriverClass() {
return DRIVER_CLASS;
}
/**
* @return
*/
public static String getConnectionURL() {
return CONN_URL;
}
/**
* @return
*/
public static String getConnectionUsername() {
return CONN_USERNAME;
}
/**
* @return
*/
public static String getConnectionPassword() {
return CONN_PASSWORD;
}
/* (non-Javadoc)
* @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
}
/* (non-Javadoc)
* @see javax.servlet.Servlet#destroy()
*/
public void destroy() {
}
/* (non-Javadoc)
* @see javax.servlet.Servlet#getServletConfig()
*/
public ServletConfig getServletConfig() {
return config;
}
/* (non-Javadoc)
* @see javax.servlet.Servlet#getServletInfo()
*/
public String getServletInfo() {
return null;
}
}