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

java自定义标签的开发步骤

程序员文章站 2022-06-08 22:22:50
...

 在jsp页面记录访问者的IP,可使用如下java代码:

 

<%
String ip = request.getRemoteAddr();
out.print(ip);
%>

 自定义标签的作用就是把jsp上的java代码移植到java文件中。

 

步骤:

1.写一个类来实现上述java代码,这个类要实现Tag接口,通常我们继承tagSupport这个类,

这个接口里有doStartTag().doEndtag(),setPageContext()等方法,当tomcat编译jsp页面开始一个标签时就执行doStartTag中的方法,setPageContext()在这之前把jsp上的page传递给“标签处理器类”了,也就意味我们可以获得request等对象了。

 

2.对于自定义标签我们需要一个描述标签意义的文件,这个文件是放在WEB-INF下的tld文件。

文件中有<Tag>的描述,需要设置相应的标签处理器类和uri-----以便在jsp页面导入。

 

3.在jsp页面使用taglib引入我们的uri,并指定prefix(通常和tld的文件名相同)。

 

4.在jsp页面使用我们开发的标签<pp:showIP/>

 

 

 

二。开发if。。。else自定义标签

 

首先思考,当jsp页面的if执行了,那么就要通知else这个java类不要执行,因此他们要有个共同的变量来标识,从而需要使用一个父标签来控制这个变量。这就类似与jstl中的

 

<c:choose>
	<c:when test="${user != null}">
		aaaaaaaaaa
	</c:when>
	<c:otherwise>
		bbbbbbbbbbb
	</c:otherwise>
</c:choose>
 

 

1.创建3个类ChooseTag,WhenTag,OtherwiseTag。

ChooseTag:中的isDao用来标识when标签和otherwise标签是否执行了,如果其中任何一个执行了,另外一个就不需要执行了。为了控制when和otherwise,需要doTag,调用getJspBody().invoke(null);

 

 

private boolean isDo;

	public boolean isDo() {
		return isDo;
	}

	public void setDo(boolean isDo) {
		this.isDo = isDo;
	}

	@Override
	public void doTag() throws JspException, IOException {
		this.getJspBody().invoke(null);
	}

 

 

 WhenTag:有一个test变量,是boolean型的,when执行前要判断其父标签的isDo是否为true,不为true且test变量为true时才执行。this.getParent()可以获取父标签,需要强制转换成ChooseTag。

 

when执行了后,要把isDo设置为true。

 

private boolean test;

	public void setTest(boolean test) {
		this.test = test;
	}

	@Override
	public void doTag() throws JspException, IOException {
		ChooseTag parent = (ChooseTag) this.getParent();
		if(test && !parent.isDo()){
			this.getJspBody().invoke(null);
			parent.setDo(true);
		}
	}

  OtherwiseTag:

 

 

@Override
	public void doTag() throws JspException, IOException {
		ChooseTag parent = (ChooseTag) this.getParent();
		if(!parent.isDo()){
			this.getJspBody().invoke(null);
			parent.setDo(true);
		}
	}
 

 

2.在WEB-INF下建luo.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>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>http://baidu.com</uri>
    
    <tag>
        <name>choose</name>
        <tag-class>com.luo.web.tag.ChooseTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>
    <tag>
        <name>when</name>
        <tag-class>com.luo.web.tag.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.luo.web.tag.OtherwiseTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>
</taglib>

 其中<body-content>scriptless</body-content>的scriptless包括JSP,表示有标签体,when标签还有个属性test。

3.在jsp最上面引入luo.tld

 

<%@taglib uri="http://baidu.com" prefix="c"%>

uri也可以表示成/WEB-INF/luo.tld 

 

三、打包

1、新建普通java工程,把刚才写的几个tag类连同包一起copy过来,然后再建立META-INF文件夹,把luo.tld copy进去,报错不用管

 

 

2、将工程导出jar格式,其中的.project文件和.classpath不用导