日期:2014-05-16  浏览次数:20343 次

编写JSP自定义标签

可以使用JSP自定义标签来实现简单的代码模板.

自定义标签可以通过传统的继承TagSupport或SimpleTagSupport并实现相关方法,然后声明使用tag描述符进行声明.

?

这里要说的是一种更加简单的方式,TagFiles.

Tag File其实就是一个JSP页面,只是把扩展名由.jsp变成了.tag,并放置在指定的目录下.

TagFile中不能使用page指令,作为替代可以使用tag指令,在tag指令中声明pageEncoding来指定文件编码,这尤为重要.

attribute指令用来指定调用tag可以使用的参数.

例如<v:table model="${model}"> ?这里的model就是在TagFile中通过attribute指令进行指定的.

具体的attribute指令如下

?

<%@attribute name="pageInfo" type="com.rmc.web.utils.Pages" rtexprvalue="true" required="true" %>
?

?

这里声明了一个pageInfo属性,并指定了参数的具体类型.rtexprivalue="ture"表明该属性接受EL表达式,false表示不接受.?required="true"表示该属性为必须的,默认值是false.一个简单的TagFile如下

?

<%@tag body-content="empty" pageEncoding="gbk" %>
<%@attribute name="pageInfo" type="com.rmc.web.utils.Pages" rtexprvalue="true" required="true" %>
<script type="text/javascript">
    function toPage(pageNo) {

        document.getElementById("page_no").value = pageNo;
        document.getElementById("form_submit").click();
    }
</script>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
        <td>
            共${pageInfo.allRecords}条&nbsp;<a href="#" onclick="toPage(1)">首页</a>&nbsp;
            <a href="#" onclick="toPage(${pageInfo.cpage}-1)">上一页</a>&nbsp;
            <a href="#" onclick="toPage(${pageInfo.cpage}+1)">下一页</a>&nbsp;
            <a href="#" onclick="toPage(${pageInfo.allPages}+0)">末页</a>&nbsp;${pageInfo.cpage}/${pageInfo.allPages}页&nbsp;&nbsp;&nbsp;
            转到:第&nbsp;<input id="page_no" name="page" type="text" style="width: 26px;"/>&nbsp;页&nbsp;
            每页&nbsp;<input name="pageSize" type="text" value="${pageInfo.pageSize}" style="width: 26px;"/>&nbsp;条&nbsp;
            <input id="form_submit" type="submit" value="GO"/>
        </td>
    </tr>
</table>
?tag指令中有一个body-content参数,取值有三个scriptless(不接受jsp脚本,接受普通文本和EL.这也是默认值),empty(不接受标签体),tagdependent(将标签体视为普通文本).可见表标签体是绝对不接受jsp脚本的,当然使用标签的目的就是为了不直接在jsp中使用脚本.当该参数取值不为empty时,在TagFile中可以使用<jsp:dobody/>引用标签体的内容.

TagFile编写好之后,需要放置在应用的WEB-INF/tags/目录或其子目录下.如果你的TagFile要作为一个库发布,需要将TagFile放置在jar的META-INF/tags/目录或其子目录下,同时还要编写tag描述符(.tld)文件放置在META-INF/TLDs目录下.有关.tld的编写也比较简单只是把TagFile中的各种指令使用xml文件重新声明一次.具体写法就不讨论了,可以参考其他文档.


有了TagFile后,在jsp中引用时想引用JSTL一样,要首先使用taglib指令进行声明.例如
<%@ taglib prefix="v" tagdir="/WEB-INF/tags" %>这里与引用JSTL不同的是将taguri换成了tagdir,其值就是放置TagFile的目录.