Request&Response(2)

简介: Request&Response

Request&Response(1)https://developer.aliyun.com/article/1530548

此处大家需要注意的是GET请求和POST请求接收参数的方式不一样,具体实现的代码如下:

@WebServlet("/req1")  
public class RequestDemo1 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  
        String result = req.getQueryString();  
        System.out.println(result);  
  
    }  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        BufferedReader br = req.getReader();  
        String result = br.readLine();  
        System.out.println(result);  
    }  
}
  • 对于上述的代码,会存在什么问题呢?

  • 如何解决上述重复代码的问题呢?

当然,也可以在doGet中调用doPost,在doPost中完成参数的获取和打印,另外需要注意的是,doGet和doPost方法都必须存在,不能删除任意一个。

GET请求和POST请求获取请求参数的方式不一样,在获取请求参数这块该如何实现呢?

要想实现,我们就需要思考:

GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet和doPost方法内的代码?

解决方案一:

@WebServlet("/req1")  
public class RequestDemo1 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //获取请求方式  
        String method = req.getMethod();  
        //获取请求参数  
        String params = "";  
        if("GET".equals(method)){  
            params = req.getQueryString();  
        }else if("POST".equals(method)){  
            BufferedReader reader = req.getReader();  
            params = reader.readLine();  
        }  
        //将请求参数进行打印控制台  
        System.out.println(params);  
        
    }  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        this.doGet(req,resp);  
    }  
}

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

解决方案二:

request对象已经将上述获取请求参数的方法进行了封装,并且request提供的方法实现的功能更强大,以后只需要调用request提供的方法即可,在request的方法中都实现了哪些操作?

(1)根据不同的请求方式获取请求参数,获取的内容如下:

(2)把获取到的内容进行分割,内容如下:

(3)把分割后端数据,存入到一个Map集合中:

注意:因为参数的值可能是一个,也可能有多个,所以Map的值的类型为String数组。

基于上述理论,request对象为我们提供了如下方法:

#java/重要方法

  • 获取所有参数Map集合
    `Map getParameterMap()
  • 根据键名称获取参数值(数组)

String[] getParameterValues(String name)

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

String getParameter(String name)

接下来,我们通过案例来把上述的三个方法进行实例演示:

1.修改req.html页面,添加爱好选项,爱好可以同时选多个

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Title</title>  
</head>  
<body>  
<form action="/request-demo/req2" method="get">  
    <input type="text" name="username"><br>  
    <input type="password" name="password"><br>  
    <input type="checkbox" name="hobby" value="1"> 游泳  
    <input type="checkbox" name="hobby" value="2"> 爬山 <br>  
    <input type="submit">  
  
</form>  
</body>  
</html>

2.在Servlet代码中获取页面传递GET请求的参数值

2.1获取GET方式的所有请求参数

/**  
 * request 通用方式获取请求参数  
 */  
@WebServlet("/req2")  
public class RequestDemo2 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //GET请求逻辑  
        System.out.println("get....");  
        //1. 获取所有参数的Map集合  
        Map<String, String[]> map = req.getParameterMap();  
        for (String key : map.keySet()) {  
            // username:zhangsan lisi  
            System.out.print(key+":");  
  
            //获取值  
            String[] values = map.get(key);  
            for (String value : values) {  
                System.out.print(value + " ");  
            }  
  
            System.out.println();  
        }  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
    }  
}

获取的结果为:

2.2获取GET请求参数中的爱好,结果是数组值

/**  
 * request 通用方式获取请求参数  
 */  
@WebServlet("/req2")  
public class RequestDemo2 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //GET请求逻辑  
        //...  
        System.out.println("------------");  
        String[] hobbies = req.getParameterValues("hobby");  
        for (String hobby : hobbies) {  
            System.out.println(hobby);  
        }  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
    }  
}

获取的结果为:

2.3获取GET请求参数中的用户名和密码,结果是单个值

/**  
 * request 通用方式获取请求参数  
 */  
@WebServlet("/req2")  
public class RequestDemo2 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //GET请求逻辑  
        //...  
        String username = req.getParameter("username");  
        String password = req.getParameter("password");  
        System.out.println(username);  
        System.out.println(password);  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
    }  
}

获取的结果为:

3.在Servlet代码中获取页面传递POST请求的参数值

3.1将req.html页面form表单的提交方式改成post

3.2将doGet方法中的内容复制到doPost方法中即可

小结

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

2.3 IDEA快速创建Servlet

使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义如下格式:

由于格式固定,所以我们可以使用IDEA提供的模板来制作一个Servlet的模板,这样我们后期在创建Servlet的时候就会更高效,具体如何实现:

(1)按照自己的需求,修改Servlet创建的模板内容

修改成

(2)使用servlet模板创建Servlet类

[!tip]

如果新建里面没有Servlet刷新maven即可

Request&Response(3)https://developer.aliyun.com/article/1530550

相关文章
|
存储 算法 NoSQL
探秘HyperLogLog:Redis中的基数统计黑科技
探秘HyperLogLog:Redis中的基数统计黑科技
619 0
|
存储 JavaScript 前端开发
使用CDN方法的方式进行Vue.js的安装
最近公司需要进行一些前端的开发工作用到了Vue前端框架,所以准备自学Vue,顺便几下学习的过程以及一些问题。
1144 0
使用CDN方法的方式进行Vue.js的安装
|
存储 前端开发 JavaScript
three.js 纹理
纹理是添加到材料中的图像或颜色,以提供更多细节或美感。纹理是Three.js中必不可少的主题。在本节中,我们将了解如何将基本纹理应用于我们的材质。
288 0
|
网络协议 安全 网络安全
什么是HTTP
什么是HTTP
2316 0
|
机器学习/深度学习 边缘计算 人工智能
探讨深度学习在图像识别中的应用及优化策略
【10月更文挑战第5天】探讨深度学习在图像识别中的应用及优化策略
313 1
|
JavaScript API 图形学
一个案例带你从零入门Three.js,深度好文!
【8月更文挑战第1天】本教程无需任何Threejs知识!本教程以入门为主,带你快速了解Three.js开发
464 2
一个案例带你从零入门Three.js,深度好文!
|
Java C++ Python
使用getline()从文件中读取一行字符串
C++ 中的 `getline()` 函数用于从文件流中读取整行文本。它可以从 `fstream` 和 `ifstream` 对象中调用。有两种语法形式:一种读取到 `\n` 或达到指定缓冲区大小,另一种允许指定自定义分隔符。如果文件流中的字符数量超过缓冲区大小,可能导致读取失败。示例代码展示了如何使用 `getline()` 读取单行和多行文本。
219 1
|
分布式计算 Hadoop Java
Hadoop编辑hadoop-env.sh文件
【7月更文挑战第19天】
1056 5
|
Docker 容器
waiting for docker daemon: failed to start docker engine: dockerd failed to start: exit status 1
waiting for docker daemon: failed to start docker engine: dockerd failed to start: exit status 1
290 0
|
前端开发 数据安全/隐私保护
【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示
【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示