03.Request

Request对象

即HttpServletRequest对象,该对象它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法.

Http请求包含哪些东西

在这里插入图片描述

Get请求中没有请求体,它请求体中的参数都附带在请求路径上了

Request获取请求行

请求行主要有两个重要的东西,请求方式和请求路径

//获取请求方式。如:post,get
request.getMethod();
//获取项目路径  
request.getContextPath();

获取项目访问路径非常重要,在servlet中进行重定向时,可以不把项目名写死,如;
访问项目下的loginServlet

//原先的方式
response.sendRedirect("/项目名/login");
//现在的方式
response.sendRedirect(request.getContextPath()+"/login");

Request 获取请求头

从上图中可以看出,请求头的数据和响应头的数据格式都是键值对的形式。所以HttpServletRequest提供了输入key就可以获得value的方法。

  • 获取单个value
//根据键获取对应的值
String getHeader(String name) ;
//获取浏览器的信息
tring userAgent = request.getHeader("User-Agent");
  • 一次性获取所有的key,再进行迭代
//返回所有key
 Enumeration<String> enumeration = request.getHeaderNames();
 //迭代获取value
  while(enumeration.hasMoreElements()){
               String key =  enumeration.nextElement();
               //根据 key获取value
               String value = request.getHeader(key);
               System.out.println(key+":"+value);
        }

Request获取请求体

只有Post请求的方式才有请求体,Get方式请求的参数附加在请求路径上。但都可以通过相同的方式获取。

  • 方法一: 获取单个请求参数
//根据一个参数名,获取参数的值   
String getParameter(String name) ;
String username = request.getParameter("username");
  • 方法二: 单个参数有多个值
//根据一个参数名,获取参数的多个值   如果没有值,则返回null
String[] getParameterValues(String name)    一个键多个值
  • 方式三: 获取所有请求参数的key,通过迭代获取value
getParamterValues()
Map<String,String[]> map = request.getParameterMap();
//取出map中所有的key
 Set<String> keys = map.keySet();
for(String key:keys){
System.out.println(key+" "+Arrays.toString(map.get(key)));//get方法根据key查找value
}

Request获取请求参数出现中文乱码

请求参数出现乱码的原因还是由于浏览器和tomcat默认的编码方式不同,浏览器通过本地的默认编码方式(GBK,UTF-8)将中文进行编码,tomcat使用默认的iso-8859-1编码进行解码,这样当然会出现乱码;
在这里插入图片描述

  • 方式一:修改tomcat的xml配置文件,更改默认编码方式
    打开tomcat中conf目录下的server.xml文件,找到
    在这里插入图片描述
    添加URIEncoding属性,设置为UTF-8。即可将默认编码方式改为UTF-8.
    在这里插入图片描述
    这种方式虽然一劳永逸,但会导致服务器并不灵活,不推荐

  • 方式二: post请求乱码,只需要设置request对象的编码即可。

 request.setCharacterEncoding("UTF-8");
  • 方式三: get请求乱码

    1. tomcat8.5及其以后get请求不会乱码
    2. get请求乱码通过设置setCharacterEncoding并不管用,需要将字符串进行iso-8859-1解码,再使用utf-8编码.
      接上图:
      get请求乱码原因是这样:在这里插入图片描述
      可以将乱码反过来用:
      在这里插入图片描述

    代码实现为:

    //data = ???
    String data = request.getParameter("country");
    //将data进行iso-8859-1编码 
    byte[] bytes = data.getBytes("iso-8859-1");
    //utf-8解码
    String str = new String(bytes,"utf-8");
    //一步到位
    String str = new String(data.getBytes("iso-8859-1"),"utf-8");
    

    Request转发

    Request转发的原理是:当前Sevlet接收到请求后,处理不了或者还需交给其他servlet处理,服务器将你的请求转发给其他servlet。转发容易与重定向弄混,现在说明下区别:

    • 重定向:
      两次请求,两次响应
      重定向不携带数据
      重定向地址栏发生改变
    • 转发
      一次请求,一次响应
      转发需要携带数据
      转发地址栏不会发生变化

      在这里插入图片描述
      代码实现:
   request.getRequestDispatcher("/login").forward(request,response);

注1:从服务端请求自己的资源路径都不需要项目路径名,如转发请求资源;从客户端发起的请求都需要加上项目路径名,如用户提交表单。
注2: 如果重定向和转发都可以实现效果,建议优先使用转发,转发只会产生一次请求,可以减少服务端的负担。
注3:在URL路径上添加中文参数一定要使用URL编码,在浏览器上填写的路径浏览器会自动帮我们编码,但自己创建的URL路径附件中文参数,需要使用URLEncoder对象进行编码。

String url = "http://localhost:8080/MyWeb/login?username=张三";
URLEncoder.encode(url,"UTF-8");

,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值