jsp和EL運算式

來源:互聯網
上載者:User

一、Jsp

       1、Jsp (Java Server Pages),它和 Servlet 技術一樣,都是 SUN 公司定義的一種用於開發動態 Web 資源的技術。

          Jsp 技術允許在頁面中嵌套 Java 代碼,並且允許開發人員在頁面中擷取 request、response 等 Web 常用對象。實現伺服器與瀏覽器之間的互動,所以 Jsp 也是一種動態 Web 資源的開發技術。

          2、Jsp 的執行過程。當使用者第一次訪問一個 Jsp 頁面時,伺服器會將 Jsp 的內容翻譯為一個 Servlet,然後將位元組碼和源檔案存放在伺服器 work 目錄的主機目錄下。伺服器通過 Servlet 將 Jsp 頁面的內容通過 out 對象輸出到客戶機的瀏覽器中。當 Jsp 內嵌了 Java 代碼時,伺服器會原封不動的將 Java 代碼交給 Servlet 執行。如果伺服器中已經存在了編譯好的 Servlet 位元組碼,那麼使用者再訪問 Jsp 的時候,其實不是訪問的 Jsp 而是直接存取 Servlet。

          3、Jsp 的九大隱式對象:

                (1) request:封裝了使用者提交資訊  ---(使用者請求期 Request)

                (2) pageContext:封裝了其它所有對象。--- (頁面執行期 Page)

                (3) session:在使用者首次訪問時獲得。是一個 Jsp 的內建域對象。--- (整個會話期 Session)

                (4) application:伺服器啟動時建立的 ServletContext 對象。也就是一個 Web 應用程式。--- (整個應用運行期 Application)

                (5) out:向客戶機輸出資料的流對象。用於各種資料的輸出。內部是一個 JspWriter,預設緩衝大小為 8kb。--- (頁面執行期 Page)

                (6) config:配置 Servlet ,該對象用於存取servlet執行個體的初始化參數。。--- (頁面執行期 Page)

                (7) page:指當前 Jsp 頁面,等同於 Servlet 中的 this 關鍵字,表示從該頁面產生的一個servlet執行個體。。--- (頁面執行期 Page)

               (8) response:對客戶的請求做出動態響應,向客戶發送資料。 --- (頁面執行期 Page)

                (9) exception:異常。。--- (頁面執行期 Page)

           4、Jsp 最佳實務

                 Servlet 只負責響應請求產生資料,並把資料通過轉寄技術帶給 Jsp,Jsp 只用作資料的顯示。

二、Jsp 文法

        1、Jsp 模版元素。Jsp 頁面中的 HTML 內容稱為 Jsp 模版元素。Jsp 模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。

           2、Jsp 指令碼運算式。<%= 運算式%>。目前時間:<%= new Date().toLocalString()%>。

           3、Jsp 指令碼片段。用於在頁面內加入多行 Java 代碼。 <%   Java 代碼  %>

           4、Jsp 聲明。Jsp 頁面中所編寫的代碼會預設的翻譯到 Servlet 中的 service 中,而 Jsp 聲明中的  Java 代碼被翻譯到 _jspService 方法的外面。即定義了 Servlet 的全域變數、方法、靜態代碼塊。由於 Jsp 的隱式對象是在 service 方法中生命的,所以在 Jsp 聲明中定義的成員不能訪問。

            5、Jsp 指令。Jsp 指令是為伺服器而設計的,它們並不直接產生任何可見輸出,而是告訴伺服器如何處理  Jsp 頁面中的其餘部分。 

                   <%@ 指令 屬性名稱="值" %> 例如:<%@ contextType="text/html charset=gb2312" %>

                   (1) page 指令。page 指令用於定義 Jsp 頁面的各種屬性,無論 page 指令出現在 Jsp 頁面中的什麼位置,它作用的都是 Jsp 頁面。

                         <%@ page

                                    [language="java"]     //用於指定當前頁面內嵌的是 Java 代碼。

                                    [extends="package.class"]     //用於指定翻譯後的 Servlet 繼承哪個類。

                                    [import="java.io.*"]     //用於匯入 Java 代碼所需要的包,所個之間用" , "號分割,也可以分開寫。

                                    [session="true | false"]     //指定翻譯後的 Servlet 是否自動建立 Session 對象,預設值為 true。我們常常要置為 false。因為 Session 有效期間較長,所以我們不需要 Session 對象的時候就不要建立,以減輕伺服器壓力。

                                    [buffer="none | 8kb | sizekb"]     //用於指定 out 對象的傳沖區大小,也就是 JspWriter 的緩衝區大小,預設為 8kb。

                                    [autoFlush="true | false"]     //指定上面 buffer 緩衝區是否自動重新整理,預設為 true。

                                    [isThreadSage="true | false"]     //預設值為 true,採用繼承 SingleThreadModel 標記介面的方式實現。

                                    [info="text"]     //指定當前頁面資訊為文本。

                                    [errorPage="error.index"]     //指定錯誤資訊頁面,其中指定 URL 的目錄必須使用相對路徑,如果以 "/" 開頭,那麼表示相對於當前 Web 應用程式的根目錄,不是網站的根目錄。設定錯誤頁面的另一種方式:在 web.xml 設定檔中,<web-app> 元素下加入子項目:

                                                  <exception-type>異常類型全限定名</excetion-type> 或者 <error-code>錯誤號碼</error-code>

                                                   <location>錯誤資訊顯示頁面</location> 注意,錯誤頁面的大小必須超過 1kb 才能正常顯示。如果在 web.xml 檔案中配置了錯誤資訊頁面,那麼在 Jsp 中設定的 errorPage 指令將不起作用。傳遞錯誤資訊就是用到了 exception 隱式對象。

                                     [isErrorPage="true | false"]     //指定這個頁面是否為錯裡處理頁面,如果是的話最好改為 true。

                                     [contentType]     //指定頁面的 MIME 類型,說明頁面是什麼頁面,頁面採用什麼編碼方式。其中 charset 用於說明 Jsp 源檔案字元編碼集。是指發送給客戶機的時候採用什麼編碼方式。

                                     [pageEncoding="characterset | ISO-8859-1"]     // 用於指定當前 Jsp 檔案的編碼方式,是檔案本身的編碼方式。

                                      [isELIgnored="true | false"]     // 指定頁面是否忽略 EL 運算式,預設值為 false。

                      (2) include 指令:用於引入其它 Jsp 頁面,如果使用 include 指令引入了其它 Jsp 頁面,那麼 Jsp 伺服器將把這兩個 Jsp 翻譯成一個 Servlet,所以 include 指令引入通常稱為靜態引入。

                             <%@ include file="url" %> 其中如果 URL 的路徑以 "/" 開頭則表示當前的 Web 應用程式。Jsp 的規範中建議被引入的頁面尾碼名是 .jspf。由於靜態引入是將兩個 Jsp 編譯成一個 Servlet 來打給客戶機的,所以兩個被引入的 Jsp 頁面指令不能衝突。並且被引入的 Jsp 頁面不要出現 Jsp 模版元素,也就是 HTML 的標籤,否則 HTML 的標籤內容會被打給客戶機,造成代碼不優雅。

                              動態引入:利用 request 對象的 getRequestDispatcher("URL").include(request,response); 方法。原理:是在 Servlet 運行時動態將其它的 Servlet 加入到頁面中,要多次向伺服器請求,所以效率要低。我們在開發中要盡量使用靜態引入的方法。靜態引入是將多個 Servlet 集合成一個 Servlet 後再打給客戶機。

三、Jsp 亂碼問題分析

       Jsp 亂碼出現的原因:我們在編輯 Jsp 的時候,由於編輯器不同,所儲存的 Jsp 源檔案指定的編碼方式也不同,如果我們用記事本編輯 Jsp ,那麼 Jsp 的源檔案編碼方式為 gb2312 儲存到了我們硬碟上。當使用者訪問伺服器的時候,伺服器通過硬碟上編輯好的 Jsp 檔案翻譯為 Servlet ,由於伺服器不是中國人設計的,所以經常採用 ISO-8859-1 的編碼方式,由於 ISO-8859-1 碼錶中沒有對應的中文字元,所以不能正常編譯資料,然後編譯成的 .class 檔案也是亂碼,也就導致了發給客戶機的資料也不能正常顯示。

          解決方案:既然我們找到了亂碼的原因,那麼我們應當控制伺服器將 Jsp 源檔案編譯成 Servlet 時採用可以編譯中文的碼錶。所以編輯源檔案的編碼方式應該與伺服器編譯 Jsp 的編碼方式相一致。那麼我們可以在 page 指令中增加 pageEncoding="utf-8" ,告訴伺服器以 utf-8 的碼錶編碼。由於最新的伺服器會自動的將設定好的編碼方式以回應標頭的形式寫給客戶機,所以就沒有必要再加入 contentType="text/html;charset=utf-8" 這個 page 指令,但是為了相容老的伺服器,謹慎起見加入也可以。

四、Out 隱式對象

       1、out 隱式對象用於向用戶端發送文本資料。out 對象是通過調用 pageContext 對象的 getOut() 方法返回的,其作用和用法與 ServletResponse.getWriter() 方法返回的 PrintWriter 對象非常相似。

          2、Jsp 頁面中的 out 隱式對象的類型為 JspWriter,JspWriter 相當於一種帶緩衝功能的 PriterWriter,設定 Jsp 頁面的 page 指令的 buffer 屬性可以調整它的緩衝大小,甚至關閉緩衝。

           3、當向 out 中寫入了資料,那麼該資料什麼時候才會寫給客戶機的瀏覽器。

                 (1) 設定 page 指令的 buffer 屬性關閉了 out 對象的緩衝功能,那麼一旦寫入到了 out 對象中,out 就直接送給 printWriter 對象的緩衝區中。

                 (2) out 對象的緩衝區已滿。

                 (3) 整個 Jsp 頁面結束。

            4、out 緩衝區工作原理:

                      將資料寫入 out 中,並不是直接寫給客戶機,先寫在了 out 的緩衝區中。同樣,在 Servlet 的 PrintWriter 中寫資料是寫在 PrintWriter 的緩衝區中,當 out 的緩衝區滿了,或者 Jsp 頁面執行完畢時,伺服器會將 out 緩衝區中的資料寫到 PrintWriter 的緩衝區中,然後在寫給客戶機。所以如果既在 PrintWriter 中寫資料,又在 out 中寫資料,那麼無論寫入的先後順序,最後打給客戶機時,總是 PrintWriter 的資料先送給客戶機。out 對象就是對 PrintWriter 的再一次緩衝。我們在寫 Jsp 頁面的時候盡量使用 out 對象輸出資料。

五、Jsp 實現檔案下載        [java]  view plain copy print ? <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@page import="java.io.FileInputStream"%><%@page import="java.io.OutputStream"%>   <%@page import="java.net.URLEncoder"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%           String path = application.getRealPath("download/圖片.jpg");           String filename = path.substring(path.lastIndexOf("\\") + 1);           FileInputStream in = new FileInputStream(path);           int len = 0;           byte[] b = new byte[1024];           OutputStream os = response.getOutputStream();           response.setHeader(

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.