Hyperic HQ portal机制研究

1、 简介

portal是一种web应用,通常用来提供个性化、单次登录、聚集各个信息源的内容,并作为信息系统表现层的宿主。聚集是指将来自各个信息源的内容集成到一个web页面里的活动。

2、Hyperic HQ Portal

2.1Portal模型

2.1.1 Portal类

Portlet的容器,封装了页面名称、portlet显示列数、portlet集合以及工作流workflow信息。

属性说明:
  _name      :portal名,使用properties文件中的i18n命名。portal名用于页面<title>名称显示。
  _columns  :portal列数量。(在Dashboard页面,portal有两列portlets)。
  _portlets   :portlet集合。 PS:_portlets是一个List<List<Portlet>>类型的集合。Portlet经过两层封装,先封装成列,然后再封装到Portal中。

方法说明:
  createPortal()                        :Portal类的静态工厂方法,用于创建Portal对象。有一个无参数的方法和一个有两个参数的重载方法。
  addPortlet(portlet,column)  :添加portlet到Portal的column列。
  addPortlets()                         :添加portlets集合(列)到Portal中。

public class Portal {
	pirvate String _name;
	private String _description;			//portal描述。
	private int _columns;
	private List _portles = new ArrayList();
	private boolean _dialog = false;
	private boolean _workflowPortal = false;
	private Map _workflowParams = false;

//构造方法。构造Portal只使用Portal类的静态方法createPortal,所以此构造方法可以改为private。
	public Portal(){}				
//静态工厂方法构造Portal对象。
	public static Portal createPortal() {		
		Portal portal =  new Portal();
		portal.setColumns(1);
		portal.setDialog(false);
		return portal;
	}

//通过参数portalName和portletName构造portal的静态工厂方法。portletName为portlet的url值(也可以用Tiles Definition对象名称)。
	public static Portal createPortal (String portalName, String portletName) {
		Portal portal =  new Portal();
		portal.setName(portalName);		
		List definitions = new ArrayList();
		definitions.add(portletName);
		portal.addPortlets(definitions);
		return portal;
	}

//添加一个Portlet至Portal中。
	public void addPortlet(Portlet portlet, int column) {
		if(column > _columns){
			setColumns(column);
		}
		List col = (List)_portlets.get(column-1);
		col.add(portlet);
	}

	public void addPortlets(List definitions , int columns){
		//略
	}

	//setters and getters
}
 

2.1.2 Portlet类

Portlet类,封装url的portal单元。该类对象封装在Portal的portlets集合中,用于批量引入显示url内容。url一般为请求地址或者Tiles Definition。

属性说明:
    _url          :portlet最重要属性,用于加载请求地址或者Tiles。
    _name     :portlet名,可以为空,很少用到。
方法说明:
    Portlet(String url)   :通过Url创建portlet对象。

public class Portlet(){
	private String _name;				//portlet名,可以为空。
	private String _description;
	private String _url;		//portlet最重要的属性,portlet只要有url就可以完成portal功能。
	private String _label;
	private String _fullUrl;
	private String _isFirst = false;
	private String _isLast = false;

	public Portlet(){}

	public Portlet(String url){	//Portal构造方法,主要参数即url。	PS:此构造方法在Portal.createPortal(String portalName, String portletName)中调用,此方法中把portletName赋值给portlet.url,在这里造成歧义。
		super();
		_url = url;
	}

	public Portlet(String url ,String fullUrl){
		this(url);
		_fulUrl = fullUrl;
	}

	//setters and getters

}
 

2.2 PortalAction

控制Portal的Action类:Portal生命周期的初始化,Portal放入request,在JSP页面通过EL表达式获取Portal并加载Portlet中的url地址或Tiles页面。

/**
 * 控制资源页面Portal展示的PortalAction类。PortalAction配置在Tiles配置文件中,作为Tiles的ControllerUrl请求的Action类,Tiles页面会在加载之前请求此类,执行初始化工作。
 */
public class ResourceHubPortalAction extends BaseAction{

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,//默认的execute方法。PortalAction类也可以继承DispatchAction,通过其他method控制portal。
					HttpServletResponse response) throws Exception {
		…………
		Portal portal = Portal.createPortal("resource.hub.ResourceHubTitle", ".resource.hub");	//resource.hub.ResourceHubTitle:portal名称,即新页面title名称,通过i18n值显示。
													//.resource.hub:Tiles定义,用于显示的portal页面。
		request.setAttribute(Constants.PORTAL_KEY, portal);	//把portal放入request中,key为Constant.PORTAL_KEY,即"portal"。
		…………
		return null;										//返回null,页面已经先确定,这里只做显示前的拦截初始化portal等内容。
	}
}
 

2.3 配置文件

2.3.1 struts配置文件

<action path="/ResourceHubLayout" name="ResourceHubForm" scope="request" forward=".resource.hub.layout"/>
  

2.3.2 tiles 配置文件

    .resource.hub.layout加载页面内容之前,会被/resource/hub/ResourceHubPortal.do拦截,通过ResourceHubPortalAction加载portal对象。

<definition name=".main.layout" path="/portal/MainLayout.jsp">

     <put name="body" value="/portal/ColumnsLayout.jsp" />

</definition>

<definition name=".main.resource.content.layout" extends=".main.layout">

    <put name="body" value="/portal/ColumnsLayout.jsp" />

</definition>

<definition name=".resource.hub.layout"  extends=".main.resource.content.layout" controllerUrl="/resource/hub/ResourceHubPortal.do" />
 

2.3.3 spring 配置文件

    Struts Action通过Spring IOC管理

<bean name="/resource/hub/ResourceHubPortal" class="org.hyperic.hq.ui.action.resource.hub.ResourceHubPortalAction" />

2.4 JSP文件

    Tiles definition .main.layout中的ColumnsLayout.jsp页面代码。

    通过EL表达式获取portal,通过JSTL forEach标签遍历portal,获得portlet列集合。然后遍历列中的portlet,通过<tiles:insert>将url插入页面。

<c:forEach var="columnsList" items="$[portal.portlets]" >

    <c:forEach var="portlet" items="$[columnsList]" >

         <tiles:insert  beanProperty="url" beanName="portlet" flush="true"/>

     </c:forEach>

</c:forEach>

 

你可能感兴趣的:(struts,tiles,Portal)