liferay與portlet之間如何通信

這篇文章主要介紹了liferay與portlet之間如何通信,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、瀘州網(wǎng)站維護(hù)、網(wǎng)站推廣。

一、通過URL傳值

這個(gè)是我在項(xiàng)目中***次遇到這樣的問題,找出的一個(gè)方案,原理就是A把B需要的參數(shù)加在自已生成的URL后面,然后再把整個(gè)頁面view一次,B根據(jù)取得的參數(shù)再做相應(yīng)的處理,取URL參數(shù)代碼如下:

Java代碼

public class CurrentURLUtil {         public static Log log = LogFactory.getLog(CurrentURLUtil.class);         public static int contain(String currentURL, String param) {         return currentURL.indexOf(param);     }         public static String getString(String currentURL, String param) {             try {             int paramIndex = contain(currentURL, param);                 if (paramIndex == -1) {                 // log.warn("CurrentURL don't contain the parameter that name                 // is:"+param+",and method will return a blank");                 return "";             } else {                 int afaterParamSperatorIndex = currentURL.indexOf("&", paramIndex+1);                     if (afaterParamSperatorIndex == -1) {                     return currentURL.substring(paramIndex + param.length() + 1);                 } else                    return currentURL.substring(paramIndex + param.length() + 1,                             afaterParamSperatorIndex);             }         } catch (RuntimeException e) {             // TODO Auto-generated catch block             return "";         }     }             public static String getString(String currentURL, String param, String defaultStr) {                  String value = getString(currentURL, param);                  if(Validator.isNull(value))             return defaultStr;         else            return value;              }         public static long getLong(String currentURL, String param) {         String value = getString(currentURL, param);         if (null == value || value.trim().equals("")) {             return 0;         } else if(Validator.isNumber(value))             return Long.parseLong(value);         else            return 0;     }

這種方法有比較多的缺陷,比如傳的參數(shù)只能是string,如果是map,list,大數(shù)據(jù)就不可行了,另外還有一個(gè)問題,安全性不高,你無法預(yù)料到這個(gè)頁面上有多少portlet,每個(gè)portlet會有多少操作,而每個(gè)操作都會產(chǎn)生一個(gè)url,會不會出現(xiàn)相同key?出錯(cuò)的機(jī)率較高。

二、通過session傳值

這種方式和***種方式原理都是相同的,只不過要安全一些。A觸發(fā)一個(gè)action,在action里面把自已要處理的工作做完了后,把B需要的東西放在session里面,B在render里面去取這些東西,然后來完成自已的工作,或者就在JSP里面完成這些工作。但是這樣就出現(xiàn)了一個(gè)問題,你無法知道A先處理完還是B先處理完,解決的這個(gè)問題的方法有兩個(gè),一個(gè)是讓B在處理之間等待一段時(shí)間,這個(gè)時(shí)間A一定能把工作完成,另外一個(gè)方法是用鎖的方式來解決,建一個(gè)static map,A負(fù)責(zé)開鎖,B負(fù)責(zé)鎖上,兩個(gè)千萬不能搞錯(cuò),當(dāng)鎖為空或false時(shí),B就去等侍,直到鎖打開。但是一定要記得在B處理完成后把鎖銷毀。這種方式,我也只在項(xiàng)目中用過一次。

三、通過模擬B的PortletURL

后面兩種方式也是我最近半年來才學(xué)會的,應(yīng)該是安全的。先上一段代碼是模擬B的PortletURL的關(guān)鍵

Java代碼

private static long _getPlidFromPortletId(HttpServletRequest request, long groupId,                  boolean isPrivate, String portletId, Entry... entry) {                          long plid = 0;             if (entry == null) {                 plid = PortalUtil.getPlidFromPortletId(groupId, isPrivate, portletId);                 if(Validator.isNull(plid))                     plid = Long.valueOf(0);             } else {                 try {                     List layouts = LayoutLocalServiceUtil.getLayouts(groupId, isPrivate, LayoutConstants.TYPE_PORTLET);                     for (Layout layout : layouts) {                         LayoutTypePortlet layoutTypePortlet =                             (LayoutTypePortlet)layout.getLayoutType();                             if (layoutTypePortlet.hasPortletId(portletId)) {                             if (PortalUtil.getScopeGroupId(layout, portletId) == groupId) {                                 plid = layout.getPlid();                                                                  List list = PortletPreferencesLocalServiceUtil                                     .getPortletPreferences(plid, portletId);                                 if (Validator.isNotNull(list)) {                                     for (PortletPreferences pre : list) {                                                                                  int i = 0;                                         if (entry.length < 1){                                             plid = pre.getPlid();     //                                      _plidCache.put(key, plid);                                             return plid;                                         }                                                                                  javax.portlet.PortletPreferences jpre = PortletPreferencesSerializer                                                 .fromXML(PortalUtil.getCompanyId(request), pre                                                         .getOwnerId(), pre.getOwnerType(), plid,                                                         portletId, pre.getPreferences());                                         for (; i < entry.length; i++) {                                             Entry en = entry[i];                                             if (!jpre.getValue(en.getKey().toString(),                                                     StringPool.BLANK).equals(                                                     en.getValue().toString()))                                                 break;                                         }                                         if (i == entry.length){                                             plid = pre.getPlid();     //                                      _plidCache.put(key, plid);                                             return plid;                                         }                                     }                                 }                             }                         }                     }                 } catch (SystemException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                 }             }             return plid;         }             public static PortletURL getPortletURL(long groupId, String portletId,                 HttpServletRequest request, Entry... entry) {                 long plid = _getPlidFromPortletId(request, groupId, false, portletId, entry);             return new PortletURLImpl(request, portletId, plid,                     PortletRequest.RENDER_PHASE);         }                  public static PortletURL getPortletURL(long groupId, long plid, String portletId,                 HttpServletRequest request, Entry... entry) {             return new PortletURLImpl(request, portletId, plid,                     PortletRequest.RENDER_PHASE);         }

根據(jù)上面代碼能看出,最關(guān)鍵是要取得plid,如果你兩個(gè)需要通信的portlet在一個(gè)頁面上,那就省了大事了,不然你就要去調(diào)用_getPlidFromPortletId這個(gè),***一個(gè)參數(shù)是為了匹配這個(gè)portlet的configartion信息,因?yàn)橐粋€(gè)網(wǎng)站有十幾個(gè)頁面,可能其中三個(gè)頁面會有這一個(gè)portlet,增加這個(gè)參數(shù)能提高準(zhǔn)確性,但是影響性能。PortletURL得到了,那后面的事就好辦了,如果你是A只是為了傳信息本身不做任何處理,把參數(shù)放到PortletURL里,然后用就可以了,如果A要做完自已的工作再傳,那就以Action里面做完自已的工作,然后sendRedirect到PortletURL.toString()就可以了。這種方式應(yīng)該是比較安全可靠的,并且我在幾個(gè)項(xiàng)目中都已經(jīng)實(shí)施過了。注意 :此方案僅能支持B屬性false的portlet

四、通過jQuery.ajax異步通信

這個(gè)是***的一個(gè)方案,目前正在進(jìn)行的項(xiàng)目我用了這個(gè)方案,其基本思想是:A后臺通知B去工作,然后A前臺讓B顯示工作結(jié)果,這個(gè)方案比較酷。具體實(shí)現(xiàn)如下:

1.A通過jQuery.ajax去請求B的jsonAction(參照前面Liferay異步提交文章)

2.然后根據(jù)返回結(jié)果讓B顯示處理結(jié)果(參照前面Liferay異步刷新文章中的第二種類型)

注:如果你A也要處理工作,那就讓A先處理然后根據(jù)結(jié)果再調(diào)用B的jsonAction,***讓A和B都分別顯示各自的工作結(jié)果。當(dāng)然你也可以把A和B要做的工作都放在一個(gè)jsonAction里面

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“l(fā)iferay與portlet之間如何通信”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

文章題目:liferay與portlet之間如何通信
網(wǎng)站地址:http://muchs.cn/article14/iiooge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、品牌網(wǎng)站設(shè)計(jì)微信公眾號、軟件開發(fā)、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管