servlet|下载
在这节里,我们对welcome.jsp页面进行改造,在页面中添加一个链接,这个链接调用Servlet下载上节所记录的系统日志文件。
通过向导创建ExcelFileServlet
1、File->New...->Web->双击Standard Servlet图标,启动创建标准Servlet的向导。
指定Servlet类名为ExcelFileServlet,将包名设为bookstore.servlet,按Next到下一步。
2、选择覆盖doGet()处理方法。
图 11 覆盖Servlet方法 |
·Servlet:creates content type:unspecified,设定Servlet的生成文档的类型,由于这个Servlet作为一个Excel文件并以附件的形式下载,需要我们手工设定Servlet的响应内容类型。
·implements methods:doGet(),这样向导将生成一个doGet()方法框架。
按Next到下一步。
3、定义Servlet的URL参数。
图 12 定义Servlet的URL参数 |
点击Add Parameter在参数列表出现一个新行,在新行中定义Servlet的URL参数,其中Name为URL所带的参数名,而Variable为Servlet中对应的变量名,此外还可以通过Desc和Default为变量指定注释和默认值,在Type栏中指定变量的类型。
我们定义了两个URL参数,分别是year和month,指定需要下载日志的年份和月份。按Next到下一步。
4.指定servlet的访问路径
接受第4步向导所设定的Servlet的名字和访问路径,它们分别是:
·Name:excelfileservlet
·URL pattern:/excelfileservlet
直接按Finish创建ExcelFileServlet,其代码如下所示:
代码清单 8 ExcelFileServlet.java
1. package bookstore.servlet; 2. import .servlet.*; 3. import javax.servlet.*; 4. import .*; 5. import java.util.*; 6. 7. public class ExcelFileServlet 8. extends HttpServlet 9. { 10. //Initialize global variables 11. public void init() 12. throws ServletException 13. { 14. } 15. 16. //Process the HTTP Get request 17. public void doGet(HttpServletRequest request, HttpServletResponse response) 18. throws ServletException, IOException 19. { 20. //年份 21. String year = request.getParameter("year"); 22. if (year == null) 23. { 24. year = "2005"; 25. } 26. 27. //月份 28. String month = request.getParameter("month"); 29. if (month == null) 30. { 31. month = "1"; 32. } 33. PrintWriter out = response.getWriter(); 34. //todo implement GET 35. } 36. 37. //Clean up resources 38. public void destroy() 39. { 40. } 41. } |
第17~35行的doGet()方法是ExcelFileServlet的主体部分,其中第20~32是获取URL参数的代码。
在web.xml中将生成对应这个Servlet的部署描述信息,如下所示:
代码清单 9 ExcelFileServlet的部署描述配置信息
1. <web-app> 2. … 3. <servlet> 4. <servlet-name>excelfileservlet</servlet-name> 5. <servlet-class>bookstore.servlet.ExcelFileServlet</servlet-class> 6. </servlet> 7. <servlet-mapping> 8. <servlet-name>excelfileservlet</servlet-name> 9. <url-pattern>/excelfileservlet</url-pattern> 10. </servlet-mapping> 11. … 12. </web-app> |
下载日志文件代码
在这一小节里,我们需要更改Servlet的doGet()方法,指定响应的格式并从日志目录中读取相应的日志文件内容写到Servlet的输出流中。
由于文件内容以二进制流形式输出,Servlet向导在代码清单 8第33行所生成代码:
PrintWriter out = response.getWriter();是多余的,我们将其删除。加入以下粗体的代码:
代码清单 10 下载日志文件代码
1. package bookstore.servlet; 2. import javax.servlet.*; 3. import javax.servlet.http.*; 4. import java.io.*; 5. 6. public class ExcelFileServlet 7. extends HttpServlet 8. { 9. … 10. public void doGet(HttpServletRequest request, HttpServletResponse response) 11. throws ServletException, IOException 12. { 13. //年份 14. int year; 15. try 16. { 17. year = Integer.parseInt(request.getParameter("year")); 18. } catch (NumberFormatException e) 19. { 20. year = 2005; 21. } 22. 23. //月份 24. int month; 25. try 26. { 27. month = Integer.parseInt(request.getParameter("month")); 28. } catch (NumberFormatException e) 29. { 30. month = 1; 31. } 32. String fileName = "log_" + year + "_" + month +".xls"; 33. File file = new File("D:\\serverLog\\"+fileName); 34. response.setContentType("application/x-msdownload"); 35. response.setContentLength( (int) file.length()); 36. response.setHeader("Content-Disposition", "attachment;filename="+fileName); 37. 38. FileInputStream fis = new FileInputStream(file); 39. BufferedInputStream fbis = new BufferedInputStream(fis); 40. byte abyte0[] = new byte[1024]; 41. int k = 0; 42. OutputStream out = response.getOutputStream(); 43. while ( (long) k < file.length()) 44. { 45. int j = fbis.read(abyte0, 0, 1024); 46. k += j; 47. out.write(abyte0, 0, j); 48. } 49. out.flush(); 50. } 51. … 52. } |
第32行通过URL参数的值得到日志文件名,34~36行指定响应头信息,以便客户端以弹出对话框的形式下载日志文件,38~49行将日志文件的内容写到响应输出流中。
改造welcome.jsp
至此,下载日志文件的Servlet已经开发完毕,现在,我们需要在welcome.jsp页面中添加一个访问ExcelFileServlet的链接。
在welcome.jsp中添加以下粗体的代码,如下所示:
代码清单 11 添加下载日志链接后的welcome.jsp
1. <%page contentType="text/html; charset=GBK"%> 2. <%taglib uri="http://jakarta.apache.org/taglibs/datetime-1.0" prefix="dt"%> 3. … 4. 现在的时间是<dt:format pattern="MM/dd/yyyy hh:mm"><dt:currentTime/></dt:format> 5. <br><a href="/webModule/excelfileservlet?year=2005&month=1">下载系统启动日志</a> 6. <br>点击<a href="quit.jsp">这里</a>退出系统 7. </body> 8. </html> |
为了简单起见,年份和月份的URL参数使用固定的值,在实际应用场合,这两个数据可能来自于网页表单的数据组件。
启动Web应用程序,正确登录后,转到welcome.jsp页面,页面效果如下所示:
图 13 附件下载日志链接的welcome.jsp页面 |
点击下载系统日志后,将弹出一个文件下载的对话框,如下图所示:
图 14 下载系统日志文件对话框 |
点击保存按钮,即可以将日志文件从Web应用服务器下载到本地的硬盘中。