Servlet程序获取http协议提交的信息

来源:互联网 发布:横山裕 知乎 编辑:程序博客网 时间:2024/05/19 00:37

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”;

本文对以上的三种方式都进行了测试,并且结果是正确的。

0 0
原创粉丝点击