3.5.4 记录上传与下载模块 当用户在首页点击提交按钮的时候,客户端的数据将以XML形式被组织起来发往Upload(图18),Upload再调用FileProcess(图19)对象的public boolean fileSave(byte[] data, Stringname,String dir)函数将数据保存到服务器上,保存成功就将记录的文件名写入数据库,否则提示用户提交失败。 内容来自www.paper51.com
paper51.com 图18 上传动作 http://www.paper51.com
http://www.paper51.com
图19 文件上传与下载动作 paper51.com 当用户点击“提取记录”的时候,此请求将被发送到index.jsp,index.jsp根据接收的文件名参数调用FileProcess(图19)的public byte[] fileDown(Stringpath)函数将记录以XML形式下载到客户端,客户端使用javaScript脚本将数据填充到输入框中。 copyright paper51.com 3.5.5 文档转换模块 http://www.paper51.com 当用户点击“转换成word文档”或者“转换成pdf文档”的时候,请求将被发送到action.Conversion(图20)中,action.Conversion根据需要转换类型再调用相应的转换对象data.ConversionDoc(图21)或者data.ConversionPdf(图22)进行转换。 内容来自论文无忧网 www.paper51.com paper51.com 图20 转换请求 内容来自论文无忧网 www.paper51.com 1.转换成word文档: paper51.com 图21 转换成word文档 copyright paper51.com 将XML文档转换成word支持的rtf格式,使用了javax.xml.transform的transform()函数,使用xml文件和xslt模板做输入,输出为rtf格式的文档,并以流的形式发送到客户端,让用户下载,代码如下: http://www.paper51.com public voidconversion() throws IOException { http://www.paper51.com //TODO 自动生成方法存根 内容来自论文无忧网 www.paper51.com response.setContentType("Application/msword;charset=UTF-8"); 内容来自论文无忧网 www.paper51.com
response.setHeader("Content-Disposition","attachment; filename="+newFilename(fileName)); 内容来自www.paper51.com OutputStreamout=response.getOutputStream(); 内容来自论文无忧网 www.paper51.com
StreamSourcesr=new StreamSource(new File(fileDir+fileName)); 内容来自论文无忧网 www.paper51.com StreamResultrs=new StreamResult(out); paper51.com
TransformerFactoryfactory=TransformerFactory.newInstance(); copyright paper51.com TemplatestempXsl=null; 内容来自论文无忧网 www.paper51.com try{ 内容来自www.paper51.com
tempXsl=factory.newTemplates(newStreamSource(new File(confDir+xslt))); http://www.paper51.com Transformertf=tempXsl.newTransformer(); paper51.com tf.transform(sr,rs); paper51.com out.flush(); copyright paper51.com out.close(); paper51.com } paper51.com
catch(TransformerConfigurationExceptione){ http://www.paper51.com System.out.println("xslt严重配置错误:"+e.getMessage()); http://www.paper51.com out.close(); copyright paper51.com out=null; 内容来自www.paper51.com } 内容来自论文无忧网 www.paper51.com catch(TransformerExceptionte){ copyright paper51.com System.out.println("转换过程发生异常:"+te.getMessage()); http://www.paper51.com out.close(); copyright paper51.com out=null; copyright paper51.com } http://www.paper51.com } 内容来自论文无忧网 www.paper51.com 2.转换成pdf文档: http://www.paper51.com
内容来自www.paper51.com 图22 转换成PDF文档 copyright paper51.com 将XML文档转换成PDF格式,使用了开源项目Apache FOP 来进行转换,要得到PDF文档,需要两步(图23): http://www.paper51.com http://www.paper51.com 图23 XML文档转换成PDF流程 内容来自论文无忧网 www.paper51.com
1)用 XSLT 样式表将 XML 文档转换为由 XSL-FO 元素构成的文件。要执行这一转换,只需用调用 XSLT 处理器。 2)用某种显示引擎将 XSL-FO 元素转换为 PDF 文件。 内容来自论文无忧网 www.paper51.com 本系统首先使用javax.xml.transform的transform()函数,使用XML文件和XSLT模板做输入,输出为XSL-FO元素构成的文档,然后使用FOP引擎将XSL-FO文件转换成用户需要的PDF文件,并以流的形式发送到客户端,让用户下载,源代码如下: paper51.com @Override 内容来自www.paper51.com public void conversion()throws IOException { paper51.com // TODO 自动生成方法存根 内容来自www.paper51.com response.setContentType("Application/msword;charset=UTF-8"); http://www.paper51.com response.setHeader("Content-Disposition","attachment; copyright paper51.com
filename="+newFilename(fileName)); paper51.com OutputStreamout=response.getOutputStream(); paper51.com byte[]temp; 内容来自论文无忧网 www.paper51.com ByteArrayOutputStreambos=new ByteArrayOutputStream(); 内容来自论文无忧网 www.paper51.com StreamSourcesr = new StreamSource(new File(fileDir+fileName)); 内容来自www.paper51.com StreamResultrs = new StreamResult(bos); copyright paper51.com
TransformerFactoryfactory = TransformerFactory.newInstance(); paper51.com TemplatestempXsl = null; paper51.com try{ 内容来自www.paper51.com tempXsl=factory.newTemplates( http://www.paper51.com new StreamSource(newFile(confDir+xslt))); http://www.paper51.com Transformertf = tempXsl.newTransformer(); copyright paper51.com tf.setOutputProperty(OutputKeys.ENCODING,"gb2312"); 内容来自论文无忧网 www.paper51.com
tf.transform(sr,rs); copyright paper51.com }catch (TransformerConfigurationException e) { 内容来自www.paper51.com System.out.println("xslt严重配置错误:" + e.getMessage()); 内容来自论文无忧网 www.paper51.com }catch (TransformerException te) { paper51.com
System.out.println("fo生成过程发生异常:" + te.getMessage()); 内容来自www.paper51.com } http://www.paper51.com temp=bos.toByteArray(); paper51.com
// System.out.println(new String(temp));测试代码 内容来自www.paper51.com
try{ http://www.paper51.com Driverdriver = new Driver(); http://www.paper51.com Loggerlogger=new ConsoleLogger(ConsoleLogger.LEVEL_INFO); 内容来自www.paper51.com driver.setLogger(logger); 内容来自论文无忧网 www.paper51.com
org.apache.fop.messaging.MessageHandler.setScreenLogger(logger); paper51.com driver.setRenderer(Driver.RENDER_PDF); 内容来自论文无忧网 www.paper51.com
InputStreaminput =new ByteArrayInputStream(temp); http://www.paper51.com driver.setInputSource(newInputSource(input)); 内容来自论文无忧网 www.paper51.com driver.setOutputStream(out); 内容来自www.paper51.com Optionsoptions = new Options(new File(confDir+"userconfig.xml")); 内容来自www.paper51.com driver.run(); paper51.com out.flush(); 内容来自www.paper51.com
out.close(); 内容来自论文无忧网 www.paper51.com }catch (IOException e) { paper51.com out.close(); 内容来自www.paper51.com
System.out.println("生成pdf发生异常"+e.getMessage()); http://www.paper51.com }catch (org.apache.fop.apps.FOPException e) { http://www.paper51.com out.close(); copyright paper51.com
System.out.println("生成pdf发生异常"+e.getMessage()); paper51.com } 内容来自www.paper51.com
} 内容来自www.paper51.com
3.6 XSLT模板 paper51.com
本系统两种文档的生成,都是建立在模板的基础上,此模板为XSLT文件,遵循XSLT1.0标准。 http://www.paper51.com 3.7 XSLT简介 http://www.paper51.com XSLT是由XSL(ExtensibleStylesheet Language)发展而来的,XSLT是一种基于XML的语言,用于将一类XML文档转换成另一种XML文档。 http://www.paper51.com 如果是一个熟悉XML编程的开发人员,他可以自己手工编写自己的XSLT文件,但是对用户来说,要求太高,因此,我们使用了软件Altova StyleVision来进行辅助设计XSLT模板。它使用所见即所得的方式来进行编写,首先在Design窗口(图24)中进行排版与设计,可以在RTF Preview 窗口(图25)预览转换生成的rtf文档,或点击PDFPreview生成PDF模板进行预览。 http://www.paper51.com
copyright paper51.com
图24 模板编辑 paper51.com
http://www.paper51.com 图25 模板预览 http://www.paper51.com 当设计完成以后,即可导出生成RTF的XSLT文件和生成PDF的XSLT文件。 内容来自www.paper51.com
3.8 web.xml文件的配置 内容来自www.paper51.com 在Servlet启动时将读入web.xml文件中的初始化参数,在本系统中用于数据库的连接和XSLT模板的存放路径以及用户数据的存放路径实现可配置性。 paper51.com
<context-param> http://www.paper51.com
<param-name>fileDir</param-name> http://www.paper51.com
<param-value>d:/data/data/</param-value> 内容来自www.paper51.com 这里配置用户数据的存放路径 copyright paper51.com </context-param> 内容来自论文无忧网 www.paper51.com <context-param> 内容来自www.paper51.com <param-name>confDir</param-name> 内容来自www.paper51.com <param-value>d:/data/conf/</param-value> 内容来自论文无忧网 www.paper51.com 这里配置XSLT模板的存放路径 copyright paper51.com </context-param> 内容来自论文无忧网 www.paper51.com <context-param> 内容来自www.paper51.com
<param-name>DBDriver</param-name> paper51.com <param-value>org.gjt.mm.mysql.Driver</param-value> 内容来自论文无忧网 www.paper51.com 这里配置数据库的连接驱动 paper51.com </context-param> http://www.paper51.com <context-param> paper51.com <param-name>ConnStr</param-name> copyright paper51.com <param-value>jdbc:mysql://127.0.0.1:3306/graduate?useUnicode=true&characterEncoding=GB2312 内容来自论文无忧网 www.paper51.com </param-value> copyright paper51.com
这里配置数据库的连接字符串 copyright paper51.com </context-param> paper51.com <context-param> 内容来自论文无忧网 www.paper51.com <param-name>MyUser</param-name> http://www.paper51.com
<param-value>ydlover</param-value> 内容来自论文无忧网 www.paper51.com 这里配置数据库的用户名 paper51.com
</context-param> 内容来自www.paper51.com <context-param> 内容来自论文无忧网 www.paper51.com <param-name>MyPassword</param-name> paper51.com
<param-value>ydl2008</param-value> 内容来自论文无忧网 www.paper51.com
这里配置数据库的密码 http://www.paper51.com </context-param> 内容来自www.paper51.com <context-param> copyright paper51.com
<param-name>rtfXsltFile</param-name> 内容来自www.paper51.com <param-value>rtf.xslt</param-value> 内容来自www.paper51.com 这里配置rtf转换模板的文件名 http://www.paper51.com
</context-param> 内容来自论文无忧网 www.paper51.com <context-param> copyright paper51.com <param-name>pdfXslFile</param-name> 内容来自论文无忧网 www.paper51.com
<param-value>pdf.xsl</param-value> http://www.paper51.com 这里配置pdf转换模板的文件名 paper51.com
</context-param> 内容来自论文无忧网 www.paper51.com
|