HttpServletResponse学习笔记

1.HttpServletResponse概述

创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的response的类型是ServletResponse,doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口。

2.response的运行流程

在这里插入图片描述

3.通过抓包工具抓取Http响应

在这里插入图片描述

通过response设置响应行
设置响应行的状态码
setStatus(int sc)

通过response设置响应头
addHeader(String name, String value)
addIntHeader(String name, int value)
addDateHeader(String name, long date)
setHeader(String name, String value)
setDateHeader(String name, long date)
setIntHeader(String name, int value)

其中,add表示添加,而set表示设置

4.通过response设置响应体

(1)响应体设置文本
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

关于设置中文的乱码问题
原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(String charset) 设置response的编码

但我们发现客户端还是不能正常显示文字
实际开发中只要编写 response.setContentType(“text/html;charset=UTF-8”);就可以解决页面输出中文乱码问题。

(2)响应头设置字节
ServletOutputStream getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

5.文件下载

文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需 要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中

代码如下:


	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//*******文件名称是中文的下载*******


		//获得要下载的文件的名称
		String filename = request.getParameter("filename");//????.jpg
		//解决获得中文参数的乱码----下节课讲
		filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg

		//获得请求头中的User-Agent
		String agent = request.getHeader("User-Agent");
		//根据不同浏览器进行不同的编码
		String filenameEncoder = "";
		if (agent.contains("MSIE")) {
			// IE浏览器
			filenameEncoder = URLEncoder.encode(filename, "utf-8");
			filenameEncoder = filenameEncoder.replace("+", " ");
		} else if (agent.contains("Firefox")) {
			// 火狐浏览器
			BASE64Encoder base64Encoder = new BASE64Encoder();
			filenameEncoder = "=?utf-8?B?"
					+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
		} else {
			// 其它浏览器
			filenameEncoder = URLEncoder.encode(filename, "utf-8");				
		}



		//要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
		response.setContentType(this.getServletContext().getMimeType(filename));
		//告诉客户端该文件不是直接解析 而是以附件形式打开(下载)----filename="+filename 客户端默认对名字进行解码
		response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);

		//获取文件的绝对路径
		String path = this.getServletContext().getRealPath("download/"+filename);
		//获得该文件的输入流
		InputStream in = new FileInputStream(path);
		//获得输出流---通过response获得的输出流 用于向客户端写内容
		ServletOutputStream out = response.getOutputStream();
		//文件拷贝的模板代码
		int len = 0;
		byte[] buffer = new byte[1024];
		while((len=in.read(buffer))>0){
			out.write(buffer, 0, len);
		}

		in.close();
		//out.close();

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方 式。
1)告知浏览器文件的类型:response.setContentType(文件的MIME类型);
2)告示浏览器文件的打开方式是下载:
response.setHeader(“Content-Disposition”,“attachment;filename=文件名称”);
如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一 个属性可以辨别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpServletResponse是Java Servlet API中的一个接口,它用于封装HTTP响应的功能。它提供了一系列方法来设置和获取响应的状态码、头部信息和实体内容等。 在给定的引用内容中,有两个示例代码片段分别创建了一个名为RedirectServlet和一个名为RequestTest的类,这两个类都继承自HttpServlet类,并且都重写了doGet和doPost方法。这些方法接收HttpServletRequest和HttpServletResponse对象作为参数,其中HttpServletResponse对象用于设置和发送HTTP响应。 在RedirectServlet的doGet方法中,使用resp.sendRedirect方法进行重定向。该方法将客户端的请求重定向到指定的URL。在这个示例中,重定向的目标URL是"/response_war_exploded/img"。 在RequestTest的doGet方法中,并没有对HttpServletResponse进行操作,只是简单地打印一条消息。 综上所述,HttpServletResponse主要用于设置和发送HTTP响应,其中包括设置重定向、设置状态码、设置头部信息等功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [HttpServletResponse详解](https://blog.csdn.net/weixin_59448049/article/details/126363819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值