#博学谷IT学习技术支持#
个人笔记后续会进行内容改进
request:获取请求数据
## 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()
String method = req.getMethod();
System.out.println(method);
System.out.println("===============");
String path = req.getContextPath();
System.out.println(path);
System.out.println("===============");
StringBuffer url = req.getRequestURL();
System.out.println(url);
System.out.println("===============");
String requestURI = req.getRequestURI();
System.out.println(requestURI);
System.out.println("===============");
String string = req.getQueryString();
System.out.println(string);
## 2、获取请求头:
String getHeader(String name)
## 3、获取请求体:
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:
* 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
* xServletInputStream getInputStream()该方法可以获取字节
* 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
* BufferedReader getReader()
接下来,大家需要思考,要想获取到请求体的内容该如何实现?
## 遍历的快捷方式iter!!!!!!
## 4、request通用方法:
request对象为我们提供了如下方法:
* 获取所有参数Map集合
* Map<String,String[]> getParameterMap()
* 根据名称获取参数值(数组)
* String[] getParameterValues(String name)
* 根据名称获取参数值(单个值)
* String getParameter(String name)
Map<String, String[]> map = req.getParameterMap();
for (String k : map.keySet()) {
System.out.print(k+":");
String[] vs = map.get(k);
for (String v : vs) {
System.out.print(v);
}
System.out.println();
}
System.out.println("===========");
String[] hobies = req.getParameterValues("hoby");
for (String hoby : hobies) {
System.out.println(hoby);
}
System.out.println("===========");
System.out.println(req.getParameter("name"));
System.out.println(req.getParameter("pass"));
上面说的是哪个放在在request和response中通用,不过为了避免代码重复
可以在response中用一行代码解决上述问题
this.doGET() 在response中引用request的方法
this.doGet(req,resp);
## 5、解决中文乱码问题的代码(TOMCAT8之后就把get的解码设为utf-8)
* GET请求获取请求参数的方式是`request.getQueryString()`
* POST请求获取请求参数的方式是`request.getReader()`
### 5.1、解决post乱码:
* 分析出现中文乱码的原因:
* POST的请求参数是通过request的getReader()来获取流中的数据
* TOMCAT在获取流的时候采用的编码是ISO-8859-1
* ISO-8859-1编码是不支持中文的,所以会出现乱码
* 解决方案:
* 页面设置的编码格式为UTF-8
* 把TOMCAT在获取流数据之前的编码设置为UTF-8
* 通过request.setCharacterEncoding("UTF-8")设置编码,UTF-8也可以写成小写
**request.setCharacterEncoding("utf-8")是设置request处理流的编码**
### 5.2解决get乱码/post乱码通用方法:
分析出现中文乱码的原因:
(1)浏览器通过HTTP协议发送请求和数据给后台服务器(Tomcat)
(2)浏览器在发送HTTP的过程中会对中文数据进行URL==编码==
(3)在进行URL编码的时候会采用页面`<meta>`标签指定的UTF-8的方式进行编码,`张三`编码后的结果为`%E5%BC%A0%E4%B8%89`
(4)后台服务器(Tomcat)接收到`%E5%BC%A0%E4%B8%89`后会默认按照`ISO-8859-1`进行URL==解码==
(5)由于前后编码与解码采用的格式不一样,就会导致后台获取到的数据为乱码。
解决方案:
name =new String(name.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF-8)
byte[] byte= name.getBytes(StandardCharsets.ISO-8859-1)
name= new String(byte,StandardCharsets.UTF-8)
6、request转发:forward
#### 6.1、格式:
request.getrequestdispatcher("/demo6").forward(request,response)
dispatcher 调度转发
dispatcher
#### 6.2、内置三个方法:
setattribute
getattribute
removeattribute
* 存储数据到request域[范围,数据是存储在request对象]中
* void setAttribute(String name,Object o);
* 根据key获取值
* Object getAttribute(String name);
* 根据key删除该键值对
* void removeAttribute(String name);
#### 6.3、特点:
4. 请求转发的特点
* 浏览器地址栏路径不发生变化
虽然后台从`/req5`转发到`/req6`,但是浏览器的地址一直是`/req5`,未发生变化

* 只能转发到当前服务器的内部资源
不能从一个服务器通过转发访问另一台服务器
* 一次请求,可以在转发资源间使用request共享数据
虽然后台从`/req5`转发到`/req6`,但是这个==只有一次请求==
# response:设置响应数据
### yi \重定向格式:两种方法:
1、
response.setstatus(302)
response.heard("location","/linyi/responsedemo2")
2、简化版:
response.sendRedirect("/linyi/responsedemo2")
send redirect重定向
**重定向需要添加虚拟路径**
**转发不需要:**
**其实判断的依据很简单,只需要记住下面的规则即可:**
* **浏览器使用:需要加虚拟目录(项目访问路径)**
* **服务端使用:不需要加虚拟目录**

#### 1、response响应字符流
writer= response.getwriter()
writer.writer("aaaaaaaaa")
#### else:解决response 输出字符流乱码
response.setcontentype("text/html;charset=utf-8") 这行代码是解决字符流乱码
#### 2、response响应字节流
编写一个读取字符流
1)可以编写字节流copyd代码,也可以在pom.xml中添加以来坐标,建议添加
在已有的<dependencies>标签中加入新的<dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2)使用以来中的ioutile。copy方法
IOUtils.copy(inputStream,outputStream);
最后把读取字符流关闭即可