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);
}

