一個(gè)開發(fā)人員眼中的JSP技術(shù)(下)
更新時(shí)間:2006年10月13日 00:00:00 作者:
使用定制化的標(biāo)簽
盡管你可以在JSP頁(yè)面中植入Java代碼并在服務(wù)器方執(zhí)行,但是,JSP也支持使用定制標(biāo)簽來(lái)插入動(dòng)態(tài)內(nèi)容,它有一種機(jī)制可以讓你在JSP頁(yè)面中插入你自己的、與HTML類似的標(biāo)簽。換句話說(shuō),你的JSP網(wǎng)頁(yè)能夠使用插入Java代碼的簡(jiǎn)單標(biāo)簽語(yǔ)法產(chǎn)生動(dòng)態(tài)的內(nèi)容。但定制標(biāo)簽的用處不是很大。
創(chuàng)建一個(gè)定制標(biāo)簽比在JSP網(wǎng)頁(yè)中使用簡(jiǎn)單的scriptlet要復(fù)雜得多,因?yàn)槎ㄖ茦?biāo)簽需要用幾個(gè)步驟來(lái)把你的Java組件和JSP代碼連接起來(lái)。不過(guò),定制標(biāo)簽在分發(fā)和重復(fù)使用的時(shí)候就非常簡(jiǎn)單了。對(duì)定制標(biāo)簽的支持將在JSP創(chuàng)建工具中實(shí)現(xiàn)。
在下面的例子中產(chǎn)生動(dòng)態(tài)內(nèi)容的JSP網(wǎng)頁(yè)就使用了定制標(biāo)簽。注意,在這個(gè)例子中我們不再需要引入Java類、聲明變量或?qū)懭魏蜫ava代碼:
<%@ taglib uri="/tlds/menuDB.tld" prefix="menu" %>
<%@ include file="lunch_menu.html" %>
從上面的語(yǔ)句中我們可以看出,這個(gè)頁(yè)面明顯比前面的scriptlet例子要簡(jiǎn)單許多,因?yàn)樗鼪]有包含初始化對(duì)象和執(zhí)行相應(yīng)的方法。但是JSP網(wǎng)頁(yè)代碼僅僅只是一部分;對(duì)于每一個(gè)定制標(biāo)簽,還包括下面的三個(gè)組件:
(1)包含定制標(biāo)簽的網(wǎng)頁(yè),比如說(shuō),上面的代碼片斷中就使用了insertCatchOfDay 的定制標(biāo)簽。在使用定制標(biāo)簽之前,頁(yè)面必須指定Taglib Directive來(lái)提供標(biāo)簽庫(kù)描述符(對(duì)標(biāo)簽定義)的位置。當(dāng)執(zhí)行定制標(biāo)簽的時(shí)候,網(wǎng)頁(yè)還有代表性的定義了一個(gè)和多個(gè)標(biāo)簽屬性(比如在這個(gè)例子中的“meal”)來(lái)確定動(dòng)態(tài)內(nèi)容。
?。?)標(biāo)簽庫(kù)描述符。它是一個(gè)定義了定制化標(biāo)簽并把它和Tag Handler連接起來(lái)的XML文件。一個(gè)標(biāo)簽庫(kù)描述符包含了標(biāo)簽的不同屬性,相關(guān)Tag Handler的名稱(位置)以及JSP引擎需要處理定制標(biāo)簽的其他信息。
?。?)Tag Handler。 它是一個(gè)與定制標(biāo)簽聯(lián)合執(zhí)行操作的Java類。例如,在上面的insertCatchOfDay標(biāo)簽中,Tag Handler就是執(zhí)行數(shù)據(jù)庫(kù)查詢得到相應(yīng)菜單項(xiàng)的Java類。
我們已經(jīng)看到了一個(gè)使用定制標(biāo)簽的JSP網(wǎng)頁(yè),下面讓我們來(lái)看一看另外的兩個(gè)組件。
Tag Handler
tag handler是一個(gè)與servlet比較相似的Java類。但是servlet能夠執(zhí)行Servlet接口,還能夠被HTML GET或POST請(qǐng)求所執(zhí)行。tag handler也能夠執(zhí)行一個(gè)標(biāo)簽接口(javax.servlet.jsp.Tag)以及在定制標(biāo)簽被JSP引擎處理的時(shí)候執(zhí)行。
如果定制標(biāo)簽包含了屬性,那么tag handler就必須定義這些屬性以及每一個(gè)的get/set方法。例如,當(dāng)定義上面insertCatchOfDay定制標(biāo)簽的tag handler的時(shí)候,我們必須定義“meal”屬性和與它相關(guān)的get和set 方法:
private String meal = null;
public void setMeal(String s) {
meal = s;
}
public String getMeal() {
return meal;
}
Tag Library Descriptor
如果你所有的時(shí)間都在處理Java技術(shù)而不知道關(guān)于 XML方面的東西,那么標(biāo)簽庫(kù)描述符組件可能看起來(lái)會(huì)比較陌生。但是你也不需要擔(dān)心,因?yàn)槟悴恍枰獙W(xué)習(xí)一門新的編程語(yǔ)言。標(biāo)簽庫(kù)描述符僅僅使用與HTML相似的標(biāo)簽語(yǔ)法來(lái)定義定制標(biāo)簽的名字和屬性,這更象定義一個(gè)對(duì)象。
下面的標(biāo)簽庫(kù)描述符定義了insertCatchOfDay標(biāo)簽。注意,這個(gè)文件定義了定制標(biāo)簽的名稱,屬性和相關(guān)的Tag Handler類:
xml version="1.0" ?>
insertCatchOfDay
com.sun.CatchOfDayHandler
Queries menu database for the catch of the day。
meal
與定義屬性的名稱一樣,標(biāo)簽庫(kù)描述符也能夠定義數(shù)據(jù)類型并指定其屬性(無(wú)論是否需要);在Tag Handler被執(zhí)行之前,它允許JSP引擎去做某些錯(cuò)誤檢查。還有其他的信息,比如說(shuō)為了使用JSP創(chuàng)建工具,庫(kù)名和版本號(hào)也可以包含在標(biāo)簽庫(kù)中。
更多的例子
在下面的例子中,第一個(gè)例子在JSP頁(yè)面中使用了HTTP請(qǐng)求對(duì)象 (HttpServletRequest) 來(lái)判斷用戶瀏覽器的版本并從三個(gè)HTML頁(yè)面中的一個(gè)中返回相應(yīng)的內(nèi)容:
<%@ page language=="java" info="Example JSP #1" %>
<%! String agent; %>
<%
agent = request.getHeader("User-Agent");
if ( agent.startsWith("Mozilla/4.0") {
%>
<%-- Return content for 4.0 browsers --%>
<%@ include file="ver4.html" %>
<%
}
else if ( agent.startsWith("Mozilla/3.0") {
%>
<%-- Return content for 3.0 browsers --%>
<%@ include file="ver3.html" %>
<%
}
else {
%>
<%-- Return content for other/unknown browsers --%>
<%@ include file="other.html" %>
<%
}
%>
注意:此頁(yè)面無(wú)須聲明或初始化HTTP請(qǐng)求對(duì)象就可以直接對(duì)它進(jìn)行訪問(wèn)。請(qǐng)求和響應(yīng)(HttpServletResponse)對(duì)象都能夠隱含地在JSP 頁(yè)面中使用。和servlet一樣,JSP頁(yè)面能夠使用請(qǐng)求對(duì)象從HTML窗體中獲得參數(shù)值。
<%@ page language="java" info="Example JSP #2" %>
<%@ include file="header.html" %>
<%! String selections[], info; %>
<%
selections = request.getParameterValues("items");
if (selections != null) {
%>
}
else {
%>
<%
}
%>
<%@ include file="footer.html" %>
在這個(gè)例子中,當(dāng)每一個(gè)參數(shù)值都被讀取以后,JavaBean組件便查詢所需要的信息。在JSP網(wǎng)頁(yè)中使用Bean這種方法可以容易地從數(shù)據(jù)庫(kù)中返回動(dòng)態(tài)web內(nèi)容。
結(jié)論
如果你正在尋找一種能簡(jiǎn)便建立連接服務(wù)器方Java組件的web程序的方法,那么JavaServer Page正是你所需要的。除了EJB,RMI,JDBC和JavaBean外,分離HTML表述代碼和web程序,也使得JSP網(wǎng)頁(yè)組織起來(lái)運(yùn)行變得更容易了。事實(shí)上,由于web設(shè)計(jì)人員幾乎無(wú)須Java開發(fā)人員的幫助就可以建立JSP頁(yè)面,所以你再也不同擔(dān)心創(chuàng)建web網(wǎng)頁(yè)和寫HTML代碼了。
<全文完>
盡管你可以在JSP頁(yè)面中植入Java代碼并在服務(wù)器方執(zhí)行,但是,JSP也支持使用定制標(biāo)簽來(lái)插入動(dòng)態(tài)內(nèi)容,它有一種機(jī)制可以讓你在JSP頁(yè)面中插入你自己的、與HTML類似的標(biāo)簽。換句話說(shuō),你的JSP網(wǎng)頁(yè)能夠使用插入Java代碼的簡(jiǎn)單標(biāo)簽語(yǔ)法產(chǎn)生動(dòng)態(tài)的內(nèi)容。但定制標(biāo)簽的用處不是很大。
創(chuàng)建一個(gè)定制標(biāo)簽比在JSP網(wǎng)頁(yè)中使用簡(jiǎn)單的scriptlet要復(fù)雜得多,因?yàn)槎ㄖ茦?biāo)簽需要用幾個(gè)步驟來(lái)把你的Java組件和JSP代碼連接起來(lái)。不過(guò),定制標(biāo)簽在分發(fā)和重復(fù)使用的時(shí)候就非常簡(jiǎn)單了。對(duì)定制標(biāo)簽的支持將在JSP創(chuàng)建工具中實(shí)現(xiàn)。
在下面的例子中產(chǎn)生動(dòng)態(tài)內(nèi)容的JSP網(wǎng)頁(yè)就使用了定制標(biāo)簽。注意,在這個(gè)例子中我們不再需要引入Java類、聲明變量或?qū)懭魏蜫ava代碼:
<%@ taglib uri="/tlds/menuDB.tld" prefix="menu" %>
Today's Menu
Lunch
<%@ include file="lunch_menu.html" %>
Our Special of the Day
從上面的語(yǔ)句中我們可以看出,這個(gè)頁(yè)面明顯比前面的scriptlet例子要簡(jiǎn)單許多,因?yàn)樗鼪]有包含初始化對(duì)象和執(zhí)行相應(yīng)的方法。但是JSP網(wǎng)頁(yè)代碼僅僅只是一部分;對(duì)于每一個(gè)定制標(biāo)簽,還包括下面的三個(gè)組件:
(1)包含定制標(biāo)簽的網(wǎng)頁(yè),比如說(shuō),上面的代碼片斷中就使用了insertCatchOfDay 的定制標(biāo)簽。在使用定制標(biāo)簽之前,頁(yè)面必須指定Taglib Directive來(lái)提供標(biāo)簽庫(kù)描述符(對(duì)標(biāo)簽定義)的位置。當(dāng)執(zhí)行定制標(biāo)簽的時(shí)候,網(wǎng)頁(yè)還有代表性的定義了一個(gè)和多個(gè)標(biāo)簽屬性(比如在這個(gè)例子中的“meal”)來(lái)確定動(dòng)態(tài)內(nèi)容。
?。?)標(biāo)簽庫(kù)描述符。它是一個(gè)定義了定制化標(biāo)簽并把它和Tag Handler連接起來(lái)的XML文件。一個(gè)標(biāo)簽庫(kù)描述符包含了標(biāo)簽的不同屬性,相關(guān)Tag Handler的名稱(位置)以及JSP引擎需要處理定制標(biāo)簽的其他信息。
?。?)Tag Handler。 它是一個(gè)與定制標(biāo)簽聯(lián)合執(zhí)行操作的Java類。例如,在上面的insertCatchOfDay標(biāo)簽中,Tag Handler就是執(zhí)行數(shù)據(jù)庫(kù)查詢得到相應(yīng)菜單項(xiàng)的Java類。
我們已經(jīng)看到了一個(gè)使用定制標(biāo)簽的JSP網(wǎng)頁(yè),下面讓我們來(lái)看一看另外的兩個(gè)組件。
Tag Handler
tag handler是一個(gè)與servlet比較相似的Java類。但是servlet能夠執(zhí)行Servlet接口,還能夠被HTML GET或POST請(qǐng)求所執(zhí)行。tag handler也能夠執(zhí)行一個(gè)標(biāo)簽接口(javax.servlet.jsp.Tag)以及在定制標(biāo)簽被JSP引擎處理的時(shí)候執(zhí)行。
如果定制標(biāo)簽包含了屬性,那么tag handler就必須定義這些屬性以及每一個(gè)的get/set方法。例如,當(dāng)定義上面insertCatchOfDay定制標(biāo)簽的tag handler的時(shí)候,我們必須定義“meal”屬性和與它相關(guān)的get和set 方法:
private String meal = null;
public void setMeal(String s) {
meal = s;
}
public String getMeal() {
return meal;
}
Tag Library Descriptor
如果你所有的時(shí)間都在處理Java技術(shù)而不知道關(guān)于 XML方面的東西,那么標(biāo)簽庫(kù)描述符組件可能看起來(lái)會(huì)比較陌生。但是你也不需要擔(dān)心,因?yàn)槟悴恍枰獙W(xué)習(xí)一門新的編程語(yǔ)言。標(biāo)簽庫(kù)描述符僅僅使用與HTML相似的標(biāo)簽語(yǔ)法來(lái)定義定制標(biāo)簽的名字和屬性,這更象定義一個(gè)對(duì)象。
下面的標(biāo)簽庫(kù)描述符定義了insertCatchOfDay標(biāo)簽。注意,這個(gè)文件定義了定制標(biāo)簽的名稱,屬性和相關(guān)的Tag Handler類:
xml version="1.0" ?>
Queries menu database for the catch of the day。
與定義屬性的名稱一樣,標(biāo)簽庫(kù)描述符也能夠定義數(shù)據(jù)類型并指定其屬性(無(wú)論是否需要);在Tag Handler被執(zhí)行之前,它允許JSP引擎去做某些錯(cuò)誤檢查。還有其他的信息,比如說(shuō)為了使用JSP創(chuàng)建工具,庫(kù)名和版本號(hào)也可以包含在標(biāo)簽庫(kù)中。
更多的例子
在下面的例子中,第一個(gè)例子在JSP頁(yè)面中使用了HTTP請(qǐng)求對(duì)象 (HttpServletRequest) 來(lái)判斷用戶瀏覽器的版本并從三個(gè)HTML頁(yè)面中的一個(gè)中返回相應(yīng)的內(nèi)容:
<%@ page language=="java" info="Example JSP #1" %>
<%! String agent; %>
<%
agent = request.getHeader("User-Agent");
if ( agent.startsWith("Mozilla/4.0") {
%>
<%-- Return content for 4.0 browsers --%>
<%@ include file="ver4.html" %>
<%
}
else if ( agent.startsWith("Mozilla/3.0") {
%>
<%-- Return content for 3.0 browsers --%>
<%@ include file="ver3.html" %>
<%
}
else {
%>
<%-- Return content for other/unknown browsers --%>
<%@ include file="other.html" %>
<%
}
%>
注意:此頁(yè)面無(wú)須聲明或初始化HTTP請(qǐng)求對(duì)象就可以直接對(duì)它進(jìn)行訪問(wèn)。請(qǐng)求和響應(yīng)(HttpServletResponse)對(duì)象都能夠隱含地在JSP 頁(yè)面中使用。和servlet一樣,JSP頁(yè)面能夠使用請(qǐng)求對(duì)象從HTML窗體中獲得參數(shù)值。
<%@ page language="java" info="Example JSP #2" %>
<%@ include file="header.html" %>
<%! String selections[], info; %>
Here are your current selections:
<%
selections = request.getParameterValues("items");
if (selections != null) {
%>
<%= selections[x] %> : <%= db.getInfo(selections[x]) %>
<%
}
%>
<%
for(int x = 0; x < selections.length; x++) {
%>
}
else {
%>
(no items selected)
<%
}
%>
<%@ include file="footer.html" %>
在這個(gè)例子中,當(dāng)每一個(gè)參數(shù)值都被讀取以后,JavaBean組件便查詢所需要的信息。在JSP網(wǎng)頁(yè)中使用Bean這種方法可以容易地從數(shù)據(jù)庫(kù)中返回動(dòng)態(tài)web內(nèi)容。
結(jié)論
如果你正在尋找一種能簡(jiǎn)便建立連接服務(wù)器方Java組件的web程序的方法,那么JavaServer Page正是你所需要的。除了EJB,RMI,JDBC和JavaBean外,分離HTML表述代碼和web程序,也使得JSP網(wǎng)頁(yè)組織起來(lái)運(yùn)行變得更容易了。事實(shí)上,由于web設(shè)計(jì)人員幾乎無(wú)須Java開發(fā)人員的幫助就可以建立JSP頁(yè)面,所以你再也不同擔(dān)心創(chuàng)建web網(wǎng)頁(yè)和寫HTML代碼了。
<全文完>
相關(guān)文章
JSP request(return String)用法詳例
JSP中request(return String)用法詳例 ,需要的朋友可以參考下。2009-10-10
JSP數(shù)據(jù)庫(kù)操數(shù)據(jù)分頁(yè)顯示
JSP數(shù)據(jù)庫(kù)操數(shù)據(jù)分頁(yè)顯示...2006-10-10
JSP中的字符替換函數(shù) str_replace() 實(shí)現(xiàn)!
JSP中的字符替換函數(shù) str_replace() 實(shí)現(xiàn)!...2006-10-10
JSP自定義標(biāo)簽-標(biāo)簽屬性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
對(duì)自定義標(biāo)簽添加一些屬性,可以使我們的標(biāo)簽功能更加靈活和復(fù)用。下面通過(guò)本文給大家分享JSP自定義標(biāo)簽-標(biāo)簽屬性的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-07-07
Linux和Windows中tomcat修改內(nèi)存大小的方法
Linux和Windows中tomcat修改內(nèi)存大小的方法,可以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置,大家參考使用吧2013-12-12

