Request用法解析

HttpServletRequest:



消息行:getMethod(),getRequestURL(),getRequestURI(),getContextPath(), getQueryString()的方法


消息头:getHeader(),getHeaderNames(),getHeaders()


消息体:

getParameter(String name) getParameterValues(String name),getParameterNames(),
 Map<String,String[]>getParameterMap()  PropertyDiscriptor
 ServletInputStream in = getInputStream()--URLDecoder.decode()



上面的这些方法我们挨个使用一下
消息行中的信息df

//获取请求消息行中的信息的方法
        System.out.println(request.getMethod());//获取请求方式
        System.out.println(request.getRequestURL());//获取请求的路径
        System.out.println(request.getRequestURI());//获取请求的资源路径
        System.out.println(request.getContextPath());//获取当前应用的目录 /day34_request
        System.out.println(request.getQueryString());//获取地址后跟的参数

消息头的方法:

String value = request.getHeader("User-Agent");

获取的是浏览器的信息

//getHeaderNames()方法的使用
        Enumeration enu = request.getHeaderNames();
        while(enu.hasMoreElements())
        {
            String  name = (String) enu.nextElement();
            String  v = request.getHeader(name);
            System.out.println(name+":"+v);
        }

获取头信息中的所以信息



处理消息体的方法

        //告诉服务器客户端使用的编码,以post方式提交表单数据的乱码问题
        request.setCharacterEncoding("utf-8");
        //得到用户名--表单中的数据默认都是字符串的
    String username = request.getParameter("username");
        //得到密码
        String psw = request.getParameter("pwd");
        //得到性别
        String sex = request.getParameter("sex");

        //得到爱好
        String[] hobbys = request.getParameterValues("hobby");

        //得到所在城市
        String city = request.getParameter("city");

        System.out.println(username+"  "+psw+"  "+sex+"   "+city);
        for(String ss:hobbys)
        {
        System.out.print(ss+"   ");
        }

上面说了以post方式提交数据解决乱码的方式,就是告诉服务器客户端使用的编码方式。
request.setCharacterEncoding(“utf-8”);

下面我们看一下getParameterNames(),获得所有属性的名字

request.setCharacterEncoding("utf-8");
        Enumeration en = request.getParameterNames();//得到所有的name
        while(en.hasMoreElements())
        {
            String name = (String) en.nextElement();//得到一个参数名
            //根据名字获取值
            String[] values = request.getParameterValues(name);
            System.out.print(name);
            for(int i=0;values!=null && i<values.length;i++)
            {
                System.out.print(values[i]+"  ");
            }
            System.out.println();
        }

下面我们将获取来的数据封装起来,然后展示

try {
            request.setCharacterEncoding("utf-8");
            //getParameterMap的使用
            Map<String,String[]> maps = request.getParameterMap();//一次性得到表单上提交过来的所有名称值对儿
            User user = new User();

            //遍历Map集合
            for(Map.Entry<String, String[]> en:maps.entrySet())// username=冬冬
            {
                String name = en.getKey();//得到键 username
                String[] value = en.getValue();//得到值

                //属性描述器  getUsername()  setUsername()---Method
                PropertyDescriptor des = new PropertyDescriptor(name, User.class);

                //从属性描述器中得到set方法
                Method m = des.getWriteMethod();

                //执行 set方法
                if(value.length==1)
                    m.invoke(user, value[0]);
                else
                    m.invoke(user, (Object)value);
            }

            System.out.println(user);

        } catch (Exception e) {

            e.printStackTrace();
        }

这是我们自己写的方法来实现这个功能,User类就不展示了。
当然,也有封装好的类实现了这个功能。

try {
            request.setCharacterEncoding("utf-8");
            User user = new User();
            BeanUtils.populate(user, request.getParameterMap());
            System.out.println(user);

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

需要用到两个包
使用commons-beanutils.jar和commons-logging.jar实现上边的功能
包去我的资源里下载。



ServletInputStream

//使用getInputStream()获取表单提交的数据
            ServletInputStream in = request.getInputStream();
            int len = 0;
            byte[] arr = new byte[1024];
            while((len = in.read(arr))!=-1)
            {
                //System.out.println(new String(arr,0,len));
                System.out.println(URLDecoder.decode(new String(arr,0,len,"utf-8"), "utf-8"));
            }
            in.close();



以get方式提交表单时,乱码问题的解决,之前说了post提交时乱码问题。
get方式解决乱码需要先解码,然后再编码。

//再编码,再解码功能的函数
    public String fun(String str) 
    {
        String result = "";
        try {
            result = new String(str.getBytes("ISO8859-1"),"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
          //以get方式提交表单数据的乱码处理---tomcat默认用iso8859-1进行解码,所以乱码
          //获取用户名
          String name = request.getParameter("username");
//        //再编码
//        byte[] arr = name.getBytes("ISO8859-1");
//        //再解码
//        String ss = new String(arr,"utf-8");
          String ss = fun(name);
          System.out.println(ss);

    }

这里我们将编码解码的过程封装到了一个函数里。
其他的看代码注释把。


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值