Portlet插件開發說明文檔
概述
Liferay幾種開發:
1、 Portlets
一個插件中可以有多個portlet,portlet開發可以用Struts、Spring MVC、Java Server Faces (JSF)等框架,也可以使用Liferay特定的框架:MVCPortlet或者AlloyPortlet等。
可以將多種插件類型放到一個war包中,如將主題和佈局合併在一起(待驗證)。
2、 Themes(自定義外觀和風格)
使用CSS和Velocity模板來改變門戶的外觀和風格。
3、 Layout Templates
佈局改變的是portlet在頁面中的佈局,而不是portlet的外觀和風格,佈局使用Velocity或者Freemarker模板。
4、 Hooks
Hook插件可以用來修改portal properties或者在啓動、關閉、登錄、註銷、session創建和session註銷時執行自定義action,除此之外,還有其它的一些功能,不在這裏說明。
5、 Ext Plugins
Ext插件在修改Liferay核心時提供了最大的靈活性。
Portlet開發過程
創建工程圖解
通過Liferay開發工具來創建
生成如下結構的工程:
配置文件說明
配置文件存放在docroot/WEB-INF文件夾中。
portlet.xml:JSR-286標準的portlet配置文件。
liferay-display.xml:Liferay特有的配置文件,描述了該portlet在添加應用時將展示在哪個類型下面。
liferay-portlet.xml:Liferay特有的配置文件,該文件描述了一些針對安裝在Liferay門戶服務器上的portlet(JSR-286標準)增加的配置(Liferay特有的)。例如,你可以設置某個portlet是否可以實例化多次(在同一個頁面中相同的portlet是否可以添加多次)。詳細信息可以查看位於Liferay源代碼definitions文件夾中對應的DTD文件。
liferay-plugin-package.properties:Liferay特有的配置文件,該文件描述了Liferay熱部署插件的一些信息。可以在這裏配置依賴的jar包,如果一個portlet插件需要依賴一些liferay特有的jar包,可以在這裏指定,熱部署的時候,會複製這些指定的jar包到相應的目錄下。這樣就不需要自己引用這些jar包了,也就可以減少war包的體積了。
下面是對這些配置文件的一些說明:
docroot/WEB-INF/portlet.xml:
下面是對每個元素所代表的含義的一些總結:
portlet-name
該元素包含了portlet的標準名稱,每個portlet名稱在portlet應用程序(即portlet插件)中是唯一的。在liferay門戶中,這也被稱爲portlet ID。
display-name
The display-name type contains a short name that is intended to be displayed by tools. It is used by display-name elements. The display name need not be unique.
portlet-class
包含完整的類名,處理對portlet的調用。
init-param
portlet的初始化參數,包含成對的<name/>和<value/>子元素。
expiration-cache
過期時間定義portlet輸出緩存在幾秒鐘後失效。-1表示輸出不緩存。
supports
supports包含支持的MIME類型。表示爲portlet支持的portle模式指定一個特定的內容類型。所有的portlet都必須支持view模式。
portlet-info
定義portlet的信息。
security-role-ref
該元素包含了對web應用程序代碼中引用的安全角色的聲明。特別是在liferay中,role-name表明了哪個角色可以訪問該portlet。
docroot/WEB-INF/liferay-portlet.xml:
除了標準的portlet.xml配置之外,還有可選的liferay獨有的針對安裝在Lifeary門戶服務器上的java標準的portlet增加的一些配置。插件SDK會將描述信息設置爲如下:
其中:
portlet-name:
必須與portlet.xml文件中的portle-name一致。
icon
portlet圖標路徑
instanceable
表示在同一頁面上可以出現多個該portlet的實例。
header-portlet-css
在頁面的<head>中包含的css文件。
footer-portlet-javascript
在頁面最後</body>之前的js文件。
更多的元素可以查看位於Liferay源代碼definitions文件夾中對應的DTD文件。
新建service.xml
點“Finish”後,WEB-INF目錄下會出現新建的service.xml文件。
執行build-service,生成相應的service接口類、service實現類、hibernate映射、spring配置等文件。執行成功後,refresh下工程。
AJAX請求
AJAX前臺請求url:
<portlet:resourceURL var="url">
<portlet:param name="param1" value="value1"/>
<portlet:param name="param2" value="value2"/>
</portlet:resourceURL>
請求示例:
$.ajax({
type: 'POST',
url: '<%=url %>',
data: {"number":number},
dataType: 'text',
success: function(data){
$("#<portlet:namespace/>datas").html(data);
}
});
AJAX後臺代碼:
public void serveResource(ResourceRequest resourceRequest,
ResourceResponse resourceResponse) throws IOException,
PortletException {
int number = ParamUtil.getInteger(resourceRequest, "number");
HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse);
response.setContentType(ContentTypes.TEXT_PLAIN_UTF8);
response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache");
PrintWriter pw = response.getWriter();
pw.write("第"+(number+1)+"次請求。");
pw.close();
}
表單提交actionURL
<portlet:actionURL var="addURL"><portlet:param name="<%= actionRequest.ACTION_NAME %>" value="add" /></portlet:actionURL>
或者
<portlet:actionURL var="addURL" name="add"></portlet:actionURL>
<form action="<%=addURL %>" method="post" name="<portlet:namespace />fm2">
<input name="<%= Constants.CMD %>" type="hidden" value="edit" />
<input name="userName" type="text" value="test2" />
<input name="password" type="text" value="123@abc" />
<input type="submit" value="submit"/>
</form>
其中<%= ActionRequest.ACTION_NAME %>的值對應後臺的方法名:
public void add(ActionRequest actionRequest,
ActionResponse actionResponse) throws Exception {
String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
String userName = ParamUtil.getString(actionRequest, "userName");
String password = ParamUtil.getString(actionRequest, "password");
_log.info("cmd:"+cmd);
_log.info("userName:"+userName);
_log.info("password:"+password);
}
注意:不能使用renderURL
1,renderRequest沒有ACTION_NAME字段;
2,renderURL標籤沒有name屬性。
頁面跳轉renderURL
跳轉url:
<portlet:renderURL>
<portlet:param name="jspPage" value="/html/commodities/edit.jsp" />
</portlet:renderURL>
參數jspPage表示將要跳轉到的頁面。
示例如下:
<a href="<portlet:renderURL><portlet:param name="jspPage" value="/html/commodities/edit.jsp" /></portlet:renderURL>">edit</a>
name必須爲jspPage,否則跳不過去
插件部署
插件部署有很多種方法,其中一種方法:
將portlet插件部署到tomcat後,通過命令 jar –cvf commodities.war *.* 打成war包(如果是WebLogic部署直接壓縮成rar包即可)。
如果是在WebSphere上部署,需要在web.xml中加入下列一段話:
<context-param>
<param-name>com.ibm.websphere.portletcontainer.PortletDeploymentEnabled</param-name>
<param-value>false</param-value>
</context-param>
因爲在這裏我們需要使用Liferay自己的Portlet容器而不是WebSphere Application Server自帶的,如果沒有任何配置的情況下,WebSphere Application Server總是使用自己的Portlet容器。
其餘部分與部署其他應用程序一樣。
注意點
Ø 插件模式開發優點
從目前驗證結果來看,插件模式開發更適用於獨立的web工程,優點非常明顯,只要遵循JSR,就可以任何Web方式開發,如sturts2、spring mvc等,對liferay基本上沒有依賴,耦合很低,可以非常方便部署、開發、遷移。
注:插件portlet可通過liferay的接口類(portal-service.jar、ext-portal-ext-service.jar)來調用相關代碼。
Ø 插件模式開發缺點
在優點明顯的同時,缺點也很明顯。每個portlet都是獨立的war包,代碼之間的共享訪問很難,同時不能直接調用liferay的實現類的jar包(portal-impl.jar、ext-portal-ext-impl.jar)中的代碼。