JSP由淺入深(11)標記庫
來源:互聯網
上載者:User
js JSP 1.1提出了一種擴充的JSP標誌的方法,這種方法命名為“標誌庫”。這些庫允許另外的一些類似於jsp:include 或者jsp:forward的標誌,但是它們不是以jsp:為首碼的並且還附件一些特性。
為了介紹標誌庫,在本教程中我們使用Blazix標誌庫作為例子。這個標誌庫只能用在Blazix伺服器中,這個伺服器你可以免費下載。
每一個標誌庫都有它自己的標誌庫特殊的文檔。為了使用標誌庫,你可以使用"taglib" directive來指出標誌庫“description”處在什麼地方。對於Blazix標誌庫而言,directive如下:
<%@ taglib prefix="blx" uri="/blx.tld" %>
上面者句中“uri”就是指出了標誌庫描述所在的地方。標誌庫的首碼是不同的。這個指令的意思是說我們可以使用blx:來使用庫中的標誌。Blazix標誌庫提供了一個blx:getProperty標誌。這個標誌可以允許使用者編輯表單資料。現在,在GetName.jsp檔案中,我們增加一個jsp:useBean並且將表單放置在blx:getProperty中:
<%@ taglib prefix="blx" uri="/blx.tld" %>
<jsp:useBean id="user" class="UserData" scope="session"/>
<HTML>
<BODY>
<blx:getProperty name="user" property="*">
<FORM METHOD=POST ACTION="SaveName.jsp">
What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR>
What's your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR>
What's your age? <INPUT TYPE=TEXT NAME=age SIZE=4>
<P><INPUT TYPE=SUBMIT>
</FORM>
</blx:getProperty>
</BODY>
</HTML>
從上面的代碼中我們可以發現blx:getProperty不是以/>結尾的,而是用來結尾。這條語句將所有的表單輸入地區輸入到blx:getProperty中,這樣它們就可以被標誌庫正確地修改。
接著建立一個從GetName.jsp到NextPage.jsp的串連,你將發現bean的資料自動顯示在輸入地區中。所以現在使用者可以編輯資料了。
至此,我們還有一些問題還沒有澄清。首先,使用者不能清除名字地區;而且如果使用者在“age”地區鍵入一個不對的內容(不是一個效果的整型數值),Java異常錯誤就會發生。
現在,我們將使用Blazix標誌庫中的其它標誌來解決這個問題。Blazie提供了一個blx:setProperty標誌來解決這個問題。Blx:setProperty允許我們定義一個異常錯誤處理方法。如果有異常錯誤發生,我們可以為使用者收集一個錯誤資訊並且繼續處理。
下面是我們修改後的SaveName.jsp,它可以處理任何錯誤。它不僅可以顯示GetName.jsp並且在其上可以鍵入正確的資料,而且自動地串連到NextPage.jsp:
<%@ taglib prefix="blx" uri="/blx.tld" %>
<%!
boolean haveError;
StringBuffer errors;
public void errorHandler( String field,
String value,
Exception ex )
{
haveError = true;
if ( errors == null )
errors = new StringBuffer();
else
errors.append( "<P>" );
errors.append( "<P>Value for field \"" +
field + "\" is invalid." );
if ( ex instanceof java.lang.NumberFormatException )
errors.append( " The value must be a number." );
}
%>
<%
// Variables must be initialized outside declaration!
haveError = false;
errors = null;
%>
---------------
<BODY>
<jsp:useBean id="user" class="UserData" scope="session"/>
<blx:setProperty name="user"
property="*"
onError="errorHandler"/>
<%
if ( haveError ) {
out.println( errors.toString());
pageContext.include( "GetName.jsp" );
} else
pageContext.forward( "NextPage.jsp" );
%>
</BODY>
</HTML>
這裡要注意haveError和errors必須每次都重新初始化,因為它們在聲明的外部被初始化。
現在,如果一個錯誤發生在blx:setProperty處理的過程,我們就顯示這個錯誤並再次回到GetName.jsp以使使用者可以校正這個錯誤。如果沒有錯誤發生,我們就自動讓使用者串連到NextPage.jsp。
如果你細心點你還可以發現表單仍有一個問題,即“age”開始顯示空而不是0。這個問題我們可以通過增加“emptyInt=0”到blx:getProperty和blx:setProperty標誌中,這樣bean地區就被初始化為0了。如果鍵入的年齡不是一個有效數值,那麼我們就使用0來標誌Null 字元。
另外一個小的問題是如果有錯誤出現並且我們舊書包含“GetName.jsp”的時候,就得到兩個"<HTML>"標誌。對於這個問題一個完美的解決方案是去掉out.println,並按如下傳遞錯誤:
<%
if ( haveError ) {
request.setAttribute( "errors",
errors.toString());
pageContext.forward( "GetName.jsp" );
} else
pageContext.forward( "NextPage.jsp" );
%>
那麼我們可以在GetName.jsp執行“request.getAttribute”,並且如果返回數值為非空,就顯示錯誤。這個就留著作為本節教程的練習吧。
最後,再說說本節的練習吧,首先剛才說的內容。還要閱讀標誌庫文檔中的SQL標誌,然後建立一個資料庫表格;再編寫一個JSP檔案,其上有一個 FORM以及表單上有一個選擇框;接著使用SQL標誌來根據資料庫表格製作選擇框