引入:

项目组问我,如果一个Portlet有多个模式(比如我们以前开发的某portlet同时有view模式和config模式),而我们前端用的extjs mvc的架构,并且主文件是main.js,这个main.js是用以下的定义在liferay-portlet.xml中,如下:

091752436.png

那么可能不可能让view.jsp(view模式的页面文件)和config.jsp(config模式的页面文件)分别加载2次main.js而不是共享同一个 main.js呢?


分析:

我仔细研究了一下,发现这是不可能做到的,以下是理由和我的想法。


首先,对于我们在iferay-portlet.xml中以这种方式定义的加载js文件,最终会被Liferay框架的PortletLocalServiceImpl的第1549-1551 行读取并且处理。

基于Liferay的平台下,portlet在各个模式下分别加载以<footer-portlet-javascript>定义的js文件的不可行性_第1张图片

换句话说,我们这些所有的的配置,都会被框架读取并且加入到footerPortletJavaScriptList列表中。


那么这些列表中的js文件如何被使用呢?阅读Liferay源码,我们找到了,它原来在bottom_portlet_resources_js.jspf文件中,见第33行:

基于Liferay的平台下,portlet在各个模式下分别加载以<footer-portlet-javascript>定义的js文件的不可行性_第2张图片

可以发现,它会读取刚才的footerPortletJavaScriptList,然后吧所有的资源文件路径解析为绝对路径,然后分别用