JSP自定義標籤開發+TLD檔案元素詳解
標 籤
<taglib>
<tlib-version>
<jsp-version>
<short-name>
<description>
<display-name>
<icon>
<uri> TLD檔案的根元素 此標籤庫的版本 此標籤庫依賴的JSP版本。 當在JSP中使用標籤時,此標籤庫首選或者建議的字首。當然可以完全忽略這個建議 描述資訊 圖形工具可顯示的一個簡短名稱 圖形工具可顯示的圖示 指定使用該標籤庫中標籤的URI 含 義
<validator>
<listener>
<function>
<tag> 關於該庫的TagLibraryValidator資訊 指定事件監聽器類 定義一個在EL中使用的函式 定義一個標籤
標 籤
<description>
<display-name>
<icon>
<name>
<tag-class>
<tei-class>
<body-content>
<variable>
<example>
<attribute> 指定針對標籤的資訊 含 義 開發工具用於顯示的一個簡短名稱 可被開發工具使用的圖示 標籤名稱 Java標籤處理器類的名稱。注意這是處理器類的全限定名稱,比如com.xx.tag.TableTag Javax.servlet.jsp.tagext.TagExtraInfo類的一個可選子類 此標籤的主體部分的內容。其值可為scriptless\tagdependent\empty,預設為empty 定義指令碼變數資訊 使用該標籤例子的可選的非正式描述 包含了此標籤的一個屬性的後設資料
標 籤
<description>
<name>
<required>
<rtexprvalue>
<type> 有關描述的文字資訊 含 義 在jsp標籤中使用的屬性名稱 指定屬性是必須的還是可選的,預設為false,表示屬性可選。如果該值為true,則jsp頁面必須為該屬性提供一個值。可能的值true、false、yes、no 指定屬性是否能接受請求時表示式的值,預設為false,表示不能接受請求時表示式的值。可能值:true、false、yes、no 屬性的資料型別,該元素只能用在當<rtexprvalue>設定為true時。它指定當使用請求時屬性表示式(<%= %>)
返回型別。預設string
例項(繼承SimpleTagSupport類方式):
編寫一個DateTag標籤,輸出系統時間。<c1:date/>,輸出的格式:2011年11月9日
step1: 寫一個java類,繼承SimpleTagSupport類
step2: override doTag()方法,在該方法裡,實現相應的處理邏輯 package mytag;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class DateTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
");
out.println(sdf.format(new Date())); PageContext ctx = (PageContext)getJspContext(); JspWriter out = ctx.getOut(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日
}
step3: 在.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">
<tlib-version>1.1</tlib-version>
<short-name>c1</short-name>
<uri>http://www.tarena.com.cn/mytag1</uri>
<tag>
<name>date</name> <tag-class>mytag.DateTag</tag-class> <body-content>empty</body-content>
</tag>
</taglib>
step4: 使用taglib匯入標籤(jsp中)
<%@taglib prefix="c1" uri="http://www.tarena.com.cn/mytag1" %> <c1:date/>
1.在WEB-INF/tags/select.tag
<%@ tag body-content="empty" %>
<%@ tag dynamic-attributes="tagAttrs" %>
<%@ attribute name="optionsList" type="java.util.List" required="true" rtexprvalue="true"%>
<%@ attribute name="name" required="true"%>
<%@ attribute name="size" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<select name="${name }" size="${size }"
<c:forEach var="attrEntry" items="${tagAttrs }">
${attrEntry.key}="${attrEntry.value }"
</c:forEach>
>
<c:forEach var="option" items="${optionsList}">
<option value="${option }">${option}</option>
</c:forEach>
</select>
這裡要注意tag檔案只能放在如下位置:
1.WEB-INF/tags
2.WEB-INF/tags的子目錄
3.WEB-INF/lib中jar包的META-INF/tags
4.WEB-INF/lib中jar包的META-INF/tags下的子目錄
5.jar包中的tag檔案需要tld
新增jstl.jar與standard.jar到WEB-INF/lib目錄,還有一點就是上面標紅的部分:不要使用http://java.sun.com/jstl/core這個url,否則會報foreach中的item屬性有問題
2.在jsp中的使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="formTag" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<String> colorList = new ArrayList<String>();
colorList.add("red");
colorList.add("blue");
colorList.add("white");
request.setAttribute("colorList",colorList);
%>
<form action="" method="post">
<formTag:select name="color" size="1" optionsList="${requestScope.colorList}" style="width:140px"/>
</form>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
jsp 自定義標籤
jsp標籤有兩組api
JspTag ->SimpleTag ->SimpleTagSupport
JspTag ->Tag ->IterationTag->BodyTag
第二組是classic的,比較早的使用方式,doStartTag(),doEndTag()有N多返回值的那種,使用起來也確實不方便,今天學到了另一個使用第一組api方式的,讓人大快人心,貼碼
例子是一個Select的標籤,支援動態屬性設定
1.編寫標籤類
public class SelectTagHandler extends SimpleTagSupport implements DynamicAttributes {
private static final String ATTR_TEMPLATE = "%s='%s'";
private static final String OPTION_TEMPLATE = "<option value='%1$s'>%1$s</option>";
private List optionsList;
private String name;
private String size;
private Map<String, Object> tagAttrs = new HashMap<String, Object>();
public void setName(String name) {
this.name = name;
}
public void setSize(String size) {
this.size = size;
}
public void setOptionsList(List optionsList) {
this.optionsList = optionsList;
}
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) getJspContext();
JspWriter out = pageContext.getOut();
out.print("<select ");
out.print(String.format(ATTR_TEMPLATE, "name", this.name));
out.print(String.format(ATTR_TEMPLATE, "size", this.size));
for (String attrName : tagAttrs.keySet()) {
String attrDefinition = String.format(ATTR_TEMPLATE, attrName, tagAttrs.get(attrName));
out.print(attrDefinition);
}
out.print(">");
for (Object option : this.optionsList) {
String optionTag = String.format(OPTION_TEMPLATE, option.toString());
out.println(optionTag);
}
out.println("</select>");
}
@Override
public void setDynamicAttribute(String uri, String name, Object value) throws JspException {
tagAttrs.put(name, value);
}
}
看到沒,程式碼如此的簡潔,動態屬性配置也十分的方便,不用寫N多個setter與getter方法.
2.編寫tld檔案WebRoot/tld/select.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3g.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Forms Taglib</short-name>
<uri>http://hi.baidu.com/tags/forms</uri>
<description>
An example tab library of replacements for the html form tags.
</description>
<tag>
<name>select</name>
<tag-class>com.baidu.hi.tag.SelectTagHandler</tag-class>
<body-content>empty</body-content>
<attribute>
<name>optionsList</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.util.List</type>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>size</name>
<required>true</required>
</attribute>
<dynamic-attributes>true</dynamic-attributes>
</tag>
</taglib>
3.在jsp中的使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="formTags" uri="/tld/select.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.ArrayList"%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<String> colorList = new ArrayList<String>();
colorList.add("red");
colorList.add("blue");
colorList.add("white");
request.setAttribute("colorList",colorList);
%>
<form action="" method="post">
<formTags:select name="color" size="1" optionsList="${requestScope.colorList}" style="width:140px"/>
</form>
</body>
</html>
需要做三件事:
一、編寫標籤處理器(java檔案)
二、在標籤庫描述符檔案中描述該標籤 (TLD檔案)
三、在jsp檔案中引用該標籤
具體步驟:
step1:編寫一個擴充套件SimpleTagSupport的類
package foo;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//mort import...
public class SimpleTagTest1 extands SimpleTagSupport{
//這裡放標記處理程式碼
}
step2: 實現doTag()方法
public void doTag() throws JspException, IOException {
//在response中列印 "This is xxxxxx"
getJspContext().getOut().print("This is xxxxxx");
}
step3: 為標記建立一個TLD (taglib description, 標籤庫描述符)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<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/jsee/web-jsptagLibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<uri>simpleTags</uri>
<tag>
<name>simple1</name>
<description>xxxxxxxx</description>
<tag-class>foo.SimpleTagTest1</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
step4: 部署標記處理器和TLD
把TLD檔案放在WEB-INF下,並把標記處理器放在WEB-INF/classes下,這裡當然還要遵循包目錄結構。換句話說,標記處理器類要與所有其他web應用Java類放在同一個位置上。
step5: 編寫一個使用標記的JSP
<%@ taglib prefix="myTags" uri="simpleTags" %>
<html>
<body>
<myTags:simple1 %>
</body>
</html>
uri中的名稱要與TLD檔案中的uri的名稱一致。
至此,就建立了一個簡單的自定義標籤。
自定義標籤還有幾種常見的情況,分別為:
一、有體的標記 (如,<x:label>...</x:label>,"..."為標籤的body)
二、標記體中使用了表示式 (如,<x:label> ${movie} </x:label>, "${movie}"為標籤的體中出現的EL表示式)
三、迴圈執行標籤體
四、含有屬性的簡單標籤 (如,<x:label movie="${movie}" />)
以下,將分別介紹這幾種情況:
情況一:編寫的是有體(body)的標記,如:
<myTags:simple2>
This is the body //這個就是標記的body
</myTags:simple2>
那麼在這種情況下,為了執行body內的語句就需要加入這樣一句話到doTag()方法中:
getJspBody().invoke(null);
invoke的意思是“處理標記的body,並把它列印到響應(response)中”。
null的意思是把內容輸出到響應(response),而不是輸出到什麼別的書寫器(Writer)上。
除此以外,TLD中的 “<body-content>empty</body-content>” 一欄也需要改動,要改為:
<body-content>scriptless</body-content>
之後會介紹四種不同的body-content的引數。
情況二、如果標記體使用了表示式,如:
<myTags:simple3>
Message is : ${message}
</myTags:simple3>
那麼這個表示式的賦值需要在標籤處理器的doTag()中完成,如:
getJspContext().setAttribute("message","wear sunscreen");
getJspBody().invoke(null);//一定要記得寫這句,否則標籤體不會執行
情況三、若想要迴圈輸出一個集合的資料,應該如何實現?如:
<table>
<myTags:simple3>
<tr><td>${movie}</td></tr>
</myTags:simple3>
</table>
顯然,希望通過迴圈輸出不同的movie來形成 一個表格。那麼標記處理器的doTag()方法應該改為:
String[] movies = {"Monsoon Wedding", "Saved!", ".. ..."};
public void doTag() throws JspException, IOException {
for(int i = 0; i < movies.length; i++){
getJspContext().setAttribute("movie",movies[i]);
getJspBody().invoke(null);//每次invoke,都會執行一次標籤body
}
}
情況四、如果這個簡單標記是有屬性的,怎麼辦?如:
<table>
<myTags:simple5 movieList="${movieCollection}">
<tr>
<td>${movie.name}</td>
<td>${movie.genre}</td>
</tr>
</myTags:simple5>
</table>
由於標記中出現了屬性,所以TLD中的描述必須反映這一情況,因此TLD應調整為:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<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/jsee/web-jsptagLibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<uri>simpleTags</uri>
<tag>
<name>simple1</name>
<description>xxxxxxxx</description>
<tag-class>foo.SimpleTagTest1</tag-class>
<body-content>empty</body-content>
<attribute>
<name>movieList</name>
<required>true</required><!-- 說明movieList屬性是必需的 -->
<rtexprvalue>true</rtexprvalue><!-- 說明movieList屬性可以是一個執行時表示式(不用非得是一個常量String) -->
</attribute>
</tag>
</taglib>
另外,在標記處理器類中,也要對這一屬性有相應的體現:
public class SimpleTagTest5 extends SimpleTagSupport{
private List movieList;
public void setMovieList(List movieList){
this.movieList = movieList;
}
public void doTag() ....
}
補充:
<body-content></body-content>中可以寫入的引數有四種:
① empty
即標記體為空
② scriptless
這個標記不能有指令碼元素,但可以有模板文字和EL, 還可以是定製和標準動作
③ tagdependent
標記體要看做是純文字,所以不會計算EL,也不會出發標記/動作
④ JSP
能放在JSP中的東西都能放在這個標記體中
<taglib>
<tlib-version>
<jsp-version>
<short-name>
<description>
<display-name>
<icon>
<uri> TLD檔案的根元素 此標籤庫的版本 此標籤庫依賴的JSP版本。 當在JSP中使用標籤時,此標籤庫首選或者建議的字首。當然可以完全忽略這個建議 描述資訊 圖形工具可顯示的一個簡短名稱 圖形工具可顯示的圖示 指定使用該標籤庫中標籤的URI 含 義
<validator>
<listener>
<function>
<tag> 關於該庫的TagLibraryValidator資訊 指定事件監聽器類 定義一個在EL中使用的函式 定義一個標籤
標 籤
<description>
<display-name>
<icon>
<name>
<tag-class>
<tei-class>
<body-content>
<variable>
<example>
<attribute> 指定針對標籤的資訊 含 義 開發工具用於顯示的一個簡短名稱 可被開發工具使用的圖示 標籤名稱 Java標籤處理器類的名稱。注意這是處理器類的全限定名稱,比如com.xx.tag.TableTag Javax.servlet.jsp.tagext.TagExtraInfo類的一個可選子類 此標籤的主體部分的內容。其值可為scriptless\tagdependent\empty,預設為empty 定義指令碼變數資訊 使用該標籤例子的可選的非正式描述 包含了此標籤的一個屬性的後設資料
標 籤
<description>
<name>
<required>
<rtexprvalue>
<type> 有關描述的文字資訊 含 義 在jsp標籤中使用的屬性名稱 指定屬性是必須的還是可選的,預設為false,表示屬性可選。如果該值為true,則jsp頁面必須為該屬性提供一個值。可能的值true、false、yes、no 指定屬性是否能接受請求時表示式的值,預設為false,表示不能接受請求時表示式的值。可能值:true、false、yes、no 屬性的資料型別,該元素只能用在當<rtexprvalue>設定為true時。它指定當使用請求時屬性表示式(<%= %>)
返回型別。預設string
例項(繼承SimpleTagSupport類方式):
編寫一個DateTag標籤,輸出系統時間。<c1:date/>,輸出的格式:2011年11月9日
step1: 寫一個java類,繼承SimpleTagSupport類
step2: override doTag()方法,在該方法裡,實現相應的處理邏輯 package mytag;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class DateTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
");
out.println(sdf.format(new Date())); PageContext ctx = (PageContext)getJspContext(); JspWriter out = ctx.getOut(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日
}
step3: 在.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">
<tlib-version>1.1</tlib-version>
<short-name>c1</short-name>
<uri>http://www.tarena.com.cn/mytag1</uri>
<tag>
<name>date</name> <tag-class>mytag.DateTag</tag-class> <body-content>empty</body-content>
</tag>
</taglib>
step4: 使用taglib匯入標籤(jsp中)
<%@taglib prefix="c1" uri="http://www.tarena.com.cn/mytag1" %> <c1:date/>
1.在WEB-INF/tags/select.tag
<%@ tag body-content="empty" %>
<%@ tag dynamic-attributes="tagAttrs" %>
<%@ attribute name="optionsList" type="java.util.List" required="true" rtexprvalue="true"%>
<%@ attribute name="name" required="true"%>
<%@ attribute name="size" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<select name="${name }" size="${size }"
<c:forEach var="attrEntry" items="${tagAttrs }">
${attrEntry.key}="${attrEntry.value }"
</c:forEach>
>
<c:forEach var="option" items="${optionsList}">
<option value="${option }">${option}</option>
</c:forEach>
</select>
這裡要注意tag檔案只能放在如下位置:
1.WEB-INF/tags
2.WEB-INF/tags的子目錄
3.WEB-INF/lib中jar包的META-INF/tags
4.WEB-INF/lib中jar包的META-INF/tags下的子目錄
5.jar包中的tag檔案需要tld
新增jstl.jar與standard.jar到WEB-INF/lib目錄,還有一點就是上面標紅的部分:不要使用http://java.sun.com/jstl/core這個url,否則會報foreach中的item屬性有問題
2.在jsp中的使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="formTag" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<String> colorList = new ArrayList<String>();
colorList.add("red");
colorList.add("blue");
colorList.add("white");
request.setAttribute("colorList",colorList);
%>
<form action="" method="post">
<formTag:select name="color" size="1" optionsList="${requestScope.colorList}" style="width:140px"/>
</form>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
jsp 自定義標籤
jsp標籤有兩組api
JspTag ->SimpleTag ->SimpleTagSupport
JspTag ->Tag ->IterationTag->BodyTag
第二組是classic的,比較早的使用方式,doStartTag(),doEndTag()有N多返回值的那種,使用起來也確實不方便,今天學到了另一個使用第一組api方式的,讓人大快人心,貼碼
例子是一個Select的標籤,支援動態屬性設定
1.編寫標籤類
public class SelectTagHandler extends SimpleTagSupport implements DynamicAttributes {
private static final String ATTR_TEMPLATE = "%s='%s'";
private static final String OPTION_TEMPLATE = "<option value='%1$s'>%1$s</option>";
private List optionsList;
private String name;
private String size;
private Map<String, Object> tagAttrs = new HashMap<String, Object>();
public void setName(String name) {
this.name = name;
}
public void setSize(String size) {
this.size = size;
}
public void setOptionsList(List optionsList) {
this.optionsList = optionsList;
}
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) getJspContext();
JspWriter out = pageContext.getOut();
out.print("<select ");
out.print(String.format(ATTR_TEMPLATE, "name", this.name));
out.print(String.format(ATTR_TEMPLATE, "size", this.size));
for (String attrName : tagAttrs.keySet()) {
String attrDefinition = String.format(ATTR_TEMPLATE, attrName, tagAttrs.get(attrName));
out.print(attrDefinition);
}
out.print(">");
for (Object option : this.optionsList) {
String optionTag = String.format(OPTION_TEMPLATE, option.toString());
out.println(optionTag);
}
out.println("</select>");
}
@Override
public void setDynamicAttribute(String uri, String name, Object value) throws JspException {
tagAttrs.put(name, value);
}
}
看到沒,程式碼如此的簡潔,動態屬性配置也十分的方便,不用寫N多個setter與getter方法.
2.編寫tld檔案WebRoot/tld/select.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3g.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Forms Taglib</short-name>
<uri>http://hi.baidu.com/tags/forms</uri>
<description>
An example tab library of replacements for the html form tags.
</description>
<tag>
<name>select</name>
<tag-class>com.baidu.hi.tag.SelectTagHandler</tag-class>
<body-content>empty</body-content>
<attribute>
<name>optionsList</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.util.List</type>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>size</name>
<required>true</required>
</attribute>
<dynamic-attributes>true</dynamic-attributes>
</tag>
</taglib>
3.在jsp中的使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="formTags" uri="/tld/select.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.ArrayList"%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<String> colorList = new ArrayList<String>();
colorList.add("red");
colorList.add("blue");
colorList.add("white");
request.setAttribute("colorList",colorList);
%>
<form action="" method="post">
<formTags:select name="color" size="1" optionsList="${requestScope.colorList}" style="width:140px"/>
</form>
</body>
</html>
需要做三件事:
一、編寫標籤處理器(java檔案)
二、在標籤庫描述符檔案中描述該標籤 (TLD檔案)
三、在jsp檔案中引用該標籤
具體步驟:
step1:編寫一個擴充套件SimpleTagSupport的類
package foo;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//mort import...
public class SimpleTagTest1 extands SimpleTagSupport{
//這裡放標記處理程式碼
}
step2: 實現doTag()方法
public void doTag() throws JspException, IOException {
//在response中列印 "This is xxxxxx"
getJspContext().getOut().print("This is xxxxxx");
}
step3: 為標記建立一個TLD (taglib description, 標籤庫描述符)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<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/jsee/web-jsptagLibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<uri>simpleTags</uri>
<tag>
<name>simple1</name>
<description>xxxxxxxx</description>
<tag-class>foo.SimpleTagTest1</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
step4: 部署標記處理器和TLD
把TLD檔案放在WEB-INF下,並把標記處理器放在WEB-INF/classes下,這裡當然還要遵循包目錄結構。換句話說,標記處理器類要與所有其他web應用Java類放在同一個位置上。
step5: 編寫一個使用標記的JSP
<%@ taglib prefix="myTags" uri="simpleTags" %>
<html>
<body>
<myTags:simple1 %>
</body>
</html>
uri中的名稱要與TLD檔案中的uri的名稱一致。
至此,就建立了一個簡單的自定義標籤。
自定義標籤還有幾種常見的情況,分別為:
一、有體的標記 (如,<x:label>...</x:label>,"..."為標籤的body)
二、標記體中使用了表示式 (如,<x:label> ${movie} </x:label>, "${movie}"為標籤的體中出現的EL表示式)
三、迴圈執行標籤體
四、含有屬性的簡單標籤 (如,<x:label movie="${movie}" />)
以下,將分別介紹這幾種情況:
情況一:編寫的是有體(body)的標記,如:
<myTags:simple2>
This is the body //這個就是標記的body
</myTags:simple2>
那麼在這種情況下,為了執行body內的語句就需要加入這樣一句話到doTag()方法中:
getJspBody().invoke(null);
invoke的意思是“處理標記的body,並把它列印到響應(response)中”。
null的意思是把內容輸出到響應(response),而不是輸出到什麼別的書寫器(Writer)上。
除此以外,TLD中的 “<body-content>empty</body-content>” 一欄也需要改動,要改為:
<body-content>scriptless</body-content>
之後會介紹四種不同的body-content的引數。
情況二、如果標記體使用了表示式,如:
<myTags:simple3>
Message is : ${message}
</myTags:simple3>
那麼這個表示式的賦值需要在標籤處理器的doTag()中完成,如:
getJspContext().setAttribute("message","wear sunscreen");
getJspBody().invoke(null);//一定要記得寫這句,否則標籤體不會執行
情況三、若想要迴圈輸出一個集合的資料,應該如何實現?如:
<table>
<myTags:simple3>
<tr><td>${movie}</td></tr>
</myTags:simple3>
</table>
顯然,希望通過迴圈輸出不同的movie來形成 一個表格。那麼標記處理器的doTag()方法應該改為:
String[] movies = {"Monsoon Wedding", "Saved!", ".. ..."};
public void doTag() throws JspException, IOException {
for(int i = 0; i < movies.length; i++){
getJspContext().setAttribute("movie",movies[i]);
getJspBody().invoke(null);//每次invoke,都會執行一次標籤body
}
}
情況四、如果這個簡單標記是有屬性的,怎麼辦?如:
<table>
<myTags:simple5 movieList="${movieCollection}">
<tr>
<td>${movie.name}</td>
<td>${movie.genre}</td>
</tr>
</myTags:simple5>
</table>
由於標記中出現了屬性,所以TLD中的描述必須反映這一情況,因此TLD應調整為:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<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/jsee/web-jsptagLibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<uri>simpleTags</uri>
<tag>
<name>simple1</name>
<description>xxxxxxxx</description>
<tag-class>foo.SimpleTagTest1</tag-class>
<body-content>empty</body-content>
<attribute>
<name>movieList</name>
<required>true</required><!-- 說明movieList屬性是必需的 -->
<rtexprvalue>true</rtexprvalue><!-- 說明movieList屬性可以是一個執行時表示式(不用非得是一個常量String) -->
</attribute>
</tag>
</taglib>
另外,在標記處理器類中,也要對這一屬性有相應的體現:
public class SimpleTagTest5 extends SimpleTagSupport{
private List movieList;
public void setMovieList(List movieList){
this.movieList = movieList;
}
public void doTag() ....
}
補充:
<body-content></body-content>中可以寫入的引數有四種:
① empty
即標記體為空
② scriptless
這個標記不能有指令碼元素,但可以有模板文字和EL, 還可以是定製和標準動作
③ tagdependent
標記體要看做是純文字,所以不會計算EL,也不會出發標記/動作
④ JSP
能放在JSP中的東西都能放在這個標記體中
相關文章
- 使用自定義tld標籤簡化jsp的繁瑣操作JS
- 自定義分頁標籤詳解
- JSP 自定義標籤介紹JS
- JSP自定義標籤之三:為標籤新增屬性JS
- JSP自定義標籤就是如此簡單JS
- jsp如何自定義tag的標籤庫?JS
- JSP自定義標籤系列---rtexprvalue屬性JS
- JSP第六篇【自定義標籤之傳統標籤】JS
- 實戰練習之Jsp自定義標籤JS
- jsp自定義標籤系列之---用法實力JS
- tld自定義標籤系列--使用body-content的作用--比較有用
- JSP中的TAG檔案和TLD檔案JS
- JSP簡單標籤標籤庫開發JS
- jsp的三種自定義標籤 寫法示例JS
- 自定義標籤【迭代標籤】薦
- 製作tld檔案及應用詳解
- 自定義標籤FlowTagLayout
- ThinkPHP自定義標籤PHP
- java自定義標籤Java
- spring 自定義標籤Spring
- 建立自定義標籤庫
- jQuery Mobile 自定義標籤jQuery
- 死磕Spring之IoC篇 - 解析自定義標籤(XML 檔案)SpringXML
- FusionChartsFree的JSP標籤開發薦JS
- ViewPager之標籤的自定義Viewpager
- 關於自定義標籤庫
- 有關自定義標籤庫
- 怎麼用 Solon 開發基於 undertow jsp tld 的專案?JS
- 深入淺出自定義標籤(三)操作標籤體薦
- 08.Django自定義模板,自定義標籤和自定義過濾器Django過濾器
- 【14】vue.js — 自定義標籤Vue.js
- spring2自定義標籤Spring
- 自定義標籤出現問題
- jsp中c標籤的詳細使用JS
- Maven專案中POM.xml檔案內的標籤大全詳解MavenXML
- input 標籤詳解
- img標籤詳解
- ANT標籤詳解