WebStarter1.2 开发指南


江西博微新技术有限公司 软件研发中心 YFXM001 WebStarter1.2 开发指南 v1.2 2013 年 12 月 11 日 郭友、梁金泉、田军 1 目 录 1. 引言 ............................................................... 1 1.1. 面向的读者 ....................................... 1 1.2. 使用条件 ........................................... 1 1.3. 从哪里下载 ....................................... 1 2. 版本记录 ....................................................... 2 3. 搭建开发环境 ............................................... 3 3.1. 安装 WebStarter 插件 ...................... 3 3.1.1. 插件安装 ............................... 3 3.1.2. 插件卸载 ............................... 4 3.1.3. 插件更新 ............................... 4 3.2. 配置 Tomcat 环境 ............................. 6 4. 第一个 WebStarter 应用 ............................ 12 4.1. 创建主程序 ..................................... 12 4.2. 创建业务模块 ................................. 13 4.3. 生成文件模板 ................................. 14 4.4. 部署模块项目 ................................. 17 4.5. 运行主程序 ..................................... 18 5. WebStarter 概述 ......................................... 21 5.1. 原理与体系结构 ............................. 21 5.2. 基于 OSGi 的模块管理 ................... 23 5.2.1. 发布 OSGi 服务 ................... 23 5.2.2. 获取 OSGi 服务 ................... 25 6. WebStarter 开发 ......................................... 28 6.1. 配置数据源 ..................................... 28 6.2. 使用注册表 ..................................... 28 6.2.1. 注册表服务调用 ................. 28 6.2.2. 注册表服务接口 ................. 29 6.3. 使用账号管理 ................................. 34 6.3.1. 用户管理服务调用 ............. 34 6.3.2. 用户管理服务接口 ............. 35 6.4. 自定义主题 ..................................... 37 6.4.1. 创建主题 ............................. 37 6.4.2. 使用主题 ............................. 39 6.5. WebStarter API ............................. 39 7. WebStarter 配置 ......................................... 42 7.1. 主项目配置 ..................................... 42 7.1.1. spring-security.xml 文件...... 42 7.1.2. System.properties 文件 ....... 43 7.1.3. 数据源配置 ......................... 44 7.1.4. 默认模块及默认页面配置 . 47 7.1.5. 错误页面配置 ..................... 47 7.1.6. 用户管理配置 ..................... 48 7.1.7. 登录页面配置 ..................... 49 7.2. 模块项目配置 ............................. 50 7.2.1. deploy.xml 文件 .................. 50 7.2.2. module.xml 文件 ................. 51 7.2.3. 模块菜单配置 ..................... 52 7.2.4. 菜单权限配置 ..................... 55 7.3. 主题项目配置 ................................. 56 7.4. 业务模块高级配置 ......................... 57 7.4.1. Spring bean 获取方式 ......... 57 7.4.2. 任务调度(quartz) ........... 59 7.4.3. WebServices(xfire) ......... 61 7.4.4. Hibernate 配置 .................... 63 7.4.5. jsf 导航配置 ........................ 63 7.4.6. servlet 配置 ......................... 64 7.4.7. 日志配置(Log4j) ........... 65 8. WebStarter 控制台 ..................................... 67 9. 常见问题解决方法 ..................................... 79 9.1. 前后台开发分离 ............................. 79 9.2. 前端开发调试 ................................. 82 9.3. 其他问题 ......................................... 84 1 1. 引言 1.1. 面向的读者 江西博微新技术有限公司及分公司的所有开发人员。 1.2. 使用条件 软件条件: ① Eclipse3.5 及以上的版本 ② JDK1.5 至 JDK1.7 的版本 ③ Tomcat6、Weblogic10.3.3 及以上版本 开发人员必备知识: ① 熟练使用 MyFaces1.2、spring、hibernate ② 了解 OSGi 的基础规范 1.3. 从哪里下载 下载地址:\\192.168.0.20\项目软件\Web 模块化开发平台 WebStarter1.2\V1.2.2 (发布版) 2 2. 版本记录 序号 版本号 升级 发布时间 1 V1.2.0(测试版) 完成 WebStarter1.2 核心模块的开发、系统管理和注册 表服务的开发 2013.11.25 2 V1.2.0(标准版) 完成 WebStarter1.2 核心模块的接口重构及缺陷修改 2013.12.06 3 V1.2.0(正式版) 完成 WebStarter1.2 核心模块的接口重构、控制台模块 的开发、WebServices 的整合及平台核心功能缺陷修改 2014.01.02 4 3 3. 搭建开发环境 3.1. 安装 WebStarter 插件 3.1.1.插件安装 将插件安装包解压到 eclipse 目录下的 dropins 目中。如下图所示 创建 project 出现如下图效果,则表示成功安装。 4 完成安装的 eclipse 目录结构: 3.1.2.插件卸载 关闭 Eclipse,然后删除/eclipse/dropins/下的 webstarter_plugin_v1.2.0 目录, 重新启动 eclipse,则完成对该插件的卸载。 3.1.3.插件更新 5 首先按照删除插件的步骤将低版本的插件卸载,然后获取到最新版本的插件压缩包, 再解压获取到的插件压缩包,然后将解压出的 features 目录及 plugins 目录复制到 /eclipse/dropins/webstarter_plugin_v1.2.0 目录下,再重新启动 eclipse,则完成 了对插件的更新。 6 3.2. 配置 Tomcat 环境 第一步:选择菜单栏中“Window”菜单的“Preferences”选项。如下图所示 第二步:选择“Server”中的“Runtime Environments”,如下图所示 7 第三步:单击“Add”,选择“Apache”下的“Apache Tomcat v6.0”,然后单击“next”。 如下图所示 8 9 第四步:单击“Browse”,选择 tomcat 的安装路径,单击“确定”按钮。如图所示 10 11 第五步:单击“Finish”完成 tomcat 安装。 12 4. 第一个 WebStarter 应用 4.1. 创建主程序 在 Package Explorer 工作区中右键 New WebStarter 选择 WebStarter 工程。如图: 完成以上操作后,输入主项目名称,然后单击 finish。效果如图: 新建主项目成功的效果如下图所示 13 4.2. 创建业务模块 步骤如下: 第一步:在 Package Explorer 工作区中右键 New WebStarter 然后选择 WebStarter 工程。操作如图所示 第二步:在“bundle 项目”输入框中输入模块项目名称。然后选择模块项目依赖的 宿主项目。 14 4.3. 生成文件模板 WebStarter 平台提供了 Spring bean 配置、Spring AOP 配置、servlet 配置、JSF 导航配置、jsf 主页面和 jsf 子页面等模板的生成功能。具体使用方法如下图所示: 15 右键菜单,选择 New->Other 菜单,弹出如下图所示对话框,选择 webstarter 文件 模板功能。 点击 Next 按钮,并在如下图所示的对话框中的 File name 中填写即将创建的文件 名称,例如 login,如下图所示: 16 点击 Next 按钮出现如下图所示对话框: 以创建 webstarter 项目子页面为例,点击 Finish 按钮。则完成页面的创建过程, 创建后的页面如下图所示: 17 4.4. 部署模块项目 使用 ant 运行模块项目中的 build.xml 文件,将模块项目打包到主项目的 bundle 目录下。如下图所示: 刷新主项目,确认在主项目的 bundle 目录下是否存在刚刚打包成成功的 bundle 包, 如下图所示: 18 4.5. 运行主程序 第一步,打开 Eclipse 的“Servers”视图,右键选择“Add and Remove…”。如下 图所示: 第二步,在弹出的“Add and Remove…”对话框中,双击“Available”中的 web 项目,项目出现在“Configured”中,点击“Finish”按钮完成配置。如下图所示: 19 第三步,打开“Servers”视图,点击“Tomcat v6.0 Server at localhost”, 然后再点击右上角的 start 按钮启动 webstarter 主项目。 启动完成,控制台显示如下图所示内容则表示启动成功。 第四步,按照如下图所示的地址访问该主项目: 20 系统内置的用户 administrator、admin 和 user,分别对应超级管理员、系统管理员 和普通用户的角色。系统默认配置的用户相关信息如下表所示 用户名 密码 角色 administrator 123456 administrator admin 123456 admin user 123456 user 使用 admin 用户成功登录后,界面显示如下图所示: 21 5. WebStarter 概述 5.1. 原理与体系结构 5.1.1.为什么引入 OSGi 框架 模块化开发并不仅仅针对于在 OSGi 环境下。即使在不使用 OSGi 框架的情况下,同 样可以实现模块化开发。那么为什么在 WebStarter1.2 平台中引入 OSGi 框架呢? OSGi 优点: ① 在部署阶段,业务应用通过模块简单叠加的方式即可完成部署,提高了部署效率, 降低了部署成本; ② 在运维阶段,业务应用通过不停机的安装、卸载和更新功能模块,保证了系统的稳 定性。 5.1.2.WebStarter1.2 原理 WebStarter1.2 平台微内核是在 web 中间件中嵌入 OSGi 框架。它实现了平台各个模 块本身的模块化以及基于平台开发的应用系统的模块化,使应用系统既保留传统 Web 应 用的原有优点的同时,还具备 OSGi 的所有优越的特性。WebStarter1.2 具备 OSGi 的优 越特性主要包括以下几个: (1)能够构建规范可积累的通用化组件 规范统一的基础架构体系能够能够构建出大量的规范可积累的通用化组件,提高系 统的开发效率,同时实现公司人力资源的合理分配。只有遵循统一的规范才能保证技术 开发的延续性和可维护性,提高通用化组件的重复可利用率。从而实现公司技术传承的 良性、可持续发展,并不断反过来促进开发效率的提升。 (2)能够构建动态可插拔和改变行为的系统 可拔插的系统模块给系统的开发、调试、维护带来了很大的便捷的同时,也使得系 统能够通过动态的拔插功能模块而实现系统行为的动态改变,使得系统能够不断适应需 求的变更。 (3)能够构建稳定、高效的系统 22 基于 OSGi 技术实现的系统是稳定而高效的系统。这是因为 OSGi 的微内核机制保证 了系统的稳定,业务模块的崩溃不会影响到系统其他业务模块的正常运行,更不会导致 整个系统的崩溃。OSGi 的动态性保证了系统的高效,只有在请求相应资源的时候 OSGi 采取完全加载、启动相应的模块和服务。 5.1.3.WebStarter1.2 体系结构 Webstarter 平台主要包括以下三部分:平台公共组件、平台基础组件、平台集成开 发工具。平台基础组件主要的作用是为平台的运行提供初始化环境,平台公共组件作为 对外发布的服务提供给业务模块调用,平台集成开发工具为基于 webstarter 开发提供 一个标准化、集成化的集成开发工具和相应的环境。结构如下图所示: 基础 组件 模块框 架启动 平台 内核 模块 启动 事件 监听 请求 处理 模块 管理 ... 服务 交互 平台 框架 事务 管理 日志 管理 安全 管理 工具 包 公共 组件 数据源服务 注册表服务 统一权限服务 平台控制台服务 日志服务webservices服务 集成开 发工具 模板生成 集成发布 webstarter1.2统一开发平台 基础组件:用于屏蔽大量的底层技术细节,提供了可容纳平台公共组件和业务功能组 件运行的微内核环境,提供了数据访问、服务交互、事务处理、日志管理等基础性技术 组件。 集成开发工具:提供基于平台的业务系统快速开发能力,内置丰富的平台开发工具 包,主要包括多类开发向导、模板生成等与业务系统开发密切关联的功能组件。 公共组件:是由平台实现的各种通用的高级功能与服务,运行时可跨多个业务系统共 用。基于这些套件可以快速、高质、高效的开发出业务系统功能逻辑,保障业务系统稳 定、高效运行。 23 5.2. 基于 OSGi 的模块管理 在 OSGi 中,服务是基于接口。当一个接口仅仅有一个实现时,只需要注册不含属 性过滤的服务。当一个接口有多个实现时,并且多个实现都注册成服务的情况下,就需 要注册含有属性过滤的服务。 5.2.1.发布 OSGi 服务 ① 注册不含有属性过滤的服务 ② 注册含有属性过滤的服务 属性过滤功能:当同一接口被注册不同的实现时,我们就需要添加属性过滤。目的 是为了唯一标识服务。当我们获取服务时,就可以指定过滤的属性及对应的值,来获取 我们所想要的服务。以下是添加属性过滤的实例: 24 ③ 注册多个接口的一个服务 当一个服务实现了多个接口的情况下,并且这些接口也需要注册。 ④ 服务优先级标识特点服务 在服务元素上指定优先级,可以认定一个 Bean 与其他有相同接口的 Bean 的相对优 先级。优先级在服务元素上指定。遇到服务元素时,OSGi 运行时将返回具有最高优先级 com.test.DAO1 com.test.DAO2 com.test.DAO3 25 整数数值的服务。如果发布了一个具有更高值的服务。任何应用都将重新绑定它。 5.2.2.获取 OSGi 服务 ① 不指定过滤属性获取服务,即获取 osgi 默认提供的服务。 当我们一个接口仅仅注册一个实现时,我们无需指定属性过滤来获取我们想要的服 务。此时可以参照下面的实例: ② 根据属性过滤获取指定服务 当一个接口注册了多个实现时,在注册该服务时,就必须为不同的实现添加属性过 26 滤,以此来唯一标识所注册的服务。那么获取指定服务时就可以依据注册时的过滤属性 来获取服务。 ③ 根据服务优先级获取指定服务 获取满足接口的服务列表 Cardinality:1..N,0..N,0..1,1..1。 1..N:至少一个或者多个服务。 0..N:0 个或者多个服务。 0..1:0 个或者一个服务。 1..1:1 个服务。 27 28 6. WebStarter 开发 6.1. 配置模块数据源 在获取指定数据源时,必须指定数据源名称。指定数据源名称通过 filter="(WebStarter.datasource.name=数据源唯一标识名称)。 数据源唯一标识名称是指在主项目中创建的数据源唯一标识。 6.2. 使用注册表 6.2.1. 注册表服务调用 第一步:打开业务模块的 MANIFEST.MF 文件,选择”Dependencies”选项卡,点击 “ add ”按钮,在弹出界面中导入输入“ booway.register.service.api ”与 “booway.register.pojo”,引入注册表服务所需包,如下图所示: 29 第二步:通过 Spring 引入平台提供的注册表服务: 第三步:Java 代码中获取注册表服务对象: 接下来就可以使用 registerService 对象中的任何方法了。具体接口和方法介绍如 下节所示。 6.2.2. 注册表服务接口 任何注册表管理 bundle 对其他 OSGi 提供的服务需要实现的基本接口。将接口定义 在 API 中,可以避免业务 bundle 调用服务时对注册表管理 bundle 有依赖 IWebStarterRegistryService registerService =(IWebStarterRegistryService) BundleBeanFactory.getBean(“registerService”); 30 booway.register.service.api.IWebStarterRegistryService 名称 说明 IRegisterFolderService getRegisterFolderService() 获取注册表目录操作服务接口 IRegistryResService getRegistryResService() 获取注册表资源操作服务接口 IRegisterAttributeService getRegisterAttributeService() 获取注册表属性操作服务接口 1)目录服务相关接口 booway.register.service.api.IRegisterFloderService 名称 说明 RegMetaData getMetaData(String path) 根据路径获取获取目录或资源的元数据 RegMetaData addNewMenu(String path) 添加目录 boolean removeMenu(String path) 移除目录(如果有子集,则不能删除) RegMenu findRoot() 查找根目录 List findChildMenusById(String menuId) 通过目录 id 查找子目录集 RegMenu addMenu(RegMenu parentMenu, RegMenu menu, String currentUserId) 添加目录 boolean deleteMenuById(String menuId) 根据目录 id 删除目录 RegMenu editMenuTypeById(String menuId, String menuType, String currentUserId) 根据目录 id 修改目录类型 RegMenu editMenuDescriptionById(String menuId, String description, String currentUserId) 根据目录 id 修改目录描述信息 2)资源服务相关接口 booway.register.service.api. IRegistryResService 名称 说明 RegMetaData getMetaData(String path) 根据路径获取获取目录或资源的元数据 RegMetaData addOrUpdateResource(String 更新或添加资源(资源不存在则自动添加) 31 path, String content) RegMetaData addOrUpdateResource(String path, InputStream stream) 更新或添加资源(资源不存在则自动添加) List findResourcesByMenu(String parentMenuId) 根据目录获取其下资源 boolean removeResource(String path) 移除目录或资源(如果有子集,则不能删除) InputStream getResByteData(String path) 获取资源的二进制数据业务(向客户端输出文件 流) RegResource findResourceItemByResId(String parentMenuId, String resourceId) 通过目录 id、资源 id 获取资源 Item RegResource addResource(String parentMenuId, RegResource resource, String currentUserId) 添加目录下的资源(资源内容为文本形式) boolean addFileContentResource(String parentMenuId, RegResource resource, UploadedFile resContentFile, String currentUserId) 添加目录下的资源(资源内容为文件形式) RegResource addStreamContentResource(String parentMenuId, RegResource resource, InputStream resContentStream, String fileName, String currentUserId) 添加目录下的资源(资源内容为输入流) boolean deleteResourceById(String parentMenuId, String resourceId) 通过资源 id 删除目录下的资源 RegResource renameResourceById(String parentMenuId, String resId, String resName, String currentUserId) 通过资源 id 修改资源名称,即重命名资源名称 boolean editResourceTypeById(String parentMenuId, RegResource resource, String currentUserId) 通过资源 id 修改资源类型 boolean editResourceDescriptionById(String 修改资源描述 32 parentMenuId, String resId, String description, String currentUserId) RegResource editResourceContentById(String parentMenuId, String resId, String content, String currentUserId) 修改资源内容(文本形式的内容) boolean editResourceFileContentById(String parentMenuId, RegResource resource, UploadedFile resContentFile, String currentUserId) 修改资源内容(文件形式的内容) boolean editResourceStreamContentById(String parentMenuId, RegResource resource, InputStream resContentStream) 修改资源内容(输入流形式的内容) AttachFileInfo getContentFile(String parentMenuId, String resourceId) 获取资源内容文件信息 boolean deleteResContentFile(String parentMenuId, RegResource resource, String attachId) 删除资源附件 InputStream downloadResContentFile(String parentMenuId, String resourceId, String attachId) 下载资源内容文件 InputStream downloadResContentToFile(String parentMenuId, String resourceId, String attachId) 下载资源文本内容为文件形式 3)注册表目录、资源属性服务相关接口 booway.register.service.api. IRegisterAttributeService 名称 说明 List getAttributes(String path) 获取目录或资源的属性 boolean addAttributeByMenuId(String menuId, RegAttribute attribute, String currentUserId) 为目录添加属性 boolean editAttributeByMenuId(String menuId, 为目录修改属性信息 33 RegAttribute attribute, String currentUserId) List findAttributesByMenuId(String menuId) 查找目录的属性 boolean addAttributeByResource(String parentMenuId, String resourceId, RegAttribute attribute, String currentUserId) 为资源添加属性 boolean editAttributeByResource(String parentMenuId, String resourceId, RegAttribute attribute, String currentUserId) 为资源修改属性信息 boolean deleteAttributeByMenuId(String menuId, String attrId) 删除目录属性信息 boolean deleteAttributeByResource(String parentMenuId, String resourceId, String attrId) 删除资源下的属性信息 List findAttributesByResource(String parentMenuId, String resourceId) 查找资源的属性 boolean editAttribute(String path, RegAttribute attribute, String currentUserId) 为目录或资源修改属性信息 boolean addAttribute(String path, RegAttribute attribute, String currentUserId) 为目录或资源添加属性信息 boolean deleteAttribute(String path, RegAttribute attribute, String currentUserId) 为目录或资源删除属性信息 34 6.3. 使用账号管理 6.3.1.用户管理服务调用 第一步:打开业务模块的 MANIFEST.MF 文件,选择”Dependencies”选项卡,点击 “ add ”按钮,在弹出界面中分别输入“ booway.account.service.api ”和 “booway.account.pojo”,如下图所示: 第二步:通过 Spring 引入平台提供的注册表服务: 第三步:Java 代码中获取注册表服务对象: IWebStarterAccountService service = 35 (IWebStarterAccountService)BundleBeanFactory.getBean(“registerService”) 6.3.2.用户管理服务接口 WebStarter 平台提供的系统管理模块服务调用接口 booway.account.service.api.IWebStarterAccountService 名称 说明 boolean checkPower(String userId, String pvgName) 检测某用户是否拥有某权限 boolean isSuperUser(String currentUserID) 判断是否为超级管理员(administrator) boolean isSystemUser(String currentUserID) 判断是否为系统管理员(admin) IWebStarterGroupService getWebStarterGroupService() IWebStarterRoleService getWebStarterRoleService() IWebStarterUserService getWebStarterUserService() 1)WebStarter 平台组织机构操作服务 booway.account.service.api.IWebStarterGroupService 名称 说明 GroupInfo getGroupInfo(String groupId) 根据部门编号获取部门信息 List getChildGroupList(String parentId, String currentUserId) 根据父级部门编号获取所属子部门列表信 息 List getAllChildGroupList(String parentId) 根据父级部门编号获取所有子部门列表信 息 GroupInfo getUserGroupInfoByUserId(String userId) 根据用户编号获取用户所属部门信息 List getGroupInfoList(String groupType) 根据类型获取部门列表 GroupInfo getRootGroup() 获得根部门 GroupInfo addGroupInfo(GroupInfo groupInfo) 增加部门 GroupInfo deleteGroupByGroupId(String groupId, String currentUserID) 通过部门 id 删除部门(超级管理员以外用户 为软删除) GroupInfo updateGroupInfo(GroupInfo groupInfo) 更新部门信息 List getRelationGroupList(String userId) 获取某用户关联部门列表 36 String getGroupFullPathByUserID(String userId) 根据 id 获取全路径部门名称 String getGroupFullPathById(String groupId) 根据 id 获取全路径部门名称 2)WebStarter 平台角色操作服务 booway.account.service.api.IWebStarterRoleService 名称 说明 List getUserRoleList(String userId) 获取用户角色列表 List getUserStationList(String userId) 获取用户岗位列表 List getGroupRoleList(String groupId) 通过部门 id 获取部门的角色列表 List getRoleList() 获取所有角色列表 List getStationList() 获取所有岗位列表 RoleInfo addRoleInfo(RoleInfo roleInfo) 增加角色 boolean deleteRoleByRoleId(String roleId, String currentUserID) 通过角色 id 删除角色(超级管理员以外用户 为软删除) RoleInfo updateRoleInfo(RoleInfo roleInfo) 更新角色信息 3)WebStarter 平台用户操作服务 booway.account.service.api.IWebStarterUserService 名称 说明 UserInfo getUserInfo(String userId) 获取用户信息 List getGroupUserList(String groupId, String currentUserId) 获取部门下的人员列表 List getRelationUserList(String userId) 获取某用户关联用户列表 UserInfo isUserlogin(String userLogin , String userPwd) 检查用户是否已登录(需验证用户名和密 码) List getGroupUserList(String groupId) 通过部门 ID 查询该部门所有用户列表(无 权限控制) List getAuthGroupUserList(String groupId, String currentUserId) 通过部门 ID 和当前登录用户查询该部门 所有用户列表(有权限控制) UserInfo updateUserPwd(String newPwd, String userId, 根据用户的密码、输入的新密码修改用户 37 String oldPwd) 密码 UserInfo getUserInfoByLogin(String userLogin) 查询该用户是否已经登录 public UserInfo addUserInfo(UserInfo userInfo) 增加用户 UserInfo deleteUserByUserId(String userId, String currentUserID) 通过用户 id 删除用户(超级管理员以外用 户为软删除) public UserInfo updateUserInfo(UserInfo userInfo) 更新用户信息 6.4. 自定义主题 6.4.1.创建主题 步骤如下: 第一步:在 Package Explorer 工作区中右键 New WebStarter 选择 theme 工程。操 作如图所示 第二步:在“theme 项目”输入框中输入主题项目名称。然后选择模块项目依赖的 宿主项目。 38 主题模块目录结构 39 6.4.2.使用主题 在需要使用自定义的主题模块时,需要在 WebStarter 主 项 目 中 的 system.properties 中的 webstarter-theme 属相中配置主题模块的名称。 6.5. WebStarter API WebStarter API 入口 com.webstarter.api.WebStarterDriverHolder 名称 说明 static WebStarterDriverHolder getDriver() 获取示例 IContextService getContextService() 获取 web 中间件服务 NavigationContext getNavigationContext() 获取 webstarter 平台会话 Bean 1)com.webstarter.api.context.NavigationContext 名称 说明 Authentication getAuthentication() 获取当前用户的认证信息 WebStarterUser getCurrentUser() 获取当前登录的用户 List getUserModuleList() 取得用户可用的模块列表 WebModule getUserModuleByName(String 根据名称获取用户可用的模块 40 name) WebThemeInfo getActiveTheme() 取得当前用户的活动主题 String getActiveModuleName() 取得当前活动模块名称 WebModule getActiveModule() 取得当前活动模块 String getActiveModulePath() 取得活动模块的 url 路径,如: /WebStarter/WebStarter-Console void setActiveModuleName(String name) 设置当前活动模块名称 String getActivePageName() 取得当前模块的活动页面名称 WebMenuNode getActivePage() setActivePageName(String name) 设置当前模块的活动页面名称 String getModuleLastActivePage(String moduleName) 取得模块最后一次访问的页面 void setModuleLastActivePage(String moduleName, String pageName) 设置模块最后一次访问的页面 void clearLastActivePage() 清除所有上次访问记录 2)com.webstarter.api.security.UserAccount 名称 说明 String getRealName() 获取用户姓名 String getUserId() 获取用户标识 String getParameter (String paramName) 获取账户属性 3)com.webstarter.api.security.UserAuthority 名称 说明 String[] getPermission() 获取取角色的权限列表 4)com.webstarter.api.security.UserPrincipal 名称 说明 void setAuthority(String authority) 设置权限标识(角色) 41 void setAuthorities(String[] authorities) 设置权限标识(角色对应资源列表) String getAuthority() 获取权限标识(角色) String[] getAuthorities() 获取权限标识(角色对应资源列表) 5)com.webstarter.api.service.IContextService 名称 说明 ServletContext getServletContext() 获取 Web 中间件上下文 ServletConfig getServletConfig() 获取 web 中间件的 servletconfig ClassLoader getWebAppClassLoader() 获取 web 中间件 classloader String getContentPath() 获取 web 中间件上下文相对路径 String getWebRootPath() 获取 web 中间件上下文绝对路径 Date getSystemStartTime() 获取系统启动时间 6)com.webstarter.api.service.IUserservice 名称 说明 UserAccount loadUserByUsername(String username) 根据用户名获取用户信息 String[] getUserAuthoryties(Object obj) 通过 obj 对象获取用户角色,若使用内存数据库的 用户管理模块,obj 为 String 类型 String getUserServiceName() 获取用户服务名称 7)com.webstarter.api.service.IUserServiceManager 名称 说明 Object getDefaultUserService() 获取默认用户服务 void setDefaultUserService(Object obj) 设置默认用户服务 8)com.webstarter.utils.BundleBeanFactory 名称 说明 static Object getBean(String beanName) 通过 beanName 获取对应的实例对象 42 7. WebStarter 配置 7.1. 主项目配置 7.1.1.spring-security.xml 文件 Spring-security.xml 的配置主要分为五个部分: ① 资源访问权限控制配置 系统的所有资源的访问都是受到 Spring-security 的控制的,因此一个安全的系统 是必须要正确地配置系统的资源访问权限的。资源访问权限控制主要是通过 http 节点 下的 intercept-url 节点来控制的,pattern 属性表示资源 url 的正则表达式,通过该 属性来配置相应的访问资源的 url , access 属性表示用户的角色,系统内置 IS_AUTHENTICATED_ANONYMOUSLY 和 ROLE_USER 两个角色,分别表示未验证的用户角色以 及需验证用户角色的基础角色。 ② 登录页面相关配置 当系统需要登录页面时,需要对 form-login、logout、cocurrent-session-control 等节点进行相应配置,该三个节点分别对应登录、退出以及单个用户会话个数限制的配 置。 ③ 显示信息国际化配置 43 显示信息国际化配置是默认配置,不能做修改,该配置主要是对 spring-security 安全控制中所产生的所有显示信息的国际化配置。 ④ 用户服务代理配置 该配置主要是配置用户角色、权限验证的用户自定义配置 ⑤ 加密策略配置 该配置主要是为用户服务代理时,将用户的密码按照配置的加密策略进行相应的加 密处理。当使用平台提供的 defaultUserService 账户服务时,无需自定义加密类属性 配置,当使用平台提供的 booway_account 账户服务时,则必须使用该自定义的密码加 密类。 7.1.2.System.properties 文件 注意:system-db,CORE_PACKAGE_NAME, FELIX_PACKAGE_NAME 配置不能够被修改。 WebStarter 提供两个用户管理模块:booway_account、defaultUserService; 在 system.properties 中配置所使用的用户管理模块。 # tomahawk皮肤包名称,一般情况不需要修改 tomahawk-skin=green # WebStarter主题名称,default为主题模块中deploy.xml中配置的name webstarter-theme=default # WebStarter默认网络系统账户服务名称 # webstarter-account=booway_account # WebStarter默认本地系统账户服务名称(插件创建的工程默认用户管理) webstarter-account=defaultUserService # 登录成功默认访问模块 portal-module=home # 登录成功默认访问页面 portal-page=ui/home.jsp # 错误页面配置(需要结合web.xml中的404和500错误页面配置) error-page=/home/ui/error.jsp # 系统配置sqlite文件地址(绝对不能够修改) system-db=/WEB-INF/conf/webstarter.db CORE_PACKAGE_NAME=WebStarter.core.Extension.Fragment-1.0.0.jar FELIX_PACKAGE_NAME=felix-4.0.2 44 7.1.3. 数据源配置 ① 通过 WebStarter 插件注册数据源。 创建步骤如下: 第一步:双击 ,如图所示: 第二步:选中“数据源配置”,然后单击“添加”。如图所示: 45 注意:“数据源唯一标识名称”非常的重要,是标识当前数据源的唯一标识。在获 取数据源是必须指明数据源唯一标识名称:filter="(WebStarter.datasource.name= 数据源唯一标识名称)。 46 ② 通过 WebStarter 控制台注册数据源。 ③ 通过 Spring 配置数据源。 47 7.1.4. 默认模块及默认页面配置 成功登陆后,在没有指定访问的模块或者页面的情况下,WebStarter1.2 会默认访 问 system.properties 中配置 portal-module 对应配置的模块名称,然后访问 portal-page 对应配置的页面路径。例如:需要将登陆成功后默认访问的页面放置在 test 模块的 ui/test.jsp,则做如下配置: 7.1.5. 错误页面配置 48 在 system.properties 配置文件的 error-page 用于配置错误页面。 配置的格式为:/模块名称/错误页面路径。例如,将 test 模块的“ui/error.jsp” 路径的页面配置为错误页面,如下图所示: 完成 system.properties 配置后,还必须修改主项目中的 web.xml 文件中配置的 error-page 节点,修改方式如下图所示: 7.1.6. 用户管理配置 在使用 defaultUserService 用户管理的情况下,不需启用 spring security 中的 密码加密策略。如下图所示: 在使用 booway_account 用户管理的情况下,必须启用 spring security 中的密码 加密策略。启用步骤如下: 双击打开主项目中 spring-security.xml 文件,如图所示: 49 如果使用 defaultUserService 用户管理模块,则不需要在 spring-security.xml 配置文件中添加密码加密方式。 7.1.7. 登录页面配置 第一步:在 spring-security.xml 文件找到 form-login 元素位置。如图所示,将 红框标识的部分该为登陆页面所在路径。 格式为:/模块名/登陆页路径.jsf 第二步:修改 security 访问的权限。如图所示: 例如,将 test 模块项目的 login.jsp 页面配置为默认登录页面,如下图所示: 50 7.2. 模块项目配置 7.2.1.deploy.xml 文件 该文件位于业务模块目录下,用于定义标识当前业务模块的模块名称、各类配置文 件的读取路径及 webservice 服务请求的拦截路径(注意:未使用 webservice 服务请不 要进行该项配置)。 deploy.xml 配置内容格式如下图所示: 注意 deploy.xml 配置的”/META-INF/ui”等以”/META/”开头的路径是指打成 bundle 包之后,资源在 jar 包中的相对路径,如下图所示: 51 标签名 说明 deploy 模块信息配置根节点,具备子标签 modules、faces-config、 servlet-config、webservice-config; modules 具备子标签 module; module 具备属性 basePath(module.xml 配置文件读取路径)、name(模块名称)、 title(模块标题) faces-config jsf 导航规则配置文件定义。具备属性 basePath(jsf 导航配置文件读取路 径) servlet-config servlet 配置文件定义。具备属性 basePath(servlet 配置文件读取路径) webservice-config webservice 服务拦截路径配置。具备属性 basePath(webservice 服务请求 拦截路径) 7.2.2.module.xml 文件 该文件位于当前业务模块 deploy.xml 指定配置的目录下,用于定义当前业务模块 提供的菜单页面信息及页面是否需要被包含到主题中。 module.xml 配置内容格式如下图所示: 52 标签名 说明 module 模块页面信息配置根节点,具备子标签 menu、tiles; menu 用于页面信息的配置,具备子标签 folder; folder 具备子标签 page folder 子标签 page 用于定义业务模块提供的页面相关信息,具备属性 name(页面名 称)、title(页面标题)、path(页面路径) tiles 用于页面主题配置,具备子标签 include、exclude; include 具备子标签 page,用于定义需要包含主题的页面(默认所有页面 具备主题); include 子标签 page 具备属性 path,用于定义需配置主题页面所在路径 exclude 具备子标签 page,用于定义不需要配备主题的页面; exclude 子标签 page 具备属性 path,用于定义不需配置主题的页面所在路径 7.2.3.模块菜单配置 双击 ,选择“主项目菜单配置”,展现如下图所示配置界面: 53 界面左下角有 3 个页签选项,分别是数据源配置、默认用户权限配置、主项目菜单 配置,菜单的配置在“主项目菜单配置”页签对应界面,如上图所示。 目前,插件界面支持 3 级菜单目录配置, 第一级:虚拟模块 第二级:菜单目录 第三级:菜单页面 根据具体项目需求,进行第一、第二级的菜单信息配置,第三级则需结合具体业务 模块相关配置进行,本节重点讲解菜单页面的配置。 54 在进行菜单的配置前,需先将菜单所在业务模块打包到主项目,插件才能查找到该 业务模块的提供的菜单信息。 选中需添加菜单页面的菜单目录,点击“增加”按钮,展现如下所示界面: 关联业务模块:该下拉框中展现打包到主项目中的所有页面模块名称,模块名称来 源于业务模块 deploy.xml 配置文件(模块名及各类配置文件路径定义),如下所示: 关联模块页面:该下拉框展现选择的关联业务模块中,module.xml 中配置的所有菜 单页面名称,如下所示: 55 页面新标题:运行成功后,界面菜单目录下展现的菜单名称(若为空,则采用 module.xml 中配置的对应页面的 title)。 模块菜单在系统运行时的配置,详见第四章 WebStarter 服务的控制台服务介绍。 7.2.4.菜单权限配置 每个用户可以分配多个角色(如果采用 booway_account,需在用户管理中新建相同 角色,分配给对应账户)。 关联角色:配置页面可以被具有哪些角色的用户访问。 菜单权限配置在系统运行时的配置,详见第四章 WebStarter 服务的控制台服务介 绍。 56 7.3. 主题项目配置 由 WebStarter 插件生成的主题项目,默认会在 deploy.xml 部署描述文件中生成与 主题项目名称相同的模块名称。以 myTheme 项目为例,如下所示: 其中 name 对应的则是该主题模块的名称,然后还需打开该主题项目的 tiles.xml 配置文件。将 definition 节点中的 template 属性的“主题模块名称”替换为 name 的 属性值,即“myTheme”,即可。如下所示: 注意:deploy.xml 文件中的“主题模块名称”与 tiles.xml 文件中的“主题模块名 称”必须一致。 57 7.4. 业务模块高级配置 7.4.1.Spring bean 获取方式 方法一:通过 WebStarter 平台工具 首先在业务 bundle 中导入 com.webstarter.spring.utils 然后使用 BundleBeanFactory.getBean(“”)方法获取当前 bundle 的 bean. 注意:BundleBeanFactory.getBean(“”)仅仅获取当前模块配置的 bean。不能够获取 其它模块的 bean. 方法二:通 过 在 业 务 bundle 中 的 后 台 代 码 中 实 现 spring 的 org.springframework.context.ApplicationContextAware 接口获取当前 bundle 的上 下文。然后根据 spring 上下文获取 bean。 此种方式在非必须情况下不必采用,如果模块项目在设计中需要对 Spring 内部结 构做入侵,才可进行此种方式的编码。 58 方法三:跨模块获取 bean 在需要跨模块获取 bean 的情况下,我们可以通过 spring DM 声明式服务的方式进行 服务的注册。相关材料详见第三章“业务模块服务的发布和调用”。 package com.webstarter.text; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext)throws BeansException { context = applicationContext; } public static Object getBean(String beanName) { return context.getBean(beanName); } } 59 7.4.2.任务调度(quartz) 应用整合了 Spring 的 Quartz 组件,需要以下几个步骤。 第一步,在业务模块的 MANIFEST.MF 文件中导入以下两个 package: org.springframework.scheduling.quartz, org.quartz.simpl 第二步,创建任务调度执行类,如下所示: 第三步,配置 Spring Bean 配置文件,Quartz 整合 Spring 的 bean 配置如下所示: package com.test.quartz; public class TestJob{ public void execute(){ try{ System.out.println("任务调度"); } catch (Exception ex){ ex.printStackTrace(); } } } 60 具体的 quartz 整合 Spring 的相关实例可以查找相关资料,此处仅提供简单的例子。 61 7.4.3.WebServices(xfire) 使用 webservices 发布服务。 第一步:必须导入 WebStarter_xfire。如图所示 第二步:开启 WebServices 服务。在 deploy.xml 配置文件中 webservice-config 节点的 basepath 属性中配置 webservices 的拦截路径。如图所示: 第三步:整合 spring 发布服务。如图所示: 62 注意:import 节 点 的 resource 为固定配置,不能更改, bean 的 类 名 org.codehaus.xfire.spring.ServiceBean 的配置为固定配置,不能更改。 第四步:修改 security 访问权限,如图所示: 服务访问路径: http://ip:port/主项目名称/模块名称/webservices 拦截路径/服务名称 实例测试 url: http://localhost:8080/web/firetest/service/LogService?wsdl 63 7.4.4.Hibernate 配置 在 WebStarter1.2 平台中特别需要注意的是在 spring 配置文件中配置创建 SessionFactory 部分。以下是参考配置: 其中 bundleMappingPath 指 hibernate 映射文件存放的路径。 注 意 : id 为 sessionFactory 的 bean 对 应 的 class 为 com.webstarter.impl.hibernate.LocalSessionFactoryBean,是固定的配置,不能修 改。 7.4.5.jsf 导航配置 业务模块的 deploy.xml 配置文件中,定义了 jsf 导航的配置文件路径。 在定义路径下,新建相应的 xml 文件,导航内容格式如下: 如上图所示,模块名采用模块名变量的配置方式,字符串“${module_name}”代表 当前业务模块名。 org.hibernate.dialect.MySQLDialect true /META-INF/hibernateMapping 64 若有跨模块的导航需求,模块名可直接使用 deploy.xml 中定义的模块名。 7.4.6.servlet 配置 在 WebStarter1.2 平台中,servlet 的配置相对于 WebStarter1.1 平台有些变化, 主要体现在 servlet 的访问上。 WebStarter1.2 中 servlet 的访问格式:http://ip:port/主项目名称/模块项目名 称/servlet 拦截路径。 以下介绍 WebStarter1.2 平台 servlet 配置: 第一步:从模块项目中的/config/servlet 路径下找到 servlet 配置文件。如图所 示: 第二步:配置 servlet。其中 servlet-class 指被配置的 servlet 的全名。 url-pattern 指 servlet 的拦截路径。Init-param 指 servlet 初始化参数。配置示例如 下图所示: 65 7.4.7. 日志配置(Log4j) log4j 主要需要配置两个控制器,一个是称之为 appender 的连接器,它的主要作用 #webstarter平台控制台输出连接器配置 log4j.appender.platform=org.apache.log4j.ConsoleAppender log4j.appender.platform.layout=org.apache.log4j.PatternLayout log4j.appender.platform.layout.ConversionPattern= %d [webstarter]-%5p : %m%n %l%n #第三方组件控制台输出连接器配置 log4j.appender.third=org.apache.log4j.ConsoleAppender log4j.appender. third.layout=org.apache.log4j.PatternLayout log4j.appender. third.layout.ConversionPattern= %d [Third’s]-%5p : %m%n %l%n #webstarter平台文件输出连接器配置 log4j.appender.platformFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.platformFile.file=${catalina.base}/logs/WebStarter_log/WebStarter.log log4j.appender.platformFile.Encoding=UTF-8 log4j.appender.platformFile.layout=org.apache.log4j.PatternLayout log4j.appender.platformFile.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.platformFile.layout.ConversionPattern=%d - %m%n %l%n # 第三方组件文件输出连接器配置 log4j.appender.thirdFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.thirdFile.file=${catalina.base}/logs/WebStarter_log/WebStarter.log log4j.appender.thirdFile.Encoding=UTF-8 log4j.appender.thirdFile.layout=org.apache.log4j.PatternLayout log4j.appender.thirdFile.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.thirdFile.layout.ConversionPattern=%d - %m%n %l%n #系统日志记录器配置 log4j.logger.com.webstarter=debug,platform,platformFile,third,thirdFile log4j.logger.org.apache=info,third,platformFile, third,thirdFile log4j.logger.org.ajax4jsf=info,third,platformFile, third,thirdFile log4j.logger.org.springframework=info,third,platformFile, third,thirdFile 66 是配置日志的格式、布局等;另一个是称之为 logger 的日志记录器,它的主要作用是 控制日志记录输出的位置以及日志记录的级别。其中 log4j.logger.com.webstarter 中 红色字体部分表示该日志记录器仅记录 com.webstarter 包路径下的所有代码对日志的 记录。日志记录器能够记录的日志打印级别从低到高分别是: debug,info,warn,error,fatal 五个级别,日志记录器还必须配置日志记录连接器,例 如:platform,platformFile,third,thirdFile 等。 67 8. WebStarter 控制台 8.1. 系统菜单配置 系统菜单管理功能模块提供了虚拟模块添加、删除,菜单目录、菜单增删改及菜单 页面权限配置等功能。以下介绍具体功能的用法: ① 菜单基本信息查询 查询虚拟模块及菜单信息列表。 在控制台界面中,单击“系统菜单部署”,进入系统菜单信息查看及配置,如下 图所示: ② 虚拟模块管理 68 进入“系统菜单配置”页面后,系统主菜单配置栏下,如上图所示,点击相应 按钮,进行虚拟模块的添加、删除及显示顺序的调整。 1.添加虚拟模块 点击” 添加”按钮,弹出虚拟菜单模块添加弹出框,如下图所示: 在弹出框中填写设置虚拟菜单模块名称及标题,点击“确定”,添加虚拟菜单模块。 2.删除虚拟模块 选中列表中对应虚拟模块,点击右侧“删除”按钮,进行虚拟模块的删除。 3.调整虚拟模块显示顺序 选中列表中对应虚拟模块,点击右侧“上移”、“下移”按钮,进行虚拟模块的显示 顺序调整。 ③ 虚拟模块菜单管理 选中主菜单下拉列表中对应虚拟模块,进行该虚拟模块菜单的管理,菜单信息 以树状结构展现,如下图所示。 69 菜单管理包含菜单、目录的编辑、添加,删除及顺序的调整(上移下移)功能。 1.新建子目录 选中对应目录节点,点击添加子目录,弹出“新建子目录”弹出框,如下图所示: 在弹出框中填写设置子目录名称,点击确定,在指定目录节点下加入子目录。 2.插入子菜单 选中对应目录节点,点击插入子菜单,跳转进入添加子菜单页面,进行菜单的添加, 插入子菜单页面如下图所示: 模块列表下拉框中显示的是主项目中所有的业务 bundle 模块名称。 选中对应模块名,查询 bundle 模块中 module.xml 中配置的菜单,然后点击右侧的 添加按钮,进行菜单的添加。 3.调整菜单顺序: 点击上移下移按钮,进行菜单顺序的调整 4.删除菜单 选中要删除的节点,点击“删除”按钮,进行菜单的删除。 注意:任何的菜单相关操作完成后,需点击“保存当前配置信息”按钮,才能将修 改信息保存到 SQLite 数据库。 5.配置信息导出 由于系统菜单等配置信息保存在 SQLite 数据库中,部署时比较麻烦,导出配置信 息正是为了解决此类问题。 点击“导出配置信息”按钮,可以直接导出系统配置信息,方便以后部署。 默认情况,该文件在部署目录“主项目名称/WEB-INF/conf”路径下,导出后,再 70 次部署时,直接进入该路径对该文件进行替换即可。 8.2. 系统组件部署 系统组件管理功能模块提供了 bundle 基础信息查询、bundle 的安装、停止等功能。 以下介绍具体功能的用法: ① Bundle 基础信息查询 查询所有 bundle 信息列表 在控制台界面中,单击“系统组件部署” 查看具体 bundle 信息 在 bundle 的列表中选择具体的 bundle。例如查看“WebStarter_xfire”的具体信息。 操作如下: 71 WebStarter_xfire 信息列表: 查询系统 bundle 单击“显示系统 bundle”,查询系统 bundle 列表 72 ② Bundle 安装 第一步:上传 bundle,点击“选择文件”。选择需要安装的 bundle。完成选择后单 击“打开”。操作如下图所示: 73 第二步:单击“上传并安装”。成功安装如下图所示 ③ Bundle 启动 在 bundle 列表中,查询需要启动的 bundle,然后单击 bundle 启动按钮。操作如下 图所示: 成功启动 bundle,如下图所示: ④ Bundle 停止 在 bundle 列表中,查询需要停止的 bundle,然后单击 bundle 停止按钮。操作如下 图所示: 74 成功停止 bundle,如下图所示: ⑤ Bundle 更新 在 bundle 列表中,查询需要更新的 bundle,然后单击 bundle 更新按钮。操作如下 图所示: ⑥ Bundle 卸载 在 bundle 列表中,查询需要卸载的 bundle,然后单击 bundle 卸载按钮。操作如下 图所示: 成功卸载 bundle 后,将在 bundle 列表中无法找到卸载了的 bundle。 8.3. 数据连接管理 数据源连接管理模块是 WebStarter1.2 平台提供的公共服务组件,该组件实现了数 据源的动态绑定和解绑定,能够自动适应系统的数据源的变更,而不需要停机维护。 75 数据连接管理模块提供了数据源的管理功能和查看当前使用的用户管理模块以及 当前使用的主题模块。以下主要介绍数据源的管理。 ① 查看当前注册的数据源列表 单击控制台菜单中的“数据连接管理”按钮。如下图所示: ② 数据源添加 单击“新建数据源”按钮,进入数据源添加页面。然后添加数据源相关配置。完成 后单击“确定”按钮。操作如下图: 76 ③ 数据源更新 在数据连接管理主页面中的 jdbc 数据源管理部分,单击需要更新的数据源名称,进 入数据源配置修改页面。 注:如果数据源的配置更新后,需要更新应用了该数据源的业务模块,具体操作参 见 8.2 节系统组件部署的 Bundle 更新功能。 ④ 数据源删除 在数据连接管理主页面中的 jdbc 数据源管理部分,选择需要删除的数据源,然后单 击删除按钮。操作如下图所示: 单击“确定”,完成指定数据源的删除。 77 8.4. 系统运行状态 系统运行状态模块,主要是查看平台的各种配置,其中包括 Spring Bean 的配置, Tiles 配置、JSF 导航配置、Servlet 配置。 ① Spring Bean 配置 Spring Bean 的配置包含平台中所有 Spring 上下文中的 Bean。通过这里我们可以查 看 Spring Bean 的基础信息。如下图所示: ② Tiles 配置 在 Tiles 配置信息列表中,可以查看到当前系统所有有关 Tiles 的配置。详细信息 如下图所示: 78 ③ JSF 导航配置 在 JSF 导航配置信息列表中,可以查看当前系统所有的 JSF 导航配置。详细信息如 下图所示: ④ Servlet 配置 在 Servlet 配置信息列表中,可以查看当前系统所有的 Servlet 配置。详细信息如 下图所示: 79 9. 常见问题解决方法 9.1. 前后台开发分离 公司的项目开发自从分为前端开发和业务开发人员以来,开发效率得到了很大的提 高。但是在团队协作的开发过程中,经常会出现前后端开发沟通不畅,导致开发过程中 项目运行不正常、页面样式不正确、页面效果不同步等各种情况。并且前端组和业务开 发组经常需要为前后台代码集成花费大量的沟通时间和调试时间来解决页面与后台的 交互问题。这些都严重制约了开发效率的提高,因此基于这些原因,提出一套有效的前 后台分离解决方案。如下图所示: 图中蓝色部分为前端组的工作,黄色部分为业务开发组的工作,白色部分通过前后 端开发人为修改相对应的 Spring 配置文件的后缀来实现前后端业务实现层的区别。具 体操作步骤如下: 一,前端开发人员从 teamprise 上获取的代码中找到业务开发人员的相关业务层的 Spring 配置文件,并将其离线,然后修改其后缀,确保后缀不为 xml 即可。如下图所示: 80 假设其中 applicationContext-biz.xml 为业务开发人员专用的业务层 Spring 配 置,则通过右键选择 Properties 菜单,弹出如下图所示对话框: 将 Read Only 的选中状态更改为非选中状态,然后点击 OK 按钮,并刷新该文件对 应的目录,操作之后的效果图如下图所示: 81 然 后 将 离 线 后 的 applicationContext-biz.xml 文件改为 applicationContext.xml2,如下图所示: 二,业务开发人员参照前端开发人员的操作步骤,将前端的测试数据层业务代码的 Spring 配置文件离线,并修改后缀即可。 82 三,前后端开发人员按照原有的开发规则进行开发即可,无需再做任何额外的操作。 9.2. 前端开发调试 系统启动后,在控制台中找到打印日志中记录的系统的模块部署目录,该目录该目 录下的 bundle 包是 tomacat 从发布的主项目的 bundle 目录下部署而来的 bundle 包。 如下图所示: 因此可以通过将修改部署在该目录下的 jar 包的文件来实现 bundle 包的热部署和 更新。具体操作步骤如下: 首先,通过模块部署路径找到部署目录下需要修改的 bundle 包,使用压缩软件打 开需要更新的 bundle 包,如下图所示: 83 其次,将需要更新的文件替换到相应的目录下,覆盖原文件,如下图所示: 然后,在 Eclipse 的控制台输入 lb 命令,找到需要更新的 bundle 包的编号,。如 下图所示: 最后,再通过 update 命令更新该编号的 bundle 包,及完成 bundle 包的热部署和热 替换。如下图所示: 84 至此则完成了前端页面的热部署更新操作,重新刷新请求页面就能够看到更新后的 页面效果了。 9.3. 其他问题 ①在使用 Teamprise 进行团队开发时,对 webstarter.db 文件进行编辑时,经常会 抛出一个 java.sql.SQLException 的异常,异常信息为:Attempt to write a readonly database(attempt to write a readonly database),如下图所示。原因是没有将 webstarter.db 文件 check out,解决的方法是编辑之前将 webstarter.db 文件签出即 可。 85 ②缺少依赖的 package 使用插件生成的业务模块项目,当默认导入的 package 或者是依赖的 bundle 不能 够满足当前的要求,使得代码编译通过时。一般在代码编辑中会出现如下图所示的提示: 一般情况下,只需要按照提示所示,选择 Add”xxx.xxx.xxx” to imported packages 即可。当按照 Eclipse 的提示将缺少的 package 导入之后,往往还会出现如下 图所示的情况: 这表明,DatabaseUtil 类所依赖的 ComboPooledDataSource 还依赖了其他包路径下 的类。找到 ComboPooledDataSourc 类在头部申明的 import 的包,将所有依赖的包名加 入到 MANIFEST.MF 的 import package 中,具体操作参见注册表服务调用章节 4.2.1. 86 ③编译通过后任然缺少依赖的 package 在很多情况下,编译通过了,运行后还是报 ClassNotFund 的异常,可以查看业务模 块的 Spring 配置是否引用了外部的 class,而没有将该 class 所对应的 package 导入, 如下图所示:
还剩87页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

23531271

贡献于2014-07-17

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf