Java第四十二天,Http协议,Request

一、Request、Response原理

  1. Tomcat 服务器会根据请求ur1中的资源路径,创建对应的 XXXServlet 的对象
  2. tomcat服务器,会创建 request和response对象, request对象中封装请求消息数据。
  3. tomcat将 request 和 response 两个对象传递给service 方法,并且调用 serv⊥ce 方法
  4. 程序员,可以通过 request 对象获取请求消息数据,通过通过 response 对象设置响应消息
  5. 服务器在给浏览器做出响应之前会从 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 对象
作者:蓝月

-------------------------------------------

个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

原文地址:https://www.cnblogs.com/viplanyue/p/13573679.html