Skip to content

Java Web 应用程序中处理 HTTP 请求和生成 HTTP 响应的组件

Servlet 是JavaEE 规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

Maven项目 —— 设置使用范围为provided(编译和测试环境有效,运行环境无效)因为tomcat中含有servlet-api

xml
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

IDEA输出中文乱码的话再设置tomcat里面的VM options一栏中输入:-Dfile.encoding=UTF-8

webapps规范

  1. 在服务器wabapps目录下创建web应用程序目录--项目名称,是项目的根目录
  2. 在web应用程序目录下创建WEB-INF目录--web应用程序的配置目录
  3. 在WEB-INF目录下创建web.xml文件--web应用程序的配置文件(配置文件是用于描述请求路径和Servlet类之间的对照关系)
  4. 在WEB-INF目录下创建classes目录--web应用程序的类文件目录
  5. 在classes目录下放Servlet类的字节码文件
  6. 在WEB-INF目录下创建lib目录--web应用程序的依赖库目录

web.xml

配置首页

xml
<welcome-file-list>
    <welcome-file>/xxx.xx</welcome-file>
    <welcome-file>/xx.xxx</welcome-file>
</welcome-file-list>

可以配置多个页面,第一个页面找不到的话从上往下找第二个页面

配置Error错误显示

xml
<error-page>
    <error-code>错误码</error-code>
    <location>资源路径</location>
</error-page>

这个是配置错误的页面跳转,如:404错误,跳转到下面的资源文件

配置注册和映射

xml
<!-- 注册Servlet -->
<servlet>
    <servlet-name>名字(一般为映射的类名)</servlet-name>
    <servlet-class>类所在位置</servlet-class>
    <!-- 以下内容可选 -->
    <load-on-startup>优先级</load-on-startup>
    <init-param>
        <param-name>初始化参数的名称</param-name>
        <param-value>初始化参数的值</param-value>
    </init-param>
    <!-- 以上内容可选 -->
</servlet>
<!-- 注册映射关系 -->
<servlet-mapping>
    <servlet-name>类名(跟注册的Servlet一个名称)</servlet-name>
    <url-pattern>访问路径(/hello)</url-pattern>
</servlet-mapping>

优先级:为负数时在第一次访问时加载该类并创建实例化对象,为0或整数时将在服务器开启后加载该类并创建实例化对象, 值越小优先级越高

初始化:参数可以在init方法里面使用 servletConfig.getInitParameter("参数名") 获取值

这个可以让Tomcat知道请求路径和Servlet类之间的对照关系,一个Servlet可以有多个访问路径,但是一个访问路径只能对应一个Servlet

浏览器访问对应的地址的对应端口的项目名称的对应路径时,Tomcat可以通过url-pattern找到对应的Servlet类,然后创建Servlet类的实例对象,最后调用Servlet类的service()方法处理请求

实现Servlet接口

包路径:javax.servlet.Servlet

方法简介

init(ServletConfig config):初始化方法,Servlet对象创建时执行,只执行一次

service(ServletRequest req, ServletResponse res):服务方法,每次请求时执行,执行多次

destroy():销毁方法,Servlet对象销毁时执行,只执行一次

getServletConfig():获取ServletConfig对象

getServletInfo():获取Servlet信息

执行过程

操作结果
第1次访问调用了init方法、service 方法和构造方法
第2···N次访问调用了service 方法
关闭服务器调用了destroy 方法

ServletConfig接口

ServletConfig对象由Tomcat创建并传递给Servlet对象

包路径:javax.servlet.ServletConfig

方法简介

getServletName():获取Servlet的名称 —— web.xml中<servlet-name>标签的内容

getInitParameter(String name):获取初始化参数 —— web.xml中<servlet>标签下的<init-param>标签的内容

getInitParameterNames():获取所有初始化参数的名称 —— web.xml中<servlet>标签下的所有<init-param>标签的内容

ServletContext接口

在web应用程序启动时创建ServletContext对象,每个web应用程序只有一个ServletContext对象,所有Servlet对象共享同一个ServletContext对象 它存储web.xml中的所有信息

getInitParameter(String name):获取初始化参数 —— web.xml中<context-param>标签的内容

getInitParameterNames():获取所有初始化参数的名称 —— web.xml中所有<context-param>标签的内容

getRealPath(String path):获取web应用程序中的资源在服务器上的绝对路径 —— web应用程序目录下的资源路径

getMimeType(String file):获取文件的mime类型 —— 文件后缀名

getResourceAsStream(String path):获取资源对应的输入流 —— web应用程序目录下的资源路径

getAttribute(String name):根据名称获取域中保存的对象

setAttribute(String name,Object obj):将对象保存到域中

removeAttribute(String name):从域中删除对象

GenericServlet类

实现了Servlet接口,实现了init()和destroy()方法,service()方法是抽象方法,需要子类重写

方法用途
log日志对象
configServletConfig对象
contextServletContext对象

@WebServlet()注解

属性

用途
valueServlet的访问路径
urlPatternsServlet的访问路径
nameServlet的名称
asyncSupported是否支持异步请求
loadOnStartup优先级
initParams初始化参数
descriptionServlet的描述信息

路径

名称格式
精确匹配("/t")
目录匹配("/t/*")
扩展名匹配("*.扩展名")
任意匹配("/"),("/*") 使用("/")后会覆盖Tomcat中默认的DefaultServlet类(默认服务)

HttpServlet类

继承自GenericServlet类,主要用于处理请求

一般只重写doPostdoGet这种常用方法

Servlet的实现方式

方式一:实现Servlet接口

方式二:继承GenericServlet抽象类

方式三:继承HttpServlet类 (常用)

域对象

作用:在不同的Servlet中共享数据

域对象的分类:

  1. request:代表一次请求,只能在一次请求中共享数据
  2. session:代表一次会话,只能在一次会话中共享数据
  3. application:代表整个web应用程序,只能在整个web应用程序中共享数据

范围大小:request < session < application

Session

作用:存储用户信息

特点:服务器端的存储技术,将用户信息存储在服务器端

获取&使用

获取 session 对象: request.getSession()

常用方法

方法名说明
session.setAttribute("键",值)设置session的键值对
session.getAttribute("键")获取session中的值
session.removeAttribute("键")删除session中的键值对
session.invalidate()销毁session对象

原理

  1. 当第一次调用request.getSession()方法时,服务器会创建一个session对象
  2. 服务器会将session对象的JSESSIONID使用Cookie技术存储到浏览器中
  3. 当浏览器再次访问服务器时,会将Cookie中的JSESSIONID发送给服务器
  4. 服务器会根据JSESSIONID找到对应的session对象
  5. 如果服务器没有找到对应的session对象,会创建一个新的session对象
  6. 如果服务器找到了对应的session对象,会使用该session对象
  7. 如果客户端禁用了Cookie,则无法正常使用session对象

注意

  • 服务器关闭后,session对象销毁
  • 客户端关闭后,session对象销毁
  • 默认session对象的存储时间为30分钟
  • 可以通过配置文件修改session对象的存储时间
xml
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

生命周期

  1. 加载:Tomcat通过反射加载到对应的类

  2. 实例化:通过加载到的Class对象获取到一个(公共的无参的!!!)Constructor 对象然后调用newInstance()方法创建实例

    可以使用@WebServlet注解中的loadOnStartup属性 设置加载和实例化的优先级

    • 为负数时在第一次访问时加载该类并创建实例化对象
    • 为0或整数时将在服务器开启后加载该类并创建实例化对象
    • (loadOnStartup属性越小优先级越高)
  3. 初始化:在servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次

  4. 请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理

    常用请求:get/post

    • get:GET 请求对数据量有限制,通常用于请求数据,而不是发送敏感信息
    • post:不会暴露在 URL 上,POST 请求没有数据量限制
  5. 服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个servlet实例,该实例随后会被Java的垃圾收集器所回收