JSF 2.0碰到一個比較糾結的問題——上傳檔案

來源:互聯網
上載者:User

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不要讓我等太久。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.