这是我现有项目中的Portlet.xml。 有人可以告诉我什么时候我们应该让Portlet类有一个预定义的类和一个自定义类?
<portlet>
<portlet-name>DataUpload</portlet-name>
<display-name>DataUpload</display-name>
<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<init-param>
<name>viewNamespace</name>
<value>/view</value>
</init-param>
</portlet>
<portlet>
<portlet-name>Reports</portlet-name>
<display-name>Reports</display-name>
<portlet-class>com.tata.ReportAction</portlet-class>
</portlet>
答案 0 :(得分:3)
这是一个充分的问题,很难完全回答。但是,有一些规则几乎总是遵循:
如果你的portlet确实使用了一些Java框架(比如Struts 2,JSF),它几乎肯定会使用预定义的javax.portlet.GenericPortlet
子类。所有处理都是由框架完成的,而portlet类的唯一目的是将请求重定向到框架。这种portlet类称为 bridge 。在您的示例中,您的网桥是org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher
。
如果您的portlet确实使用了Liferay MVC portlet并且只在JSP中显示检索到的数据(不更新它们),那么您可能不需要编写自定义portlet类。您可能不需要另一个类,因为com.liferay.util.bridges.mvc .MVCPortlet
类确实自动呈现JSP。我不会详细解释,但重点是。这是一种罕见的情况,所以不要过多考虑它。
如果你的portlet 不使用Liferay MVC,而是用普通的JSR 286 API编写,那么你可能需要编写自定义的portlet类。这是因为render()
的默认doView()
,GenericPortlet
等方法不足以呈现JSP。
如果您的portlet不使用任何Java通用框架,使用Liferay MVC并通过更新它来处理数据,那么您可能需要一些MVCPortlet
的自定义子类。这是因为数据处理是通过在操作阶段调用的方法来完成的。这些方法(通常称为“流程操作方法”)通过具有javax.portlet .ActionRequest
和javax.portlet .ActionResponse
类型的两个参数来识别。
在您的示例中,您有两个portlet:一个使用Struts(因此portlet类只调度对Struts 2的请求),另一个使用自定义portlet类。此portlet类可以扩展GenericPortlet
或MVCPortlet
。如果它使用GenericPortlet
,那么拥有自定义类是不可避免的。如果它确实使用MVCPortlet
,那么这个类可能有一些过程操作方法。
我敢打赌,我的答案过于抽象,但我希望它能为您提供其他问题的一些想法,更具体,更负责任。