一、轉向(Forward) 1.要點說明 轉向是通過RequestDispatcher對象的forward()方法來實現的。RequestDispatcher可以通過HttpServletRequest的getRequestDispatcher()方法獲得。getRequestDispatcher( ...
一、轉向(Forward)
1.要點說明
轉向是通過RequestDispatcher對象的forward()方法來實現的。RequestDispatcher可以通過HttpServletRequest的getRequestDispatcher()方法獲得。getRequestDispatcher()方法的參數必須以“/”開始。Forward不僅可以跳轉到本應用的另一個Servlet、JSP頁面,也可以跳轉到另一個文件,甚至WEB-INF文件夾下的文件。
轉向通過request.setAttribute()把結果放到request中,然後forward到jsp中顯示。
註意:當執行forward動作的時候不能有任何輸出到客戶端(例如:System.out.println()),否則會拋出IllegalStateException。也就是在forward之前儘量不要使用out.println()語句向客戶端輸出。
2.代碼實踐
web.xml
1 <!-- 轉向(Forward) --> 2 <servlet> 3 <servlet-name>ForwardServlet</servlet-name> 4 <servlet-class>com.servlet.ForwardServlet</servlet-class> 5 </servlet> 6 <servlet-mapping> 7 <servlet-name>ForwardServlet</servlet-name> 8 <url-pattern>/servlet/ForwardServlet</url-pattern> 9 </servlet-mapping>
ForwardServlet.java
1 package com.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.RequestDispatcher; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class ForwardServlet extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 17 request.setCharacterEncoding("UTF-8"); 18 String destination = request.getParameter("destination"); 19 if("file".equals(destination)){//跳轉到/WEB-INF/web.xml 20 RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.xml"); 21 d.forward(request, response); 22 }else if("jsp".equals(destination)){//跳轉到UploadFile.jsp 23 RequestDispatcher dispatcher = request.getRequestDispatcher("/page/UploadFile.jsp"); 24 dispatcher.forward(request, response); 25 }else if("servlet".equals(destination)){//跳轉到另一個Servlet 26 RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet"); 27 dispatcher.forward(request, response); 28 }else{ 29 response.setCharacterEncoding("UTF-8"); 30 response.setContentType("text/html"); 31 response.getWriter().println("缺少參數。用法:"+request.getRequestURI()+ 32 "?destination=jsp或者file或者servlet"); 33 } 34 35 } 36 37 }
Forward.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'Forward.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <div align="center"> 27 <input type="button" onclick='location="<%=basePath%>servlet/ForwardServlet" 28 +"?destination=servlet";' value='跳轉到LifeCycleServlet'> 29 <input type="button" onclick='location="<%=basePath%>servlet/ForwardServlet" 30 +"?destination=file";' value='跳轉到web.xml'> 31 <input type="button" onclick='location="<%=basePath%>servlet/ForwardServlet" 32 +"?destination=jsp";' value='跳轉到JSP'> 33 </div> 34 </body> 35 </html>
3.效果截圖
Forward.jsp:
跳轉到servlet:
跳轉到web.xml:
跳轉到jsp:
二、重定向(Redirect)
1.重點說明
重定向是利用伺服器返回的狀態碼來實現的。客戶端瀏覽器請求伺服器的時候,伺服器端會返回一個狀態碼。伺服器端通過HttpServletResponse的setStatus()方法設置狀態碼。
狀態碼 | 意義 |
1xx | 信息狀態碼。表示該請求已經被接受,正在被處理。 |
2xx | 正確狀態碼。表示該請求已經被正確接收並處理,沒有錯誤等發生。例如:200表示一切正確。 |
3xx | 重定向狀態碼。例如301(永久性重定向),302(零時性重定向)表示該資源已經不存在或者換了地址,客戶端需要重新定向到一個新的資源。伺服器響應中會附帶這個新資源地址。 |
4xx | 請求錯誤。例如401表示沒有許可權訪問,404表示資源不存在,405表示訪問方式錯誤(如Servlet只接受GET,POST方式訪問但是客戶端卻以DELETE方式訪問) |
5xx | 伺服器錯誤。例如500表示程式出現異常而中途停止運行。 |
2.代碼實踐
web.xml
1 <!-- 重定向(Redirect) --> 2 <servlet> 3 <servlet-name>RedirectServlet</servlet-name> 4 <servlet-class>com.servlet.RedirectServlet</servlet-class> 5 </servlet> 6 <servlet-mapping> 7 <servlet-name>RedirectServlet</servlet-name> 8 <url-pattern>/servlet/RedirectServlet</url-pattern> 9 </servlet-mapping>
RedirectServlet.java
1 package com.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.HashMap; 6 import java.util.Map; 7 import java.util.Map.Entry; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 public class RedirectServlet extends HttpServlet { 15 16 Map<String,Integer> map = new HashMap<String, Integer>(); 17 18 public void destroy() { 19 super.destroy(); // Just puts "destroy" string in log 20 // Put your code here 21 map = null; 22 } 23 24 public void doGet(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 27 String filename = request.getParameter("filename"); 28 if(filename != null){//統計下載次數 29 int hit = map.get(filename);//取下載次數 30 map.put(filename, ++hit);//下載次數+1後保存 31 response.sendRedirect(request.getContextPath()+filename);//重定向到文件 32 }else{//顯示下載次數 33 response.setCharacterEncoding("UTF-8"); 34 response.setContentType("text/html"); 35 PrintWriter out = response.getWriter(); 36 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 37 out.println("<HTML>"); 38 out.println(" <HEAD><TITLE>文件下載</TITLE></HEAD>"); 39 out.println(" <BODY>"); 40 out.println("<table width=100%>"); 41 out.println("<tr>"); 42 out.println("<td><b>文件名</b></td>"); 43 out.println("<td><b>下載次數</b></td>"); 44 out.println("<td><b>下載</b></td>"); 45 out.println("</tr>"); 46 for(Entry<String, Integer> entry : map.entrySet()){//遍歷map 47 out.println("<tr>"); 48 out.println("<td>"+entry.getKey()+"</td>"); 49 out.println("<td>"+entry.getValue()+"</td>"); 50 out.println("<td><a href='"+request.getRequestURI()+ 51 "?filename="+entry.getKey()+"' target='blank' "+ 52 "onclick='location=location;'>下載</a></td>"); 53 out.println("</tr>"); 54 } 55 out.println("</table>"); 56 out.println("</legend>"); 57 out.println(" </BODY>"); 58 out.println("</HTML>"); 59 out.flush(); 60 out.close(); 61 } 62 } 63 64 public void init() throws ServletException { 65 // Put your code here 66 map.put("/uploadfile/1.txt", 0); 67 map.put("/uploadfile/2.txt", 0); 68 map.put("/uploadfile/3425.jpg", 0); 69 } 70 71 }
3.效果截圖
三、自動刷新(Refresh)
1.重點說明
自動刷新不僅可以實現一段時間之後自動跳轉到另一個頁面,還可以實現一段時間之後自動刷新本頁面。Servlet中通過HttpServletResponse對象設置Header屬性實現自動刷新效果。
2.代碼實踐
1 response.setHeader("Refresh", "1000; URL=http://localhost:8080/King/servlet/Forward.jsp");
其中1000為時間,單位毫秒。當URL設置的路徑為Servlet自己的路徑時,就會定時自動刷新本頁面。