Portlet用模式来表示用户在做什么。

 JSR-168 定义了三种Portlet 模式,VIEW/EDIT/HELP模式。

 

  1. public class PortletMode 
  2.   public static final PortletMode VIEW = new PortletMode("view"); 
  3.  
  4.   public static final PortletMode EDIT = new PortletMode("edit"); 
  5.  
  6.   public static final PortletMode HELP = new PortletMode("help"); 
  7.   private String _name; 
  8.  
  9.   public PortletMode(String name) 
  10.   { 
  11.     if (name == null) { 
  12.       throw new IllegalArgumentException("PortletMode name can not be NULL"); 
  13.     } 
  14.     this._name = name.toLowerCase(Locale.ENGLISH); 
  15.   } 
  16.  
  17.   public String toString() 
  18.   { 
  19.     return this._name; 
  20.   } 
  21.  
  22.   public int hashCode() 
  23.   { 
  24.     return this._name.hashCode(); 
  25.   } 
  26.  
  27.   public boolean equals(Object object) 
  28.   { 
  29.     if (object instanceof PortletMode) { 
  30.       return this._name.equals(((PortletMode)object)._name); 
  31.     } 
  32.     return false
  33.   } 

注意,一个Portlet实例在任何时候都只可以处于一种模式之下,但是它可以被配置为支持多种模式,但是不同的模式不可以同时作用于某个Portlet实例之上(换句话说,可以先是EDIT模式,然后切换到VIEW模式)

模式的通用性:

VIEW是默认的模式,用于显示Portlet (必须支持)

EDIT模式允许Portlet用户定制Portlet实例

HELP模式显示Portlet的用法信息

 

------

 

但是:各种不同的Portal Server可以使用规范以外的模式,比如config,print,preview模式

 

如何自定义Portlet模式?

声明方式:

在portlet.xml中的<supports>元素的<portlet-mode>里面指定该Portlet 所支持的某种模式(自定义模式)

  1. <portlet> 
  2. <portlet-name>bookCatalog</portlet-name> 
  3. <portlet-class> 
  4. chapter03.code.listing.base.BookCatalogPortlet</portlet-class> 
  5. <supports> 
  6. <mime-type>text/html</mime-type> 
  7. <portlet-mode>print</portlet-mode> 
  8. ... 
  9. </supports> 
  10. ... 
  11. </portlet> 

然后,在Portlet应用级别,也就是在portlet.xml中所有<portlet>元素的外面,声明自定义的模式,比如上文中的print模式,我们必须声明如下:

 

  1. <portlet-app ...> 
  2.  
  3. <portlet> 
  4. ... 
  5. </portlet> 
  6.  
  7. <custom-portlet-mode> 
  8. <portlet-mode>print</portlet-mode> 
  9. </custom-portlet-mode> 
  10. </portlet-app> 

注意,这个自定义的portlet mode,比如print ,必须被要部署到的portal server所支持。

 

编程方式:

 

  1. if(PortletRequest.isPortletModeAllowed(new PortletMode("print"))) { 
  2. actionResponse.setPortletMode(new PortletMode("print")); 

 

以上不论是声明方式还是编程方式,都成功的为某个Portlet开启了某种自定义模式,那么这种模式之下这个Portlet的行为如何呢,我们必须用代码来给出它的期望行为:

比如print模式我们希望一个显示一个打印状态下的文档预览,于是:

 

  1. @RenderMode(name="print"
  2. public void showPrint(RenderRequest request, 
  3. RenderResponse response) throws IOException, PortletException { 
  4. showPrintableCatalog(request, response); 

 

------

谁来管理Portlet 模式?

既可以被portal管理也可以被portlet管理

如果是要定义一个被portal管理的模式,那么portal server必须支持之,并且配置如下:

  1. <custom-portlet-mode> 
  2. <portlet-mode>search</portlet-mode> 
  3. </custom-portlet-mode> 

 

如果要定义一个portlet管理的portlet模式,那么必须配置如下:

 

  1. <custom-portlet-mode>  
  2. <portlet-mode>search</portlet-mode> 
  3. <portal-managed>false</portal-managed>  
  4. </custom-portlet-mode>