现在的位置: 首页 > 综合 > 正文

Liferay中使用Velocity的注意事项

2013年08月05日 ⁄ 综合 ⁄ 共 1548字 ⁄ 字号 评论关闭
习惯使用Velocity,在将以前基于Turbine的程序向Liferay4.0RC移植的过程中出现了问题,困扰了我好多天,今天终于完全解决,总结如下:
 
1. Liferay采用的是com.liferay.util.velocity.MultipleResourceLoader来加载vm文件。此加载器的设置是在com.liferay.portal.events.InitAction中进行,系统在设置之前调用MultipleResourceLoader的setListeners()方法加入一组监听器,这些监听器在system.properties文件的最后一行配置:
com.liferay.util.velocity.VelocityResourceListener=com.liferay.portal.velocity.ServletVelocityResourceListener,/
 
com.liferay.portal.velocity.JournalTemplateVelocityResourceListener,/
 
com.liferay.portal.velocity.DefaultVelocityResourceListener
2.为了让系统找到所指定的VM文件,需要采用以下方式指定vm的路径:
_portletContextName + com.liferay.util.velocity.VelocityResourceListener.SERVLET_SEPARATOR + VM_PATH;
其中_portletContextName对应portlet应用的名称,比如cms,bdsjournal等。值得特别注意的是此名称不包括"/";VelocityResourceListener.SERVLET_SEPARATOR的值是_SERVLET_CONTEXT_,VM_PATH对应portlet应用中vm文件的相对地址,必须以"/"开头。
例如:Portlet应用的名称是bdsjournal,需要指定的vm文件位于该应用的vm/viewitem目录下,文件名为ViewItemTree.vm,则形成的template应用的地址是:bdsjournal_SERVLET_CONTEXT_/vm/viewitem/ViewItemTree.vm;
3.如果在某Portlet应用中直接使用org.apache.velocity.servlet.VelocityServlet的子类,即不使用Portlet的API,则需要注意的是必须先调用过该Portlet的某个显示或编辑方法,再采用getTemplate()方法传入上述方式形成的VM文件路径,才能保证VM文件被找到。这是因为一般情况下,MultipleResourceLoader会使用com.liferay.portal.velocity.ServletVelocityResourceListener来加载VM文件,而此监听器在加载VM文件时会根据缓存中的Portlet context来找到相应的文件,调用过Portlet的某个显示或编辑方法将保证该Portlet的context被加载到缓存中去;
4.关于encoding的问题:如果通过VelocityServlet显示的页面出现了乱码,是因为该servlet的输出字符编码方式不对,只需要覆盖VelocityServlet的chooseCharacterEncoding方法。例如:
 protected String chooseCharacterEncoding(HttpServletRequest request){
         return "UTF-8";
 }
 
 

抱歉!评论已关闭.