Test.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>My JSP 'Test.jsp' starting page</title> </head> <body> This is my JSP page. <br> Date : <%= new java.util.Date().toString() %> <br> File : <input value="<%= request.getServletPath() %>" /> </body></html>
為了將這個這個Test.jsp改成自訂標籤方法,我們分別使用簡單標籤和內容標籤兩種不同的方式實現。
1. 簡單標籤
由於我們需要輸出兩個內容(日期和檔案名稱),因此我們為標籤建立一個參數。具體代碼:
DemoTag.java package com.mycompany;import java.util.Date;import javax.servlet.http.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class DemoTag extends TagSupport { public int doStartTag() throws JspException { try { HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); JspWriter out = pageContext.getOut(); if (parameter.compareToIgnoreCase("filename") == 0) out.print(request.getServletPath()); else out.print(new Date()); } catch (java.io.IOException e) { throw new JspTagException(e.getMessage()); } return SKIP_BODY; } private String parameter = "date"; public void setParameter(String parameter) { this.parameter = parameter; } public String getParameter() { return parameter; }}
接下來,我們建立標籤檔案 MyTagLib.tld。標籤檔案其實只是一個XML格式的說明檔案,內容也很簡單。
MyTagLib.tld
<?xml version="1.0" encoding="ISO-8859-1"?><taglib><tlib-version>1.0</tlib-version><jsp-version>1.2</jsp-version><tag> <name>demo</name> <tag-class>com.mycompany.DemoTag</tag-class> <body-content>empty</body-content> <attribute> <name>parameter</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute></tag></taglib>
在這個標籤檔案中,我們將我們建立的標籤取名 demo,並聲明了類型和參數(parameter)。將該檔案儲存在 /WEB-INF 下面。
當然,我們還需要將我們自訂的標籤添加到 web.xml 中,否則還是無法使用。
web.xml 裡面增加:
<jsp-config> <taglib> <taglib-uri>/WEB-INF/MyTagLib</taglib-uri> <taglib-location>/WEB-INF/MyTagLib.tld</taglib-location> </taglib> </jsp-config>
你可能在別處看到過類似的聲明,只是沒有外面的 jsp-config,但是我們使用的是DTD 2.4,如果不加,Eclipse 會提示出錯。
到此為止,我們的自訂標籤算是建立完畢。接下來,我們可以開始改寫那個JSP檔案來分離代碼了。
Test.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%><html> <head> <title>My JSP 'Test.jsp' starting page</title> </head> <body> This is my JSP page. <br> Date : <mytag:demo parameter="date" /><br> File : <mytag:demo parameter="filename" /> </body></html>
上面這些想必你已經很熟悉,我就不做多說了。
2. 內容標籤
建立過程和上面大抵相同,只是程式檔案和配置內容有些差異。
DemoTag2.java package com.mycompany;
import java.io.IOException;import java.util.Date;import javax.servlet.http.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class DemoTag2 extends BodyTagSupport { public int doStartTag() throws JspTagException { return EVAL_BODY_BUFFERED; } public int doEndTag() throws JspTagException { String body = this.getBodyContent().getString(); HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); body = body.replace("$date", new Date().toString()); body = body.replace("$filename", request.getServletPath()); try { pageContext.getOut().print(body); } catch (IOException e) { throw new JspTagException(e.getMessage()); } return SKIP_BODY; }}
我們將新的標籤 DemoTag2 加入到上面的標籤檔案中。
MyTagLib.tld
<?xml version="1.0" encoding="ISO-8859-1"?><taglib><tlib-version>1.0</tlib-version><jsp-version>1.2</jsp-version><tag> <name>demo</name> <tag-class>com.mycompany.DemoTag</tag-class> <body-content>empty</body-content> <attribute> <name>parameter</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute></tag><tag> <name>demo2</name> <tag-class>com.mycompany.DemoTag2</tag-class> <body-content>jsp</body-content></tag></taglib>
web.xml 檔案無需修改。
看看同時使用兩種標籤的Test.jsp效果。
Test.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%><html> <head> <title>My JSP 'Test.jsp' starting page</title> </head> <body> This is my JSP page. <br> Date : <mytag:demo parameter="date" /><br> File : <mytag:demo parameter="filename" /> <hr> <mytag:demo2> Date: $date<br> File: $filename </mytag:demo2> </body></html>
至此,兩種標籤方式都完成。
本文並沒有就相關技術細節做出說明,建議您看看Sun有關JSP自訂標籤的官方文檔。