首页 > 代码库 > 请求参数获取+编码问题
请求参数获取+编码问题
参数获取的方法:
如果表单是采用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 = http://www.mamicode.com/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 =http://www.mamicode.com/ 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 = http://www.mamicode.com/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进行解码。
解决方法:
- name 字节 utf-8进行编码
- name=request.getParameter(xxx);使用的是iso-8859-1进行解码
- name.getBytes("iso-8859-1");再次使用iso-8859-1进行编码使其变成字节,然后使用utf-8进行解码
- 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方法只能使用手动解码。
还有另外的一种不推荐的方法,那就是修改服务器的配置文件。
请求参数获取+编码问题