velocity模板引擎学习(2)-velocity tools 2.0

使用velocity后,原来的很多标签无法使用了,必须借助velocity tools来完成,目前velocity tools最新版本是2.0,下面是velocity tools的一些注意事项:

1. 与Spring MVC 3.x/4.x的集成问题

Spring 3.x/4.x只支持1.3.x的velocity tools,要使用2.0必须自己扩展VelocityToolboxView类

 1 package org.springframework.web.servlet.view.velocity;
 2
 3 import java.util.Map;
 4
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7
 8 import org.apache.velocity.context.Context;
 9 import org.apache.velocity.tools.Scope;
10 import org.apache.velocity.tools.ToolManager;
11 import org.apache.velocity.tools.view.ViewToolContext;
12 import org.springframework.web.servlet.view.velocity.VelocityToolboxView;
13
14 public class VelocityToolbox2View extends VelocityToolboxView {
15     @Override
16     protected Context createVelocityContext(Map<String, Object> model,
17             HttpServletRequest request, HttpServletResponse response)
18             throws Exception {// Create a
19                                 // ChainedContext
20                                 // instance.
21         ViewToolContext ctx;
22
23         ctx = new ViewToolContext(getVelocityEngine(), request, response,
24                 getServletContext());
25
26         ctx.putAll(model);
27
28         if (this.getToolboxConfigLocation() != null) {
29             ToolManager tm = new ToolManager();
30             tm.setVelocityEngine(getVelocityEngine());
31             tm.configure(getServletContext().getRealPath(
32                     getToolboxConfigLocation()));
33             if (tm.getToolboxFactory().hasTools(Scope.REQUEST)) {
34                 ctx.addToolbox(tm.getToolboxFactory().createToolbox(
35                         Scope.REQUEST));
36             }
37             if (tm.getToolboxFactory().hasTools(Scope.APPLICATION)) {
38                 ctx.addToolbox(tm.getToolboxFactory().createToolbox(
39                         Scope.APPLICATION));
40             }
41             if (tm.getToolboxFactory().hasTools(Scope.SESSION)) {
42                 ctx.addToolbox(tm.getToolboxFactory().createToolbox(
43                         Scope.SESSION));
44             }
45         }
46         return ctx;
47     }
48 }

View Code

注:31行tm.configure(getServletContext().getRealPath(getToolboxConfigLocation()));这里,在某些容器,比如weblogic中,getRealPath可能取不到值,可改成

getResource试试

 

然后在spring mvc的servlet配置文件中参考如下设置:

 1 <bean
 2                     class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
 3                     <property name="order" value="0" />
 4                     <property name="cache" value="true" />
 5                     <property name="prefix" value="" />
 6                     <property name="suffix" value=".vm" />
 7                     <property name="toolboxConfigLocation" value="/WEB-INF/toolbox.xml" />
 8                     <property name="contentType" value="text/html;charset=UTF-8" />
 9                     <property name="viewClass" value="org.springframework.web.servlet.view.velocity.VelocityToolbox2View"></property>
10                 </bean>

View Code

 

2. 如何获取当前应用的contextPath

1     <tool>
2         <key>link</key>
3         <scope>request</scope>
4         <class>org.apache.velocity.tools.view.LinkTool</class>
5     </tool>

借助velocity-tools的LinkTool类,在velocity中直接用${link.contextPath}即可得到当前的contextPath

 

3、如何获取url参数

1     <tool>
2         <key>params</key>
3         <scope>request</scope>
4         <class>org.apache.velocity.tools.view.ParameterTool</class>
5     </tool>

然后就可以用类似$params.returnUrl,来获取类似 http://xxx.com/login?returnUrl=abc 中的 abc部分

 

4、如何与Spring-Security集成

1 <sec:authorize access="isAnonymous()">
2 ...
3     </sec:authorize>

View Code

之类的标签无法在velocity中使用,而velocity-tools中也未提供相应的支持,在老外的一篇博客上,看到了解决方案:

 1 package com.cnblogs.yjmyzz.utils;
 2
 3 import java.util.Collection;
 4 import java.util.HashSet;
 5 import java.util.Set;
 6 import org.springframework.security.core.GrantedAuthority;
 7 import org.springframework.security.core.context.SecurityContextHolder;
 8 import org.springframework.security.core.userdetails.UserDetails;
 9
10 public class VelocitySecurityUtil {
11
12     public static String getPrincipal() {
13
14         Object obj = SecurityContextHolder.getContext().getAuthentication()
15                 .getPrincipal();
16
17         if (obj instanceof UserDetails) {
18             return ((UserDetails) obj).getUsername();
19         } else {
20             return "anonymous";
21         }
22     }
23
24     public static boolean isAuthenticated() {
25         return !getPrincipal().equals("anonymous");
26     }
27
28     public static boolean allGranted(String[] checkForAuths) {
29         Set<String> userAuths = getUserAuthorities();
30         for (String auth : checkForAuths) {
31             if (userAuths.contains(auth))
32                 continue;
33             return false;
34         }
35         return true;
36     }
37
38     public static boolean anyGranted(String[] checkForAuths) {
39         Set<String> userAuths = getUserAuthorities();
40         for (String auth : checkForAuths) {
41             if (userAuths.contains(auth))
42                 return true;
43         }
44         return false;
45     }
46
47     public static boolean noneGranted(String[] checkForAuths) {
48         Set<String> userAuths = getUserAuthorities();
49         for (String auth : checkForAuths) {
50             if (userAuths.contains(auth))
51                 return false;
52         }
53         return true;
54     }
55
56     private static Set<String> getUserAuthorities() {
57         Object obj = SecurityContextHolder.getContext().getAuthentication()
58                 .getPrincipal();
59         Set<String> roles = new HashSet<String>();
60         if (obj instanceof UserDetails) {
61             @SuppressWarnings("unchecked")
62             Collection<GrantedAuthority> gas = (Collection<GrantedAuthority>) ((UserDetails) obj)
63                     .getAuthorities();
64             for (GrantedAuthority ga : gas) {
65                 roles.add(ga.getAuthority());
66             }
67         }
68         return roles;
69     }
70
71 }

View Code

然后修改配置:

 1     <bean id="velocitySecurityUtil" class="com.cnblogs.yjmyzz.utils.VelocitySecurityUtil" />
 2
 3     <bean
 4         class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 5         <property name="order" value="1" />
 6         ...
 7         <property name="viewResolvers">
 8             <list>
 9                 <bean
10                     class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
11                     <property name="order" value="0" />
12                     ...
13                     <property name="attributesMap">
14                         <map>
15                             <entry key="sec">
16                                 <ref bean="velocitySecurityUtil" />
17                             </entry>
18                         </map>
19                     </property>
20
21                 </bean>
22                 ...

View Code

页面就能用了:

1     #if(${sec.authenticated})
2     ...
3     #end

View Code

注:这个思路也可以用于实现自己的Velocity-Tools类,比如我们创建了一个自己的RequestUtil类

 1 package com.cnblogs.yjmyzz.utils;
 2 import javax.servlet.http.HttpServletRequest;
 3 public class RequestUtil{
 4
 5     /**
 6      * 获取当前请求的基地址(例如:http://localhost:8080/ctas/xxx.do 返回 http://localhost:8080/ctas/)
 7      *
 8      * @param request
 9      * @return
10      */
11     public static String getBaseUrl(HttpServletRequest request) {
12         return request.getRequestURL().substring(0,
13                 request.getRequestURL().indexOf(request.getContextPath()) + request.getContextPath().length()) + "/";
14     }
15
16 }

View Code

然后在配置里,加上

 1     <bean id="requestUtil" class="com.cnblogs.yjmyzz.utils.RequestUtil"/>
 2
 3     <bean
 4             class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 5         <property name="order" value="1"/>
 6        ...
 7         <property name="viewResolvers">
 8             <list>
 9                 ...
10                 <bean
11                         class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
12                     <property name="order" value="0"/>
13                  ...
14                     <property name="viewClass"
15                               value="com.cnblogs.yjmyzz.utils.VelocityToolbox2View"></property>
16                     <property name="attributesMap">
17                         <map>
18                           ...
19                             <entry key="req">
20                                 <ref bean="requestUtil"/>
21                             </entry>
22                         </map>
23                     </property>
24                 </bean>
25               ...
26     </bean>

View Code

 vm页面这样用

1 #*取得页面链接基地址*#
2 #macro(baseHref)${req.getBaseUrl($request)}#end
3 ...
4 <base href="#{baseHref}">
5 ...
6 <script type="text/javascript">
7     var baseHref = "#{baseHref}";
8 </script>
9 ...

View Code

顺便提一句:网上有一堆文章和教程,让你在toolbox.xml中添加类似

1     <tool>
2         <key>req</key>
3         <scope>request</scope>
4         <class>com.cnblogs.yjmyzz.utils.RequestUtil</class>
5     </tool>

View Code

在Spring MVC4 + Velocity Tools2的组合下,然而,这并没有什么用,在Spring MVC4 + Velocity-Tools2下,已经不好使了。

最后,Velocity还允许自定义标签(也有人称为自定义指令),支持开发人员定义自己的标签,比如#YourDirective,详情可参考:

编写自定义的 Velocity 指令 

时间: 2024-10-28 20:10:50

velocity模板引擎学习(2)-velocity tools 2.0的相关文章

velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools

通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用velocity模板引擎生成 『每日发货单』邮件内容: 一.先定义邮件内容模板:mail-template.vm <string>用户,您好:</string> <h2>以下是 $date.format('yyyy-MM-dd',$model.deliverDate,$conv

velocity模板引擎学习(3)-异常处理

按上回继续,前面写过一篇Spring MVC下的异常处理.及Spring MVC下的ajax异常处理,今天看下换成velocity模板引擎后,如何处理异常页面: 一.404错误.500错误 1 <error-page> 2 <error-code>404</error-code> 3 <location>/nopage.do</location> 4 </error-page> 5 6 <error-page> 7 <

velocity模板引擎学习(1)

velocity与freemaker.jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVelocity,(注:castle团队在github上也维护了一个版本)对于使用异构技术的团队(即要搞.NET又要搞JAVA),总是希望找一种通用的技术,兼容所有技术平台,以便降低学习成本,无疑velocity是一种值得考虑的选择. 一.与strtus2的集成 1 <dependency> 2 <groupId>org.apache

用Apache Velocity模板引擎速造网站

apache|模板 基于Java的网站开发,很多人都采用JSP作为前端网页制作的技术,尤其是在国内.这种技术通常会存在一些问题,可以通过简单地分析网站开发过程来看看这些问题.通常网站开发采用以下两种方式: ◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环.判断显示数据结果).这就是通常的JSP页面制作,当然这部分可以由美工完成模板,然后由JSP工程师以它为原型创建相应的JSP页面. ◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由网页

如何使用 velocity 模板引擎开发网站

模板 开发网站-velocity模板引擎">基于 Java 的网站开发,很多人都采用 JSP 作为前端网页制作的技术,尤其在是国内.这种技术通常有一些问题,我试想一下我们是怎样开发网站的,通常有几种方法: 1:功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环,判断显示数据结果).也就是通常的 jsp 页面制作,当然这部分可以由美工完成模板,然后由 jsp 工程师再继续以它为原型创建相应的 jsp 页面. 2:功能确定后,由美工设计网页的UI(界面)

JAVA velocity模板引擎使用实例_JSP编程

velocity使用1.7版本. 在win7下使用intelliJ IDEA建立一基于tomcat的web app项目,命名为todo_web,设置path为/todo,导入velocity相关jar包.只导入velocity-1.7.jar这个包可能会报错,根据提示再导入velocity自带的其他包. 项目结构如下: 测试Tomcat index.jsp内容如下: 复制代码 代码如下: <%-- Created by IntelliJ IDEA. --%><%@ page conten

velocity 模板引擎

freemarker等的同类产品,可脱离web环境使用. 在web项目中与springMVC搭配,可参考<spring mvc中的视图框架> 它是一个apache的项目,地址为:http://velocity.apache.org/engine/1.7/user-guide.html 1.依赖 <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity --> <dependency> <

jade模板引擎学习笔记(WebsStorm9.0.3+ nodejs+express+jade)

jade环境搭建  jade标签写法  jade注释 jade添加类名.id.属性   jade添加脚本,css jade变量 jade多行文本显示 jade流程代码:for,each,while jade流程代码:if - else - unless ,case 可重用的jade块Mixins 模板继承(extends) 模板包含(include) jade环境搭建       打开WebsStorm9.0.3,File-New Project-,project type选择Node.js E

Node.js模板引擎学习----ejs

环境:windows+node.js+express 一.安装ejs 打开cmd窗口,输入npm install ejs -g,等待下载安装完成. 二.使用 调用过程中使用路由机制和模板,路由请求地址为根目录,模板文件为home.ejs[注:模板引擎文件为.ejs文件] 1.新建js文件为index.js 写入如下代码: varexpress=require("express"); varapp=express(); //设置渲染引擎 app.set("viewengine&