一、从VelocityViewServlet到VelocityLayoutServlet

使用Velocity开发web应用时,需要在web.xml中配置一个Velocity提供的VelocityViewServlet接受处理对velocity模板(即vm文件)的forward访问。VelocityViewServlet负责将设置在request中的attribute“读出”和模板文件进行merge形成最终的页面,向response输出显示在用户电脑上。

VelocityViewServlet是一个简单的易使用的。但是只要把web.xml中VelocityViewServlet换成VelocityLayoutServlet,并配置上2,3句话,将具有页面简单Layout的功能。而这个功能其实非常强大。

二、VelocityLayoutServlet可以。。。

VelocityLayoutServlet可以用来简化velocity下的页面布局开发。 
使用VelocityLayoutServlet,可以使当forward到一个页面时,能把自动把该页面作为一个页面布局的一部分整体显示出来。比如访问用户资料页面,能够自动把网站的头,尾等自动也输出显示处理。

三、VelocityLayoutServlet使用按步就班

系统中有若干页面布局是这样设定的:头部(header),左侧菜单区域(sub),中右侧页面内容部(main),底部(footer)。

1、

创建文件[webapp home]/vm/layout/layout.vm如下:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  3. <head>
  4. ...省略...
  5. </head>
  6. <body>
  7. <div id="header>#parse('vm/layout/header.vm')</div>
  8. <div id="content">
  9. <div id="sub">#parse($sub)</div>
  10. <div id="main">$screen_content</div>
  11. </div>
  12. <div id="footer">#parse('vm/layout/footer.vm')</div>
  13. </body>
  14. </html>

$screen_content相当于一个占位符,被forward的目标页面内容将替代该处内容。 
#parse($sub):表示sub位置是可以动态通过$sub变量设置的。

同时也创建'vm/layout/footer.vm''vm/layout/header.vm'这两个文件。

2、 
创建WEB-INF/vm/user/profile.vm如下:(假设该页面用于显示用户的资料信息)

  1. #set($layout = "layout.vm")
  2. #set($sub= "vm/user/sub.vm" )
  3. A: What's your name?<br>
  4. B: My name is $user.loginName!

注意,这个文件和普通我vm不一样的地方在于前两句话。 
第一句话设置这个页面使用哪个布局器。 
第二句话设置sub的值,用于布局把vm/user/sub.vm文件包含进来。

同时也创建"vm/user/sub.vm"文件

3、配置velocity.properites文件

使用velocity一般都是需要配置velocity.properites的,至少应该设置input.encoding和output.encoding等。在这个文件中增加设置如下代码:

  1. # Directory for layout templates,
  2. #  relative to web application root directory
  3. tools.view.servlet.layout.directory = vm/layout/
  4. # Filepath of the default layout template
  5. #  relative to the layout directory
  6. #  !!!!!哥们要注意这行提示:NOT relative to the root directory of the webapp!!!!
  7. tools.view.servlet.layout.default.template =  layout.vm

4、确定web.xml配置和下面的差不多如下(主要是配置VelocityLayoutServlet,而非VelocityViewServlet):

  1. <servlet>
  2. <servlet-name>velocity</servlet-name>
  3. <servlet-class>
  4. org.apache.velocity.tools.view.servlet.VelocityLayoutServlet
  5. </servlet-class>
  6. <init-param>
  7. <param-name>org.apache.velocity.toolbox</param-name>
  8. <param-value>/WEB-INF/toolbox.xml</param-value>
  9. </init-param>
  10. <init-param>
  11. <param-name>org.apache.velocity.properties</param-name>
  12. <param-value>/WEB-INF/velocity.properties</param-value>
  13. </init-param>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>velocity</servlet-name>
  17. <url-pattern>*.vm</url-pattern>
  18. </servlet-mapping>

5、运行服务器吧, 
a) 访问http://www.xxx.com/vm/user/profile.vm 看看效果。

b) 回到vm/user/profile.vm文件,把#set($layout = "layout.vm")去掉 看看效果。

效果比较: 
加上$layout设置的profile.vm文件,浏览该页面时,将自动把该页面变成布局的一部分,把header.vm,sub.vm,footer.vm也输出出来;去掉$layout设置后浏览时,只是输出该页面,不会将header.vm,sub.vm,footer.vm输出出来。

这种功能在调试和编写时非常方便。

以后每增加一个新的页面时,只要在第一行设置了$layout指向一个布局模板便可(注意布局模板的路径,第3步已经做了提示),便可以轻松具有简单的布局功能了

6、后语:

一直想着自己实现一个类似的功能,最后再仔细看看Velocity官方网站时才发现velocity已经有了。我觉得挺好的,很符合我的需求。

所以,如果你使用或即将使用Velocity开发系统,强烈推荐使用layout功能。

Velocity的layout功能的更多相关文章

  1. 电容与EMC-电容不同功能时对整板EMC的作用

    一般我们的pcb板的器件有很多种类,但是值得特别关注的,很多人都会说是BGA.接口.IC.晶振之类,因为这些都是layout功能模块以及设计难点.然而数量上占绝对优势的器件却是阻容器件,之前围殴阻抗时 ...

  2. [Xamarin] 使用LayoutInflater.Inflate載入預先設計好的Layout並使用 (转帖)

    開發的時候,一定會把一些東西設計成元件,並且可以多次使用,今天紀錄一篇比較簡單的方法,可以載入事先做好的Layout 並且給予事件 介紹一下範例: Main.axml: <?xml versio ...

  3. 《Velocity java开发指南》中文版(上)转载

    文章引自:http://sakyone.iteye.com/blog/524289 1.开始入门 Velocity是一基于java语言的模板引擎,使用这个简单.功能强大的开发工具,可以很容易的将数据对 ...

  4. iOS6 自动布局 入门–Auto Layout(转)

    iOS6 自动布局 入门–Auto Layout(转) 标签: 杂谈   目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会 ...

  5. logback:logback和slf4j中的:appender、logger、encoder、layout

    (1)appender 1.appender标签是logback配置文件中重要的组件之一.在logback配置文件中使用appender标签进行定义.可 以包含0个或多个appender标签. 2.a ...

  6. iOS6 自动布局 入门–Auto Layout

    目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会发生了-对于iPhone与iPad IOS6 带来了一个非常了不起的特征: ...

  7. salesforce零基础学习(九十四)classic下pagelayout引入的vf page弹出内容更新此page layout

    我们在classic环境中,有时针对page layout不能实现的地方,可以引入 一个vf page去增强标准的 page layout 功能,有时可能要求这个 vf page的部分修改需要更新此 ...

  8. *关于httl开源Java模板的使用心得

    1.简介 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. ...

  9. 使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)

    对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. Sa ...

随机推荐

  1. Android 主线程和子线程通信问题

        Android 如今不支持View在子线程中创建及调用其方法.假设要实现子线程内容更新之后.将结果及时反馈到主线程中,该怎样出来呢?     能够在主线程中创建Handler来实现. 这样子线 ...

  2. PHP网站在Linux服务器上面的安全配置

    本文详细总结了PHP网站在Linux服务器上面的安全配置,包含PHP安全.mysql数据库安全.web服务器安全.木马查杀和防范等,很好很强大很安全. PHP安全配置 1. 确保运行php的用户为一般 ...

  3. Apache Shiro 使用手册(五)Shiro 配置说明(转发:http://kdboy.iteye.com/blog/1169637)

    Apache Shiro的配置主要分为四部分: 对象和属性的定义与配置 URL的过滤器配置 静态用户配置 静态角色配置 其中,由于用户.角色一般由后台进行操作的动态数据,因此Shiro配置一般仅包含前 ...

  4. 3.07课·········if分支语句

    语句分类:顺序语句,选择语句(分支语句),循环语句 分支语句:(一)if(表达式) //表达式返回值是True或False{}说明:1.表达式返回的是bool值:2.小括号和花括号后面不需要加分号. ...

  5. iOS swift 常量 && 宏定义

    全局常量 在C和Objective-C语言源文件中定义的全局常量会自动地被Swift编译引进并做为Swift的全局常量. 预处理指令 Swift编译器不包含预处理器.取而代之的是,它充分利用了编译时属 ...

  6. 0425 os模块 ,模块和包

    os模块 *os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd o ...

  7. hiho一下 第二十九周 最小生成树三·堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】

    题目1 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生 ...

  8. HDU 找到唯一的冠军

                             产生冠军 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  9. mysql日志总结

    1.mysql慢查询设置 log-slow-queries=/alidata/mysql-log/mysql-slow.loglong_query_time = 1log-queries-not-us ...

  10. 51nod 1681

    题目 神犇题解 这题挺神的..思路很巧妙 首先想到DFS序(毕竟是子树问题),这道题可以转化成:我们对于每一个节点的子树区间去看,两棵树同一节点的这个子树区间有多少个相同元素,设个数为x,那么这个点的 ...