JSF: 1.2
服务器: WebLogic
我正在尝试实现多个文件上传。因为我需要支持 IE7,所以我不能使用 HTML5 输入文件。所以我计划添加一个按钮,点击它会在页面中添加一个输入文件。
我首先开始使用 ADF Faces。但这没有用。那是在以意想不到的方式表现。
我也尝试过 Tomahawk 的文件上传组件,但问题在于该组件在从后端添加新文件上传后,之前创建的文件上传字段为空;不是UploadedFile
实例。但这不符合我的要求。因为我需要显示文件上传器中的所有路径,直到单击最终的提交表单按钮。
然后我求助于 apache commons fileupload。
我已经用纯 JSP 和 apaches 文件上传试过这个,效果很好。
但是我想用带有 apaches fileupload 的 JSF 来实现它,当我尝试这样做时,它开始引起问题。
jspx页面如下:
<?xml version='1.0' encoding='utf-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<jsp:output omit-xml-declaration="true" doctype-root-element="HTML"
doctype-system="http://www.w3.org/TR/html4/loose.dtd"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
<jsp:directive.page contentType="text/html;charset=utf-8"/>
<f:view>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8"/>
<title>home</title>
</head>
<body>
<h:form enctype="multipart/form-data">
<input type="file" name="file"/>
<h:commandButton value="Upload" action="#{uploadBean.upload}" />
</h:form>
</body>
</html>
</f:view>
</jsp:root>
我创建了一个过滤器,因为我无法从action
事件中获得正确的多部分请求。
web.xml 是:
<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<filter>
<filter-name>UploadFilter</filter-name>
<filter-class>com.edfx.massupload.filter.UploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UploadFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/home.jspx</welcome-file>
</welcome-file-list>
</web-app>
上传过滤器:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadFilter implements Filter {
private FilterConfig _filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
_filterConfig = filterConfig;
}
public void destroy() {
_filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Filter");
if (!(request instanceof HttpServletRequest)) {
chain.doFilter(request, response);
return;
}
HttpServletRequest httpRequest = (HttpServletRequest)request;
boolean isMultipartContent = ServletFileUpload.isMultipartContent(httpRequest);
if (!isMultipartContent) {
chain.doFilter(request, response);
return;
}
long maxFileSize = (1024 * 1024 * 1024);
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(maxFileSize);
upload.setFileSizeMax(maxFileSize);
try {
List<FileItem> items = upload.parseRequest(httpRequest);
System.out.println(items.size());
List<FileItem> files = new ArrayList<FileItem>();
for (FileItem item : items) {
if (!item.isFormField()) {
files.add(item);
}
}
httpRequest.setAttribute("files", files);
} catch (FileUploadException ex) {
ex.printStackTrace();
}
chain.doFilter(request, response);
}
}
最后是托管bean:
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
public class UploadBean {
public UploadBean() {
super();
}
public String upload() {
System.out.println("====JYM");
HttpServletRequest httpRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
System.out.println(httpRequest.getAttribute("files"));
return "";
}
}
我的目标是通过 JavaScript 或 jQuery 动态添加输入文件字段,这在 JSP 中运行良好,我想在 JSF 中得到它。
如果我enctype="multipart/form-data"
从 中删除,h:form
则操作方法正在执行,否则不会。
任何建议都会对我很有帮助。