response对象
- 响应对象: HttpServletResponse
- 响应行: 状态码
- 响应头: Map set-cookie
- 响应体: 输出流, write/println写出到response缓冲区
response缓冲区默认ISO8859-1字符集
response.setContentType(“text/html;charset=utf-8”);
常见状态码
- 200 - 正常返回响应
- 404 - 资源未找到, 1.浏览器中地址写错 2.地址对应的资源不存在
- 500 - 代码出现异常
- 405 - 服务方法出错 service, doGet, doPost
- 304 - 访问缓存
- 302 - 重定向
重定向
特点
1.客户端发送了两次请求
2.浏览器地址栏会发生改变, 变成第二次请求地址
3.不能使用request域来分享数据
重定向适用场景:
第一个资源已经做完了一件事情, 需要做下一件事情
@WebServlet("/Demo03Servlet")
// 1.设置响应行信息 - 状态码 为重定向
response.setStatus(302);
// response.setHeader("name", "zhangsan");
// 2.设置响应头内容 - 重定向地址
// response.setHeader("location", "http://www.baidu.com");
response.setHeader("location", "/web03_war_exploded/Demo01Servlet");
// 重定向后, 代码也不会执行
response.sendRedirect(“url/uri”)
@WebServlet("/Demo04Servlet")
// 获得虚拟目录
String path = request.getContextPath();
// 重定向
response.sendRedirect(path + "/Demo01Servlet");
获得字符、字节输出流getWriter()
// 获得字符输出流 -> 输出内容, 页面内容
PrintWriter writer = response.getWriter();
// 获得字节输出流 -> 复制文件, 文件下载
// ServletOutputStream out = response.getOutputStream();
// 两种输出流只能选择一种来使用, 不需要手动关闭流
设置response响应类型
// 设置response缓冲区字符集
//response.setCharacterEncoding("UTF-8");
// 告诉客户端响应体类型, 解析方式
response.setContentType("text/html;charset=utf-8");
// 获得字符输出流 -> 输出内容, 页面内容
PrintWriter writer = response.getWriter();
writer.println("<h1>Demo06Servlet字符流的println方法</h1>");
writer.write("<h1>Demo06Servlet字符流的write方法</h1>");
案例
图片验证码
通过response的输出流, 写出一张图片
<script>
$(function(){
$("#checkCode").click(function() {
// $("#checkCode").prop("src", "/web03/CheckImgServlet")
this.src = "/day03_war_exploded/CheckImgServlet?random=" + Math.random();
});
});
</script>
验证码: <input type="text" name="check_code"/>
<img id="checkCode" src="/day03_war_exploded/CheckImgServlet"/><br/>
文件下载——字节流
getOutputStream()
.txt .jpg .zip .mp3 .mp4 .flv
1.超链接的方式: 浏览器能解析的文件就会直接显示, 不能解析的才会下载
2.通过Servlet方式下载:
1.response.getOutputStream()
输入流: 文件路径 - application.getRealPath()
2.设置响应内容类型 MIME Type
根据文件的后缀名自动识别 application.getMimeType("xx.zip");
text/html tomcat/conf/web.xml
@WebServlet("/DownloadServlet")
// 1.获得要下载的文件名
String filename = request.getParameter("filename");
// filename乱码处理
// filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");
// 2./Download/filename
// 创建文件对应的输入流
String path = this.getServletContext().getRealPath("/Download/"+filename);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(path));
// 3.1 告诉客户端响应的文件类型, 通过后缀名获得文件类型
// this.getServletContext().getMimeType(filename);
response.setContentType(this.getServletContext().getMimeType(filename));
// 浏览器响应头不支持中文, 需要处理filename
String agent = request.getHeader("user-agent");
String newName = DownLoadUtils.getFileName(agent, filename);
// 3.2 设置响应头, 告诉客户端文件是以附件形式打开 - 下载
response.setHeader("Content-Disposition","attachment;filename="+newName);
// 3.获得响应对应的输出流
OutputStream out = response.getOutputStream();
// 4.复制文件
byte[] bs = new byte[1024];
int len;
while((len = in.read(bs)) != -1) {
out.write(bs, 0, len);
}
in.close();
}
路径问题
绝对路径 /xx: 绝对路径URI http://xxx: 绝对路径URL
URL: 给客户端使用, 客户端访问服务器时必须使用的路径
例如: form action="url"
a href="url"
img src="url"
link href="url"
script src="url"
重定向: url
URI: 给客户端使用可以用URI, 或者给服务器使用必须用URI
给服务器使用: 转发, 不需要使用虚拟目录
给客户端使用: 必须加虚拟目录
如果客户端通过URI来访问服务器, 会将URI拼接成URL
资源在同一个服务器中, 可以将URL简化成URI
http://localhost:8080/web03/form.html
/web03/CheckImgServlet
不在同一个服务器中, 只能填完整的URL
http://www.baidu.com
应用的绝对路径:
cookie
客户端技术, 不安全[客户端可以删除,查看], 减轻服务器压力
在会话期间, 存储数据
会话技术
一次会话: 客户端连接上服务器开始, 客户端退出结束,会产生多次请求
存储/获取
向客户端存储cookie
response.addCookie(cookie) - 本质是response.setHeader(“set-cookie”)
@WebServlet("/Demo07Servlet")
// 3.将数据存储在cookie中, 通过response对象
// a.创建cookie对象 String-String类型的键值对
Cookie cookie = new Cookie("name", "zhangsan");
// 设置cookie的持久化时间
cookie.setMaxAge(60*5);
// 设置cookie的携带路径,
// 设置cookie在访问Demo08Servlet的时候才会携带到服务器
// cookie.setPath("/web03/Demo08Servlet");
// 设置cookie在访问/web03应用中所有的资源都会携带到服务器
// cookie.setPath("/web03/");
// 设置cookie在访问这个服务器中所有的资源时,都会携带到服务器
// cookie.setPath("/");
// b.通过response将cookie传递给客户端
// 本质是通过响应头set-cookie,把数据传递给客户端的
response.addCookie(cookie);
response.getWriter().write("success");
从客户端获取cookie
request.getCookies() - 本质是request.getHeader(“cookie”)
它会将客户端携带过来的cookie全部获得
@WebServlet("/Demo08Servlet")
// 2.通过请求对象获得cookie
// 将客户端携带过来的cookie全部获得
Cookie[] cookies = request.getCookies();
if (cookies != null) {
String name = cookies[0].getName();
String value = cookies[0].getValue();
response.getWriter().write("success: " + name + "," + value);
} else {
response.getWriter().write("cookie is null");
}
生命周期、持久化
cookie默认的生命周期: new 开始, 到会话结束
设置持久化时间
cookie.setMaxAge(int 秒);
设置时间=0, 立即删除
设置时间=-1, 恢复默认
携带路径
cookie.setPath(): / -> 当前服务器所有资源
/web03 -> 当前应用所有资源
/web03/Demo08Servlet -> 单纯只有Demo08Servlet资源
默认: 当前目录
set-cookie的资源路径: http://localhost:8080/web03/cookie/Demo07Servlet
小结
- 存储一定是响应,获取一定是请求
- 只有当cookie的name和path一致的时候才会认为是同一个cookie
Cookie c1 = new Cookie("name","zhangsan");
Cookie c2 = new Cookie("name","zhangsan);
c2.setPath("/");