> 文档中心 > Servlet | HttpServletRequest接口、通过request接口获取请求参数

Servlet | HttpServletRequest接口、通过request接口获取请求参数

目录

一:HttpServletRequest接口

二:通过request接口获取请求参数


一:HttpServletRequest接口

(1)HttpServletRequest是一个接口,全限定名称:jakarta.servlet.http.HttpServletRequest

         HttpServletRequest接口是Servlet规范中的一员。

(2)HttpServletRequest接口的父接口:ServletRequest

public interface HttpServletRequest extends ServletRequest {}

(3)HttpServletRequest接口的实现类谁写的? HttpServletRequest对象是谁给创建的?

         ①org.apache.catalina.connector.RequestFacade 实现了 HttpServletRequest接口

         ②Tomcat服务器(WEB服务器、WEB容器)创建了HttpServletRequest接口,只需要面向接口编程,关心HttpServletRequest接口中有哪些方法,这些方法可以完成什么功能

public class RequestFacade implements HttpServletRequest {}

(4)HttpServletRequest对象中都有什么信息?都包装了什么信息?

        ①HttpServletRequest对象是Tomcat服务器负责创建的,这个对象中封装了HTTP的请求协议。

        ②用户发送请求的时候,遵循了HTTP协议,发送的是HTTP的请求协议,Tomcat服务器将HTTP协议中的信息以及数据全部解析出来,然后Tomcat服务器把这些信息封装到HttpServletRequest对象当中,传给javaweb程序员。

        ③javaweb程序员面向HttpServletRequest接口编程,调用方法就可获取到请求的信息。

 (5)request和response对象的生命周期?

        request对象和response对象,一个是请求对象,一个是响应对象;这两个对象只在当前请求中有效;一次请求对应一个request。

二:通过request接口获取请求参数

怎么获取前端浏览器用户提交的数据(和获取用户提交的数据有关系的四个方法)?

        ①Map   getParameterMap()            获取Map
        ②Enumeration   getParameterNames()       获取Map集合中所有的key
        ③String[] getParameterValues(String name)             根据key获取Map集合的value(一般遇到复选框才会使用)
        ④String getParameter(String name)   获取value一维数组当中的第一个元素,实际上大部分数组里就一个元素(常用方法)

(1)在学习这四个方法之前我们先思考一下:如果是自己,前端的form表单提交了数据之后,准备采用什么样的数据结构去存储这些数据呢?不妨写一个简单的例子测试一下:

①RequestTestServlet类继承HttpServlet,重写doPost方法

package com.bjpowernode.javaweb;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;public class RequestTestServlet extends HttpServlet {    @Override    protected void doPost(HttpServletRequest requst, HttpServletResponse response) throws ServletException, IOException { // 先啥都不做,先把程序跑起来    }}

②在web.xml中进行注册

     requestTest com.bjpowernode.javaweb.RequestTestServlet         requestTest /testRequest    

③创建一个register.html,编写表单的注册

        user register

user register

username:
password:
interest: smoke drink tangtou

④启动Tomcat服务器,进行数据的提交,前端提交的数据格式为:

username=root&userpwd=123&aihao=s&aihao=d&aihao=tt key&value&key&value&key&value 的形式

⑤根据提交数据的格式很容易想到使用Map集合来存储,对于存储的类型如果key存储String
    、value存储String;会发现一个致命的问题:对于复选框的内容,key重复的时候value覆盖;所以最终选择key存储String、value存储String[]

Map   keyvalue-------------------------------username{"abc"}userpwd{"111"}aihao{"s","d","tt"}

(2)注意:前端表单提交数据的时候,假设提交了120这样的 “数字”,其实是以字符串 "120" 的方式提交的,所以服务器端获取到的一定是一个字符串的"120",而不是一个数字。(前端永远提交的是字符串,后端获取的也永远是字符串

(3)四个方法详解

Map   getParameterMap()  获取整个Map集合

package com.bjpowernode.javaweb;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;import java.util.Set;public class RequestTestServlet extends HttpServlet {@Override    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // 调用getParameterMap()  获取整个Map集合 Map parameterMap = request.getParameterMap(); // 遍历Map集合(获取Map集合中所有的key) Set keys = parameterMap.keySet(); // 通过迭代器进行遍历 Iterator it = keys.iterator(); while(it.hasNext()){     // 拿到每一个key     String key = it.next();     // System.out.println(key);     // 通过key获取value     String[] values = parameterMap.get(key);     // System.out.println(key+"="+values);     /*      username=[Ljava.lang.String;@6cc12425userpwd=[Ljava.lang.String;@6206c7cdaihao=[Ljava.lang.String;@66394f55// 从输出格式可以看出:value是一个数组     */     System.out.print(key+"=");     // 对数组values进一步遍历     for (String value :values){  System.out.print(value+",");     }     System.out.println();     /*username=root,userpwd=123,aihao=s,d,tt,     */ }    }}

Enumeration   getParameterNames()       获取Map集合中所有的key

package com.bjpowernode.javaweb;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;import java.util.Set;public class RequestTestServlet extends HttpServlet {   @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Enumeration keys = request.getParameterNames(); while(keys.hasMoreElements()){     // 拿到每一个key     String key = keys.nextElement();     System.out.println(key); } /* username userpwd aihao */    }}

String[] getParameterValues(String name)  根据key获取Map集合的value(一般遇到复选框才会使用)

单独使用,拿到三个一维数组,进行遍历

String[] usernames = request.getParameterValues("username");String[] userpwds = request.getParameterValues("userpwd");String[] interests = request.getParameterValues("interest");// 遍历一维数组for(String username : usernames){System.out.println(username);}for(String userpwd : userpwds){System.out.println(userpwd);}for(String interest : interests){System.out.println(interest);}

方法联合使用,getParameterNames()负责获取key,getParameterValues负责获取value

package com.bjpowernode.javaweb;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;import java.util.Set;public class RequestTestServlet extends HttpServlet {    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter();      Enumeration keys = request.getParameterNames(); while(keys.hasMoreElements()){     // 拿到每一个key     String key = keys.nextElement();     System.out.print(key+"=");     // 通过getParameterValues(key)拿到所有的value这个一维数组     String[] values = request.getParameterValues(key);     // 遍历这个一维数组     for (String value :values){  System.out.print(value+",");     }     System.out.println(); } /* sername=root, userpwd=123, aihao=s,d,tt, */    }}

String getParameter(String name)   获取value一维数组当中的第一个元素,实际上大部分数组里就一个元素(常用方法)

对于复选框value有多个,而getParameter()方法只能去第一个元素

package com.bjpowernode.javaweb;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;import java.util.Set;    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // 直接通过name获取value这个一维数组的第一个元素 // 这个方法使用最多,因为这个一维数组中一般只有一个元素。 Enumeration keys = request.getParameterNames(); while(keys.hasMoreElements()){     // 拿到每一个key     String key = keys.nextElement();     // System.out.print(key+"=");     // 通过key直接取出value第一个元素     String value = request.getParameter(key);     System.out.println(key+"="+value); } /*   username=root   userpwd=123   aihao=s 只能取出第一个元素 */    }}

所以对于复选框的value还是调用getParameterValues()方法,对于单选框的就调用getParameter()方法

package com.bjpowernode.javaweb;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;import java.util.Set;    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // 对于单选框直接调用getParameter(String key)获取value String username = request.getParameter("username"); String userpwd = request.getParameter("userpwd"); System.out.println(username); System.out.println(userpwd); // 对于复选框,调用getParameterValues()方法 String[] aihaos = request.getParameterValues("aihao"); for (String aihao:aihaos){     System.out.print(aihao+","); } System.out.println();  /* root 123 s,d,tt, */    }}