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

相关文章
|
6月前
|
应用服务中间件 数据安全/隐私保护
|
6月前
response.setcontenttype详解
response.setcontenttype详解
|
6月前
|
Java 应用服务中间件 API
Request&Response(1)
Request&Response
71 0
|
6月前
|
存储 Java 应用服务中间件
Request&Response(3)
Request&Response
61 0
|
6月前
|
前端开发 Java 应用服务中间件
Request&Response(4)
Request&Response
45 0
|
6月前
|
Java 数据库连接 数据库
Request&Response(5)
Request&Response
55 0
|
7月前
|
Java 数据库连接 数据库
Request 和 Response详解(下)
Request 和 Response详解(下)
94 1
|
7月前
|
存储 缓存 前端开发
Request 和 Response详解(中)
Request 和 Response详解(中)
93 0
|
7月前
|
前端开发 Java 应用服务中间件
Request 和 Response详解(上)
Request 和 Response详解(上)
157 0
|
存储
Request和Response详解
Request和Response详解
122 0