0


【JavaWeb】 一文搞懂Request

在这里插入图片描述

文章目录

前言

Request:获取请求数据

Response:设置响应数据

1 Request的继承体系

image-20220910084122159

service(request,response)是由谁创建的?

  • Tomcat。Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。
  • 使用request对象,只需查阅Java EE API文档的HttpServletRequest接口。

2 Request获取请求数据

2.1 请求路径的划分

2.1.1请求行

在这里插入图片描述

2.1.2 请求头

在这里插入图片描述

2.1.3 请求体

Post请求方式,会将相应的参数放到请求体里面。

2.2 常见的请求方式

2.2.1 获取请求行的数据

方法名方法类型方法作用getMethodString获取请求路径的请求方式:如GetPost****getContextPathString获取虚拟目录(资源的访问路径)getRequestURLStringBuffer获取URL(统一资源定位符)getRequestURIString获取URI(统一资源标识符)getQueryStringString获取请求参数(Get方式)
实战

访问一个这样的路径http://localhost:8080/JavaWeb_Demo_05_war/webServlet04?name=zhangsan,我们来打印一下这些方法的效果。

分别对应上述五个方法

在这里插入图片描述

2.2.2 获取请求头的数据

方法名方法类型方法作用getHeader(String name)String根据请求头的名称,获取值

2.2.3 获取请求体的数据

方法名方法类型方法作用getInputStreamServletInputStream获取字节输入流getReaderBufferedReader获取字符输入流

字节流和字符流的区别

Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。二进制数据如图像、多媒体文件和可执行软件代码。

Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。

相应的如果传送的是图像、文件资源,需要用到字节输入流,如果是字符串只需要用到字符输入流。

使用方法注意

使用流读取数据时,分两步:

  • 获取数据
  • 读取数据

代码如下:

/*1、获取数据*/BufferedReader reader = request.getReader();/*2、读取数据*/String s = reader.readLine();System.out.println("获取请求体的数据:"+s);

效果

在这里插入图片描述

获取数据之后,直接输入,则会出现以下的效果

在这里插入图片描述

2.3 通用的请求方式

所谓通用的请求方式,即doGet或者doPost都用一种获取参数的方法,另外一个直接调用另一个即可。

2.3.1通用的请求方法

方法名方法类型方法作用getParameterMapMap<String, String[]>获取所有参数Map集合getParameterValues(String name)String[]根据名称获取参数值(数组)getParameterString根据名称获取参数值(单个值)

2.3.2实战演练

2.3.2.1 首先创建一个html

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><formaction="/JavaWeb_Demo_05_war/demo05"method="post"><inputtype="text"name="username"><br/><inputtype="password"name="password"><br/><inputtype="checkbox"name="hobby"value="1">抽烟
        <inputtype="checkbox"name="hobby"value="2">喝酒
        <inputtype="checkbox"name="hobby"value="3">烫头
        <br/><inputtype="submit"></form></body></html>

2.3.2.2 创建一个Servlet相应

packagecom.you.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.util.Map;@WebServlet(urlPatterns ="/demo05")publicclass webServlet05 extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{/* 1、第一种方法:获取所有的参数Map集合*/Map<String,String[]> parameterMap = req.getParameterMap();for(String key : parameterMap.keySet()){System.out.print(key+":");String[] value = parameterMap.get(key);for(String s : value){System.out.print(s+" ");}System.out.println();}System.out.println("-----------------------------");/* 2、第二种:根据名称获取参数值 */String[] hobbies = req.getParameterValues("hobby");for(String hobby : hobbies){System.out.print(hobby+" ");}System.out.println();System.out.println("-----------------------------");/* 3、第三种:根据名称获取参数值*/String username = req.getParameter("username");System.out.println(username);}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req,resp);}}

2.3.2.3 提交

在这里插入图片描述

2.3.2.4 效果

在这里插入图片描述

3 解决中文乱码的问题

3.1 Post的解决方式

在使用req获取数据之前,加上这一句

req.setCharacterEncoding("UTF-8");

3.2 Get的解决方式

3.2.1 Get产生中文乱码的原因

编解码采用的格式不同

  • 浏览器发送的数据采用的是UTF-8格式
  • Tomcat内部解码采用的是ISO-8859-1的格式

在这里插入图片描述

URL编码规则

  1. 将字符串按照编码方式转为二进制
  2. 每个字节转为2个16进制数并在前面加上%

中文字符占3个字节,而且Tomcat8以后已解决了Get请求乱码的问题

在这里插入图片描述

4 Request请求转发

4.1 请求转发:一种服务器内部的资源跳转方式

在这里插入图片描述
方法名方法类型方法作用getRequestDispatcher(“要转发的资源路径”).forward(req,resp);RequestDispatcher转发的作用:从一个Servlet转到另一个ServletsetAttribute(String name, Object o)void存储到Request域中getAttribute(String name)Object根据key,获取值removeAttribute(String name)void根据key,删除该键值对
getRequestDispatcher()中,要转发的路径直接写Servlet配置的访问路径就好,不需要写’/’

4.2 请求转发的特点

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

4.3 实战举例

demo6设置参数,并转发到demo7,demo7获取参数并输出

packagecom.you.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet("/demo6")publicclass webServlet06 extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{System.out.println("get.....");
        req.setAttribute("hobby","girl");
        req.getRequestDispatcher("demo7").forward(req,resp);}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req,resp);}}
packagecom.you.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet("/demo7")publicclass webServlet07 extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{Object hobby = req.getAttribute("hobby");System.out.println("获取的数据是:"+hobby);System.out.println("get7....");}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{System.out.println("post7...");this.doGet(req,resp);}}
标签: servlet java tomcat

本文转载自: https://blog.csdn.net/m0_59792745/article/details/126800075
版权归原作者 游坦之 所有, 如有侵权,请联系我们删除。

“【JavaWeb】 一文搞懂Request”的评论:

还没有评论