(Portal 開發讀書筆記)Portlet間交互-使用Portlet Events

 Portlet事件也是JSR-286(Portlet 2.0新添加的一種Portlet之間交互的方式),比起Public Render參數的交互方式,它能夠傳遞大對象而不僅侷限於字符串或者字符串數組,並且能夠啓用cache.比起PortletSession,它又支持跨Portlet應用的Portlet交互.java

(我驚歎:果真事件驅動的思想深刻人心而且無處不在啊,已經在無數地方看到了事件驅動的強大能力了)數組

 

步驟1:先定義一個Event類,它必須實現Serializable接口, 由於有可能要被遠程的Portlet容器裏面的Portlet所接受,因此要在網絡傳輸所以要被序列化,序列化的方式就是用JAXB將其轉爲XML文檔而後在網絡上傳輸。網絡

這個@XmlRootElement表示這個事件將以xml的形式被Portlet容器發佈出去app

  
  
  
  
  1. import chapter11.code.listing.domain.Book; 
  2. import javax.xml.bind.annotation.XmlRootElement; 
  3. @XmlRootElement 
  4. public class BookAddedEvent implements Serializable
  5. private static final long serialVersionUID = ... 
  6. private String name; 
  7. private String author; 
  8. private Long isbnNumber; 
  9. private String category; 
  10. public BookAddedEvent() { 
  11. //-- do nothing 
  12. public BookAddedEvent(Book book) { 
  13. this.name = book.getName(); 
  14. this.author = book.getAuthor(); 
  15. this.category = book.getCategory(); 
  16. this.isbnNumber = book.getIsbnNumber(); 
  17. ... 

而後這個Book添加的事件就會轉爲以下的XML序列化的文檔而且在網絡上傳輸:dom

  
  
  
  
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
  2. <bookAddedEvent> 
  3. <author>Ramnivas Laddad</author> 
  4. <category>Java</category> 
  5. <isbnNumber>1933988053</isbnNumber> 
  6. <name>AspectJ in Action, Second Edition</name> 
  7. </bookAddedEvent> 

 

步驟2:在發送者Portlet的方法中添加這個事件對象:ide

  
  
  
  
  1. public class BookCatalogPortlet extends GenericPortlet { 
  2. @ProcessAction(name = "addBookAction"
  3. public void addBook(...)... { 
  4. ... 
  5. Book book = new Book(category, name, author, Long 
  6. .valueOf(isbnNumber)); 
  7. //調用bookService的addBook方法來添加這本書
  8. bookService.addBook(book); 
  9. //同時,建立一個QualifiedName來表明事件的惟一名稱(有了某個名字空間)
  10. QName eventName = new QName( 
  11. "http://www.mynamespace.com""bookAddedEvent" 
  12. ); 
  13. //在response對象中,將Event的內容和Event的QName進行綁定
  14. response.setEvent(eventName, new BookAddedEvent(book); 
  15. ... 

 

步驟3:在portlet.xml的<portlet>中聲明這個portlet所支持的發佈事件,而且在portlet應用級別顯式的定義它所發佈的事件<supported-publishing-event>(事件的qname關聯到具體的事件類類型)this

  
  
  
  
  1. <portlet-app...> 
  2. <portlet> 
  3. <portlet-name>bookCatalog</portlet-name> 
  4. <portlet-class> 
  5. chapter11.code.listing.base.BookCatalogPortlet 
  6. </portlet-class> 
  7. ... 
  8. <supported-publishing-event> 
  9. <qname xmlns:n="http://www.mynamespace.com"> 
  10. n:bookAddedEvent</qname> 
  11. </supported-publishing-event> 
  12. </portlet> 
  13. <event-definition> 
  14. <qname xmlns:n="http://www.mynamespace.com"> 
  15. n:bookAddedEvent</qname> 
  16. <value-type>chapter11.code.listing.base. 
  17. BookAddedEvent</value-type> 
  18. </event-definition> 
  19. ... 
  20. </portlet-app> 

 

步驟4;在接收者Portlet中,用代碼顯示的從事件中獲取所須要的內容而且處理:spa

 

  
  
  
  
  1. public class RecentlyAddedBookPortlet extends GenericPortlet ... 
  2.  
  3. @ProcessEvent(qname= 
  4.  
  5. "{http://www.mynamespace.com}bookAddedEvent"
  6.  
  7. public void processAddedBookEvent(EventRequest 
  8.  
  9. request, EventResponse eventResponse) throws...{ 
  10.  
  11. Event event = request.getEvent(); 
  12.  
  13. BookAddedEvent bookAddedEvent = 
  14.  
  15. (BookAddedEvent)event.getValue(); 
  16.  
  17. eventResponse.setRenderParameter("category"
  18.  
  19. bookAddedEvent.getCategory()); 
  20.  
  21. eventResponse.setRenderParameter("name"
  22.  
  23. bookAddedEvent.getName()); 
  24.  
  25. eventResponse.setRenderParameter("author"
  26.  
  27. bookAddedEvent.getAuthor()); 
  28.  
  29. eventResponse.setRenderParameter("isbnNumber"
  30.  
  31. String.valueOf(bookAddedEvent.getIsbnNumber())); 
  32.  
  33.  
 
步驟5:在接收者Portlet的portlet.xml中定義這個Portlet所能處理的事件<supported-processing-event>:
 
  
  
  
  
  1. <portlet-app...> 
  2. <portlet> 
  3. <portlet-name>recentBook</portlet-name> 
  4. <portlet-class> 
  5. chapter11.code.listing.base.RecentlyAddedBookPortlet 
  6. </portlet-class> 
  7. ... 
  8.  
  9. <supported-processing-event> 
  10. <qname xmlns:n="http://www.mynamespace.com"> 
  11. n:bookAddedEvent</qname> 
  12. </supported-processing-event> 
  13. </portlet> 
  14. <event-definition> 
  15. <qname xmlns:n="http://www.mynamespace.com"> 
  16. n:bookAddedEvent</qname> 
  17. <value-type>chapter11.code.listing.base. 
  18. BookAddedEvent</value-type> 
  19. </event-definition> 
  20. ... 
  21. </portlet-app>
相關文章
相關標籤/搜索