Request:获取请求数据Respone:设置响应数据
Request
Request 继承体系
1.Tomcat 需要解析请求数据,封装为 request 对象 ,并且创建 request 对象传递到service对象方法中。
2.使用 request 对象,查阅 JavaEE API文档的 HttpServletRequest 接口。
Request 获取请求数据
请求数据分为 3 部分1.请求行:
获取请求方式: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.请求头
所以根据请求头名称获取对应值的方法为:
String getHeader(String name)
3.请求体
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:
获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()该方法可以获取字节
获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
Request 通过方式获取请求数据
GET 方式String getQueryString()
POST 方式
BufferedReader getReader()
思考:GET 请求方式和 POST 请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet 和doPost 方法内
request对象为我们提供了如下方法:
获取所有参数Map集合
Map<String,String[]> getParameterMap()
根据名称获取参数值(数组)
String[] getParameterValues(String name)
根据名称获取参数值(单个值)
String getParameter(String name)
使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义如下格式:
不管是GET还是POST请求,在发送的请求参数中如果有中文,在后台接收的时候,都会出现中文乱码的问题。
解决方案:
POST:设置输入流的编码
req.setCharacterEncoding("UTF-8");
通用方式(GET/POST):先编码,再解码
new String(username.getBytes("ISO-8859-1"),"UTF-8");
/*** 中文乱码问题解决方案*/@WebServlet("/req4")public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 解决乱码:POST,getReader()//request.setCharacterEncoding("UTF-8");//设置字符输入流的编码//2. 获取usernameString username = request.getParameter("username");System.out.println("解决乱码前:"+username);//3. GET,获取参数的方式:getQueryString// 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1/* //3.1 先对乱码数据进行编码:转为字节数组byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);//3.2 字节数组解码username = new String(bytes, StandardCharsets.UTF_8);*/username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);System.out.println("解决乱码后:"+username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
另外需要说明一点的是Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8
请求转发
请求转发(forward):一种在服务器内部的资源跳转方式。实现方式:
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据:使用 Request 对象
此处主要解决的问题是把请求从/req5
转发到/req6
的时候,如何传递数据给/req6
。
需要使用request对象提供的三个方法:
1.存储数据到request域[范围,数据是存储在request对象]中
void setAttribute(String name,Object o);
2.根据key获取值
Object getAttribute(String name);
3.根据key删除该键值对
void removeAttribute(String name);
请求转发的特点
浏览器地址栏路径不发生变化
虽然后台从/req5
转发到/req6
,但是浏览器的地址一直是/req5
,未发生变化
只能转发到当前服务器的内部资源
不能从一个服务器通过转发访问另一台服务器
一次请求,可以在转发资源间使用request共享数据
虽然后台从/req5
转发到/req6
,但是这个只有一次请求
Respone
Respone 设置相应数据功能介绍
相应数据分为3部分:
1.相应行:
对于响应头,比较常用的就是设置响应状态码:
void setStatus(int sc);
2.相应头:
设置响应头键值对:
void setHeader(String name,String value);
3.响应体:
对于响应体,是通过字符、字节输出流的方式往浏览器写,
获取字符输出流:
PrintWriter getWriter();
获取字节输出流
ServletOutputStream getOutputStream();
Respone完成重定向
重定向(Redirect):一种资源跳转方式
实现方式:
resp.setStatus(302);resp.setHeader("location","资源B的访问路径");//简化重定向方法response.sendRedirect("资源B的访问路径");
重定向的特点:
浏览器地址栏路径发送变化可以重定向到任何位置的资源(服务内容、外部均可)两次请求,不能在多个资源使用request共享数据
路径问题
问题1:明确路径谁实用
浏览器使用:需要加虚拟目录(项目访问路径)服务端使用:不需要加虚拟目录
练习:
<a href='路劲'>
<form action='路径'>
req.getRequestDispatcher(“路径”)resp.sendRedirect(“路径”)
答案:
1.超链接,从浏览器发送,需要加2.表单,从浏览器发送,需要加3.转发,是从服务器内部跳转,不需要加4.重定向,是由浏览器进行跳转,需要加。
动态获取虚拟目录
String contextPath = request.getContextPath();response.sendRedirect(contextPath+"/resp2");
Response 响应字符数据
使用:
通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();通过字符输出流写数据: writer.write("aaa");
注意:
该流不需要关闭,随着相应结束,response对象销毁,该服务器关闭。中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");
Response 响应字符数据
使用:通过Response对象获取字节输出流: ServletOutputStream outputStream = resp.getOutputStream();通过字节输出流写数据: outputStream.write(字节数据);
IOUtils 工具类使用
1.导入坐标
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
2.使用
//fis:输入流//os:输出流IOUtils.copy(fis,os);