JSP 自定标签
1.创建自定义标签处理类。
继承 javax.servlet.jsp.tagex.SimpleTagSupport 类 重写其中的doTag方法存在属性(成员变量)则需要加 setter getter 方法
2. 创建tld文件 即标签库 配置tld文件
3.使用标签
创建标签库
<?xml version="1.0" encoding="GBK"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version><!--标签库版本 意义不大 -->
<short-name>tw</short-name> <!--标签库名称 用作标签前缀 -->
<uri>http://www.crazyit.org/tw</uri> <!-- 标签库uri (唯一标识) 可以任意 -->
<tag>
........
</taglib>
<!-- *.tld 文件应该放在 Web 项目的 WEB-INF 目录下(服务器启动时候会自动加载) -->
JSP引用标签库
<!-- prefix 使用标签时候的前缀使用short-name 指定值即可 uri 标签库唯一标识 -->
<%@taglib prefix="tw" uri="http://www.crazyit.org/tw" %>
1.普通标签的使用:
标签处理类
/**
* 获取当前时间的自定义标签类
* @author lenovo
*
*/
public class Mytag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
System.out.println(new Date(System.currentTimeMillis()));
getJspContext().getOut().write("当前时间为 :" + new Date(System.currentTimeMillis()));
}
}
配置*.tld
<!--name:标签名 标签处理类 标签体 -->
<tag>
<name>currentTime</name>
<tag-class>com.wang.customtag.Mytag</tag-class>
<body-content>empty</body-content>
</tag>
使用标签
<!-- 普通 标签 -->
<tw:currentTime /></br>
2. 带属性 标签
标签处理类
/* 继承SimpleTagSupport 重写doTag方法 设置getter setter 方法*/
public class AttributeTag extends SimpleTagSupport {
private String name;
private int id;
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().write("name:" + name + "id:" + id);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
配置*.tld
<tag>
<name>student</name>
<tag-class>com.wang.customtag.AttributeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name> <!-- 属性名 -->
<required>true</required> <!-- 该属性 是否为必须属性-->
<fragment>true</fragment> <!-- 该属性 是否支持JS 等动态表达式-->
</attribute>
<attribute>
<name>id</name>
<required>false</required>
<fragment>true</fragment>
</attribute>
</tag>
使用标签
<!-- 带属性 标签 -->
<tw:student name ="张山" id="001" /></br>
<tw:student name ="张山" /></br>
<%
String str = "张山";
pageContext.setAttribute("str",str);
%>
<!-- 强烈建议标签搭配el表达式 使用jsp脚本会出县各种错误不建议使用 -->
<tw:student name ="${str}" /></br>
3. 带标签体 标签
标签处理类
public class IteratorTag extends SimpleTagSupport {
private String collection;
private String item;
public String getCollection() {
return collection;
}
public void setCollection(String collection) {
this.collection = collection;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
@Override
public void doTag() throws JspException, IOException {
//根据集合名称获取集合(范围为pageScope)
Collection C= (Collection)getJspContext().getAttribute(collection);
for(Object c: C){
//将属性item设置为C集合中的一个元素
getJspContext().setAttribute(item, c);
//将标签体内的内容输出来
getJspBody().invoke(null);
}
}
}
配置*.tld
<tag>
<name>iterator</name>
<tag-class>com.wang.customtag.IteratorTag</tag-class>
<body-content>scriptless</body-content><!-- scriptless 不允许使用JSP脚本 允许使用HTML JSP运行使用JSP脚本 -->
<attribute>
<name>collection</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>item</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
使用标签
<!-- 带标签体 标签 -->
<%
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
pageContext.setAttribute("list",list);
%>
<tw:iterator item="item" collection="list">
${pageScope.item}<p>
</tw:iterator>
4.输出页面片段标签
标签处理类
public class FragmentTag extends SimpleTagSupport{
//JspFragment代表 页面片段 对象
private JspFragment fragment;
public JspFragment getFragment() {
return fragment;
}
public void setFragment(JspFragment fragment) {
this.fragment = fragment;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.write("------开始-------</br>");
fragment.invoke(null); //执行页面片段
out.write("------结束-------</br>");
}
}
配置*.tld
<tag>
<name>fragment</name>
<tag-class>com.wang.customtag.FragmentTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>fragment</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
使用标签
<!-- jsp:attribute name属性:name的值就是标签的属性名称 (此注解不能放在标签内 否则会报错 因为标签内只能放JSP等其他) -->
<!-- 输出页面片段 -->
<tw:fragment>
<jsp:attribute name="fragment"><tw:currentTime/></br></jsp:attribute>
</tw:fragment>
5.输出动态内容 (动态增加属性并且指定属性值)
标签处理类
public class DynamicTag extends SimpleTagSupport implements DynamicAttributes {
private ArrayList<String> keys = new ArrayList<String>();
private ArrayList<Object> values = new ArrayList<Object>();
@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.write("<ol>");
for(int i = 0 ; i <keys.size() ; i++){
String k = keys.get(i);
Object v = values.get(i);
out.write("<li>"+ k + "=" + v + "</li>");
}
out.write("</ol>");
}
@Override
public void setDynamicAttribute(String arg0, String arg1, Object arg2)
throws JspException {
keys.add(arg1);
values.add(arg2);
}
}
配置*.tld
<tag>
<name>dynaAttr</name>
<tag-class>com.wang.customtag.DynamicTag</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes> <!-- 此属性指定使用动态标签 -->
</tag>
使用标签
<!-- 输出动态内容 (动态增加属性并且指定属性值)-->
<tw:dynaAttr 张三="zhangsan" 性别="男" 爱好="女" />
<tw:dynaAttr key = "value" />