轉發與重定向的區別
前言:之前寫了幾篇JSP的部落格,現在又回過頭來看Servlet,溫故而知新,再回顧回顧,總會有收穫的。以前學習Servlet感覺內容很多,現在看的時候,其實也沒多少東西,只需知道Servlet的生命週期,Servlet的實現方式,ServletContext作用域,接收和響應,轉發和重定向,我覺得差不多夠用了。當然,要是細究的話也不止這些,我針對的是新手。
轉發與重定向簡介
轉發和重定向都是實現頁面跳轉,也就是說,當我們訪問一個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); } }
結束語
Servlet分享到此結束,想了解更多的朋友可以看之前總結過的部落格《Servlet》https://www.cnblogs.com/zyx110/p/10771172.html,和《JSP》https://www.cnblogs.com/zyx110/p/10926587.html ,更多精彩等你來學習。
*****************************************************************************************************
我的部落格園地址:https://www.cnblogs.com/zyx110/
轉載請說明出處
我不能保證我所說的都是對的,但我能保證每一篇都是用心去寫的,我始終認同“分享的越多,你的價值增值越大”,歡迎大家關注我的技術分享“Java匹馬行天下”和學習心得分享“匹馬行天下”,在分享中進步,越努力越幸運,期待我們都有美好的明天!
支援我的朋友們記得點波推薦哦,您的肯定就是我進步的動力。