日期:2014-05-16  浏览次数:20351 次

jsp自定义标签的应用
下面对自定义标签的应用时通过jsp直接引用的,没有配置在工程中的web.xml中。而且省去了数据返回的java类,只是着重描述了对标签的定义
1、首先定义一个标签的描述文件lightweight-tag.tld,该文件必须放在工程的类路径下,一般和项目的web.xml文件一起就行了。其内容如下:
<?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>nt</short-name>
<description>my Form Tag Library Descriptor</description>

<!-- table tag -->
<tag>
<name>table</name>
<tag-class>ssh.tag.TableTag</tag-class>
<body-content>JSP</body-content>
<description>table tag</description>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
</attribute>
</tag>

<!-- column tag -->
<tag>
<name>grid</name>
<tag-class>ssh.tag.ColumnTag</tag-class>
<body-content>JSP</body-content>
<description>column tag</description>
<attribute>
<name>label</name>
<required>true</required>
</attribute>
<attribute>
<name>property</name>
<required>true</required>
</attribute>
</tag>
</taglib>
配置文件中标签类的java类一定要写对

2、标签类TableTag.java的内容为:
package ssh.tag;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

@SuppressWarnings("serial")
public class TableTag extends BodyTagSupport{

private List<Map<String, String>> columns = new ArrayList<Map<String,String>>();

private Object items; //存储数据,可能为集合类型或者数组类型
private String url; //取排序数据的 URL

public int doStartTag() throws JspException{ //标签开始时执行
columns.clear(); //清空colums
return super.doStartTag();

}

@SuppressWarnings("unchecked")
public int doAfterBody() throws JspException{ //标签体结束后执行
try {
BodyContent bc = getBodyContent(); //获取标签体
JspWriter out = bc.getEnclosingWriter();//获取out对象

HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();

String orderName = request.getParameter("orderName"); //按那一列排序
String orderType = request.getParameter("orderType"); //排序方式
orderType = "desc".equals(orderType) ? "desc" : "asc"; //升序还是降序

out.println("<table id=theObjectTable"); //输出<table>标签
out.println(" class=list_table  style='table-layout:fixed;'>");
out.println("<tr class=tr_title >"); //输出<tr>标签
out.println("<script>var colums = []; </script>");

for (int i = 0; i < columns.size(); i++) { //依次输出每一列
Map<String, String> column = columns.get(i); //获取列数据

String label = column.get("label"); //列的名称
String property = column.get("property"); //列对应的 POJO 属性

label = label == null ? property : label; //默认使用属性名作为列名

out.println("<td id='_id_td_