1、 简介
portal是一种web应用,通常用来提供个性化、单次登录、聚集各个信息源的内容,并作为信息系统表现层的宿主。聚集是指将来自各个信息源的内容集成到一个web页面里的活动。
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 }
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 }
控制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等内容。 } }
<action path="/ResourceHubLayout" name="ResourceHubForm" scope="request" forward=".resource.hub.layout"/>
.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>