Portlet用模式来表示用户在做什么。
JSR-168 定义了三种Portlet 模式,VIEW/EDIT/HELP模式。
- public class PortletMode
- {
- public static final PortletMode VIEW = new PortletMode("view");
- public static final PortletMode EDIT = new PortletMode("edit");
- public static final PortletMode HELP = new PortletMode("help");
- private String _name;
- public PortletMode(String name)
- {
- if (name == null) {
- throw new IllegalArgumentException("PortletMode name can not be NULL");
- }
- this._name = name.toLowerCase(Locale.ENGLISH);
- }
- public String toString()
- {
- return this._name;
- }
- public int hashCode()
- {
- return this._name.hashCode();
- }
- public boolean equals(Object object)
- {
- if (object instanceof PortletMode) {
- return this._name.equals(((PortletMode)object)._name);
- }
- return false;
- }
- }
注意,一个Portlet实例在任何时候都只可以处于一种模式之下,但是它可以被配置为支持多种模式,但是不同的模式不可以同时作用于某个Portlet实例之上(换句话说,可以先是EDIT模式,然后切换到VIEW模式)
模式的通用性:
VIEW是默认的模式,用于显示Portlet (必须支持)
EDIT模式允许Portlet用户定制Portlet实例
HELP模式显示Portlet的用法信息
------
但是:各种不同的Portal Server可以使用规范以外的模式,比如config,print,preview模式
如何自定义Portlet模式?
声明方式:
在portlet.xml中的<supports>元素的<portlet-mode>里面指定该Portlet 所支持的某种模式(自定义模式)
- <portlet>
- <portlet-name>bookCatalog</portlet-name>
- <portlet-class>
- chapter03.code.listing.base.BookCatalogPortlet</portlet-class>
- <supports>
- <mime-type>text/html</mime-type>
- <portlet-mode>print</portlet-mode>
- ...
- </supports>
- ...
- </portlet>
然后,在Portlet应用级别,也就是在portlet.xml中所有<portlet>元素的外面,声明自定义的模式,比如上文中的print模式,我们必须声明如下:
- <portlet-app ...>
- <portlet>
- ...
- </portlet>
- <custom-portlet-mode>
- <portlet-mode>print</portlet-mode>
- </custom-portlet-mode>
- </portlet-app>
注意,这个自定义的portlet mode,比如print ,必须被要部署到的portal server所支持。
编程方式:
- if(PortletRequest.isPortletModeAllowed(new PortletMode("print"))) {
- actionResponse.setPortletMode(new PortletMode("print"));
- }
以上不论是声明方式还是编程方式,都成功的为某个Portlet开启了某种自定义模式,那么这种模式之下这个Portlet的行为如何呢,我们必须用代码来给出它的期望行为:
比如print模式我们希望一个显示一个打印状态下的文档预览,于是:
- @RenderMode(name="print")
- public void showPrint(RenderRequest request,
- RenderResponse response) throws IOException, PortletException {
- showPrintableCatalog(request, response);
- }
------
谁来管理Portlet 模式?
既可以被portal管理也可以被portlet管理
如果是要定义一个被portal管理的模式,那么portal server必须支持之,并且配置如下:
- <custom-portlet-mode>
- <portlet-mode>search</portlet-mode>
- </custom-portlet-mode>
如果要定义一个portlet管理的portlet模式,那么必须配置如下:
- <custom-portlet-mode>
- <portlet-mode>search</portlet-mode>
- <portal-managed>false</portal-managed>
- </custom-portlet-mode>