仅仅是做一个导出,我都没想到做了这么多东西
背景:公司的系统中做导出都是在页面中做的,在javascript中通过ActiveXObject.得到一个excel对象,然后将页面中的数据一格一格的往里面写.以前数据是在前台分页,数据全查出来然后在页面控制显示,这样导出没什么问题.但现在因为一到结算的时候查询的数据量太大了,运营的就抱怨了,说我们是吃资源的大老虎,要我们做优化,那就做后台分页吧,一次只从数据库中查几十条数据,那导出就出现问题了,只能导出当前页的那几十条,要想全部导出就要挨个翻页再挨个点导出.所以BOSS发话了,要改!点一次就将全部数据导出,这个要求不过份,不过仔细想想,也没那么容易.要导出全部,页面上只有那几十条,其他的数据从哪里来,只能从数据库中查,而查又不能一次全部查出,否则不就又回到前台分页时的问题了吗?那就分批,先查个几百条数据,写到excel中,再查几百条,再写,直到写完.而且写入excel的工作还要交给客户端来做,以减轻服务器的压力.
方案:用for循环来控制,每次查询一定量的数据,得到数据后先写到EXCEL中,写完再发出下一个查询请求,而请求要通过xmlhttp来发,这样查询结果以流的方式返回,而不用刷新页面.
很简单吧,但实际开发时遇到很多问题,首先是用xmlhttp发请求和接收响应时的乱码问题,然后是系统现有框架不能舒服的让我得到可以在客户端解析的固定格式的数据,所以我就只有用servlet,用servlet又要自己写激发器Invoker来分发请求.在读取配置文件时,又遇到使用ear包部署,不能使用getRealPath和getResource来取得路径的问题.好在都一一解决了.不过有些问题还解决得莫名其妙.
哈哈哈,回过头再看吧,最好是有高手指定一下.不知道LMT的大家现在怎么样,你们要有时间一定要来给我兆几脚.今天就这样咯,明天再把具体的东西写一下.亲爱的,我睡了