【Jsp】把Java写到Respond输出流里面供用户下载

把Java中的内容输出到文件大家都会了,输入输出流是每一个Java程序猿的必须课。在《【Java】打印流与缓冲区读者完成输入与输出到文件操作》(点击打开链接)与《【Java】输入与输出与JDK1.5之后的新型字符串StringBuilder》(点击打开链接)之中,我都说过这个问题。但是在Jsp上,怎么把Java内容直接把文件写到网页上给用户下载呢?一般一些导出功能实现,就需要这样弄。

具体如下图:

【Jsp】把Java写到Respond输出流里面供用户下载_第1张图片

用户访问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();
	}
}


你可能感兴趣的:(jsp,下载,导出,输出流,respond)