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

目录

一:HttpServletRequest接口

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


一:HttpServletRequest接口

(1)HttpServletRequest是一个接口,全限定名称:javax.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接口获取请求参数

怎么获取前端浏览器用户提交的数据(和获取用户提交的数据有关系的四个方法)?通过HttpServletRequest requst接口:

Map<String,String[]>   getParameterMap()            获取Map
Enumeration<String>   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中进行注册

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>requestTest</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.RequestTestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>requestTest</servlet-name>
        <url-pattern>/testRequest</url-pattern>
    </servlet-mapping>
</web-app>

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>user register</title>
</head>
<body>

<h1>user register</h1>

<form action="/servlet08/testRequest" method="post">
    username:<input type="text" name="username"><br>
    password:<input type="password" name="userpwd"><br>
    interest:
    smoke<input type="checkbox" name="aihao" value="s">
    drink<input type="checkbox" name="aihao" value="d">
    tangtou<input type="checkbox" name="aihao" value="tt">
    <br>
    <input type="submit" value="register">

</form>
</body>
</html>

④启动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<String, String[]>   
key				value
-------------------------------
username		{"abc"}
userpwd			{"111"}
aihao			{"s","d","tt"}

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

(3)四个方法详解

①Map<String,String[]>   getParameterMap()  获取整个Map集合

(1)调用getParameterMap()方法拿到整个集合,里面存储的都是name和value。

(2)拿到这个集合后调用keySet()方法,获取所有的key,返回的是一个set集合;然后使用迭代器进行遍历;然后在调用get(key)方法,获取所以有的value。

(3)获取的value实际上是一个String[]数组,需要再次进行遍历打印。

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<String, String[]> parameterMap = request.getParameterMap();
        // 遍历Map集合(获取Map集合中所有的key)
        Set<String> keys = parameterMap.keySet();
        // 通过迭代器进行遍历
        Iterator<String> 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;@6cc12425
              userpwd=[Ljava.lang.String;@6206c7cd
              aihao=[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<String>   getParameterNames()       获取Map集合中所有的key

(1)调用getParameterNames() 获取所有的key,返回的是一个Enumeration集合

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<String> 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(一般遇到复选框才会使用)

(1)调用getParameterValues(String name)方法获取到values;得到的values一般是一个String数组进行存储,所以这个方法主要用于复选框才使用

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

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<String> 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一维数组当中的第一个元素,实际上大部分数组里就一个元素(常用方法)

(1)对于复选框value有多个,getParameterValues(String name)方法,获得一个String数组;而getParameter()方法只能取第一个元素,返回的是String类型的数据。

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<String> 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,
        */
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@每天都要敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值