你能夠不去造輪子,可是你得知道輪子怎麼造。html
Javaweb實現自定義標籤:將方法封裝到自定義標籤處理類中,而後使用方法與JSTL標籤一致。在實際開發中,前臺頁面是不容許html代碼和java代碼相混合的,但有時jsp或第三方爲咱們提供的標籤知足不了需求,這時須要經過本身將業務邏輯封裝到繼承jsp規範的類或接口的處理類中來定義標籤,這就是所謂的自定義標籤。這樣的缺點是加劇了工做量。但與前端人員溝通和後期的維護上來看,這點工做是微不足道的。前端
如:java
<?xml version="1.0" encoding="ISO-8859-1" ?> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>lzqTag</short-name> <uri>/lzqTag</uri> <description> 這是一個標籤庫 </description> <tag> <name>time</name> <tag-class>com.lzq.tag.TimeTag</tag-class> <body-content>empty</body-content> <!-- body-content標籤有4個值:empty,JSP,scriptless,tagdependent: 1.empty:它是一個空的標籤體。 2.JSP:是容許標籤體內出現JSP腳本,也就是java代碼。 3.scriptless:能夠接受文本,EL表達式,和JSP的動做。 4.tagdependent:它是指在標籤體的內容能夠直接被寫入bodyContent,由自定義標籤處理類來處理,而不被JSP容器所解析。 --> <description> Perform a server side action; Log the message. </description> <attribute> <name>str</name> <required>true</required> </attribute> </tag> </taglib>
3.在jsp中引入標籤庫,如:<%@ taglib prefix="lzqtag" uri="/lzqTag" %>,並在body中使用<lzqtag:time str=’’ />web
Tag接口:tomcat
int SKIP_BODY = 0; // 跳過標籤體,不執行標籤體的內容 int EVAL_BODY_INCLUDE = 1; // 執行自定義標籤的標籤體 int SKIP_PAGE = 5; // 告訴web容器忽略標籤後面的內容 int EVAL_PAGE = 6; // 告訴web容器繼續執行標籤後面的代碼 // 在jsp運行過程當中,碰見自定義標籤後,執行的方法:返回常量SKIP_BODY、EVAL_BODY_INCLUDE int doStartTag() throws JspException; // 在執行標籤的結束標誌後,執行該方法:返回常量SKIP_PAGE、EVAL_PAGE int doEndTag() throws JspException;
IterationTag接口:app
int EVAL_BODY_AGAIN = 2; // // 提供了對標籤內容循環的功能:返回EVAL_BODY_AGAIN,一直循環,知道返回常量SKIP_BODY、EVAL_BODY_INCLUDE int doAfterBody() throws JspException;
SimpleTag接口:less
在源碼中能夠看到SimpleTag接口有5個方法,webapp
一、doTag()方法是核心方法,咱們能夠將全部的標籤處理邏輯都寫在這個方法中,這個方法會拋出一個JspException,而後咱們能夠經過這個異常通知WEB容器,再也不執行此標籤後面的內容。jsp
二、setParent(JspTag),這個方法呢,由WEB容器所調用的,是將父標籤處理器對象傳遞給標籤處理器。ide
三、getParent()是獲取當前標籤的父標籤對象,好比在標籤嵌套時,能夠用此方法獲得當前標籤的父標籤。
四、setJSPContext(JspContext)這個方法也是由容器調用的,這個方法是將JSP頁面中的pageContext對象傳遞給標籤處理器對象。
五、setJspBody(JspFragment)這個方法也由web容器調用,意思是將表明當前標籤體的JspFragment對象傳遞給標籤處理器對象,這裏的參數能夠理解爲標籤體的內容。
注意:JSP引擎在處理簡單標籤的標籤時,會將標籤體中的內容封裝到JspFragment這個參數中,並調用setJspBody(JspFragment)將該對象傳遞給標籤處理器,咱們就能夠根據需求來控制是否輸出標籤體或者循環標籤體。