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