JSP - 動作



在本章中,我們將討論 JSP 中的動作。這些動作使用 XML 語法中的構造來控制 servlet 引擎的行為。您可以動態插入檔案、重用 JavaBean 元件、將使用者轉發到另一個頁面或為 Java 外掛生成 HTML。

Action 元素只有一種語法,因為它符合 XML 標準 -

<jsp:action_name attribute = "value" />

Action 元素基本上是預定義的函式。下表列出了可用的 JSP 動作 -

序號 語法 & 目的
1

jsp:include

在請求頁面時包含一個檔案。

2

jsp:useBean

查詢或例項化一個 JavaBean。

3

jsp:setProperty

設定 JavaBean 的屬性。

4

jsp:getProperty

將 JavaBean 的屬性插入輸出。

5

jsp:forward

將請求者轉發到新頁面。

6

jsp:plugin

生成瀏覽器特定的程式碼,為 Java 外掛建立 OBJECT 或 EMBED 標籤。

7

jsp:element

動態定義 XML 元素。

8

jsp:attribute

定義動態定義的 XML 元素的屬性。

9

jsp:body

定義動態定義的 XML 元素的主體。

10

jsp:text

用於在 JSP 頁面和文件中編寫模板文字。

常用屬性

所有 Action 元素都有兩個共同的屬性:id 屬性和 scope 屬性。

Id 屬性

id 屬性唯一標識 Action 元素,並允許在 JSP 頁面內引用該動作。如果 Action 建立了一個物件的例項,則可以使用 id 值透過隱式物件 PageContext 來引用它。

Scope 屬性

此屬性標識 Action 元素的生命週期。id 屬性和 scope 屬性直接相關,因為 scope 屬性決定了與 id 關聯的物件的生命週期。scope 屬性有四個可能的值:(a) page,(b) request,(c) session 和 (d) application。

<jsp:include> 動作

此動作允許您將檔案插入正在生成的頁面中。語法如下 -

<jsp:include page = "relative URL" flush = "true" />

include指令不同,該指令在 JSP 頁面轉換為 servlet 時插入檔案,此動作在請求頁面時插入檔案。

下表列出了與 include 動作關聯的屬性 -

序號 屬性 & 描述
1

page

要包含的頁面的相對 URL。

2

flush

布林屬性確定在包含之前是否重新整理包含資源的緩衝區。

示例

讓我們定義以下兩個檔案 (a) date.jsp 和 (b) main.jsp 如下 -

以下是 date.jsp 檔案的內容 -

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

以下是 main.jsp 檔案的內容 -

<html>
   <head>
      <title>The include Action Example</title>
   </head>
   
   <body>
      <center>
         <h2>The include action Example</h2>
         <jsp:include page = "date.jsp" flush = "true" />
      </center>
   </body>
</html>

現在讓我們將所有這些檔案儲存在根目錄中,並嘗試訪問 main.jsp。您將收到以下輸出 -

The include action Example

Today's date: 12-Sep-2010 14:54:22

<jsp:useBean> 動作

useBean動作非常通用。它首先使用 id 和 scope 變數搜尋現有的物件。如果未找到物件,則嘗試建立指定的物件。

載入 bean 的最簡單方法如下 -

<jsp:useBean id = "name" class = "package.class" />

載入 bean 類後,可以使用jsp:setPropertyjsp:getProperty動作修改和檢索 bean 屬性。

下表列出了與 useBean 動作關聯的屬性 -

序號 屬性 & 描述
1

class

指定 bean 的完整包名。

2

type

指定將引用該物件的變數的型別。

3

beanName

給出由 java.beans.Beans 類的 instantiate() 方法指定的 bean 的名稱。

現在讓我們在提供與這些動作相關的有效示例之前討論jsp:setPropertyjsp:getProperty動作。

<jsp:setProperty> 動作

setProperty動作設定 Bean 的屬性。在執行此操作之前,必須先定義 Bean。有兩種基本方法可以使用 setProperty 動作 -

您可以在jsp:useBean元素之後但外部使用jsp:setProperty,如下所示 -

<jsp:useBean id = "myName" ... />
...
<jsp:setProperty name = "myName" property = "someProperty" .../>

在這種情況下,無論是否例項化了新的 bean 或找到了現有的 bean,都會執行jsp:setProperty

jsp:setProperty可以出現的第二個上下文是在jsp:useBean元素的主體內部,如下所示 -

<jsp:useBean id = "myName" ... >
   ...
   <jsp:setProperty name = "myName" property = "someProperty" .../>
</jsp:useBean>

在這裡,只有在例項化了新物件時才會執行 jsp:setProperty,而不是在找到現有物件時執行。

下表列出了與setProperty動作關聯的屬性 -

序號 屬性 & 描述
1

name

指定將設定其屬性的 bean。必須事先定義 Bean。

2

property

指示要設定的屬性。值為“*”表示所有名稱與 bean 屬性名稱匹配的請求引數都將傳遞到相應的 setter 方法。

3

value

要分配給給定屬性的值。如果引數的值為 null 或引數不存在,則忽略 setProperty 動作。

4

param

param 屬性是請求引數的名稱,該引數的值將由屬性接收。您不能同時使用 value 和 param,但可以都不使用。

<jsp:getProperty> 動作

getProperty動作用於檢索給定屬性的值並將其轉換為字串,最後將其插入輸出。

getProperty 動作只有兩個屬性,這兩個屬性都是必需的。getProperty 動作的語法如下 -

<jsp:useBean id = "myName" ... />
...
<jsp:getProperty name = "myName" property = "someProperty" .../>

下表列出了與getProperty動作關聯的必需屬性 -

序號 屬性 & 描述
1

name

要檢索其屬性的 Bean 的名稱。必須事先定義 Bean。

2

property

property 屬性是要檢索的 Bean 屬性的名稱。

示例

讓我們定義一個測試 bean,它將在我們的示例中進一步使用 -

/* File: TestBean.java */
package action;
 
public class TestBean {
   private String message = "No message specified";
 
   public String getMessage() {
      return(message);
   }
   public void setMessage(String message) {
      this.message = message;
   }
}

將上述程式碼編譯到生成的TestBean.class檔案中,並確保您將 TestBean.class 複製到C:\apache-tomcat-7.0.2\webapps\WEB-INF\classes\action資料夾中,並且CLASSPATH變數也應該設定為此資料夾 -

現在在main.jsp檔案中使用以下程式碼。這將載入 bean 並設定/獲取一個簡單的字串引數 -

<html>
   
   <head>
      <title>Using JavaBeans in JSP</title>
   </head>
   
   <body>
      <center>
         <h2>Using JavaBeans in JSP</h2>
         <jsp:useBean id = "test" class = "action.TestBean" />
         <jsp:setProperty name = "test"  property = "message" 
            value = "Hello JSP..." />
            
         <p>Got message....</p>
         <jsp:getProperty name = "test" property = "message" />
      </center>
   </body>
</html>

現在讓我們嘗試訪問main.jsp,它將顯示以下結果 -

Using JavaBeans in JSP

Got message.... Hello JSP...

<jsp:forward> 動作

forward動作終止當前頁面的操作並將請求轉發到另一個資源,例如靜態頁面、另一個 JSP 頁面或 Java Servlet。

以下是forward動作的語法 -

<jsp:forward page = "Relative URL" />

下表列出了與 forward 動作關聯的必需屬性 -

序號 屬性 & 描述
1

page

應包含另一個資源的相對 URL,例如靜態頁面、另一個 JSP 頁面或 Java Servlet。

示例

讓我們重用以下兩個檔案 (a) date.jsp 和 (b) main.jsp 如下 -

以下是 date.jsp 檔案的內容 -

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

以下是 main.jsp 檔案的內容 -

<html>
   <head>
      <title>The include Action Example</title>
   </head>
   
   <body>
      <center>
         <h2>The include action Example</h2>
         <jsp:forward page = "date.jsp" />
      </center>
   </body>
</html>

現在讓我們將所有這些檔案儲存在根目錄中,並嘗試訪問 main.jsp。這將顯示類似如下所示的結果。

在這裡,它丟棄了來自主頁面內容,並且僅顯示來自已轉發頁面的內容。

Today's date: 12-Sep-2010 14:54:22

<jsp:plugin> 動作

plugin動作用於將 Java 元件插入 JSP 頁面。它確定瀏覽器的型別並根據需要插入<object><embed>標籤。

如果所需的外掛不存在,它將下載外掛,然後執行 Java 元件。Java 元件可以是 Applet 或 JavaBean。

plugin 動作具有幾個屬性,這些屬性對應於用於格式化 Java 元件的常用 HTML 標籤。<param>元素也可用於向 Applet 或 Bean 傳送引數。

以下是使用 plugin 動作的典型語法 -

<jsp:plugin type = "applet" codebase = "dirname" code = "MyApplet.class"
   width = "60" height = "80">
   <jsp:param name = "fontcolor" value = "red" />
   <jsp:param name = "background" value = "black" />
 
   <jsp:fallback>
      Unable to initialize Java Plugin
   </jsp:fallback>
 
</jsp:plugin>

如果您有興趣,可以使用一些 applet 來嘗試此操作。一個新的元素,<fallback>元素,可用於指定在元件失敗時傳送給使用者的錯誤字串。

The <jsp:element> Action

The <jsp:attribute> Action

The <jsp:body> Action

<jsp:element><jsp:attribute><jsp:body>動作用於動態定義 XML 元素。動態一詞很重要,因為它意味著 XML 元素可以在請求時生成,而不是在編譯時靜態生成。

以下是如何動態定義 XML 元素的簡單示例 -

<%@page language = "java" contentType = "text/html"%>
<html xmlns = "http://www.w3c.org/1999/xhtml"
   xmlns:jsp = "http://java.sun.com/JSP/Page">
   
   <head><title>Generate XML Element</title></head>
   
   <body>
      <jsp:element name = "xmlElement">
         <jsp:attribute name = "xmlElementAttr">
            Value for the attribute
         </jsp:attribute>
         
         <jsp:body>
            Body for XML element
         </jsp:body>
      
      </jsp:element>
   </body>
</html>

這將在執行時生成以下 HTML 程式碼 -

<html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page">
   <head><title>Generate XML Element</title></head>
   
   <body>
      <xmlElement xmlElementAttr = "Value for the attribute">
         Body for XML element
      </xmlElement>
   </body>
</html>

<jsp:text> 動作

<jsp:text>動作可用於在 JSP 頁面和文件中編寫模板文字。以下是此操作的簡單語法 -

<jsp:text>Template data</jsp:text>

模板的主體不能包含其他元素;它只能包含文字和 EL 表示式(注意 - EL 表示式將在後續章節中解釋)。請注意,在 XML 檔案中,您不能使用諸如${whatever > 0}之類的表示式,因為大於號是非法的。相反,使用gt形式,例如${whatever gt 0}或者另一種方法是將值嵌入到CDATA部分。

<jsp:text><![CDATA[<br>]]></jsp:text>

例如,如果您需要包含DOCTYPE宣告(例如用於XHTML),則還必須使用<jsp:text>元素,如下所示 -

<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "DTD/xhtml1-strict.dtd">]]></jsp:text>

   <head><title>jsp:text action</title></head>
   
   <body>
      <books><book><jsp:text>  
         Welcome to JSP Programming
      </jsp:text></book></books>
   </body>
</html>

嘗試使用和不使用<jsp:text>動作的上述示例。

廣告