JavaEE复习回顾五: HttpServletResponse && HttpServletRequest

目录

一、HttpServletResponse概述

1.1、response的运行流程

1.2通过抓包工具抓取Http响应

1.3、通过response设置响应行

1.4、通过response设置响应头

1.5、通过response设置响应体

1.6、案例-完成文件下载


 

一、HttpServletResponse概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。

1.1、response的运行流程

 

1.2通过抓包工具抓取Http响应

 

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响 应头和响应体

 

1.3、通过response设置响应行

设置响应行的状态码

setStatus(int sc)

 

1.4、通过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表示设置

 

1.5、通过response设置响应体

  • 响应体设置文本

PrintWriter getWriter()

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

 

关于设置中文的乱码问题

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

 

但我们发现客户端还是不能正常显示文字

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系 统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以 手动修改浏览器的编码是UTF-8。

 

我们还可以在代码中指定浏览器解析页面的编码方式,

通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8

response.setContentType("text/html;charset=UTF-8");

 

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding的功能,所以在实际开发中只要编写 ****response.setContentType("text/html;charset=UTF-8");****就可以解决页面输出中文乱码问题。

 

响应头设置字节

ServletOutputStream  getOutputStream()

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

 

1.6、案例-完成文件下载

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

 

代码如下:

上述代码可以将图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上, 而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方 式。

  1. 告知浏览器文件的类型:response.setContentType(文件的MIME类型);
  2. 告示浏览器文件的打开方式是下载:

response.setHeader("Content-Disposition","attachment;filename=文件名称");

 

代码如下:

 

但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一 个属性可以辨别

 

解决乱码方法如下(不要记忆--了解):

1 2if (agent.contains("MSIE")) { 3 4// IE浏览器 5 6filename = URLEncoder.encode(filename, "utf-8"); 7 8filename = filename.replace("+", " "); 9 10} else if (agent.contains("Firefox")) { 11 12// 火狐浏览器 13 14BASE64Encoder base64Encoder = new BASE64Encoder(); 15 16filename = "=?utf-8?B?" 17 18+ base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 19 20} else { 21 22// 其它浏览器 23 24filename = URLEncoder.encode(filename, "utf-8"); 25 26} 27 28 29其中agent就是请求头User-Agent的值 30 31 32

 

 

 

二、HttpServletRequest概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。

 

2.1、request的运行流程

 

2.2、通过抓包工具抓取Http请求

因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体

 

  • 通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:

String getRequestURI() 

StringBuffer getRequestURL() 

String getContextPath() ---web应用的名称

String getQueryString() ---- get提交url地址后的参数字符串

username=zhangsan&password=123

 

注意:request获得客户机(客户端)的一些信息

request.getRemoteAddr() --- 获得访问的客户端IP地址

 

  • 通过request获得请求头

long getDateHeader(String name)

String getHeader(String name)

Enumeration getHeaderNames()

Enumeration getHeaders(String name)

int getIntHeader(String name)

 

referer 头的作用:执行该此访问的的来源

做防盗链( **看我****JavaEE里的文章,有介绍这一个防盗链的 ** )

 

  • 通过request获得请求体

请求体中的内容是通过post提交的请求参数,格式是:

username=zhangsan&password=123&hobby=football&hobby=basketball

key ---------------------- value

username [zhangsan]

password [123]

hobby [football,basketball]

 

 

以上面参数为例,通过一下方法获得请求参数:

String getParameter(String name) 

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

 

 

       注意:get请求方式的请求参数 上述的方法一样可以获得

 

      解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

      解决get提交的方式的乱码:

            parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

 

2.3、request的其他功能

  • request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

注意:request域的作用范围:一次请求中

 

  • request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

****requestDispathcer.****forward(ServletRequest request, ServletResponse response)

 

注意:ServletContext域与Request域的生命周期比较?

  • ServletContext:

创建:服务器启动

销毁:服务器关闭

域的作用范围:整个web应用

  • request:

创建:访问时创建request

销毁:响应结束request销毁

域的作用范围:一次请求中

 

注意:转发与重定向的区别?

1)重定向两次请求,转发一次请求

2)重定向地址栏的地址变化,转发地址不变

3)重新定向可以访问外部网站 转发只能访问内部资源

4)转发的性能要优于重定向

 

 

注意:客户端地址与服务器端地址的写法?

客户端地址:

是客户端去访问服务器的地址,服务器外部的地址,

特点:写上web应用名 称

直接输入地址:

重定向类似

 

 

服务器端地址:

服务器内部资源的跳转的地址,

特点:不需要写web应用的名称

转发类似

 

 

总结:

1request获得行的内容 2 3request.getMethod() 4 5request.getRequestURI() 6 7request.getRequestURL() 8 9request.getContextPath() 10 11request.getRemoteAddr() 12 13request获得头的内容 14 15request.getHeader(name) 16 17request获得体(请求参数) 18 19String request.getParameter(name) 20 21Map<String,String[]> request.getParameterMap(); 22 23String[] request.getParameterValues(name); 24 25注意:客户端发送的参数 到服务器端都是字符串 26

 

获得中文乱码的解决:

1post:request.setCharacterEncoding(“UTF-8); 2 3get: 4 5parameter = new String(parameter.getBytes(“iso8859-1),”UTF-8); 6 7 8request转发和域 9 10request.getRequestDispatcher(转发的地址).forward(req,resp); 11 12request.setAttribute(name,value) 13 14request.getAttribute(name) 15

 

 以上就是我的 request 和 response 一些总结,以后可能还会接着再添加。

 

 

代码交流 2021