日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
liferay與portlet之間的通信

從我做Liferay到現(xiàn)在,這個(gè)問(wèn)題一直都存在著,直到最近我才算是找到了一個(gè)可靠的方案,能夠滿足各種需求,從我最開(kāi)始做到現(xiàn)在一共用到了四種方案,從低到高,我們一個(gè)一個(gè)的講。

我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、荷塘ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的荷塘網(wǎng)站制作公司

一、通過(guò)URL傳值

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

Java代碼

 
 
 
  1. public class CurrentURLUtil {     
  2.     
  3. public static Log log = LogFactory.getLog(CurrentURLUtil.class);     
  4.     
  5. public static int contain(String currentURL, String param) {     
  6.     return currentURL.indexOf(param);     
  7. }     
  8.     
  9. public static String getString(String currentURL, String param) {     
  10.     
  11.     try {     
  12.         int paramIndex = contain(currentURL, param);     
  13.     
  14.         if (paramIndex == -1) {     
  15.             // log.warn("CurrentURL don't contain the parameter that name     
  16.             // is:"+param+",and method will return a blank");     
  17.             return "";     
  18.         } else {     
  19.             int afaterParamSperatorIndex = currentURL.indexOf("&", paramIndex+1);     
  20.     
  21.             if (afaterParamSperatorIndex == -1) {     
  22.                 return currentURL.substring(paramIndex + param.length() + 1);     
  23.             } else    
  24.                 return currentURL.substring(paramIndex + param.length() + 1,     
  25.                         afaterParamSperatorIndex);     
  26.         }     
  27.     } catch (RuntimeException e) {     
  28.         // TODO Auto-generated catch block     
  29.         return "";     
  30.     }     
  31. }     
  32.     
  33.     
  34. public static String getString(String currentURL, String param, String defaultStr) {     
  35.          
  36.     String value = getString(currentURL, param);     
  37.          
  38.     if(Validator.isNull(value))     
  39.         return defaultStr;     
  40.     else    
  41.         return value;     
  42.          
  43. }     
  44.     
  45. public static long getLong(String currentURL, String param) {     
  46.     String value = getString(currentURL, param);     
  47.     if (null == value || value.trim().equals("")) {     
  48.         return 0;     
  49.     } else if(Validator.isNumber(value))     
  50.         return Long.parseLong(value);     
  51.     else    
  52.         return 0;     
  53. }    

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

二、通過(guò)session傳值

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

三、通過(guò)模擬B的PortletURL

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

Java代碼

 
 
 
  1. private static long _getPlidFromPortletId(HttpServletRequest request, long groupId,      
  2.             boolean isPrivate, String portletId, Entry ... entry) {     
  3.              
  4.         long plid = 0;     
  5.         if (entry == null) {     
  6.             plid = PortalUtil.getPlidFromPortletId(groupId, isPrivate, portletId);     
  7.             if(Validator.isNull(plid))     
  8.                 plid = Long.valueOf(0);     
  9.         } else {     
  10.             try {     
  11.                 List  layouts = LayoutLocalServiceUtil.getLayouts(groupId, isPrivate, LayoutConstants.TYPE_PORTLET);     
  12.                 for (Layout layout : layouts) {     
  13.                     LayoutTypePortlet layoutTypePortlet =     
  14.                         (LayoutTypePortlet)layout.getLayoutType();     
  15.     
  16.                     if (layoutTypePortlet.hasPortletId(portletId)) {     
  17.                         if (PortalUtil.getScopeGroupId(layout, portletId) == groupId) {     
  18.                             plid = layout.getPlid();     
  19.                                  
  20.                             List  list = PortletPreferencesLocalServiceUtil     
  21.                                 .getPortletPreferences(plid, portletId);     
  22.                             if (Validator.isNotNull(list)) {     
  23.                                 for (PortletPreferences pre : list) {     
  24.                                          
  25.                                     int i = 0;     
  26.                                     if (entry.length < 1){     
  27.                                         plid = pre.getPlid();     
  28. //                                      _plidCache.put(key, plid);     
  29.                                         return plid;     
  30.                                     }     
  31.                                          
  32.                                     javax.portlet.PortletPreferences jpre = PortletPreferencesSerializer     
  33.                                             .fromXML(PortalUtil.getCompanyId(request), pre     
  34.                                                     .getOwnerId(), pre.getOwnerType(), plid,     
  35.                                                     portletId, pre.getPreferences());     
  36.                                     for (; i < entry.length; i++) {     
  37.                                         Entry en = entry[i];     
  38.                                         if (!jpre.getValue(en.getKey().toString(),     
  39.                                                 StringPool.BLANK).equals(     
  40.                                                 en.getValue().toString()))     
  41.                                             break;     
  42.                                     }     
  43.                                     if (i == entry.length){     
  44.                                         plid = pre.getPlid();     
  45. //                                      _plidCache.put(key, plid);     
  46.                                         return plid;     
  47.                                     }     
  48.                                 }     
  49.                             }     
  50.                         }     
  51.                     }     
  52.                 }     
  53.             } catch (SystemException e) {     
  54.                 // TODO Auto-generated catch block     
  55.                 e.printStackTrace();     
  56.             }     
  57.         }     
  58.         return plid;     
  59.     }     
  60.     
  61.     public static PortletURL getPortletURL(long groupId, String portletId,     
  62.             HttpServletRequest request, Entry ... entry) {     
  63.     
  64.         long plid = _getPlidFromPortletId(request, groupId, false, portletId, entry);     
  65.         return new PortletURLImpl(request, portletId, plid,     
  66.                 PortletRequest.RENDER_PHASE);     
  67.     }     
  68.          
  69.     public static PortletURL getPortletURL(long groupId, long plid, String portletId,     
  70.             HttpServletRequest request, Entry ... entry) {     
  71.         return new PortletURLImpl(request, portletId, plid,     
  72.                 PortletRequest.RENDER_PHASE);     
  73.     }    

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

四、通過(guò)jQuery.ajax異步通信

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

1.A通過(guò)jQuery.ajax去請(qǐng)求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里面

【編輯推薦】

  1. 在Liferay中使用Hibernate
  2. Liferay Portal中的jBPM配置
  3. 開(kāi)源Portal工具Liferay Portal 4.0發(fā)布
  4. hibernate中update與saveOrUpdate的區(qū)別
  5. Hibernate模糊查詢參數(shù)化的問(wèn)題

當(dāng)前題目:liferay與portlet之間的通信
轉(zhuǎn)載來(lái)于:http://www.5511xx.com/article/cdojjdj.html