自定义标签的应用


1、<c:if>功能的实现

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class SimpleTagIf extends SimpleTagSupport {
 
    private boolean condition;
 
    public void setCondition(boolean condition) {
       this.condition = condition;
    }
 
    @Override
    public void doTag() throws JspException, IOException {
       if(condition){
           JspFragment jf = this.getJspBody();
           jf.invoke(null);
       }
      
    }
 
}


 

2、<c:chooseTag>的实现

在Jsp界面中我们经常需要用到像java里的if else 的语句,由于Jsp界面中尽量不要添加java代码,所以我们需要定义能实现这样功能的标签,想让两个自定义标签共享同一个参数,需要给两个标签添加一个父标签。

 

import java.io.IOException;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class ChooseTag extends SimpleTagSupport {
   
    private boolean condition = false;
 
    public boolean isCondition() {
       return condition;
    }
 
    public void setCondition(boolean condition) {
       this.condition = condition;
    }
 
    @Override
    public void doTag() throws JspException, IOException {
       JspFragment jf = this.getJspBody();
       jf.invoke(null);
    }
   
}
 


import java.io.IOException;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class WhenTag extends SimpleTagSupport {
   
    private boolean condition;
 
    public void setCondition(boolean condition) {
       this.condition = condition;
    }
 
    @Override
    public void doTag() throws JspException, IOException {
       //获取父标签体
       ChooseTag parent = (ChooseTag) this.getParent();
       if(condition && !parent.isCondition()){
           this.getJspBody().invoke(null);
           parent.setCondition(true);
       }
    }
   
}
 


 

import java.io.IOException;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class OtherwiseTag extends SimpleTagSupport {
 
    @Override
    public void doTag() throws JspException, IOException {
       ChooseTag parent = (ChooseTag) this.getParent();
       if(!parent.isCondition()){
           this.getJspBody().invoke(null);
           parent.setCondition(true);
       }
    }
   
}


 

 

3、<c:foreach>标签的实现

此标签实现的功能:遍历各种集合或数组。

 

import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
 
import javax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.SimpleTagSupport;
 
public class ForEachTag extendsSimpleTagSupport {
 
       privateObject items;
       privateString var;
      
       publicvoid setItems(Object items) {
              this.items= items;
       }
 
       publicvoid setVar(String var) {
              this.var= var;
       }
 
       @Override
       publicvoid doTag() throws JspException, IOException {
              //Listlist = (List) items;
              //Iteratorit = list.iterator();
              Collectioncollection = null;
              if(itemsinstanceof Map){
                     Mapmap = (Map) items;
                     //把两列集合转换成单列的形式
                     collection= map.entrySet();
                    
              }elseif(items instanceof Collection){
                     collection= (Collection) items;
                    
              }/*elseif(items instanceof Object[]){
                     Object[]objs = (Object[]) items;
                     collection= Arrays.asList(objs);
                    
              }elseif(items instanceof int[]){
                     //由于数组类型特别多,所以换以下方式进行操作
              }*/
              elseif(items.getClass().isArray()){
                     collection= new ArrayList();
                     intlength = Array.getLength(items);
                     for(inti=0;i<length;i++){
                            collection.add(Array.get(items,i));
                     }
              }
             
              Iteratorit = collection.iterator();
              while(it.hasNext()){      
                     Objectobj = it.next();
                     this.getJspContext().setAttribute(var,obj);
                     this.getJspBody().invoke(null);
              }
       }
}


 

 

4、<c:switch>标签的实现

此标签实现的功能相当于 java中的switch功能,需注意的是switch为case和delault的父标签。

 

import java.io.IOException;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class SwitchTag extends SimpleTagSupport {
 
    private Object test;
    private boolean flag = true;
 
    public void setTest(Object test) {
       this.test = test;
    }
   
    public Object getTest() {
       return test;
    }
 
    public boolean isFlag() {
       return flag;
    }
 
    public void setFlag(boolean flag) {
       this.flag = flag;
    }
 
    @Override
    public void doTag() throws JspException, IOException {
       this.getJspBody().invoke(null);
    }
   
}
 


 

 

import java.io.IOException;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class CaseTag extends SimpleTagSupport {
 
    private Object test;
 
    public void setTest(Object test) {
       this.test = test;
    }
 
    @Override
    public void doTag() throws JspException, IOException {
       SwitchTag st = (SwitchTag) this.getParent();
       if(st.getTest().equals(test) && st.isFlag()){
           this.getJspBody().invoke(null);
           st.setFlag(false);
       }
    }
   
}


 

 

import java.io.IOException;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
 
public class DefaultTag extends SimpleTagSupport {
 
    @Override
    public void doTag() throws JspException, IOException {
       SwitchTag st = (SwitchTag) this.getParent();
       if(st.isFlag()){
           this.getJspBody().invoke(null);
           st.setFlag(false);
       }
    }
 
}


 

 

5、自定义标签的打包

由于我们实现的这些标签的功能也经常在其他Jsp中使用,所以我们需要把我们写的自定义标签打成一个.jar 的文件包,当在其他web程序中需要使用这些标签时,把.jar 的文件包导入到该程序即可。

打包内容:自定义标签处理器的.class 文件和 .tld 文件。 压缩 .class 文件时需要按包结构保留(例:com.csdn.dao   则需要从com 文件夹开始)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值