servlet
HttpServletResponse对象
简介
HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将 Web 服务器处理后的
结果返回给客户端。service()方法中形参接收的是 HttpServletResponse 接口的实例化对象,这个对象
中封装了向客户端发送数据、发送响应头,发送响应状态码的方法
常用方法
常用方法 | 描述 |
---|---|
addHeader(String name, String value) | 添加指定的键值到响应头信息中 |
containsHeader(String name) | 判断响应的头部是否被设置 |
encodeURL(String url) | 编码指定的 URL |
sendError(int sc) | 使用指定状态码发送一个错误到客户端 |
setHeader(String name, String value) | 设置指定响应头的值 |
setStatus(int sc) | 给当前响应设置状态 |
setContentType(String ContentType) | 设置响应的 MIME 类型 |
getWriter() | 获取输出字符流 |
getOutputStream() | 获取输出的字节流 |
乱码问题
getWriter()的字符乱码
对于 getWriter() 获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用ISO-8859-1 格式的编码,该编码方式并不支持中文。所以要解决该种乱码只能在服务器端告知服务器使用一种能够支持中文的编码格式,比如我们通常用的“UTF-8” resp.setCharacterEncoding(“UTF-8”);,此时还只完成了一半的工作,要保证数据正确显示,还需要指定客户端的解码方式resp.setHeader(“content-type”, “text/html;charset=UTF-8”);,和服务器一致。两端指定编后,乱码就解决了。一句话:保证发送端和接收端的编码一致 。
resp.setCharacterEncoding("UTF-8");
resp.setHeader("content-type", "text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.write("<h1>hello response</h1>");
以上两端编码的指定也可以使用一句替代,同时指定服务器和客户端
resp.setContentType("text/html;charset=utf-8");
重定向跳转
重定向是一种服务器指导客户端的行为。客户端发出第一个请求,被服务器接收,经过处理服务器
进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect(“url”);),当客
户端接收到响应后,立刻、马上、自动根据服务器给的地址进行第二个请求的发送,服务器接收请求并
作出响应,重定向完成。从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。实现方
式如下:
resp.sendRedirect("index.html")
请求时的路径问题
在请求资源时,必须给出正确的路径,否则是找不到资源的。路径分为相对路径和绝对路径,绝对
路径可简单理解为完整路径,在 web 项目中绝对路径分两种,一种是以 http:// 开头的,该种绝对路径
已经跨域,即任何地方的资源都能访问,另一种则是从当前域名|IP|主机后的端口号开始的,不能跨
域,也属于一种绝对路径。相对路径则就是相对当前资源所在路径。
我们学的所有的请求可以分为客户端和服务器端请求两类(不考虑ajax);
相对路径
书写路径时,无论是哪类请求相对路径都是相对当前资源的路径
书写格式:直接从当前路径开始写,目录前不加任何符号;a.html html/b.html
相对路径在请求转发时可能会失效,因此开发中不推荐使用相对路径
绝对路径
使用绝对路径时则有两种方式,以 http:// 开头,或者以 / 开头,但是注意:只有客户端跳转才能
使用 http:// 这种方式,此时需要写出资源的完整路径;另一种以 / 开头的绝对路径,则是绝对到端口
后,例如本机则是:http://localhost:8080 此时则是 / 代表以上一串字符。 /helloworld/a.html → htt
p://localhost:8080/helloworld/a.html
浏览器中:“/”代表的是 http://主机|IP:端口
服务器中:“/”代表的是 http://主机|IP:端口/站点名
现在对于我们来说,只有请求转发属于服务器跳转,其他都是客户端跳转。通过观察地址栏状态也
可判定跳转类型(请求类型),地址栏不变 → 服务器端跳转;地址栏改变 → 客户端跳转
Cookie
Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息不需要通过网络输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie 来实现。
Cookie 的创建和发送
// 创建Cookie对象
Cookie cookie = new Cookie("uname", "zs");
// 响应给客户端
resp.addCookie(cookie);
Cookie 的获取
// 获取客户端的Cookie数组
Cookie[] cookies = req.getCookies();
// 判断是否为空
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("键:" + name + ",值:" + value);
}
}
Cookie 到期时间的设定
cookie的到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int expiry); 方法设定 cookie 的最大有效时间,以秒为单位。
大于 0 的整数,表示存储的秒数;若为负数,则表示不存储该 cookie;若为 0,则删除该cookie。
负整数:
cookie 的 maxAge 属性的默认值就是 -1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
正整数:
表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。
零:
cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0) 来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。