Request对象的介绍和获取请求头信息
- 问题:
浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。那么服务器接收到请求的数据该怎么存储呢?不但要存,还要保证完整性。 - 解决:
使用对象进行存储,服务器每接收一个请求,就创建一个对象专门的存储此次请求的请求数据。 - 实现:
Request对象 - 解释:
服务器接收到浏览器的请求后,会创建一个Request对象,对象中存储了此次请求相关的请求数据。服务器在调用servlet时会将创建的Request对象作为实参传递给Servlet的方法,比如:service()方法。 - request作用
request对象中封存了当前请求的所有请求信息; - 使用
(1)获取请求头数据:
获取请求方式:request.getMethod();
获取请求URL:request.getRequestURL();
获取请求URI:request.getRequestURI();
获取请求协议:request.getScheme();
(2)获取请求行数据
获取指定的请求行信息:request.getHeader(“User-Agent”)
可以从浏览器开发者工具查看
获取所有的请求行的枚举:
Enumeration e = req.getHeaderNames();
While(e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = req.getHeader(name);
}
(3)获取用户数据
Get或者post方式都用下面的方法获取,在浏览器web中也可以查看到该键值对,以表单提交用户名name和密码pwd为例
req.getParameter(“name”);
req.getParameter(“pwd”)
注意:getParameter()不能获取同键不同值的请求数据,如checkbox,会漏值;需要获取的话,用getParameterValues(checkbox);
不过需要判断是否为null,避免空指针异常;
(4)获取所有的用户请求数据的键的枚举集合
req.getParameterNames();
注意:如果要获取的请求数据不存在,不会报错,返回null值。
- 注意:
request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
Request请求转发
- 解释
将当前servlet的请求数据流转给其他的servlet,将一个reqeust对象的作用域扩大到多个servlet。因为一次请求内的servlet共享request对象,进行请求转发,servlet为多个;不进行请求转发,servlet为一个; - 使用
//存储数据到request的作用域
request.setAttribute(“键”,“值”);
//进行请求转发
request.getRequestDispatcher(“要转发的servlet”).forward(request, response);
Request对象的作用域
- 问题:
使用请求转发后,不同的servlet之间怎么进行数据的共享呢?或者说数据怎么从一个servlet流转给另一个servlet呢? - 解决:
使用request对象的作用域 - 使用(进行请求转发时使用)
request.setAttribute(object name, object value);
request.getAttribute(object obj)
//存储数据到request的作用域
request.setAttribute(“键”,“值”);
//进行请求转发
request.getRequestDispatcher(“要转发的servlet”).forward(request, response);
//在目标servlet中取出request作用域的数据
String str = (String)request.getAttribute(“键”);
//显示在页面上
if(str != null){
response.getWriter().write(“<font color=’red’ size=’20px’>”+str+”</font>”)
}
//使用三目运算符取出request作用域的数据
String str = (String)req.getAttribute(“键”)==null ? ””: (String)request.getAttribute(“键”);
- 作用
解决了一次请求内的不同servlet的数据(请求数据+其他数据)共享问题; - 作用域
基于请求转发,一次请求中的所有servlet共享; - 注意
使用request对象进行数据流转,数据只在一次请求内有效; - 特点
服务器创建
每次请求都会创建
生命周期一次请求
Response对象
-
问题:
在使用request对象获取了请求数据并进行处理后,处理的结果如何显示到浏览器中呢? -
解决:
使用Response对象 -
解释:
服务器在调用指定的Servlet进行请求处理的时候,会给Servlet的方法传递两个实参Request和Response。其中Request中封存了请求相关的请求数据,而Response则是用来进行响应的一个对象。 -
response作用
响应数据到浏览器的一个对象 -
使用
(1)设置响应头
在响应头中添加响应信息
response.setHeader(“ContentType/”,“two fly bird”)
response.addHeader(“key”,”thinkpad”)
当有多个同名键时,setHeader会覆盖,addHeader不会覆盖
(2)设置响应编码格式
response.setContentType(“text/html;charset=utf-8”)
response.setHeader(“content-type”, “text/html;charset=utf-8”)
注意:
“text/plain;charset=utf-8” 是普通文本。
“text/xml;charset=utf-8” 是xml文本。
(3)设置响应状态码
response.sendError(“404”,“sorry”); 自定义响应状态码
(4)设置响应实体
响应具体的数据给浏览器
resp.getWriter().write(“<b>this is response body</b>”)
注意:设置了这个就不要设置响应状态码
以上是request对象和response对象常见的一些方法,其他的方法可以自己去学习。
Response重定向
- 解释
从当前servlet重定向到另一个servlet,发起第二个请求。如果想要进行数据流转,需要使用session,因为涉及到了不同请求的数据流转。 - 问题
如果当前的请求,servlet无法进行处理怎么办?
如果使用请求转发,会造成表单数据重复提交怎么办? - 解决
使用重定向 - 使用
response.sendRedirect(“路径”);
本地路径为:uri
网络路径为:定向资源的URL信息
- 特点
两次请求,两个request对象
浏览器地址栏信息改变
避免表单重复提交 - 使用时机
如果请求中有表单数据,而数据又比较重要,不能重复提交,建议适用重定向;
如果请求被servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源;
说明(重点)
- Request的请求转发是一次请求,进行数据流转时使用的是request的作用域。
- Response的重定向是两次请求,进行数据流转时使用的是session。