JSP動作
在本章中,我們將討論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.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
,它將顯示以下結果 -
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>
操作。