聊聊Java中的轉發與重定向
作者:泰斗賢若如
轉發和重定向都是實現頁面跳轉,也就是說,當我們訪問一個 Servlet 的時候 ,Servlet 幫我們跳轉到另一個界面。
本文轉載自微信公眾號「見賢思編程」,作者泰斗賢若如。轉載本文請聯系見賢思編程公眾號。
轉發與重定向簡介
轉發和重定向都是實現頁面跳轉
也就是說,當我們訪問一個 Servlet 的時候 ,Servlet 幫我們跳轉到另一個界面。
轉發與重定向的區別
- 實現轉發調用的是 HttpServletRequest 對象中的方法
- 實現重定向調用的是 HttpServletResponse 對象中的方法
- 轉發時瀏覽器中的 url 地址不會發生改變
- 重定向時瀏覽器中的 url 地址會發生改變
- 轉發時瀏覽器只請求一次服務器
- 重定向時瀏覽器請求兩次服務器
- 轉發能使用 request 帶數據到跳轉的頁面
- 重定向能使用 ServletContext 帶數據到跳轉的頁面
代碼演示轉發和重定向
- package 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("/login")
- public class ServletDemo extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //獲取表單提交過來的數據
- //getParameter()方法可以獲取請求的參數信息
- String name = req.getParameter("name");
- String password = req.getParameter("password");
- //打印獲取到的參數信息
- System.out.println("name:"+name);
- System.out.println("password:"+password);
- //如果name=admin,password=123,則跳轉到succee.jsp,否則跳轉到fail.jsp
- if("admin".equals(name)&&"123".equals(password)){
- //通過轉發實現跳轉
- req.getRequestDispatcher("/success.jsp").forward(req,resp);
- }else {
- //通過重定向實現跳轉
- resp.sendRedirect("/fail.jsp");
- }
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req, resp);
- }
- }
JSP代碼
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>登錄</title>
- </head>
- <body>
- <form action="/login">
- <table align="center">
- <tr>
- <td>賬號:</td>
- <td><input type="text" name="name"></td>
- </tr>
- <tr>
- <td>密碼:</td>
- <td><input type="text" name="password"></td>
- </tr>
- <tr>
- <td><input type="submit" value="登錄"></td>
- <td><input type="reset" value="重置"></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
轉發和重定向如何帶數據到某個頁面
- package servlet;
- import javax.servlet.ServletContext;
- 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("/login")
- public class ServletDemo extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //通過轉發帶數據
- req.setAttribute("name","張三");
- req.getRequestDispatcher("/send.jsp").forward(req,resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req, resp);
- }
- }
send.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>轉發和重定向傳代數據練習</title>
- </head>
- <body>
- <%
- //1、接收轉發傳代的數據
- String name = (String) request.getAttribute("name");
- out.println("轉發傳代的數據:"+name);
- %>
- </body>
- </html>
- package servlet;
- import javax.servlet.ServletContext;
- 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("/login")
- public class ServletDemo extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //通過重定向帶數據
- ServletContext servletContext = this.getServletContext();
- servletContext.setAttribute("name","王二麻子");
- resp.sendRedirect("/send2.jsp");
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req, resp);
- }
- }
send2.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>轉發和重定向傳代數據練習</title>
- </head>
- <body>
- <%
- //1、接收重定向傳代的數據
- String name1 = (String)application.getAttribute("name");
- out.println("重定向傳代的數據:"+name1);
- %>
- </body>
- </html>
練習
index.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- <form action="CountServlet" method="post">
- <h3>加法計算器</h3>
- 加數1:<input type="number" name="one">
- 加數2:<input type="number" name="two">
- <input type="submit" value="計算">
- </form>
- </body>
- </html>
count.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- 計算結果:<%=request.getAttribute("count")%>
- <!--計算結果:<%=application.getAttribute("count")%>-->
- </body>
- </html>
Servlet
- package servlet;
- import javax.servlet.ServletContext;
- 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("/CountServlet")
- public class CountServlet extends HttpServlet {
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- String one=request.getParameter("one");
- int o=Integer.parseInt(one);//強制轉換,將String類型的數據轉換成int類型
- String two=request.getParameter("two");
- int t=Integer.parseInt(two);//強制轉換,將String類型的數據轉換成int類型
- System.out.println(one+" "+two);
- int c=o+t;
- String co=String.valueOf(c);//將int類型的數據轉換成String類型
- //轉發,可以攜帶數據
- request.setAttribute("count",co);
- request.getRequestDispatcher("count.jsp").forward(request,response);
- //用于存放數據
- // ServletContext s=this.getServletContext();
- // s.setAttribute("count",co);
- //重定向只能依靠ServletContext獲取數據
- // response.sendRedirect("count.jsp");
- System.out.println(co);
- }
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doPost(request,response);
- }
- }
責任編輯:武曉燕
來源:
見賢思編程