Liferay中使用Velocity的注意事項

習慣使用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";
 }
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章