如何使用jsp自定义标签

 

对于简单标识

我们必须实现 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....................

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值