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

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

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

时间: 2024-08-02 08:41:23

Servlet程序获取http协议提交的信息的相关文章

servlet自动获取前端页面提交数据

servlet自动获取前端页面jsp提交数据 以下是本人在学习过程中,因前端页面提交参数过多,后台servlet封装实体类过于麻烦而写的一个工具类,应用于jsp/servlet数据提交后,基于MVC+MyBatis进行数据持久化的过程.这里只介绍页面到servlet(controller)提交数据封装对象的过程,MVC+MyBatis访问数据库不在这里介绍. 1.前端页面及代码 1)前端表单页面构建(用于测试简单构建的页面有点丑陋哦~) 2)前端jsp页面代码   这里使用了Ajax异步 get

Servlet作业2-将表单提交的商品信息输出到页面中

1,表单页面 shangpin.html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>商品信息</title> 6 </head> 7 <body> 8 9 商品信息<br> 10 11 <form action="Shp" method="post

客户端程序获取自己的ip、isp、地理位置等信息

@ 比如说你需要收集用户信息,又或者要通过这些信息让用户登陆合适的服务器(北京联通用户登陆北京联通服务器). @ 淘宝和新浪都提供了类似的API,你只需要发送一个http请求,它就返回一个json格式的字符串结果.但是淘宝的API必须填上要查询的ip,如果程序不知道自己的ip的话就瞎了.所以我选择使用新浪的. http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] http://int.dpool.sina.com.cn/iplookup/i

微信小程序-获取用户信息和openid,session_key,

1:微信小程序获取用户信息:比如常用的 avatarUrl (用户头像),nickName (用户名称) 等等, (1):获取用户信息调用 wx.getUserInfo 代码如下: 直接请求接口就可以了,随后把数据存放到storage中,下次直接取 就不用再请求接口,, 2:获取 openid (1):请求wx.login 接口,代码如下: url:是微信提供的 appid:是小程序的appid secret:是小程序开发设置的 AppSecret 只要获取到这两项,用户信息可以用于页面,ope

PHP 微信公众号/小程序获取openid,用户信息

1.获取code (获得openid的前置条件) 地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirectUrl&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect 需要填写APPID,回调地址 redirectUrl(拿到code后

小程序获取用户信息的方式

一.在此之前,小程序获取微信的用户信息,用的都是wx.getUserInfo //例如 onLoad() { var that = this; wx.getUserInfo({ this.setData({ thumb: res.userInfo.avatarUrl, nickname: res.userInfo.nickName }) }) } 二.自从微信接口有了新的调整之后 wx.getUserInfo()便不再出现授权弹窗了(PS:但仍能用于获取已授权用户数据),需要使用button做引

Android开发程序获取GPS信息步骤

1.获取LOCATION_SERVICE系统服务.2.创建Criteria对象,调用该对象的set方法设置查询条件.3.调用LocationManager.getBestProvider(Criteria criteria,Boolean enabledOnly)方法,传入创建好的Criteria对象,获取最能满足给定标准(Criteria对象)的提供者名称.4.调用LocationManager.getLastKnowLocation(),传入提供者名称,获取最后已知位置信息.5.调用Loca

微信小程序获取国外今日天气预报信息接口

使用天气API的国外今日天气预报接口制作 返回json预览 { cityid: "601010100", city: "堪培拉", cityEn: "Canberra", country: "澳大利亚", countryEn: "Australia", update_time: "2019-04-24 18:00:00", wea: "晴", wea_img: &qu

Servlet入门总结及第一个Servlet程序 (转载)

转载请注明出处http://blog.csdn.net/evankaka 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 八 Servlet第一个程序 一.了解servlet 概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能.Serv