liferay mvcportlet中怎么在一个Portlet中完成跳转

开发一个简单的portlet_数码家电_中国百科网 开发一个简单的portlet     本例要做一个简单的portlet,这个portlet所要实现的功能是在edit页面中输入字符串并且提交,在view页面中能够显示出这个字符串。要完成这个portlet的开发,首先要请参考《开发指南1》生成一个plugin工程。然后打开eclipes,新建一个Dynamic web project 工程,项目的名称为hello,在project location 中取消use default location 的选项,在location这栏中选取1中所建的工程。 这里注意src所在的位置要改为docroot/WEB-INF/src,如下图 最后content directory 中写docroot。最后将Generate web.xml deployment descriptor 取消。如下图 工程所依赖的最少的jar包为 以上是使用liferay的插件建立portlet的 过程。但是这种做法实际上是图形化的调用原来liferay提供的ant命令来完成的。如果我们熟悉后,可以直接使用liferay sdk的ant命令来生成portlet工程首先进入sdk的portlet目录。然后用命令 create hello “HelloDemo”然后进入hello-portlet目录。然后执行ant deploy发布一下,这样做的好处是自动产生classes目录接下来讲一下,在普通的eclipse引入工程的做法首先建立一个普通的java project 然后进入选择我们建好的工程。然后直接点finish。接下来进入hello-portlet目录中将src目录拷贝到docroot/WEB-INF/ 中。然后回到eclipes中刷新一下工程,这样会发现有错,然后在File àproperties àjava Build path àsource .将source里的删除,然后点击add folder ,选择WEB-INF中的src 。然后在out folder选择WEB-INF/classes 目录。然后在依赖包中选择必须的6个包。然后工程就建立好。上面的工作做好后,新建一个名为com.tellhow.portlettest的package ,然后在该package中建一个名为TestPortle的类.这个类继承自MVCPortlet 。这个类中有2个方法,一个是在edit页面中输入名称后点击确定所调用点方法,另外一个是展示view页面所调用的方法。代码如下:publicclass TestPortlet extends MVCPortlet { /** * * 点击确定所调用的方法,先从actionRequest中得到传入的参数, * 然后保存到数据库中,最后跳转到view页面。 * */ @ProcessAction(name = "Persistence") publicvoid Persistence(ActionRequest actionRequest, ActionResponse actionResponse) throws ReadOnlyException, ValidatorException, IOException, PortletModeException { // 得到portlet实例化类。 PortletPreferences preferences = actionRequest.getPreferences(); // 从ActionRequest中取得页面上传入的值。并且设置到实例化类中 preferences.setValue("name", actionRequest.getParameter("name") .toString()); // 把得到的值保存到数据库中 preferences.store(); // 跳转到view页面 actionResponse.setPortletMode(PortletMode.VIEW); } /** * 复写父类中的doView方法,先得edit页面中存入数据库的值, * 然后页面跳转到view.jsp * */ publicvoid doView(RenderRequest request, RenderResponse response) throws IOException, PortletException { // 得到portlet实例化类。 PortletPreferences preferences = request.getPreferences(); //取出存入数据库中的值 String names = preferences.getValue("name", ""); //将取到点值设置到request中 request.setAttribute("names", names); //跳转到view页面。 include(viewJSP, request, response); } portlet类建立好后修改protlet.xml ,先把中的值改成com.tellhow.portlettest.TestPortlet ,注意要全路径+类名。com.tellhow.portlettest.TestPortlet 因为我们有2个页面,一个view页面,一个edit页面,所以在初始化参数中增加edit页面点声明 edit-jsp edit.jsp 并且要声明支持view和edit两种类型portlet 模式。 text/html view edit 接下来就要建立edit.jsp 和view.jsp 这个页面了, edit.jsp页面的代码如下: <%@tagliburi="/portlet_2_0"prefix="portlet"%> Name:
view.jsp页面的代码如下:<%@tagliburi="/portlet_2_0"prefix="portlet"%>

This is the Hello World portlet.

Hello <%= names %>!

编译好后,进入工程所在目录,用ant进行编译。这里有几点需要大家注意的地方。 1.数据库的字符集一定要设置为utf-8,否则输入汉字会出现错误。2.@ProcessAction(name = "Persistence") public void Persistence(ActionRequest actionRequest, ActionResponse actionResponse) throws ReadOnlyException, ValidatorException, IOException, PortletModeException {这块方法名必须要和标记中name的名称一致否则会报错。3. 在TestPortlet 这个类中,如果要用标记这种方式来处理action,就不能出现ProcessAction这个方法,否则其他的带@ProcessAction标记的方法都不会起作用。 Copyright by ;All rights reserved.君,已阅读到文档的结尾了呢~~ 扫扫二维码,随身浏览文档 手机或平板扫扫即可继续访问 在Liferay中如何利用LiferaypluginSDK进行portlet的快速开发 举报该文档为侵权文档。 举报该文档含有违规或不良信息。 反馈该文档无法正常浏览。 举报该文档为重复文档。 推荐理由: 将文档分享至: 分享完整地址 文档地址: 粘贴到BBS或博客 flash地址: 支持嵌入FLASH地址的网站使用 html代码: &embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed& 450px*300px480px*400px650px*490px 支持嵌入HTML代码的网站使用 您的内容已经提交成功 您所提交的内容需要审核后才能发布,请您等待! 3秒自动关闭窗口Liferay中如何在PortletSession中放入属性然后在Portlet中使用 - 推酷 Liferay中如何在PortletSession中放入属性然后在Portlet中使用 我们有以下一个需求,比如我们在用户登录模块,登录成功后我们会得到一个authToken, 然后我们希望吧这个authToken存放在Portal级别的Session中,然后在我们的指定的Portlet中从Portal级别的Session中使用这个Session,那么如何才能做到呢? 很显然,我们在用户登录中[项目1:一个LoginHook](比如我们用Struts2做了一个登录Action),因为我们能访问到的是HttpServletRequest,所以我们的代码是显而易见的 在Action中我们设置属性到Session上: 然后我们在项目2:Portlet上拿属性,因为我们我们要Session是PortletSession,所以scope设置的是PortletSession.APPLICATION_SCOPE (这个如何不明白可以参见 然后我们想,只要属性的key一样就可以了,所以在用户登录模块中设置key为 ”authToken&,在Portlet中取key为&authToken&,原来信心满满的以为肯定能取到,结果调试一下,这个Portlet第106行居然拿到的authToken为null。奇怪了,我们明明放上去了啊,肯定是忽略了什么? 这问题其实花了我1个多小时才解决,后来才发现,我们的session逻辑分为2部分,一个是 portalSession portletSession ,他们共同封装在类 SharedSessionWrappe 如果我们要从session上取值的时候,这个值来自 portalSession portletSession 和authToken的取值有关,这个key必须满足指定的前缀,才能保证这个值是从portalSession中取来的。 先讲调试成功的例子: 我们假设这authToken取值是以 LIFERAY_SHARED_ 前缀开头,比如叫 LIFERAY_SHARED_ GeneratedAuthToken, 那么在Portlet 106行,调试session.getAttribute的时候,它的session来自于getSessionDelegate()方法: 而这个getSessionDelegate()方法定义在SharedSessionWrapper类中,它的逻辑如下: 从这里可以看出,session的取值可以是portalSession,也可以是portletSession,但是遵守如下原则: (1)如果portletSession不存在,那么就返回portalSession (2)如果我们共享属性的key属于sharedSessionAttributesExcludes列表,即被共享Session排除在外在外的属性,那么session返回portletSession. (3)如果我们的属性key属于sharedAttribute列表,那么session返回portalSession. (4)默认情况,返回portletSession. 所以这里出现了2个很有趣的名词,一个叫sharedSessionAttributesExcludes,这个属性的作用是定义了一组列表,然后列表中的所有属性都不可以作为session的共享属性的,而我们知道portal级别的session是用于共享属性的,所以在这个列表中定义的属性都不可以放在portalSession上。 它的定义在portal.properties中: 所以我们知道,默认上liferay是不让用户名密码从portal级别共享到portlet中的,如果我们希望一些其他属性不想从portal级别共享到portlet级别,我们可以在portal-ext.properties中覆盖这个属性。 另外一个有趣名词叫sharedAttribute,显然,这个应该和上述相反的作用,是定义希望从portal级别共享到portlet级别的属性,从而一旦这种属性的key满足条件,那么他们就应该位于portalSession中从而方便共享。 我们回到代码197行中看出containsSharedAttribute(name)的实现,也就是满足何种条件的属性被视为共享属性(portal到portlet级别的共享) 很容易我们找到了答案,它会去判断我们的属性name是否以session.shared.attributes中定义的某个前缀为前缀,而这个session.shared.attributes同样定义在portal.properties中: 回到我们的例子中,因为我们定义的属性的值为LIFERAY_SHARED_GeneratedAuthToken,而LIFERAY_SHARED_是一个被用于session共享属性的前缀,所以符合要求,所以我们的containsSharedAttribute(name)返回true,从而最后我们getSessionDelegate返回的是portalSession, 所以在portalSession中获取我们存放在portal级别的session上的属性,当然成功了。 而回到我们开始&分析“中给出的例子,假设我们随随便便指定一个属性的key,比如就叫&authToken&,因为他们不满足任何的session.shared.attributes中定义的前缀,所以默认的,根据我们getSessionDelegate()的最后一个分支,它返回的是portletSession,而我们在登录模块中,是吧属性存放在全局的portalSession中的,当然你不可能再portletSession中根据名字获取到相应的属性值,这就是为什么开始我们得到的authToken为null的原因。 (1)在一个Liferay环境中,从Portlet的视角看,它总是对应这2个Session,一个是portalSession,一个是portletSession,并且这个都封装在SharedSessionWrapper中. (2)当共享属性变量时,如何判断是从portalSession中拿属性还是从portletSession中拿属性来自于getSessionDelegate()方法,它取决于session存在性以及属性key的取值,具体逻辑如下: a.如果portletSession不存在,那么就返回portalSession b.如果我们共享属性的key属于sharedSessionAttributesExcludes列表,即被共享Session排除在外在外的属性,那么session返回portletSession. c.如果我们的属性key属于sharedAttribute列表,那么session返回portalSession. d.默认情况,返回portletSession. (3)如果希望某个属性要从portalSession中拿, 那么它的前缀必须满足portal.properties中session.shared.attributes中定义的前缀列表,你可以可以覆写portal.properties中此属性来自定义前缀列表。 (4)如果希望某个属性一定不从portalSession中拿,那么可以吧这个属性的值加到session.shared.attributes.excludes列表中。 已发表评论数() 请填写推刊名 描述不能大于100个字符! 权限设置: 公开 仅自己可见 正文不准确 标题不准确 排版有问题 主题不准确 没有分页内容 图片无法显示 视频无法显示 与原文不一致Liferay 从Dockbar 添加Portlet的事件细节研究_服务器应用_Linux公社-Linux系统门户网站 你好,游客 Liferay 从Dockbar 添加Portlet的事件细节研究 来源:Linux社区& 作者:supercharles888 Part 1: 从页面点击"Add"过程找出事件处理函数: 在Liferay中,当我们从左边选择一个Portlet并且添加的时候,会触发一系列的动作,并且最终把这个Portlet显示在页面上,现在我们就对这个神秘的过程进行窥测。 在页面上,为了找到我们点击Add之后绑定的事件处理函数,我们先找到这段代码对应的jsp页面在/html/portlet/layout_configuration/view_category.jsp中:&&&&&class="lfr-portlet-item&lfr-archived-setup"&&&&&id="&portlet:namespace&/&portletItem&%=&portletItem.getPortletItemId()&%&"&&&&&instanceable="&%=&portletInstanceable&%&"&&&&&plid="&%=&plid&%&"&&&&&portletId="&%=&portlet.getPortletId()&%&"&&&&&portletItemId="&%=&portletItem.getPortletItemId()&%&"&&&&&title="&%=&HtmlUtil.escape(portletItem.getName())&%&"&&&&&&%=&HtmlUtil.escape(portletItem.getName())&%&&href="javascript:;"&key="add"&&& 因为昨天我们研究过,这个文本任意变动都不会影响到添加Portlet事件的触发(参见)文章,所以我们确定点击事件和显示内容无关,而页面上除了这个文本以外任何地方点击都无效(不触发添加Portlet事件),由此看来,我们的事件最终是绑定到&a&元素的,因为这是它唯一和其他部分不同的地方。 最终,我们在/html/js/liferay/layout_configuration.js 中找到了事件绑定关联的地方,它在_loadContent方法中:_loadContent:&function()&{&&&&&&&&&&&&&&&&&&&&&var&instance&=&this;&&&&&&&&&&&&&&&&&&&&&&Liferay.fire('initLayout');&&&&&&&&&&&&&&&&&&&&&&instance.init();&&&&&&&&&&&&&&&&&&&&&&Util.addInputType();&&&&&&&&&&&&&&&&&&&&&&Liferay.on('closePortlet',&instance._onPortletClose,&instance);&&&&&&&&&&&&&&&&&&&&&&instance._portletItems&=&instance._dialogBody.all('div.lfr-portlet-item');&&&&&&&&&&&&&&&&&&&&&&var&portlets&=&instance._portletI&&&&&&&&&&&&&&&&&&&&&&instance._dialogBody.delegate(&&&&&&&&&&&&&&&&&&&&&&&&&'mousedown',&&&&&&&&&&&&&&&&&&&&&&&&&function(event)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&var&link&=&event.currentT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&var&portlet&=&link.ancestor('.lfr-portlet-item');&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&instance._addPortlet(portlet);&&&&&&&&&&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&&&&&&&&&&'a'&&&&&&&&&&&&&&&&&&&&&);& 相关资讯 & & & & (07/11/:02) & (07/11/:30) & (07/11/:44) & (07/11/:59) & (07/11/:59) & (07/11/:09) 图片资讯 & & &    同意评论声明    发表 尊重网上道德,遵守中华人民共和国的各项有关法律法规 承担一切因您的行为而直接或间接导致的民事或刑事法律责任 本站管理人员有权保留或删除其管辖留言中的任意内容 本站有权在网站内转载或引用您的评论 参与本评论即表明您已经阅读并接受上述条款liferay portal 中portlet之间传递信息,点击页面,传递信息去另一个portlet, 怎么让原页面不刷新?_百度知道 liferay portal 中portlet之间传递信息,点击页面,传递信息去另一个portlet, 怎么让原页面不刷新? 第一个portlet的页面form表单提交,还显示点击按钮时的内容,再另一个portlet页面上显示内容,一个页面部署两个portlet,传递信息区另一个portlet,点击按钮比如,怎么让原网页不刷新 提问者采纳 可以的,liferay有个ipc的信息传递机制!csdn里面有这样的源代码,很简单的 csdn在哪? 能给个简单例子源代码吗? 没找到啊 在百度里面搜liferay portlet ipc 出来一大把,祝你成功 提问者评价 其他类似问题 为您推荐: portlet的相关知识 等待您来回答 下载知道APP 随时随地咨询 出门在外也不愁

我要回帖

更多关于 liferay cms portlet 的文章

 

随机推荐