上一次写到 Servlet 的实现方法, 主要还是通过继承 HttpServlet 来实现 Servlet. 下面主要是回顾一下 HttpServletRequest 和 HttpServletResponse 对象中的一些方法. 因为 web 服务器收到客户端的 http 请求, 会针对每一次请求创建一个用于代表请求的 request 的对象, 和代表响应的 response 对象.
1.HttpServletResponse
设置响应状态码: setStatus(int )
请求重定向: sendRedirect(String location)
设置响应消息头: setHeader(String name, String value)
eg, response.setHeader("content-type","text/html;charset=UTF-8")
告知浏览器使用什么码表, 即让浏览器用 UTF-8 来解析返回的数据
设置服务器端编码: setCharacterEncoding(String charset)
eg, response.setCharacterEncoding("UTF-8");
告知服务器 (servlet) 用 UTF-8 来转码, 而不是用 ISO-8859-1(服务器端默认编码)
设置客户端和服务器端编码: setContentType(String charset)
setHeader 和 setCharacterEncoding 的优化, 同时告诉客户端和服务器端使用什么格式的编码.
获得字符输出流: getWrite()
获得字节输出流: getOutputStream()// 注意编码
2.HttpServletRequest
获得请求方式: getMethod();//post or get
获得客户端发出请求时完整的 url:getRequestURL();
获得请求行中的 uri:getRequestURI();
获得当前应用的虚拟目录: getContextPath();
获得请求行中的参数部分: getQueryString();
根据请求消息头的名称获得其对应的值: getHeader(String name);
以下是关于请求正文方面的方法, 比较重要
<input type="text" name="username"/>
getParameter(String name); 根据表单中 name 属性的名, 获取 value 值
getParameterValues(String name)为复选框提供的获得值得方法
getParameterNames(); 获取表单提交的所有 name 名称
getParameterMap(); 得到表单提交的所有的键值
因为 request 也是一个域对象, 所以有以下方法
- setAttribute(String name, Object value);
- getAttribute(String name);
- removeAttribute(String name);
请求转发相关:(注意: 请求转发不能转发到其他路径, 必须是本项目之下的, 而重定向可以到其他路径)
- getRequestDispatcher(String path)// 获得一个 RequestDispatcher 对象
- forword(ServletRequest , ServletResponse )// 转发
- include(ServletRequest , ServletResponse )// 请求包含
解决 post 方式编码问题:
request.setCharacterEncoding("UTF-8");// 告诉服务器要使用什么编码, 注: 浏览器是用什么编码传到服务器端就是什么编码
解决 get 方式编码问题:
- byte b[] = name.getBytes("ISO-8859-1");//1010101
- String name = new String(b,"UTF-8");// 解决
即: String name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
以下回顾 Cookie 和 Session.
3.Cookie
cookie 是 servlet 发送到 Web 浏览器的少量信息, 这些信息由浏览器保存, 然后发送回服务器. cookie 的值可以唯一的标识客户端. 因此, cookie 常用于会话管理. 一个 cookie 拥有一个键, 值和一些可选属性(注释, 路径, 域限定符, 版本号).Servlet 通过视同 HttpServletResponse 的 addCookie 方法, 将创建的 cookie 发送到客户端浏览器, 该方法将字段添加到 HTTP 响应头, 以便于一次一个地将 cookie 发送到浏览器. 而客户端浏览器通过向 HTTP 响应头添加字段将 cookie 返回给服务器端(即 servlet), 可使用 HttpServletRequest 的 getCookie 方法从请求中获取 cookie. 注意, 一些 cookie 可能有相同的键, 但却有不同的路径属性.
属性:
(1)name: 相当于键. 名称不能唯一确定一个 Cookie. 因为 cookie 的路径可能不同.
(2)value: 值.
(3)path: 默认值是写 cookie 所在的应用程序的访问路径.(客户端在访问服务器资源时, 根据访问的路径决定是否带着 cookie 到服务器, 如果访问的路径是以 cookie 所在的 path, 就带着 cookie, 否则不带).
(4)maxAge:cookie 的缓存时间. 默认 - 1(存在浏览器的内存中). 通过 setMaxAge(int )来设置缓存时间.(可实现记住用户的功能)
负数: cookie 的数据存在浏览器缓存中
0: 删除.
整数: 缓存到磁盘上的时间.(单位 s)
4.Session
session 也是一个域对象.(目前已知的域对象: ServletContext,request,Session).sesseion 可以使处在同一个会话下的应用共享数据. cookie 是客户端技术, 只能存字符串. HttpSession 是服务器端技术, 可以存对象.
通过 getSession()获得 Session 对象.
HttpSession request.getSession()内部执行原理:
(1)获取名称为 JSESSIONID 的 cookie 的值.(session 是依赖于 cookie 的)
(2)如果没有这样的 cookie, 就创建一个新的 httpsession 对象, 并分配一个唯一的 SessionID, 并向客户端返回一个键值为 JSESSIONID=SessionID 的 cookie.
(3)如果有这样的 cookie, 获取 cookie 的值(即 HttpSession 对象的值), 从服务器内存中根据 ID 找到 HttpSession 对象.
找到了: 取出来继续服务.
找不到: 从 (2) 开始.
方法:
- setAttribute(String )
- getAttribute(String )
来源: https://www.cnblogs.com/sy-deku/p/9728322.html