Velocity教程

来源:互联网 发布:土猫宠物淘宝怎么样 编辑:程序博客网 时间:2024/05/21 06:22

http://blog.csdn.net/qq_25237663/article/details/52262532

****************************************************************

Velocity是一个基于Java的模板引擎,通过特定的语法,Velocity可以获取在java语言中定义的对象,从而实现界面和java代码的真正分离,这意味着可以使用velocity替代jsp的开发模式了(实际上笔者所在的公司已经这么做了)。这使得前端开发人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点,在实际应用中,velocity还可以应用于很多其他的场景.

1. Velocity的介绍

Velocity是一个基于Java的模板引擎,其提供了一个Context容器,在java代码里面我们可以往容器中存值,然后在vm文件中使用特定的语法获取,这是velocity基本的用法,其与jsp、freemarker并称为三大视图展现技术,相对于jsp而言,velocity对前后端的分离更加彻底:在vm文件中不允许出现java代码,而jsp文件中却可以.

作为一个模块引擎,除了作为前后端分离的MVC展现层,Velocity还有一些其他用途,比如源代码生成、自动email和转换xml等,具体的用法可以参考这篇文章.

2. Velocty的基本用法

在这里我们以一个HelloVelocity作为Velocity的入门实例.首先在官网下载velocity的最新发布包,新建普通java项目,引入其中的velocity-1.7.jar和lib文件夹下的所有jar包即可. 然后分为如下两步:

2.1 初始化Velocity引擎

编写HelloVelocity.java文件如下:

<code class="hljs cpp has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args) {    <span class="hljs-comment">// 初始化模板引擎</span>    VelocityEngine ve = <span class="hljs-keyword">new</span> VelocityEngine();    ve.setProperty(RuntimeConstants.RESOURCE_LOADER, <span class="hljs-string">"classpath"</span>);    ve.setProperty(<span class="hljs-string">"classpath.resource.loader.class"</span>, ClasspathResourceLoader.<span class="hljs-keyword">class</span>.getName());    ve.init();    <span class="hljs-comment">// 获取模板文件</span>    Template t = ve.getTemplate(<span class="hljs-string">"hellovelocity.vm"</span>);    <span class="hljs-comment">// 设置变量</span>    VelocityContext ctx = <span class="hljs-keyword">new</span> VelocityContext();    ctx.put(<span class="hljs-string">"name"</span>, <span class="hljs-string">"Velocity"</span>);    List <span class="hljs-built_in">list</span> = <span class="hljs-keyword">new</span> ArrayList();    <span class="hljs-built_in">list</span>.add(<span class="hljs-string">"1"</span>);    <span class="hljs-built_in">list</span>.add(<span class="hljs-string">"2"</span>);    ctx.put(<span class="hljs-string">"list"</span>, <span class="hljs-built_in">list</span>);    <span class="hljs-comment">// 输出</span>    StringWriter sw = <span class="hljs-keyword">new</span> StringWriter();    t.merge(ctx,sw);    System.out.println(sw.toString());}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul>

首先,我们在代码中初始化了VelocityEngine这个模板引擎,对其设置参数进行初始化,指定使用ClasspathResourceLoader来加载vm文件。然后我们就可以往VelocityContext这个Velocity容器中存放对象了,在vm文件中我们可以取出这些变量,从而进行模板输出.

2.2 编写hellovelocity.vm文件

其中,vm文件放在classpath目录下即可,类加载器会进行加载
hellovelocity.vm文件如下:

<code class="hljs lasso has-numbering"><span class="hljs-variable">#set</span>(<span class="hljs-variable">$greet</span> <span class="hljs-subst">=</span> <span class="hljs-string">'hello'</span>)<span class="hljs-variable">$greet</span> <span class="hljs-variable">$name</span> <span class="hljs-variable">#foreach</span>(<span class="hljs-variable">$i</span> <span class="hljs-keyword">in</span> <span class="hljs-variable">$list</span>)<span class="hljs-variable">$i</span><span class="hljs-variable">#end</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

控制台输出如下:

<code class="hljs  has-numbering">hello Velocity12</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul>

2.3 Velocity的基本语法

本文中只简单的介绍几个Velocity的基本语法,具体可以参考这篇文章

3.1 变量

在Velocity中也有变量的概念,使用$符声明变量,可以声明变量也可以对变量进行赋值(变量是弱类型的)。另外还可以使用$取出在VelocityContext容器中存放的值

<code class="hljs smalltalk has-numbering"><span class="hljs-symbol">#set</span>(<span class="hljs-char">${</span>!name} = <span class="hljs-comment">"velocity"</span>)<span class="hljs-symbol">#set</span>(<span class="hljs-char">${</span>!foo} = <span class="hljs-char">$b</span>ar)<span class="hljs-symbol">#set</span>(<span class="hljs-char">$f</span>oo =“hello”)<span class="hljs-symbol">#set</span>(<span class="hljs-char">$f</span>oo.name = <span class="hljs-char">$b</span>ar.name)<span class="hljs-symbol">#set</span>(<span class="hljs-char">$f</span>oo.name = <span class="hljs-char">$b</span>ar.getName(<span class="hljs-char">$a</span>rg))<span class="hljs-symbol">#set</span>(<span class="hljs-char">$f</span>oo = <span class="hljs-number">123</span>)<span class="hljs-symbol">#set</span>(<span class="hljs-char">$f</span>oo = [“foo”,<span class="hljs-char">$b</span>ar])</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

需要注意,上面代码中 $!{}的写法,使用$vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出,通过使用\$!{}的形式可以将不存在的变量变成空白输出.

3.2 循环

在Velocity中可以使用循环语法遍历集合,语法结构如下:

<code class="hljs lasso has-numbering"><span class="hljs-variable">#foreach</span>(<span class="hljs-variable">$item</span> <span class="hljs-keyword">in</span> <span class="hljs-variable">$list</span>) <span class="hljs-variable">$item</span> <span class="hljs-variable">$velocityCount</span> <span class="hljs-variable">#end</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li></ul>

其中,$item代表遍历的每一项,velocityCount是Velocity提供的用来记录当前循环次数的计数器,默认从1开始计数,可以在velocity.properties文件中修改其初始值

3.3 条件控制语法

在Velocity中可以使用条件语法对流程进行控制

<code class="hljs lasso has-numbering"><span class="hljs-variable">#if</span>(condition)<span class="hljs-attribute">...</span>dosonmething<span class="hljs-attribute">...</span><span class="hljs-variable">#elseif</span>(condition)<span class="hljs-attribute">...</span>dosomething<span class="hljs-attribute">...</span><span class="hljs-variable">#else</span><span class="hljs-attribute">...</span>dosomething<span class="hljs-attribute">...</span><span class="hljs-variable">#end</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

3.4 宏

在Velocity中也有宏的概念,可以将其作为函数来理解,使用#macro声明宏

<code class="hljs vala has-numbering"><span class="hljs-preprocessor">## 声明宏</span><span class="hljs-preprocessor">#macro(sayHello $name)</span>   hello $name<span class="hljs-preprocessor">#end</span><span class="hljs-preprocessor">## 使用宏</span><span class="hljs-preprocessor">#sayHello("NICK")</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

3.5 parse和include指令

在Velocity中可以通过parse或者include指令引入外部vm文件,但是二者存在区别:include指令会将外部文件原样输出,而parse指令会先对其进行解析再输出(即对外部文件中的vm语法解析)

<code class="hljs ruleslanguage has-numbering"><span class="hljs-array">#parse</span>(<span class="hljs-string">"header.vm"</span>)<span class="hljs-array">#include</span>(<span class="hljs-string">"footer.vm"</span>)</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul>

4. 在web项目中使用Velocity

velocity只是一个模板引擎,在web项目中使用Velocity还得添加一个HTTP框架来处理请求和转发,apache提供了velocity-tools,其提供了VelocityViewServlet,也可继承VelocityViewServlet,从而实现自己的HTTP框架
一般都是继承VelocityViewServlet,重写handleRequest方法,在其中存入公共的参数.

通过继承或直接使用VelocityViewServlet,可以在管理的vm文件中获得request、session与application对象,也可以直接获取在这几个域对象中保存的值,获取的顺序与EL表达式获取的顺序类似:
${request} –> ${session} –> ${application}
比如${testArr}获取testArr属性,velocity会在velocity的context中寻找。没找到在request域中找,没找到在session中找.

下面将通过实例的方式讲解如何在web项目中使用Velocity
首先引入velocity-tools及其依赖的相关jar包,然后分为如下4步:

4.1 继承VelocityViewServlet

通过继承VelocityViewServlet重写handleRequest方法,可以自定义转发规则

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyVelocityViewServlet</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">VelocityViewServlet</span> {</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">protected</span> Template <span class="hljs-title">handleRequest</span>(HttpServletRequest request, HttpServletResponse response, Context ctx) {        <span class="hljs-comment">// 往Context容器存放变量</span>        ctx.put(<span class="hljs-string">"fullName"</span>,<span class="hljs-string">"lixiaolin"</span>);        <span class="hljs-comment">// 也可以往request域中存值</span>        request.setAttribute(<span class="hljs-string">"anotherName"</span>,<span class="hljs-string">"xlli"</span>);        <span class="hljs-comment">// forward到指定模板</span>        <span class="hljs-keyword">return</span> getTemplate(<span class="hljs-string">"test.vm"</span>);    }}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

4.2 配置web.xml

对自定义的VelocityViewServlet配置就像配置普通的Servlet一样,如下:

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">servlet</span>></span>    <span class="hljs-tag"><<span class="hljs-title">servlet-name</span>></span>MyVelocityServlet<span class="hljs-tag"></<span class="hljs-title">servlet-name</span>></span>    <span class="hljs-tag"><<span class="hljs-title">servlet-class</span>></span>com.lxl.velocity.MyVelocityViewServlet<span class="hljs-tag"></<span class="hljs-title">servlet-class</span>></span><span class="hljs-tag"></<span class="hljs-title">servlet</span>></span><span class="hljs-tag"><<span class="hljs-title">servlet-mapping</span>></span>    <span class="hljs-tag"><<span class="hljs-title">servlet-name</span>></span>MyVelocityServlet<span class="hljs-tag"></<span class="hljs-title">servlet-name</span>></span>    <span class="hljs-tag"><<span class="hljs-title">url-pattern</span>></span>/servlet/myVelocityServlet<span class="hljs-tag"></<span class="hljs-title">url-pattern</span>></span><span class="hljs-tag"></<span class="hljs-title">servlet-mapping</span>></span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>

4.3 编写vm文件

vm文件是作为jsp的替代来展示给用户,在vm文件中可以获得在Context域或request等域中存放的值。默认情况下,会在资源根路径下搜索vm文件,所以直接将vm放在根路径下即可(也可以通过配置velocity.properties指定加载路径)
如下:

<code class="hljs xml has-numbering">#set($greet = "hello")<span class="hljs-doctype"><!doctype html></span><span class="hljs-tag"><<span class="hljs-title">html</span> <span class="hljs-attribute">lang</span>=<span class="hljs-value">"en"</span>></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span>    <span class="hljs-tag"><<span class="hljs-title">meta</span> <span class="hljs-attribute">charset</span>=<span class="hljs-value">"UTF-8"</span>></span>    <span class="hljs-tag"><<span class="hljs-title">title</span>></span>Document<span class="hljs-tag"></<span class="hljs-title">title</span>></span><span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">p</span>></span>$!{greet} $!{fullName}<span class="hljs-tag"></<span class="hljs-title">p</span>></span> <span class="hljs-tag"><<span class="hljs-title">p</span>></span>my another name is $!{anotherName}<span class="hljs-tag"></<span class="hljs-title">p</span>></span><span class="hljs-tag"></<span class="hljs-title">body</span>></span><span class="hljs-tag"></<span class="hljs-title">html</span>></span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

4.4 配置velocity.properties

通过配置velocity.properties文件,可以自定义vm文件加载方式,指定编码等。当然,也可以不配置velocity.properties,使用缺省的值即可.

<code class="hljs avrasm has-numbering"><span class="hljs-preprocessor">## 设置模板文件加载器,webapp从应用根目录加载</span>resource<span class="hljs-preprocessor">.loader</span> = webappwebapp<span class="hljs-preprocessor">.resource</span><span class="hljs-preprocessor">.loader</span><span class="hljs-preprocessor">.class</span> = org<span class="hljs-preprocessor">.apache</span><span class="hljs-preprocessor">.velocity</span><span class="hljs-preprocessor">.tools</span><span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.WebappResourceLoader</span><span class="hljs-preprocessor">## 模板路径,根目录下的vm文件夹</span>webapp<span class="hljs-preprocessor">.resource</span><span class="hljs-preprocessor">.loader</span><span class="hljs-preprocessor">.path</span> = /vm<span class="hljs-preprocessor">## 设置编码</span>input<span class="hljs-preprocessor">.encoding</span> = UTF-<span class="hljs-number">8</span>output<span class="hljs-preprocessor">.encoding</span> = UTF-<span class="hljs-number">8</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>

最后,在浏览器中访问http://localhost:8080/VelocityApp/servlet/myVelocityServlet即可

5. 使用VelocityLayoutServlet

在web站点开发的过程中,经常会碰到几个页面的布局大致相同,比如引用相同的头部和尾部、左侧边栏相同等,在使用jsp开发时我们可以将头部等公共文件抽离出来,然后在实际页面中引入。Velocity也提供了类似的功能,并且该功能更加强大.

apache提供了VelocityLayoutServlet来实现页面布局,它是VelocityViewServlet的子类,通过使用VelocityLayoutServlet可以简化velocity下页面布局开发,可以使当forward到一个vm页面时,把该页面作为一个已有页面布局的一部分整体显示出来,比如访问资料页面,能够自动把头、尾部显示出来

velocity-tools包中已经包含了这个类,其使用分为如下几步:

5.1 配置velocity.properties

在/WEB-INF/路径下配置velocity.properties文件,指定模板布局文件的位置

<code class="hljs avrasm has-numbering">input<span class="hljs-preprocessor">.encoding</span>=UTF-<span class="hljs-number">8</span>output<span class="hljs-preprocessor">.encoding</span>=UTF-<span class="hljs-number">8</span><span class="hljs-preprocessor">## 定义加载器</span>resource<span class="hljs-preprocessor">.loader</span>=webappwebapp<span class="hljs-preprocessor">.resource</span><span class="hljs-preprocessor">.loader</span><span class="hljs-preprocessor">.cache</span>=false<span class="hljs-preprocessor">## 布局文件夹位置</span>tools<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.servlet</span><span class="hljs-preprocessor">.layout</span><span class="hljs-preprocessor">.directory</span> = /templates/layout<span class="hljs-preprocessor">## 定义默认布局文件</span>tools<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.servlet</span><span class="hljs-preprocessor">.layout</span><span class="hljs-preprocessor">.default</span><span class="hljs-preprocessor">.template</span> = layout<span class="hljs-preprocessor">.vm</span><span class="hljs-preprocessor">## 错误模板文件</span>tools<span class="hljs-preprocessor">.view</span><span class="hljs-preprocessor">.servlet</span><span class="hljs-preprocessor">.error</span><span class="hljs-preprocessor">.template</span> = err<span class="hljs-preprocessor">.vm</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

5.2 布局母版vm文件

布局layout.vm文件是所有要展示的vm文件的母版,如下所示:

<code class="hljs xml has-numbering"><span class="hljs-doctype"><!doctype html></span><span class="hljs-tag"><<span class="hljs-title">html</span> <span class="hljs-attribute">lang</span>=<span class="hljs-value">"en"</span>></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span>    <span class="hljs-tag"><<span class="hljs-title">meta</span> <span class="hljs-attribute">charset</span>=<span class="hljs-value">"UTF-8"</span>></span>    <span class="hljs-tag"><<span class="hljs-title">title</span>></span>${page_title}<span class="hljs-tag"></<span class="hljs-title">title</span>></span>#if($!{CSS}) #foreach($_css in ${CSS})   <span class="hljs-tag"><<span class="hljs-title">link</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/css"</span> <span class="hljs-attribute">rel</span>=<span class="hljs-value">"stylesheet"</span> <span class="hljs-attribute">href</span>=<span class="hljs-value">"${ContextPath}/$_css"</span>></span> #end#end<span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="hljs-tag"><<span class="hljs-title">body</span>></span>  <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"header"</span>></span>      #parse("/templates/layout/header.vm")  <span class="hljs-tag"></<span class="hljs-title">div</span>></span>  <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"container"</span>></span>      <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"sub"</span>></span>          #parse($sub)      <span class="hljs-tag"></<span class="hljs-title">div</span>></span>      <span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"main"</span>></span>          $screen_content      <span class="hljs-tag"></<span class="hljs-title">div</span>></span>  <span class="hljs-tag"></<span class="hljs-title">div</span>></span>#if($!JS) #foreach($_js in $JS)   <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/javascript"</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">"${CntextPath}/${_js}"</span>></span><span class="javascript"> #end#end<<span class="hljs-regexp">/body></</span>html></span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li></ul>

其中,有个特殊的变量 screen_content,这是Velocity内置的变量,代表将要转发的页面

5.3 编写转发的vm文件

<code class="hljs smalltalk has-numbering"><span class="hljs-symbol">#set</span>(<span class="hljs-char">$l</span>ayout = <span class="hljs-comment">"/templates/layout/layout.vm"</span>)<span class="hljs-symbol">#set</span>(<span class="hljs-char">$C</span>SS = [<span class="hljs-comment">"scripts/css/index.css"</span>])<span class="hljs-symbol">#set</span>(<span class="hljs-char">$J</span>S = [<span class="hljs-comment">"scripts/js/jquery-1.11.3.js"</span>])<span class="hljs-symbol">#set</span>(<span class="hljs-char">$p</span>age_title = <span class="hljs-comment">"主页"</span>)<span class="hljs-symbol">#set</span>(<span class="hljs-char">$s</span>ub = <span class="hljs-comment">"/templates/sub.vm"</span>)<div id=<span class="hljs-comment">"main-show"</span>>    this is main-show</div></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

5.4 继承VelocityLayoutServlet

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyLayoutServlet</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">VelocityLayoutServlet</span> {</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doRequest</span>(HttpServletRequest request, HttpServletResponse response) <span class="hljs-keyword">throws</span> IOException {        <span class="hljs-comment">// 设置通用的变量</span>        request.setAttribute(<span class="hljs-string">"Request"</span>, request);        request.setAttribute(<span class="hljs-string">"ContextPath"</span>, request.getContextPath());        request.setAttribute(<span class="hljs-string">"BasePath"</span>, request.getScheme() + <span class="hljs-string">"://"</span> + request.getServerName() + <span class="hljs-string">":"</span> + request.getServerPort() + request.getContextPath());        <span class="hljs-keyword">long</span> runtime = System.currentTimeMillis();        <span class="hljs-keyword">super</span>.doRequest(request, response);        <span class="hljs-keyword">if</span> (request.getAttribute(<span class="hljs-string">"close_comment"</span>) == <span class="hljs-keyword">null</span>) {            Date cur_time = Calendar.getInstance(request.getLocale()).getTime();            PrintWriter pw = response.getWriter();            pw.print(<span class="hljs-string">"\r\n<!-- Generated by VelocityApp Server("</span>);            pw.print(cur_time);            pw.print(<span class="hljs-string">") Cost "</span>);            pw.print(cur_time.getTime() - runtime);            pw.print(<span class="hljs-string">" ms -->"</span>);            pw.flush();            pw.close();        }    }}</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul>

6. 附录及参考文献

参考文献
* 使用 Velocity 模板引擎快速生成代码
* Velocity教程

本文中的完整代码可在github上下载.
你可以通过jslinxiaoli@foxmail.com联系我.
欢迎在github或者知乎上关注我 ^_^.
也可以访问个人网站: https://jslixiaolin.github.io


0 0
原创粉丝点击