案例:
一、开发<c:if>标签
IfTag.java
package com.hbsi.web.tag;
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 {/ if(test){
//处理标签体
JspFragment jf=this.getJspBody();
jf.invoke(null);
}
}
}
TestIf.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/c" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'TestIf.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
session.setAttribute("user","zhangsan");
%>
<c:if test="${user!=null}">
aaa---aaa <br>
</c:if>
</body>
</html>
c.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.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>c</short-name>
<uri>/c</uri>
<tag>
<name>if</name>
<tag-class>com.hbsi.web.tag.IfTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
二、开发<c:if><c:else>标签
案例分析:
<c:if test=””>aaa</c:if>------IfTag.java
<c:else>bbb</c:else>--------ElseTag.java
共享一个boolean变量
<c:choose>---------ChooseTag.java
<c:when test=””>aaa</c:when>---------WhenTag.java
<c:otherwise>bbb</c:otherwise>---------OtherTag.java
</c:choose>
TestIf.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/c" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'TestIf.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
session.setAttribute("user","zhangsan");
%>
<c:if test="${user!=null}">
aaa---aaa <br>
</c:if>
<br/>----------------------------------------<br/>
<c:choose>
<c:when test="${user!=null}">aaa</c:when>
<c:otherwise>bbb</c:otherwise>
</c:choose>
</body>
</html>
IfTag.java
package com.hbsi.web.tag;
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 {
if(test){
//处理标签体
JspFragment jf=this.getJspBody();
jf.invoke(null);
}
}
}
ChooseTag.java
package com.hbsi.web.tag;
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 flag=false;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
JspFragment jf=this.getJspBody();
jf.invoke(null);
}
}
WhenTag.java
package com.hbsi.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
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 parent=(ChooseTag) this.getParent();
if(test && !parent.isFlag()){
//处理该标签体
this.getJspBody().invoke(null);
parent.setFlag(true);
}
}
}
OtherwiseTag.java
package com.hbsi.web.tag;
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.isFlag()){
this.getJspBody().invoke(null);
parent.setFlag(true);
}
}
}
c.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.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>c</short-name>
<uri>/c</uri>
<tag>
<name>if</name>
<tag-class>com.hbsi.web.tag.IfTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>choose</name>
<tag-class>com.hbsi.web.tag.ChooseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>com.hbsi.web.tag.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>com.hbsi.web.tag.OtherwiseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
三、开发迭代标签
List list=new ArrayList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
list.add(“ddd”);
list.add(“eee”);
request.setAttribute(“list”,list);
%>
Jsp
<c:foreach items=”${list}” var=”str”> -----ForEachTag.java-----对象赋值---doTag() pageContext对象中设置了一个属性:str=”aaa”
${str}
</c:foreach>
ForEachTag.java
package com.hbsi.web.tag;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
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;
public void setItems(Object items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
//List list=(List)items;
//Iterator it=list.iterator();
Collection collection=null;
if(items instanceof Map){
Map map=(Map)items;
//两列得集合转换成单列
collection=map.entrySet();
}else if(items instanceof Collection){
collection=(Collection)items;
}/*else if(items instanceof Object[]){
Object[] objs=(Object[])items;
collection=Arrays.asList(objs);
}else if(items instanceof int[]){
}*/
else if(items.getClass().isArray()){
collection=new ArrayList();
int length=Array.getLength(items);
for(int i=0;i<length;i++){
collection.add(Array.get(items, i));
}
}
Iterator it=collection.iterator();
while(it.hasNext()){
Object obj=it.next();//一个元素
this.getJspContext().setAttribute(var,obj);
this.getJspBody().invoke(null);
}
}
}
TextForEach.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/c" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'TestForEach.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
request.setAttribute("list",list);
%>
<c:foreach items="${list}" var="str">
${str }
</c:foreach>
<br/>----------------------------------<br/>
<%
Map map=new HashMap();
map.put("aa","zhangsan");
map.put("bb","lisi");
map.put("cc","wangwu");
request.setAttribute("map",map);
%>
<c:foreach items="${map}" var="name" >
${name }
</c:foreach>
<br/>---------------------------------<br/>
<%
Integer[] num={1,2,3,4,5};
request.setAttribute("num",num);
%>
<c:foreach items="${num}" var="i">
${i}
</c:foreach>
<br/>----------------------------------------<br/>
<%
int[] arr={6,7,8,9,10};
request.setAttribute("arr",arr);
%>
<c:foreach items="${arr}" var="index">
${index}
</c:foreach>
</body>
</html>
c.tld
<tag>
<name>foreach</name>
<tag-class>com.hbsi.web.tag.ForEachTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
四、打包标签库
jar包:标签处理器以及(META-INF)tld文件打成一个jar包
第一种方法:
命令提示状态下:
D:(选择任一个盘符)
cd mytag
jar cvf mytag.jar .
要导入到第三方 直接copy到第三方的WEB-INF下的lib下就可以,它会自动进行配制
在第三方中,可以使用此包中的自定义标签
第二种方法:建一个JAVA项目,把源文件(也就是包)直接COPY到此项目的src中,再把所有的tld文件,考备到META-INF中,导出到java中的JAR文件,classpath project不选。
第三种方法:(最简单的方法)直接压缩。