1. 說明
本文檔是學習tomcat中例子的筆記,并沒有參考相應的說明文檔,因此不能保證本文觀點的正確性。如果有不對之處,不妨email至8280338@tzenet.com,大家共同進步。
2. JSP2.0標簽使用方法
JSP2.0中標簽的使用由多個部分組成:
(1) WEB_INF/web.xml中添加標簽引用
(2) 標簽的實現,可能是class也可能是web templet
(3) 在jsp文件中添加引用
在實際使用中,分析jsp2.0標簽可以先從jsp文件入手,然后再分析web.xml及相應的標簽庫文件。
2.2 基本標簽的使用方法
2.2.1 jsp文件中的標簽引用及使用方法
以下是一個簡單的jsp文件:
<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
<html> <body> <mytag:helloWorld/> </body></html>
說明:
(1) 首先以<%@ taglib prefix="mytag" uri="…" %>說明標簽前綴及該前綴引用的標簽所在路徑,在這個例子中uri值是一個相對路徑(本地路徑),即當前項目根目錄下WEB-INF/ jsp2/ jsp2-example-taglib.tld。如果使用的是本地路徑就不需要在web.xml中配置路徑映射了;
(2) 指定了標簽前綴后,在jsp頁面的body內就可以使用這個前綴來引用標簽庫中的指定標簽了,如<mytag:helloWorld/>,就是引用mytag所指定的標簽庫中的helloWorld標簽。
2.2.2 web.xml中的配置
如果在上述例子中使用的不是本地路徑,那么就需要在web.xml中配置路徑轉換,如使用:<%@ taglib prefix="mytag" uri=" http://mytaglib/myTestTags1 " %>來引用標簽庫,那么就需要在web.xml文件的jsp-config節點中添加如下配置:
<taglib>
<taglib-uri>http://mytaglib/myTestTags1</taglib-uri>
<taglib-location>/WEB-INF/jsp2/jsp2-example-taglib.tld </taglib-location>
</taglib>
JSP解釋器會將http://mytaglib/myTestTags1根據web.xml中的配置轉化為本地路徑。當然<taglib-uri>中文本可以是任何值,但不能和其它的配置沖突,所以在規劃時最好加上前綴,如:http://mytaglib等。
2.2.3 標簽庫中的配置
在標簽庫中的配置實際上就是配置對實現類的引用,JSP解釋器會根據jsp文件中對標簽的引用,在標簽庫中找到相應的標簽,然后再根據標簽中的定義調用具體的實現類,本例中在jsp文件中對標簽的引用:<mytag:helloWorld/>,即引用了helloWorld這個標簽,這個標簽在標簽庫中的定義如下:
<tag>
<description>Outputs Hello, World</description>
<name>helloWorld</name>
<tag-class>jsp2.examples.simpletag.HelloWorldSimpleTag</tag-class>
<body-content>empty</body-content>
</tag>
該標簽由四個部分組成:
(1) description:描述該標簽的作用
(2) name:標簽的名字,該名字在jsp文件使用,相當由類名;
(3) tag-class:標簽的實現索引,相當于類的實現;本例索引指定jsp2.examples.simpletag.HelloWorldSimpleTag,是一個java的類文件,應放在WEB_INF/classes/jsp2/examples/simpletag目錄下的HelloWorldSimpleTag.class文件;
(4) body-content:在jsp文件中使用標簽時,標簽中的內容類別,本例的值是empty,表示helloWorld這個標簽中沒有內容。如果在jsp頁面中在該標簽中加入了內容,如<mytag:helloWorld>hell</mytag:helloWorld>,頁面會報錯,當然<mytag:helloWorld></mytag:helloWorld>是不會錯的(注意不能有空格式)。
2.2.4 類的實現
類HelloWorldSimpleTag實現如下:
package jsp2.examples.simpletag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class HelloWorldSimpleTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
getJspContext().getOut().write( "Hello, world!" );
}}
說明:
(1) jsp標簽調用的類一般繼承于SimpleTagSupport
(2) SimpleTagSupport中實現了getJspContext()這個方法,這個方法可以獲取指向jsp頁面的輸出流。
(3) getJspContext().getOut().write( "Hello, world!" ):輸出Hellow,World!
2.3含有變量的tag配置
2.3.1 jsp文件中的標簽引用及使用方法
以下是引用了帶有變量標簽的jsp頁面:
<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/my_taglib.tld" %>
<html><body>
<mytag:repeat num1="15">
Invocation ${count} of 5<br>
</mytag:repeat>
</body>
</html>
說明:
(1) <mytag:repeat num="15">,輸入參數的傳入方法:即在標簽中將要傳入的參數做為標簽的一個屬性,并指定其屬性值,本例中傳入參數num1,它的值為15;
(2) ${count},在頁面中顯示輸出參數的值,count是輸出參數的名字
2.3.2 標簽庫中的配置
標簽庫中的相應配置如下:
<tag>
<description>Repeats the body of the tag 'num' times</description>
<name>repeat</name>
<tag-class>jsp2.examples.simpletag.RepeatSimpleTag</tag-class>
<body-content>scriptless</body-content>--標簽內容是腳本
<variable>
<description>Current invocation count (1 to num)</description>
<name-given>count</name-given> --輸出參數說明
</variable>
<attribute>
<name>num</name> --輸入參數說明
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
該標簽由六個部分組成:
(1) description:見上文
(2) name:見上文
(3) tag-class:見上文
(4) body-content:這個例子的值是scriptless,表示標簽中的內容是腳本
(5) variable:輸出參數,在jsp中使用${count}來引用這個輸出變量的值,輸出參數名并不是強制性的,這里只是一個約定,即要求repeat實現類最后有count這個輸出參數,以便在jsp頁中方便引用,如果沒有也不會報錯;
(6) attribute:輸入參數,在jsp中使用< mytag:repeat num="5">來設置這個輸入參數num,這個參數名是強制性的,即要在repeat實現類中有setNum這個方法,如果沒有相應的方法jsp頁面會報錯;
2.3.3 類的實現
package jsp2.examples.simpletag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.util.HashMap;
import java.io.IOException;
public class RepeatSimpleTag1 extends SimpleTagSupport {
private int num;
public void doTag() throws JspException, IOException {
for (int i=0; i<num; i++) {
getJspContext().setAttribute("count", String.valueOf( i + 1 ) );
getJspBody().invoke(null);
} }
public void setNum(int num) {
this.num = num; }}
說明:
(1) getJspContext().setAttribute定義了輸出到jsp頁面的輸出參數count,這里的count是一個字符串,它的值可以不與標簽庫中variable定義相同,如,它可以是len,當然在jsp引用時應以這里為準,即使用${len}引用;
(2) setNum(int num)方法:接收輸入參數,這個方法命名規則為set+輸入參數名,該方法帶一個參數,用于接收輸入參數的值。
2.4 函數標簽的定義方法
2.4.1 jsp文件中函數標簽引用及使用方法
<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
<html>
<body><span>${my:caps(“HELLO WORLD”)}</span></body>
</html>
說明:
(1) 函數標簽的引用比其它標簽的引用都要簡單,它的引用與高級語言中的函數調用方法類似,直接在函數名后的括號后面輸入相應的參數值即可,不需要另加用標簽的其它屬性來說明輸入參數。
2.4.2 函數標簽在標簽庫中配置
<function>
<description>Converts the string to all caps</description>
<name>caps</name>
<function-class>jsp2.examples.el.Functions</function-class>
<function-signature>java.lang.String caps( java.lang.String )</function-signature>
</function>
說明如下:
(1) 這種方法的定義包含在function元素中;
(2) name:函數名
(3) function-class:該函數真正的實現class,本例中,caps函數是由WEB_INF/classes/ jsp2/examples/el路徑中的Functions類來實現的;
(4) function-signature:說明函數的輸入及輸出參數類型,不用指明參數名。
2.4.3 類的實現
package jsp2.examples.el;
import java.util.*;
public class Functions {
public static String caps( String text ) {
return text.toUpperCase();
}}
說明:
(1) 函數標簽實現類就是普通的類,它不需要從某個父類繼承;
(2) 函數標簽實現類中必須有相應的方法與標簽庫中相應的函數字義相同(包括函數名,輸入參數個數及輸入參數類型,函數的返回值);
2.5 標簽模板
標簽模板的特點:
(1) 沒有tld文件在jsp中通過<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>引用,即使用tagdir代替了uri,這里的tags是一個文件夾,不是文件,在該文件夾中包含了所需的標簽模板;
(2) 通過以下方式傳入參數值:
<tags:displayProducts>
<jsp:attribute name="normalPrice">....</jsp:attribute>
<jsp:attribute name="onSale">....</jsp:attribute>
.....
</tags:displayProducts>
(3) displayProducts是與/WEB-INF/tags目錄中的某個文件名;
(4) 通過<jsp:attribute name="…. ">來賦值
(5) 標簽模板是一個純文本文件,類似于html文件,而不需要通過java的類來實現標簽的定義;
(6) 個人認為標簽模板的主要作用重在排版,而其它標簽的作用重在功能的實現;本人不打算在以后的開發使用標簽模板,因此本文不再進一步分析標簽模板。
3. 參考
http://localhost:8080/jsp-examples/