JBuilder2005 Servlet开发之下载型

ZDNet软件频道 时间:2008-06-29 作者: | 中国IT实验室 我要评论()
本文关键词:Servlet JBuilder JSP
 在这节里,我们对welcome.jsp页面进行改造,在页面中添加一个链接,这个链接调用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 javax.Servlet.*;
  3. import javax.Servlet.http.*;
  4. import java.io.*;
  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. < contentType="text/html; charset=GBK"%>
  2. < 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应用服务器下载到本地的硬盘中。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134