`
Tyler_Zhou
  • 浏览: 217941 次
  • 性别: Icon_minigender_1
  • 来自: 湖北->上海
社区版块
存档分类
最新评论

Liferay异步刷新

阅读更多

    Liferay portlet异步刷新,分为两种情况。


    一、刷新自已
    1.在liferay-portlet.xml,文件中增加<render-weight>0</render-weight>
    2.增加下面代码:此代码可以获得一个portlet的refreshURL

 

 

	public static String getPortletRefreshURL(ThemeDisplay themeDisplay,
			HttpServletRequest request, String portletId, long plid){

		StringBuilder url = new StringBuilder();
		
		try {
			String doAsUserId = themeDisplay.getDoAsUserId();
			
			LayoutTypePortlet layoutTypePortlet = themeDisplay.getLayoutTypePortlet();
			
			UnicodeProperties properties = 
				layoutTypePortlet.getLayout().getTypeSettingsProperties();
			
			String columnId = "";
			int columnPos = 0;
			Portlet portlet = null;
			int columnCount = 0;
			
			for(String key : properties.keySet()){
				if(properties.get(key).indexOf(portletId) != -1)
					columnId = key;
			}
			
			List<Portlet> portlets = layoutTypePortlet.getAllPortlets(columnId);
			
			for(Portlet portlet1 : portlets){
                                //修改此处可以支持<instanceable>true</instanceable>的portlet
				if(portlet1.getPortletId().equals(portletId)){
					portlet = portlet1;
					break;
				}else
					columnPos++;
			}
			columnCount = portlets.size();

			url.append(themeDisplay.getPathMain());
			url.append("/portal/render_portlet");
			url.append("?p_l_id=");
			url.append(plid);
			url.append("&p_p_id=");
			url.append(portletId);
			url.append("&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=");
			url.append(columnId);
			url.append("&p_p_col_pos=");
			url.append(columnPos);
			url.append("&p_p_col_count=");
			url.append(columnCount);
			//PortletLocalServiceUtil.getPortletById(companyId, portletId)

			if (portlet.isStatic()) {
				url.append("&p_p_static=1");

				if (portlet.isStaticStart()) {
					url.append("&p_p_static_start=1");
				}
			}

			if (Validator.isNotNull(doAsUserId)) {
				url.append("&doAsUserId=");
				url.append(doAsUserId);
			}

			url.append("&currentURL=");
			url.append(HttpUtil.encodeURL(PortalUtil.getCurrentURL(request)));

			String ppid = ParamUtil.getString(request, "p_p_id");

			if (ppid.equals(portletId)) {
				Enumeration enu = request.getParameterNames();

				while (enu.hasMoreElements()) {
					String name = (String)enu.nextElement();

					if (!PortalUtil.isReservedParameter(name)) {
						String[] values = request.getParameterValues(name);

						for (int i = 0; i < values.length; i++) {
							url.append(StringPool.AMPERSAND);
							url.append(name);
							url.append(StringPool.EQUAL);
							url.append(HttpUtil.encodeURL(values[i]));
						}
					}
				}

				Map renderParameters = RenderParametersPool.get(request, plid, ppid);

				Iterator itr = renderParameters.keySet().iterator();

				while (itr.hasNext()) {
					String name = (String)itr.next();

					String[] values = (String[])renderParameters.get(name);

					for (int i = 0; i < values.length; i++) {
						url.append(StringPool.AMPERSAND);
						url.append(name);
						url.append(StringPool.EQUAL);
						url.append(HttpUtil.encodeURL(values[i]));
					}
				}
			}
		} catch (SystemException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return url.toString();
	}

    3.在jsp中,增加下面javascript

  <script type="text/javascript">
    function <portalet:namespace/>refresh()
    {
        var ns = '<%= PortalUtil.getPortletNamespace(PortalUtil.getPortletId(request)) %>';
        var url = '<%=PortletKernelUtil.getPortletRefreshURL(themeDisplay,request,PortalUtil.getPortletId(request),plid)%& gt;';
        var portlet = jQuery('#p_p_id'+ns)[0];
        portlet.refreshURL = url;
        portlet.id = '<%=PortalUtil.getPortletId(request)%>';
        Liferay.Portlet.refresh(portlet);
    }
    </script>
 

    4.在需要刷新的地方调用javascript <portalet:namespace/>refresh即可

    二、A调用B
    第1、2、4步同上面,唯一区别的是第3步
    getPortletRefreshURL第三个参数需要传入B的portletId,
    <portalet:namespace/>refresh中ns的值要改成B的namespace即可。

以下备注一定要读:
       注:这里所提出的A调用B方案仅支持<instanceable>false</instanceable>的portlet,因为instanceable=false,portletId就是固定的值,这样namespace就可以确定(namespace="_"+portletId+"_"),而instanceable=true的portletId是会在后面加上自动生的四位识别码,这个是随机的无法确定。如果你一定想支持instanceable=true的portlet,你需要进行扩展,在代码里有注释的地方,进行扩展,反回一个Map<portletId, portletRefreshURL>,然后通过map循环调用js代码即可。

 

分享到:
评论
1 楼 wishingyo 2010-11-26  
感谢楼主,你的资料很有帮助!

相关推荐

    基于serverResource方式的liferay中ajax方式的的实现

    在Liferay中,serverResource是一种处理客户端请求并返回资源的方式,尤其适用于异步请求,如Ajax。这种方式使得开发者能够更新页面的部分内容,而无需刷新整个页面,从而提高用户体验。下面我们将逐步解析这个过程...

    Liferay ajax

    在Liferay 6中,使用Ajax技术来处理Portlet请求是一种常见的优化用户交互的方法。Ajax(Asynchronous JavaScript and XML)允许部分页面更新,无需整个门户页面的刷新,从而提升了用户体验,尤其是在Portlet环境下。...

    Liferay Benchmark Extension-crx插件

    - **代码分割与异步加载**: 减少初始页面加载的脚本数量,将非关键资源异步加载或按需加载。 - **缓存利用**: 利用浏览器缓存减少重复资源的下载,提高加载速度。 - **压缩与优化资源**: 图片压缩、CSS和JavaScript...

    Portlets in Action

    Ajax技术允许开发者在不刷新整个页面的情况下与服务器进行异步通信,从而提升用户体验。Comet是另一种异步Web应用架构,通过在服务器端推送数据到客户端来实现长轮询,改善了Web应用的实时性能。 6. **Liferay和...

    java开源框架:spring、ajax等

    通过JavaScript与服务器进行异步通信,可以实现无刷新页面更新,使得Web应用程序更加动态和响应迅速。 3、WebWork:WebWork是一个轻量级的MVC框架,它提供了强大的表单绑定、异常处理和AOP特性。后来WebWork发展...

    notification-portlet-webapp-2.0.3.zip

    JSR-286相比之前的JSR-168,增加了许多新特性,例如异步处理、事件处理和增强的portlet间通信等,提升了portlet的性能和交互性。 NotificationPortlet充分利用了JSR-286的特性,实现了通知的动态加载和实时更新。...

    文件上载Portlet源代码

    Portlet是Java Portlet API定义的一种可重用、可组合的Web部件,它在门户环境中运行,如Liferay、Pluto等。在这个特定的场景中,"文件上载Portlet源代码"是为了实现portlet的文件上传功能,使得用户能够在portlet中...

    ajax portlet

    Portlet是一种可重用的Web组件,它可以被嵌入到portlet容器(如Liferay Portal)中,提供特定的功能。portlet可以通过portlet API与portlet容器进行交互,如渲染内容、处理用户事件、管理用户会话等。 3. **Ajax与...

    weatherportlet

    9. **性能优化**:对于实时更新的天气信息,portlet需要考虑性能和效率,比如使用缓存策略减少不必要的API调用,或者使用异步加载技术减轻服务器压力。 10. **响应式设计**:现代portlet应该具备响应式布局,确保在...

    index-database-portlet

    9. **Ajax技术**:为了提供更好的用户体验,portlet可能使用Ajax异步更新技术,使得用户无需刷新整个页面即可获取新数据。 10. **测试框架**:JUnit或其他单元测试工具可能被用来确保portlet的功能正确性和性能。 ...

Global site tag (gtag.js) - Google Analytics