JavaWeb——自定义标签

7 篇文章 0 订阅
5 篇文章 0 订阅

自定义标签的步骤:

1.定义一个类,继承javax.servlet.jsp.tagext.SimpleTagSupport,重写doTag方法;
2.在web项目的WEB-INF目录下建立标签库的声明文件——.tld文件;
3.在jsp页面的头部导入自定义标签库;
4.在jsp中使用自定义标签。

例如:自定义一个标签显示当天日期。

package com.tag;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ShowDate extends SimpleTagSupport {
	
	@Override
	public void doTag() throws JspException, IOException {
		PageContext pageContext = (PageContext) getJspContext();
		String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		pageContext.getOut().write(date);
	}
}

myTag.tld:

<taglib 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 http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
  <tlib-version>1.1</tlib-version><!-- 标签库版本 -->
 <short-name>gjs</short-name><!-- 标签库前缀 -->
  <uri>http://gjs.widzl</uri><!-- tld文件的唯一标记 -->

  <tag>
    <name>showDate</name><!-- 标签名称 -->
    <tag-class>com.tag.ShowDate</tag-class><!-- 标签处理器类的全名 -->
    <body-content>scriptless</body-content><!-- 输出标签体内容格式 -->
  </tag>
 </taglib>
 <!--
 输出标签体内容格式
JSP:   在传统标签中使用的。可以写和执行jsp的java代码。
scriptless:  标签体不可以写jsp的java代码
empty:    必须是空标签。
tagdependent : 标签体内容可以写jsp的java代码,但不会执行。
 -->

tag.jsp:

头部导入自定义标签库:<%@taglib uri=“http://gjs.widzl” prefix=“gjs”%>
在页面使用标签(<标签库前缀:标签名称>)
在这里插入图片描述
在这里插入图片描述

自定义if标签

package com.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class IF extends SimpleTagSupport {
	private boolean test = true;

	public boolean isTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}
	@Override
	public void doTag() throws JspException, IOException {
		if(test) {
			getJspBody().invoke(null);
		}
	}
}
<tag>
 <name>if</name>
 <tag-class>com.tag.IF</tag-class>
 <body-content>scriptless</body-content>
    <attribute>
    	<name>test</name>
    	<required>false</required>
    	<rtexprvalue>true</rtexprvalue>
    </attribute>
 </tag>
<gjs:if test="${3>2 }">自定义if标签</gjs:if>

自定义choose、when、otherwise标签

package com.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class Choose extends SimpleTagSupport {
	private boolean flag;// 不是属性,而是临时变量
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	@Override
	public void doTag() throws JspException, IOException {
		this.getJspBody().invoke(null);// 输出标签体内容
	}
}
package com.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class When extends SimpleTagSupport {
	private boolean test;
	public void setTest(boolean test) {
		this.test = test;
	}
	@Override
	public void doTag() throws JspException, IOException {
		if(test)//根据test的返回值决定是否输出标签体内容
			this.getJspBody().invoke(null);
		Choose parent = (Choose)this.getParent();//获取父标签
		parent.setFlag(test);
	}
}
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class Otherwise extends SimpleTagSupport {
	@Override
	public void doTag() throws JspException, IOException {
		//通过父标签传递,when标签中test的值
		Choose parent = (Choose)this.getParent();//获取父标签
		boolean test = parent.isFlag();
		if(!test){
			this.getJspBody().invoke(null);
		}
	}
}
<tag>
    <name>choose</name>
    <tag-class>com.tag.Choose</tag-class>
    <body-content>scriptless</body-content>
  </tag>
  
  <tag>
    <name>when</name>
    <tag-class>com.tag.When</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
    	<name>test</name>
    	<required>true</required>
    	<rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  
  <tag>
    <name>otherwise</name>
    <tag-class>com.tag.Otherwise</tag-class>
    <body-content>scriptless</body-content>
  </tag>

使用:

<gjs:choose>
     <gjs:when test="${10<5 }">10小于5</gjs:when>
     <gjs:otherwise>10大于等于5</gjs:otherwise>
</gjs:choose>

自定义foreach标签

package com.tag;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ForEach extends SimpleTagSupport {
	
	private Object items;//需要遍历的数据.List或map
	private String var;//每个元素的名称
	
	public Object getItems() {
		return items;
	}
	public void setItems(Object items) {
		this.items = items;
	}
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}

	public void doTag() throws JspException, IOException {
		PageContext pageContext = (PageContext) getJspContext();
		if(items instanceof String) {//遍历字符串
			String str = (String)items;
			for(int i=0;i<str.length();i++) {
				pageContext.setAttribute(var, str.charAt(i));//把每个对象放入域对象中(pageContext)
				getJspBody().invoke(null);//显示标签体内容
			}
			return ;
		}

		Collection col = null;
		if(items instanceof List) {
			col = (List)items;
		}else if(items instanceof Map) {
			Map map = (Map)items;
			col = map.entrySet();
		}
		if (col!=null) {
			for (Object obj : col) {
				pageContext.setAttribute(var, obj);
				this.getJspBody().invoke(null);
			} 
		}
	}
}
<tag>
    <name>forEach</name>
    <tag-class>com.tag.ForEach</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
    	<name>items</name>
    	<required>true</required>
    	<rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
    	<name>var</name>
    	<required>true</required>
    	<rtexprvalue>false</rtexprvalue>
    </attribute>
 </tag>
<%
  String arr[] = {"a","b","c","d"};
  String s = "1-2-3-4-5-6";
  pageContext.setAttribute("str", arr);
  pageContext.setAttribute("ssss", s);
  
    List<Student>  list = new ArrayList<Student>();
	list.add(new Student("rose",18));
	list.add(new Student("jack",28));
	list.add(new Student("lucy",38));
	pageContext.setAttribute("list",list);//放入域中
	
	Map<String,Student> map = new HashMap<String,Student>();
 	map.put("100",new Student("mark",20));
 	map.put("101",new Student("maxwell",30));
 	map.put("102",new Student("narci",40));
 	pageContext.setAttribute("map",map);
  %>
  
   
   自定义foreach:<br>
  <gjs:forEach items="${s }" var="s2">
    <c:out value="${s2 }"></c:out>
   </gjs:forEach> <hr><br>
    <gjs:forEach items="${list}" var="student">
     		姓名:${student.name } - 年龄:${student.age }<br/>
     </gjs:forEach>
     
     <hr/>
     
     <gjs:forEach items="${map}" var="entry">
     	  编号:${entry.key} - 姓名:${entry.value.name} - :${entry.value.age }<br/>
     </gjs:forEach>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值