2014-07-24 65 views
1

我有2個liferay + springmvc portlet應用程序(2個war文件)。如何在liferay + springmvc中調用另一個Portlet @RenderMapping方法?

第一門戶的portlet類列出了所有可用的類別。點擊分類鏈接後,我將顯示產品(默認頁面)頁面,其中包含來自所選類別的產品列表。我通過PortletSession傳達選定的類別。

在門戶-2,用戶可以添加產品到購物車,並導航到車網頁(這也是在門戶-2)。

現在,如果用戶點擊門戶-1,則餘萬,以顯示產品(默認)頁另一個類別。但是目前發生的情況是,當portlet-1上的類別鏈接被點擊後,購物車頁面被重新渲染,因爲購物車頁面現在在portlet-2上處於活動狀態,這是預期的。

@Controller 
@RequestMapping("VIEW") 
public class CatalogListingPortlet { 

    @Autowired 
    private CategoryRepository categoryRepository; 

    @RenderMapping 
    public String handleRenderRequest(RenderRequest request, RenderResponse response, Model model) { 
     model.addAttribute("categories", categoryRepository.findAll()); 
     return "categories"; 
    } 

    @ActionMapping(params = "action=showCategory") 
    public void showCategory(ActionRequest request, ActionResponse response) { 
     String categoryId = ParamUtil.get(request, "categoryId",StringPool.BLANK); 
     request.setAttribute("categoryId", categoryId); 
     PortletSession portletSession = request.getPortletSession(); 
     portletSession.setAttribute("LIFERAY_SHARED_categoryId", categoryId, PortletSession.APPLICATION_SCOPE); 
    } 
} 


@Controller 
@RequestMapping("VIEW") 
public class ProductListingPortlet 
{ 
    @Autowired 
    private CategoryRepository categoryRepository; 

    @Autowired ProductRepository productRepository; 

    @RenderMapping 
    public String handleRenderRequest(RenderRequest request, RenderResponse response, Model model) { 
     PortletSession portletSession = request.getPortletSession(); 
     String categoryId = (String) portletSession.getAttribute("LIFERAY_SHARED_categoryId", PortletSession.APPLICATION_SCOPE); 
     Category category = categoryRepository.findOne(Long.parseLong(categoryId)); 
     List<Product> products = category.getProducts(); 
     portletSession.setAttribute("PRODUCTS", products); 
     return "products"; 
    } 

    @ActionMapping(params = "action=addProductToCart") 
    public void addProductToCart(ActionRequest request, ActionResponse response) { 
     //logic to add the selected product to cart  
    } 

    @RenderMapping(params = "action=checkout") 
    public String checkout(RenderRequest request, RenderResponse response, Model model) { 
     return "checkout"; 
    } 

} 

當用戶點擊portlet-1中的分類鏈接時,我想調用portlet-2中的@RenderMapping方法。

CatalogListingPortlet.showCategory特定()方法我需要觸發ProductListingPortlet.handleRenderRequest()方法。

我該怎麼辦? portlet.xml中

@EventMapping(value ="{http://liferay.com/events}ipc.messsage") 
public void receiveEvent(EventRequest request, EventResponse response) { 
    Event event = request.getEvent(); 
    String messsage = (String)event.getValue(); 
    //process the message 
} 

配置:

回答

2

您可以通過IPC(Portlet間通信)發送的portlet之間的數據:

在CatalogListingPortlet:

@ActionMapping(params = "action=showCategory") 
public void showCategory(ActionRequest request, ActionResponse response) { 
    QName qname = new QName("http://liferay.com/events","ipc.messsage","x"); 
    response.setEvent(qname, "some message"); 
} 

在ProductListingPortlet

<portlet> 
    <portlet-name>catalogListingPortlet</portlet-name> 
    ... 
    <supported-publishing-event> 
     <qname xmlns:x="http://liferay.com/events">x:ipc.messsage</qname> 
    </supported-publishing-event> 
</portlet> 
<portlet> 
    <portlet-name>productListingPortlet</portlet-name> 
    ... 
    <supported-processing-event> 
     <qname xmlns:x="http://liferay.com/events">x:ipc.messsage</qname> 
    </supported-processing-event> 
</portlet> 

<event-definition> 
    <qname xmlns:x="http://liferay.com/events">x:ipc.messsage</qname> 
    <value-type>java.lang.String</value-type> 
</event-definition> 
+0

工作就像一個魅力:-)但除了小..讓ProductListingPortlet.handleRenderRequest()方法調用我要補充response.setPortletMode(PortletMode.VIEW);在receiveEvent()方法中。非常感謝。 –

相關問題