- 浏览: 216977 次
- 性别:
- 来自: 湖北->上海
最新评论
-
苹果超人:
我也遇到这个问题,我想在ConfigurationAction ...
杀千刀的PortletPreferences -
flago:
Liferay 的论坛设置的默认显示多少条帖子怎么设置??
liferay中vm中如何调用java类代码 -
ofdata:
遭遇此问题
杀千刀的PortletPreferences -
yaokaiwen99:
大哥求一个简单的flexigrid在liferay中应用的例 ...
Liferay异步提交 -
gaigai511225:
你好 插件环境那个url 具体怎么写 我照您的方式写了出错 ...
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
发表评论
-
JSR 286 Portlet 的新特性,第 3 部分: Portlet 过滤器和 Portlet 窗口
2010-06-01 10:24 2488在 本系列 的 第 1 部分 简要回顾了JSR 1 ... -
JSR 286 Portlet 的新特性,第 2 部分: 资源服务、事件与共享呈现参数
2010-05-31 18:42 2201在本系列的 第 1 部分 简要回顾了 J ... -
JSR 286 Portlet 的新特性,第 1 部分: Portlet 2.0 新特性介绍
2010-05-31 17:55 2378本系列文章专门针 ... -
Session share
2010-05-14 12:18 0Tomcat Server.xml <Servi ... -
Liferay集群负载均衡配置
2009-10-30 11:14 4882先介绍一下项目系统的环境, Liferay Version: ... -
Liferay 集群部署
2009-10-30 00:00 0十二点了,明天断续 -
Liferay 权限策略
2009-10-29 23:45 3094先上一张大家都很熟悉的图 这张图可以说是整 ... -
Liferay Portlet之间的通信
2009-10-29 19:12 5006从我做Liferay到现在,这个问题一直都存在着,直到最近我才 ... -
Liferay异步刷新
2009-10-29 18:05 3171Liferay portlet异步刷新,分为两种情况。 ... -
准备开始整理半年来对lifeay新的学习成果
2009-10-29 18:04 1491有半年没有写过liferay的blog了,不过对life ... -
Ajax知识
2009-06-11 17:50 0<SCRIPT LANGUAGE=" ... -
改变Liferay Portal Context(让Liferay不在使用ROOT目录)
2009-05-25 22:46 1823在部署的时候如果遇到我们会遇到让liferay与其他的项目并存 ... -
velocity调用DB持久层,生成actionurl
2009-05-22 17:42 1173#set($hostelCacheService = $ser ... -
liferay 所有版本下载地址
2009-05-21 13:29 3206从1.7.5一直到现在的5.2.3,应有尽有。 htt ... -
liferay ldap配置与相关代码
2008-11-28 11:06 38201.下载LDAP server 并安装, liferay支 ... -
liferay 的加密技术(CRYPT,SHA,SSHA,MD2,MD5)
2008-11-27 15:59 4284package com.liferay.util; impo ... -
liferay openid配置与代码详解
2008-11-21 21:14 28241.liferay的openid的配置很简单的,先去 open ... -
liferay验证码认证
2008-08-27 15:26 2733生成验证码相关: /** * Copyright (c ... -
很烦,想站在阳台上大声的喊
2008-08-20 19:42 1794终于到回家了,好累, ... -
网络爬虫相关(自已记下来,怕以后忘记)
2008-08-16 13:15 1925package com.taobao.html; impor ...
相关推荐
初始化阶段加载portlet的配置,渲染阶段负责显示portlet内容,动作阶段处理用户提交的表单数据。 5. **Portlet开发基础** - **portlet.xml**:定义portlet的元数据,包括portlet名称、显示模式、URL映射等。 - **...
这个类将包含处理用户请求的方法,如`doView`(显示Portlet内容)和`processAction`(处理用户提交的表单动作)。 3. **portlet.xml配置**:编辑portlet.xml文件,配置Portlet的行为,如Portlet名称、显示模式、...
通过这个方法,我们可以异步地处理用户的交互,如按钮点击、表单提交等,并只更新必要的Portlet区域。 在示例中,`serveResource`方法中获取了请求参数`message`,这可能是通过Ajax发送的数据。然后,我们可以根据...
此外,可能还需要使用AJAX异步提交文件,以提供更好的用户体验。 7. **权限管理**:Liferay支持细粒度的权限控制,确保只有授权的用户可以进行图片上传。在开发过程中,需要考虑到这些权限设置。 通过分析和实现这...
4. 表单提交:可以使用AJAX异步提交,或者传统的HTTP POST方法提交表单数据。 三、Portlet Web Form开发 在Portlet中实现Web表单,需要结合portlet的生命周期和API来处理表单的显示、提交和处理。以下是一些关键...
此外,Portlet可以通过`PortletPreferences`来存储用户自定义的设置,通过`PortalContext`获取关于门户环境的信息,通过`ResourceRequest`和`ResourceResponse`处理异步资源请求。Liferay的Service Builder可以帮助...
Portlet是Java Portlet API定义的一种可重用、可组合的Web部件,它在门户环境中运行,如Liferay、Pluto等。在这个特定的场景中,"文件上载Portlet源代码"是为了实现portlet的文件上传功能,使得用户能够在portlet中...
- **异步处理**:portlet可以异步处理请求,提高性能和用户体验。 ### 4. JSR 168与JSR 286 - **JSR 168**:定义了portlet的原始规范,包括portlet的生命周期、渲染模型、事件模型等基础功能。 - **JSR 286**:...
- 使用`ResourceRequest`和`ResourceResponse`处理资源请求,适用于异步或AJAX操作。 5. **portlet的生命周期**: - 初始化(`init`):portlet首次加载时调用。 - 服务(`doView`、`processAction`、`...
- Portlet是Java Portlet API定义的一种组件模型,主要应用于企业级门户系统,如IBM WebSphere Portal或Liferay Portal。 - 它们可以独立于门户服务器进行开发,并通过portlet容器进行部署,提供个性化和交互性的...
Portlet运行在支持JSR 286的门户服务器上,如IBM WebSphere Portal、Liferay Portal或Apache Pluto。开发者需要在这些服务器上部署portlet应用,然后通过门户管理员界面添加和配置portlet。 8. **portlet的交互** ...
- **框架支持**:在实际开发中,常常会使用如 Liferay、JBoss Portal 等成熟的门户框架来简化开发过程。 #### 三、Portlet 的生命周期 - **初始化阶段**:当 Portlet 首次被加载时,服务器会调用其 init() 方法...
Portlet框架是为portlet容器(如Liferay、WebSphere Portal)提供的一套标准,它定义了portlet的生命周期、渲染机制以及portlet间通信的规则。portlet是一种独立的、可重用的Web组件,可以嵌入到portlet门户中,提供...
5. **JSR 168/286 支持**:Wicket 兼容portlet标准,可以无缝集成到portlet容器,如Apache Pluto或Liferay Portal。 **二、Wicket 开发流程** 1. **创建页面类**:在Wicket中,每个页面都有一个对应的Java类,类中...
1. **portlet生命周期**:Portlets有初始化、渲染、动作处理和资源请求等不同阶段,每个阶段都有相应的API供开发者使用,如`doView`用于渲染视图,`processAction`处理用户提交的动作请求。 2. **MVC模式**:...