Velocity 是一个基于 Java 的模板引擎,它提供了简单的基于模板的语言,可以用类似脚本的方式引用对象。Velocity 促进了分离团队成员之间的责任:允许 Web 设计人员专注于视图(即页面的观感),而 Java 程序员专注于后端代码。把 Java 代码从页面布局中分离出来,会让 Web 应用程序未来更易维护。当 Velocity 与 Sruts 这样的 MVC 框架结合时,就成了 JSP 或 PHP 可行的替代。
特点:
模板引擎中最强大、使用最频繁的功能之一是它通过内建的映像(Reflection)引擎查找对象信息的能力。这个映像引擎允许用一种方便的Java“.”类似的操作符,提取任意加入到VelocityContext的对象的任何公用方法的值,或对象的任意数据成员。
作用:
1.允许我们在模版中设定变量,然后在运行时,动态的将数据插入到模版中,替换这些变量。
2.有用来比较和迭代的内建指令,通过这些指令我们可以完成程序语言中的条件判断语句和循环语句等
3.模板引擎最常见的用途是处理HTMLWeb内容。但我还用模板引擎生成过SQL、email、XML甚至Java源代码。
struts-menu与velocity三级菜单的实现:
vm文件:
#macro( displaySingleMenu $menu )
#if ($displayer.isAllowed($menu))
#set ($title = $displayer.getMessage($menu.title))
#if (!$menu.url) #set ($url="javascript:void(0)") #else #set ($url=$menu.url) #end
<li class="#if ($menu.name == $currentMenu)active#end">
<a href="$url" title="$title" #if($menu.target)target="$menu.target" #end#if($menu.width)style="width: ${menu.width}px"#end>${title}</a>
</li>
#end
#end
#macro( displayDropDownMenu $menu)
#if ($displayer.isAllowed($menu))
#set ($title = $displayer.getMessage($menu.title))
#if (!$menu.url) #set ($url="javascript:void(0)") #else #set ($url=$menu.url) #end
#set($vaildcount = 0)
#foreach ($menuIt in $menu.components)
#if($displayer.isAllowed($menuIt))
#set($vaildcount = 1)
#end
#end
#if($vaildcount == 1)
<li class="dropdown">
<a href="$url" title="$title" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">${title}<span class="caret"></span></a>
<ul class="dropdown-menu">
#foreach ($menuIt in $menu.components)
#if ($menuIt.components.size() == 0)
#displaySingleMenu($menuIt)
#else
#displayDropDownSubMenu($menuIt)
#end
#end
</ul>
</li>
#else
#displaySingleMenu($menu)
#end
#end
#end
#macro( displayDropDownSubMenu $menu)
#if ($displayer.isAllowed($menu))
#set ($title = $displayer.getMessage($menu.title))
#if (!$menu.url) #set ($url="javascript:void(0)") #else #set ($url=$menu.url) #end
#if ($menu.components.size() == 0)
#displaySingleMenu($menu)
#else
<li class="dropdown-submenu"><a href="$url" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">${title}</a>
<ul class="dropdown-menu" role="menu">
#foreach ($menuIt in $menu.components)
#if ($menuIt.components.size() == 0)
#displaySingleMenu($menuIt)
#else
#displayDropDownSubMenu($menuIt)
#end
#end
</ul>
</li>
#end
#end
#end
#macro( displayCssMenu $menu )
#if ($displayer.isAllowed($menu))
## create a single menu item
#if ($menu.components.size() == 0)
#displaySingleMenu($menu)
#else
## create multiple menu items in a menu
#displayDropDownMenu($menu)
#end
#end
#end
#displayCssMenu($menu)
jsp页面:
<%@ include file="/common/taglibs.jsp"%>
<menu:useMenuDisplayer name="Velocity" config="navbarMenu.vm" permissions="rolesAdapter">
<div class="nav-collapse collapse">
<ul class="nav">
<c:if test="${empty pageContext.request.remoteUser}">
<li class="active">
<a href="<c:url value="/login"/>"><fmt:message key="login.title"/></a>
</li>
</c:if>
<menu:displayMenu name="MainMenu"/>
<menu:displayMenu name="UserMenu"/>
<menu:displayMenu name="AdminMenu"/>
</ul>
</div>
</menu:useMenuDisplayer>
<?xml version="1.0" encoding="UTF-8"?>
<MenuConfig>
<Displayers>
<Displayer name="Velocity" type="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
</Displayers>
<Menus>
<Menu name="MainMenu" title="mainMenu.title" page="/mainMenu" roles="ROLE_ADMIN,ROLE_USER"/>
<Menu name="UserMenu" title="menu.user" description="User Menu" page="/userform" roles="ROLE_ADMIN,ROLE_USER"/>
<Menu name="AdminMenu" title="menu.admin" description="Admin Menu" roles="ROLE_ADMIN" page="/admin/users">
<Item name="ViewUsers" title="menu.admin.users" page="/admin/users"/>
<Item name="ActiveUsers" title="mainMenu.activeUsers" page="/admin/activeUsers"/>
<Item name="ReloadContext" title="menu.admin.reload" page="/admin/reload"/>
<Item name="FileUpload" title="menu.selectFile" page="/fileupload"/>
</Menu>
</Menus>
</MenuConfig>