JSP学习之Request,Response对象

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。
发布了46 篇原创文章 · 获赞 11 · 访问量 3912

猜你喜欢

转载自blog.csdn.net/qq_42197800/article/details/93139213