欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 自定义标签

程序员文章站 2022-06-09 12:49:33
...

1.自定义标签实现对遍历功能

ForEachTag.java

package com.geeksun.tag;

import java.io.IOException;
import java.util.Collection;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ForEachTag extends SimpleTagSupport
{
	private Collection<?> items;
	private String var;
	
	public void setItems(Collection<?> items)
	{
		this.items = items;
	}
	public void setVar(String var)
	{
		this.var = var;
	}
	@Override
	public void doTag() throws JspException, IOException
	{
		if(items != null)
		{
			for(Object obj:items)
			{
				getJspContext().setAttribute(var, obj);
				getJspBody().invoke(null);
			}
		}
	}
}

index.jsp

<%@page import="com.geeksun.one.Customer"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<%
		//模拟servlet操作
		List<Customer>  customers = new ArrayList<Customer>();
		customers.add(new Customer("1","1","1","1"));
		customers.add(new Customer("2","2","2","2"));
		customers.add(new Customer("3","3","3","3"));
		customers.add(new Customer("4","4","4","4"));
		customers.add(new Customer("5","5","5","5"));
		request.setAttribute("customers", customers);
	%>
	<Geeksun:forEach items="${requestScope.customers }" var="customer">
 	${customer.name },${customer.address },${customer.cardType },${customer.card }
	<br><br> 
 	</Geeksun:forEach>
</body>
</html>

2.利用带父标签的标签实现if else if else的功能
ChooseTag.java

package com.geeksun.tag2;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ChooseTag extends SimpleTagSupport
{
	private boolean flag = true;
	public void setFlag(boolean flag)
	{
		this.flag = flag;
	} 
	public boolean isFlag()
	{
		return flag;
	}
	@Override
	public void doTag() throws JspException, IOException
	{
		getJspBody().invoke(null);
	}
}

WhenTag.java

package com.geeksun.tag2;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class WhenTag extends SimpleTagSupport
{
	private boolean test;
	public void setTest(boolean test)
	{
		this.test = test;
	}
	@Override
	public void doTag() throws JspException, IOException
	{
		JspTag jspTag = getParent();
		ChooseTag parentTag = (ChooseTag)jspTag;
		if(parentTag.isFlag() == true&&test == true)
		{
			parentTag.setFlag(false);
			getJspBody().invoke(null);
		}
	}
}

OtherwiseTag.java

package com.geeksun.tag2;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class OtherwiseTag extends SimpleTagSupport
{
	private boolean test;
	public void setTest(boolean test)
	{
		this.test = test;
	}
	@Override
	public void doTag() throws JspException, IOException
	{
		JspTag jspTag = getParent();
		ChooseTag parentTag = (ChooseTag)jspTag;
		if(parentTag.isFlag() == true)
		{
			getJspBody().invoke(null);
		}
	}
}

TestTag.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://www.Geeksun.com/mytag/core/" prefix="Geeksun"%>
<!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>
    <Geeksun:Choose>
        <Geeksun:When test="${param.age > 22}">大学毕业</Geeksun:When>
        <Geeksun:When test="${param.age > 20}">高中毕业</Geeksun:When>
        <Geeksun:Otherwise>高中未毕业</Geeksun:Otherwise>
    </Geeksun:Choose>
</body>
</html>

mytag.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">

	<description>MyTag 1.1 core library</description>
	<display-name>MyTag core</display-name>
	<tlib-version>1.0</tlib-version>    
    <!--定义一个简短的名称,主要是给一些工具使用(必须元素)-->  
	<short-name>Geeksun</short-name>
    <!--定义此标签库的uri路径,用于唯一标识该数据库,便于页面的引用-->
	<uri>http://www.Geeksun.com/mytag/core/</uri>
    <!--此标签库中的一个标签处理器的声明--> 
	<tag>
        <!--该标签名称(必须元素)-->  
		<name>Choose</name>
        <!--该标签处理类的全限定名(必须元素)-->
		<tag-class>com.geeksun.tag2.ChooseTag</tag-class>
        <!--指明该标签主题类型)-->  
		<body-content>scriptless</body-content>
	</tag>
	<tag>
		<name>When</name>
		<tag-class>com.geeksun.tag2.WhenTag</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.geeksun.tag2.OtherwiseTag</tag-class>
		<body-content>scriptless</body-content>
	</tag>
	<tag>
		<name>forEach</name>
		<tag-class>com.geeksun.tag.ForEachTag</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>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>
  • <description><display-name>:作用与taglib的一样,可以有多个。
  • <name>:必选,标签名称。
  • <tag-class>:标签处理类。
  • <tei-class>:可选,javax.servlet.jsp.tagext.TagExtraInfo的继承类,用于校验tag的属性,确保使用的正确,<c:import><c:forEach>就有定义。
  • <body-content>:必选,有四个选项empty、scriptless、JSP、tagdependent,之后篇章介绍。
  • <variable>:可选,可定义多个,JSTL TLD中都没有使用,它是用来提供tag的结果的各种变量信息。什么是variable?我们通过pageContext.setAttribute/getAttribute设置或获取某个值,这就是变量。不通过variable,我们也可以通过EL来获取。如果提供了variable,我们除了EL外,还可以在java代码中使用这些变量。但现在都是采用MVC模式,JSP页面中java代码基本上也不会被使用。子参数依次包括:

    • <description>
    • <name-given> 变量的名字 。
    • <name-from-attribute> 决定变量名字,这和<name-given>相互冲突,只能二选一。String,不能是EL等在运行时计算 。
    • <variable-class> 变量的类型 。
    • <declare> true表示变量是新,需要声明;false表示已存在,只是修改值。
    • <scope> 缺省是NESTED,即在tag内有效;AT_BEGIN表示变量tag内及之后有效;AT_END表示变量只在tag后有效。
  • <attribute>:可选,可定义多个,定义Tag的属性。

    • <description>:可选。 <name>:属性名称。
    • <required:可选,属性是否必须true/false,缺省为false。
    • <rtexprvalue:可选,rtexprvalue是runtime expression value:true表示允许EL这类运行时计算值,false则不允许,缺省为false。
    • <type>:可选,属性类型,缺省为Object。