JavaWeb——Servlet的使用

本文详细介绍了JavaWeb中Servlet的使用,包括Servlet的生命周期、Servlet3.0注解配置、请求处理方法、请求和响应乱码的处理,以及ServletConfig和ServletContext的应用。内容涵盖Servlet的init()、service()、destroy()方法,以及如何通过注解配置Servlet、过滤器和监听器。此外,还讲解了请求参数的获取、请求转发和包含、响应结构等核心概念。
摘要由CSDN通过智能技术生成

JavaWeb——Servlet的使用

一、Servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 初始化后调用 init () 方法。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 销毁前调用 destroy() 方法。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

现在让我们详细讨论生命周期的方法。

init() 方法

**init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。**因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

init 方法的定义如下:

public void init() throws ServletException {
   
  // 初始化代码...
}

拓展:指定servlet创建的时间(默认第一次访问时被创建)

1.第一次被访问时创建
<load-on-startup>的值为负数,默认值就是-1,即默认就是第一次被访问时创建
2.在服务器启动时创建
<load-on-startup>的值为0或正数,启动的顺序是: 值越小越早创建,0时最早创建 。值相同时, 自上而下顺序创建 。

xml文件配置

    <servlet>
        <servlet-name>LifeCycle</servlet-name>
        <servlet-class>LifeCycle</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>LifeCycle</servlet-name>
        <url-pattern>/LifeCycle</url-pattern>
    </servlet-mapping>

注解配置

@WebServlet(value = "/LifeCycle",loadOnStartup = 0)
service() 方法

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,service方法就会被调用一次。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

下面是该方法的特征:

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
   
}

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

destroy() 方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:

  public void destroy() {
   
    // 终止化代码...
  }

二、Servlet3.0注解配置

@WebServlet

@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):

@WebServlet 主要属性列表
属性名 类型 描述
name String 指定 Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
value String[] 该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatterns String[] 指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
loadOnStartup int 指定 Servlet 的加载顺序,等价于<load-on-startup>标签。
initParams WebInitParam[] 指定一组 Servlet 初始化参数,等价于<init-param>标签。
asyncSupported boolean 声明 Servlet 是否支持异步操作模式,等价于<async-supported>标签。
description String 该 Servlet 的描述信息,等价于<description>标签。
displayName String 该 Servlet 的显示名,通常配合工具使用,等价于<display-name>标签。

下面是一个简单的示例:

@WebServlet(urlPatterns = {
   "/simple"}, asyncSupported = true,
loadOnStartup = -1, name = "SimpleServlet", displayName = "ss",
initParams = {
   @WebInitParam(name = "username", value = "tom")}
)
public class SimpleServlet extends HttpServlet{
   ... }

如此配置之后,就可以不必在 web.xml 中配置相应的 和 元素了,容器会在部署时根据指定的属性将该类发布为 Servlet。它的等价的 web.xml 配置形式如下:

<servlet>
    <display-name>ss</display-name>
    <servlet-name>SimpleServlet</servlet-name>
    <servlet-class>footmark.servlet.SimpleServlet</servlet-class>
    <load-on-startup>-1</load-on-startup>
    <async-supported>true</async-supported>
    <init-param>
        <param-name>username</param-name>
        <param-value>tom</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SimpleServlet</servlet-name>
    <url-pattern>/simple</url-pattern>
</servlet-mapping>

@WebInitParam

该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数,这等价于 web.xml 中 <init-param>的 子标签。@WebInitParam 具有下表给出的一些常用属性:

表 2. @WebInitParam 的常用属性
属性名 类型 是否可选 描述
name String 指定参数的名字,等价于<param-name>
value String 指定参数的值,等价于</param-value>
description String 关于参数的描述,等价于<description>

@WebFilter

@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 ):

表 3. @WebFilter 的常用属性
属性名 类型 描述
filterName String 指定过滤器的 name 属性,等价于
value String[] 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。
urlPatterns String[] 指定一组过滤器的 URL 匹配模式。等价于 标签。
servletNames String[] 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中<servlet-name>的取值。
dispatcherTypes DispatcherType 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
initParams WebInitParam[] 指定一组过滤器初始化参数,等价于 标签。
asyncSupported boolean 声明过滤器是否支持异步操作模式,等价于 标签。
description String 该过滤器的描述信息,等价于 标签。
displayName String 该过滤器的显示名,通常配合工具使用,等价于 标签。

下面是一个简单的示例:

@WebFilter(servletNames = {
   "SimpleServlet"},filterName="SimpleFilter")
public class LessThanSixFilter implements Filter{
   ...}

显示更多

如此配置之后,就可以不必在 web.xml 中配置相应的 和 元素了,容器会在部署时根据指定的属性将该类发布为过滤器。它等价的 web.xml 中的配置形式为:

<filter>
    <filter-name>SimpleFilter</filter-name>
    <filter-class>xxx</filter-class>
</filter>
<filter-mapping>
    <filter-name>SimpleFilter</filter-name>
    <servlet-name>SimpleServlet</servlet-name>
</filter-m
    apping>

@WebListener

该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:

  • ServletContextListener
  • ServletContextAttributeListener
  • ServletRequestListener
  • ServletRequestAttributeListener
  • HttpSessionListener
  • HttpSessionAttributeListener

该注解使用非常简单,其属性如下:

表 4. @WebListener 的常用属性
属性名 类型 是否可选 描述
value String 该监听器的描述信息。

一个简单示例如下:

@WebListener("This is only a demo listener")
public class SimpleListener implements ServletContextListener{
   ...}

如此,则不需要在 web.xml 中配置 标签了。它等价的 web.xml 中的配置形式如下:

<listener>
    <listener-class>footmark.servlet.SimpleListener</listener-class>
</listener>

@MultipartConfig

该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:

表 5. @MultipartConfig 的常用属性
属性名 类型 是否可选 描述
fileSizeThreshold int 当数据量大于该值时,内容将被写入文件。
location String 存放生成的文件地址。
maxFileSize long 允许上传的文件最大值。默认值为 -1,表示没有限制。
maxRequestSize long 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。

三、Servlet的体系结构

​ Servlet – 接口
​ |
​ GenericServlet – 抽象类
​ |
​ HttpServlet – 抽象类

  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象方法

    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作

    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

四、Servlet路径配置

  • 1.全路径匹配

以 / 开始,格式为 : /a /aa/bb
例子 :localhost:8080/ 项目名称 /a/ aa / bb

  • 2.部分路径匹配

以 / 开始 , 但是以 * 结束 ,格式为 :/ a / * / *
例子:localhost:8080/项目名称/ aa / bb / *

  • 3.拓展名匹配

不以/ 而是以 * 开始 ,* . 扩展名,格式为: * . aa, * . bb
例子:localhost:8080/项目名称/ * . txt

  • 4.特殊匹配

仅有 " / ",而没有其他任何内容
含义:该类是缺省的 Servlet
缺省的 Servlet :若当前访问资源地址的所有 Servlet 都不匹配时,就由缺省的 Servlet 进行处理

  • 5.一些注意点

1.优先级:1 > 2 > 3,精确优先

2.方式 2 和方式 3 不能混搭使用

测试:

@WebServlet(urlPatterns = {
   "/UrlsServlet/*"})->/UrlsServlet/下的任意目录,可以有任意层路径,如:
/UrlsServlet/1/UrlsServlet/2/2/2/2.....
@WebServlet(urlPatterns = {
   "/UrlsServlet/**"})->这种路径写法是错误的
@WebServlet(urlPatterns = {
   "/UrlsServlet"})->精确匹配,只匹配/UrlsServlet
@WebServlet(urlPatterns = {
   "*.do"})->拓展名匹配,匹配后缀名为.do的任意层请求,如/a/a.do.注意*.do前面不可以加上/

原则:精确优先

五、请求消息的数据格式

* 请求消息数据格式
	1. 请求行
		请求方式 请求url 请求协议/版本
		GET /Chapter_02/login.html	HTTP/1.1

		* 请求方式:
			* HTTP协议有7中请求方式,常用的有2* GET:
					1. 请求参数在请求行中,在url后。
					2. 请求的url长度有限制的
					3. 不太安全
				* POST:
					1. 请求参数在请求体中
					2. 请求的url长度没有限制的
					3. 相对安全
	2. 请求头:客户端浏览器告诉服务器一些信息
		请求头名称: 请求头值
		* 常见的请求头:
			1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
				* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题

			2. Referer:http://localhost/Chapter_02/login.html
				* 告诉服务器,我(当前请求)从哪里来?
					* 作用:
						1. 防盗链:
						2. 统计工作:
	3. 请求空行
		空行,就是用于分割POST请求的请求头,和请求体的。
	4. 请求体(正文)* 封装POST请求消息的请求参数的

	* 字符串格式:
		POST /Chapter_02/login.html	HTTP/1.1
		Host: localhost
		User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101    Firefox/60.0
		Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
		Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
		Accept-Encoding: gzip, deflate
		Referer: http://localhost/login.html
		Connection: keep-alive
		Upgrade-Insecure-Requests: 1
		
		username=zhangsan->请求体数据

六、检索请求参数

HttpServletRequest对象中常用的获取请求参数的方法(POST请求和GET请求都可以获取):

1、getParameter(“parameterName”):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值