jsp自定义标签与EL函数

  • 自定义jsp标签,创建标签处理类,以下示例创建获取web应用context标签
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;


public class WebRootTag extends SimpleTagSupport{

	@Override
	public void doTag() throws JspException, IOException {
		// TODO Auto-generated method stub
		PageContext pageContext = (PageContext) getJspContext();
		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
		String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
		pageContext.getOut().print(basePath);
	}
		
}
  • 自定义EL函数,创建类创建public静态方法,一定要注意必须是public static method,以下示例创建静态方法将对象转为json字符串
/**
 * 自定义EL函数
 * @author tianlei
 *
 */
public class MyFunction {

	/**
	 * 对象转json字符串
	 * @param obj
	 * @return
	 */
	public static String toJsonStr(Object obj){
		return JSONUtil.toJsonStr(obj);
	}

}
  • 编写.tld文件(tag library descriptor 标签库描述符),注册EL函数,使之可在JSP中被识别,在WEB-INF路径下创建tld文件夹,创建mytaglib.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版本-->
  <jsp-version>1.2</jsp-version>
  <!--定义名称空间前缀,即在JSP页面通过taglib指令导入标签库时,指定的prefix的值-->
  <short-name>my</short-name>
  <!-- 标识这个在互联网上的唯一地址,一般是作者的网站,这个网址可以是根本不存在对应的资源,但一定要是唯一的,不能与其他标签uri相同,这里我使用tld文件在工程中的相对路径-->
  <uri>/tld/mytaglib.tld</uri>
	
		
	<!--函数节点,每个function就是一个EL函数-->	
	<function>
		<!--函数的功能描述-->
		<description>对象转json字符串</description>
		<!--EL函数名,也就是EL表达式中调用的函数名称,可以与java方法名不同-->
		<name>toJsonStr</name>
		<!--指定函数处理类-->
		<function-class>
			top.javawx.common.taglib.NmFunction
		</function-class>
		<!--函数签名,格式为方法返回值类型,方法名称,方法参数类型,多个参数时用逗号分隔-->
		<function-signature>
			java.lang.String toJsonStr(java.lang.Object)
		</function-signature>
		<!--使用示例-->
		<example>${my:toJsonStr(bean)}</example>
	</function>
	
	<function>
		<description>格式化日期为字符串</description>
		<name>formatDate</name>
		<function-class>
			top.javawx.common.taglib.MyFunction
		</function-class>
		<function-signature>
			java.lang.String formatDate(java.util.Date,java.lang.String)
		</function-signature>
		<example>${my:formatDate(data,'yyyy-MM-dd')}</example>
	</function>
	
	<!--标签节点,每个tag就是一个jsp标签-->
	<tag>
		<!--标签名称-->	
		<name>WebRoot</name>
		<!--标签处理类-->	
		<tag-class>top.javawx.common.taglib.WebRootTag</tag-class>
		<!--标签体,empty表示没有标签体,即标签开闭合之间没有内容-->
		<body-content>empty</body-content>
	</tag>
	
	<tag>
	  	<name>select</name>
	  	<tag-class>top.javawx.common.taglib.SelectTag</tag-class>
	  	<body-content>empty</body-content>
	  	<attribute>
	  		<name>name</name>
	  		<description>元素name属性值</description>
	  		<required>true</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>id</name>
	  		<description>元素id属性值</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>classs</name>
	  		<description>css类名</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>style</name>
	  		<description>自定义样式</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>defaultValue</name>
	  		<description>默认值</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>disabled</name>
	  		<description>是否禁用</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  		<type>java.util.Boolean</type>
	  	</attribute>
	  	<attribute>
	  		<name>dictCode</name>
	  		<description>字段类型代码,优先级高于自定义sql</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>type</name>
	  		<description>标签类型,取值为标签类常量tag_type_</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>year</name>
	  		<description>当type为jggl时,传入年份获取指定年份机构,没有值时默认为当年</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>sql</name>
	  		<description>自定义sql语句,优先级高于type</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>dataSource</name>
	  		<description>自定义sql指定数据源</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>onchange</name>
	  		<description>下拉框onchange事件</description>
	  		<required>false</required>
	  		<rtexprvalue>false</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>validate</name>
	  		<description>自定义校验属性,用于Common.js表单校验</description>
	  		<required>false</required>
	  		<rtexprvalue>false</rtexprvalue>
	  	</attribute>
	  	<attribute>
	  		<name>showEmpty</name>
	  		<description>是否允许空值选项</description>
	  		<required>false</required>
	  		<rtexprvalue>true</rtexprvalue>
	  		<type>java.util.Boolean</type>
	  	</attribute>
	</tag>
	
	
	
</taglib>

  • 在web.xml中配置标签库资源映射,在web-app增加如下节点
<jsp-config>
	<taglib>
		<!--taglib指令下的uri属性的值-->
		<taglib-uri>/tld/mytaglib.tld</taglib-uri>
		<!--tld文件在工程中的位置-->
		<taglib-location>/WEB-INF/tld/mytaglib.tld</taglib-location>
	</taglib> 
</jsp-config>
  • jsp使用引入标签
    <%@taglib prefix=“nm” uri="/tld/mytaglib.tld" %>
    用法如下
    jsp自定义标签与EL函数_第1张图片
    在这里插入图片描述
    在这里插入图片描述

你可能感兴趣的:(JSP,JSP标签,jsp,java)