Java第四十二天,Http协议,Request
一、Request、Response原理
- Tomcat 服务器会根据请求ur1中的资源路径,创建对应的 XXXServlet 的对象
- tomcat服务器,会创建 request和response对象, request对象中封装请求消息数据。
- tomcat将 request 和 response 两个对象传递给service 方法,并且调用 serv⊥ce 方法
- 程序员,可以通过 request 对象获取请求消息数据,通过通过 response 对象设置响应消息
- 服务器在给浏览器做出响应之前会从 response 对象中拿程序员设置的响应消息数据
二、Request 的继承体系结构
ServletRequest (爷辈接口)
HttpServletRequest (父辈接口)
org.apache.catalina.connector.RequestFacade(实现类)
三、请求转发和重定向
1.请求转发
一种在服务器内部的资源跳转方式
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String path = "转发路径(即目的 Servlet 的 <url-pattern> url访问路径)";
RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher(path);
requestDispatcher.forward(servletRequest, servletResponse);
}
2.重定向
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重定向状态码(告知浏览器要跳转)
response.setStatus(302);
// 进行重定向操作
response.setHeader("location", "/test/second");
}
或者
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("/test/second");
}
四、请求转发和重定向的区别
1.请求转发
- 浏览器地址栏不发生变化
- 是服务器内部的资源跳转方式,不可访问外部资源
- 多个资源之间使用的是一次请求,可以使用 Request 域对象来共享数据
2.重定向
- 浏览器地址栏发生变化
- 重定向可以访问其他站点的资源
- 重定向是两次请求,不能使用 Request 域对象来共享数据
五、共享数据
1.域对象
一个有作用范围的对象,可以在范围内共享数据
2.request域
(1)定义
代表 一次请求 的范围,一般用于请求 转发 的多个资源中共享数据
(2)步骤
// 设置值
ServletRequest.setAttribute(String key, Object obj);
//获取值
ServletRequest.getAttribute(String key);
//根据键移除键值对
servletRequest.removeAttribute(String key);
=====================================================
//获取所有的返回值
servletRequest.getParameterMap();
//封装 获取的所有键值对 到 实体类对象
Map<String, String[]> parameterMap = servletRequest.getParameterMap();
BeanUtils.populate("要封装的实体类对象", parameterMap);
(3)举例
转发源 Servlet
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/second")
public class Second implements Servlet {
......
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 目的 Servlet 的转发路径
String path = "/first";
RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher(path);
servletRequest.setAttribute("key1", "value1");
servletRequest.setAttribute("key2", "value2");
servletRequest.setAttribute("key3", "value3");
requestDispatcher.forward(servletRequest, servletResponse);
}
}
转发目的 Servlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/first"})
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getAttribute("key1"));
System.out.println(req.getAttribute("key2"));
System.out.println(req.getAttribute("key3"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost......");
}
}
浏览器访问
效果
六、BeanUtils
1.功能
用于封装 JavaBean(标准的 Java类:必须被 public修饰,必须提供空参构造函数,成员变量必须被 private 修饰,提供公共的 getter 和 setter 方法)
2.成员变量和属性的区别
一般情况下一致,但有时候不一致
- 成员变量:类的所有成员变量
- 属性:getter 和 setter 方法截取后的产物
3.用方法
- setProperty:设置属性值
- getProperty:获取属性值
- populate:封装 JavaBean 对象