行业网站渠道选择和内容运营,怎样搭建一个个人网站,做网站除了有服务器还需要什么软件,成都建设网站价格目录#xff1a; ServletWeb开发历史Servlet简介Servlet技术特点Servlet在应用程序中的位置Tomcat运行过程Servlet继承结构Servlet生命周期Servlet处理请求的原理Servlet的作用HttpServletRequest对象HttpServletResponse对象ServletContext对象ServletConfig对象Cookie对象与… 目录 ServletWeb开发历史Servlet简介Servlet技术特点Servlet在应用程序中的位置Tomcat运行过程Servlet继承结构Servlet生命周期Servlet处理请求的原理Servlet的作用HttpServletRequest对象HttpServletResponse对象ServletContext对象ServletConfig对象Cookie对象与HttpSession对象Servlet的url-pattern配置基于注解式开发ServletListener监听器 Servlet Web开发历史
CGI
公共网关接口Common Gateway InterfaceCGI是Web 服务器运行时外部程序的规范。 CGI缺点
以进程方式运行对每一个客户端的请求都要启动一个进程来运行程序导致用户数目增加时服务器端资源被大量占用。由于对操作系统和进程的不深刻理解使得开发人员开发的CGI程序经常遇到莫名其妙的错误。不同的CGI之间不能共享资源
FastCGI
FastCGI是对CGI模式的一个改进采用了Pooling技术一定程度上改善了性能但是由于仍然是基于进程运行的所以并没有从根本上解决问题。
Servlet简介
Servlet是Server 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该方法返回一个枚举类型。
EnumerationString parameterNames req.getParameterNames();使用Map结构获取提交数据
req.getParameterMap()
获取请求中所有的数据并存放到一个Map结构中该方法返回一个Map其中key为String类型value为String[]类型。
MapString, 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 methodpost相对路径
相对路径访问资源表示会相对于项目的Context Path作为相对路径。该方式适用于为项目指定的具体的Context Path。
form actiongetInfo.do methodpost获取请求头信息
req.getHeader(“headerKey”) 根据请求头中的key获取对应的value。
String headerValue req.getHeader(headerKey);req.getHeaderNames()
获取请求头中所有的key该方法返回枚举类型。
EnumerationString headerNames req.getHeaderNames();
HttpServletRequest对象的生命周期
当有请求到达Tomcat时Tomcat会创建HttpServletRequest对象并将该对象通过参数的方式传递到我们Servlet的方法中当处理请求处理完毕并产生响应后该对象生命周期结束。
HttpServletResponse对象
HttpServletResponse对象代表服务器的响应。这个对象中封装了响应客户端浏览器的流对象以及向客户端浏览器响应的响应头、响应数据、响应状态码等信息
设置响应类型
resp.setContentType(“MIME”) 该方法可通过MIME-Type设置响应类型。
TypeMeaningapplication/mswordMicrosoft Word documentapplication/octet-streamUnrecognized or binary dataapplication/pdfAcrobat (.pdf) fileapplication/postscriptPostScript fileapplication/vnd.lotus-notesLotus Notes fileapplication/vnd.ms-excelExcel spreadsheetapplication/vnd.ms-powerpointPowerPoint presentationapplication/x-gzipGzip archiveapplication/x-java-archiveJAR fileapplication/x-java-serialized-objectSerialized Java objectapplication/x-java-vmJava bytecode (.class) fileapplication/zipZip archiveapplication/jsonJSONaudio/basicSound file in .au or .snd formataudio/midiMIDI sound fileaudio/x-aiffAIFF sound fileaudio/x-wavMicrosoft Windows sound fileimage/gifGIF imageimage/jpegJPEG imageimage/pngPNG imageimage/tiffTIFF imageimage/x-xbitmapX Windows bitmap imagetext/cssHTML cascading style sheettext/htmlHTML documenttext/plainPlain texttext/xmlXMLvideo/mpegMPEG video clipvideo/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格式。
设置响应编码 设置响应编码有两种方式
response.setContentType(“text/html; charsetUTF-8”);response.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html;charsetutf-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-paramparam-namekey/param-nameparam-valuevalue/param-value/context-paramservletContext.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对象中。我们可以通过该对象读取节点中的配置信息
servletservlet-nameservletName/servlet-nameservlet-classservletClass/servletclassinit-paramparam-namekey/param-nameparam-valuevalue/param-value/init-param
/servletservletConfig.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 状态CookieCookie对象仅会被缓存在浏览器所在的内存中。当浏览器关闭后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()方法来创建的。客户端浏览器在请求服务端资源时如果在请求中没有jsessionidgetSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象并为这个HttpSession对象生成一个jsessionid在响应中通过状态Cookie写回给客户端浏览器如果在请求中包含了jsessionidgetSession()方法则根据这个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-configsession-timeout1/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-mappingservlet-namedemoServlet/servlet-nameurl-pattern/demo.do/url-pattern
/servlet-mappinghttp://localhost:8888/demo/demo.do 匹配 http://localhost:8888/demo/suibian/demo.do 不匹配
扩展名匹配
在允许使用统配符作为匹配规则“*”表示匹配任意字符。在扩展名匹配中只要扩展名相同都会被匹配和路径无关。注意在使用扩展名匹配时在中不能使用“/”否则容器启动就会抛出异常。
servlet-mappingservlet-namedemoServlet/servlet-nameurl-pattern*.do/url-pattern/servlet-mappinghttp://localhost:8888/demo/abc.do 匹配 http://localhost:8888/demo/suibian/haha.do 匹配 http://localhost:8888/demo/abc 不匹配
路径匹配
根据请求路径进行匹配在请求中只要包含该路径都匹配。“*”表示任意路径以及子路径。
servlet-mappingservlet-namedemoServlet/servlet-nameurl-pattern/suibian/*/url-pattern/servlet-mappinghttp://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-patternhttp://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-patternhttp://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-mappingservlet-namedemoServlet/servlet-nameurl-pattern/suibian/*/url-patternurl-pattern*.do/url-pattern
/servlet-mapping方式二
servlet-mappingservlet-namedemoServlet/servlet-nameurl-pattern/suibian/*/url-pattern
/servlet-mapping
servlet-mappingservlet-namedemoServlet/servlet-nameurl-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自启动ServletdescriptionStringServlet的描述displayNameStringServlet的显示名称asyncSupportedboolean声明Servlet是否支持异步操作模式
WebInitParam
属性名类型作用nameStringparam-namevalueStringparam-valuedescriptionStringdescription
文件上传
在Servlet3.0之前的版本中如果实现文件上传需要依赖apache的Fileupload组件在Servlet3.0以及之后的版本中提供了Part对象处理文件上传所以不在需要额外的添加Fileupload组件。
在Servlet3.0以及之后的版本中实现文件上传时必须要在Servlet中开启多参数配置
web.xml
multipart-configfile-size-threshold/file-size-thresholdlocation/locationmax-file-size/max-file-sizemax-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”)。
如果我的内容对你有帮助请点赞评论收藏。创作不易大家的支持就是我坚持下去的动力!