Servlet中的对象Request

Request

  代表Http请求的对象,其中包含了请求相关的信息。
  浏览器向服务器发送请求,服务器在调用Servlet的service方法之前,会创建代表请求的Requet对象,将所有的请求信息封装在Request对象中。

1.1Request继承关系

  ServletRequest接口 - 提供了一个Request对象应该具有的功能
     HttpServletRequest接口 - 继承了ServletRequest接口,并且添加了很多和Http协议相关的方法。
      | ——Xxx类——–>Request对象

1.2Request功能

1.2.1获取客户机的基本信息、获取请求头信息
   1.getRequestURL() ——获取浏览器发送请求的完整URL
   2.getRemtoAddr()——–获取客户机的IP地址
   3.getMethod()——-获取发送请求的方式
   4.getContextPath()———–获取web应用虚拟路径(web应用的名称)
   5.getHeader(String name) ————根据请求头的名字取其对应的值
  

1.2.2 获取请求参数(!!!!)

   1.获取请求参数的方法
   由于Request对象是代表Http请求信息的对象,其中请求参数也是请求信息,因此在Request对象上也提供了获取请求参数的方法,如下:
   1).getParmeter(String name)—-根据请求参数的名字获取指定的value值
   2).getParameterValues(String name) ——根据请求参数的名字获取指定的value值组成的数组
   3).getParameterMap()——-获取所有请求参数组成的map集合!
   获取请求参数代码实例:

//1.getParameter(String name)
String username = 
        request.getParameter("username");
System.out.println("username="+username);

String like = 
        request.getParameter("like");
System.out.println("like="+like);
/* 如果一个参数对应多个值, getParameter
 * 方法只能获取第一个值, 如果想获取全部的值
 * 可以使用getParameterValues */

//2.getParameterValue(String name)
String[] likes = request
        .getParameterValues("like");
System.out.println(Arrays.toString(likes));

//3.getParameterMap()
Map<String, String[]> map = 
        request.getParameterMap();

for(Map.Entry<String, String[]> entry
        : map.entrySet() ){
    System.out.println( 
        entry.getKey()+" : " 
        + Arrays.toString( entry.getValue() )
    );
}

  2.在获取中文参数时的乱码 问题
  (1)乱码产生的原因:
  这里写图片描述
   a)解码:浏览器向服务器发送请求参数时使用的编码是:utf-8
   b)解码:服务器端接收浏览器发送过来的解码:如果不是指默认的iso8859-1
两端编码不一致所造成了乱码。
   (2)解决方案:通过乱码产生了原理手动编码(参看上面的图示)

String username = 
        request.getParameter("username");
System.out.println("username="+username);//???é??

//解决乱码(根据乱码产生的原理手动编解码)
byte[] bytes = username
        .getBytes("iso8859-1");
username = new String(bytes, "utf-8");
System.out.println("(解决后)username="+username);//张飞

  (3)如果请求方式为POST,还可以这样来解决:

request.setCharacterEncoding(“utf-8”);

   这行代码是通知服务器使用utf-8接收请求实体内容中的数据,由于POST提交的参数就在请求实体内内中,所有这行代码对POST提交的乱码起作用。
   而GET提交的请求参数不在请求实体内容中,而是在请求行中的请求资源路径后面拼接着,所以这行代码对GET提交的参数乱码不起作用!
   注意:通过修改tomcat服务器核心配置文件(server.xml)在70行中添加一个
URLEncoding属性设置为utf-8就可以解决GET提交的参数乱码,但是不推荐,因为这样修改会使程序依赖运行环境,一旦换一个发布环境,代码就执行不了了。
   1.2.3 实现请求转发(!!!)
   1.实现请求转发:可以实现资源的跳转(同一个web应用内部的资源跳转)
   2.实现请求转发的代码:

request.getRequestDispatcher(“将要转发资源的地址”).forward(req,res);

示例:
System.out.println("Demo4......");
/* 由于当前Servlet无法处理请求,所以将请求
 * 转发给了Demo5来处理 */
request.getRequestDispatcher("/RequestDemo5").forward(request, response);

   3.请求转发中的细节问题:

1)在转发之前,如果向response缓冲区写入了数据但是没有强制刷给浏览器,在转发时response缓冲区中的数据会被清空。
response.getWriter().write("Demo4......");
request.getRequestDispatcher("/RequestDemo5").forward(request, response);
(2)在转发之前,如果向response缓冲区写入了数据并且强制刷给了浏览器,转发将会失败。
response.getWriter().write("Demo4......");
response.flushBuffer();
request.getRequestDispatcher("/RequestDemo5").forward(request, response);
(3)在同一个资源内部不能进行多次转发,但是可以进行多重转发。

  1.2.4 作为域对象使用(!!!)
  在javaWeb中一共有4个对象,分别是request,servletContext,session,pageContext.
  1.什么是域对象:如果一个对象具有能被看见的范围,通过这个对象上的map可以在整个范围内实现资源的共享。
  2.Request域对象提供的方法:

request.setAttribute(String name, Object value); -- 往Request对象上的map中存入一个域属性。
request.getAttribute(String name); -- 从Request的map中获取一个指定名称的属性值
request.removeAttribute(String name); -- 将指定名称的域属性从Request域中删除
request.getAttributeNames(); -- 从Request域中获取所有属性名称组成的枚举

  3.Request域对象的三个特征:
  (1)生命周期:一次请求开始创建Request对象,一次请求结束销毁Request对象。
  (2)作用范围:整个请求链
  (3)主要功能:在整个请求连范围内实现资源的共享。
1.2.5 实现请求包含
   所谓的请求包含就是资源合并的现象。
   如果浏览器发送请求访问AServlet,AServlet在处理的过程中发现自己不能独立的处理这次请求,需要BServlet一起来处理,可以在AServlet中将BServlet包含进来,包含之后将会由AServlet和BServlet一起来处理请求,处理的结果也会合并在一起,一起发送给浏览器。 
   代码示列:
   这里写图片描述

System.out.println("demo8....");

response.getWriter().write("Hello...");

/* 将RequestDemo9包含进来,包含的结果是将会
 * 由Demo8和Demo9共同来处理这次请求,处理的
 * 结果也会合并在一起,一起发送给浏览器 */
request.getRequestDispatcher("/RequestDemo9")
            .include(request, response);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值