Java Servlet和JSP教程(13)(轉)

post0發表於2007-08-11
Java Servlet和JSP教程(13)(轉)[@more@] 此篇是本站CnJSP小組核心成員鈍刀原創作品 13 JSP高階內容 13.1 jsp:include動作 該動作把指定檔案插入正在生成的頁面。其語法如下: 前面已經介紹過include指令,它是在JSP檔案被轉換成Servlet的時候引入檔案,而這裡的jsp:include動作不同,插入檔案的時間是在頁面被請求的時候。jsp:include動作的檔案引入時間決定了它的效率要稍微差一點,而且被引用檔案不能包含某些JSP程式碼(例如不能設定 HTTP頭),但它的靈活性卻要好得多。 例如,下面的JSP頁面把4則新聞摘要插入一個“What's New ?”頁面。改變新聞摘要時只需改變這四個檔案,而主JSP頁面卻可以不作修改: WhatsNew.jsp What's New
What's New at JspNews.com

Here is a summary of our four most recent news stories:

13.2 jsp:useBean動作 jsp:useBean動作用來裝載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因為它使得我們既可以發揮Java元件重用的優勢,同時也避免了損失JSP區別於Servlet的方便性。jsp:useBean動作最簡單的語法為: 這行程式碼的含義是:“建立一個由class屬性指定的類的例項,然後把它繫結到其名字由id屬性給出的變數上”。不過,就象我們接下來會看到的,定義一個 scope屬性可以讓Bean關聯到更多的頁面。此時,jsp:useBean動作只有在不存在同樣id和scope的Bean時才建立新的物件例項,同時,獲得現有Bean的引用就變得很有必要。 獲得Bean例項之後,要修改Bean的屬性既可以透過jsp: setProperty動作進行,也可以在Scriptlet中利用id屬性所命名的物件變數,透過呼叫該物件的方法顯式地修改其屬性。這使我們想起,當我們說“某個Bean有一個型別為X的屬性foo”時,就意味著“這個類有一個返回值型別為X的getFoo方法,還有一個setFoo方法以X型別的值為引數”。 有關jsp:setProperty動作的詳細情況在後面討論。但現在必須瞭解的是,我們既可以透過jsp: setProperty動作的value屬性直接提供一個值,也可以透過param屬性宣告Bean的屬性值來自指定的請求引數,還可以列出Bean屬性表明它的值應該來自請求引數中的同名變數。 在JSP表示式或Scriptlet中讀取Bean屬性透過呼叫相應的getXXX方法實現,或者更一般地,使用jsp:getProperty動作。 注意包含Bean的類檔案應該放到伺服器正式存放Java類的目錄下,而不是保留給修改後能夠自動裝載的類的目錄。例如,對於 Java Web Server來說,Bean和所有Bean用到的類都應該放入classes目錄,或者封裝進jar檔案後放入lib目錄,但不應該放到servlets下。 下面是一個很簡單的例子,它的功能是裝載一個Bean,然後設定/讀取它的message屬性。 BeanTest.jsp Reusing JavaBeans in JSP
Reusing JavaBeans in JSP

Message:

SimpleBean.java BeanTest頁面用到了一個SimpleBean。SimpleBean的程式碼如下: package hall; public class SimpleBean { private String message = "No message specified"; public String getMessage() { return(message); } public void setMessage(String message) { this.message = message; } } 13.3 關於jsp:useBean的進一步說明 使用Bean最簡單的方法是先用下面的程式碼裝載Bean: 然後透過jsp:setProperty和jsp:getProperty修改和提取Bean的屬性。不過有兩點必須注意。第一,我們還可以用下面這種格式例項化Bean: Body 它的意思是,只有當第一次例項化Bean時才執行Body部分,如果是利用現有的Bean例項則不執行Body部分。正如下面將要介紹的,jsp:useBean並非總是意味著建立一個新的Bean例項。 第二,除了id和class外,jsp:useBean還有其他三個屬性,即:scope,type,beanName。下表簡要說明這些屬性的用法。 表示該Bean在當前的客戶請求內有效(儲存在ServletRequest物件內)。 屬性 用法 id 命名引用該Bean的變數。如果能夠找到id和scope相同的Bean例項,jsp:useBean動作將使用已有的Bean例項而不是建立新的例項。 class 指定Bean的完整包名。 scope 指定Bean在哪種上下文內可用,可以取下面的四個值之一: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開始標記和結束標記之間的任何內容都將被忽略。 type 指定引用該物件的變數的型別,它必須是Bean類的名字、超類名字、該類所實現的介面名字之一。請記住變數的名字是由id屬性指定的。 beanName 指定Bean的名字。如果提供了type屬性和beanName屬性,允許省略class屬性。 13.4 jsp:setProperty動作 jsp:setProperty用來設定已經例項化的Bean物件的屬性,有兩種用法。首先,你可以在jsp:useBean元素的外面(後面)使用jsp:setProperty,如下所示: ... 此時,不管jsp:useBean是找到了一個現有的Bean,還是新建立了一個Bean例項,jsp:setProperty都會執行。第二種用法是把jsp:setProperty放入jsp:useBean元素的內部,如下所示: ... 此時,jsp:setProperty只有在新建Bean例項時才會執行,如果是使用現有例項則不執行jsp:setProperty。 jsp:setProperty動作有下面四個屬性: 屬性 說明 name name屬性是必需的。它表示要設定屬性的是哪個Bean。 property property屬性是必需的。它表示要設定哪個屬性。有一個特殊用法:如果property的值是“*”,表示所有名字和Bean屬性名字匹配的請求引數都將被傳遞給相應的屬性set方法。 value value 屬性是可選的。該屬性用來指定Bean屬性的值。字串資料會在目標類中透過標準的valueOf方法自動轉換成數字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean型別的屬性值(比如“true”)透過 Boolean.valueOf轉換,int和Integer型別的屬性值(比如“42”)透過Integer.valueOf轉換。value和 param不能同時使用,但可以使用其中任意一個。 param param是可選的。它指定用哪個請求引數作為Bean屬性的值。如果當前請求沒有引數,則什麼事情也不做,系統不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供預設屬性值,只有當請求引數明確指定了新值時才修改預設屬性值。 例如,下面的程式碼片斷表示:如果存在numItems請求引數的話,把numberOfItems屬性的值設定為請求引數numItems的值;否則什麼也不做。 如果同時省略value和param,其效果相當於提供一個param且其值等於property的值。進一步利用這種藉助請求引數和屬性名字相同進行自動賦值的思想,你還可以在property(Bean屬性的名字)中指定“*”,然後省略value和param。此時,伺服器會檢視所有的Bean屬性和請求引數,如果兩者名字相同則自動賦值。 下面是一個利用JavaBean計算素數的例子。如果請求中有一個numDigits引數,則該值被傳遞給Bean的numDigits屬性;numPrimes也類似。 JspPrimes.jsp 在JSP中使用JavaBean
在JSP中使用JavaBean

Some digit primes: 注:NumberedPrimes的程式碼略。 13.5 jsp:getProperty動作 jsp: getProperty動作提取指定Bean屬性的值,轉換成字串,然後輸出。jsp:getProperty有兩個必需的屬性,即:name,表示 Bean的名字;property,表示要提取哪個屬性的值。下面是一個例子,更多的例子可以在前文找到。 ...

  • Number of items:
  • Cost of each:
13.6 jsp:forward動作 jsp:forward動作把請求轉到另外的頁面。jsp:forward標記只有一個屬性page。page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,如下面的例子所示: 13.7 jsp:plugin動作 jsp:plugin動作用來根據瀏覽器的型別,插入透過Java外掛 執行Java Applet所必需的OBJECT或EMBED元素。 附錄:JSP註釋和字元引用約定 下面是一些特殊的標記或字元,你可以利用它們插入註釋或可能被視為具有特殊含義的字元。 語法 用途 JSP註釋,也稱為“隱藏註釋”。JSP引擎將忽略它。標記內的所有JSP指令碼元素、指令和動作都將不起作用。 <!-- comment --&gt HTML註釋,也稱為“輸出的註釋”,直接出現在結果HTML文件中。標記內的所有JSP指令碼元素、指令和動作正常執行。 在指令碼元素內實際上希望出現“%>”的地方使用。 ' 使用單引號的屬性內的單引號。不過,你既可以使用單引號也可以使用雙引號,而另外一種引號將具有普通含義。 " 使用雙引號的屬性內的雙引號。參見“'”的說明。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-946050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章