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

Liferay异步提交

阅读更多

liferay的异步提交其实是非常简单的,他用的是json & jquery


    1.jsp相关代码如下

<script type="text/javascript">
function <portlet:namespace/>change(){
	/*我用的是plugin开发方式,所以URL是这种方式,如果是ext方式要用
	<portlet:actionURL windowState="<%= LiferayWindowState.EXCLUSIVE.toString() %>">
	<portlet:param name="struts_action" value="/blogs/edit_entry" /></portlet:actionURL>,
        注意LiferayWindowState.EXCLUSIVE.toString()这个不可以用错*/
	var url = '<%=request.getContextPath()%>/portlet_action/dashboard/salestrend';
	jQuery.ajax({
		type: 'POST',
		url:url,
		data:{
			//参数传递
			userId:'<%=PortalUtil.getUserId(request)%>',
			regionId:regionId,
			provinceId:provinceId,
			cityId:cityId,
			year:year,
			month:month,
			grouping:grouping,
			targetValue:targetValue
		},
		dataType:'json',
		beforeSend: function() {
			//发送前出现一个加载中的图片
			jQuery('#<portlet:namespace/>dashboard-content').html('<div style="text-align:center;"><img width="32" height="32" src="<%=themeDisplay.getTheme().getContextPath()+themeDisplay.getTheme().getImagesPath()%>/progress_bar/loading_animation.gif"/></div>');
		},
		success: function(message){
			//成功,message是json对象
			jQuery('#<portlet:namespace/>dashboard-content').html(message.xml);
		},
		error: function() {
			//报错处理
			jQuery('#<portlet:namespace/>dashboard-content').html('<span class="portlet-msg-error"><liferay-ui:message key="an-unexpected-system-error-occurred"/></span>');
		}
	});
}
<script type="text/javascript">

 2.JSONAction相关代码如下:

//class一定要继承JSONAction
	public String getJSON(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		long userId = ParamUtil.getLong(request, "userId");
		Date date = ParamUtil.getDate(request, "date", IdmDateUtil.DATE_FORMAT);
		
		List<SalesTargetInfo> productVariants = SalesTargetServiceUtil.getProductVariantList(userId, date);
		JSONArray variantJsonArray = JSONFactoryUtil.createJSONArray();
		for(SalesTargetInfo salesTarget : productVariants){
			JSONObject jsonObj = JSONFactoryUtil.createJSONObject();
			jsonObj.put("id", salesTarget.getTargetId());
			jsonObj.put("val", salesTarget.getValDoubleDesc());
			jsonObj.put("type", salesTarget.getType());
			variantJsonArray.put(jsonObj);
		}
		
		List<SalesTargetInfo> productGroup = SalesTargetServiceUtil.getProductGroupList(userId, date);
		JSONArray groupJsonArray = JSONFactoryUtil.createJSONArray();
		for(SalesTargetInfo salesTarget : productGroup){
			JSONObject jsonObj = JSONFactoryUtil.createJSONObject();
			jsonObj.put("id", salesTarget.getTargetId());
			jsonObj.put("val", salesTarget.getValDoubleDesc());
			jsonObj.put("type", salesTarget.getType());
			groupJsonArray.put(jsonObj);
		}
		
		JSONObject jsonObj = JSONFactoryUtil.createJSONObject();
		jsonObj.put("variant", variantJsonArray);
		jsonObj.put("group", groupJsonArray);
		
		// TODO Auto-generated method stub
		return jsonObj.toString();
	}

 3.如果你对JSON不熟,希望下代码能帮助你

//参数message就是发送成功后success: function(message)中的message(json对象)
	function <portlet:namespace/>setVriantAndGroup(message){

		var variants = message.variant;
		
		for(var i=0;i<variants.length;i++){
			variant = variants[i];
			if(variant.id == id && variant.type == <%=IdmWebKeys.SALES_TARGET_TYPE_THIRD%>){						
				jQuery(this).children('td:nth-child(3)').children(':first-child').val(variant.val);
				
			}else if(variant.id == id && variant.type == <%=IdmWebKeys.SALES_TARGET_TYPE_FORTH%>){
				jQuery(this).children('td:nth-child(2)').children(':first-child').val(variant.val);
				
			}
		}

		var groups = message.group;
		
		for(var i=0;i<groups.length;i++){
			group = groups[i];
			if(group.id == id && group.type == <%=IdmWebKeys.SALES_TARGET_TYPE_THIRD%>){
				jQuery(this).children('td:nth-child(3)').children(':first-child').val(group.val);
				
			}else if(group.id == id && group.type == <%=IdmWebKeys.SALES_TARGET_TYPE_FORTH%>){
				jQuery(this).children('td:nth-child(2)').children(':first-child').val(group.val);
				
			}
		}
	}

 4.如果返回的数据很大,并且需要改变的UI也有很多地方,例如:你提交一个form成功后,需要整个换掉这个form,那么用js是一件痛苦的事,这里还有一个更简单的做法在后台JSONAction中做文章,下面是一个列子

public String getJSON(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// TODO Auto-generated method stub
		
		String path = StrutsUtil.TEXT_HTML_DIR;
		path += "/user/edit_user.jsp";
		
		long userId = ParamUtil.getLong(request, "userId");
		String cmd = ParamUtil.getString(request, Constants.CMD);
		long selUserId = ParamUtil.getLong(request, "selUserId");
		String namespace = ParamUtil.getString(request, "namespace");
		
		RequestDispatcher requestDispatcher =
			request.getRequestDispatcher(path);

		StringServletResponse stringResponse = new StringServletResponse(
			response);
		stringResponse.setContentType("text/xml; charset=UTF-8");
		request.setAttribute("userId", new Long(userId));
		request.setAttribute(Constants.CMD, cmd);
		request.setAttribute("selUserId", new Long(selUserId));
		request.setAttribute("namespace", namespace);

		requestDispatcher.include(request, stringResponse);
		
		JSONObject jsonObj = JSONFactoryUtil.createJSONObject();
		
		jsonObj.put("userContent", stringResponse.getString());
		
		return jsonObj.toString();
	}

    看出来了吗,所有的东西都在/user/edit_user.jsp里面,这样就不用去考虑让人头痛的JS了,全都交给JSP去做,然后直接反回生成的HTML代码,你只需要jQuery('#**').html(message.userContent),一切都结束了,整个世界都清静了。


以下备注一定要看:

    在做异步提交的时候一定要做好安全认证,特别是plugin方式,因为plugin里面的request不是portal里面的request,他里面什么都没有(PortletURL方式提交除外),所以我一般会把userId给带进去,在做操作之前先check一下这个user是否有这个操作的权限。
    如果你想让request和liferay里面的一样,你需要去继承PortletActionServlet,并且在里面写上一些Events,listener,liferay很次request里面都会有一堆的信息,都是在这些Events,listener里面处理的,但是具体是那些我还没搞明白。

分享到:
评论
2 楼 yaokaiwen99 2011-11-18  
大哥求一个简单的flexigrid在liferay中应用的例子。我也是那么写的URL,不调用ACTION,也不报错。
1 楼 gaigai511225 2011-11-17  
你好 插件环境那个url 具体怎么写 我照您的方式写了出错 没有调用action

相关推荐

    Liferay portlet 工程示例代码

    初始化阶段加载portlet的配置,渲染阶段负责显示portlet内容,动作阶段处理用户提交的表单数据。 5. **Portlet开发基础** - **portlet.xml**:定义portlet的元数据,包括portlet名称、显示模式、URL映射等。 - **...

    liferay一个简单的portlet

    这个类将包含处理用户请求的方法,如`doView`(显示Portlet内容)和`processAction`(处理用户提交的表单动作)。 3. **portlet.xml配置**:编辑portlet.xml文件,配置Portlet的行为,如Portlet名称、显示模式、...

    Liferay ajax

    通过这个方法,我们可以异步地处理用户的交互,如按钮点击、表单提交等,并只更新必要的Portlet区域。 在示例中,`serveResource`方法中获取了请求参数`message`,这可能是通过Ajax发送的数据。然后,我们可以根据...

    图片批量上传demo

    此外,可能还需要使用AJAX异步提交文件,以提供更好的用户体验。 7. **权限管理**:Liferay支持细粒度的权限控制,确保只有授权的用户可以进行图片上传。在开发过程中,需要考虑到这些权限设置。 通过分析和实现这...

    web-form-portlet.rar_portlet_web form

    4. 表单提交:可以使用AJAX异步提交,或者传统的HTTP POST方法提交表单数据。 三、Portlet Web Form开发 在Portlet中实现Web表单,需要结合portlet的生命周期和API来处理表单的显示、提交和处理。以下是一些关键...

    一个介绍 Portlet如何与容器交互的代码示例

    此外,Portlet可以通过`PortletPreferences`来存储用户自定义的设置,通过`PortalContext`获取关于门户环境的信息,通过`ResourceRequest`和`ResourceResponse`处理异步资源请求。Liferay的Service Builder可以帮助...

    文件上载Portlet源代码

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

    Portlet

    - **异步处理**:portlet可以异步处理请求,提高性能和用户体验。 ### 4. JSR 168与JSR 286 - **JSR 168**:定义了portlet的原始规范,包括portlet的生命周期、渲染模型、事件模型等基础功能。 - **JSR 286**:...

    portlet开发资料.rar

    - 使用`ResourceRequest`和`ResourceResponse`处理资源请求,适用于异步或AJAX操作。 5. **portlet的生命周期**: - 初始化(`init`):portlet首次加载时调用。 - 服务(`doView`、`processAction`、`...

    蚊子总结的portlet的开发

    - Portlet是Java Portlet API定义的一种组件模型,主要应用于企业级门户系统,如IBM WebSphere Portal或Liferay Portal。 - 它们可以独立于门户服务器进行开发,并通过portlet容器进行部署,提供个性化和交互性的...

    portlet hello world程序

    Portlet运行在支持JSR 286的门户服务器上,如IBM WebSphere Portal、Liferay Portal或Apache Pluto。开发者需要在这些服务器上部署portlet应用,然后通过门户管理员界面添加和配置portlet。 8. **portlet的交互** ...

    Portlet+开发.pdf

    - **框架支持**:在实际开发中,常常会使用如 Liferay、JBoss Portal 等成熟的门户框架来简化开发过程。 #### 三、Portlet 的生命周期 - **初始化阶段**:当 Portlet 首次被加载时,服务器会调用其 init() 方法...

    spring-webmvc-portlet.rar

    Portlet框架是为portlet容器(如Liferay、WebSphere Portal)提供的一套标准,它定义了portlet的生命周期、渲染机制以及portlet间通信的规则。portlet是一种独立的、可重用的Web组件,可以嵌入到portlet门户中,提供...

    wicket指南

    5. **JSR 168/286 支持**:Wicket 兼容portlet标准,可以无缝集成到portlet容器,如Apache Pluto或Liferay Portal。 **二、Wicket 开发流程** 1. **创建页面类**:在Wicket中,每个页面都有一个对应的Java类,类中...

    appconnector-portlet-local:appconnector-portlet-local

    1. **portlet生命周期**:Portlets有初始化、渲染、动作处理和资源请求等不同阶段,每个阶段都有相应的API供开发者使用,如`doView`用于渲染视图,`processAction`处理用户提交的动作请求。 2. **MVC模式**:...

Global site tag (gtag.js) - Google Analytics