转发和重定向区别

转发和重定向

1.0 面试提问

  1. 定义不同
  2. 跳转的方式不同
  3. 数据共享不同
  4. 最终的URL地址不同
  5. 代码实现不同

1. 转发

1.1 概念

转发实际上在服务器端进行页面的跳转操作,请求转发:一种在服务器内部的资源的跳转的方式。

访问A,A请求转发了B,访问A的同时就也访问到了B。
带参数跳到指定的页面,比如request。
访问A,进入A的网址,然后在A里面请求转发B,就是带着A的请求到了B。

1.2 特点

  1. 转发操作用户只请求了一次
  2. 转发操作用户请求的URL不发生改变
  3. 转发操作只能够转发服务器内部的资源.
  4. 转发操作过程中,任何一个步骤都可以获取用户的请求参数,获取之前其他操作添加的数据内容, 即请求域中的数据不会丢失。
  5. 转发操作是服务器行为。

1.3 方法(通过HttpServletRequest)

方法 含义
获取参数
String getParameter(String name); 通过名称获取用户请求参数对应的数据
Map(String,String[]) getParameterMap(); 直接获取用户请求参数对应的map双边队列
String[] getParameterValues(String names); 通过名称获取对应的Value值
获取属性存储的数据
void setAttribute(String name,Object obj); request 对象添加属性的操作,
要求提供属性名称和对应的属性值
,属性名称是String 类型,值为Object 什么类型都可以
Object getAttribute(String name); 根据属性的名称获取对应的属性值,返回是Object。可使用强转。
void removeAttribute(String name); 删除属性的操作,根据属性名称删除属性信息,属性名称+属性值都删除

区分:

​ Parameter : 用户提交的数据,通过表单,ajax,等方式获取,数据形式是键值对的形式。Servlet获取的数据类型是String类型。

​ Attribute属性:服务器在转发的过程中的操作,方便后续资源的使用,在Attribute 属性中添加属性数据,类似于Map 类型。name = value 模式,value 类型不会限制。

1.4 Request域对象特征

域对象: 表示的是一定范围内的有效的对象

有效范围: 对于HttpServletRequest 对象是整个转发路径中的所有的相关的资源范围内有效。

1.5 实例

  1. 首先: Servlet 接收用户的请求,转发到中间的Servlet。
  2. 中间的Servlet 接收其他的Servlet转发访问,同时添加访问的内容,转发到最终的处理需求的Servlet。
  3. 最终的Servlet 完成针对于用户的响应的请求之后,同时用户的请求的数据和中间的Servlet添加属性数据。

转发和重定向区别_第1张图片

@WebServlet("/test1")
public class ADispatchServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决Servlet中的乱码的问题
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        System.out.println("首先收到指定的请求操作");
        System.out.println("请求中的参数1是"+ req.getParameter("user1"));
        System.out.println("请求中的参数2是"+ req.getParameter("user2"));

        /**
         * 执行转发的操作通过request 对象进行调用指定的方法,然后通过forword转发到目标的资源中,提供请求对象和响应对象
         */
        req.getRequestDispatcher("test2").forward(req, resp);
    }
}



@WebServlet("/test2")
public class BDispatchServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        当前 Servlet 对应的请求和响应不是 Tomcat 服务器用户请求创建和绑定的
        而是上一个资源,在转发过程中, 提交给当前 Servlet 程序运行所需的请求
        和响应对象
         */
        System.out.println("收到test1 中的转发");
        System.out.println("所需要的参数一"+req.getParameter("user1"));
        System.out.println("所需要的参数二"+req.getParameter("user2"));

        // 给当前的request对象添加属性值,进行传递操作
        req.setAttribute("none","张三,李四");
        req.getRequestDispatcher("test3").forward(req, resp);

    }
}


@WebServlet("/test3")
public class CDispatchServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("重定向");
        System.out.println("获取请求中的1参数;"+req.getParameter("user1"));
        System.out.println("获取请求中的2参数;"+req.getParameter("user2"));

        System.out.println("获取上一级建立的属性的参数");
        System.out.println(req.getAttribute("none"));
        resp.getWriter().append((String)req.getAttribute("none"));
    }
}

1.6 总结

1. 得到转发器: 
    RequestDispatcher request.getRequestDispatcher("/跳转的地址")  参数是要跳转的地址
2. 实现转发操作
    转发器对象.forward(request,response)
    表示的含义是  将请求和响应提交过去,保证转发过去的页面也能够有同样的request 和 response。

总结

​ 实现:request.getRequestDispatcher(“/跳转的地址”).forward(request,response);

2. 重定向

2.1 概念

重定向就是通过各种方法将各种网络请求重新定个方向转到其他的位置。也就是说在网页上设置一个约束条件,如果满足条件,就会自动跳转到其他的网页上。例如:网页重定向、域名重定向、路由的选择的变化也是重定向.

2.2 特点

  1. 用户请求多次(两次两次以上)
  2. URL会改变
  3. 浏览器行为
  4. 操作后用户无法获取请求资源和中间资源
  5. 可以定向至服务器内部资源,也能够访问服务器外部资源

2.3 核心

核心变量:

HttpServletResponse 对象

核心方法:

SendRedirect(String location) 完成对应的重定向的操作

response.sendRedirect("跳转的地址")

2.4 网页定向

在我们创建网站的时候,时常能够遇到网页需要重定向的情况

  1. 网站的调整,改变网页的目录结构
  2. 网页被移动到一个新的地址
  3. 网页拓展名称改变。
  4. 注册了多个域名的网站,也需要通过重定向让访问这个域名的用户自动跳转到主站点。

转发和重定向区别_第2张图片

3. 使用区分总结

如果需要保存数据域中的数据,则需要进行转发的实现操作,否则需要使用重定向。

如果之后需要访问数据库,增删改的操作,需要使用重定向的操作,查询的时候使用转发。

区别 转发forward() 重定向sendRedirect()
根目录 包含项目的访问地址 没有项目的访问地址
地址栏 不会发生改变 会发生变化
哪里跳转 服务端进行的跳转 浏览器进行的跳转
请求域中的数据 不会丢失 会丢失

你可能感兴趣的:(java,servlet,java,前端)