页面常见标签库
内容标签基于 JSP Tag Files 实现。相关教程请参阅《JSP Tag Files 技术总结》。使用前,请把源码目录下的 /tags_v2 通过 Eclipse 的 link file 关联到当前项目的 /WEB-INF/tags(也就是导入标签库的过程),这个 /WEB-INF/tags 位置不能修改;然后重命名 tags_v2 为 public(推荐 public,可修改),于是,引用头便是:
<%@taglib prefix="commonTag" tagdir="/WEB-INF/tags/common"%>
<commonTag:head />
或者定义你自己的 body
<commonTag:head>
<link rel="stylesheet" href="asset/web/metinfo.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui" />
</commonTag:head>
上例子调用了 HTML head 标签。下述 page.tag 依赖此上述 head 头文件,封装了常见的标签。
遍历导航
列出配置文件中的导航,也就是一级菜单。下面分别是遍历一级菜单和二级菜单。
<%@taglib prefix="commonTag" tagdir="/WEB-INF/tags/common"%>
<commonTag:page type="navMenu" />
<commonTag:page type="secondLevelMenu" />
当然,这是封装好的 markup。如果你的 HTML 自定义程度比较高,可以不用上述标签,转为自己写 HTML + JSTL。
标签库在 ajaxjs-web 模块下的 WEB-INF\tags\common\page.tag 中。自定义标签 page.tag 整合了多个常见的 HTML 片断,例如导航、页脚之类的,通过 Tag Files 的属性指定哪个片断(type=XXX)。例如 type=navMenu 则指定引入导航片断,具体被导入如下代码
<%-- 导航 --%>
<c:if test="${type == 'navMenu'}">
<ul>
<li><a href="${pageContext.request.contextPath}/">首页</a></li>
<c:foreach items="${PageNode.navBar}" var="menu">
<li ${PageNode.isCurrentNode(menu) ? ' class="selected"' : ''}>
<a href="${pageContext.request.contextPath}/${menu.id}/">${menu.name}</a>
</li>
</c:foreach>
</ul>
</c:if>
可见,如果在当前页面则会高亮显示,加上 class="selected" 样式类。PageNode.isCurrentNode(menu) 是 EL 表达式调用 Java 方法的写法,这里调用 isCurrentNode 方法(Java 实例方法、静态方法均可)。
EL 表达式中的 PageNode 对象是哪里的呢?怎么传进来的呢?从最根源开始说就是…… WEB-INF 里面的 web.xml,加入一个监听器
<!-- 是否启动 JSON 作为网站结构 -->
<listener>
<listener-class>com.ajaxjs.app.NodeListener</listener-class>
</listener>
<!-- // 是否启动 JSON 作为网站结构 -->
每次请求都会调用 com.ajaxjs.app.NodeListener,该类实现了 javax.servlet.ServletRequestListener 接口。每次请求 request 都会保存 NodeProcessor 对象,即 request.setAttribute("PageNode", new NodeProcessor(request.getContextPath(), uri));。上述 PageNode.isCurrentNode(menu) 就是调用 com.ajaxjs.app.NodeProcessor.isCurrentNode(Map<String, ?> node) 方法。URI 位置
报告页面位置
<commonTag:page type="anchor" />
分页控件
变量 PageResult 须为 com.ajaxjs.jdbc.PageResultcom.ajaxjs.jdbc.PageResult 类型。
<commonTag:page type="page" pageInfo="${PageResult}"/>
页面小控件
<commonTag:page type="page" />
<div style="padding:20px 0;" align="right">
<!-- 分享功能 -->
<commonTag:widget type="share" />
<!-- 调整页面字号 -->
<commonTag:widget type="adjustFontSize" />
</div>
调整页面字号只对页面 <article> <p> 标签有效。
相邻的两笔记录
相邻的两笔记录,需要 neighborRecord 变量。
<commonTag:page type="neighborRecord" />
Tag 的一个限制是标签内不允许再有<%.. Java..%> 语句。对此做法的是把欲输出内容定义在 request 对象中。
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="tags" tagdir="/WEB-INF/tags/"%>
<%
request.setAttribute("html", com.ajaxjs.app.App.jsRuntime.eval("JSON_Tree.util.makeSiteMap(bf.AppStru.data, 'aa')"));
%>
<tags:content>
<jsp:attribute name="body">
${html}
</jsp:attribute>
</tags:content>