• JSF 2.0碰到一个比较纠结的问题——上传文件


    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) {
                    
    //......
                }
            }
        }
    }


    上传文件的form需要有属性enctype="multipart/form-data",就像下面这样。cc:uploadfile就是上面那个上传文件的组件。

    <h:form enctype="multipart/form-data" >
        
    <cc:uploadfile />
        
    <h:commandButton value="Submit" />
    </h:form>

    可是JSF在生成html时,会向form中加入一些<input type="hidden" />的标签,用来恢复组件树。而enctype="multipart/form-data"的form是没法正常提交这些input的,所以组件的decode方法根本就没法执行。


    那么现在唯一可行的方法就是通过system event来处理上传文件。

    <f:event type="preRenderView" listener="#{bean.getPostFile}" />


    JSF已经发展到2.0了,连<input type="file" />这样最基本的html标签都没有解决,不能不说是个遗憾。除了这个问题外,2.0的改进还是挺大的,我个人最喜欢两点:一是支持get的form和url传值;二是el 2.2的method支持参数。希望Trinidad 2.0和对应的ADF不要让我等太久。

  • 相关阅读:
    挖地雷——线性dp
    hdu6376 度度熊剪纸条-----01背包
    Problem
    UVa 10635
    Vjudge_题目分享_A -> 线性Dp排列木棍 ( Dilworth定理应用
    洛谷日报 & 原来博客(转载)
    使用.net6 WebApplication打造最小API
    k8s笔记——NodePort暴露nginx-controller实现https自动跳转自定义nodePort端口
    通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载
    通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护
  • 原文地址:https://www.cnblogs.com/esestt/p/1774029.html
Copyright © 2020-2023  润新知