自定义迭代标签

最近公司跟别的公司合作天发一个项目,用到了那家公司自己开发的一套开发框架,其中包括了很多自定义标签很是方便,其中也有迭代标签,很方便。之前没有玩过自定义标签,于是在网上找了一些这方面的资料,了解了解其中的原理。然后自己写了一个简单的迭代标签。其中包括两个标签Collection、CollectionItem,都继承了BodyTagSupport。代码如下:
tld文件



1.0
mytag
/WEB-INF/tlds/mytag

collection
com.jquery.mytags.Collection
jsp

dataSource
true



collectionItom
com.jquery.mytags.CollectionItem
empty

property
true


title
false




web.xml中加入以下代码



/WEB-INF/tlds/mytag
/WEB-INF/mytld/jquery-helloworld.tld



Collection处理代码

import java.io.IOException;
import java.util.Iterator;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class Collection extends BodyTagSupport {

/**
*
*/
private static final long serialVersionUID = 1L;

private PageContext pageContext;
private String dataSource;// 数据源名称
@SuppressWarnings("unchecked")
private Iterator iter;

public String getDataSource() {
return dataSource;
}

public void setDataSource(String dataSource) {
this.dataSource = dataSource;
}

public Collection() {
super();
}

public int doAfterBody() throws JspException {
if(iter.hasNext()){
try {
pageContext.getOut().print("");
pageContext.setAttribute(dataSource,iter.next());

} catch (IOException e) {
e.printStackTrace();
}
return EVAL_BODY_AGAIN;//表示循环处理标签体
}
return SKIP_BODY;
}

public int doEndTag() throws JspException {
try {
pageContext.getOut().print("");
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}

@SuppressWarnings("unchecked")
public int doStartTag() throws JspException {
java.util.Collection coll = (java.util.Collection) pageContext.findAttribute(dataSource);
// 表示如果未找到指定集合,则不用处理标签体,直接调用doEndTag()方法。
if (coll == null || coll.isEmpty())
return SKIP_BODY;
try {
pageContext.getOut().print("");
} catch (IOException e) {
e.printStackTrace();
}
iter = coll.iterator();
pageContext.setAttribute(dataSource,"setHeader");//处理列表表头
// 这里一定要返回EVAL_BODY_INCLUDE,否则标签体的内容不会在网页上输出显示
return EVAL_BODY_INCLUDE;
}

public void release() {

}

public void setPageContext(PageContext arg0) {
pageContext = arg0;

}

// 在doInitBody方法之前执行,在这里被绕过不执行
public void setBodyContent(BodyContent arg0) {
System.out.println("setBodyContent...");
super.setBodyContent(arg0);
}

// 此方法被绕过不会被执行
public void doInitBody() throws JspException {
System.out.println("doInitBody...");
super.doInitBody();
}
}

CollectionItem处理代码

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;

public class CollectionItem extends BodyTagSupport {

/**
*
*/
private static final long serialVersionUID = 2093044170883495102L;
private PageContext pageContext;
private Tag parent;
private String property;//打印字段名
private String width;//列宽
private String title;//标题

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getProperty() {
return property;
}

public void setProperty(String property) {
this.property = property;
}

public String getWidth() {
return width;
}

public void setWidth(String width) {
this.width = width;
}

public CollectionItem() {
super();
}

public int doEndTag() throws JspException {

return EVAL_PAGE;
}

@SuppressWarnings("unchecked")
public int doStartTag() throws JspException {
try {
String dataSourceName = ((Collection)parent).getDataSource();
Object objItem = pageContext.getAttribute(dataSourceName);
if (objItem == null) return SKIP_BODY;
//判断是否是打印表头
if(objItem.toString()=="setHeader"){
String itemTile = title==null?property:title;//如果没写标题,刚表头显示为该列的字段名
pageContext.getOut().write("
");
return SKIP_BODY;
}
Class cItem = objItem.getClass();
String itemStr = "";
Method method;
if(cItem==Map.class||cItem==HashMap.class||cItem==Hashtable.class){

method = cItem.getMethod("get",Object.class);
itemStr = (String) method.invoke(objItem,property);
}
else{
String getMethodNao = "get"+property.substring(0,1).toUpperCase()+property.substring(1);
method = cItem.getMethod(getMethodNao);
itemStr = (String) method.invoke(objItem);
}

String result="
";
pageContext.getOut().write(result);
} catch (Exception e) {
throw new JspTagException("IO Error: " + e.getMessage());
}
return SKIP_BODY;
}

public Tag getParent() {
return parent;
}

public void release() {

}

public void setPageContext(PageContext arg0) {
this.pageContext = arg0;

}

public void setParent(Tag arg0) {
parent = arg0;

}
}

doStartTag()和doEndTag()、doAfterBody()方法的返回值说明:
SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。
SKIP_PAGE 忽略标签后面的jsp内容。
EVAL_PAGE 处理标签后,继续处理jsp后面的内容。
EVAL_BODY_BUFFERED 表示需要处理标签体,且需要重新创建一个缓冲(调用setBodyContent方法)。
EVAL_BODY_INCLUDE 表示在现有的输出流对象中处理标签体,但绕过setBodyContent()和doInitBody()方法
EVAL_BODY_AGAIN 对标签体循环处理。(存在于javax.servlet.jsp.tagext.IterationTag接口中)

Jsp应用代码

<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@taglib uri="/WEB-INF/tlds/mytag" prefix="hello" %>




Insert title here











Action代码

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
Person p1 = new Person();
Person p2 = new Person();
Map p3 = new HashMap();

p1.setUserId(1111);
p1.setAddress("北京");
p1.setAge(25);
p1.setPassWord("12345");
p1.setUserName("张三");

p2.setUserId(1111);
p2.setAddress("上海");
p2.setAge(25);
p2.setPassWord("12345");
p2.setUserName("李四");

p3.put("address", "广州");
p3.put("age", 30);
p3.put("passWord", "12345");
p3.put("userName", "王五");

ArrayList arr = new ArrayList();
arr.add(p1);
arr.add(p2);
arr.add(p3);
request.setAttribute("userList", arr);

return mapping.findForward("jspView");
}

你可能感兴趣的:(自定义迭代标签)

"+itemTile+""+itemStr;
result +="