自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。
菜鸟教程链接:http://www.runoob.com/jsp/jsp-custom-tags.html
菜鸟教程的自定义标签部分,只说明了一种方法,并不适用于我的系统,所以下面记录下另外一种方法。
项目采用 Spring + Spring MVC + Mybatis 框架。
适用自定义标签需要新增/修改个地方。
用来实现自定义标签以及编写业务代码。我这里新建一个名为tag的包,专门存放tag类。
以UserTag为例:
package com.domain.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class UserTag extends SimpleTagSupport implements DynamicAttributes {
private Map<String,Object> param = new HashMap<>();
// 业务逻辑
@Override
public void doTag() throws JspException, IOException {
for(int i=0;i<param.size();i++){
getJspContext().setAttribute("name",param.get("name"));
}
//下面这一句必须加上,不然jsp引入的时候不会输出值
getJspBody().invoke(null);
}
//获取前端的传值
@Override
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
param.put(localName,value);
}
}
新建tld文件时,路劲需要建在WEB-INF文件夹下,
代码如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>myshortname</short-name>
<uri>http://mycompany.com</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<!--标签描述-->
<description> 测试动态传参数 </description>
<!--标签名称-->
<name>message</name>
<!--对应的类-->
<tag-class>com.jtexplorer.tag.UserTag</tag-class>
<body-content>scriptless</body-content>
<!--开启动态传值-->
<dynamic-attributes>true</dynamic-attributes>
</tag>
</taglib>
<%--引入自定义标签--%>
<%@ taglib prefix="ex" uri="WEB-INF/tld/UserTag.tld" %>
<html>
<body>
<%--使用标签,传值--%>
<ex:message name="wang" age = "33">
<tr>
<%--获取返回值--%>
<td>${name}</td>
</tr>
</ex:message>
</body>
</html>
body-content的值有下面4种:
<xsd:enumeration value="tagdependent"/> <xsd:enumeration value="JSP"/> <xsd:enumeration value="empty"/> <xsd:enumeration value="scriptless"/> |
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释,
如下:
<test:myList>
select name,age from users
</test:myList>
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。如:
<my:test>
<%=request.getProtocol()%> // ②
</my:test>
具体可参考后面附源码。
empty:空标记,即起始标记和结束标记之间没有内容。
下面几种写法都是有效的,
<test:mytag />
<test:mytag uname="Tom" />
<test:mytag></test:mytag>
scriptless:接受文本、EL和JSP动作。如上述②使用<body-content> scriptless </body-content>则报错,具体可参考后面附源码。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}