- 自定义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 {
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字符串
public class MyFunction {
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" %>
用法如下


