1. 引言
目前我校的信息化建设,在文件的管理方面,由于缺乏统一规划,不能满足全校各部门对公示文件资源共享的需求,没有形成全校统一的信息化标准体系。为全校提供必要的公示文件共享平台,促进全校公示文件共享阅读,发挥公示系统在日常工作中的作用,分类别的实现信息共享,有利于增强全体教师对校内公示文件的知情权,提高高校管理透明的公众形象。
2. 系统需求
系统用户包括校内学生、教师、系统管理员等,通过校园门户为学生及教师提供查看、浏览校内公示文件、上传下载部分授权的公示文件、提供全文搜索等功能;管理员主要对系统用户权限的管理、文件目录管理、校内公示文件的管理、文件内容管理、文件授权管理等。
3. 项目技术难点
n 文档格式转换
本系统用FlexPaper与PDF2SWF一起使用,实现在浏览器上显示各种格式的文档,它的原理是先用openOffice软件把doc、ppt、xls、txt等格式文档转换为PDF格式,然后使用开源的SwfTools软件将PDF转成SWF格式文件,最后用FlexPaper加载swf文件实现office文档的在线浏览[1] 。
openOffice是一款可以把ppt、word、excel、txt等ms office格式文档转换成pdf格式的软件;在服务器系统中安装openOffice后,配合jodconverter-2.2.2.jar包可以在java代码中实现格式转换功能 [2] 。
SwfTools是一款可以把PDF文档转换为swf格式的软件;在服务器系统中安装SwfTools后,在系统命令行中输入,例如/C:/Program Files/SWFTools/pdf2swf.exe d:\\displaytag.pdf -o d:\\displaytag.swf就可以实现格式转换了 [3] 。
n 全文搜索引擎
系统的文档搜索采用Lucene实现的全文索引引擎,早期系统一般都是基于数据库实现的模糊搜索,数据量大对系统速度有影响,也不能按语意进行拆开,可以说缺点多;这里系统采用Lucene,并用二元分词算法实现,如何进行创建索引和搜索是系统的重点和难点。
4. 系统建设方案
4.1. 系统总体架构
校内公示系统的总体架构图如图1所示:
4.2. 系统开发框架
系统采用SSH技术架构,是多个框架(struts + spring + hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层(实体层) [4] 。
Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持。Spring一方面作为一个轻量级的IoC容器,负责查找、定位、创建和管理对象及对象之间的依赖关系,另一方面能使Struts和Hibernate更好地工作[5] 。
系统技术框架图如图2所示:
由SSH构建系统的基本业务流程:
a) 在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。
b) 在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。
c) 在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率[6] 。
4.3. 用户实体ER图
根据用户需求设计的概念数据模型,它是从用户角度看到的数据库,可用E-R模型表示,部分E-R图如下[7] :
用户实体E-R图如图3所示。
文档类别实体E-R图如图4所示。
文档实体E-R图如图5所示。
4.4. 关键数据表结构
校内公示系统涉及的关键数据表结构,如表1至表7所示。
4.5. 关键代码
// word文件转换成pdf文件[8]
// 打开主线程
ComThread.InitSTA();
// 查找word组件
ActiveXComponent app = new ActiveXComponent(Word.Application);
// 要转换的word文件
String inFile = sourceFile;
// 目标文件
String tpFile = desFile;
boolean flag = false;
try {
// 设置word不可见
app.setProperty(Visible, new Variant(false));
Dispatch docs = app.getProperty(Documents).toDispatch();
// 打开word文件,注意这里第三个参数要设为true,这个参数表示是否以只读方式打开,因为我们不用保存原文件,所以以只读方式打开,如果你想进行读写,那么就得设为false。
Dispatch doc = Dispatch.invoke(docs, Open, Dispatch. Method, new Object[] {inFile, new Variant(false), new Variant(true)}, new int[1]). toDispatch();
// 作为html格式保存到目标文件
Dispatch.invoke(doc, SaveAs, Dispatch.Method, new Object[] {
tpFile, new Variant(17)}, new int[1]);
Variant f = new Variant(false);
// 关闭word文件
Dispatch.call(doc, Close, f);
flag = true;
} catch (Exception e) {
throw e;
} finally {
// word组件关闭
app.invoke(Quit, new Variant[] {});
// 关闭主线程
ComThread.Release();
ComThread.quitMainSTA();
}
//PDF文件转换成SWF文件
// 转换命令
String command = cmd /c \ + CommonKey.SWFTOOLS_PATH+pdf2swf\ -z -s flashversion=9 + CommonKey.PDF_FILE_PATH + fileName + .pdf -o
+ request.getServletContext().getRealPath(/) +
CommonKey.SWFFILE_PATH + fileName + .swf ;
// 字符串数组(设置执行参数)
String[] envp = new String[1];
// SWFTOOLS工具安装路径
envp[0] = PATH= + CommonKey.SWFTOOLS_PATH;
// 执行转换
Process pro = Runtime.getRuntime().exec(command, envp);
// 监听转换数据流
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(pro.getInputStream()));
// 直到转换完成
while (bufferedReader.readLine() != null) {
}
try {
pro.waitFor();
} catch (InterruptedException e) {
}
// 转换完成后退出
return pro.exitValue();
4.6. 系统效果图
系统运行效果图,如图6所示文档分类列表图。
系统运行效果图,如图7所示文件列表图。

Figure 1. The system’s overall architecture diagram
图1. 系统总体架构图

Figure 2. The system’s technology architecture diagram
图2. 系统技术框架图

Figure 4. Document category entity E-R diagram
图4. 文档类别实体E-R图
表1. 用户信息表
表2. 文件夹表
表3. 文档信息表
表4. 文档类别
表5. 文档下载记录表
表6. 用户访问记录
表7. 系统登录日志

Figure 6. Document category list diagram
图6. 文件分类列表图

Figure 8. Show file in flexpaper diagram
图8. 在flexpaper中显示文件效果图
系统运行效果图[9] ,如图8所示在flexpaper中显示文件效果图。