请求参数获取+编码问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请求参数获取+编码问题相关的知识,希望对你有一定的参考价值。

参数获取的方法:

如果表单是采用get方法提交,这时候可以使用

1.request.getQueryString();//直接获取到uri后面的所有内容,不方便分离参数。

2.request.getParameter("名称");//通过表单属性的名称来获取值

request.getParameterNames();//获取表单属性中所有的名称

如果表单是采用post方法提交,这时候可以使用

1.request.getInputStream();//直接可以获取到实体内容中的参数,不方便分离参数

2.request.getParameter("名称");//通过表单中属性的名称获取对应的内容

request.getParameterNames();//获取表单中所有属性名称的值

 1 @WebServlet("/RequestDemo5")
 2 public class RequestDemo5 extends HttpServlet {
 3 /**
 4  * 获取Get方式和Post方式提交的参数
 5  * @author MaoDoer
 6  *
 7  */
 8     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 9 /*        System.out.println("GET方式");
10         //接收Get方式提交的参数
11         String value = request.getQueryString();
12         System.out.println(value);*/
13         
14         /**
15          * 统一方便的获取请求参数的方法
16          */
17         System.out.println(request.getMethod()+"方式提交");
18         String name=request.getParameter("name");//这里的名称用的是表单属性里的name属性
19         String pwd = request.getParameter("password");
20         System.out.println(name+"="+pwd);
21         
22         System.out.println("====================================");
23         //获取表单中所有的参数名称
24         Enumeration<String> enums = request.getParameterNames();
25         while(enums.hasMoreElements()){
26             String paramName = enums.nextElement();
27             String paramValue = request.getParameter(paramName);
28             System.out.println(paramName+"="+paramValue);
29         }
30     }
31     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
32 /*        System.out.println("POST方式");
33         ServletInputStream in = request.getInputStream();
34         byte[] buf=new byte[1024];
35         int len=0;
36         while((len=in.read(buf))!=-1){
37             System.out.println(new String(buf,0,len));
38         }*/
39         
40 /*        System.out.println("Post方式提交");
41         String name=request.getParameter("name");//这里的名称用的是表单属性里的name属性
42         String pwd = request.getParameter("password");
43         System.out.println(name+"="+pwd);
44         
45         System.out.println("====================================");
46         //获取表单中所有的参数名称
47         Enumeration<String> enums = request.getParameterNames();
48         while(enums.hasMoreElements()){
49             String paramName = enums.nextElement();
50             String paramValue = request.getParameter(paramName);
51             System.out.println(paramName+"="+paramValue);
52         }*/
53         
54         //调用doGet方法
55         this.doGet(request, response);
56     }
57 }

在doGet和doPost方法中获取参数中都可以使用request.getParameter();方法和request.getParameterNames();方法,这样代码就出现了重复,所以可以在doPost代码中调用doGet方法,传入request和response。

注意:request.getParameter("hobit");这种方法只能根据参数名得到一个值。也就是说当一个属性name="hobit"时,它可能是有多个值的,但是这种方法只能获取一个。这时候就要使用其他的方法。

String[] hobits=request.getParameterValues("hobit");

for(String hobit:hobits){

  System.out.println(hobit+",");

}

所以需要将25-29行的代码进行修改:

        while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            
            //如果参数是hobit,则调用getParameterValues()
            if("hobit".equals(paramName)){
                String[] hobits=request.getParameterValues("hobit");
                System.out.print(paramName+"=");
                for(String hobit:hobits){
                    System.out.print(hobit+",");
                }
                System.out.println();
            }else{
            String paramValue = request.getParameter(paramName);
            System.out.println(paramName+"="+paramValue);
            }
        }


注意:这时候程序是有一些问题的,因为当String name =request.getParameter("name");为中文时会出现乱码问题。

技术分享

问题:

html网页中输入的是字符,在html文件中声明是使用utf-8进行编码,当把内容提交到服务器之后,使用的是utf-8进行编码的字节,String name=request.getParameter("name");这时name出现了乱码是因为这一方法默认使用的是iso-8859-1进行解码。

 

解决方法:

  1. name 字节 utf-8进行编码
  2. name=request.getParameter(xxx);使用的是iso-8859-1进行解码
  3. name.getBytes("iso-8859-1");再次使用iso-8859-1进行编码使其变成字节,然后使用utf-8进行解码
  4. name=new String(name.getBytes("iso-8859-1"),"utf-8")


举例:

手动解码:iso-8859-1字符串-》utf-8字符串

String name=request.getParameter("name");

name=new String(name.getByte("iso-8859-1"),"utf-8");

 

注意:这种方法要对每一个参数值都进行手动解码,比较麻烦。所以有了第二种方法。

全局设置编码:在调用request.getParameter()方法之前设置查询的码表。

request.setCharacterEncoding("utf-8");

这个方法应该放置于获取参数request.getParameter()方法之前。

注意:全局设置编码的方法只能对请求实体内容的编码起作用,Post提交的数据是放在实体内容中,所以该方法对Post方法有效。而Get方式的参数是放在URI的后面,所以对Get方式不起作用。所以对Get方法只能使用手动解码。

还有另外的一种不推荐的方法,那就是修改服务器的配置文件。

 



以上是关于请求参数获取+编码问题的主要内容,如果未能解决你的问题,请参考以下文章

使用参数编码 JSONEncoding.default 时请求超时

求教golang中http发送post请求gb2312编码的解决方案

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

SpringMVC:获取请求参数

javaweb笔记5之请求编码问题

ajax得到后台传过来的参数后乱码