自定義JSTL標簽和函數庫,jstl標簽函數庫
一、自定義JSTL標簽
1.編寫標簽處理類:
(1)實現 SimpleTag 接口,通過 setJspContext()方法可以獲取到 jspContext 對象,實際上也是 pageContext 對象。
在 doTag() 方法中完成邏輯,通過 JspWriter out = jspContext.getOut(); 獲取到的 out 對象,可以輸出到頁面。如:

![]()
/**
* MyTag2
*
* @author solverpeng
* @create 2016-07-03-10:20
*/
public class MyTag2 implements SimpleTag {
private JspContext jspContext = null;
@Override
public void doTag() throws JspException, IOException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dataStr = simpleDateFormat.format(new Date());
JspWriter out = jspContext.getOut();
out.write(dataStr);
}
@Override
public void setParent(JspTag jspTag) {
}
@Override
public JspTag getParent() {
return null;
}
@Override
public void setJspContext(JspContext jspContext) {
this.jspContext = jspContext;
}
@Override
public void setJspBody(JspFragment jspFragment) {
}
}
MyTag2
(2)在 WEB-INF 下新建自定義 tld 文件,可以參考 JSTL 本身一些標簽的的實現,如 c.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">
<display-name>solverpeng core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>solverpeng</short-name>
<uri>http://solverpeng.com/tags</uri>
<tag>
<name>showDate</name>
<tag-class>com.nucsoft.myservlet.tag.MyTag2</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
solverpeng core tag
(3)在頁面中導入自定義的標簽庫,然後使用。如:

![]()
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="http://solverpeng.com/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:showDate/>
</body>
</html>
tag.jsp
2.繼承 SimpleTagSupport。其中在 SimpleTagSupport 類中已經完成了對 JspTag、JspContext,JspFragment 的注入操作,可以直接使用。
3.需要注意的地方
在自定義標簽tld文件中,tag 節點裡的 body-content 節點內容有四個可選值,分別介紹一下:
(1)tagdependent:將標簽體的內容不經過任何修改和處理原封不動的交個標簽處理類
(2)empty:沒有任何標簽體
(3)scriptless:表示標簽體支持純文本、EL表達式、JSTL等標簽,不支持JSP腳本片段和JSP表達式
(4)JSP:在 SimpleTag 標簽體系下不可用
可以通過 jspContext 獲取到其他8大 JSP 隱含對象。
如果為帶屬性的自定義標簽,在目標處理類中通過提供 setXxx() 方法來獲取,在 tld 文件中,需要在 tag 元素中添加子節點 attribute 。
其中對 attribute 節點下的三個子節點進行說明:
(1)name:屬性名稱,和目標處理類中通過 setXxx() 方法定義的屬性名一致
(2)required:是否是必須輸入的
(3)rtexprvalue:是否支持 EL 表達式
如果需要對標簽體處理,需要在目標處理類中進行一系列的處理:
(1)在 doTag() 方法中通過 this.getJspBody() 可以獲取到 JspFragment 對象
(2)執行 JspFragment 對象的 invoke() 方法,若不需要對執行後的標簽體進行處理,而是直接輸出的話,invoke() 方法的參數傳入 null就 ok。
若是需要對執行後的標簽體進行處理,則需要傳入一個 Write 對象,在調用 invoke() 方法之後,然後對 Write 對象進行處理。如:

![]()
JspFragment jspBody = this.getJspBody();
StringWriter out = new StringWriter();
jspBody.invoke(out);
String content = out.toString();
String result = content.toUpperCase();
JspWriter writer = this.getJspContext().getOut();
writer.print(result);
View Code
二、自定義JSTL函數庫
1.定義函數處理類,要求類和方法必須為 public ,且方法必須為 static 。如:

![]()
/**
* @author solverpeng
* @create 2016-07-03-10:34
*/
public class MyFunction {
public static String hello() {
return new Date().toString();
}
}
MyFunction
2.在 WEB-INF 下新建自定義 tld 文件,可以參考 JSTL 本身一些標簽的的實現,如 c.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">
<display-name>solverpeng core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>solverpeng</short-name>
<uri>http://solverpeng.com/tags</uri>
<function>
<name>hello</name>
<function-class>com.nucsoft.myservlet.function.MyFunction</function-class>
<function-signature>java.lang.String hello()</function-signature>
</function>
</taglib>
solverpeng tag tld
3.在JSP頁面中導入自定義的函數庫,然後在頁面中使用,如:

![]()
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="http://solverpeng.com/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${s:hello()}
</body>
</html>
tag.jsp
三、JSTL中一個不常用的標簽 c:forTokens

![]()
<% pageContext.setAttribute("str", "aa,bb,ee,mm,tt"); %>
<c:forTokens items="${str }" delims="," var="item">
${item }
</c:forTokens>
c:forTokens