基于Struts2的stream_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 基于Struts2的stream

基于Struts2的stream

 2011/10/18 6:10:49  hbxflihua  http://hbxflihua.iteye.com  我要评论(0)
  • 摘要:最近的一个项目中有涉及到将页面内容导出到WORD的需求。实现方式可以从两个角度去考虑,一种是基于javascript技术,再有就是通过java技术。首先说说基于前台的实现。刚开始,出于简单的考虑,我准备在前台jsp处理。其中有两种实现方式。一种是纯javascript的,另一种是通过在jsp中嵌入java代码实现。javascript的实现要考虑到浏览器的兼容性,所以暂时不想通过js来进行控制。当然,如果有前端的js框架封装如jQuery的封装,这样做起来就简单多了
  • 标签:struts
    最近的一个项目中有涉及到将页面内容导出到WORD的需求。实现方式可以从两个角度去考虑,一种是基于javascript技术,再有就是通过java技术。
     首先说说基于前台的实现。
     刚开始,出于简单的考虑,我准备在前台jsp处理。其中有两种实现方式。一种是纯javascript的,另一种是通过在jsp中嵌入java代码实现。javascript的实现要考虑到浏览器的兼容性,所以暂时不想通过js来进行控制。当然,如果有前端的js框架封装如jQuery的封装,这样做起来就简单多了。网上没找到js框架实现的资料。javascript的实现倒是有一种,不过只是基于IE的,代码如下:
     //指定页面区域内容导入Word  
function exportAreaToDoc()  
{  
var oWD = new ActiveXObject("Word.Application");  
var oDC = oWD.Documents.Add("",0,1);  
var orange =oDC.Range(0,1);  
var sel = document.body.createTextRange();  
sel.moveToElementText(body);  
sel.select();  
sel.execCommand("Copy");  
orange.Paste();  
oWD.Application.Visible = true;  
//window.close();  
}  
 
     从中我们可以看出,导出是基于IE的一个控件,所以很难实现兼容,考虑兼容性恐怕要写很多的js代码。如果有js框架的封装,这事情就变得简单多了。当然,还有一点需要特别注意,这段代码在静态页面中是可以运行的,如果将代码放在tomcat等部署的项目中时,会抛出js异常,详见我的上一篇文章。
     在前台jsp页面的第二种实现是基于java代码的,具体代码如下:
     <%@ page contentType="application/msword; charset=GBK" %> 
    <%   
        response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode("idea.doc", "GBK"));    
    %>

     这个恐怕就更简单了。熟悉jsp的人都知道,jsp内容的编译过程是先对java代码进行编译(这里当然也包括框架标签如el,jstl,struts标签等),然后是js代码,最后页面静态标签。如果页面比较功能比较单纯,即不会在页面做其他特别的处理,使用该方法再好不过了。但需要注意的时,如果你的页面内容是用js动态添加(生成)的,则这种方式行不通,这主要是刚才提到的jsp内容编译的机制引起的。
     而我的导出页面涉及到其他的一些功能,比如新增,编辑等操作,所以一旦添加上这段java代码,整个页面就不能重用了。所以,我又用了一种处理方式,就是在点击 ‘导出’按钮的时候,弹出一个页面,在弹出的页面中动态的添加文本内容,然后导出到word。当是忽略了jsp页面内容的编译机制,最后不得不放弃这种方案。
     以下是基于后台的实现方案。即使用java代码以流的形式输出到前台,这里就不用考虑该死的浏览器兼容性问题了。
     其实后台的实现也可以从两个方面着手,一种纯手工实现,另一种当然是基于框架了。java中生成doc的框架有很多,比如POI,itxt,java2doc,struts2等等。各种框架都做了很好的封装,我在这里就不一一详细说明了,有兴趣的朋友可以自己上网查查。
     我的需求其实蛮简单,将前台的页面输出内容以流的形式导出到word中。这里会遇到一些问题。比如,图片的处理,html页面标签的显示等问题。我的需求中没有关于图片的输出,所以这个问题就不用去考虑了,倒是页面标签的处理问题一直是令人头痛的问题。页面常用的标签如input,textarea在word文档中都不能很好的显示。
     以下是代码的实现:
     1.在action中
private String fileName;//文件名
private InputStream istream;
getter,setter……
@Override
public String execute() throws Exception {

String expinfo=request.getParameter("expinfo");
if(!ValidateUtil.validateString(expinfo)){
return null;
}
String result=correctExpInfo(expinfo);
istream=new ByteArrayInputStream(result.getBytes(), 0, result.length());
return SUCCESS;
}


     2.struts.xml配置
     <action name="rwexp"  class="*.RwexpAction">
       <result type="stream">
         <param name="contentType">
             application/vnd.ms-word;charset=UTF-8
         </param>  
         <param name="inputName">
             istream
         </param>                  
         <param name="contentDisposition">
              filename=${fileName}
         </param>
         <param name="bufferSize">
              1024
         </param>
        </result>
     </action>


     当然这里,也可以定义以excel,txt,pdf,img等以流的形式输出的文件.具体都没有太大的区别。pdf,img的输出稍显麻烦些。
    
     3.页面中的处理
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>导出WORD</title>
<script type="text/javascript"
src="${root}/js/jquery/jquery-1.4.4.min.js">
</script>
<script type="text/javascript">

$(function(){
var exp=window.opener.$("#p_body").html();
$('#exp_body').append(exp);
exp=exp.replace(/\TEXTAREA/g,'label').replace(/\INPUT/g,'label');//将textarea,input转换成label,便于生成word
$('#expinfo').val(exp);
});
</script>

</head>

<body id="exp_body" style="background-color:#fff" >
<form action="${root}/jxEval/rwexp.action" name="expform" id="expform" method="post">
<textarea name="expinfo" id="expinfo" style="display: none;" ></textarea>
<input type="submit"" value="导出WORD" title="导出WORD" />
</form>
</body>
</html>

原创首发,转载请注明出处。
发表评论
用户名: 匿名