Servlet程序获取http协议提交的信息
2016-06-07 17:27
531 查看
Servlet程序获取http协议提交的信息
Servlet程序获取http协议提交的信息实现过程以及存在的问题
编码问题
实现过程以及存在的问题
下面是其Java Servlet代码:package com.jpzhutech.servlet; import java.io.IOException; import java.io.InputStream; import java.nio.Buffer; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class TestHtmlProtocol */ public class TestHtmlProtocol extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public TestHtmlProtocol() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*//获得请求行信息,在web项目的编程过程中获得请求行信息也是一种需求,请求行包括获得http协议版本、URI地址、URL地址、请求的方法 String protocol = request.getProtocol(); System.out.println(protocol); String method = request.getMethod(); System.out.println(method); String requestURI = request.getRequestURI(); System.out.println(requestURI);*/ /* //获得请求头信息,请求头是整个http请求中第二个关键的部分 //String header = request.getHeader("Accept-Encoding"); //根据请求头常见key,求得其对应的value,前提是你得知道key //System.out.println(header); Enumeration<String> headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String nextElement = headerNames.nextElement(); String header = request.getHeader(nextElement); System.out.println(nextElement+":"+header); }*/ /* 方法一 //这段代码可以的得到整个表单提交的全部数据,以key-value的形式呈现,但是存在的问题是:如果我们想获取其中一个数据,那么我们还需要对得到的 //字符串进行分割的操作,这样无疑增加了整个处理的难度,那么是否有好的办法解决呢?回答是有 System.out.println("GET提交方式"); String value = request.getQueryString(); //得到GET方式提交的全部数据 System.out.println(value); */ /* 方法二,获得想要的单个信息 该段代码对于GET方式和POST方式都是成立的,也就是说这是一段通用的代码,但是很明显该段代码存在一个很大的问题,就是在checkbox(多选框中)时,我们是 选了多个爱好,但是实际上只给我显示了一个爱好,这个是一个bug,后续的方法会解决 //对于我们想要得到的任何属性,只要使用下面的方法就能得到正确的值 String name = request.getParameter("name"); //在这里的"name"参数是在表单中使用的name属性规定的 //String name = request.getParameter("name1"); //如果在表单中没有这个属性 //System.out.println(name="+name); //则输出为null System.out.println("name="+name); //如果我们想要获取所有表单属性中的值呢? Enumeration<String> parameterNames = request.getParameterNames(); //获取表单中所有的属性名 while(parameterNames.hasMoreElements()){ String nextElement = parameterNames.nextElement(); //遍历迭代器得到所有的属性名 String parameter = request.getParameter(nextElement); //根据属性名获得全部的属性值 System.out.println(nextElement+":"+parameter); } */ /* 方法三 解决方法二中出现的问题,对于多选框中的值不能全部输出的问题 //如果我们想要获取所有表单属性中的值呢? Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名 while (parameterNames.hasMoreElements()) { String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名 if("hobits".equals(nextElement)){ String[] parameterValues = request.getParameterValues(nextElement); for(String string : parameterValues){ System.out.print(nextElement+"="+string+","); } System.out.println(); }else{ String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值 System.out.println(nextElement + ":" + parameter); } } */ /* 方法四 实际上方法四还是存在一个很大的问题,看我们输出可以知道,实际上我们在输出籍贯等这些信息时,使用的全部都是字母输出,不是汉字,并且当你使用汉字对 表单中的value属性进行赋值时,显示出来的全部是乱码,这是中国人经常会遇到的所谓乱码问题,各种乱码问题都会经常在我们编程的过程中出现,要想解决问题必须要知道为什么会发生这样的问题呢? 我们的浏览器客户端使用的是UTF-8编码,但是在tamcat服务器端在解码时使用的是ISO-8859-1编码,这样的话就会发生编码不一致,导致不能正确的解码, 下面将会提出两种方法去解决这个问题 */ /* //手动设置字符串的编码,由于在服务器端得到的字符串都是使用iso-8859-1编码,所以需要将得到的字符串进行手动的解码工作,下面是手动解码的代码 //request.setCharacterEncoding("utf-8"); //该方法只对请求实体内容的编码起作用,POST提交的内容在实体内容中,所以该方法只对POST方法有效 System.out.println("GET提交方式"); Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名 while (parameterNames.hasMoreElements()) { String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名 String str = new String(nextElement.getBytes("ISO-8859-1"),"utf-8"); //首先用iso-8859-1将字符串解码成字节,接着再使用utf-8编码生成新的字符串 if("爱好".equals(str)){ String[] parameterValues = request.getParameterValues(nextElement); for(String string : parameterValues){ String string2 = new String(string.getBytes("ISO-8859-1"),"utf-8"); System.out.print(str+"="+string2+","); } System.out.println(); }else{ String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值 String string3 = new String(parameter.getBytes("ISO-8859-1"),"utf-8"); System.out.println(str + ":" + string3); } }*/ } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*// 获得请求行信息,在web项目的编程过程中获得请求行信息也是一种需求,请求行包括获得http协议版本、URI地址、URL地址、请求的方法 String protocol = request.getProtocol(); System.out.println(protocol); String method = request.getMethod(); System.out.println(method); String requestURI = request.getRequestURI(); System.out.println(requestURI);*/ /*// 获得请求头信息,请求头是整个http请求中第二个关键的部分 // String header = request.getHeader("Accept-Encoding"); // //根据请求头常见key,求得其对应的value,前提是你得知道key // System.out.println(header); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String nextElement = headerNames.nextElement(); String header = request.getHeader(nextElement); System.out.println(nextElement + ":" + header); }*/ /* 方法一 //这段代码和doGet方法中的第一种方法一样都是一次性的获取到全部的提交数据,这样同样会导致当我们想要使用其中的某些数据时,必须将得到的字符串进行 //分割,然后得到其中想要的值,这无疑增加了整个处理的难度。是否有好的办法解决呢?回答是有 InputStream inputStream = request.getInputStream(); byte[] buf = new byte[1024]; //使用缓冲数组获取输入流中的数据,数组的大小以1024的倍数为单位进行增长 int length = 0; //缓冲数组实际的大小 System.out.println("POST提交方式"); while((length = inputStream.read(buf)) != -1){ //当输入流中没有数据时,会返回-1,此时终止程序的执行 System.out.println(new String(buf,0,length)); //用得到的缓冲数组重新构建字符串并输出到控制台 } */ /* 方法二,获得想要的单个信息 该段代码对于GET方式和POST方式都是成立的,也就是说这是一段通用的代码,但是很明显该段代码存在一个很大的问题,就是在checkbox(多选框中)时,我们是 选了多个爱好,但是实际上只给我显示了一个爱好,这个是一个bug,后续的方法会解决 //对于我们想要得到的任何属性,只要使用下面的方法就能得到正确的值 String name = request.getParameter("name"); //在这里的"name"参数是在表单中使用的name属性规定的 //String name = request.getParameter("name1"); //如果在表单中没有这个属性 //System.out.println(name="+name); //则输出为null System.out.println("name="+name); //如果我们想要获取所有表单属性中的值呢? Enumeration<String> parameterNames = request.getParameterNames(); //获取表单中所有的属性名 while(parameterNames.hasMoreElements()){ String nextElement = parameterNames.nextElement(); //遍历迭代器得到所有的属性名 String parameter = request.getParameter(nextElement); //根据属性名获得全部的属性值 System.out.println(nextElement+":"+parameter); } */ /* 方法三 解决方法二中出现的问题,对于多选框中的值不能全部输出的问题 //如果我们想要获取所有表单属性中的值呢? System.out.println("POST提交方式"); Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名 while (parameterNames.hasMoreElements()) { String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名 if("hobits".equals(nextElement)){ String[] parameterValues = request.getParameterValues(nextElement); for(String string : parameterValues){ System.out.print(nextElement+"="+string+","); } System.out.println(); }else{ String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值 System.out.println(nextElement + ":" + parameter); } } */ /*//手动设置字符串的编码,由于在服务器端得到的字符串都是使用iso-8859-1编码,所以需要将得到的字符串进行手动的解码工作,下面是手动解码的代码 System.out.println("POST提交方式"); Enumeration<String> parameterNames = request.getParameterNames(); // 获取表单中所有的属性名 while (parameterNames.hasMoreElements()) { String nextElement = parameterNames.nextElement(); // 遍历迭代器得到所有的属性名 String str = new String(nextElement.getBytes("ISO-8859-1"),"utf-8"); //首先用iso-8859-1将字符串解码成字节,接着再使用utf-8编码生成新的字符串 if("爱好".equals(str)){ String[] parameterValues = request.getParameterValues(nextElement); for(String string : parameterValues){ String string2 = new String(string.getBytes("ISO-8859-1"),"utf-8"); System.out.print(str+"="+string2+","); } System.out.println(); }else{ String parameter = request.getParameter(nextElement); // 根据属性名获得全部的属性值 String string3 = new String(parameter.getBytes("ISO-8859-1"),"utf-8"); System.out.println(str + ":" + string3); } }*/ } }
对应使用的html表单代码如下:
<!DOCTYPE html> <html> <head> <!--这里要遵循html5的规范对整个文件的编码进行规范说明 --> <meta charset="utf-8" /> <title>TestHtml.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta name="content-type" content="text/html"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <form action="/httpprotocol/TestHtmlProtocol" method="GET"> 用户名<input type="text" name="name" /><br /> 密码<input type="password" name="password" /> <br /> <!-- 性别采用单选框 --> 性别 <input type="radio" name="gender" value="male" />男 <input type="radio" name="gender" value="female" />女 <br /> <!-- 爱好使用多选框 --> 爱好 <input type="checkbox" name="hobits" value="lq" />篮球 <input type="checkbox" name="hobits" value="zq" />足球 <input type="checkbox" name="hobits" value="ymq" />羽毛球 <br /> <!-- 籍贯采用下拉菜单 --> 籍贯 <select name="jiguan"> <option value="gd">广东</option> <option value="gx">广西</option> <option value="sz">深圳</option> <option value="sx">山西</option> </select> <br /> <!-- 个人简介使用文本域 --> 个人简介 <textarea rows="5" cols="10" name="info"> </textarea> <!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 --> <input type="hidden" name="id" value="001" /><br /> 提交<input type="submit" value="提交" /><br /> </form> <hr /> <hr /> <hr /> <form action="/httpprotocol/TestHtmlProtocol" method="POST"> 用户名<input type="text" name="name" /><br /> 密码<input type="password" name="password" /> <br /> <!-- 性别采用单选框 --> 性别 <input type="radio" name="gender" value="male" />男 <input type="radio" name="gender" value="female" />女 <br /> <!-- 爱好使用多选框 --> 爱好 <input type="checkbox" name="hobits" value="lq" />篮球 <input type="checkbox" name="hobits" value="zq" />足球 <input type="checkbox" name="hobits" value="ymq" />羽毛球 <br /> <!-- 籍贯采用下拉菜单 --> 籍贯 <select name="jiguan"> <option value="gd">广东</option> <option value="gx">广西</option> <option value="sz">深圳</option> <option value="sx">山西</option> </select> <br /> <!-- 个人简介使用文本域 --> 个人简介 <textarea rows="5" cols="10" name="info"> </textarea> <!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 --> <input type="hidden" name="id" value="001" /><br /> 提交<input type="submit" value="提交" /><br /> </form> <hr /> <hr /> <hr /> <!-- value是中文时的处理 --> <form action="/httpprotocol/TestHtmlProtocol" method="GET"> 用户名<input type="text" name="name" /><br /> 密码<input type="password" name="password" /> <br /> <!-- 性别采用单选框 --> 性别 <input type="radio" name="性别" value="男" />男 <input type="radio" name="性别" value="女" />女 <br /> <!-- 爱好使用多选框 --> 爱好 <input type="checkbox" name="爱好" value="篮球" />篮球 <input type="checkbox" name="爱好" value="足球" />足球 <input type="checkbox" name="爱好" value="羽毛球" />羽毛球 <br /> <!-- 籍贯采用下拉菜单 --> 籍贯 <select name="籍贯"> <option value="广东">广东</option> <option value="广西">广西</option> <option value="深圳">深圳</option> <option value="山西">山西</option> </select> <br /> <!-- 个人简介使用文本域 --> 个人简介 <textarea rows="5" cols="10" name="个人简介"> </textarea> <!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 --> <input type="hidden" name="id" value="001" /><br /> 提交<input type="submit" value="提交" /><br /> </form> <hr /> <hr /> <hr /> <form action="/httpprotocol/TestHtmlProtocol" method="POST"> 用户名<input type="text" name="name" /><br /> 密码<input type="password" name="password" /> <br /> <!-- 性别采用单选框 --> 性别 <input type="radio" name="性别" value="男" />男 <input type="radio" name="性别" value="女" />女 <br /> <!-- 爱好使用多选框 --> 爱好 <input type="checkbox" name="爱好" value="篮球" />篮球 <input type="checkbox" name="爱好" value="足球" />足球 <input type="checkbox" name="爱好" value="羽毛球" />羽毛球 <br /> <!-- 籍贯采用下拉菜单 --> 籍贯 <select name="籍贯"> <option value="广东">广东</option> <option value="广西">广西</option> <option value="深圳">深圳</option> <option value="山西">山西</option> </select> <br /> <!-- 个人简介使用文本域 --> 个人简介 <textarea rows="5" cols="10" name="个人简介"> </textarea> <!-- 隐藏域,用来提交一些加密的数据,不想显示在浏览器中 --> <input type="hidden" name="id" value="001" /><br /> 提交<input type="submit" value="提交" /><br /> </form> </body> </html>
编码问题
从上面的代码中可以看出,在涉及到中文问题时,最可能出现的问题就是编码问题,同样在Servlet编程过程中也存在这样的问题,总结一下本文涉及到的两种方式,另外附加一种方式,但是不建议使用该种方法去处理编码问题。该种方法只限于POST提交方式中的实体内容,有限制
request.setCharacterEncoding(“utf-8”);
手动解码,推荐使用,目前采取该方法最好,之后可以采用过滤器重写其中的代码
修改tomcat服务器的配置文件,配置文件在/conf/server.xml,找到配置8080端口的xml行,在其中增加如下一行代码:
URIEncoding=”utf-8”;
本文对以上的三种方式都进行了测试,并且结果是正确的。
相关文章推荐
- 分析TCP/IP协议栈代码之UDP(STM32平台)
- HTTP POST GET 本质区别
- 页面发送请求,浏览器执行哪些操作
- Linux常用网络测试命令
- TCP协议中的三次握手和四次挥手(图解)
- 如何理解HTTP协议的 “无连接,无状态” 特点?
- TCP : 3次握手与4次挥手
- ENet可靠UDP网络库 v1.3.13 使用文档
- WiFi基本知识
- 在Web应用中接入微信支付的流程之极简清晰版(原文出处:http://blog.sina.com.cn/s/blog_48422a050102w364.html)
- JavaSE入门学习49:Socket网络通信编程(三)
- 快速可靠网络传输协议 KCP
- HTTPS绕过证书
- 采用HttpClient3.x上传文件 spring 文件上传
- 腾讯如何打造一款实时对战手游
- IOS使用HTTP方式登录
- Okhttp https
- 【Kali】利用Ettercap进行ARP欺骗和中间人攻击
- Linux tcpdump命令详解
- JavaSE入门学习48:Socket网络通信编程(二)