自定義標籤:
什麼是自定義標籤?
自定義標籤有什麼用
自定義標籤的開發步驟:
1.編寫完成標籤功能的Java類(標籤處理器)
2.編寫標籤庫描述文件(tld文件),在其中對該標籤進行描述
3.在JSP頁面導入並使用該標籤
1.編寫完成標籤功能的Java類(標籤處理器):
其實它就是一個Java類,只是實現了某個接口或者繼承了某一個類。可以實現javax.servlet.jsp.tagext.SimpleTag接口或者
繼承SimpleTagSupport該類。
若實現接口,需要實現它的若干個方法:doTag(),setParent(JspTag parent);getParent(); setJspContext(JspContext pc);setJspBody(JspFragment jspBody).其中最重要的是doTag()方法。看方法名就知道,咱們需要把該標籤需要實現的功能的代碼寫在該方法裏面。setJspContext(JspContext pc)也很重要,它把代表JSP引擎的pageContext傳給標籤處理類,它先於doTag()方法。
private PageContext pageContext;
@Override
public void setJspContext(JspContext pc) {
// TODO Auto-generated method stub
this.pageContext=(PageContext) pc;
}
有了pageContext就可以得到頁面的其他8個隱含對象,如out,response,request等等,咱們就可以利用這些隱含對象去實現咱們想讓它實現的功能。所以JSP頁面能做的,標籤都能做。
若是選擇用繼承SimpleTagSupport類的方法,則咱們需要重寫doTag()方法。那pageContext對象去哪得到呢?翻開API,看到有個getJspContext()方法,得到JspContext對象,然後強制轉型爲pageContext對象即可。
比如咱們現在只需要簡單的在瀏覽器界面上輸出“hello".
doTag()方法:
public void doTag() throws JspException, IOException {
System.out.println("doTag");
HttpServletRequest request =(HttpServletRequest) pageContext.getRequest();
pageContext.getOut().println("Hello"+request.getParameter("name"));
}
2.編寫標籤庫描述文件(tld文件),在其中對該標籤進行描述:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- 描述TLD文件 -->
<description>MyTag 1.0 core library</description>
<display-name>MyTag core</display-name>
<tlib-version>1.0</tlib-version>
<!-- 建議在JSP頁面上使用的標籤前綴-->
<short-name>mytag</short-name>
<!-- 作爲tld文件的id,用來唯一標識當前的tld 文件,多個tld文件的Uri不能重複。通過
JSP頁面的taglib 標籤的Uri屬性 來引用-->
<uri>http://www.mytag.com/mytag/core</uri>
<!-- 描述自定義的helloSimpleTag 標籤 -->
<tag>
<!-- 標籤名 ,在JSP 頁面上使用標籤時的名字-->
<name>hello</name>
<!-- 標籤所在的全類名 -->
<tag-class>tag.HelloSimpleTag</tag-class>
<!-- 標籤體的類型 -->
<body-content>empty</body-content>
<!-- 描述當前標籤的屬性-->
<attribute>
<!-- 屬性名 -->
<name>value</name>
<!-- 該屬性是否爲必須 -->
<required>false</required>
<!-- runtime expression value
當前屬性是否可以接受運行時表達式的動態值
-->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<!-- 屬性名 -->
<name>count</name>
<!-- 該屬性是否爲必須 -->
<required>false</required>
<!-- runtime expression value
當前屬性是否可以接受運行時表達式的動態值
-->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
其中,name和count是自定義標籤的屬性。
3.在JSP頁面導入並使用該標籤:
<myTag:hello/>
hello和tld文件中的標籤名要一致。一個tld文件中可以有多個標籤和標籤名。所以在導入使用的時候也要注意點。
通過以上步驟,就完成了一個簡單自定義標籤的開發。
那麼自定義標籤中的屬性又是幹嘛的呢?也許在咱們的tld文件中需要傳入幾個參數,這時就需要屬性了。要想使用屬性,首先需要在Java類中聲明這些屬性以及相應的set()方法.
private String value;
private String count;
public void setValue(String valueString) {
this.value = valueString;
}
public void setCount(String count) {
this.count = count;
}
同時,也需要在tld文件中對這些屬性進行描述。最後,在咱們導入使用的時候,寫上這些參數名和值即可<mytag: value="myTag" count="10"/>
doTag()方法:
public void doTag() throws JspException, IOException {
System.out.println("doTag");
HttpServletRequest request =(HttpServletRequest) pageContext.getRequest();
System.out.println("value:"+value+"count:"+count);
pageContext.getOut().println("Hello"+request.getParameter("name"));
}