自定义标签

1、实现自定义标签按如下步骤进行:

(1)开发自定义标签处理类:

(2)建立一个*.tld 文件,每个*.tld 文件对应一个标签库,每个标签库对应多个标签:

(3)在web.xml文件中增加自定义标签的定义:

(4)在JSP 文件中使用自定义标签。

2、开发自定义标签:

自定义标签类都必须继承一个父类: java.Servlet.jsp.tagext.TagSupport 或者 BodyTagSupport。除此之外,自定义标签类还有如下要求。

·如果标签类包含属性,每个属性都有对应的getter 和setter 方法。

·重写doStartTag()或doEndTag()方法,这两个方法生成页面内容。

·如果需要在销毁标签之前完成资源回收,则重写re1ease()方法。
下面就以编写一个select下拉框的自定义标签为例:
步骤1.编写tld文件。在项目的WEB-INF文件夹中创建一个tld文件。如jttag.tld。文件内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
                        "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
 <tlibversion>1.0</tlibversion>
 <jspversion>1.1</jspversion>
 <shortname>jttag</shortname>
 <tag>
  <name>jtselect</name>
  <tagclass>cn.com.hnisi.egs.util.jsptool.jttaglib.JtGenerateSelectTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
   <name>id</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>whereCls</name>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>nameColumnName</name>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>cusStyle</name>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>sourceTable</name>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>valueColumnName</name>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>selectValue</name>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>name</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
  </attribute>
 </tag>
</taglib>


其中的: <tagclass>cn.com.hnisi.egs.util.jsptool.jttaglib.JtGenerateSelectTag</tagclass>
中的类就是标签处理类。
步骤2.编写标签处理类。
代码如下:

package cn.com.hnisi.egs.util.jsptool.jttaglib;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import cn.com.hnisi.egs.framework.util.DebugUtil;
import cn.com.hnisi.egs.framework.util.SysUtil;

/**
 * 
 ***************************************************************
 * <p>
 * @CLASS				:	JtGenerateSelectTag
 * @DESCRIPTION	:创建自定义标签:jtselect,可自动填充相应的下拉框,设置默认选择等操作
 * @AUTHOR				:hill
 * @VERSION			:	v1.0
 * @DATE					:	Mar 5, 2013 8:58:33 AM            
 * </p> 
 ****************************************************************
 */
public class JtGenerateSelectTag extends TagSupport{
	private static final long serialVersionUID = 1L;
	/**
	 * id 元素id 同时也是下拉框id
	 */
	private String id;
	/**
	 * name 元素name  同时也是下拉框name
	 */
	private String name;
	/**
	 * whereCls where条件
	 */
	private String whereCls;
	/**
	 * nameColumnName 名称所在的列的名称  
	 */
	private String nameColumnName;
	/**
	 * valueColumnName 值所在的列的名称
	 */
	private String valueColumnName;
	/**
	 * 	selectValue  默认选择的值
	 */
	private String	selectValue;
	/**
	 * cusStyle 用户自定义样式
	 */
	private String cusStyle;
	/**
	 * sourceTable 数据来源表 默认为AA10
	 */
	private String sourceTable;
	
	public JtGenerateSelectTag()
	{
		id = "";
		whereCls = "";
		nameColumnName = "";
		valueColumnName="";
		selectValue="";
		cusStyle = "";
		sourceTable = "";
	
	}

	public int doEndTag()
		throws JspException
	{ 
		Connection conn=null;
		ResultSet rs=null;
		PreparedStatement ps=null;
		StringBuffer sqlbfr=new StringBuffer();
		StringBuffer sqlbfr2=new StringBuffer();
		String sql="";
		String falg="1";//标志用于区分使用哪个StringBuffer
		
		HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
		JspWriter out = pageContext.getOut();
		try
		{
			
			if(name==null||name.equals(""))
			{
				throw new JspException("所取的下拉框的名称为空!");
			}else
			{
				sqlbfr.append("SELECT AAA102,AAA103 FROM AA10 ");
				//如果传入的value的名称不为空,sourceTable 也不为空
				if(nameColumnName!=null&&!nameColumnName.trim().equals("")&&valueColumnName!=null&&!valueColumnName.trim().equals("")&&sourceTable!=null&&!sourceTable.trim().equals(""))
				{
					falg="2";
					sqlbfr2.append("SELECT "+valueColumnName+","+nameColumnName+" FROM "+sourceTable+" WHERE 1=1 ");
				}else
				{
					sqlbfr.append(" WHERE AAA100= '"+name+"' ");
				}	
				
				if(whereCls!=null&&!whereCls.trim().equals(""))
				{
					sqlbfr.append(" and "+whereCls);
					sqlbfr2.append(" and "+whereCls);
				}
				if(falg.equals("1"))
				{
					sql=sqlbfr.toString();
				}else
					sql=sqlbfr2.toString();
				
				conn=SysUtil.getConnection();
				ps = conn.prepareStatement(sql);
				ps.execute();
				rs = ps.getResultSet();
				int rows = 0;
				String toActId = "";
				String actName = "";
				StringBuffer postTranssStr = new StringBuffer();
				while (rs.next()) 
				{
					toActId = rs.getString(1);
					actName = rs.getString(2);
					if(selectValue!=null&&!selectValue.trim().equals("")&&selectValue.trim().equals(toActId))
					{
					postTranssStr.append("<option value=\"" + toActId + "\" selected >" + actName + "</option>");
					}
					else
					{
					postTranssStr.append("<option value=\"" + toActId + "\">" + actName + "</option>");
					}
					rows++;
				}
				StringBuffer sb = new StringBuffer();
				if (rows > 0)
				{
					sb.append("");
					if(cusStyle!=null&&!cusStyle.equals(""))
					{						
					}else
					{
						cusStyle="";
					}	
					sb.append("<select class=solidselect id=\""+id+"\" name=\""+name+"\" "+cusStyle+">\n");
				
						sb.append("<option value=\"\" selected>请选择</option>");   
						sb.append(postTranssStr);
					
					sb.append("</select>");
					sb.append("");
				}
				String _html = sb.toString();
				out.println(_html);
				out.flush();				
			}

		}
		catch (Exception e)
		{
			DebugUtil.println("------引用下拉框标签jtselect时发生错误!");
			e.printStackTrace();
			throw new JspException(e);
		}
		finally
		{
			try {
				SysUtil.release(rs, ps, conn);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return 6;
	}

	
	public void release()
	{
		id = "";
		whereCls = "";
		nameColumnName = "";
		valueColumnName="";
		selectValue="";
		cusStyle = "";
		sourceTable = "";
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getWhereCls() {
		return whereCls;
	}
	public void setWhereCls(String whereCls) {
		this.whereCls = whereCls;
	}
	public String getSourceTable() {
		return sourceTable;
	}
	public void setSourceTable(String sourceTable) {
		this.sourceTable = sourceTable;
	}

	public String getNameColumnName() {
		return nameColumnName;
	}

	public void setNameColumnName(String nameColumnName) {
		this.nameColumnName = nameColumnName;
	}

	public String getValueColumnName() {
		return valueColumnName;
	}

	public void setValueColumnName(String valueColumnName) {
		this.valueColumnName = valueColumnName;
	}

	public String getSelectValue() {
		return selectValue;
	}

	public void setSelectValue(String selectValue) {
		this.selectValue = selectValue;
	}

	public String getCusStyle() {
		return cusStyle;
	}

	public void setCusStyle(String cusStyle) {
		this.cusStyle = cusStyle;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}


}



注意
doStartTag()和doEndTag()返回值是在Tag  Interface里定义的静态int  

              SKIP_BODY隐含0       Skip  body  evaluation.  Valid  return  value  for  doStartTag  and  doAfterBody.  跳过对body的处理。   就是跳过了开始和结束标签之间的代码。                                                    

                EVAL_BODY_INCLUDE  隐含1     Evaluate  body  into  existing  out  stream.  Valid  return  value  for  doStartTag.     This  is  an  illegal  return  value  for  doStartTag  when  the  class  implements  BodyTag,      since  BodyTag  implies  the  creation  of  a  new  BodyContent.      将body的内容输出到存在的输出流中。包括是jsp代码,也可以被输出   

                 SKIP_PAGE    隐含5        Skip  the  rest  of  the  page.  Valid  return  value  for  doEndTag.    忽略剩下的页面。  

                 EVAL_PAGE    隐含6   Continue  evaluating  the  page.  Valid  return  value  for  doEndTag().   

                   在doStartTag()方法中,若返回EVAL_BODY_INCLUDE就计算标签的body     若返回SKIP_BODY就不计算标签的body        

                   在doEndTag()方法中,若返回EVAL_PAGE容器在标签结束时继续计算jsp页面的其它部分,     若返回SKIP_PAGE则在标签结束时停止计算jsp页面其他的部分。        

                    当你实现了BodyTag接口时,也就是你进行带body标签的开发时,有doAfterBody()方法。                   

                     当返回EVAL_BODY_TAG时,表示继续计算一次BodyTag,直到返回SKIP_BODY才会调用doEndTag()方法在doStartTag()方法中,若返回EVAL_BODY_INCLUDE就计算标签的body   若返回SKIP_BODY就不计算标签的body

步骤3.配置web.xml文件。
<taglib>
<taglib-uri>hnisi.tld</taglib-uri>
<taglib-location>/WEB-INF/hnisi.tld</taglib-location>
</taglib>
步骤4.在页面使用.
jtselect
1.1标签属性:
   * id  元素id 同时也是下拉框id 
   * name 元素name  同时也是下拉框name
 
    * whereCls where条件
    * nameColumnName 名称所在的列的名称
    * valueColumnName 值所在的列的名称
    * selectValue  默认选择的值
    * cusStyle 用户自定义样式
   * sourceTable 数据来源表 默认为AA10
说明:标记为红色的属性为必须属性
2使用方法和步骤:
步骤1:在使用该标签的页面的前部加上如下文字:
<%@ taglib uri="jttag.tld" prefix="jttag" %>

说明:
uri:必须是jttag.tld,详见web.xml文件配置
prefix: jttag 前缀可以自定义
步骤2:在需要使用该标签的位置添加如下代码
如果下拉框来源于AA10时:
  <jttag:jtselect name="AAC004" id="AAC004" />
如果是自定义表格时:
  <jttag:jtselect id="AAC004"  name="AAC004" nameColumnName="AAA103" valueColumnName="AAA102" sourceTable="AA10" whereCls=" AAA100='AAC004' " selectValue="1" cusStyle="readonly=true"/>




 

你可能感兴趣的:(jsp)