JSR168规范规定,
所有
Portlet
都必须直接地或者间接地实现
Portlet
接口。同时,也提供了一个叫
GenericPortlet
的基类,该类继承了
Portlet
接口,统一定义了可供
Portal
容器识别和调用的方法。因此,大部分情况下,开发人员只需要继承
GenericPortlet
这个基类,而不必直接实现
Portlet
接口。
Liferay Portal
也是一个支持
JSR168
的企业门户,我们来看看在它的内部,是如何扩展
GenericPortlet
的。
1)
它自定义类
LiferayPortlet
扩展
GenericPortlet
,增加几个模式,如
CONFIG
、
EDIT_GUEST
、
EDIT_DEFAULT
、
PREVIEW
、
PRINT.
2)
定义
class StrutsPortlet
,扩展
LiferayPortlet
,初始化模式参数,并定义了
process action
的过程。在
liferay
中,配置文件
portlet-custom.xml
中配置各
portlet
的一些,其中有个很重要的参数是
portlet-class
,该参数的值一般是
com.liferay.portlet.StrutsPortlet
,表明该
portlet
是
struts portlet.
3)
定义类
JSPPortlet
,扩展
LiferayPortlet
,该类在
liferay
中用不上,所以这边不做研究。简单提一下,如果参数
portlet-class
配置的值是
JSPPortlet
,那么该
portlet
是
JSPPortlet
。
4)
注意到有个
IFramePortlet
扩展了
StrutsPortlet
,大家可能就有疑问了,为什么在
liferay
中,有那么多的
portlet
,单单就它需要扩展
StrutsPortlet
,通过查看该类的源代码:
public static final String DEFAULT_EDIT_ACTION = "/iframe/edit";
public static final String DEFAULT_VIEW_ACTION = "/iframe/view";
public void init(PortletConfig config) throws PortletException {
super.init(config);
if (Validator.isNull(editAction)) {
editAction = DEFAULT_EDIT_ACTION;
}
if (Validator.isNull(viewAction)) {
viewAction = DEFAULT_VIEW_ACTION;
}
}
可以清楚的知道,
IFramePortlet
定义自身所需要的
default action
,当
portlet
没有配置
editAction
和
viewAction
的值时,在代码中赋予默认的值
。
下面图示了这个继承、扩展关系: