- servlet主要数据结构
Servlet 接口:主要定义了servlet的生命周期方法
ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法。
ServletContext接口:是Servlet的上下文对象,这个对象是在服务器启动时创建的,为servlet提供了使用容器服务的若干重要方法。
GenericServlet抽象类:为servlet提供了一般的实现(包括实现了servlet和ServletConfig两个接口),保存了容器通过init方法传递给servlet的一个ServletConfig类型的重要对象。
HttpServlet抽象类:为处理http请求的servlet提供了一般实现,主要是定义和实现了若干service方法。
- servlet继承关系
在整个Servlet程序中最重要的就是Servlet接口了,在此接口下定义了一个GenericServlet的子类,但是一般都不会直接继承此类,而是根据所使用的协议选择GenericServlet的子类继承。一般的,我们都采用HTTP协议处理,所以一般而言当需要使用HTTP协议操作时我们自定义的Servlet都要继承HttpServlet类。具体的继承关系如下:
Servlet-->GenericServlet-->HttpServlet-->我们自己的Servlet。
OK,现在来看一下Servlet接口:
- 定义
public interface Servlet
这个接口定义了一个 Servlet:一个在 Web 服务器上继承了这个功能的 Java 类。
- 方法
1、init
public void init(ServletConfig config) throws ServletException;
Servlet 引擎会在 Servlet 实例化之后, 置入服务之前精确地调用 init 方法。 在调用 service方法之前,init 方法必须成功退出。如果 init 方法抛出一个 ServletException,你不能将这个 Servlet 置入服务中,如果 init方法在超时范围内没完成,我们也可以假定这个 Servlet 是不具备功能的,也不能置入服务中。
2、service
public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException;
Servlet 引擎调用这个方法以允许 Servlet 响应请求。这个方法在 Servlet 未成功初始化之前无法调用。在 Servlet 被初始化之前,Servlet 引擎能够封锁未决的请求。在一个 Servlet 对象被卸载后,直到一个新的 Servelt 被初始化,Servlet 引擎不能调用这个方法
3、destroy
public void destroy();
当一个 Servlet 被从服务中去除时,Servlet 引擎调用这个方法。在这个对象的 service 方法所有线程未全部退出或者没被引擎认为发生超时操作时,destroy 方法不能被调用。
4、getServletConfig
public ServletConfig getServletConfig();
返回一个 ServletConfig 对象,作为一个 Servlet 的开发者,你应该通过 init 方法存储ServletConfig 对象以便这个方法能返回这个对象。为了你的便利,GenericServlet 在执行这个接口时,已经这样做了。
5、getServletInfo
public String getServletInfo();
允许 Servlet 向主机的 Servlet 运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如 HTML,XML 等) 。
package linkin; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class LinkinServlet implements Servlet { public void destroy() { System.out.println("销毁的方法被调用。。。"); } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } public void init(ServletConfig arg0) throws ServletException { System.out.println("初始化方法被调用。。。"); } public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { //1.编写输出语句,证明当前方法被调用 System.out.println("处理请求,返回响应。。。"); //2.通过PrintWriter对象向浏览器端发送响应信息 PrintWriter writer = arg1.getWriter(); writer.write("成功跳转。。。"); writer.close(); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>LinkinServlet</servlet-name> <!-- 注册Servlet实现类的全类名 --> <servlet-class>linkin.LinkinServlet</servlet-class> </servlet> <!-- 建立一个从虚拟路径到Servlet组件之间的映射关系 --> <servlet-mapping> <!-- 引用Servlet组件名称 --> <servlet-name>LinkinServlet</servlet-name> <!-- 映射到Servlet的虚拟路径:“/LinkinServlet” --> <url-pattern>/LinkinServlet</url-pattern> </servlet-mapping> </web-app>