对于简单标识
我们必须实现 doStartTag和doEndStartTag 方法,其中:
doStartTag 必须返回SKIP_BODY这个常量,因为简单标识没有体
什么是有体呢?没体又是什么样子的呢?其实很简单:
例如:无体的样子就是
<c:switch />
有体的样子就是
<c:switch>body</c:switch>
下面我们来看一个例子:
1、<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/testTag.tld" prefix="tt" %>
//这里uri是我们放.tld文件的路径的地方,可以是相对路径也可以是绝对路径。tt是我们引用它给它起的名字(自己可以随便起),
<html>
<head>
<title>My JSP 'test.jsp' starting page</title>
</head>
<body>
<tt:switch value="Dark">
<tt:case value="light">
<P>This is light.</P>
</tt:case>
<tt:case value="Dark">
<P>This is Dark.</P>
</tt:case>
<tt:case value="dark">
<P>This is dark.</P>
</tt:case>
</tt:switch>
</body>
</html>
在这里我们的标识都是有体的。
对于有体的标识我们要实现doStartTag和doEndTag方法,返回时就和没体的不一样了。
doStartTag,肯能返回SKIP_BODY 这个常量(如果没有体),或着返回EVAL-BODY-INCLUDE,EVAL-BODY-BUFFERED(如果想使用体的内容)。
doEndTag,如果想要继续执行jsp页面其他部分,则返回EVAL-PAGE,否则返回SKIP_PAGE。
2、 下边是我们自己写的一个标签:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
//这是标签的头文件,所有的标签基本上都一样。
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>tagSample</short-name>
<uri>/tagSample</uri>
<description>A blank tag library template.</description>
上边是一些描述性文件
<tag>
<name>switch</name>
我们标签的名字
<tag-class>sample.SwitchTag</tag-class>
另外这个SwitchTag是个java文件,我把它放在了sample包里了。
<body-content>jsp</body-content>
标签在jsp页面上引用。
<attribute>
<name>value</name>
我们设置的value属性,上边才能引用。
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>case</name>
<tag-class>sample.CaseTag</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3、我们来看下我们要写的.java文件,这里我们要写一个SwitchTag.java,内容如下
package sample;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;
public class SwitchTag extends TagSupport{
String value;
public SwitchTag(){
super();
}
public void setValue(String value){
this.value=value;
}
public String getValue(){
return value;
}
public int doStartTag(){
return EVAL_BODY_INCLUDE;
//显然在1里标识是有体的,而且我们还想使用体内的内容,所以返回EVAL_BODY_INCLUDE。
}
}
另外我们需要写个CaseTag.java文件,内容如下:
package sample;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;
public class CaseTag extends TagSupport{
String value;
public int doStartTag() throws JspTagException{
SwitchTag parent=(SwitchTag)this.getParent();
//父类定义一个parent来接收子类的传过去的值
try{
if(parent.getValue().equals(getValue())){
如果子类传过去的值和父类的值相等,则返回
return EVAL_BODY_INCLUDE;(还想使用体内的内容)
}else{
return SKIP_BODY;
}
}catch(NullPointerException e){
return SKIP_BODY;
}
}
public void setValue(String value){
this.value=value;
}
public String getValue(){
return value;
}
}
4、结果:This is Dark.
写的肯能有些不太清楚,我也是新手刚学,有错误的地方还希望高手指点出来,谢谢!
顺便说下,这csdn网站的速度可真慢!!ai....................