Skip to content

Request(请求)&Response(响应)

Request:获取请求数据 Response:设置响应数据

request继承体系

ServletRequestJava提供的请求对象根接口
HttpServletRequestJava提供的对Http协议封装的请求对象接口
RequestFacadeTomcat 定义的实现类

1.Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中

2.使用request对象,查阅JavaEE API文档的HttpServletRequest接

request获取请求数据

1.请求行

请求行包含三块内容,分别是请求方式请求资源路径、HTTP协议及版本

  • 获取请求方式: GET
String getMethod()
  • 获取虚拟目录(项目访问路径): /request-demo
String getContextPath()
  • 获取URL(统一资源定位符): http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
  • 获取URI(统一资源标识符): /request-demo/req1
String getRequestURI()
  • 获取请求参数(GET方式): username=zhangsan&password=123
String getQueryString()

2.请求头

对于请求头的数据,格式为key: value

所以根据请求头名称获取对应值的方法为:

String getHeader(String name)

3.请求体

浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST

对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:

  • 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
该方法可以获取字节
  • 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()

request通用方式获取请求参数

对于请求参数的获取,常用的有以下两种:

  • GET方式:
String getQueryString()
  • POST方式:
BufferedReader getReader();

request对象为我们提供了如下方法:

  • 获取所有参数Map集合
Map<String,String[]> getParameterMap()
  • 根据名称获取参数值(数组)
String[] getParameterValues(String name)
  • 根据名称获取参数值(单个值)
String getParameter(String name)

解决post乱码/解决get乱码

  1. 解决乱码: POST getReader() 设置字符输入流的编码,设置的字符集要和页面保持一致 request.setCharacterEncoding("UTF-8");
  • POST请求和GET请求的参数中如果有中文,后台接收数据就会出现中文乱码问题

    GET请求在Tomcat8.0以后的版本就不会出现了

  • POST请求解决方案是:设置输入流的编码

    request.setCharacterEncoding("UTF-8");
    注意:设置的字符集要和页面保持一致
  • 通用方式(GET/POST):需要先解码,再编码

    new String(username.getBytes("ISO-8859-1"),"UTF-8");
  1. URL编码实现方式:
  • 编码:

    URLEncoder.encode(str,"UTF-8");
  • 解码:

    URLDecoder.decode(s,"ISO-8859-1");

request请求转发(forward)

实现方式 req.getRequestDispatcher("资源B路径").forward(req,resp); 请求转发资源间共享数据:使用Request对象 void setAttribute(String name, Object o):存储数据到 request城中 Object getAttribute(String name):根据 key,获取值 void removeAttribute(String name):根据 key,删除该键值对

特点

请求转发特点 浏览器地址栏路径不发生变化 只能转发到当前服务器的内部资源 一次请求,可以在转发的资源间使用request共享数据

Response

ServletResponseJava提供的请求对象根接口
HttpServletResponseJava提供的对Http协议封装的请求对象
ResponseFacadeTomcat 定义的实现类

设置响应数据

1.响应行

比较常用的就是设置响应状态码:

void setStatus(int sc);

2.响应头

设置响应头键值对:

void setHeader(String name,String value);

2.响应体

对于响应体,是通过字符、字节输出流的方式往浏览器写,

获取字符输出流:

PrintWriter getWriter();

获取字节输出流

ServletOutputStream getOutputStream();

重定向

redirect:一种资源跳转的方式

1.状态码302

2.响应头location:xxx

重定向的实现方式:

resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
重定向特点:请求转发特点
浏览器地址栏路径发生变化浏览器地址栏路径不发生变化
可以重定向到任意位置的资源(服务器内部、外部均可)只能转发到当前服务器的内部资源
两次请求,不能在多个资源使用request共享数据一次请求,可以在转发的资源间使用request共享数据

路径问题

1.浏览器使用:需要加虚拟目录

2.服务端使用:不需要加虚拟目录

Response响应字符数据

1.通过Response对象获取字符输出流 PrintWriter writer = resp.getWriter(); 2.写数据 writer.write("aaa"):

解决中文乱码

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

Response响应字节数据

使用:

1.通过Response对象获取字符输出流 ServletOutputStream outputStream =resp.getOutputStream(); 2.写数据 outputStream.wite(字节数据);

2.简化

(1)pom.xml添加依赖

xml
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

(2)调用工具类方法

//fis:输入流
//os:输出流
IOUtils.copy(fis,os);

Released under 鸢のhomepage