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 文件夹开始)。