深入理解Servlet

news2024/11/19 10:34:40


目录:

  • Servlet
    • Web开发历史
    • Servlet简介
      • Servlet技术特点
      • Servlet在应用程序中的位置
      • Tomcat运行过程
      • Servlet继承结构
      • Servlet生命周期
      • Servlet处理请求的原理
      • Servlet的作用
      • HttpServletRequest对象
      • HttpServletResponse对象
      • ServletContext对象
      • ServletConfig对象
      • Cookie对象与HttpSession对象
      • Servlet的url-pattern配置
      • 基于注解式开发Servlet
      • Listener监听器

Servlet

在这里插入图片描述

Web开发历史

CGI

公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范。
在这里插入图片描述
CGI缺点

  • 以进程方式运行,对每一个客户端的请求都要启动一个进程来运行程序,导致用户数目增加时,服务器端资源被大量占用。
  • 由于对操作系统和进程的不深刻理解,使得开发人员开发的CGI程序经常遇到莫名其妙的错误。
  • 不同的CGI之间不能共享资源

FastCGI

FastCGI是对CGI模式的一个改进,采用了Pooling技术,一定程度上改善了性能,但是由于仍然是基于进程运行的所以并没有从根本上解决问题。

Servlet简介

ServletServer Applet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。 Web 容器或应用服务器实现了Servlet标准所以Servlet需要运行在Web容器或应用服务器中。Servlet主要功能在于能够在服务器中执行并生成数据。

Servlet技术特点

单进程多线程的方式
在这里插入图片描述

Servlet在应用程序中的位置

在这里插入图片描述

Tomcat运行过程

  • 用户访问localhost:8888/test/helloword.do,请求被发送到Tomcat,被监听8888端口并处理 HTTP/1.1 协议的Connector获得。
  • Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
  • Engine获得请求localhost/test/helloword.do,匹配所有的虚拟主机Host。
  • Engine匹配到名为localhost的Host虚拟主机来处理/test/helloword.do请求(即使匹配不到会请求交给默认Host处理)。
  • 匹配到的Context获得请求/helloword.do。
  • 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloWorld的doGet()或doPost().执行业务逻辑、数据存储等程序。
  • Context把执行完之后的结果通过HttpServletResponse对象返回给Host。
  • Host把HttpServletResponse返回给Engine。
  • Engine把HttpServletResponse对象返回Connector。
  • Connector把HttpServletResponse对象返回给客户Browser。

Servlet继承结构

在这里插入图片描述

Servlet接口

  • init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
  • service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。
  • destroy(),在销毁Servlet对象之前调用该方法,释放资源。
  • getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
  • getServletInfo(),获取servlet相关信息。

ServletConfig接口

  • String getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
  • ServletContext getServletContext(),返回一个代表当前 Web 应用的 ServletContext 对象。
  • String getInitParameter(String name),根据初始化参数名返回对应的初始化参数值。
  • Enumeration getInitParameterNames(),返回一个 Enumeration 对象,其中包含了所有的初始化参数名。

GenericServle抽象类

GenericServlet是实现了Servlet接口的抽象类。在GenericServlet中进一步的定义了Servlet接口的具体实现,其设计的目的是为了和应用层协议解耦,在GenericServlet中包含一个Service抽象方法。

HttpServlet类

继承自 GenericServlet,针对于处理 HTTP 协议的请求所定制。在 HttpServlet的service() 方法中已经把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转。实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可。

Servlet生命周期

Servlet的生命周期是由容器管理的,分别经历三各阶段:

init():初始化

service():服务

destroy():销毁

当客户端浏览器第一次请求Servlet时,容器会实例化这个Servlet,然后调用一次init方法,并在新的线程中执行service方法处理请求。service方法执行完毕后容器不会销毁这个Servlet而是做缓存处理,当客户端浏览器再次请求这个Servlet时,容器会从缓存中直接找到这个Servlet对象,并再一次在新的线程中执行Service方法。当容器在销毁Servlet之前对调用一次destroy方法。

Servlet处理请求的原理

当浏览器基于get方式请求我们创建Servlet时,我们自定义的Servlet中的doGet方法会被执行。doGet方法能够被执行并处理get请求的原因是,容器在启动时会解析web工程中WEB-INF目录中的web.xml文件,在该文件中我们配置了Servlet与URI的绑定,容器通过对请求的解析可以获取请求资源的URI,然后找到与该URI绑定的Servlet并做实例化处理(注意:只实例化一次,如果在缓存中能够找到这个Servlet就不会再做次实例化处理)。在实例化时会使用Servlet接口类型作为引用类型的定义,并调用一次init方法,由于GenericServlet中重写了该方法所以最终执行的是GenericServlet中init方法(GenericServlet中的Init方法是一个空的方法体),然后在新的线程中调用service方法。由于在HttpServlet中重写了Service方法所以最终执行的是HttpServlet中的service方法。在service方法中通过request.getMethod()获取到请求方式进行判断如果是Get方式请求就执行doGet方法,如果是POST请求就执行doPost方法。如果是基于GET方式提交的,并且在我们的Servlet中又重写了HttpServlet中的doGet方法,那么最终会根据Java的多态特性转而执行我们自定义的Servlet中的doGet方法。

Servlet的作用

  • 获取用户提交的数据
  • 获取浏览器附加的信息
  • 处理数据(访问数据库或调用接口)
  • 给浏览器产生一个响应
  • 在响应中添加附加信息

HttpServletRequest对象

HttpServletRequest对象代表客户端浏览器的请求,当客户端浏览器通过HTTP协议访问服务器时,HTTP请求中的所有信息都会被Tomcat所解析并封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

获取请求信息
req.getRequestURL()

返回客户端浏览器发出请求时的完整URL。

req.getRequestURI()

返回请求行中指定资源部分。

req.getRemoteAddr()

返回发出请求的客户机的IP地址。

req.getLocalAddr()

返回WEB服务器的IP地址。

req.getLocalPort()

返回WEB服务器处理Http协议的连接器所监听的端口。

获取请求数据
根据key获取指定value

req.getParameter(“key”);

根据key获取对应的value,返回一个字符串。

String str = req.getParameter("key");

获取复选框(checkbox组件)中的值
req.getParameterValues(“checkboxkey”);
获取复选框(checkbox组件)中的值,返回一个字符串数组。

String[] userlikes =req.getParameterValues("checkboxkey");

获取所有提交数据的key

req.getParameterNames()

获取请求中所有数据的key,该方法返回一个枚举类型。

Enumeration<String> parameterNames =req.getParameterNames();

使用Map结构获取提交数据

req.getParameterMap()

获取请求中所有的数据并存放到一个Map结构中,该方法返回一个Map,其中key为String类型value为String[]类型。

Map<String, String[]> parameterMap = req.getParameterMap()

设置请求编码

req.setCharacterEncoding(“utf-8”)

请求的数据包基于字节在网络上传输,Tomcat接收到请求的数据包后会将数据包中的字节转换为字符。在Tomcat中使用的是ISO-8859-1的单字节编码完成字节与字符的转换,所以数据中含有中文就会出现乱码,可以通过req.setCharacterEncoding(“utf-8”)方法来对提交的数据根据指定的编码方式重新做编码处理。

资源访问路径

绝对路径

绝对路径访问资源表示直接以”/”作为项目的Context Path。该方式适用于以”/”作为项目的Context Path。

<form action="/getInfo.do" method="post">

相对路径

相对路径访问资源表示会相对于项目的Context Path作为相对路径。该方式适用于为项目指定的具体的Context Path。

<form action="getInfo.do" method="post">

获取请求头信息

req.getHeader(“headerKey”)
根据请求头中的key获取对应的value。

String headerValue =req.getHeader("headerKey");

req.getHeaderNames()

获取请求头中所有的key,该方法返回枚举类型。

Enumeration<String> headerNames =req.getHeaderNames();

HttpServletRequest对象的生命周期

当有请求到达Tomcat时,Tomcat会创建HttpServletRequest对象,并将该对象通过参数的方式传递到我们Servlet的方法中,当处理请求处理完毕并产生响应后该对象生命周期结束。

HttpServletResponse对象

HttpServletResponse对象代表服务器的响应。这个对象中封装了响应客户端浏览器的流对象,以及向客户端浏览器响应的响应头、响应数据、响应状态码等信息

设置响应类型

resp.setContentType(“MIME”)
该方法可通过MIME-Type设置响应类型。

TypeMeaning
application/mswordMicrosoft Word document
application/octet-streamUnrecognized or binary data
application/pdfAcrobat (.pdf) file
application/postscriptPostScript file
application/vnd.lotus-notesLotus Notes file
application/vnd.ms-excelExcel spreadsheet
application/vnd.ms-powerpointPowerPoint presentation
application/x-gzipGzip archive
application/x-java-archiveJAR file
application/x-java-serialized-objectSerialized Java object
application/x-java-vmJava bytecode (.class) file
application/zipZip archive
application/jsonJSON
audio/basicSound file in .au or .snd format
audio/midiMIDI sound file
audio/x-aiffAIFF sound file
audio/x-wavMicrosoft Windows sound file
image/gifGIF image
image/jpegJPEG image
image/pngPNG image
image/tiffTIFF image
image/x-xbitmapX Windows bitmap image
text/cssHTML cascading style sheet
text/htmlHTML document
text/plainPlain text
text/xmlXML
video/mpegMPEG video clip
video/quicktimeQuickTime video clip

设置字符型响应

常见的字符型响应类型:

resp.setContentType(“text/html”)
设置响应类型为文本型,内容含有html字符串,是默认的响应类型

resp.setContentType(“text/plain”)
设置响应类型为文本型,内容是普通文本。

resp.setContentType(“application/json”)
设置响应类型为JSON格式的字符串。

设置字节型响应

常见的字节型响应:

resp.setContentType(“image/jpeg”)
设置响应类型为图片类型,图片类型为jpeg或jpg格式。

resp.setContentType(“image/gif”)
设置响应类型为图片类型,图片类型为gif格式。

设置响应编码
在这里插入图片描述
设置响应编码有两种方式

  1. response.setContentType(“text/html; charset=UTF-8”);
  2. response.setCharacterEncoding(“UTF-8”);

response.setContentType(“text/html;charset=utf-8”);

不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文

response.setCharacterEncoding(“utf-8”);

仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动指定浏览器编码。

在响应中添加附加信息

在响应中添加附加信息

response.sendRedirect(URL地址)

重定向响应会在响应头中添加一个Location的key对应的value是给定的URL。客户端浏览器在解析响应头后自动向Location中的URL发送请求。

重定向响应特点

  • 重定向会产生两次请求两次响应。
  • 重定向的URL是由客户端浏览器发送的。
  • 浏览器地址栏会有变化。

ServletContext对象

ServletContext对象介绍

ServletContext官方叫Servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象。这个对象全局唯一,而且Web应用中的所有Servlet都共享这个对象。所以叫全局应用程序共享对象。
在这里插入图片描述
ServletContext对象的作用

  • 相对路径转绝对路径
  • 获取容器的附加信息
  • 读取配置信息
  • 全局容器

ServletContext对象的使用

相对路径转绝对路径

context.getRealPath(“path”)

该方法可以将一个相对路径转换为绝对路径,在文件上传与下载时需要用到该方法做路径的转换。

获取容器的附加信息

servletContext.getServerInfo()
返回Servlet容器的名称和版本号

servletContext.getMajorVersion()
返回Servlet容器所支持Servlet的主版本号。

servletContext.getMinorVersion()
返回Servlet容器所支持Servlet的副版本号。

获取web.xml文件中的信息

<context-param>
    <param-name>key</param-name>
    <param-value>value</param-value>
 </context-param>

servletContext.getInitParameter(“key”)
该方法可以读取web.xml文件中标签中的配置信息。

servletContext.getInitParameterNames()
该方法可以读取web.xml文件中所有param-name标签中的值。

全局容器

servletContext.setAttribute(“key”,ObjectValue)
向全局容器中存放数据。

servletContext.getAttribute(“key”)
从全局容器中获取数据。

servletContext.removeAttribute(“key”)
根据key删除全局容器中的value。

ServletContext对象生命周期

当容器启动时会创建ServletContext对象并一直缓存该对象,直到容器关闭后该对象生命周期结束。ServletContext对象的生命周期非常长,所以在使用全局容器时不建议存放业务数据。

ServletConfig对象

ServletConfig对象对应web.xml文件中的节点。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息,封装到一个ServletConfig对象中。我们可以通过该对象读取节点中的配置信息

<servlet>
    <servlet-name>servletName</servlet-name>
    <servlet-class>servletClass</servletclass>
    <init-param>
        <param-name>key</param-name>
        <param-value>value</param-value>
    </init-param>
</servlet>

servletConfig.getInitParameter(“key”)
该方法可以读取web.xml文件中标签中标签中的配置信息。

servletConfig.getInitParameterNames()
该方法可以读取web.xml文件中当前标签中所有标签中的值。

Cookie对象与HttpSession对象

Cookie对象与HttpSession对象的作用是维护客户端浏览器与服务端的会话状态的两个对象。由于HTTP协议是一个无状态的协议,所以服务端并不会记录当前客户端浏览器的访问状态,但是在有些时候我们是需要服务端能够记录客户端浏览器的访问状态的,如获取当前客户端浏览器的访问服务端的次数时就需要会话状态的维持。在Servlet中提供了Cookie对象与HttpSession对象用于维护客户端与服务端的会话状态的维持。二者不同的是Cookie是通过客户端浏览器实现会话的维持,而HttpSession是通过服务端来实现会话状态的维持。

Cookie对象的特点

  • Cookie使用字符串存储数据
  • Cookie使用Key与Value结构存储数据
  • 单个Cookie存储数据大小限制在4097个字节
  • Cookie存储的数据中不支持中文,Servlet4.0中支持
  • Cookie是与域名绑定所以不支持跨一级域名访问
  • Cookie对象保存在客户端浏览器内存或系统磁盘中
  • Cookie分为持久化Cooke与状态Cookie
  • 浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,Chrome浏览器为50个
  • 浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端

Cookie对象的创建

Cookie cookie = new Cookie(“key”,“value”)
通过new关键字创建Cookie对象

response.addCookie(cookie)
通过HttpServletResponse对象将Cookie写回给客户端浏览器。

获取Cookie中的数据

浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中
提交到服务端。通过HttpServletRequest对象获取Cookie,返回
Cookie数组。

Cookie[] cookies = request.getCookies()

解决Cookie不支持中文

在Cookie中name的值不能使用中文,Value是可以的。但是在Servlet4.0版本之前Cookie中的Value也是不支持中文存储的,如果存储的数据中含有中文,代码会直接出现异常。我们可以通过对含有中文的数据重新进行编码来解决该问题。在Servlet4.0中的Cookie的Value开始支持中文存储。

URLEncoder.encode(“content”,“code”)
将内容按照指定的编码方式做URL编码处理。

URLDecoder.decode(“content”,“code”)
将内容按照指定的编码方式做URL解码处理。

Cookie跨域问题

域名分类:域名分为顶级域、顶级域名(一级域名)、二级域名。
在这里插入图片描述
域名等级的区别:一级域名比二级域名更高级,二级域名是依附于一级域名之下的附属分区域名,即二级域名是一级域名的细化分级。例如:baidu.com 为一级域名,news.baidu.com为二级域名。

Cookie不支持一级域名的跨域,支持二级域名的跨域。
在这里插入图片描述
状态Cookie与持久化Cookie
状态Cookie:Cookie对象仅会被缓存在浏览器所在的内存中。当浏览器关闭后Cookie对象 也会被销毁。
持久化Cookie:浏览器会对Cookie做持久化处理,基于文件形式保存在系统的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。

当Cookie对象创建后默认为状态Cookie。可以使用Cookie对象下的cookie.setMaxAge(60)方法设置失效时间,单位为秒。一旦设置了失效时间,那么该Cookie为持久化Cookie,浏览器会将Cookie对象持久化到磁盘中。当失效时间到达后文件删除。

通过Cookie实现客户端与服务端会话的维持

需求:当客户端浏览器第一次访问Servlet时响应“您好,欢迎您第一次访问!”,第二次访问时响应“欢迎您回来!”。

Cookie总结

Cookie对于存储内容是基于明文的方式存储的,所以安全性很低。不要在Cookie中存放敏感数据。在数据存储时,虽然在Servlet4.0中Cookie支持中文,但是建议对Cookie中存放的内容做编码处理,也可提高安全性

HttpSession对象的特点

  • HttpSession保存在服务端
  • HttpSession使用Key与Value结构存储数据
  • HttpSession的Key是字符串类型,Value则是Object类型
  • HttpSession存储数据大小无限制

HttpSession对象的创建
在这里插入图片描述
HttpSession对象的创建是通过request.getSession()方法来创建的。客户端浏览器在请求服务端资源时,如果在请求中没有jsessionid,getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象,并为这个HttpSession对象生成一个jsessionid,在响应中通过状态Cookie写回给客户端浏览器,如果在请求中包含了jsessionid,getSession()方法则根据这个ID返回与这个客户端浏览器对应的HttpSession对象。

getSession()方法还有一个重载方法getSession(true|false)。当参数为true时与getSession()方法作用相同。当参数为false时则只去根据jsessionid查找是否有与这个客户端浏览器对应的HttpSession,如果有则返回,如果没有jsessionid则不会创建新的HttpSession对象。

HttpSession对象的使用

session.setAttribute(“key”,value)
将数据存储到HttpSession对象中

Object value = session.getAttribute(“key”)
根据key获取HttpSession中的数据,返回Object

Enumeration attributeNames = session.getAttributeNames()
获取HttpSession中所有的key,返回枚举类型

session.removeAttribute(“key”)
根据key删除HttpSession中的数据

String id = session.getId()
根据获取当前HttpSession的SessionID,返回字符串类型

HttpSession的销毁方式
HttpSession的销毁方式有两种:

  • 通过web.xml文件指定超时时间
  • 通过HttpSession对象中的invalidate()方法销毁当前HttpSession对象

我们可以在web.xml文件中指定HttpSession的超时时间,当到达指定的超时时间后,容器就会销该HttpSession对象,单位为分钟。该时间对整个web项目中的所有HttpSession对象有效。时间的计算方式是根据最后一次请求时间作为起始时间。只要用户继续访问,服务器就会更新HttpSession的最后访问时间,并维护该
HttpSession。用户每访问服务器一次,无论是否读写HttpSession,服务器都认为该用户的HttpSession"活跃(active)"了一次,销毁时间则会重新计算。如果有哪个客户端浏览器对应的HttpSession的失效时间已到,那么与该客户端浏览器对应的HttpSession对象就会被销毁。其他客户端浏览器对应的HttpSession对象会继续保存不会被销毁。

<session-config>
    <session-timeout>1</session-timeout>
 </session-config>

我们也可以在Tomcat的web.xml文件中配置HttpSession的销毁时间。如果在Tomcat的web.xml文件中配置了HttpSession的超时时间对应的是Tomcat中所有的Web项目都有效。相当于配置了全局的HttpSession超时时间。如果我们在Web项目中配置了超时时间,那么会以Web项目中的超时时间为准。
在这里插入图片描述
invalidate()方法是HttpSession对象中所提供的用于销毁当前HttpSession的方法。我们通过调用该方法可以销毁当前HttpSession对象。

通过HttpSession实现客户端与服务端会话的维持

需求:当客户端浏览器第一次访问Servlet时响应“您好,欢迎您第一次访问!”,第二次访问时响应“欢迎您回来!”。

HttpSession生命周期

在HttpSession对象生命周期中没有固定的创建时间与销毁时间。何时创建取决于我们什么时候第一次调用了getSession()或getSession(true)的方法。HttpSession对象的销毁时间取决于超时时间的到达以及调用了invalidate()方法。如果没有超时或者没有调用invalidate()方法,那么HttpSession会一直存储。默认超时时间
为30分钟(Tomcat的web.xml文件配置的时间就是默认超时时间)。

HttpSession对象总结

HttpSession与Cookie的区别:

  • cookie数据存放在客户的浏览器或系统的文件中,而HttpSession中的数据存放在服务器中。
  • cookie不安全,而HttSession是安全的。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个域名保存cookie的数量。而HttpSession没有容量以及数量的限制。

HttpSession的使用建议

HttpSession对象是保存在服务端的,所以安全性较高。我们可以在HttpSession对象中存储数据,但是由于HttpSession对象的生命周期不固定,所以不建议存放业务数据。一般情况下我们只是存放用户登录信息。

Servlet的url-pattern配置

URL的匹配规则

精确匹配
精确匹配是指中配置的值必须与url完全精确匹配。

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>/demo.do</url-pattern>
</servlet-mapping>

http://localhost:8888/demo/demo.do 匹配
http://localhost:8888/demo/suibian/demo.do 不匹配

扩展名匹配

在允许使用统配符作为匹配规则,“*”表示匹配任意字符。在扩展名匹配中只要扩展名相同都会被匹配和路径无关。注意,在使用扩展名匹配时在中不能使用“/”,否则容器启动就会抛出异常。

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
 </servlet-mapping>

http://localhost:8888/demo/abc.do 匹配
http://localhost:8888/demo/suibian/haha.do 匹配
http://localhost:8888/demo/abc 不匹配

路径匹配

根据请求路径进行匹配,在请求中只要包含该路径都匹配。“*”表示任意路径以及子路径。

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>/suibian/*</url-pattern>
 </servlet-mapping>

http://localhost:8888/demo/suibian/haha.do 匹配
http://localhost:8888/demo/suibian/hehe/haha.do 匹配
http://localhost:8888/demo/hehe/heihei.do 不匹配

任意匹配

匹配“/”。匹配所有但不包含JSP页面

<url-pattern>/</url-pattern>

http://localhost:8888/demo/suibian.do 匹配
http://localhost:8888/demo/addUser.html 匹配
http://localhost:8888/demo/css/view.css 匹配
http://localhost:8888/demo/addUser.jsp 不匹配
http://localhost:8888/demo/user/addUser.jsp 不匹配

匹配所有

<url-pattern>/*</url-pattern>

http://localhost:8888/demo/suibian.do 匹配
http://localhost:8888/demo/addUser.html 匹配
http://localhost:8888/demo/suibian/suibian.do 匹配

Servlet的多URL映射方式

在web.xml文件中支持将多个URL映射到一个Servlet中,但是相同的URL不能同时映射到两个Servlet中。

方式一

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>/suibian/*</url-pattern>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

方式二

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>/suibian/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

基于注解式开发Servlet

在Servlet3.0以及之后的版本中支持注解式开发Servlet。对于Servlet的配置不在依赖于web.xml配置文件,而是使用@WebServlet注解完成Servlet的配置

@WebServlet

属性名类型作用
initParamsWebInitParam[]Servlet的init参数
nameStringServlet的名称
urlPatternsString[]Servlet的访问URL,支持多个
valueString[]Servlet的访问URL,支持多个
loadOnStartupint自启动Servlet
descriptionStringServlet的描述
displayNameStringServlet的显示名称
asyncSupportedboolean声明Servlet是否支持异步操作模式

@WebInitParam

属性名类型作用
nameStringparam-name
valueStringparam-value
descriptionStringdescription

文件上传

在Servlet3.0之前的版本中如果实现文件上传需要依赖apache的Fileupload组件,在Servlet3.0以及之后的版本中提供了Part对象处理文件上传,所以不在需要额外的添加Fileupload组件。

在Servlet3.0以及之后的版本中实现文件上传时必须要在Servlet中开启多参数配置:

web.xml

<multipart-config>
    <file-size-threshold></file-size-threshold>
    <location></location>
    <max-file-size></max-file-size>
    <max-request-size></max-request-size>
</multipart-config>
元素名类型描述
< file-size-threshold >int当数据量大于该值时,内容将被写入临时文件。
< location >String存放生成的临时文件地址
< max-file-size >long允许上传的文件最大值(byte)。默认值为 -1,表示没有限制
< max-request-size >long一个 multipart/form-data请求能携带的最大字节数(byte),默认值为 -1,

@MultipartConfig

属性名类型描述
fileSizeThresholdint当数据量大于该值时,内容将被写入临时文件。
locationString存放生临时成的文件地址
maxFileSizelong允许上传的文件最大值(byte)。默认值为 -1,表示没有限制
maxRequestSizelong一个 multipart/form-data请求能携带的最大字节数(byte),默认值为 -1,表示没有限制。

Part对象中常用的方法

long getSize()
上传文件的大小

String getSubmittedFileName()
上传文件的原始文件名

String getName()
获取<input name=“upload” …>标签中name属性值

InputStream getInputStream()
获取上传文件的输入流

void write(String path)
保存文件至服务器

Filter过滤器

过滤器作用
Filter过滤器是Servlet2.3中所提供的一个过滤请求与响应的对象。

Filter过滤器既可以对客户端向服务器端发送的请求进行过滤,也可以对服务器端向客户端产生的响应进行过滤处理。
在这里插入图片描述
Filter对象的创建

创建一个Class实现Filter接口,并实现接口中三个抽象方法。
init()方法:初始化方法,在创建Filter后立即调用。可用于完成初始化动作。

doFilter()方法:拦截请求与响应方法,可用于对请求和响应实现预处理。

destroy()方法:销毁方法,在销毁Filter之前自动调用。可用于完成资源释放等动作。

在Filter中设置请求编码
需求:在Filter中实现对请求的编码的设置。

FilterConfig对象的使用

FilterConfig对象是用来读取中初始化参数的对象。该对象通过参数传递到init方法中,用于读取初始化参数。

filterConfig.getInitParameter(“name”)
通过name获取对应的value。

filterConfig.getInitParameterNames()
返回该Filter中所有中的值。

FilterChain(过滤器链)

Filter技术的特点是在对请求或响应做预处理时,可实现“插拔式”的程序设计。我们可以根据自己需求添加多个Filter,也可以根据需求去掉某个Filter,通过修改web.xml文件即可实现。那么如果有多个过滤器对某个请求及响应进行过滤,那么这组过滤器就称为过滤器链。

Filter执行顺序

则按照在web.xml文件中配置的上下顺序来决定先后。在上的先执
行,在下的后执行。
在这里插入图片描述
基于注解式开发Filter

Filter支持注解式开发,通过@WebFilter注解替代web.xml中Filter的配置。

属性名类型作用
filterNameString指定过滤器的 name 属性
urlPatternsString[]拦截请求的URL,支持多个
valueString[]拦截请求的URL,支持多个
descriptionString过滤器的描述
displayNameString过滤器的显示名称
initParamsWebInitParam[]指定一组过滤器初始化参数,等价于 标签。

使用注解式开发Filter时,执行顺序会根据Filter的名称进行排序的
结果决定调用的顺序。

Filter的生命周期

Filter的生命周期是由容器管理的。当容器启动时会实例化Filter并调用init方法完成初始化动作。当客户端浏览器发送请求时,容器会启动一个新的线程来处理请求,如果请求的URL能够被过滤器所匹配,那么则先调用过滤器中 的doFilter方法,再根据是否有chain.doFilter的指令,决定是否继续请求目标资源。当容器关闭时会销毁Filter对象,在销毁之前会调用destroy方法。

Listener监听器

监听器用于监听web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器会自动调用监听器对象中的方法。

监听器分类

按监听的对象划分,可以分为:

  • ServletContext对象生命周期监听器与属性操作监听器;
  • HttpSession对象生命周期监听器与属性操作监听器;
  • ServletRequest对象生命周期监听器与属性操作监听器;

ServletContext对象的生命周期监听器
ServletContextListener接口定义了ServletContext对象生命周期的监听行为。

void contextInitialized(ServletContextEvent sce)
ServletContext对象创建之后会触发该监听方法,并将ServletContext对象传递到该方法中。

void contextDestroyed(ServletContextEvent sce)
ServletContext对象在销毁之前会触发该监听方法,并将ServletContext对象传递到该方法中。

ServletContext对象的属性操作监听器

ServletContextAttributeListener接口定义了对于ServletContext对象属性操作的监听行为。

void attributeAdded(ServletContextAttributeEvent scae)
向ServletContext对象中添加属性时会触发该监听方法,并ServletContext对象传递到该方法中。触发事件的方法servletContext.setAttribute(“key”,“value”)。

void attributeRemoved(ServletContextAttributeEvent scae)
当从ServletContext对象中删除属性时会触发该监听方法,并将ServletContext对象传递到该方法中。触发事件方法servletContext.removeAttribute(“key”)。

void attributeReplaced(ServletContextAttributeEvent scae)
当从ServletContext对象中属性的值发生替换时会触发该监听方法,并将ServletContext对象传递到该方法中。触发事件的方法servletContext.setAttribute(“key”,“value”)。

HttpSession对象的生命周期监听器
HttpSessionListener接口定义了HttpSession对象生命周期的监听行为。

void sessionCreated(HttpSessionEvent se)
HttpSession对象创建后会触发该监听方法,并将已创建HttpSession对象传递到该方法中。

void sessionDestroyed(HttpSessionEvent se)
HttpSession对象在销毁之前会触发该监听方法,并将要销毁的HttpSession对象传递到该方法中。

HttpSession对象的属性操作监听器
HttpSessionAttributeListener接口定义了对于HttpSession对象属性操作的监听行为。

void attributeAdded(HttpSessionBindingEvent se)
向HttpSession对象中添加属性时会触发该监听方法,并将HttpSession对象传递到该方法中。触发事件的方法HttpSession.setAttribute(“key”,“value”)。

void attributeRemoved(HttpSessionBindingEvent se)
当从HttpSession对象中删除属性时会触发该监听方法,并将HttpSession对象传递到该方法中。触发事件方法HttpSession.removeAttribute(“key”)。

void attributeReplaced(HttpSessionBindingEvent se)
当从HttpSession对象中属性的值发生替换时会触发该监听方法,并将HttpSession对象传递到该方法中。触发事件的方法HttpSession.setAttribute(“key”,“value”)。

HttpServletRequest对象的生命周期监听器

ServletRequestListener接口定义了ServletRequest(是HttpServletRequest接口的父接口类型)对象生命周期的监听行为。

void requestInitialized(ServletRequestEvent sre)
HttpServletRequest对象创建后会触发该监听方法,并将已创HttpServletRequest对象传递到该方法中。

void requestDestroyed(ServletRequestEvent sre)
HttpServletRequest对象在销毁之前会触发该监听方法,并将要毁HttpServletRequest对象传递到该方法中。

HttpServletRequest对象的属性操作监听器
ServletRequestAttributeListener接口定义了对HttpServletRequest对象属性操作的监听行为。

void attributeAdded(ServletRequestAttributeEvent srae)
向HttpServletRequest对象中添加属性时会触发该监听方法,并将HttpServletRequest对象传递到该方法中。触发事件的方法HttpServletRequest.setAttribute(“key”,“value”)。

void attributeRemoved(ServletRequestAttributeEvent srae)
当从HttpServletRequest对象中删除属性时会触发该监听方法,并将HttpServletRequest对象传递到该方法中。触发事件方法HttpServletRequest.removeAttribute(“key”)。

void attributeReplaced(ServletRequestAttributeEvent srae)
当从HttpServletRequest对象中属性的值发生替换时会触发该监听方法,并将HttpServletRequest对象传递到该方法中。触发事件的方法HttpServletRequest.setAttribute(“key”,“value”)。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Constrained Iterative LQR 自动驾驶中使用的经典控制算法

Motion planning 运动规划在自动驾驶领域是一个比较有挑战的部分。它既要接受来自上层的行为理解和决策的输出,也要考虑一个包含道路结构和感知所检测到的所有障碍物状态的动态世界模型。最终生成一个满足安全性和可行性约束并且具有理想驾驶体验的轨迹。 通常,motion plann…

微信小程序开发系列(二十八)·小程序API如何发送网络请求以及网络请求失败后的解决方法

目录 1. 小程序API介绍 2. 网络请求 2.1 网络请求失败解决方法 2.2 如何跳过域名校验 1. 小程序API介绍 小程序开发框架提供丰富的微信原生API&#xff0c;可以方便的调起微信提供的能力&#xff0c;例如&#xff1a;获取用户信息、微信登录、微信支付等&#xff0c;小…

“antd“: Unknown word.cSpell

你遇到的问题是 VS Code 的 Code Spell Checker 插件在检查拼写时&#xff0c;将 "antd" 标记为未知单词。"antd" 是 Ant Design 的缩写&#xff0c;是一个流行的 React UI 库&#xff0c;不是一个英语单词&#xff0c;所以 Spell Checker 会将其标记为错误…

Microsoft SQL Server 编写汉字转拼音函数

目录 应用场景 举例 函数实现 小结 应用场景 在搜索应用中&#xff0c;我们一般会提供一个搜索框&#xff0c;输入关健字&#xff0c;点击查询按钮以获取结果数据。大部分情况我们会提供模糊查询的形式以在一个或多个字段进行搜索以获取结果。这样可以简化用户的操作&…

游戏资讯网站系统aspnet+sqlserver

aspnet游戏资讯网站系统本网站采用三层架构编写 有增删查改全部功能 使用了objectDataSource 新技术&#xff1a;采用bootstrap前端框架 dntb控件 随着游戏行业的快速发展&#xff0c;越来越多的玩家需要一个了解全面游戏资讯信息的平台。 充分做了可行性分析后&#xff0c;我…

从零学习Linux操作系统 第三十五部分 Ansible中的角色

一、理解roles在企业中的定位及写法 #ansible 角色简介# Ansible roles 是为了层次化&#xff0c;结构化的组织Playbookroles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中&#xff0c;并可以便捷地include它们roles一般用于基于主机构建服务的场景中&…

如何将视频内容转换为文字文稿?这三款工具助您实现视频转写!

在日常生活中&#xff0c;有时我们需要将视频中的内容转换为文字文稿以便于搜索、编辑或分享。但选择合适的视频转文字软件可能让人感到困惑。今天我将为您推荐三款优秀的视频转文字工具&#xff0c;它们操作简单、准确高效&#xff0c;能够帮助您快速完成视频内容转写的工作。…

MySQL三种日志

一、undo log&#xff08;回滚日志&#xff09; 1.作用&#xff1a; &#xff08;1&#xff09;保证了事物的原子性 &#xff08;2&#xff09;通过read view和undo log实现mvcc多版本并发控制 2.在事务提交前&#xff0c;记录更新前的数据到undo log里&#xff0c;回滚的时候读…

企业智能化转型的关键步骤与陷阱

目录 前言1 转型的关键步骤1.1 深度学习AI技术课程的重要性1.2 激发创意&#xff0c;开展多样化项目的战略意义1.3 招募机器学习专业人才的加速转型1.4 引入具备领导力的AI领导1.5 建立与AI领导的紧密沟通机制 2 智能化转型的陷阱2.1 谨慎期待AI解决所有问题的智慧2.2 综合考虑…

Docker进阶:深入理解 Dockerfile

Docker进阶&#xff1a;深入理解 Dockerfile 一、Dockerfile 概述二、为什么要学习Dockerfile三、Dockerfile 编写规则四、Dockerfile 中常用的指令1、FROM2、LABEL3、RUN4、CMD5、ENTRYPOINT6、COPY7、ADD8、WORKDIR9、 ENV10、EXPOSE11、VOLUME12、USER13、注释14、ONBUILD 命…

Vue+SpringBoot打造独居老人物资配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4.2 新增物资4.3 查询物资4.4 查询物资配送4.5 新增物资配送 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的独居老人物资配送系统&#xff0c;包含了社区档案、…

几何变换 - 图像的缩放、翻转、仿射变换、透视等

1、前言 图像的几何变换是指改变图像的几何结构,大小、形状等等,让图像呈现出具备缩放、翻转、映射和透视的效果 图像的几何变换都比较复杂,计算也很复杂。 例如仿射变换,像素点的位置和灰度值都需要变换。 数字图像处理中利用后向传播的方法,将像素点变换后的位置通过…

统信OUS安装node, npm,vue (亲测有效)

统信OUS安装node, npm,vue &#xff08;1&#xff09;查看自己的系统 uname -a&#xff08;2&#xff09;进入nodejs官网下载相应版本 &#xff08;3&#xff09;找个位置解压&#xff0c;然后复制文件目录 保存好地址&#xff0c;等下要用到 &#xff08;4&#xff09;编辑环…

PostgreSQL索引篇 | GiST索引

PostgreSQL版本为8.4.1 &#xff08;本文为《PostgreSQL数据库内核分析》一书的总结笔记&#xff0c;需要电子版的可私信我&#xff09; 索引篇&#xff1a; PostgreSQL索引篇 | BTreePostgreSQL索引篇 | GIN索引PostgreSQL索引篇 | Hash索引PostgreSQL索引篇 | TSearch2 全文…

Java高级编程—注解

文章目录 1.注解的概述2.常见的Annotation示例2.1 生成文档相关的注解2.2 在编译时进行格式检查的注解2.3 跟踪代码依赖性&#xff0c;实现替代配置文件功能的注解 3.自定义Annotation4.JDK中的元注解4.1 Retention4.2 Target4.3 Documented & Inherited 5. JDK8中注解的新…

什么是VR虚拟现实创作工具|元宇宙文化旅游|VR设备在线购买

VR虚拟现实创作工具是用于创建、编辑和制作虚拟现实内容的软件或硬件工具。这些工具提供了创作者在虚拟现实环境中进行创作的功能和自由度&#xff0c;使他们能够构建令人惊叹的虚拟世界和交互体验。 以下是一些常见的VR虚拟现实创作工具&#xff1a; 虚拟现实建模工具&#x…

基于STC系列单片机实现PNP型三极管S8550驱动共阳数码管或NPN型三极管S8050驱动共阴数码管功能

Digitron.c #include "Digitron.h" //#include "Key.h" #define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint //uchar code DigitronBitCodeArray[] {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x8…

还在为写论文焦虑?免费AI写作大师帮你三步搞定!

还在为写论文焦虑&#xff1f;免费AI写作大师-AI帮你三步搞定&#xff01; 智元兔AI是ChatGPT的人工智能助手&#xff0c;并且具有出色的论文写作能力。它能够根据用户提供的题目或要求&#xff0c;自动生成高质量的论文。 不论是论文、毕业论文、散文、科普文章、新闻稿件&am…

傅里叶变换pytorch使用

参考视频&#xff1a;1 傅里叶变换原理_哔哩哔哩_bilibili 傅里叶变换是干嘛的&#xff1a; 傅里叶得到低频、高频信息&#xff0c;针对低频、高频处理能够实现不同的目的。 傅里叶过程是可逆的&#xff0c;图像经过傅里叶变换、逆傅里叶变换后&#xff0c;能够恢复到原始图像…

全光谱阳光太阳辐射环境模拟系统系统

全光谱阳光模拟系统介绍及应用 全光谱阳光模拟试验箱用于众多汽车机动车构件的老化特性&#xff0c;通过阳光模拟系统&#xff0c;检测成套零部件或整车在阳光照射下的老化性能。用户可能此测试对零部件或整车在照射后性能的更改进行评估&#xff0c;包括形状、颜色、光泽度、…