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