可以使用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}条 <a href="#" οnclick="toPage(1)">首页</a>
<a href="#" οnclick="toPage(${pageInfo.cpage}-1)">上一页</a>
<a href="#" οnclick="toPage(${pageInfo.cpage}+1)">下一页</a>
<a href="#" οnclick="toPage(${pageInfo.allPages}+0)">末页</a> ${pageInfo.cpage}/${pageInfo.allPages}页
转到:第 <input id="page_no" name="page" type="text" style="width: 26px;"/> 页
每页 <input name="pageSize" type="text" value="${pageInfo.pageSize}" style="width: 26px;"/> 条
<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的目录.