一、HttpServletResponse 对象
1 常用方法
常用方法 | 描述 |
---|---|
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() | 获取输出的字节流 |
2 刷新和页面自动跳转
resp.setHeader("refresh","2");
response.setHeader("refresh","3;URL=ok.html");
推荐下面这种方式
<meta http-equiv="refresh" content="3;http://www.baidu.com" />
3 数据响应
PrintWriter out = resp.getWriter();
out.write("<h1>Hello World</h1>");
ServletOutputStream out = resp.getOutputStream();
out.write("<h1>Hello World</h1>").getBytes());
4 乱码解决
getWriter()的字符乱码
resp.setCharacterEncoding("UTF-8");
resp.setHeader("content-type", "text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.write("<h1>你好啊!!!!</h1>");
或者
resp.setContentType("text/html;charset=utf-8");
getOutputStream()字节乱码
resp.setHeader("content-type", "text/html; charset=UTF-8");
ServletOutputStream out = resp.getOutputStream();
out.write("<h1>你好啊!!!</h1>".getBytes("UTF-8"));
或者
resp.setContentType("text/html;charset=utf-8");
5 响应图片
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 方式一:通过img标签 设置src图片路径
response.setContentType("text/html;charset=utf-8");
//response.getWriter().write("<img src='image/timg.jpg'/>");
// 方式二:通过输入流读取图片,然后通过输出流输出图片
// 获取用户请求图片名称参数
String imageName = request.getParameter("imageName");
// 判断参数
if(imageName == null || "".equals(imageName)){
response.getWriter().write("请告诉我你要看啥图片");
return;
}
// 获取图片路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/image/");
System.out.println(realPath);
System.out.println(realPath + imageName);
// 得到图片
//路径无法确定
//File file = new File("E:/Journey/Mage/class/06middle/code/servletResponse/WebContent/image/timg.jpg");
File file = new File(realPath + imageName);
// 判断是否存在并且是否是文件
if(file != null && file.isFile()){
// 判断用户访问的图片类型 timg.jpg
String imageType = imageName.split("\\.")[1];
if("jpg".equals(imageType) || "jpeg".equals(imageType)){
response.setContentType("image/jpeg;charset=utf-8");
}else if("png".equals(imageType)){
response.setContentType("image/png;charset=utf-8");
}else if("gif".equals(imageType)){
response.setContentType("image/gif;charset=utf-8");
}
// 指定响应类型
//response.setContentType("image/jpeg;charset=utf-8");
// 是文件
// 获取输入流
FileInputStream in = new FileInputStream(file);
// 获取字节输出流
ServletOutputStream out = response.getOutputStream();
// 响应图片
// 创建字节数组
byte[] car = new byte[1024];
int len = 0;
while((len = in.read(car)) != -1){
out.write(car, 0, len);
}
// 关闭
in.close();
out.close();
}else{
// 不是文件或者不存在
response.getWriter().write("请输入正确的图片名称");
return;
}
}
}
6 重定向跳转
resp.sendRedirect("index.html")
请求转发(req.getRequestDispatcher().forward()) | 重定向(resp.sendRedirect()) |
---|---|
一次请求,数据在 request 域中共享 | 两次请求,request 域中数据不共享 |
服务器端行为 | 客户端行为 |
地址栏不发生变化 | 地址栏发生变化 |
绝对地址定位到站点后 | 绝对地址可写到 http:// |
二、请求时的路径问题
相对路径
书写路径时,无论是哪类请求相对路径都是相对当前资源的路径
书写格式:直接从当前路径开始写,目录前不加任何符号;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
浏览器行为
1 Cookie 的创建和发送
// 创建Cookie对象
Cookie cookie = new Cookie("A", "aa");
// 响应给客户端
resp.addCookie(cookie);
2 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); } }
3 Cookie 到期时间的设定
setMaxAge(int expiry);默认单位为秒
负整数:cookie 的 maxAge 属性的默认值就是 -1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
正整数:表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。
零:cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0) 来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
4 Cookie 的注意
Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode() 来进行编码,获取时通过URLDecoder.decode() 来进行解码。
public class Cookie04 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建
// HTTP Status 500 - Cookie name "姓名" is a reserved token
//String uname = URLEncoder.encode("姓名","UTF-8");
//String upwd = URLEncoder.encode("张三","UTF-8");
//System.out.println(uname);
//System.out.println(upwd);
//Cookie cookie = new Cookie(uname,upwd);
//发送
//response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
String uname = URLDecoder.decode(cookie.getName(), "UTF-8");
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
System.out.println(uname + "-" + value);
}
}
}
5 Cookie 的覆盖
如果服务器端发送重复名称且路径一致的 Cookie 那么会覆盖原有的 Cookie。
/**
* 路径 path
* 客户端访问服务器,会将访问路径包含Cookie的Path路径下的所有Cookie都发送到服务器
*/
public class Cookie05 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("c05");
// Path /cookie 默认找当前资源所在路径
Cookie cookie1 = new Cookie("a","1");
// Path / 可以实现 当前服务器下所有项目共享这个Cookie的数据
Cookie cookie2 = new Cookie("b","2");
cookie2.setPath("/");
// path /cookie
Cookie cookie3 = new Cookie("c","3");
cookie3.setPath("/cookie/c02");
Cookie cookie4 = new Cookie("c","4");
cookie4.setPath("/cookie");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
response.addCookie(cookie4);
}
}
作业:打印九九乘法表
public class Servlet01 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.write("<table border='1' style='border-collapse:collapse'>");
for(int i = 1; i <= 9;i++ ){
out.write("<tr>");
for (int j = 1; j <= i; j++) {
out.write("<td>");
out.write(j + " * " + i + " = " + j*i);
out.write("</td>");
}
out.write("</tr>");
}
out.write("</table>");
}
}