JSR规范规定所有Portlet都必须直接地或者间接地实现Portlet接口同时也提供了一个叫GenericPortlet的基类该类继承了Portlet接口统一定义了可供 Portal 容器识别和调用的方法因此大部分情况下开发人员只需要继承GenericPortlet这个基类而不必直接实现Portlet接口 Liferay Portal也是一个支持JSR的企业门户我们来看看在它的内部是如何扩展GenericPortlet的 ) 它自定义类LiferayPortlet扩展GenericPortlet增加几个模式如CONFIGEDIT_GUESTEDIT_DEFAULTPREVIEWPRINT ) 定义class StrutsPortlet扩展LiferayPortlet初始化模式参数并定义了process action的过程在liferay中配置文件portletcustomxml中配置各portlet的一些其中有个很重要的参数是portletclass该参数的值一般是comliferayportletStrutsPortlet表明该portlet是struts portlet ) 定义类JSPPortlet扩展LiferayPortlet该类在liferay中用不上所以这边不做研究简单提一下如果参数portletclass配置的值是JSPPortlet那么该portlet是JSPPortlet ) 注意到有个IFramePortlet扩展了StrutsPortlet大家可能就有疑问了为什么在liferay中有那么多的portlet单单就它需要扩展StrutsPortlet通过查看该类的源代码 view plaincopy to clipboardprint? 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 { superinit(config); if (ValidatorisNull(editAction)) { editAction = DEFAULT_EDIT_ACTION; } if (ValidatorisNull(viewAction)) { viewAction = DEFAULT_VIEW_ACTION; } } 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 { superinit(config); if (ValidatorisNull(editAction)) { editAction = DEFAULT_EDIT_ACTION; } if (ValidatorisNull(viewAction)) { viewAction = DEFAULT_VIEW_ACTION; } }可以清楚的知道IFramePortlet定义自身所需要的default action当portlet没有配置editAction和viewAction的值时在代码中赋予默认的值 下面图示了这个继承扩展关系 |