(Portal 开发读书笔记)Portlet间交互-PortletSession

简介:

 PortletSession特别适用于同一个Portlet应用下的多个Portlet之间交互。

步骤1:把要交互的多个Portlet都定义在同一个portlet.xml中

 
 
  1. <portlet-app...> 
  2. <portlet> 
  3. <portlet-name>recentBook</portlet-name> 
  4. <portlet-class> 
  5. chapter11.code.listing.base.RecentlyAddedBookPortlet 
  6. </portlet-class> 
  7. <expiration-cache>0</expiration-cache> 
  8. <cache-scope>private</cache-scope> 
  9. ... 
  10. <resource-bundle> 
  11. content.Language-ext 
  12. </resource-bundle> 
  13. <portlet-info> 
  14. <title>Recently Added Book</title> 
  15. </portlet-info> 
  16. </portlet> 
  17. <portlet> 
  18. <portlet-name>bookCatalog</portlet-name> 
  19. <portlet-class> 
  20. chapter11.code.listing.base.BookCatalogPortlet 
  21. </portlet-class> 
  22. ... 
  23. <expiration-cache>60</expiration-cache> 
  24. <cache-scope>private</cache-scope> 
  25. ... 
  26. <resource-bundle> 
  27. content.Language-ext 
  28. </resource-bundle> 
  29. <portlet-info> 
  30. <title>Book Catalog</title> 
  31. </portlet-info> 
  32. ... 
  33. </portlet> 
  34. ... 
  35. </portlet-app> 

步骤2:在代码中使用PortletSession来存/取 数据:

一般Portlet交互,从其行为看,分为发送者Portlet和接收者Portlet:

发送者Portlet会添加数据到PortletSession的APPLICATION_SCOPE上来使得这数据可以跨Portlet交互:

 
 
  1. @ProcessAction(name = "addBookAction"
  2. public void addBook(ActionRequest request, 
  3. ActionResponse response)throws... { 
  4. ... 
  5. if (errorMap.isEmpty()) { 
  6. //调用bookService让其添加一本书到book catalog中
  7. bookService.addBook(new Book(category, name, author, Long.valueOf(isbnNumber))); 
    //将书的ISBN号添加到PortletSession的APPLICATION_SCOPE上用于Portlet之间的交互
  8. request.getPortletSession().setAttribute ("recentBookIsbn", isbnNumber, PortletSession.APPLICATION_SCOPE); 
  9. ... 

接收者Portlet会从PortletSession的APPLICATION_SCOPE上吧数据拿下来用于处理或者显示:

 
 
  1. public class RecentlyAddedBookPortlet extends GenericPortlet @RenderMode(name="view"
  2. public void showRecentBook(RenderRequest request, 
  3. RenderResponse response)throws ...{ 
  4. //从PortletSession的APPLICATION_SCOPE上获取用于交互的数据
  5. String isbnNumber = (String)request.getPortletSession().getAttribute("recentBookIsbn"PortletSession.APPLICATION_SCOPE); 
  6. ... 
  7. //获取数据(ISBN号)之后,如果不为空,则让bookService基于这个isbn号进行查询返回对应的书,否则返回最近一本书
  8. if(isbnNumber != null) { 
  9. if(bookService.isRecentBook 
  10. (Long.valueOf(isbnNumber))) { 
  11. book = bookService.getBook(Long.valueOf(isbnNumber)); 
  12. else { 
  13. book = bookService.getRecentBook(); 
  14. else { 
  15. book = bookService.getRecentBook(); 
  16. //把获得的书的内容放到RenderRequest上
  17. request.setAttribute("book", book); 
  18. //让Portlet引擎用添加的书的内容渲染到指定JSP页面上
  19. getPortletContext().getRequestDispatcher( response.encodeURL(Constants.PATH_TO_JSP_PAGE + "recentPortletHome.jsp")).include(...); 


有些Portal服务器有额外的在跨Portlet应用的Portlet之间共享session数据的方法,比如Liferay Portal中,可以在portal-ext.properties中定义session.shared.attributes属性,在liferay-portlet.xml中定义<private-session-attributes>元素,但是这些方法会导致移植性问题





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/847440,如需转载请自行联系原作者

目录
相关文章
|
JavaScript 数据可视化 前端开发
《面向三维GIS的Cesium开发与应用》读书笔记
《面向三维GIS的Cesium开发与应用》读书笔记
|
安全 测试技术 数据安全/隐私保护
软件安全开发生命周期读书笔记
分阶段: 0. 教育和意识       1.微软成功的原因在于管理层支持和教育与培训.       2.工程师必须对基本的安全弱点、常见的安全漏洞类型、基本的安全设计有所了解。
1458 0
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
存储 关系型数据库 编译器
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
109 1