前面我们讲Request获取请求参数时如果是GET方式我们是通过getQueryString()方法获取, 如果是POST方式我们是通过getReader()方法,而我们对于继承HttpServlet抽象类的时候其实很多的GET和POST请求之下的操作都是通用的, 所以往往我们继承HttpServlet抽象类实现的Servlet类在实现的doGet()方法和doPost()方法中绝大多数代码都是相同的, 而不同的只是对于获取请求参数的方法不同 —> 使用了不同的方法获取post请求和get请求的请求参数
Request调用的获取请求参数的通用方式中其实底层也是先判断请求方式是GET还是POST, 如果是GET请求方式, 那么我们就调用getQueryString()方法,以字符串的方式获取到了请求参数, 如果是POST请求方式, 那么调用getReader()方法( 如果请求参数中有图片等非文本内容,那么我们就要调用getInputStream()方法 ),获取到对应的字符缓冲流, 然后调用BufferedReader类中的readLine()方法,以字符串的形式获取请求参数
然后以字符串的方式获取到请求参数之后,我们就拿到了一个完整的字符串,这个字符串的内容就是我们的请求参数( eg: username=zhangsan&hobby=1&hobby=2 )
然后我们以&为分隔符先将字符串分割,分割为一个个的请求参数名=请求参数值的键值对形式,然后我们再通过=为分隔符对每个字符串再进行一个分割,分割了之后我们将分割后的两个值以键值对的形式存储到了一个Map集合中去, 但是我们的Map的键时不可重复的,所以如果有多个键值对的键相同但是值不同的时候, 这个时候我们向这个Map集合中通过put()方法添加这个键重复的数据的时候,那么实际上是执行了一个修改的操作,例如上面的hobby有两个值: 1和2, 最终Map中hobby只会有一个值,不满足我们的要求
那么我们如何避免这样的问题的出现?(也就是如何将键重复的数据的值不修改,而是也保存下来?)
我们将Map集合的值设置为一个字符串数组类型的, 这个时候当我们添加的键相同的时候我们执行的操作是将对应的值存储到重复值对应的字符串数组中
所以也就是我们的存储请求数据的Map集合的泛型为Map<String,String[]>
最终存储下来就要是如下图的效果( 以username=zhangsan&hobby=1&hobby=2作为请求参数为例 )
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYokceGI-1655913409612)(E:\非凡英才\JavaWeb开发\Servlet\图解\Map存储请求参数.png)]
//获取请求方式
String method = this.getMethod();
//判断
if("GET".equals(method)){
//GET方式获取请求参数
params = this.getQueryString();
}else if("POST".equeals(method)){
//POST方式获取请求参数
BufferedReader reader = this.getReader();
params = reader.readLine();
}
//后续的对获取到的字符串形式的请求参数的分割解析操作
Map<String,String[]> getParameterMap()
String [] getParameterValues(String name)
String getParameter(String name)