Portlet采用两种生成方式
1、代码级
实现标准接口生成portlet,用于需要获取系统数据或者进行权限控制的portlet
标准portlet生成接口
import java.util.List; /** * <p>Title: Portlet接口</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * <p>Company: seeyon.com</p> * @since CTP2.0 */ public interface BasePortlet { /** * 获取PortletId */ public String getId(); /** * 获取Portlet数据 */ public List<ImagePortletLayout> getData(); /** * 异步加载单个Portlet数据 * @param portletId * @return */ public ImagePortletLayout getPortlet(String portletId); /** * 获取数据总数 * 不需要统计数据的请返回-1 * @param String portlet数据Id Portlet数据唯一标识 */ public int getDataCount(String portletId); /** * 数据权限控制,用于判断该生成类产生的某一条Portlet数据是否可用 * @param String portlet数据Id Portlet数据唯一标识 */ public boolean isAllowDataUsed(String portletId); /** * 数据生成类权限控制 */ public boolean isAllowUsed(); }
Portlet枚举
package com.seeyon.ctp.portal.portlet; /** * <p>Title: Portlet枚举</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * <p>Company: seeyon.com</p> * @since CTP2.0 */ public class PortletConstants { /** * 图片类型枚举 */ public static enum ImageType{ system,//系统图片 link,//外部图片 } /** * Portlet访问地址类型 */ public static enum UrlType{ space,//空间地址 workspace,//系统工作区地址 open,//系统新窗口地址 link,//外部地址 } /** * Portlet大小枚举 */ public static enum PortletSize{ middle,//中 large,//大 } /** * Portlet分类 */ public static enum PortletCategory{ space,//空间 common, //常用 collaboration,//协同工作 formbizconfigs, //表单应用 edoc,//公文管理 timeManagement, //目标管理 meeting,//会议管理 doc, //知识社区 performanceAnalysis,//协同驾驶舱 integratedoffice,//综合办公 publicInformation, //文化建设 hrmanage,//HR管理 uccenter,//UC中心 info,//信息报送 businessfactory,//业务生成器 mytool,//我的工具 } public static enum PortletAppCategory{ u8,//U8 allinone,//all-in-one集成 nc,//nc } }
图片Portlet对象
package com.seeyon.ctp.portal.portlet; import java.util.List; /** * <p>Title: 工作桌面Portlet接口</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * <p>Company: seeyon.com</p> * @since CTP2.0 */ public class ImagePortletLayout { /** * Portlet生成器Id,不需要设置 */ public String id; /** * PortletId,唯一标识,用于权限判断及Portlet数据更新 */ public String portletId; /** * 资源code * 设置资源code的portlet会与系统资源权限控制保持一致,所以资源 code与资源权限里的RESOURCE_CODE需要一致 * 不设置资源code的portlet不受系统资源权限控制,所有用户均可访问 */ public String resourceCode; /** * 插件Id * 设置模块插件Id的Portlet与系统的插件统一权限 * 不设置模块插件Id的Portlet不受插件权限控制 */ public String pluginId; /** * Portlet名称,可以为空 */ public String portletName; /** * Portlet显示名称,不能为空,预制数据需要国际化 */ public String displayName; /** * Portlet分类 * @see PortletConstants.PortletCategory */ public String category; /** * Portlet点击响应地址 */ public String portletUrl; /** * Portlet点击响应地址类型 * @see PortletConstants.UrlType */ public String portletUrlType; /** * Portlet大小 * @see PortletConstants.PortletSize */ public int size = 1; /** * Portlet排序 */ public int order; /** * Portlet展示图片 */ public List<ImageLayout> imageLayouts; /** * 获取Portlet生成器Id */ public String getId() { return id; } /** * 设置Portlet生成器Id,各实现不需要设置 */ public void setId(String id) { this.id = id; } public List<ImageLayout> getImageLayouts() { return imageLayouts; } public void setImageLayouts(List<ImageLayout> imageLayouts) { this.imageLayouts = imageLayouts; } /** * PortletId,唯一标识,用于权限判断及Portlet数据更新 */ public String getPortletId() { return portletId; } /** * PortletId,唯一标识,用于权限判断及Portlet数据更新 */ public void setPortletId(String portletId) { this.portletId = portletId; } public String getPortletName() { return portletName; } public void setPortletName(String portletName) { this.portletName = portletName; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public String getPortletUrl() { return portletUrl; } public void setPortletUrl(String portletUrl) { this.portletUrl = portletUrl; } public String getPortletUrlType() { return portletUrlType; } public void setPortletUrlType(String portletUrlType) { this.portletUrlType = portletUrlType; } public String getResourceCode() { return resourceCode; } public void setResourceCode(String resourceCode) { this.resourceCode = resourceCode; } public String getPluginId() { return pluginId; } public void setPluginId(String pluginId) { this.pluginId = pluginId; } }
单位图片新闻示例
public class NewsPortlet implements BasePortlet { private static final Log log = LogFactory.getLog(NewsPortlet.class); private NewsDataManager newsDataManager; private FileManager fileManager; public void setNewsDataManager(NewsDataManager newsDataManager) { this.newsDataManager = newsDataManager; } public void setFileManager(FileManager fileManager) { this.fileManager = fileManager; } @Override public String getId() { return "NewsPortlet"; } @Override public List<ImagePortletLayout> getData() { List<ImagePortletLayout> layouts = new ArrayList<ImagePortletLayout>(); ImagePortletLayout accountImageNews = new ImagePortletLayout(); accountImageNews.setPortletId("AccountImageNews"); accountImageNews.setResourceCode("F05_newsIndexAccount"); accountImageNews.setPluginId("news"); accountImageNews.setPortletName("单位图片新闻"); accountImageNews.setDisplayName("bbs.imageNews.label"); accountImageNews.setCategory(PortletCategory.publicInformation.name()); accountImageNews.setPortletUrl("/newsData.do?method=imageNewsMore&spaceType=" + SpaceType.corporation.ordinal() + "&imageOrFocus=0"); accountImageNews.setPortletUrlType(UrlType.workspace.name()); accountImageNews.setSize(PortletSize.large.ordinal()); accountImageNews.setOrder(0); List<ImageLayout> accountImageNewsIms = new ArrayList<ImageLayout>(); try { Pagination.setNeedCount(false); Pagination.setFirstResult(0); Pagination.setMaxResults(5); List<NewsData> newsDatas = newsDataManager.findByReadUser4ImageNews(AppContext.getCurrentUser(), Constants.ImageNews, SpaceType.corporation.ordinal(), null); if (CollectionUtils.isNotEmpty(newsDatas)) { for (NewsData newsData : newsDatas) { V3XFile file = fileManager.getV3XFile(newsData.getImageId()); Long fileId = 0L; Date date = new Date(); if (file != null) { fileId = file.getId(); date = file.getCreateDate(); } String createDate = Datetimes.formatDate(date); ImageLayout accountImageNewsImg = new ImageLayout(); accountImageNewsImg.setImageTitle(newsData.getTitle()); accountImageNewsImg.setImageUrl("/fileUpload.do?method=showRTE&fileId=" + fileId + "&createDate=" + createDate + "&type=image&showType=small"); accountImageNewsIms.add(accountImageNewsImg); } } else { ImageLayout accountImageNewsImg = new ImageLayout(); accountImageNewsImg.setImageTitle("bbs.imageNews.label"); accountImageNewsImg.setImageUrl("d_photonews.png"); accountImageNewsIms.add(accountImageNewsImg); } } catch (Exception e) { log.error("", e); } accountImageNews.setImageLayouts(accountImageNewsIms); layouts.add(accountImageNews); return layouts; } @Override public ImagePortletLayout getPortlet(String portletId) { List<ImagePortletLayout> layouts = this.getData(); if (layouts != null) { for (ImagePortletLayout layout : layouts) { if (portletId.equals(layout.getPortletId())) { return layout; } } } return null; } @Override public int getDataCount(String portletId) { return -1; } @Override public boolean isAllowDataUsed(String portletId) { return true; } @Override public boolean isAllowUsed() { return true; } }
2、配置级
已办事项portlet示例,配置文件名称为portletCfg.xml。
<portlet> <!-- 唯一标识,用于权限判断及Portlet数据更新 --> <portletId>doneevent</portletId> <!-- 需要进行权限判断时使用的资源Id--> <resourceCode></resourceCode> <!-- 需要进行权限判断时使用的插件Id--> <pluginId>collaboration</pluginId> <!-- Portlet名称,可以为空 --> <portletName>已办事项</portletName> <!-- Portlet显示名称,不能为空,预制数据需要国际化 --> <displayName>已办事项</displayName> <!-- Portlet分类 --> <category>collaboration</category> <!-- Portlet点击响应地址 --> <portletUrl><![CDATA[/collaboration/collaboration.do?method=listDone]]></portletUrl> <!-- Portlet点击响应地址类型,space:空间地址,workspace:系统工作区地址,open:系统新窗口地址,link:外部地址 --> <portletUrlType>workspace</portletUrlType> <!-- Portlet大小,0:中,1:大 --> <size>0</size> <!-- Portlet排序 --> <order>5</order> <!-- Portlet展示图片 --> <imageLayouts> <imageLayout> <!-- 图片路径 --> <imageUrl><![CDATA[d_doneevent.png]]></imageUrl> <!-- 图片名称 --> <imageName>已办事项</imageName> <!-- 图片内容标题 --> <imageTitle></imageTitle> <!-- 图片内容摘要 --> <summary></summary> </imageLayout> </imageLayouts> </portlet>
前台调用Portlet接口
package com.seeyon.ctp.portal.portlet.manager; import java.util.List; import java.util.Map; import com.seeyon.ctp.common.exceptions.BusinessException; import com.seeyon.ctp.portal.portlet.ImagePortletLayout; import com.seeyon.ctp.portal.portlet.bo.CollaborationInfo; /** * <p>Title: 工作桌面Portlet接口</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * <p>Company: seeyon.com</p> * @since CTP2.0 */ public interface PortletManager { /** * 获取Portlet数据 */ public ImagePortletLayout getData(Map params) throws BusinessException ; /** * 获取数据总数 */ public int getDataCount(Map params) throws BusinessException ; /** * 获取代办数据 * @return * @throws BusinessException */ public List<Map<String,Object>> getPendingData() throws BusinessException ; /** * 工作桌面待办处理 * @param affairId * @param summaryId 协同主表Id * @param comment * @param attitude 态度 [0:已阅,1:同意,2:不同意] * @throws BusinessException */ public void finishWorkitemQuick(Map<String,String> param) throws BusinessException; /** * 显示工作桌面待办数据详情 * @param affairId * @param summaryId * @param objectId * @param subObjectId * @param subApp * @param sender * @param rightId * @return * @throws BusinessException */ public CollaborationInfo getCollaboration(Map<String,String> param) throws BusinessException; }
Portlet组件分类调用接口
package com.seeyon.ctp.portal.portlet.manager; import java.util.List; import com.seeyon.ctp.portal.portlet.ImagePortletLayout; import com.seeyon.ctp.portal.portlet.PortletConstants; /** * <p>Title: 工作桌面首页接口</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * <p>Company: seeyon.com</p> * @since CTP2.0 */ public interface BasePortletSelector { /** * 获取Portlet展示数据 * @param String PortletCategory @see {@link PortletConstants} * @return */ public List<ImagePortletLayout> selectPortletTreeData(String portletCategory); }