Java 如何在liferay+;springmvc?

Java 如何在liferay+;springmvc?,java,spring,spring-mvc,liferay,liferay-6,Java,Spring,Spring Mvc,Liferay,Liferay 6,我有2个liferay+SpringMVCPortlet应用程序(2个war文件) 第一个portlet是Category portlet,它列出了所有可用的类别。单击类别链接时,我将显示产品(默认页面)页面,其中包含portlet-2中所选类别的产品列表。我正在通过PortletSession与所选类别进行通信 在portlet-2中,用户可以将产品添加到购物车并导航到购物车页面(也在portlet-2中) 现在,若用户单击portlet-1上的另一个类别,那个么我希望显示产品(默认)页面。但

我有2个liferay+SpringMVCPortlet应用程序(2个war文件)

第一个portlet是Category portlet,它列出了所有可用的类别。单击类别链接时,我将显示产品(默认页面)页面,其中包含portlet-2中所选类别的产品列表。我正在通过PortletSession与所选类别进行通信

在portlet-2中,用户可以将产品添加到购物车并导航到购物车页面(也在portlet-2中)

现在,若用户单击portlet-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";
    }

}
@控制器
@请求映射(“视图”)
公共类CatalogListingPortlet{
@自动连线
私人分类报告分类报告;
@渲染映射
公共字符串HandlerRenderRequest(RenderRequest请求、RenderResponse响应、模型){
addAttribute(“categories”,categoryRepository.findAll());
返回“类别”;
}
@ActionMapping(params=“action=showCategory”)
public void showCategory(ActionRequest请求、ActionResponse响应){
String categoryId=ParamUtil.get(请求“categoryId”,StringPool.BLANK);
setAttribute(“categoryId”,categoryId);
PortletSession PortletSession=request.getPortletSession();
portletSession.setAttribute(“LIFERAY_共享_categoryId”,categoryId,portletSession.APPLICATION_作用域);
}
}
@控制器
@请求映射(“视图”)
公共类ProductListingPortlet
{
@自动连线
私人分类报告分类报告;
@自动连线产品储存库产品储存库;
@渲染映射
公共字符串HandlerRenderRequest(RenderRequest请求、RenderResponse响应、模型){
PortletSession PortletSession=request.getPortletSession();
String categoryId=(String)portletSession.getAttribute(“LIFERAY\u SHARED\u categoryId”,portletSession.APPLICATION\u SCOPE);
Category Category=categoryRepository.findOne(Long.parseLong(categoryId));
List products=category.getProducts();
setAttribute(“产品”,产品);
退回“产品”;
}
@ActionMapping(params=“action=addProductToCart”)
public void addProductToCart(ActionRequest请求、ActionResponse响应){
//将所选产品添加到购物车的逻辑
}
@RenderMapping(params=“action=checkout”)
公共字符串签出(RenderRequest请求、RenderResponse响应、模型){
返回“结帐”;
}
}
当用户单击portlet-1中的类别链接时,我想调用portlet-2中的@RenderMapping方法

要从CatalogListingPortlet.showCategory()方法中指定,我需要触发ProductListingPortlet.handleRenderRequest()方法


我怎么做?

您可以通过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");
}
@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
}
在ProductListingPortlet中:

@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");
}
@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
}
portlet.xml中的配置:

<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>

catalogListingPortlet
...
x:ipc.Message
productListingPortlet
...
x:ipc.Message
x:ipc.Message
java.lang.String
工作起来很有魅力:-)但添加的内容很少。。要调用ProductListingPortlet.handleRenderRequest()方法,我必须添加response.setPortletMode(PortletMode.VIEW);在receiveEvent()方法中。谢谢。