下面这个宏可以让你在web项目中使用相对路径来包含其他的模板文件
#macro(invoke $page) #if($page.startsWith("/")) #parse($page) #else #set($uri = $request.getAttribute("javax.servlet.include.request_uri")) #if(!$uri)#set($uri = $request.getServletPath())#end #set($path = $uri.substring(0, $uri.lastIndexOf("/"))) #parse("$path/$page") #end #end
把这段代码加在VM_global_library.vm中,你就可以在页面模板中用#invoke("head.vm")来在页面中嵌入其他的模板文件,比起用#parse指定绝对路径省事很多。
不过这种做法有一个缺点:当子页面还欠有其他页面的时候,相对路径就有点问题,是相对于主页面而非当前页面,这也会给使用上造成一些困扰,但解决的办法还是有的,相对比较复杂而已。
首先我们需要编写一个Toolbox类,例如MyVelocityTool,该类实现接口ViewTool,代码如下:
public class MyVelocityTool implements ViewTool {
protected HttpServletRequest request; protected HttpServletResponse response; protected ServletContext context; protected VelocityContext velocity;
/* * Initialize toolbox * @see org.apache.velocity.tools.view.tools.ViewTool#init(java.lang.Object) */ public void init(Object arg0) { if(arg0 instanceof ViewContext){ ViewContext viewContext = (ViewContext) arg0; request = viewContext.getRequest(); response = viewContext.getResponse(); context = viewContext.getServletContext(); velocity = (VelocityContext)viewContext.getVelocityContext(); } else if(arg0 instanceof ServletContext){ context = (ServletContext)arg0; } }
public String current_template(){ return velocity.getCurrentTemplateName(); } }
接着在velocity-toolbox.xml中定义这个Toolbox类
dlog request com.liusoft.dlog4j.DLOG_VelocityTool
最后修改#invoke宏如下:
#macro(invoke $page) #if($page.startsWith("/")) #parse($page) #else #set($uri = $dlog.current_template()) #set($path = $uri.substring(0, $uri.lastIndexOf("/"))) #parse("$path/$page") #end #end
这就是一个可以完全使用相对路径的方法了,包括子页面嵌入其他的子页面,而不会造成使用的困扰。
|