在本章中,我們將討論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
屬性有四個可能的值:
- page
- request
- session
- application
1. jsp:include動作
此動作允許將檔插入到正在生成的頁面中。語法如下所示 -
<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
。將會看到以下輸出 -
2. jsp:useBean 動作
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
動作,然後再給出與這些操作相關的有效示例。
3. jsp:setProperty 動作
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 屬性是屬性要接收的值的請求參數的名稱。不能同時使用值和參數,但是不允許使用。 |
4. 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
類:Message ,其代碼如下-
/* File: Message.java */
package com.zaixian;
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.zaixian.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
,它將顯示以下結果 -
5. jsp:forward動作
<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
丟棄了內容,並顯示了來自轉發目標頁面的內容。
6. jsp:plugin 動作
<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>
7. 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>
操作。