Java開發之Servlet之間的跳轉

来源:http://www.cnblogs.com/landiljy/archive/2016/08/13/5767201.html
-Advertisement-
Play Games

一、轉向(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()方法設置狀態碼。

HttpServletResponse狀態碼
狀態碼 意義
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自己的路徑時,就會定時自動刷新本頁面。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 泛型究竟是什麼? 在討論類型推導(type inference)之前,必須回顧一下什麼是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。通俗點將就是“類型的變數”。這種類型變數可以用在類、介面和方法的創建中。理解J ...
  • 層次化索引 層次化索引指你能在一個數組上擁有多個索引,例如: 有點像Excel里的合併單元格對麽? 根據索引選擇數據子集 以外層索引的方式選擇數據子集: 以內層索引的方式選擇數據: 多重索引Series轉換為DataFrame 層次化索引在數據重塑和分組中扮演著很重要的角色,例如,上面的層次化索引數 ...
  • 我們談到關聯映射的多對多配置呢,有一種挺不好配置的,所以呢,就放到了這裡給大家參考 第一種:建立多對多雙向關聯 拆成兩個一對多 三個實體類 Employee Project 中間表 ProEmp 映射文件 Employee.hbm.xml Project.hbm.xml ProEmp.hbm.xml ...
  • 數據不完整在數據分析的過程中很常見。 pandas使用浮點值NaN表示浮點和非浮點數組裡的缺失數據。 pandas使用isnull()和notnull()函數來判斷缺失情況。 對於缺失數據一般處理方法為濾掉或者填充。 濾除缺失數據 對於一個Series,dropna()函數返回一個包含非空數據和索引 ...
  • 線程的優先順序用數字來表示,預設範圍是1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORTY.一個線程的預設優先順序是5,即Thread.NORM_PRIORTY 對優先順序操作的方法: int getPriority():得到線程的優先順序 void setPriorit ...
  • 1.tomcat7-maven-plugin插件 1. 不通過外部的tomcat 直接將tomcat核心內嵌在項目中,tomcat7:run 命令就可以啟動項目,可以直接訪問 localhost:8080/Demo 2. 熱部署(tomcat是活的) tomcat7:deploy 命令就可以將項目發 ...
  • 設計一個小型的記憶體池以及鏈表 上一節擼到萬事俱備只欠真正的 , 但是 的作用是將源代碼轉化為 流, 用什麼保存 ? 這就涉及到我們要接觸的第一個數據結構—鏈表, 雖然標準庫中很多容器都可以承擔鏈表的任務, 但是我說過 出於鍛煉原因, 我會儘量不使用stl中的容器 , 所以我決定自己擼一個鏈表出來, ...
  • 今天來說說圖片壓縮技術,為什麼要使用圖片壓縮,圖片上傳不就完事了嗎?對的,這在幾年前可以這麼說,因為幾年前還沒有現在這麼大的併發,也沒有現在這麼關註性能。 如今手機很多,很多人都是通過手機訪問網路或者app,再調用介面的時候肯定會多多少少的瀏覽圖片,尤其是脫離wifi的情況下,可以看到很多軟體展示都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...