标签开案例

•开发防盗链标签:  (控制整个jsp页面是否执行)
 
package cn.gbx.web.example;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import javax.xml.ws.RespectBinding;

public class RefererTag extends SimpleTagSupport {
	private String site;
	private String page;
	
	public void setSite(String site) {
		this.site = site;
	}

	public void setPage(String page) {
		this.page = page;
	}

	@Override
	public void doTag() throws JspException, IOException {
		
		//1. 得到用户请求的referer
		PageContext pc = (PageContext) this.getJspContext();
		HttpServletRequest request = (HttpServletRequest)pc.getRequest();
		String referer = request.getHeader("referer");
		HttpServletResponse response = (HttpServletResponse)pc.getResponse();
		
		//2. 检查盗链情况
		// 是盗链者
		if (referer == null || !referer.startsWith(site)) {
			if (page.startsWith(request.getContextPath())) {
				response.sendRedirect(page);
			} else if (page.startsWith("/")) {
				response.sendRedirect(request.getContextPath() + page);
			} else {
				response.sendRedirect(request.getContextPath() + "/" + page);
			}
			throw new SkipPageException();  // 后的页面不执行
		} else {  // 非盗链者
			
		}
		//System.out.println(request.getContextPath());
	}
}


 <tag>
        <name>referer</name>
        <tag-class>cn.gbx.web.example.RefererTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
        	<name>site</name>
        	<required>true</required>
        	<rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
        	<name>page</name>
        	<required>true</required>
        	<rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

  

•开发<c:if>标签 (控制标签体内容是都执行)
package cn.gbx.web.example;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class IfTag extends SimpleTagSupport {
	private boolean test;
	
	public void setTest(boolean test) {
		this.test = test;
	}

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf = this.getJspBody();
		if (test) {
			jf.invoke(null);
		} else {
			
		}
	}

}

 <tag>
        <name>if</name>
        <tag-class>cn.gbx.web.example.IfTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
        	<name>test</name>
        	<required>true</required>
        	<rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

  

•开发<c:if><c:else>标签  (涉及父标签的使用)
package cn.gbx.web.example;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ChooseTag extends SimpleTagSupport {
	//子标签共享的变量
	private boolean isOver;

	public boolean isOver() {
		return isOver;
	}

	public void setOver(boolean isOver) {
		this.isOver = isOver;
	}

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

  

package cn.gbx.web.example;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
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 {
		ChooseTag ch = (ChooseTag)this.getParent();
		if (test && !ch.isOver()) { //子标签是真, 共享的父标签的变量还未使用
			JspFragment jf = this.getJspBody();
			jf.invoke(null);
			ch.setOver(true);
		} else {
			
		}
	} 
	
}

  

package cn.gbx.web.example;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class OtherWiseTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		ChooseTag ch = (ChooseTag) this.getParent();
		if (!ch.isOver()) {
			JspFragment jf = this.getJspBody();
			jf.invoke(null);
			ch.setOver(true);
		} else {
			
		}
	}

}	

  

 <tag>
        <name>choose</name>
        <tag-class>cn.gbx.web.example.ChooseTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>
    <tag>
        <name>when</name>
        <tag-class>cn.gbx.web.example.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>cn.gbx.web.example.OtherWiseTag</tag-class>
    	<body-content>scriptless</body-content>  
    </tag>
    

  

•开发迭代标签 (控制标签内的内容重复执行)
package cn.gbx.web.example;

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;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ForeachTag extends SimpleTagSupport {
	private Object items;
	private String var;
	private Collection collection;
	
	
	public void setVar(String var) {
		this.var = var;
	}
	public void setItems(Object items) {
		this.items = items;
		//集合
		if (items instanceof Collection) {
			collection = (Collection)items;
		} 
		//Map
		if (items instanceof Map) {
			collection = ((Map)items).entrySet();
		}
		//数组的判断
		if (items.getClass().isArray()) {
			this.collection = new ArrayList();
			int length = Array.getLength(items);
			for (int i = 0; i < length; ++i) {
				this.collection.add(Array.get(items, i));
			}
		}
	}

	//遍历
	@Override
	public void doTag() throws JspException, IOException {
		Iterator it = this.collection.iterator();
		while (it.hasNext()) {
			Object value = it.next();
			this.getJspContext().setAttribute(var, value);
			this.getJspBody().invoke(null);
		}
	}
}

  

<tag>
    	<name>foreach</name>
    	<tag-class>cn.gbx.web.example.ForeachTag</tag-class>
    	<body-content>scriptless</body-content>  
    	
    	<attribute>
    		<name>var</name>
    		<required>true</required>
    		<rtexprvalue>fase</rtexprvalue>
    	</attribute>
    	
    	<attribute>
    		<name>items</name>
    		<required>true</required>
    		<rtexprvalue>true</rtexprvalue>
    	</attribute>
    	
    </tag>

  

•开发html转义标签
package cn.gbx.web.example;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class HtmlFilterTag extends SimpleTagSupport {

	//转义标签内的内容
	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf = this.getJspBody();
		StringWriter sw = new StringWriter();
		jf.invoke(sw);
		String content = sw.toString();
		content = filter(content);
		this.getJspContext().getOut().write(content);
		
	}
	//对标签体内的内容进行转义
    public  String filter(String message) {
        if (message == null)
            return (null);
        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuilder result = new StringBuilder(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
            case '<':
                result.append("<");
                break;
            case '>':
                result.append(">");
                break;
            case '&':
                result.append("&");
                break;
            case '"':
                result.append(""");
                break;
            default:
                result.append(content[i]);
            }
        }
        return (result.toString());
    }
}

  

    <tag>
    	<name>filter</name>
    	<tag-class>cn.gbx.web.example.HtmlFilterTag</tag-class>
    	<body-content>scriptless</body-content>
    </tag>

  

 
原文地址:https://www.cnblogs.com/E-star/p/3555474.html