为此最好使用 Servlet。原始 Java 代码不属于 JSP 文件,这只是维修麻烦 https://stackoverflow.com/questions/3177733/howto-avoid-java-code-in-jsp-files/3180202#3180202.
首先,创建一个简单的 Java 实用程序类,例如List<List<T>>
or a List<Data>
(其中Data
代表一行)代表 CSV 内容和OutputStream
作为方法参数并编写执行数据复制任务的逻辑。
一旦你开始工作,创建一个 Servlet 类,它接受一些 CSV 文件标识符作为请求参数或路径信息(我建议使用路径信息,因为雷蒙德团队开发的某个 Web 浏览器将无法检测文件名/mimetype),使用标识符来获取List<List<T>>
or List<Data>
从某处并将其写入OutputStream
of the HttpServletResponse
以及一组正确的响应标头。
这是一个基本的启动示例:
public static <T> void writeCsv (List<List<T>> csv, char separator, OutputStream output) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));
for (List<T> row : csv) {
for (Iterator<T> iter = row.iterator(); iter.hasNext();) {
String field = String.valueOf(iter.next()).replace("\"", "\"\"");
if (field.indexOf(separator) > -1 || field.indexOf('"') > -1) {
field = '"' + field + '"';
}
writer.append(field);
if (iter.hasNext()) {
writer.append(separator);
}
}
writer.newLine();
}
writer.flush();
}
以下是如何使用它的示例:
public static void main(String[] args) throws IOException {
List<List<String>> csv = new ArrayList<List<String>>();
csv.add(Arrays.asList("field1", "field2", "field3"));
csv.add(Arrays.asList("field1,", "field2", "fie\"ld3"));
csv.add(Arrays.asList("\"field1\"", ",field2,", ",\",\",\""));
writeCsv(csv, ';', System.out);
}
在 Servlet 中,您基本上可以执行以下操作:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getPathInfo();
List<List<Object>> csv = someDAO().list();
response.setHeader("content-type", "text/csv");
response.setHeader("content-disposition", "attachment;filename=\"" + filename + "\"");
writeCsv(csv, ',', response.getOutputStream());
}
将此 servlet 映射到类似的东西上/csv/*
并将其调用为类似的东西http://example.com/context/csv/filename.csv
。基本上就是这样。路径信息中的文件名很重要,因为雷蒙德的一个团队开发的某个网络浏览器会忽略filename
的一部分Content-Disposition
header 并使用 URL 的最后一个路径部分。