JBuilder2005Servlet開發之下載型
在這節里,我們對welcome.jsp頁面進行改造,在頁面中添加一個鏈接,這個鏈接調用Servlet下載上節所記錄的系統日志文件。
通過向導創建ExcelFileServlet
1、File->New...->Web->雙擊Standard Servlet圖標,啟動創建標準Servlet的向導。
指定Servlet類名為ExcelFileServlet,將包名設為bookstore.servlet,按Next到下一步。
2、選擇覆蓋doGet()處理方法。
·Servlet:creates content type:unspecified,設定Servlet的生成文檔的類型,由于這個Servlet作為一個Excel文件并以附件的形式下載,需要我們手工設定Servlet的響應內容類型。
·implements methods:doGet(),這樣向導將生成一個doGet()方法框架。
按Next到下一步。
3、定義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
第17'35行的doGet()方法是ExcelFileServlet的主體部分,其中第20'32是獲取URL參數的代碼。
在web.xml中將生成對應這個Servlet的部署描述信息,如下所示:
代碼清單 9 ExcelFileServlet的部署描述配置信息
下載日志文件代碼
在這一小節里,我們需要更改Servlet的doGet()方法,指定響應的格式并從日志目錄中讀取相應的日志文件內容寫到Servlet的輸出流中。
由于文件內容以二進制流形式輸出,Servlet向導在代碼清單 8第33行所生成代碼:
PrintWriter out = response.getWriter();是多余的,我們將其刪除。加入以下粗體的代碼:
代碼清單 10 下載日志文件代碼
第32行通過URL參數的值得到日志文件名,34'36行指定響應頭信息,以便客戶端以彈出對話框的形式下載日志文件,38'49行將日志文件的內容寫到響應輸出流中。
改造welcome.jsp
至此,下載日志文件的Servlet已經開發完畢,現在,我們需要在welcome.jsp頁面中添加一個訪問ExcelFileServlet的鏈接。
在welcome.jsp中添加以下粗體的代碼,如下所示:
代碼清單 11 添加下載日志鏈接后的welcome.jsp
為了簡單起見,年份和月份的URL參數使用固定的值,在實際應用場合,這兩個數據可能來自于網頁表單的數據組件。
啟動Web應用程序,正確登錄后,轉到welcome.jsp頁面,頁面效果如下所示:
點擊下載系統日志后,將彈出一個文件下載的對話框,如下圖所示:
點擊保存按鈕,即可以將日志文件從Web應用服務器下載到本地的硬盤中。
通過向導創建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. <%@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應用服務器下載到本地的硬盤中。



