JSP | JSP 動作詳解


原作者為 RioTian@cnblogs, 本作品采用 CC 4.0 BY 進行許可,轉載請注明出處。

本篇學習自:C語言中文網,部分內容轉載僅供學習使用。


\[QAQ \]


JSP 動作利用 XML 語法格式的標記來控制服務器的行為,完成各種通用的 JSP 頁面功能,也可以實現一些處理復雜業務邏輯的專用功能。如利用 JSP 動作可以動態地插入文件、重用 JavaBean 組件、把用戶重定向到另外的頁面、為 Java 插件生成 HTML 代碼。


JSP 動作與 JSP 指令的不同之處是,JSP 頁面被執行時首先進入翻譯階段,程序會先查找頁面中的 JSP 指令標識;並將它們轉換成 Servlet,所以,這些指令標識會首先被執行,從而設置了整個 JSP 頁面,所以,JSP 指令是在頁面轉換時期被編譯執行的,且編譯一次;而 JSP 動作是在客戶端請求時按照在頁面中出現的順序被執行的,它們只有被執行的時候才會去實現自己所具有的功能,且基本上是客戶每請求一次,動作標識就會執行一次。

JSP 動作的通用格式如下:

<jsp:動作名 屬性1="屬性值1"...屬性n="屬性值n" />

或者

<jsp:動作名; 屬性1="屬性值1"...屬性n="屬性值n">相關內容</jsp:動作名>

JSP 中常用的動作包括 <jsp:include>、<jsp:param>、<jsp:forward>、<jsp:plugin>、<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>。在后文中,將依次介紹這幾個動作。

JSP include動作

include 動作用於把另外一個文件的輸出內容插入當前 JSP 頁面的輸出內容中,這種在 JSP 頁面執行時引入的方式稱為動態引入,這樣,主頁面程序與被包含文件是彼此獨立的,互不影響。被包含的文件可以是一個動態文件(JSP 文件),也可以是一個靜態文件(如文本文件)。

其語法格式如下:

<jsp:include page="ralativeURL | <%=expressicry%>" />

說明:page 屬性指定了被包含文件的路徑,其值可以是一個代表相對路徑的表達式。當路徑以“/”開頭時,將在當前應用程序的根目錄下查找文件;如果是以文件名或文件夾名開頭,將在當前頁面的目錄下查找文件。書寫此動作標記時,“jsp”和“:”以及“include”三者之間不要有空格,否則會出錯。

include 動作對包含的動態文件和靜態文件的處理方式是不同的。

  • 如果包含的是一個靜態文件,被包含文件的內容將直接嵌入 JSP 文件中存放 <jsp:include> 動作的位置,而且當靜態文件改變時,必須將 JSP 文件重新保存(重新轉譯),然后才能訪問變化了的文件。
  • 如果包含的是一個動態文件,則由 Web 服務器負責執行,把執行后的結果傳回包含它的 JSP 頁面中,若動態文件被修改,則重新運行 JSP 文件時就會同步發生變化。

【例 1】在 JSP 文件中使用 <jsp:include> 動作包含靜態文件。

  1. 創建靜態文件 Hello.txt,輸入以下代碼:注意編碼格式使用(ANSI 或 UTF-8)防止亂碼
<font color="blue" size="3">
    <br>這是靜態文件 Hello.txt 的內容
</font>
  1. 創建主頁面文件 index.jsp,具體代碼如下:
<%@ page contentType="text/html;iso-8859-1" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<body>
    使用 &lt;jsp:include&gt; 動作標記將靜態文件包含到JSP文件中!
    </hr>
    <jsp:include page="Hello.txt"/>
</body>
</html>
  1. 運行 index.jsp,運行結果如圖 1 所示。

運行結果示意圖


要注意,<jsp:indude> 動作與前面講解的 include 指令作用類似,現將它們之間的差異總結如下。

  1. 屬性不同

    include 指令通過 file 屬性來指定被包含的頁面,該屬性不支持任何表達式。如果在 file 屬性值中應用了 JSP 表達式,會拋出異常。例如下面的代碼:

<% String fpath="fir.jsp";%>
<%@ include file="<%=fpath%>" %>

該用法將會拋出如下異常:

File "/<%=fpath%>" not fount

<jsp:include> 動作是通過 page 屬性來指定被包含頁面的,該屬性支持 JSP 表達式。

  1. 處理方式不同

    使用 include 指令包含文件時,被包含文件的內容會原封不動地插入到包含頁中使用該指令的位置,然后 JSP 編譯器再對這個合成的文件進行翻譯,所以最終編譯后的文件只有一個。

    而使用 <jsp:include> 動作包含文件時,只有當該標記被執行時,程序才會將請求轉發到(注意是轉發,而不是請求重定向)被包含的頁面,再將其執行結果輸出到瀏覽器中,然后重新返回到包含頁來繼續執行后面的代碼。因為服務器執行的是兩個文件,所以 JSP 編器將對這兩個文件分別進行編譯。

  2. 包含方式不同

    include 指令的包含過程為靜態包含,因為在使用 include 指令包含文件時,服務器最終執行的是將兩個文件合成后由 JSP 編譯器編譯成的一個 Class 文件,所以被包含文件的內容應是固定不變的,若改變了被包含的文件,則主文件的代碼就發生了改變,因此服務器會重新編譯主文件。

    <jsp:include> 動作的包含過程為動態包含,通常用來包含那些經常需要改動的文件。

  3. 對被包含文件的約定不同

    使用 include 指令包含文件時,因為 JSP 編譯器是對主文件和被包含文件進行合成后再翻譯,所以對被包含文件有約定。例如,被包含的文件中不能使用 <html></html>、<body></body> 標記;被包含文件要避免變量和方法在命名上與主文件沖突的問題。

提示:

如果在 JSP 頁面中需要顯示大量的文本文字,可以將文字寫入靜態文件中(如記事本),然后通過 include 指令或動作標記包含進來,以提高代碼的可讀性。

JSP param動作

當使用 <jsp:include> 動作標記引入的是一個能動態執行的程序時,如 Servlet 或 JSP 頁面,可以通過使用 <jsp:param> 動作標記向這個程序傳遞參數信息。


其語法格式如下:

<jsp:include page="relativeURL | <%=expression%>" />
<jsp:param name="pName1" value="pValue1 | <%=expreesion1%>“ />
<jsp:param name="pName2" value="pValue2 | <%=expreesion2%>” />
...
</jsp:include>

說明:<jsp:param> 動作的 name 屬性用於指定參數名,value 屬性用於指定參數值。在 <jsp:include> 動作標記中,可以使用多個 <jsp:param> 傳遞參數。另外,<jsp:forward> 和 <jsp:plugin> 動作標記中都可以利用 <jsp:param> 傳遞參數。

【例1】使用 <jsp:param> 動作標記向被包含文件傳遞參數。

  1. 創建主頁面 index.jsp,用 <jsp:include> 包含用於對三個數進行排序的頁面 order.jsp,並且使用 <jsp:param> 向其傳遞 3 個參數。具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title> JSP - param 動作標記實例 </title>
</head>
<body>
使用&lt;jsp:include&gt;包含用於對三個數進行排序的頁面order.jsp,<br>
並利用&lt;jsp:param&gt;把等排序的三個數8,3,5傳給order,jsp后,<br>
並得結果如下:
<hr/>
<jsp:include page="order.jsp">
    <jsp:param name="num1" value="8"/>
    <jsp:param name="num2" value="3"/>
    <jsp:param name="num3" value="5"/>
</jsp:include>
</body>
</html>
  1. 創建用於對三個數進行排序的頁面 order.jsp,具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<%
    String str1=request.getParameter("num1");
    int m1 = Integer.parseInt(str1);
    String str2=request.getParameter("num2");
    int m2 = Integer.parseInt(str2);
    String str3=request.getParameter("num3");
    int m3 = Integer.parseInt(str3);

    int tmp;
    if(m1 > m2) {
        tmp = m1;
        m1 = m2;
        m2 = tmp;
    }
    if(m2 > m3){
        tmp = m2;
        m2 = m3;
        m3 = tmp;
    }
    if(m1 > m3){
        tmp = m1;
        m1 = m3;
        m3 = tmp;
    }
%>
<font color="blue" size="4">
    這三個數從小到大的順序為:<%=m1%>、<%=m2%>、<%=m3%>
</font>
</body>
</html>
  1. 運行 index.jsp,運行結果如圖所示。

運行結果示意圖

JSP forward動作

在大多數的網絡應用程序中,都有這樣的情況:在用戶成功登錄后轉向歡迎頁面,此處的“轉向”,就是跳轉。<jsp:forward> 動作標記就可以實現頁面的跳轉,用來將請求轉到另外一個 JSP、HTML 或相關的資源文件中。

當 <jsp:forward> 動作標記被執行后,當前的頁面將不再被執行,而是去執行該標記指定的目標頁面,但是,用戶此時在地址欄中看到的仍然是當前網頁的地址,而內容卻已經是轉向的目標頁面了。(超鏈接的概念)

其語法格式如下:

<jsp:forward page="relativeURL" | "<%=expression %>" />

如果轉向的目標是一個動態文件,還可以向該文件傳遞參數,使用格式如下:

<jsp:forward page="relativeURL" | "<%=expression %>" />
<jsp:param name="pName1" value="pValue1 | <%=expression1 %>" />
<jsp:param name="pName2" value="pValue2 | <%=expression2 %>" />

說明如下:

  1. page 屬性用於指定要跳轉到的目標文件的相對路徑,也可以通過執行一個表達式來獲得。如果該值以“/”開頭,表示在當前應用的根目錄下查找目標文件,否則,就在當前路徑下查找目標文件。請求被轉向到的目標文件必須是內部的資源,即當前應用中的資源。如果想通過 forward 動作轉發到外部的文件中,將出現資源不存在的錯誤信息。
  2. forward 動作執行后,當前頁面將不再被執行,而是去執行指定的目標頁面。
  3. 轉向到的文件可以是 HTML 文件、JSP 文件、程序段,或者其他能夠處理 request 對象的文件。
  4. forward 動作實現的是請求的轉發操作,而不是請求重定向。它們之間的一個區別就是:進行請求轉發時,存儲在 request 對象中的信息會被保留並被帶到目標頁面中;而請求重定向是重新生成一個 request 請求,然后將該請求重定向到指定的 URL,所以,事先儲存在 request 對象中的信息都不存在了。

【例1】使用 <jsp:forward> 動作標記實現網頁跳轉。

  1. 創建主頁面 index.jsp,通過表單輸入用戶名和密碼,單擊“登錄”按鈕,利用 <jsp:forward> 動作標記跳轉到頁面 target.jsp。具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<form action=" " method="post" name="Form"> <!--提交給本頁處理-->
    用戶名: <input name="UserName" type="text" /> <br/>
    密&nbsp;&nbsp;碼: <input name="UserPwd" type="password" /> <br/>
    <input type="submit" value="登錄" />
</form>
<%
    //當單擊“登錄”按鈕時,調用Form1.submit()方法提交表單至本文件,
    //用戶名和密碼均不為空時,跳轉到targe.jsp,並且把用戶名和密碼以參數形式傳遞
    String s1 = null,s2 = null;
    s1 = request.getParameter("UserName");
    s2 = request.getParameter("UserPwd");
    if(s1 != null && s2 != null){
%>
<jsp:forward page="target.jsp">
    <jsp:param name="Name" value="<%=s1%>" />
    <jsp:param name="Pwd" value="<%=s2%>" />
</jsp:forward>
<%
    }
%>
</body>
</html>
  1. 創建所轉向的目標文件 target.jsp,具體代碼如下:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<%
    String strName =request.getParameter("UserName"),strPwd=request.getParameter("UserPwd");
    out.println(strName + "您好,您的密碼是: " + strPwd);
%>
</body>
</html>
  1. 運行即可,在輸入用戶名和密碼之后會自動跳轉顯示結果

JSP plugin動作

<jsp:plugin> 動作可以在頁面中插入 Java Applet 小程序或 JavaBean,它們能夠在客戶端運行,但此時,需要在 IE 瀏覽器中安裝 Java 插件。當 JSP 文件被編譯並送往瀏覽器時,<jsp:plugin> 動作將會根據瀏覽器的版本,替換成 <object> 或者 <embed> 頁面 HTML 兀素。

注意,<object> 用於 HTML 4.0,<embed> 用於 HTML 3.2。

通常,<jsp:plugin> 元素會指定對象是 Applet 還是 Bean,同樣也會指定 class 的名字以及位置。另外,還會指定將從哪里下載 Java 插件。該動作的語法格式如下:

<jsp:plugin
type="bean|applet" code="ClassFi1eName"
codebase="classFileDirectoryName"
[name="instanceName"]
[archive="URIToArchive,..."]
[align="bottom|top|middle|left|right"]
[height="displayPixels"]
[width="displayPixels"]
[hspace="leftRightPixels"]
[vspace="topBottomPixels"]
[jreversion="JREVersionNumber|1.1"]
[nspluginurl="URLToPlugin"]
[iepluginurl="URLToPlugin"] >
[<jsp:params>
<jsp:param name="parameterName"
value="{parameterValue|<%=expression %>" />
</jsp:params>]
[<jsp:fallback>text message for user</jsp:fallback>]
</jsp:plugin>

參數說明如下:

  1. type 屬性的作用是定義插入對象的類型,對象類型有兩個值,分別是 bean 或者 applet。(必須定義的屬性)
  2. code 屬性定義插入對象的類名,該類必須保存在 codebase 屬性指定的目錄內。(必須定義的屬性)
  3. codebase 屬性定義對象的保存目錄。(必須定義的屬性)
  4. name 屬性定義 bean 或 Applet 的名字。
  5. archive 屬性定義 Applet 運行時需要的類包文件。
  6. align 屬性定義 Applet 的顯示方式。
  7. height 屬性定義 Applet 的高度。
  8. width 屬性定義 Applet 的長度。
  9. hspace 屬性定義 Applet 的水平空間。
  10. vspace 屬性定義 Applet 的垂直空間。
  11. jreversion 屬性定義 Applet 運行時所需要的 JRE 版本,缺省值是 1.1。
  12. nspluginurl 屬性定義 Netscape Navigator 用戶在沒有定義 JRE 運行環境時下載 JRE 的地址。
  13. iepluginurl 屬性定義 IE 用戶在沒有定義 JRE 運行環境時下載 JRE 的地址。
  14. jsp:params 標識的作用是定義 Applet 的傳入參數。
  15. jsp:fallback 標識的作用是當對象不能正確顯示時傳給用戶的信息。

【例1】使用 <jsp:plugin> 動作標記在 JSP 中加載 Java Applet 小程序。

  1. 創建 index.jsp 頁面,使用 <jsp:plugin> 動作標記加載:
<%@ page contentType="text/html;  charset=utf-8" %>
<html>
<body>
加載MyApplet.class文件的結果如下: <hr/>
<jsp:plugin type="applet" code="MyApplet.class" codebase="."
  jreversion="1.2" width="400" heigh="80">
<jsp:fallback>
   加載Java Applet小程序失敗!
</jsp:fallback>
</jsp:plugin>
</body>
</html>
  1. 其中插件所執行的類 MyApplet.class 的源文件為 MyApplet.java,代碼如下:
import java.applet.*;
import java.awt.*;
public class MyApplet extends Applet
{
    public void paint(Graphics g)
    {
        g.setColor(Color.red);
        g.drawString("您好!我就是 Applet 小程序!",5,10);
        g.setColor(Color.green);
        g.drawString("我是通過應用<jsp:plugin>動作標記",5,30);
        g.setColor(Color.blue);
        g.drawString("將 Applet 小程序嵌入到 JSP 文件中",5,50);
    }
}

將 index.jsp 及 MyApplet.java 文件經過 Java 編譯器編譯成功后,生成的 MyApplet.class 字節文件都存放在同目錄下。

重新啟動 Tomcat 后,在瀏覽器的地址欄中輸入 http://localhost:8080/demo_war_exploded/index.jsp,按 Enter 鍵后,若客戶機上沒有安裝 JYM(Java 虛擬機),將會訪問 Sun 公司的網站,並且彈出下載 Java plugin 的界面。

下載完畢后,將會出現 Java plugin 插件的安裝界面,可以按照向導提示,逐步完成安裝過程。然后,就可以使用 JVM 而不是 IE 瀏覽器自帶的 JVM 來加載執行 MyApplet.class 字節碼文件了,最終得到的運行結果如圖所示。

使用jsp:plugin標記在JSP中加載Java Applet小程序

關於 JSP useBean、setProperty 和 getProperty 動作等之后學完 JavaBean 再來補充


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM