jsp导出Excel(续)

上篇的导出Excel中我用到了JavaBean,但是有时候我不想用bean,想把bean移植到jsp当中来,因为原理都是一样的,jsp最终也会被编译成servlet的。于是我就对原来的代码进行移植,刚开始的代码如下所示:

exporting.jsp:刚开始的代码

<%@ page contentType="text/html;charset=utf-8" %>

<%@ page import="com.cicro.cws.database.DBManager" %>

<%@ page import="com.cicro.cws.parameter.*" %>

<%@ page import="com.cicro.common.util.*" %>

<%@ page import="java.util.*" %>

<%@ page import="jxl.*"%>

<%@ page import="jxl.write.*"%>

<%@ page import="java.io.*"%>

<%

String year=request.getParameter("year");

String sql="select name,gender,birth,id,unit,address,phone,result,year from check_base_info where year='"+year+"'";

String[][] resultList = DBManager.getStringArray("mysql", sql);

if(resultList!=null && !"".equals(resultList)){

    String title[]={"姓名","性别","出生日期","身份证号","工作单位","通信地址","联系电话","年审结果","年审年份"};

       //out.println(sql);

    response.reset();

    response.setContentType("application/vnd.ms-excel");

       try{

           WritableWorkbook workbook=Workbook.createWorkbook(response.getOutputStream());//创建工作薄

              WritableSheet worksheet=workbook.createSheet("record",0);//创建第一个工作表,name:工作表名称

        Label label=null;//用于写入文本内容到工作表中去

        String value="";

      

        //开始写入第一行,即标题栏

        for(int i=0;i<title.length;i++){

            label=new Label(i,0,title[i]);//参数依次代表列数、行数、内容

            worksheet.addCell(label);//写入单元格

        }

 

        //开始写入内容

        for(int i=0;i<resultList.length;i++){

        //获取一条记录

            for(int j=0;j<resultList[i].length;j++){

                value=resultList[i][j];

                   label=new Label(j,i+1,value);

                   worksheet.addCell(label);

            }                      

        }                          

 

        workbook.write();

        workbook.close();

       }

       catch(Exception e){

           e.printStackTrace();

    }         

}

else{out.println("没有记录");}

%>

注:DBManager.getStringArray("mysql", sql)方法是我已经封装好的了一个方法,其作用就是以二维数组的形式返回查询结果。

因为是给第三方做开发,所用的web serverapache+tomcat,是那边公司已经做好了的一套软件,公司名字叫做时光软件公司,不知道大家听说没有。这个东西很郁闷的地方就是只要jsp页面有错误,那么调用这个页面时就会死在那里,并且没有出错信息,相当不好调试。很不幸的是,我调用exporting.jsp的时候页面死了,这说明该页面有错误。于是我只能“悲壮”地用最原始的排除法来寻找错误所在地,最终,让我发现问题出在

response.getOutputStream()这句上面,只要有这句,页面就会死掉,我就纳闷了,这句话之前不是用的好好的么,怎么这次就不行了呢?

于是我以response.getOutputStream()为关键字baidu,在浏览了众多的帖子之后总算找到了问题的所在:response.getOutputStream()只能被调用一次!不过我确实只调用了一次,但为什么还是有错呢?这都是源于这个非常bt的原因:

<%@ page contentType="text/html;charset=utf-8" %>

<%@ page import="com.cicro.cws.database.DBManager" %>

<%@ page import="com.cicro.cws.parameter.*" %>

<%@ page import="com.cicro.common.util.*" %>

<%@ page import="java.util.*" %>

<%@ page import="jxl.*"%>

<%@ page import="jxl.write.*"%>

<%@ page import="java.io.*"%>

所有的<%.................%>都要连着写,不能回车换行,即%><%要连在一起,最后正确的jsp文件的开始应该是这样:

<%@ page contentType="text/html;charset=utf-8" %><%@ page import="com.cicro.cws.database.DBManager" %><%@ page import="com.cicro.cws.parameter.*" %><%@ page import="com.cicro.common.util.*" %><%@ page import="java.util.*" %><%@ page import="jxl.*"%><%@ page import="jxl.write.*"%><%@ page import="java.io.*"%><% 

我的代码

%>

在做了这样的修改之后,程序就运行正常了,:)。

为什么会这样呢?

大家可以查看一下tomcat下面的work目录,看一下jsp被编译之后产生的servlet代码,我们会发现,只要出现了换行,就会出现如下的代码:

out = pageContext.getOut();
      _jspx_out = out;

      out.write("/r/n");//出现一次换行,就会出现该语句一次

    而这个out.write(“”)会和response.getOutputStream()发生冲突,因此页面就会错误而死在那里了,这个是我遇到的最bt的错误了,:(。

注:在这种情况下,页面中最好也不要出现任何的html标签了,否则会得不到正确的输出了,不过最好是不用用response.getOutputStream()

另外,哪位大哥知道在apache+tomcat下如何快速的调试jsp代码,不妨告诉一下,^_^

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值