在学习下面内容之前,我们先提出两个问题:

  • 什么是请求参数?
  • 请求参数和请求数据的关系是什么?

为了能更好的回答上述两个问题,我们拿用户登录的例子来说明

1.什么是请求参数?

1.1 想要登录网址,需要进入登录页面
1.2 在登录页面输入用户名和密码
1.3 将用户名和密码提交到后台
1.4 后台校验用户名和密码是否正确
1.5 如果正确,则正常登录,如果不正确,则提示用户名或密码错误
上述例子中,用户名和密码其实就是我们所说的请求参数。

2.什么是请求数据?

请求数据则是包含请求行、请求头和请求体的所有数据

3.请求参数和请求数据的关系是什么?

3.1 请求参数是请求数据中的部分内容
3.2 如果是GET请求,请求参数在请求行中
3.3 如果是POST请求,请求参数一般在请求体中
对于请求参数的获取,常用的有以下两种:

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

有了上述的知识储备,我们来实现一个案例需求:
(1)发送一个GET请求并携带用户名,后台接收后打印到控制台
(2)发送一个POST请求并携带用户名,后台接收后打印到控制台
此处大家需要注意的是GET请求和POST请求接收参数的方式不一样,具体实现的代码如下:image.png

  • 对于上述的代码,会存在什么问题呢?1628776252445.png
  • 如何解决上述重复代码的问题呢?1628776433318.png

当然,也可以在doGet中调用doPost,在doPost中完成参数的获取和打印,另外需要注意的是,doGet和doPost方法都必须存在,不能删除任意一个。
==GET请求和POST请求获取请求参数的方式不一样,在获取请求参数这块该如何实现呢?==
要想实现,我们就需要==思考==:
GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种==统一==获取请求参数的方式,从而==统一==doGet和doPost方法内的代码?

解决方案一:image.png

使用request的getMethod()来获取请求方式,根据请求方式的不同分别获取请求参数值,这样就可以解决上述问题,但是以后每个Servlet都需要这样写代码,实现起来比较麻烦,这种方案我们不采用

解决方案二:

request对象已经将上述获取请求参数的方法进行了封装,并且request提供的方法实现的功能更强大,以后只需要调用request提供的方法即可,在request的方法中都实现了哪些操作?
(1)根据不同的请求方式获取请求参数,获取的内容如下:1628778931277.png
(2)把获取到的内容进行分割,内容如下:1628779067793.png
(3)把分割后端数据,存入到一个Map集合中:1628779368501.png
注意:因为参数的值可能是一个,也可能有多个,所以Map的值的类型为String数组。
基于上述理论,request对象为我们提供了如下方法:

  • 获取所有参数Map集合

Map getParameterMap()

  • 根据名称获取参数值(数组)

String[] getParameterValues(String name)

  • 根据名称获取参数值(单个值)

String getParameter(String name)
接下来,我们通过案例来把上述的三个方法进行实例演示:
1.修改req.html页面,添加爱好选项,爱好可以同时选多个image.png1628780937599.png
2.在Servlet代码中获取页面传递GET请求的参数值
2.1获取GET方式的所有请求参数image.png
获取的结果为:1628780965283.png
2.2获取GET请求参数中的爱好,结果是数组值image.png
获取的结果为:image.png
2.3获取GET请求参数中的用户名和密码,结果是单个值image.png
获取的结果为:zhangsan 123
3.在Servlet代码中获取页面传递POST请求的参数值
3.1将req.html页面form表单的提交方式改成post
3.2将doGet方法中的内容复制到doPost方法中即可

小结

  • req.getParameter()方法使用的频率会比较高
  • 以后我们再写代码的时候,就只需要按照如下格式来编写:
    1. public class RequestDemo1 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //采用request提供的获取请求参数的通用方式来获取请求参数
    5. //编写其他的业务代码...
    6. }
    7. @Override
    8. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    9. this.doGet(req,resp);
    10. }
    11. }