熱門問題:國際域名注冊信息更新 郵箱設置 主機管理 ftp ICP備案問題集錦 如何使用SQL數據庫
 
 
您現在的位置:首頁 > 常見問題 > 軟件常見問題 > JSP程序模闆

JSP動作

時間:2009-05-30     來源:億騰科技    
 

JSP動作利用XML語法格式的标記來控制Servlet引擎的行爲。利用JSP動作可以動态地插入文件、重用JavaBean組件、把用戶重定向到另外(wài)的頁面、爲Java插件生(shēng)成HTML代碼。
JSP動作包括: 
jsp:include:在頁面被請求的時候引入一(yī)個文件。

jsp:useBean:尋找或者實例化一(yī)個JavaBean。

jsp:setProperty:設置JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉到一(yī)個新的頁面。

jsp:plugin:根據浏覽器類型爲Java插件生(shēng)成OBJECT或EMBED标記。

jsp:include 動作

該動作把指定文件插入正在生(shēng)成的頁面。其語法如下(xià):
<jsp:include page="relative URL" flush="true" />


前面已經介紹過include指令,它是在JSP文件被轉換成Servlet的時候引入文件,而這裏的jsp:include動作不同,插入文件的時間是在頁面被請求的時候。jsp:include動作的文件引入時間決定了它的效率要稍微差一(yī)點,而且被引用文件不能包含某些JSP代碼(例如不能設置HTTP頭),但它的靈活性卻要好得多。

例如,下(xià)面的JSP頁面把4則新聞摘要插入一(yī)個“What's New ?”頁面。改變新聞摘要時隻需改變這四個文件,而主JSP頁面卻可以不作修改:

WhatsNew.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>What's New</TITLE>
</HEAD>

<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">

<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE">
What's New at JspNews.com</TABLE>
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>


jsp:useBean 動作

jsp:useBean動作用來裝載一(yī)個将在JSP頁面中(zhōng)使用的JavaBean。這個功能非常有用,因爲它使得我(wǒ)(wǒ)們既可以發揮Java組件重用的優勢,同時也避免了損失JSP區别于Servlet的方便性。jsp:useBean動作最簡單的語法爲:
<jsp:useBean id="name" class="package.class" />


這行代碼的含義是:“創建一(yī)個由class屬性指定的類的實例,然後把它綁定到其名字由id屬性給出的變量上”。不過,就象我(wǒ)(wǒ)們接下(xià)來會看到的,定義一(yī)個scope屬性可以讓Bean關聯到更多的頁面。此時,jsp:useBean動作隻有在不存在同樣id和scope的Bean時才創建新的對象實例,同時,獲得現有Bean的引用就變得很有必要。

獲得Bean實例之後,要修改Bean的屬性既可以通過jsp:setProperty動作進行,也可以在Scriptlet中(zhōng)利用id屬性所命名的對象變量,通過調用該對象的方法顯式地修改其屬性。這使我(wǒ)(wǒ)們想起,當我(wǒ)(wǒ)們說“某個Bean有一(yī)個類型爲X的屬性foo”時,就意味着“這個類有一(yī)個返回值類型爲X的getFoo方法,還有一(yī)個setFoo方法以X類型的值爲參數”。

有關jsp:setProperty動作的詳細情況在後面讨論。但現在必須了解的是,我(wǒ)(wǒ)們既可以通過jsp:setProperty動作的value屬性直接提供一(yī)個值,也可以通過param屬性聲明Bean的屬性值來自指定的請求參數,還可以列出Bean屬性表明它的值應該來自請求參數中(zhōng)的同名變量。

在JSP表達式或Scriptlet中(zhōng)讀取Bean屬性通過調用相應的getXXX方法實現,或者更一(yī)般地,使用jsp:getProperty動作。

注意包含Bean的類文件應該放(fàng)到服務器正式存放(fàng)Java類的目錄下(xià),而不是保留給修改後能夠自動裝載的類的目錄。例如,對于Java Web Server來說,Bean和所有Bean用到的類都應該放(fàng)入classes目錄,或者封裝進jar文件後放(fàng)入lib目錄,但不應該放(fàng)到servlets下(xià)。

下(xià)面是一(yī)個很簡單的例子,它的功能是裝載一(yī)個Bean,然後設置/讀取它的message屬性。

BeanTest.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>

<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>

<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test"
property="message"
value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>

</BODY>
</HTML>

SimpleBean.java
BeanTest頁面用到了一(yī)個SimpleBean。SimpleBean的代碼如下(xià):
package hall;

public class SimpleBean {
private String message = "No message specified";

public String getMessage() {
return(message);
}

public void setMessage(String message) {
this.message = message;
}
} 

關于jsp:useBean 的進一(yī)步說明

使用Bean最簡單的方法是先用下(xià)面的代碼裝載Bean:
<jsp:useBean id="name" class="package.class" />

然後通過jsp:setProperty和jsp:getProperty修改和提取Bean的屬性。不過有兩點必須注意。第一(yī),我(wǒ)(wǒ)們還可以用下(xià)面這種格式實例化Bean:
<jsp:useBean ...>
Body
</jsp:useBean>


它的意思是,隻有當第一(yī)次實例化Bean時才執行Body部分(fēn),如果是利用現有的Bean實例則不執行Body部分(fēn)。正如下(xià)面将要介紹的,jsp:useBean并非總是意味着創建一(yī)個新的Bean實例。

第二,除了id和class外(wài),jsp:useBean還有其他三個屬性,即:scope,type,beanName。下(xià)表簡要說明這些屬性的用法。 屬性 用法
id 命名引用該Bean的變量。如果能夠找到id和scope相同的Bean實例,jsp:useBean動作将使用已有的Bean實例而不是創建新的實例。
class 指定Bean的完整包名。
scope 指定Bean在哪種上下(xià)文内可用,可以取下(xià)面的四個值之一(yī):page,request,session和application。
默認值是page,表示該Bean隻在當前頁面内可用(保存在當前頁面的PageContext内)。
request表示該Bean在當前的客戶請求内有效(保存在ServletRequest對象内)。
session表示該Bean對當前HttpSession内的所有頁面都有效。
最後,如果取值application,則表示該Bean對所有具有相同ServletContext的頁面都有效。
scope之所以很重要,是因爲jsp:useBean隻有在不存在具有相同id和scope的對象時才會實例化新的對象;如果已有id和scope都相同的對象則直接使用已有的對象,此時jsp:useBean開(kāi)始标記和結束标記之間的任何内容都将被忽略。

type 指定引用該對象的變量的類型,它必須是Bean類的名字、超類名字、該類所實現的接口名字之一(yī)。請記住變量的名字是由id屬性指定的。
beanName 指定Bean的名字。如果提供了type屬性和beanName屬性,允許省略class屬性。


jsp:setProperty 動作

jsp:setProperty用來設置已經實例化的Bean對象的屬性,有兩種用法。首先,你可以在jsp:useBean元素的外(wài)面(後面)使用jsp:setProperty,如下(xià)所示:
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName"
property="someProperty" ... />


此時,不管jsp:useBean是找到了一(yī)個現有的Bean,還是新創建了一(yī)個Bean實例,jsp:setProperty都會執行。第二種用法是把jsp:setProperty放(fàng)入jsp:useBean元素的内部,如下(xià)所示:
<jsp:useBean id="myName" ... >
...
<jsp:setProperty name="myName"
property="someProperty" ... />
</jsp:useBean>


此時,jsp:setProperty隻有在新建Bean實例時才會執行,如果是使用現有實例則不執行jsp:setProperty。

jsp:setProperty動作有下(xià)面四個屬性: 屬性 說明
name name屬性是必需的。它表示要設置屬性的是哪個Bean。
property property屬性是必需的。它表示要設置哪個屬性。有一(yī)個特殊用法:如果property的值是“*”,表示所有名字和Bean屬性名字匹配的請求參數都将被傳遞給相應的屬性set方法。
value value屬性是可選的。該屬性用來指定Bean屬性的值。字符串數據會在目标類中(zhōng)通過标準的valueOf方法自動轉換成數字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean類型的屬性值(比如“true”)通過Boolean.valueOf轉換,int和Integer類型的屬性值(比如“42”)通過Integer.valueOf轉換。
value和param不能同時使用,但可以使用其中(zhōng)任意一(yī)個。

param param是可選的。它指定用哪個請求參數作爲Bean屬性的值。如果當前請求沒有參數,則什麽事情也不做,系統不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供默認屬性值,隻有當請求參數明确指定了新值時才修改默認屬性值。
例如,下(xià)面的代碼片斷表示:如果存在numItems請求參數的話(huà),把numberOfItems屬性的值設置爲請求參數numItems的值;否則什麽也不做。

<jsp:setProperty name="orderBean"
property="numberOfItems"
param="numItems" />

如果同時省略value和param,其效果相當于提供一(yī)個param且其值等于property的值。進一(yī)步利用這種借助請求參數和屬性名字相同進行自動賦值的思想,你還可以在property(Bean屬性的名字)中(zhōng)指定“*”,然後省略value和param。此時,服務器會查看所有的Bean屬性和請求參數,如果兩者名字相同則自動賦值。


下(xià)面是一(yī)個利用JavaBean計算素數的例子。如果請求中(zhōng)有一(yī)個numDigits參數,則該值被傳遞給Bean的numDigits屬性;numPrimes也類似。

JspPrimes.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>在JSP中(zhōng)使用JavaBean</TITLE>
</HEAD>

<BODY>

<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
在JSP中(zhōng)使用JavaBean</TABLE>
</CENTER>
<P>

<jsp:useBean id="primeTable" class="hall.NumberedPrimes" />
<jsp:setProperty name="primeTable" property="numDigits" />
<jsp:setProperty name="primeTable" property="numPrimes" />

Some <jsp:getProperty name="primeTable" property="numDigits" />
digit primes:
<jsp:getProperty name="primeTable" property="numberedList" />

</BODY>
</HTML>


注:NumberedPrimes的代碼略。

jsp:getProperty 動作

jsp:getProperty動作提取指定Bean屬性的值,轉換成字符串,然後輸出。jsp:getProperty有兩個必需的屬性,即:name,表示Bean的名字;property,表示要提取哪個屬性的值。下(xià)面是一(yī)個例子,更多的例子可以在前文找到。
<jsp:useBean id="itemBean" ... />
...
<UL>
<LI>Number of items:
<jsp:getProperty name="itemBean" property="numItems" />
<LI>Cost of each:
<jsp:getProperty name="itemBean" property="unitCost" />
</UL>


jsp:forward 動作

   jsp:forward動作把請求轉到另外(wài)的頁面。jsp:forward标記隻有一(yī)個屬性page。page屬性包含的是一(yī)個相對URL。page的值既可以直接給出,也可以在請求的時候動态計算,如下(xià)面的例子所示:
<jsp:forward page="/utils/errorReporter.jsp" />
<jsp:forward page="<%= someJavaExpression %>" />


jsp:plugin 動作

jsp:plugin動作用來根據浏覽器的類型,插入通過Java插件 運行Java Applet所必需的OBJECT或EMBED元素。

附錄:JSP注釋和字符引用約定

下(xià)面是一(yī)些特殊的标記或字符,你可以利用它們插入注釋或可能被視爲具有特殊含義的字符。 語法 用途
<%-- comment --%> JSP注釋,也稱爲“隐藏注釋”。JSP引擎将忽略它。标記内的所有JSP腳本元素、指令和動作都将不起作用。
<!-- comment --> HTML注釋,也稱爲“輸出的注釋”,直接出現在結果HTML文檔中(zhōng)。标記内的所有JSP腳本元素、指令和動作正常執行。
<\% 在模闆文本(靜态HTML)中(zhōng)實際上希望出現“<%”的地方使用。
%\> 在腳本元素内實際上希望出現“%>”的地方使用。
\' 使用單引号的屬性内的單引号。不過,你既可以使用單引号也可以使用雙引号,而另外(wài)一(yī)種引号将具有普通含義。
\" 使用雙引号的屬性内的雙引号。參見“\'”的說明。

恰逢ICANN國際大(dà)會,.top域名知(zhī)
億騰科技2015抗戰勝利日放(fàng)假通知(zhī)
35000自然雙拼top保留域名開(kāi)放(fàng)搶
億騰科技2015端午節放(fàng)假通知(zhī)
億騰科技2015勞動節放(fàng)假通知(zhī)
【轉】關于新網的.cn/中(zhōng)國/公司/
搶注top域名,優惠多多更有好禮相
 
 全國免費(fèi)服務熱線:
 
 
copyright© 2003-2009 宜昌億騰信息服務有限公司 All Rights Reserved
公司地址:湖北(běi)省宜昌市東山大(dà)道129号時代天驕7FA05   郵編:443000   
全國免費(fèi)熱線:800 880 3058   電話(huà)總機:0717 - 6466608 6466782 6453806 6855676
直銷熱線:總機轉8001   渠道熱線:總機轉8007   網建熱線:總機轉8041   财務熱線:總機轉8010
售後技術專線:0717-6463660   傳真号碼:0717-6466783   投訴專線:總機轉8009
鄂ICP備05003992号許可證編号 B2-20030065号