把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();
}
}