JSP自定义标签

xu.wang

发布于 2018.04.16 13:58 阅读 2520 评论 0

自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。

菜鸟教程链接:http://www.runoob.com/jsp/jsp-custom-tags.html

菜鸟教程的自定义标签部分,只说明了一种方法,并不适用于我的系统,所以下面记录下另外一种方法。

项目采用 Spring + Spring MVC  + Mybatis 框架。

 

适用自定义标签需要新增/修改个地方。

1. 新增一个TAG的类

用来实现自定义标签以及编写业务代码。我这里新建一个名为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);
    }
}

2. 新建  .tld文件

新建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>

3. 在jsp中添加自定义标签

 

<%--引入自定义标签--%>
<%@ 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>标签解释:

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>则报错,具体可参考后面附源码。