- 浏览: 311749 次
文章分类
最新评论
-
luokery:
你把正常的代码放到try里面不就好了, 异常的时候就catch ...
巧用while循环避免执行除了异常处理的的另一个处理机制 -
java_doom:
这个行号根据什么来的 为什么不是连续的?
别拿Hadoop map key当id使 -
mixer_b:
...
写博客的那些事儿 -
flyfx:
谢谢谢谢
java break,continue,return 使用。【借鉴与改编】 -
andilyliao:
比起青鸟 我更鄙视大学。
北大青鸟就让你们这么鄙视吗.
后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换。首先想多说一句就是 jacob会每次生成word报告时都会启动一个office word进程,替换完毕之后 需要关闭掉这个进程,如果有死掉的word进程有可能会影响word的生成。这些具体做火这调试过程中就会发现这个问题的。
还需要说明一点,解析XML有很多种方式,自己挑选自己熟悉的就行了,我采用jdom,当时想的没有这么负责,所以写代码也没有怎么重构,需要重新整理,主要方法我会贴出来。
那么我就从头到尾的说一下,调用生成报告时,后台的整个调用过程是怎么样的,是如何运转的?
首先访问web应用地址:http://192.16.3.22/demo/DocInfo!createDoc.action 这样我提交一个方法 action方法,这个方法首先是在web应用服务器上的,然后进入action中的createDoc方法,同时你需要获取到从方法传过来的相关参数, 比如:sql中定义的那个查询条件,报告类型等参数。
(在去调用生成报告的方法中,可能你还需要加入一些判断,如是否已经生成过报告啊,或者最新报告的版本啊,因为我们都是既保存word报告文档又会在数据库中插入一条记录,方便查询),这样就开始了:
首先是action的createDoc方法:
- /**
- * 通过HttpCient调用报告服务器的方法生成报告 DOC
- */
- public String createDoc() throws Exception {
- //定义放回成功与否的判断码
- String prMsg="" ;
- // 获取当前登录的用户
- UserVo userVo = CommonUtils.getUserMessage();
- //获取模版类型
- docType = Struts2Utils.getParameter("docType" );
- //重新创建文档
- String creatOrnot = Struts2Utils.getParameter("creatOrnot" );
- //获取组组编号参数
- workgroupId = Struts2Utils.getParameter("workgroupId" );
- //获取评估用例实例ID参数
- evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId" );
- if (CommonUtils.isNotNull(docType)){
- //获取项目Id
- projectId = Struts2Utils.getParameter("projectId" );
- if (!CommonUtils.isNotNull(projectId)){
- if (CommonUtils.isNotNull( this .getIdFromSession( "PM_PROJECTID" ))){
- projectId = this .getIdFromSession( "PM_PROJECTID" ).toString();
- }else {
- Struts2Utils.getRequest().setAttribute("msg" , "请先选择项目!" );
- }
- }
- if (CommonUtils.isNotNull(projectId)){
- prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);
- }
- }
- return "docList" ;
- }
注:在我贴出来的代码中,能看懂就行了,有些不用管他(可能是其他业务方面的判断),关于最后返回的prMsg---代表各种状态
主要表示成功与否或者是出错的信息。
接着我贴出service层的方法downloadFileByUrl
- </pre><p></p><p></p><pre name= "code" class = "java" ><pre name= "code" class = "java" > /**
- * 功能:
- * 1.(生成报告文档)
- * 2.保存指定URL的源文件到指定路径下
- * @param projectId
- * @param userId
- * @param workgroupId
- * @param evtcaseInstId
- * @param docType
- * @param creatOrnot
- * @return
- * @throws Exception
- */
- @SuppressWarnings ( "deprecation" )
- public synchronized String downloadFileByUrl(String projectId,String userId,String workgroupId,String evtcaseInstId,String docType,String creatOrnot) throws Exception {
- String msg = "1" ; //"1":默认为创建成功的提示信息 "2":标识创建失败
- String srcUrl = "" ; //报告服务器的执行路径
- HttpResponse response = null ;
- FileOutputStream out = null ;
- HttpClient httpclient = null ;
- HttpGet httpget = null ;
- long time1 = System.currentTimeMillis();
- //获取保存后的路径
- TProjDoc projDoc = projectDocDao.findFileByType(userId, Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
- if (projDoc == null || (projDoc != null && CommonUtils.isNotNull(creatOrnot) && creatOrnot.equals( "1" ))){ //FT_任务编号_[FID]
- try {
- //获取报告服务器的执行路径
- srcUrl = xmlPathDef.getActionUrl(docType, projectId,userId,workgroupId,evtcaseInstId);
- HttpParams httpParams = new BasicHttpParams();
- // 设置最大连接数
- ConnManagerParams.setMaxTotalConnections(httpParams, 1 );
- // 设置获取连接的最大等待时间
- //ConnManagerParams.setTimeout(httpParams, 6000);
- // 设置每个路由最大连接数
- ConnPerRouteBean connPerRoute = new ConnPerRouteBean( 1 );
- ConnManagerParams.setMaxConnectionsPerRoute(httpParams,connPerRoute);
- // 设置连接超时时间
- HttpConnectionParams.setConnectionTimeout(httpParams, 6000 );
- // 设置读取超时时间
- if (docType.toString().equals(XmlPathDef.SPOTTEST_DOC) && docType.toString().equals(XmlPathDef.FTEST_DOC)){
- HttpConnectionParams.setSoTimeout(httpParams, 2400000 );
- }else {
- HttpConnectionParams.setSoTimeout(httpParams, 600000 );
- }
- SchemeRegistry registry = new SchemeRegistry();
- registry.register(new Scheme( "http" , PlainSocketFactory.getSocketFactory(), 80 ));
- registry.register(new Scheme( "https" , SSLSocketFactory.getSocketFactory(), 443 ));
- ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(httpParams, registry);
- httpclient = new DefaultHttpClient(connectionManager, httpParams);
- httpget = new HttpGet(srcUrl);
- //执行返回
- response = httpclient.execute(httpget);
- //如果是本机既当服务器,又当报表服务器,那么就只生成一遍
- String ipvalues = xmlPathDef.getRepUrl();
- if (CommonUtils.isNotNull(ipvalues)){
- if (ipvalues.indexOf( ":" ) != - 1 ){
- ipvalues = ipvalues.substring(0 ,ipvalues.lastIndexOf( ":" ));
- }
- }
- HttpEntity entity = response.getEntity();
- //获取保存后的路径
- projDoc = projectDocDao.findFileByType(userId,Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
- String filePath = "" ;
- if (projDoc != null )
- filePath = projDoc.getPath();
- if (CommonUtils.isNotNull(filePath)){
- String basepath = XmlPathDef.getBasePath();
- String outFilePath = (basepath + filePath).replaceAll("\\\\", " \\/");
- XmlPathDef.isExists(outFilePath);
- File wdFile = new File(outFilePath);
- out = new FileOutputStream(wdFile);
- int l;
- byte [] tmp = new byte [ 2048 ];
- while ((l = instream.read(tmp)) != - 1 ) {
- out.write(tmp, 0 , l);
- }
- out.flush();
- out.close();
- System.out.println("****************************** " );
- System.out.println("" );
- System.out.println("*************** 恭喜! 报告创建成功 结束 ***************" );
- System.out.println("" );
- }else {
- msg = "8" ; //说明word创建成功,但是数据没有保存成功
- response = null ;
- }
- }else {
- msg = "2" ;
- }
- } catch (ClientProtocolException e) {
- msg = "7" ;
- e.printStackTrace();
- } catch (IOException e) {
- msg = "7" ;
- logger.error("数据库报告服务器地址配置错误或网络不通!!2.连接是否超时" + e.getMessage());
- e.printStackTrace();
- }finally {
- if (out!= null ){
- try {
- out.close();
- } catch (IOException e) {
- msg = "7" ;
- logger.error("数据库报告服务器地址配置错误或网络不通!!2.连接是否超时" + e.getMessage());
- e.printStackTrace();
- }
- }
- }
- }
- long time2 = System.currentTimeMillis();
- long numTime = time2 - time1;
- if (docType.toString().equals(XmlPathDef.SPOTTEST_DOC) && docType.toString().equals(XmlPathDef.FTEST_DOC)){
- if (numTime >= 2401000 ){
- msg = "9" ;
- }
- }else {
- if (numTime >= 601000 ){
- msg = "9" ;
- }
- }
- System.out.println("" );
- String loggerinfo = "********* 报告类型为 :" + docType + " 执行时间为: " + (time2 - time1) / 1000 + " 秒!***************" ;
- System.out.println(loggerinfo);
- System.out.println("" );
- System.out.println("*****************************" );
- logger.info(loggerinfo);
- return msg;
- }
这个方法还有待优化和调整,现在我主要说明他的作用:
首先 使用了synchronized 关键字 意思说使用同步的方式,让每次只有一个线程运行这个方法(其实如果是大数量的并发,就不能这样写了,自己去摸索吧)。然后在方法体中,使用了一个 httpclient技术,这个主要是调用远程的服务返回对象流,在我这里就是调用另外一个服务器的代码,去生成报告,
然后 将word报告的流返回来就ok,如果不明白httpclient的用法,请上网学一下,具体我就不说了。(下节我会贴出相应的代码 )
最后 通过httpclient的返回流写成word文档就行了(其实里面还有一些判断什么的,比如:最后返回流是否是word流啊,什么的 都需要判断的,我都去掉了,代码太多),返回一个状态码给action就完毕。
发表评论
-
java如何终止线程
2012-04-24 21:38 1029对于线程的终止或者中断,由于java中Thread.stop方 ... -
ubuntu-11.10-server-i386学习笔记-网络基本配置
2012-04-23 22:11 9891. 静态IP地址配置 配置文件路径:/etc/networ ... -
ubuntu-11.10-server-i386学习笔记-Apache安装
2012-04-23 22:11 790第一步:先更新安装包缓存 1.1 sudo apt-get ... -
ubuntu-11.10-server-i386学习笔记-SVN版本服务器安装
2012-04-23 22:10 1030在安装SVN前,假设你的Apache已经安装好了。 ... -
ubuntu-11.10-server-i386学习笔记-SVN版本服务器-客户端测试
2012-04-23 22:10 703进入客户端测试之前,您应该确保svn服务器已经正确安装,如果您 ... -
svn服务器搭建经验总结
2012-04-23 22:09 944从最近几天的实验来看,svn(Subversion versi ... -
Java根据word模板生成word文档之后台解析和实现及部分代码(二)
2012-04-18 13:59 1861上一节贴出了web应用访问生成报告的action ... -
单例类、final、抽象类
2012-04-15 23:53 1613前些日子一直没写博客,因为病了,所以就耽误了,现在好点了 ... -
怎样在架构中合理的设置request中的Lcoale
2012-04-15 23:51 1201相信很多朋友在做J2EE国际化的时候,很可能遇到这个问题 ... -
一个Java时间工具类
2012-04-14 21:50 972主要包含了对时间操作的一些工具方法,仅供参考吧! ... -
POI Excel导出,我的又一个模板方法
2012-04-14 21:49 2752下面有源码,下载就可以用,如果因为包的问题,就拷贝我 ... -
Poi 读写Excel 合并ExcelSheet Struts2实现
2012-04-14 21:48 1445网上有许多人在找这样的例子,有多个Excel,要把他们合 ... -
POI读取Excel浅谈
2012-04-14 21:48 828先看代码,挨句解释: 一般遍历使用两种方式,1:得到总 ... -
struts2项目中静态html在firefox下乱码的解决
2012-04-13 00:03 937struts2 项目,通常开 ... -
黑马程序员——Java开发前奏
2012-04-12 23:59 778对于Java,我的一 ... -
《JAVA与模式》之单例模式
2012-04-12 23:58 726在阎宏博士的《JAVA与模式》一书中开头是这样描述单例模 ... -
Java中的String不再纠结
2012-04-12 23:58 1422又是新的一月,又是各种总结,先分享一下java中st ... -
swing绘制了一只直升机
2012-04-12 23:56 3375周末用swing绘制了一只直升机 对swing的的绘制技 ...
相关推荐
java XML解析方式实现自动生成word文档,文档中主要描述word模板的使用方法,文件中带有案例代码,可以方便理解
3.写java程序根据模板生成word 总结,之前在网上查到这个资料怎么调试都失败,后来经过反复查找发现是编码问题导致生成word格式错误,已经修正,希望能给大家带来帮助。 效率测试生成100000行数据大概4000毫秒...
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。 iText操作...
资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${user.userName} , 性别:${user.sex} 2、将word模板另存为xml...
先创建一个word文档,按照需求在word中填好一个模板,然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档(这里直接使用eclipse自带的编辑工具),把对应的数据换成变量${xxx},使用Freemarker读取...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
在Web应用中,有时需要按照固定的模板将数据导出到Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变,常见的方案有...
aspose.words 控件可以方便的出来word文档,通过在word模板中定义书签,可以在指定的位置插入内容,如果需要在word中插入表格,并且表格中含有多行行头,需要合并单元时,就稍微麻烦一些,必须要注意设置单元格的...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
1、使用freemaker对模板解析填充数据导出word文档的功能 2、实现使用itext对word转pdf功能 3、实现了对pdf加水印功能
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...