码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-06-12 03:14:53      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

标签:

原文地址:http://blog.csdn.net/jpzhu16/article/details/51605367

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!