JSF实现在动态表格中下载文件(支持中文文件名)
笔者在最近的项目中遇到动态表格中下载文件的问题,以下是测试的小例子,支持下载中文名的文件.
一 页面test.jsp
1
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
2
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
3
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
4
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
5
<html>
6
<head>
7
<title>文件列示</title>
8
</head>
9
<body>
10
<f:view>
11
<h:form>
12
<t:panelGrid>
13![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
<t:panelGroup>
15
<!-- this is table -->
16
<t:dataTable id="data" value="#{fileBean.contentList}" var="result" border="1" width="100%" rows="10">
17![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
<t:column rendered="true">
19
<f:facet name="header">
20
<t:outputText value="编号" />
21
</f:facet>
22
<t:outputText value="#{result.number}" />
23
</t:column>
24![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
<t:column rendered="true">
26
<f:facet name="header">
27
<t:outputText value="名称" />
28
</f:facet>
29
<t:outputText value="#{result.name}" />
30
</t:column>
31![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
32
<t:column rendered="true">
33
<f:facet name="header">
34
<t:outputText value="大小" />
35
</f:facet>
36
<t:outputText value="#{result.size}" />
37
</t:column>
38![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
39
<t:column rendered="true">
40
<f:facet name="header">
41
<t:outputText value="操作" />
42
</f:facet>
43
<t:commandButton value="下載" actionListener="#{fileBean.downloadFile}" />
44
</t:column>
45
</t:dataTable>
46
47
</t:panelGroup>
48
</t:panelGrid>
49
</h:form>
50
</f:view>
51
</body>
52
</html>
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
二 MyFile.java
1
package com.jakin;
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
public class MyFile {
4
private String number;
5
private String name;
6
private String size;
7![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
public MyFile(String number, String name, String size) {
9
super();
10
this.number = number;
11
this.name = name;
12
this.size = size;
13
}
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
public String getNumber() {
16
return number;
17
}
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
public void setNumber(String number) {
20
this.number = number;
21
}
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
public String getName() {
24
return name;
25
}
26![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
public void setName(String name) {
28
this.name = name;
29
}
30![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
public String getSize() {
32
return size;
33
}
34![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
public void setSize(String size) {
36
this.size = size;
37
}
38
}
39![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
三,JSF中的bean:FileBean
1
package com.jakin;
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
import java.io.File;
4
import java.io.FileInputStream;
5
import java.io.IOException;
6
import java.util.ArrayList;
7
import java.util.List;
8![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
import javax.faces.component.UIColumn;
10
import javax.faces.component.UIComponent;
11
import javax.faces.component.html.HtmlDataTable;
12
import javax.faces.context.FacesContext;
13
import javax.faces.event.ActionEvent;
14
import javax.servlet.ServletOutputStream;
15
import javax.servlet.http.HttpServletResponse;
16![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
public class FileBean {
18
private List<MyFile> contentList; // 存放文件的集合
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
public List<MyFile> getContentList() {
21
contentList = new ArrayList<MyFile>();
22
for (int i = 0; i < 5; i++) {
23
MyFile myFile = new MyFile(i + "", i + ".txt", "100K");
24
contentList.add(myFile);
25
}
26
return contentList;
27
}
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
public void setContentList(List<MyFile> contentList) {
30
this.contentList = contentList;
31
}
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
public void downloadFile(ActionEvent e) {
34
UIComponent component = (UIComponent) e.getSource();
35
UIColumn column = (UIColumn) component.getParent();
36
HtmlDataTable dataTable = (HtmlDataTable) column.getParent();
37
int listIndex = dataTable.getRowIndex();
38
MyFile myFile = (MyFile) contentList.get(listIndex);
39
String name = myFile.getName();
40
// String name = "轻松搞定XML.pdf";
41![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
try {
43
File file = new File("D:\\project\\UploadFile\\" + name);
44
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
45
.getCurrentInstance().getExternalContext().getResponse();
46
ServletOutputStream servletOutputStream = httpServletResponse
47
.getOutputStream();
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
name = java.net.URLEncoder.encode(name, "UTF-8");
50
httpServletResponse.setHeader("Content-disposition",
51
"attachment; filename=\"" + name + "\"");
52
httpServletResponse.setContentLength((int) file.length());
53
httpServletResponse
54
.setContentType("application/x-download;charset=UTF-8");
55![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
byte[] b = new byte[1024];
57
int i = 0;
58
FileInputStream fis = new java.io.FileInputStream(file);
59
while ((i = fis.read(b)) > 0) {
60
servletOutputStream.write(b, 0, i);
61
}
62
} catch (IOException ioe) {
63
ioe.printStackTrace();
64
}
65
FacesContext.getCurrentInstance().responseComplete();
66
}
67![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
68
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
55
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
58
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
60
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
62
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
63
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
64
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
65
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
66
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
68
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)