JSP 自定标签

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" />

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值