把Java中的內容輸出到文件大家都會了,輸入輸出流是每一個Java程序猿的必須課。在《【Java】打印流與緩沖區讀者完成輸入與輸出到文件操作》(點擊打開鏈接)與《【Java】輸入與輸出與JDK1.5之後的新型字符串StringBuilder》(點擊打開鏈接)之中,我都說過這個問題。但是在Jsp上,怎麼把Java內容直接把文件寫到網頁上給用戶下載呢?一般一些導出功能實現,就需要這樣弄。
具體如下圖:
用戶訪問download這個Servlet,就直接提供一個“中文是沒有問題.txt”的文件給用戶下載。裡面的內容是在Java中直接寫到Respond輸出流的,在服務器上根本沒有這個文件。中文是沒有問題.txt中的“呵呵”是在用戶訪問download這個Servlet才構造出來的。
你可以寫如下的Servlet,無須任何插件,構造一個Respond輸出流給打印流PrintWriter打印內容就行了。
其余什麼插件輸出到文件同理,你可以改一改它的write方法就OK了。
以下的Servlet采用了Servlet3.0寫法,指明此Servlet的訪問地址是/download,測試是不要寫成localhost:8080/工程名/download/,這樣是不行的,後面沒有斜槓,service方法是原來doPost與doGet方法的集合,一般不這樣寫:
import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @SuppressWarnings("serial") @WebServlet(name = "download", urlPatterns = { "/download" }) public class download extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //在SSH框架中,可以通過HttpServletResponse response=ServletActionContext.getResponse();取出Respond對象 //清空一下response對象,否則出現緩存什麼的 response.reset(); //指明這是一個下載的respond response.setContentType("application/x-download"); //這裡是提供給用戶默認的文件名 String filename = "中文是沒有問題的.txt"; //雙重解碼、防止亂碼 filename = URLEncoder.encode(filename,"UTF-8"); response.setCharacterEncoding("UTF-8"); response.addHeader("Content-Disposition","attachment;filename=" + filename); /* * 這裡是最關鍵的一步。 * 直接把這個東西寫到response輸出流裡面,給用戶下載。 * 如果輸出到c:\b.txt就是: * PrintWriter printwriter = new PrintWriter(new FileWriter("c:\\b.txt",true)); * 現在寫好respond頭,就寫成: * PrintWriter printwriter = new PrintWriter(response.getOutputStream()); * 把PrintWriter的輸出點改一下 */ PrintWriter printwriter = new PrintWriter(response.getOutputStream()); printwriter.println("呵呵!"); //打印流的所有輸出內容,必須關閉這個打印流才有效 printwriter.close(); } }