JavaWeb中的重定向和请求转发相关知识

JavaWeb中的重定向和请求转发

1.重定向和请求转发的区别

  • 请求转发是一次请求,浏览器路径不会发生变化;
  • 重定向是多次请求,浏览器地址栏路径会发生变化;
  • 请求转发可以拿到request中的数据,重定向不可拿到request中的数据;
  • 请求转发可以访问WEB-INF路径下的内容,重定向不可以;
  • 请求转发状态码200,重定向状态码302;
  • 请求转发是在服务器内部进行的,重定向是在客户端进行的;
  • 请求转发只能在自己的服务器内部,重定向可以定位到任意浏览器可以访问的路径;

2.重定向

2.1写法

在JavaWeb中,重定向的写法是:

response.sendRedirect("/error.jsp"); //跳转到失败界面

2.2重定向由谁来处理

一般情况下,重定向是交给客服端处理的;

/表示什么

在 JavaWeb 中,交给“浏览器”处理的 “/” 表示的是 “http://主机|IP:端口” 。
例如:http://localhost:8080 或者 http://127.0.0.1:8080
那么,也就是说,我们上面

response.sendRedirect("/error.jsp"); //跳转到失败界面

就是跳转到了 http://localhost:8080/error.jsp 或者 http://127.0.0.1:8080/error.jsp 这个界面,这样子就会出现页面找不到的 404 错误。
如果,我们把上面改成

response.sendRedirect("/shop/error.jsp");

那么,页面就是跳转到了 http://localhost:8080/shop/error.jsp 或者 http://127.0.0.1:8080/shop/error.jsp 这个界面,这就不会出错了。但是不推荐上面的那种写法,推荐用下面这种写法:

response.sendRedirect(pageContext.request.contextPath + "/error.jsp");
 response.sendRedirect(request.getContextPath() + "/error.jsp);

这样子写会自动获取项目名称。

3.请求转发

3.1请求转发写法

在 JavaWeb 中,“请求转发”的写法是:

request.getRequestDispatcher("/main.jsp").forward(request, response); //请求转发到主界面

3.2谁来处理

一般情况下,请求转发是在Tomcat容器中完成的;

3.3/表示什么

在 JavaWeb 中,交给“Servlet容器”处理的 “/” 表示的是 “http://主机|IP:端口/站点名” 。
  例如:http://localhost:8080/shop 或者 http://127.0.0.1:8080/shop
  那么,也就是说,我们上面

request.getRequestDispatcher("/main.jsp").forward(request, response); //请求转发到主界面

就是跳转到了 http://localhost:8080/shop/main.jsp 或者 http://127.0.0.1:8080/shop/main.jsp 这个界面。

3.4关于 “/” 的其它一些表示方式

  • “./” :代表文件所在的目录(可以省略不写)
  • “../” :代表文件所在的父级目录(回到上一级)
  • “../../” :代表文件所在的父级目录的父级目录(回到上一级的上一级)

3.5JavaWeb 的 JSP 获取“根目录(path)”的写法

${pageContext.request.contextPath}
<%=request.getContextPath()%>

4.请求转发和重定向代码演示

4.1代码展示

ForwardServlet.java

package com.qiancheng.redirect;

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;

/**
 * @Author: QianCheng
 * @Date: 2021- 03-26-11:20
 * @Descrription: ${PACKAGE_NAME}
 * @version: 1.0
 */
@WebServlet(name = "servlet4", urlPatterns = "/servlet4")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        request.setAttribute("msg","redirect在request域中的数值");
        response.setContentType("text/html;charset=utf-8");
        response.sendRedirect("/servlet6");
    }
}

ForwardServlet2.java

package com.qiancheng.forward;

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;

/**
 * @Author: QianCheng
 * @Date: 2021- 03-26-10:19
 * @Descrription: ${PACKAGE_NAME}
 * @version: 1.0
 */
@WebServlet(name = "servlet2", urlPatterns = "/servlet2")
public class ForwardServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        System.out.println(request.getAttribute("msg"));
        System.out.println(request.getContextPath() == null);
      //  request.getRequestDispatcher("/page/outer.jsp").forward(request, response);
        request.getRequestDispatcher("/WEB-INF/page/inner.jsp").forward(request, response);
    }
}

ForwardServlet3.java

package com.qiancheng.forward1;

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;

/**
 * @Author: QianCheng
 * @Date: 2021- 03-26-9:59
 * @Descrription: ${PACKAGE_NAME}
 * @version: 1.0
 */

@WebServlet(name = "servlet3", urlPatterns = "/servlet3")
public class ForwardServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
//        request.getRequestDispatcher("/page/outer.jsp").forward(request, response);
        request.getRequestDispatcher("/WEB-INF/page/inner.jsp").forward(request, response);
    }
}

RedirectServlet.java

package com.qiancheng.redirect;

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;

/**
 * @Author: QianCheng
 * @Date: 2021- 03-26-11:20
 * @Descrription: ${PACKAGE_NAME}
 * @version: 1.0
 */
@WebServlet(name = "servlet4", urlPatterns = "/servlet4")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        request.setAttribute("msg","redirect在request域中的数值");
        response.setContentType("text/html;charset=utf-8");
        response.sendRedirect("/servlet6");
    }
}

RedirectServlet2.java

package com.qiancheng.redirect;

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;

/**
 * @Author: QianCheng
 * @Date: 2021- 03-26-11:25
 * @Descrription: ${PACKAGE_NAME}
 * @version: 1.0
 */
@WebServlet(name = "servlet5", urlPatterns = "/servlet5")
public class RedirectServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet5");
        System.out.println(request.getAttribute("msg"));
//        response.sendRedirect("/page/outer.jsp");
        response.sendRedirect("/WEB-INF/page/outer.jsp");
    }
}

RedirectServlet3.java

package com.qiancheng.redirect2;

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;

/**
 * @Author: QianCheng
 * @Date: 2021- 03-26-11:25
 * @Descrription: ${PACKAGE_NAME}
 * @version: 1.0
 */
@WebServlet(name = "servlet6", urlPatterns = "/servlet6")
public class RedirectServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet6");
        System.out.println(request.getAttribute("msg"));
//        response.sendRedirect("/page/outer.jsp");
        response.sendRedirect("/page/outer.jsp");
    }
}

5.请求转发中include与forward的区别

forward:是让第一个请求,调用第二个请求,并且让第二个请求给客户端作出响应。
include:是第一个请求,调用第二个请求,当第二个请求执行完毕后,回到第一个请求,由第一个请求对数据进行响应;

6.JSP中获取路径的方法介绍


以访问的jsp为:http://localhost:8080/dmsd-itoo-exam-log-web/course/index.jsp,工程名为/dmsd-itoo-exam-log-web为例:

request.getContextPath(),得到工程名:/dmsd-itoo-exam-log-web;

request.getServletPath(),返回当前页面所在目录下全名称:/course/index.jsp;

request.getRequestURL(),返回IE地址栏地址:http://localhost:8080/dmsd-itoo-exam-log-web/course/index.jsp;

request.getRequestURI() ,返回包含工程名的当前页面全路径:/dmsd-itoo-exam-log-web/course/index.jsp。
posted @ 2021-03-26 18:54  迁承_0204  阅读(604)  评论(0编辑  收藏  举报