在本章中,我們將討論JSP中的動作。這些操作使用XML語法中的結構來控制servlet引擎的行為。我們可以動態插入檔案,重新使用JavaBeans元件,將使用者轉發到另一個頁面或為Java外掛生成HTML。
為了方便範例中的程式碼執行的結果,我們使用Eclipse建立一個動態Web專案:JspActions 。這個專案的結構如下所示 -
動作元素只有一種語法,因為它符合XML標準 -
<jsp:action_name attribute = "value" />
動作元素基本上是預定義的功能。下表列出了可用的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頁面和文件中編寫模板文字。 |
所有動作元素共有兩個屬性:id
屬性和scope
屬性。
id屬性
id
屬性唯一標識動作元素,並允許在JSP頁面內參照該操作。 如果動作建立了一個物件的範例,則id
值可以用於通過隱式物件PageContext
參照它。
scope屬性
scope
屬性標識動作元素的生命週期。id
屬性和scope
屬性是直接相關的,因為scope
屬性決定了與id
關聯的物件的使用壽命。scope
屬性有四個可能的值:
此動作允許將檔案插入到正在生成的頁面中。語法如下所示 -
<jsp:include page = "relative URL" flush = "true" />
與在將JSP頁面轉換為servlet時將檔案插入的include
指令不同,此動作在請求頁面時插入該檔案。
下表列出了與include
動作相關聯的屬性 -
編號 | 屬性 | 描述 |
---|---|---|
1 | page |
要包括的頁面的相對URL。 |
2 | flush |
布林屬性確定包含的資源是否在包含其緩衝區之前被重新整理。 |
範例
下面定義兩個檔案date.jsp
和index.jsp
,以下是date.jsp
檔案的內容 -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<p>今天是: <%= (new java.util.Date()).toLocaleString()%></p>
以下是index.jsp
檔案的內容 -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include動作範例</title>
</head>
<body>
<h2>include動作範例</h2>
<jsp:include page="date.jsp" flush="true" />
</body>
</html>
現在將這些檔案儲存在根目錄下,並嘗試存取index.jsp
。將會看到以下輸出 -
useBean
動作是非常通用的。它首先使用id
和scope
變數搜尋現有物件。如果未找到物件,則會嘗試建立指定的物件。
載入bean
的最簡單的方法如下 -
<jsp:useBean id = "name" class = "package.class" />
當載入了一個bean
類,可以使用jsp:setProperty
和jsp:getProperty
操作來修改和檢索bean
屬性。
下表列出了與useBean
動作關聯的屬性 -
編號 | 屬性 | 描述 |
---|---|---|
1 | class |
指定bean 的完整包名稱。 |
2 | type |
指定將參照物件的變數的型別。 |
3 | beanName |
給出由java.beans.Beans 類instantiate() 方法指定的bean 的名稱。 |
現在來看看jsp:setProperty
和jsp:getProperty
動作,然後再給出與這些操作相關的有效範例。
setProperty
操作設定Bean
的屬性。 在此操作之前,Bean
先前已定義。 有兩種使用setProperty
操作的基本方法 -
可以使用jsp:setProperty
在之後,但是在jsp:useBean
元素之外,如下所示:
<jsp:useBean id = "myName" ... />
...
<jsp:setProperty name = "myName" property = "someProperty" .../>
在這種情況下,執行jsp:setProperty
,無論是範例化新bean
還是找到現有的bean
。
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 屬性是屬性要接收的值的請求引數的名稱。不能同時使用值和引數,但是不允許使用。 |
getProperty
操作用於檢索給定屬性的值並將其轉換為字串,最後將其插入輸出。getProperty
動作只有兩個屬性,這兩個屬性都是必需的。getProperty
操作的語法如下:
<jsp:useBean id = "myName" ... />
...
<jsp:getProperty name = "myName" property = "someProperty" .../>
下表列出了與getProperty
動作相關聯的必需屬性 -
編號 | 動作 | 描述 |
---|---|---|
1 | name |
要檢索的屬性的Bean 名稱。 前提是Bean 在先前已經定義了。 |
2 | property |
property 屬性是要檢索的Bean 屬性的名稱。 |
範例
下面定義一個Bean
類:Message ,其程式碼如下-
/* File: Message.java */
package com.yiibai;
public class Message {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
在main.jsp
檔案中編寫以下程式碼。這將載入bean並設定/獲取一個簡單的String引數 -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>在JSP使用JavaBeans範例</title>
</head>
<body>
<div style="margin:auto;text-align:center;">
<h2>在JSP使用JavaBeans範例</h2>
<hr/>
<jsp:useBean id="msg" class="com.yiibai.Message" />
<p>獲取預設設定的資訊是:<jsp:getProperty name="msg" property="message" /></p>
<jsp:setProperty name="msg" property="message" value="Hello JSP..." />
<p>獲取設定的資訊是:<jsp:getProperty name="msg" property="message" /></p>
</div>
</body>
</html>
現在嘗試存取main.jsp
,它將顯示以下結果 -
<jsp:forward>
動作終止當前頁面的操作,並將請求轉發到另一個資源,例如靜態頁面,另一個JSP頁面或Java Servlet。
以下是<jsp:forward>
動作的語法 -
<jsp:forward page = "Relative URL" />
下表列出了與<jsp:forward>
動作相關聯的必需屬性 -
編號 | 動作 | 描述 |
---|---|---|
1 | page |
應該包含另一個資源的相對URL,例如靜態頁面,另一個JSP頁面或Java Servlet。 |
範例
建立以下兩個檔案:date.jsp
和main.jsp
,分別如下 -
以下是date.jsp
檔案的內容 -
<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
以下是main.jsp
檔案的內容 -
現在將這些檔案儲存在根目錄下,並嘗試存取main.jsp
。這將顯示如下所示的結果。
在這裡,它從main.jsp
丟棄了內容,並顯示了來自轉發目標頁面的內容。
<jsp:plugin>
動作用於將Java元件插入到JSP頁面中。它確定瀏覽器的型別,並根據需要插入<object>
或<embed>
標籤。
如果所需的外掛不存在,它會下載外掛,然後執行Java元件。Java元件可以是Applet或JavaBean。
<jsp:plugin>
動作有幾個屬性對應於用於格式化Java元件的常用HTML標記。 <param>
元素也可用於向Applet
或Bean
傳送引數。
以下是使用<jsp: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>
如果您有興趣,可以使用一些小程式嘗試此操作。新元素<fallback>
元素可用於指定要傳送給使用者的錯誤字串,以防元件發生故障。
<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頁面和文件。以下是此操作的簡單語法 -
<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>
操作。