细说表单提交的GET和POST
一、GET方式
1、地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。
GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://localhost:8080/day09/testMethod.html Connection: keep-alive
2、GET提交参数数据有限制,不超过1KB。
3、GET方式不适合提交敏感密码。
4、注意: 浏览器直接访问的请求,默认提交方式是GET方式
二、POST方式
1、参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分割
POST /day09/testMethod.html HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://localhost:8080/day09/testMethod.html Connection: keep-alive name=eric&password=123456
2、POST提交的参数数据没有限制。
3、POST方式提交敏感数据。
三、两种方式传递的请求参数获取方法
核心的API:
request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数) request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数) request.getParameterNames(); 获取所有参数名称列表
四、请求参数编码问题
请认真看下边的这张图:
分析:
1、我们在编写HTML或者JSP的时候,我们设置的编码为UTF-8。请求参数在传递的时候,会变成字节,这个转换时以我们设置的UTF-8为标准的。
2、我们是用 request.getParameter("参数名"),这个方法获取的时候,它是使用 "iso-8859-1" 进行解码的,所以就出现了中国特色的乱码问题。
解决方法:
修改POST方式参数编码:
request.setCharacterEncoding("utf-8");
这个编码的设置,只是对请求信息的实体部分进行的设置,所以只对POST方法有效。
修改GET方式参数编码:
手动解码:
String name = new String(name.getBytes("iso-8859-1"),"utf-8");
五、实例分析
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Enumeration<String> enums=request.getParameterNames(); while(enums.hasMoreElements()){ String name=enums.nextElement(); String name1=new String(name.getBytes("iso-8859-1"),"UTF-8"); //手动设置编码 if("habit".equals(name)){ System.out.println(name1+":"); String [] values=request.getParameterValues(name); for(String str:values){ String str1=new String(str.getBytes("iso-8859-1"),"UTF-8"); System.out.print(str1+" "); } System.out.println(); }else{ String value=request.getParameter(name); String values=new String(value.getBytes("iso-8859-1"),"UTF-8"); System.out.println(name1+":"+values); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //进行编码格式设置 Enumeration<String> enums=request.getParameterNames(); //获取变量 while(enums.hasMoreElements()){ String name=enums.nextElement(); if("habit".equals(name)){ //对于多值变量特殊处理 System.out.println(name+":"); String [] values=request.getParameterValues(name); for(String str:values){ System.out.print(str+" "); } System.out.println(); }else{ String value=request.getParameter(name); System.out.println(name+":"+value); } } }
index.jsp
<body> <form method="get" action="/HttpServletRequest/RequestDemo2"> 用户名<input type="text" name="userName"><br/> 密码<input type="password" name="password"><br/> 性别: <input type="radio" name="gender" value="男"/>男 <input type="radio" name="gender" value="女"/>女<br/> 籍贯: <select name="jiguan"> <option value="广东">广东</option> <option value="上海">上海</option> </select><br/> 爱好 <input type="checkbox" name="habit" value="篮球"/>篮球 <input type="checkbox" name="habit" value="足球"/>足球 <input type="checkbox" name="habit" value="羽毛球"/>羽毛球<br/> 个人简介: <textarea rows="5" cols="10" name="info"></textarea><br/> <!-- 隐藏域 --> <input type="hidden" name="id" value="001"/><br/> <input type="submit" value="sbmit"/> </form> </body>