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。
努力奔跑,是为了追上曾经被寄予厚望的自己。