三、项目拓展
下面在前面的小项目中添加一个小功能,动态生成execl文件及下载,要用到apache的POI组件,这个包默认已经被spring加载
1、在UserService.java中添加方法
在它的实现类中实现
生产的临时文件test.xls在apache的bin目录中
2、在com.test.user.action中新建GenerateExcelAction.java
在structs.xml中添加action的声明
在applicationContext.xml中添加action的声明
在list.jsp中添加链接
好了这个功能已经完成了。
3、但是出现了一个问题:程序生成了一个中间文件,如果有一个连接在写这个文件,刚好又有另外一个连接在下载这个文件,这样就会产生冲突。解决方案有两个:1)、对于每一个连接都生成一个名字随机的中间文件,当连接结束及时删除这个中间文件。2)、直接把流输出到内存里,直接生成Inputstream传送客户端,这样就不会生成临时文件了,这种方法在第4点中介绍。
对于第一种方法,又有两种方式:自己写代码随机生成字符串或者借助第三方的库。自己写代码的话如下:
在项目中新建包com.test.util,在该包中新建CharacterUtils.java
将UserServiceImpl.java中test.xml生成的地方改为
要达到生成随机字符串的效果,也可用apache提供的包,实施如下:
将UserServiceImpl.java中test.xml生成的地方改为
下面删除这个临时文件,我们采用的方法是在文件生成好之后20分钟线程删除这个文件,并且每次服务器启动的时候在init()方法里检查apache的bin目录下是否有临时文件,如果有的话就删除掉。
在UserServiceImpl.java中加入
新建包com.test.servlet,在包中新建DeleteFileServlet.java,这个servlet用来在tomcat启动的时候删除apache的bin目录下的xls临时文件,所以用户不访问这个servlet,这个servlet只需要实现init()方法,而不需要doGet(),doPost(),也不需要servlet-mapping。
在web.xml中加入
4、好了现在来看第二种方式,不生成临时文件,直接使用流来输出。这样的话第3步全部不用做,直接在UserServiceImpl.java中
到此为止,系统已经全部完成。
附录:
整个笔记参照了[浪曦原创]Struts2.Hibernate3.2.Spring2.0整合(风中叶),这是一个很好的视频教程,适合快速了解SSH
项目源码http://www.kuaipan.cn/file/id_3287587011724175.html