實習培訓——Servlet(6)

實習培訓——Servlet(6)

1  Servlet 客戶端 HTTP 請求

當瀏覽器請求網頁時,它會向 Web 服務器發送特定信息,這些信息不能被直接讀取,由於這些信息是做爲 HTTP 請求的頭的一部分進行傳輸的。您能夠查看 HTTP 協議 瞭解更多相關信息。html

HTTP Header 請求實例

下面的實例使用 HttpServletRequest 的 getHeaderNames() 方法讀取 HTTP 頭信息。該方法返回一個枚舉,包含與當前的 HTTP 請求相關的頭信息。java

一旦咱們有一個枚舉,咱們能夠以標準方式循環枚舉,使用 hasMoreElements() 方法來肯定什麼時候中止,使用nextElement() 方法來獲取每一個參數的名稱。web

 1 package yuan;
 2 
 3 //導入必需的 java 庫
 4 import java.io.IOException;
 5 import java.io.PrintWriter;
 6 import java.util.Enumeration;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.annotation.WebServlet;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 @WebServlet("/DisplayHeader")
15 
16 //擴展 HttpServlet 類
17 public class DisplayHeader extends HttpServlet {
18 
19     // 處理 GET 方法請求的方法
20     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
21     {
22         // 設置響應內容類型
23         response.setContentType("text/html;charset=UTF-8");
24 
25         PrintWriter out = response.getWriter();
26         String title = "HTTP Header 請求實例";
27         String docType =
28             "<!DOCTYPE html> \n";
29             out.println(docType +
30             "<html>\n" +
31             "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
32             "<body bgcolor=\"#f0f0f0\">\n" +
33             "<h1 align=\"center\">" + title + "</h1>\n" +
34             "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
35             "<tr bgcolor=\"#949494\">\n" +
36             "<th>Header 名稱</th><th>Header 值</th>\n"+
37             "</tr>\n");
38 
39         Enumeration headerNames = request.getHeaderNames();
40 
41         while(headerNames.hasMoreElements()) {
42             String paramName = (String)headerNames.nextElement();
43             out.print("<tr><td>" + paramName + "</td>\n");
44             String paramValue = request.getHeader(paramName);
45             out.println("<td> " + paramValue + "</td></tr>\n");
46         }
47         out.println("</table>\n</body></html>");
48     }
49     // 處理 POST 方法請求的方法
50     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
51         doGet(request, response);
52     }
53 }

此次偷懶,不配置web.xml了,由於有 第14行代碼   編程

@WebServlet("/DisplayHeader")

它的做用等同於配置了web.xml,結果以下:後端

cookie太多,顯示不是很合理瀏覽器

 http://www.runoob.com/servlet/servlet-client-request.htmltomcat

2  Servlet 服務器 HTTP 響應

HTTP Header 響應實例

您已經在前面的實例中看到 setContentType() 方法,下面的實例也使用了一樣的方法,此外,咱們會用 setIntHeader() 方法來設置 Refresh 頭。服務器

 1 package yuan;
 2 
 3 //導入必需的 java 庫
 4 import java.io.IOException;
 5 import java.io.PrintWriter;
 6 import java.text.SimpleDateFormat;
 7 import java.util.Calendar;
 8 import java.util.Date;
 9 
10 import javax.servlet.ServletException;
11 import javax.servlet.annotation.WebServlet;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 
16 @WebServlet("/Refresh")
17 
18 // 擴展 HttpServlet 類
19 public class Refresh extends HttpServlet {
20 
21     // 處理 GET 方法請求的方法
22     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
23         // 設置刷新自動加載時間爲 5 秒
24         response.setIntHeader("Refresh", 5);
25         // 設置響應內容類型
26         response.setContentType("text/html;charset=UTF-8");
27 
28         // 使用默認時區和語言環境得到一個日曆
29         Calendar cale = Calendar.getInstance();
30         // 將Calendar類型轉換成Date類型
31         Date tasktime = cale.getTime();
32         // 設置日期輸出的格式
33         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
34         // 格式化輸出
35         String nowTime = df.format(tasktime);
36         PrintWriter out = response.getWriter();
37         String title = "自動刷新 Header設置 ";
38         String docType = "<!DOCTYPE html>\n";
39         out.println(
40                 docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n"
41                         + "<h1 align=\"center\">" + title + "</h1>\n" + "<p>當前時間是:" + nowTime + "</p>\n");
42     }
43 
44     // 處理 POST 方法請求的方法
45     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
46         doGet(request, response);
47     }
48 }

 展現結果:時間5s自動刷新cookie

3  Servlet 編寫過濾器

Servlet 過濾器能夠動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。app

能夠將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也能夠附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。調用 Servlet 前調用全部附加的 Servlet 過濾器。

Servlet 過濾器是可用於 Servlet 編程的 Java 類,能夠實現如下目的:

  • 在客戶端的請求訪問後端資源以前,攔截這些請求。
  • 在服務器的響應發送回客戶端以前,處理這些響應。

根據規範建議的各類類型的過濾器:

 

  • 身份驗證過濾器(Authentication Filters)。
  • 數據壓縮過濾器(Data compression Filters)。
  • 加密過濾器(Encryption Filters)。
  • 觸發資源訪問事件過濾器。
  • 圖像轉換過濾器(Image Conversion Filters)。
  • 日誌記錄和審覈過濾器(Logging and Auditing Filters)。
  • MIME-TYPE 鏈過濾器(MIME-TYPE Chain Filters)。
  • 標記化過濾器(Tokenizing Filters)。
  • XSL/T 過濾器(XSL/T Filters),轉換 XML 內容。

 

過濾器經過 Web 部署描述符(web.xml)中的 XML 標籤來聲明,而後映射到您的應用程序的部署描述符中的 Servlet 名稱或 URL 模式。

當 Web 容器啓動 Web 應用程序時,它會爲您在部署描述符中聲明的每個過濾器建立一個實例。

Filter的執行順序與在web.xml配置文件中的配置順序一致,通常把Filter配置在全部的Servlet以前。

Servlet 過濾器實例

如下是 Servlet 過濾器的實例,將輸出網站名稱和地址。本實例讓您對 Servlet 過濾器有基本的瞭解,您可使用相同的概念編寫更復雜的過濾器應用程序:

 1 package yuan;
 2 
 3 //導入必需的 java 庫
 4 import javax.servlet.*;
 5 import java.util.*;
 6 
 7 //實現 Filter 類
 8 public class LogFilter implements Filter  {
 9     public void  init(FilterConfig config) throws ServletException {
10         // 獲取初始化參數
11         String site = config.getInitParameter("Site"); 
12 
13         // 輸出初始化參數
14         System.out.println("網站名稱: " + site); 
15     }
16     public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
17 
18         // 輸出站點名稱
19         System.out.println("站點網址:www.baidu.com");
20 
21         // 把請求傳回過濾鏈
22         chain.doFilter(request,response);
23     }
24     public void destroy( ){
25         /* 在 Filter 實例被 Web 容器從服務移除以前調用 */
26     }
27 }

這邊使用前文提到的 DisplayHeader.java 爲例子:

Web.xml 中的 Servlet 過濾器映射(Servlet Filter Mapping)

定義過濾器,而後映射到一個 URL 或 Servlet,這與定義 Servlet,而後映射到一個 URL 模式方式大體相同。在部署描述符文件 web.xml 中爲 filter 標籤建立下面的條目:

  <filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>yuan.LogFilter</filter-class>
  <init-param>
    <param-name>site</param-name>
    <param-value>百度</param-value>
  </init-param>
</filter>

  <filter-mapping>
  <filter-name>LogFilter</filter-name>
  <url-pattern>/DisplayHeader</url-pattern>
 </filter-mapping>

重啓tomcat,展現結果:

出現  網址名稱:百度   證實完成了filter的初始化。

輸入 http://localhost:8082/Servlet/DisplayHeader 測試,再次查看控制檯 Console:

出現了    站點網址:www.baidu.com,證實filter起了做用,若是輸入的url後綴不是  /DisplayHeader  則不會打印結果。

 增長多個過濾器,能夠實現多層過濾。

 

菜鳥教程

相關文章
相關標籤/搜索