WEB&&request&&response2022-07-11

 #博学谷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`,未发生变化

  ![1628857365153](F:\java\java SE\线路\八周\Request&Response\讲义\assets\1628857365153.png)

* 只能转发到当前服务器的内部资源

  不能从一个服务器通过转发访问另一台服务器

* 一次请求,可以在转发资源间使用request共享数据

  虽然后台从`/req5`转发到`/req6`,但是这个==只有一次请求==

# response:设置响应数据

### yi \重定向格式:两种方法:

1、

response.setstatus(302)

response.heard("location","/linyi/responsedemo2")

2、简化版:

response.sendRedirect("/linyi/responsedemo2")

send redirect重定向

**重定向需要添加虚拟路径**

**转发不需要:**

**其实判断的依据很简单,只需要记住下面的规则即可:**

* **浏览器使用:需要加虚拟目录(项目访问路径)**

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

![image-20220709191205139](C:\Users\as\AppData\Roaming\Typora\typora-user-images\image-20220709191205139.png)

#### 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);

最后把读取字符流关闭即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容