Servlet简介:
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
Servlet对请求的处理和响应过程:
- 接受HTTP请求
- 取得请求信息,包括请求头和请求参数数据
- 调用其它Java类方法,完成相应的业务功能
- 实现其他Web组件的跳转(包括重定向和请求转发)
- 生成HTTP响应(包括HTML响应和非HTML响应)
生命周期详解:
Servlet生命周期:
Servlet生命周期可以分为四个阶段:加载和实例化、初始化、处理请求、销毁。
在这期间又会经历创建、初始化、服务可用、服务不可用、处理请求、终止状态、销毁七种状态
加载和实例化:
Servlet的创建是指加载和实例化两个过程;Servlet容器在以下时刻加载和实例化一个Servlet
- 在服务器中,客户机首次向Servlet发送请求时
- 重新装入Servlet时,如:服务器重新启动、Servlet被修改
- 在为Servlet配置了自动装入项(load-on-startup)时,服务器会在启动时自动装入此Servlet
初始化:
- Servlet实例化后,容器会调用Servlet的init(ServletConfig config)方法来对Servlet实例进行初始化,ServletConfig对象是Web容器完成web.xml文件配置读取并读取其中配置的初始化参数之后封装成的对象
- 如果初始化没有问题,Servlet容器会处于服务可用状态;如果初始化失败,Servlet容器会从运行环境中清除此实例
- 当Servlet运行出现异常时,Servlet容器会使该实例变为不可用状态。Web程序维护人员可以设置Servlet,使其称为服务不可用状态,也可以从服务不可用状态恢复为服务可用
处理请求:
- 服务器收到客户端请求后,会为该请求创建一个request(请求)对象和response(响应)对象并调用service()方法,service()方法在调用其他方法来处理请求
- Servlet生命周期中,service()方法可能会被多次调用。每当多个用户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器响应速度
销毁:
当Servlet容器需要终止Servlet(比如Web服务器关闭或者需要出让资源),它会先调用Servlet的destroy()方法,使其释放正在占用的资源;但是在调用destroy()方法之前,必须所有正在其service()方法的线程完成,或者超过了服务器定义的时间限制。在destroy()方法完成释放之后,Servlet容器必须释放该实例以便其能被垃圾回收器回收。
我们可以用一个实例来看下四种状态是如何经历的:
java实现类
/**
*
*/
package com.cgl.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
public MyServlet(){ //加载
System.out.println("...MyServlet()...");
}
@Override //初始化方法
public void init(ServletConfig config) throws ServletException {
System.out.println("...init()...");
}
@Override //服务方法,通常在该方法中执行具体请求处理
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("...service()...");
}
@Override //销毁
public void destroy() {
System.out.println("...destroy()...");
}
}
在web.xml中配置servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>servletWork</display-name> //项目加载之后的名称
<servlet>
<servlet-name>myservlet</servlet-name> //定义servlet名称
<servlet-class>com.cgl.servlet.MyServlet</servlet-class> //配置该servlet的执行类
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name> //配置url匹配后执行的servlet
<url-pattern>/myServlet</url-pattern> //也可以用通配符
</servlet-mapping>
</web-app>
除了在web.xml配置文件中配置,在Servlet3.0以后增加了支持注解的功能,也可以在类名的上面直接添加@WebServlet注解标识,如
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet{
运行项目,在浏览器中输入:http://localhost:8080/servletWork/myServlet
控制台输出:
...MyServlet()...
...init()...
...service()...
在输出中可以看出执行的生命周期,在servlet加载和实例化的时候执行构造方法打印出了MyServlet,初始化的时候执行init()方法打印出init(),然后执行service()方法,构造方法和初始化在项目没有重新启动或更新的情况下只会执行一次,而destroy()方法在servlet销毁时打印,在我们修改项目或关闭时会执行,修改项目因为会重新加载,所以会把原先的关闭。
Servlet2.5常见配置:通常用<XXX属性名> 值</>的格式
列1 | 列2 |
属性名 | 属性描述 |
display-name | 用来标记这个特定的Web应用的一个名称 |
description | 给出该Servlet的描述信息 |
servlet-name | 指定Servlet的名字,注解默认与Servlet的类名相同 |
servlet-class | 指定该Servlet所在Java文件路径 |
url-pattern | 描述相对与Web应用的匹配URL,该元素的值必须以/开始 |
init-param | 向servlet提供初始化参数 |
param-value | 参数值 |
param-name | 参数名称 |