1.我们要先确定要做什么样功能的标签库。
比如 <start:message key=“” />
2.确定使用什么标签库之后:写个类继承javax.servlet.jsp.tagext.SimpleTagSupport类覆盖doTag()方法
比如MessageTag extends SimpleTagSupport
MessageTag类中属性 ---- 标签库的属性
key(set/get方法) ---- key
3.实现你的doTag()方法:
PageContext context=(PageContext)getJspContext();
context.getOut().write(key+“Hello”);
4.配置tld文件:
<?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.2</tlib-version>
<jsp-version>1.0</jsp-version>
<short-name>MessageTag</short-name>
<uri>http://startStruts/messageTag/message</uri>
<tag>
<name>message</name>
<tag-class>cs.eylen.servlet.tag.MessageTag</tag-class>
<body-content>empty</body-content>
<attribute >
<name>key</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
5.在jsp中引用:
<%@taglib prefix="start" uri="http://startStruts/messageTag/message"%>
<start:message key="Eylen" />
显示到页面上的就是EylenHello
例如:<c:forEach ... 自定义
1.我们要在页面使用自定义的forEach标签库。
<%@ page language="java" import="java.util.*,domain.User" pageEncoding="utf-8" isELIgnored="false"%>
<%@taglib prefix="test" uri="/WEB-INF/forEach.tld" %>
<%
List l=new ArrayList();
User u1=new User("zhouhr","8888");
User u2=new User("zhouhr","8888");
User u3=new User("zhouhr","8888");
User u4=new User("zhouhr","8888");
l.add(u1); l.add(u2); l.add(u3); l.add(u4);
request.setAttribute("l",l);
%>
<test:forEach items="${l}" var="u" varStatus="c">
${u.name} | ${c.count} <br />
</test:forEach>
2.类的设计
public class ForEachTag extends SimpleTagSupport{
private Object items;
private String var;
private String varStatus;
@SuppressWarnings("unchecked")
@Override
public void doTag() throws JspException, IOException {
PageContext pageCtx=(PageContext)getJspContext();
JspFragment body=getJspBody();
ForEachStatus status=new ForEachStatus();status.setCount(1);
if(varStatus!=null){
pageCtx.setAttribute(varStatus,status);
}
Iterator it=null;
if(items instanceof Collection){
it=((Collection)items).iterator();
}else if(items instanceof Object[]){
List<Object> list=Arrays.asList(items);
it=list.iterator();
}
if(it!=null){
while(it.hasNext()){
Object obj=it.next();
pageCtx.setAttribute(var,obj);
body.invoke(pageCtx.getOut());
status.setCount((status.getCount()+1));
}
}
}
public Object getItems() {
return items;
}
public void setItems(Object items) {
this.items = items;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public String getVarStatus() {
return varStatus;
}
public void setVarStatus(String varStatus) {
this.varStatus = varStatus;
}
}
public class ForEachStatus {
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
3.WEB-INF下的forEach.tld的设计
<?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.2</tlib-version>
<jsp-version>1.0</jsp-version>
<short-name>test</short-name>
<tag>
<name>forEach</name>
<tag-class>forEach.ForEachTag</tag-class>
<body-content>scriptless</body-content>
<attribute >
<name>items</name>
<!-- 可选true必须的 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>varStatus</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>