当前位置: 首页 > news >正文

Servlet 知识点汇总

Servlet 知识点汇总

@WebServlet 注解

注解配置样例 @WebServlet(name=“HelloServlet”,urlPatterns={"/hello"})

属性名类型属性描述
nameStringServlet的名称。等价于<Servlet-name>。如没有显式指定,则该取值为类的全限定名.
valueString[]等价于urlPatterns,二者不能共存。
urlPatternsString[]指定一组servlet的url的匹配模式,等价于<url-pattern>标签。
loadOnStartupint指定servlet的加载顺序,数字大于0则表示启动时初始化,数字越小初始化越早,等价于<load-on-startup>标签。
initParamsWebInitParam[]指定一组初始化参数,等价于<init-param>标签。
asyncSupportedboolean声明servlet是否支持异步操作模式,等价于<async-supported>标签。
displayNameStringservlet的显示名,等价于<display-name>标签。
descriptionStringservlet的描述信息,等价于<description>标签。

@MultipartConfig 注解

注解配置样例 @MultipartConfig(location="c:/workspace")

属性名类型属性描述
fileSizeThresholdint若上传文件大小超过设置门槛,则会先写入缓存文件,默认值为 0
locationString设置写入文件时的目录,可搭配 Part 的 write() 方法用,默认为空字符
maxFileSizelong限制上传文件大小,默认值为 -1L,表示不限大小。
maxRequestSizelong限制 multipart/form-data 请求个数,默认值为 -1L,表示不限个数。

使用 web.xml

文件位于 WEB-INF 文件夹内。web.xml 中的设置会覆盖 Servlet 中的标注设置。

  • 定义 Servlet 的属性
<servlet>
    <servlet-name>HelloServlet</servlet-name> <servlet-class>cc.openhome.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> <servlet> 
  • 定义 Servlet 的映射
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloUser.view</url-pattern> </servlet-mapping> 
  • 定义欢迎页面
<welcome-file-list>
    <welcome-file>index.html</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> 
  • 定义 @MultipartConfig 对应的信息,将 <multipart-config> 加到对应的 <servlet> 标签中
<multipart-config>
    <location>c:/workspace</location> </multipart-config> 
  • 定义默认的区域与编码的对应关系(例如默认将中国大陆对应使用 UTF-8 )
<locale-encoding-mapping-list>
    <locale-encoding-mapping>
        <locale>zh_CN</locale> <encoding>UTF-8</encoding> </local-encoding-mapping> <locale-encoding-mapping-list> 
  • 设置文件后缀名与 MIME 类型的对应关系 (可以通过 servletContext 的 getMimeType() 方法获得)
<mime-mapping>
    <extension>pdf</extension> <mime-type>application/pdf</mime-type> </mime-mapping> 
  • 设置 HttpSession 的失效时间 (单位为秒)
<session-config>
    <session-timeout>30</session-timeout> </session-config> 
  • 在 web.xml 中设定 SessionCookieConfig 信息
<session-config>
    <session-timeout>30</session-timeout> <cookie-config> <name>sid-caterpillar</name> <http-only>true</http-only> </cookie-config> </session-config> 

URL 模式设置

一个请求 URI 实际上由三个部分组成:

requestURI = contextPath + servletPath + pathInfo

URL 模式 (如果模式匹配重复,则默认按照最严格的模式优先):

  • 路径映射 如 "/guest/*
  • 扩展映射 如 "*.view"
  • 环境根目录映射 如 "/"
  • 预设 Servlet 当找不到合适的 URL 模式对应时,就会使用预设 Servlet。
  • 完全匹配 如 "/guest/test.view"

请求对象编码详解

  • Web 容器默认编码处理是 ISO-8859-1
  • POST 方式的请求,可以使用 request.setCharacterEncoding() 方法指定编码
  • GET 方式的请求,可以以下方式来指定编码 ( 因为 setCharacterEncoding 只对 body 有效,对 URI 无效 )
    String name = request.getParameter("name");
    String name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); 
  • 和前端协商好编码的类型,以此确定服务器端的解码类型。

HttpServletRequest

代表 Http 请求报文的类

方法方法签名方法功能
getParameterjava.lang.String getParameter(java.lang.String name)返回请求参数,如果不存在则返回 null
getRequestURIjava.lang.String getRequestURI()获取请求 URI
getContextPathjava.lang.String getContextPath()获取环境路径 contextPath
getServletPathjava.lang.String getServletPath()获取 Servlet 路径
getPathInfojava.lang.String getPathInfo()获取路径信息
getParameterValuesjava.lang.String[] getParameterValues(java.lang.String name)获取同一请求名称的多个值
getParameterMapjava.util.Map<java.lang.String,java.lang.String[]> getParameterMap()将请求参数以 Map 形式返回
getHeaderjava.lang.String getHeader(java.lang.String name)返回 Http 请求首部
getHeadersjava.util.Enumeration<java.lang.String> getHeaders(java.lang.String name)返回同一首部参数的多个值
getHeaderNamesjava.util.Enumeration<java.lang.String> getHeaderNames()返回所有 Http 首部参数名
getDateHeaderlong getDateHeader(java.lang.String name)将 Http 首部特定参数的值转换为 Date 的值
getIntHeaderint getIntHeader(java.lang.String name)将 Http 首部特定参数的值转换为 int
getReaderjava.io.BufferedReader getReader()取得 BufferedReader 来读取请求的 Body 数据
getInputStreamServletInputStream getInputStream()返回请求报文主体的二进制字节数据
getRequestDispatcherRequestDispatcher getRequestDispatcher(java.lang.String path)获得请求分配器,可以转发或包含相对的 URL 地址
getLocalejava.util.Locale getLocale()获取地区信息
  • 若使用 Servlet 处理上传的文件,可以使用 Java IO 结合 getInputStream()。判断上传的文件的开始位置和结束位置,然后用字节流写为文件。
  • 若使用 Servlet 处理上传的文件,也可以使用 getPart()、getParts() 方法。
  • 使用 RequestDispatcher.include() 可以把其它 servlet 的操作流程包含到当前的 servlet 操作流程之中。

HttpServletResponse

代表 Http 响应报文的类

方法方法签名方法功能
getWriterjava.io.PrintWriter getWriter()取得响应输出对象
setContentTypevoid setContentType(java.land.String type)设置响应内容类型
setHeadervoid setHeader(java.lang.String name, java.lang.String value)设置特定响应标头的值
addHeadervoid addHeader(java.lang.String name, java.lang.String value)添加响应标头的名称和值
setIntHeadervoid setIntHeader(java.lang.String name, int value)如果对应标头的值是整数,可用此方法设置
setDateHeadervoid setDateHeader(java.lang.String name, long date)如果对应标头的值是日期,可用此方法设置
addIntHeadervoid addIntHeader(java.lang.String name, int value)如果对应标头的值是整数,可用此方法添加
addDateHeadervoid addDateHeader(java.lang.String name, long date)如果对应标头的值是日期,可用此方法添加
setLocalevoid setLocale(java.util.Locale loc)设置地区以及编码行为
setCharacterEncodingvoid setCharacterEncoding(java.lang.String charset)设置字符编码
setContentTypevoid setContentType(java.lang.String type)设置内容类型
getOutputStreamServletOutputStream getOutputStream()取得输出的流对象
sendRedirectvoid sendRedirect(java.lang.String location)在响应中设置状态码 301 以及 Location 标头,浏览器会根据新的 URL 进行重定向
sendErrorvoid sendError(int sc)向浏览器返回错误状态码
sendErrorvoid sendError(int sc, java.lang.String msg)向浏览器返回错误状态码和相关错误信息
  • 容器可以对响应进行缓冲,可以操作 HttpServletResponse 以下有关缓冲的几个方法
    • getBufferSize() 获取缓冲区大小
    • setBufferSize() 设置缓冲区大小,必须在调用 getWriter 之前调用
    • isCommitted() 查看响应是否已经确认
    • reset() 重置所有响应信息,包括标头信息
    • resetBuffer() 重置相应信息,不包括标头信息
    • flushBuffer() 清除所有缓冲区已设置的信息到客户端
  • 容器响应关闭的时机点 (容器关闭会清楚所有的响应内容):
    • Servlet 的 service() 方法已结束,响应的内容长度超过 HttpServletResponse 的 setContentLength() 所设置的长度
    • 调用了 sendRedirect() 方法
    • 调用了 sendError() 方法
    • 调用了 AsyncContext 的 complete() 方法
  • 使用 ServletContext 对象获取当前 Web 应用程序目录内的文件
    • 使用 HttpServlet 的 getServletContext() 获取 ServletContext 对象
    • 使用 ServletContext 的 getResourceAsStream() 方法以串流读取文件
    • 使用 HttpServletResponse 的 getOutputStream() 获取 ServletOutputStream 对象并进行响应输出

会话管理

  1. 使用隐藏域:在 html 表单中使用 type='hidden' 来将数据写入隐藏域
<form action='XXX' method='post'> 隐藏域 <input type='text' name='first' /><br /> <input type='hidden' name='second' value='1' /> <input type='hidden' name='third' value='2' /> <input type='submit' name='page' value='完成' /> </form> 

使用这种方法,可以用 request.getParameters() 等方法获取之前页面中的数据

  1. 使用 Cookie
// 新建 Cookie 对象
Cookie cookie = new Cookie("name", "data"); // 设置 Cookie 有效期 (单位为秒) cookie.setMaxAge(7 * 24 * 60 * 60); // 将 cookie 添加到响应中 response.addCookie(cookie); 

Cookie 可以使用 request.getCookies() 来取得

  1. 使用 URL 重写,即在超链接中包含相关信息,以 url 方式传给 servlet
<a href='search?start=1' />

使用 HttpSession

在 Servlet/JSP 中,如果想进行会话管理,可以使用 HttpServletRequest 的 getSession() 方法取得 HttpSession 对象

HttpSession session = request.getSession();

HttpSession 常用方法及其用途:

  • setAttribute() 设置属性
  • getAttribute() 取得属性
  • invalidate() 注销
  • setMaxInactiveInternal() 设置浏览器多久没有请求应用程序,session 会失效 (单位为秒)

可以使用 ServletContext 的 getSessionCookieConfig() 来取得 SessionCookieConfig 接口的实现

HttpSession 与 URL 重写

因为 HttpSession 的原理是使用 Cookie 存储 Session ID,所以如果用户关掉浏览器接收 Cookie 的功能,就无法使用 Cookie 在浏览器存储 Session ID。如果在用户禁用 Cookie 的情况下,仍然打算使用 HttpSession 来进行会话管理,那么可以搭配 URL 重写。

如果要使用 URL 重写的方式来发送 Session ID,可以使用 HttpServletResponse 的 encodeURL() 协助产生所需的 URL 重写。当容器尝试取得 HttpSession 实例时,如果能从 Http 请求中获得带有 Session ID 的 Cookie ,那么 encodeURL() 将不对 URL 做修改。而如果容器无法取得 Session ID 时 (一般意味着用户禁用了 cookie ),encodeURL() 将会自动产生带有 Session ID 的 URL 重写。

encodeRedirectURL() 可以在浏览器重定向时,在 URL 上显示 Session ID

Servlet 进阶 API

Servlet

  • init() 启动时
  • service() 传入请求和响应对象
  • destroy() 销毁时

ServletConfig

使用 getServletConfig() 获取 ServletConfig 对象

  • getInitParameter(String name) 获取对应的 Servlet 设置参数
  • getInitParameters() 获取全体的 Servlet 设置参数

可以使用 @WebServlet 中的 initParam 属性设置

    initParams={
        @WebInitParam{name="PARAM1",value="VALUE1"),
        @WebInitParam{name="PARAM2",value="VALUE2") } 

ServletContext

使用 getServletContext() 获取 ServletContext 对象

ServletContext 接口定义了运行 Servlet 应用程序环境的一些行为与观点,可以使用 ServletContext 实现对象来取得请求资源的 URL、设置与存储属性、应用程序初始参数以及动态设置 Servlet 实例等。

  1. getRequestDispatcher() 获得请求分发器
  2. getResourcePaths() 获得 Web 应用程序某个目录中有哪些文件
  3. getResourceAsStream() 获得 Web 应用程序某个文件的内容,返回 InputStream
  • ServletContextListener

    • 可以实现这个接口,来在应用程序初始化或销毁时进行自定义操作
    • 可以准备好数据库连接,读取应用程序设置等
    • 使用 @WebListener 标注
    • contextInitialized()
    • contextDestroyed()
  • ServletContextAttributeListener

    • attributeAdded()
    • attributeRemoved()
    • attributeReplaced()
  • HttpSession 事件、监听器

    • HttpSessionListener
      • SessionCreated()
      • SessionDestroyed()
    • HttpSessionAttributeListener
      • attributeAdded()
      • attributeRemoved()
      • attributeReplaced()
    • HttpSessionBindingListener
      • valueBound()
      • valueUnbound()
    • HttpSessionActivationListner
      • sessionWillPassivate()
      • sessionDidActivate()
  • HttpServletRequest 事件、监听器

    • ServletRequestListener
      • requestDestroyed()
      • requestInitialized()
    • ServletRequestAttributeListener()
      • attributeAdded()
      • attributeRemoved()
      • attributeReplaced()
  • 过滤器

    • 可以通过实现 Filter 接口,并使用 @WebFilter 标注或在 web.xml 中定义过滤器。
    • Filter 接口有三个要实现的方法:
      • public void init(FilterConfig filterConfig)
      • public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      • public void destroy()
    • chain.doFilter(request, response); 前执行的代码为 service() 前执行的代码,后执行的代码为 service() 后执行的代码
    • @WebFilter(filterName="XXX", urlPatterns={"XXX"})
    <filter>
        <filter-name>performance</filter-name> <filter-class>cc.openhome.PerformanceFilter</filter-class> </filter> <filter-mapping> <filter-name>performance</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 
    • 可以继承 HttpServletRequestWrapper 来对 HttpServletRequest 类进行处理,然后再再 doFilter 中传入 service()
    • 可以继承 HttpServletResponseWrapper 来对 HttpServletResponse 类进行处理。一般会在压缩输出中用到。
  • 异步处理 AsyncContext

    • 要使用 @WebServlet 注解告诉容器此 Servlet 支持异步处理 asyncSupported=true



作者:EdwardLiuAurora
链接:https://www.jianshu.com/p/d6e8b1483083

转载于:https://www.cnblogs.com/learn-zy/p/10382230.html

相关文章:

  • C# 函数1 (函数的定义)
  • XSS 漏洞介绍
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • 端性能优化方法
  • JAVA之Break Continue 浅析
  • [SRM603] WinterAndSnowmen
  • JS高级学习笔记(1)- 基本数据类型 和 强制类型转换
  • 记账程序及GitHub学习记录
  • 尾调用和尾递归
  • AccessTokenValidation3 源码分析 jwttoken验证流程图
  • luogu P3312 [SDOI2014]数表
  • Cron表达式以及定时任务配置
  • android热修复--Tinker
  • csv文件读写处理
  • 友链
  • 收藏网友的 源程序下载网
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • android 一些 utils
  • create-react-app项目添加less配置
  • HashMap剖析之内部结构
  • HTML中设置input等文本框为不可操作
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 最常见的 200+ 面试题:面试必备
  • js 实现textarea输入字数提示
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Mysql优化
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • webpack入门学习手记(二)
  • Windows Containers 大冒险: 容器网络
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 精彩代码 vue.js
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端路由实现-history
  • 设计模式 开闭原则
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 学习笔记TF060:图像语音结合,看图说话
  • 一道闭包题引发的思考
  • 译自由幺半群
  • 转载:[译] 内容加速黑科技趣谈
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (Java)【深基9.例1】选举学生会
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (windows2012共享文件夹和防火墙设置
  • (办公)springboot配置aop处理请求.
  • (多级缓存)多级缓存
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)php投票系统 毕业设计 121500
  • (十三)Maven插件解析运行机制
  • (十一)c52学习之旅-动态数码管