学习笔记——day44(response cookie 重定向)

本文介绍了HttpServletResponse对象的常用方法,包括刷新、页面跳转和数据响应。详细讲解了响应图片和重定向跳转。接着讨论了请求时路径的问题,推荐使用绝对路径。最后深入探讨了Cookie的创建、发送、获取、到期时间设定以及注意事项,包括覆盖机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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>");
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值