我正在尝试使用LifeRay 6.1开发基本的portlet。我精通各种MVC实现,但是我发现Liferay / java portlet有点令人困惑- 尤其是执行管道。
我使用的大多数MVC框架的前提是简单的请求>路由器>控制器>视图。视图选择通常基于控制器/动作命名约定,随请求传递的参数或在控制器动作中手动加载的参数。
使用LifeRay MVCPortlet不能像这样工作。至少可以生成两种类型的网址-呈现网址和操作网址。
呈现URL似乎完全绕开了我认为是控制器的东西- MVCPortlet的子类。这些URL似乎相对容易生成,并且请求加载了预期的视图,如果您可以调用它,则考虑所有意图和目的,它会完全绕开控制器,而与模型无关。
<portlet:renderURL var="badminURL"><portlet:param name="mvcPath" value="/views/edit.jsp" /></portlet:renderURL>
操作URL穿过控制器,调用该操作,然后使用默认视图来呈现portlet,而不管我提供的mvc路径如何。
<portlet:actionURL var="adminURL" name="editSlide"><portlet:param name="mvcPath" value="/views/edit.jsp" /></portlet:actionURL>
仔细阅读类树,我可以看到一个属性用于定义根据portlet模式使用的视图。即
this.viewTemplate = "/views/edit.jsp"; this.editTemplate = "/views/edit.jsp";
在init()被调用之后再次设置此项似乎仅在不通过actionURL访问时才有效。
所以我想我的问题很基本,如何通过actionURL选择视图以及如何选择视图。另外,关于执行管道的任何提纲都会非常有帮助
我找到了解决方案。您可以在传递给控制器动作的ActionResponse对象上分配渲染参数。这告诉liferay加载提供的视图。即
public void editSlide(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException { // action code goes here // set up the view actionResponse.setRenderParameter("mvcPath", "/views/edit.jsp"); }