JSF 1.2之前还可以用MyFaces的组件,2.0还是个新玩意,只能靠自己。
开始的想法是自己做一个上传文件组件,组件中封装<input type="file" />,然后用commons-fileupload解析ServletRequest。
import org.apache.commons.fileupload.*;
import javax.faces.context.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@FacesComponent("uploadFile.UIUpload")
public class UIUpload extends UIInput {
public UIUpload() {
this.setRendererType(null);
}
@Override
public void encodeBegin(FacesContext fc) throws IOException {
ResponseWriter rw = fc.getResponseWriter();
String clientId = this.getClientId(fc);
rw.startElement("input", this);
rw.writeAttribute("type", "file", null);
rw.writeAttribute("name", clientId + ".file", null);
rw.endElement("input");
}
@Override
public void decode(FacesContext fc) {
ExternalContext external = fc.getExternalContext();
HttpServletRequest request = (HttpServletRequest) external.getRequest();
String clientId = getClientId(fc);
if(ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List fileItems = upload.parseRequest(request);
//......
} catch (FileUploadException ex) {
//......
}
}
}
}
import javax.faces.context.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@FacesComponent("uploadFile.UIUpload")
public class UIUpload extends UIInput {
public UIUpload() {
this.setRendererType(null);
}
@Override
public void encodeBegin(FacesContext fc) throws IOException {
ResponseWriter rw = fc.getResponseWriter();
String clientId = this.getClientId(fc);
rw.startElement("input", this);
rw.writeAttribute("type", "file", null);
rw.writeAttribute("name", clientId + ".file", null);
rw.endElement("input");
}
@Override
public void decode(FacesContext fc) {
ExternalContext external = fc.getExternalContext();
HttpServletRequest request = (HttpServletRequest) external.getRequest();
String clientId = getClientId(fc);
if(ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List fileItems = upload.parseRequest(request);
//......
} catch (FileUploadException ex) {
//......
}
}
}
}