<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    itVincent Blog - Java Working Fun!

    技術(shù)引領(lǐng)時代!
    posts - 117, comments - 181, trackbacks - 0, articles - 12

    [轉(zhuǎn)]用JSF和MyFaces上傳文件

    Posted on 2006-11-01 14:25 itVincent 閱讀(1981) 評論(4)  編輯  收藏 所屬分類: JSF

    用JSF和MyFaces上傳文件

    RR00 發(fā)表于 2005-08-31 00:12:00
    作者:Andrei Cioroianu;RR00???? 來源:Onjava
    評論數(shù):1 點擊數(shù):4,703???? 投票總得分:5 投票總?cè)舜?1
    關(guān)鍵字:JSF MyFaces Upload

    摘要:

    用戶可以很方便使用瀏覽器上傳文件,但是當前的Java Web標準(如servlets, JSP, and JSF)并沒有提供任何上傳的功能。幸好第三方框架,比如 Apache Commons File Upload, Apache MyFaces, and Oracle ADF Faces,提供了簡單的API和客戶標簽,實現(xiàn)了這個功能。文章的前半部分將介紹上傳組件是如何工作的,在文章的后半部分,介紹了一個讓用戶通過瀏覽器上傳文件的例子。
    用JSF和MyFaces上傳文件

    作者:Andrei Cioroianu

    翻譯:RR00

    email:di_feng_ro@hotmail.com


    版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標明文章原始出處和作者信息及本聲明
    英文原文地址:
    http://www.onjava.com/pub/a/onjava/2005/07/13/jsfupload.html
    中文地址:
    http://www.matrix.org.cn/resource/article/43/43703_JSF_MyFaces_Upload.html
    關(guān)鍵詞: JSF MyFaces Upload



    用戶可以很方便使用瀏覽器上傳文件,但是當前的Java Web標準(如servlets, JSP, and JSF)并沒有提供任何上傳的功能。幸好第三方框架,比如 Apache Commons File Upload, Apache MyFaces, and Oracle ADF Faces,提供了簡單的API和客戶標簽,實現(xiàn)了這個功能。文章的前半部分將介紹上傳組件是如何工作的,你將看到MyFaces and Commons File Upload 的部分源碼(實際上,前者采用的是后者的代碼)。了解這些源碼的內(nèi)在機制將使我們更有效的使用這些框架,并且可以根據(jù)需要修改他們!在文章的后半部分,介紹了一個讓用戶通過瀏覽器上傳文件的例子。

    基于WEB的文件上傳
    “上傳”這個詞的使用比較廣泛。一個web管理員在他的主頁發(fā)布了一個文件,他可以說他上傳了一個文件;當一個網(wǎng)絡(luò)工程師創(chuàng)建了一個HTML form和一些腳本使普通用戶可以通過瀏覽器上傳文件,他說他實現(xiàn)了上傳的功能。
    這兩種方式之中有些共同的地方,因為一個web管理員可以通過一個基于web的接口來發(fā)布文件(頁面,圖像,腳本等等)。那些免費提供個人主頁的公司,比如yahoo,實現(xiàn)了基于web的文件上傳功能,因為客戶需要上傳頁面。這樣任何人只要接入網(wǎng)絡(luò),就可以通過瀏覽器發(fā)布他的個人站點。但是,還有許多更好的方式讓你發(fā)布你的網(wǎng)頁內(nèi)容,比如FTP或secure FTP。在這種情況下,你就需要一個對應(yīng)的應(yīng)用程序,比如FTP客戶端,而不是瀏覽器來發(fā)布你的網(wǎng)站。

    這篇文章將從網(wǎng)絡(luò)開發(fā)者的角度來討論文件上傳。一個基于web的mail應(yīng)用程序,比如yahoo mail,實現(xiàn)了上傳功能,這樣用戶才能發(fā)送信息和附件。另一個好的例子是一個job網(wǎng)站必須讓你能夠發(fā)送簡歷給招聘人員。在你的應(yīng)用程序中,你可以對上傳的文件作任何你想做的事情,比如把這些文件的內(nèi)容儲存到數(shù)據(jù)庫中或者把他們當作附件發(fā)送出去。這篇文章的例子計算了上傳文件的hash值。現(xiàn)在,讓我們看看如何在一個web應(yīng)用程序中實現(xiàn)上傳功能。

    一個html表單包含一個或多個<input type="file"> 元素,這個元素將在頁面上生成文件輸入框,用戶可以在這里填寫文件路徑。用戶點擊輸入字段后面的瀏覽(browse)按鈕后,會彈出一個對話框讓用戶選擇路徑:

    image

    當用戶點擊表單的Sumbit按鈕,瀏覽器對表單數(shù)據(jù)進行編碼,其中包括文件的內(nèi)容,名字,路徑以及其他的表單參數(shù)。然后,瀏覽器把編碼過的數(shù)據(jù)傳遞給web服務(wù)器,服務(wù)器再把這些數(shù)據(jù)傳遞給相應(yīng)的頁面,比如<form>標簽里的action屬性值。如果是java網(wǎng)絡(luò)應(yīng)用程序,action屬性值可能是個servlet或者是個jsp頁面。
    因為默認的表單編碼和get方法不適合上傳文件,所以一個包含文件輸入框的表單必須定義編碼為multipart/form-data ,并且在<form>標簽里使用POST方法:
    <form enctype="multipart/form-data" method="POST" action="...">
    ????...
    ????<input type="file" name="...">
    ????...
    </form>


    但是,事情并不象看起來那么簡單,實現(xiàn)了servlet and JSP 標準的應(yīng)用服務(wù)器并沒有被要求處理 multipart/form-data編碼。所以你需要一個解析器來處理請求的輸入流,比如Apache Commons File Upload組件,它是個java包,能從已編碼的數(shù)據(jù)中讀取出上傳文件的內(nèi)容。這個包的API很靈活,允許你把小文件存在內(nèi)存里而大文件儲存在磁盤上一個臨時文件夾里。你不但可以定義大文件和小文件的界限,還可以定義上傳文件所占空間的最大值。

    org.apache.commons.fileupload里有個DiskFileUpload類,它的parseRequest()函數(shù)獲得一個HttpServletRequest,返回一個List,其中包含了org.apache.commons.fileupload.FileItem的實例。servlet請求的getInputStream()函數(shù)返回一個數(shù)據(jù)流,已編譯的表單數(shù)據(jù)就是從這里讀取出來的。FileItem很容易讓人誤解,因為這個接口的實例不僅包括上傳文件,還有其他的請求參數(shù)。

    Commons File Upload 包提供的API可以解析數(shù)據(jù),但是servlet請求的getParameter()函數(shù)和getParameterValues()函數(shù)卻不能工作。因為這兩個函數(shù)被運行在常用的輸入框, 復(fù)選框, 單選按鈕, 和下拉列表后面的標準JSF組件調(diào)用,所以這個問題需要解決。Servlets API提供的兩個功能(filters和request wrappers) 可以解決這個問題。下面的章節(jié)描述了在沒有破壞原有JSF結(jié)構(gòu)的情況下,Apache MyFaces 如何實現(xiàn)了一個filter功能,從而添加了更多需要的支持。另外,MyFaces提供的API可以創(chuàng)建javaBean,和生成<input type="file">元素的JSF組件相對應(yīng)。

    配置 JSF 和MyFaces Extensions
    目前最主要的實現(xiàn)JSF規(guī)范的框架有JSF Reference Implementation (RI)以及Apache提供的MyFaces。雖然還有別的,但這兩個是最流行的。很多開發(fā)者更傾向于JSF RI,因為這是來自于sun的官方產(chǎn)品。但MyFaces有一些有趣的擴展的功能,比如上傳文件。如果你喜歡,你可以同時使用MyFaces的擴展功能和JSF RI。你只需要把myfaces-extensions.jar和JSF RI的jar文件以及 commons-fileupload-1.0.jar 放在web應(yīng)用程序的WEB-INF/lib 目錄下即可。下面是你需要的jar文件:

    image

    org.apache.myfaces.component.html.util包的MultipartRequestWrapper類創(chuàng)建了MyFaces和Commons File Upload連接的橋梁。這個類繼承了HttpServletRequestWrapper,重寫了getParameterMap(), getParameterNames(), getParameter(), 和getParameterValues() 函數(shù),所以他們能正確處理multipart/form-data 編碼數(shù)據(jù)。另外,MultipartRequestWrapper提供的兩個函數(shù),getFileItem() 和getFileItems(),使你可以通過org.apache.commons.fileupload.FileItem 接口訪問上傳文件。

    MyFaces的 ExtensionsFilter 類在org.apache.myfaces.component.html.util 包里,當它發(fā)現(xiàn)multipart/form-data編碼的時候,它會創(chuàng)建 MultipartRequestWrapper 的實例。所以你不需理會他是如何解析表單數(shù)據(jù)的,但是知道它是如何開始解析對你想要修改上傳文件的處理方式是有用的。在一個傳統(tǒng)的應(yīng)用程序中,你只需要在web.xml描述符中配置好ExtensionsFilter ,它就能在JSF的FacesServlet之前截獲HTTP請求:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC
    ????"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    ????"http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    ????<context-param>
    ????????<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    ????????<param-value>client</param-value>
    ????</context-param>
    ????<servlet>
    ????????<servlet-name>FacesServlet</servlet-name>
    ????????<servlet-class>
    ????????????javax.faces.webapp.FacesServlet
    ????????</servlet-class>
    ????????<load-on-startup>1</load-on-startup>
    ????</servlet>
    ????<servlet-mapping>
    ????????<servlet-name>FacesServlet</servlet-name>
    ????????<url-pattern>/faces/*</url-pattern>
    ????</servlet-mapping>
    ????<servlet-mapping>
    ????????<servlet-name>FacesServlet</servlet-name>
    ????????<url-pattern>*.faces</url-pattern>
    ????</servlet-mapping>
    ????<filter>
    ????????<filter-name>ExtensionsFilter</filter-name>
    ????????<filter-class>
    ????????????org.apache.myfaces.component.html.util.ExtensionsFilter
    ????????</filter-class>
    ????????<init-param>
    ????????????<param-name>uploadMaxFileSize</param-name>
    ????????????<param-value>10m</param-value>
    ????????</init-param>
    ????????<init-param>
    ????????????<param-name>uploadThresholdSize</param-name>
    ????????????<param-value>100k</param-value>
    ????????</init-param>
    ????</filter>
    ????<filter-mapping>
    ????????<filter-name>ExtensionsFilter</filter-name>
    ????????<servlet-name>FacesServlet</servlet-name>
    ????</filter-mapping>
    ????<welcome-file-list>
    ????????<welcome-file>index.jsp</welcome-file>
    ????</welcome-file-list>
    </web-app>


    前面例子中,filter的兩個參數(shù)告訴MyFaces把小于100K的文件保存在內(nèi)存中,而對于大于10M的文件則忽略。大小在uploadThresholdSize值和uploadMaxFileSize值之間的文件則作為臨時文件存在硬盤上。如果你上傳很大的文件,當前的MyFaces版本會忽略所有的表單數(shù)據(jù),就好象你提交了一個空表單。如果你想把上傳失敗的消息告訴用戶,你就得修改MyFaces中MultipartRequestWrapper類的源碼。讓我們找到捕獲SizeLimitExceededException的地方,并使用FacesContext.getCurrentInstance().addMessage()來警告用戶。
    正如前面所說的,MyFaces Extensions 里有個能在JSF頁面里使用的上傳組件。下面的章節(jié)將說明如何使用。

    為了在web頁面里使用JSF和MyFaces,你必須使用<%@taglib%>指令聲明他們的標簽庫。

    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
    <%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>


    JSF的<h:form>標簽沒有method屬性,因為它只支持post方法,但他有enctype屬性,當你想上傳文件時,你可以用它來定義表單數(shù)據(jù)的編碼類型:
    <f:view>
    ????<h:form id="MyForm" enctype="multipart/form-data" >
    ????????...
    ????????<x:inputFileUpload id="myFileId"
    ????????????value="#{myBean.myFile}"
    ????????????storage="file"
    ????????????required="true"/>
    ????????...
    ????</h:form>
    </f:view>


    MyFaces的<x:inputFileUpload> 標簽讓你定義UI組件的屬性,它將在前臺生成<input type="file"> 元素。包org.apache.myfaces.custom.fileupload 包含了控制UI結(jié)構(gòu)的HtmlInputFileUpload類,它的renderer (HtmlFileUploadRenderer), 處理用戶標簽的類 (HtmlInputFileUploadTag),??UploadedFile 接口, 以及別的幫助類。 HtmlInputFileUpload 類 繼承了標準的JSF HtmlInputText 組件 ,重寫了幾個函數(shù)。HtmlFileUploadRenderer負責創(chuàng)建 HTML 標簽以及從MultipartRequestWrapper類返回FileItem(前面提過)。

    MyFaces提供了自己的UploadedFile接口讀取上傳文件的內(nèi)容,文件類型,名字以及大小,而不是讓你直接訪問由Commons File Upload組件創(chuàng)建的FileItem實例。你的JSF表單背后的bean必須有一個UploadedFile屬性。下面的例子中,UI組件的值通過JSF表達式(#{myBean.myFile})綁定到一個bean屬性中。JSF框架將取得HtmlInputFileUpload 組件的值,這是個UploadedFile實例,并把它傳送到背后bean的屬性中。

    import org.apache.myfaces.custom.fileupload.UploadedFile;
    ...
    public class MyBean {
    ????private UploadedFile myFile;
    ????public UploadedFile getMyFile() {
    ????????return myFile;
    ????}
    ????public void setMyFile(UploadedFile myFile) {
    ????????this.myFile = myFile;
    ????}
    ????...
    }


    我們應(yīng)該知道MyFaces有兩個實現(xiàn) UploadedFile接口的類:UploadedFileDefaultMemoryImpl和UploadedFileDefaultFileImpl。當<x:inputFileUpload>標簽沒有storage屬性或這個屬性值為memory時,使用前一個類。當storage屬性值為file時用后一個。

    類UploadedFileDefaultMemoryImp從一個FileItem實例中取得上傳文件的內(nèi)容以及它的名字,大小,文件類型,并把這些信息儲存在一個私有屬性里。所以即使Commons File Upload 把文件存在磁盤上,這個實現(xiàn)UploadedFile接口的類仍把上傳文件的內(nèi)容儲存在內(nèi)存里,浪費系統(tǒng)資源。
    類UploadedFileDefaultFileImpl使用一個非序列化域(transient field)來保存一個對FileItem實例的引用。只有當getInputStream()被調(diào)用時,才通過這個引用讀取上傳文件的內(nèi)容。這個類節(jié)省了內(nèi)存空間,但如果它被序列化了,當其被反序列化后,你無法取得文件的內(nèi)容。所以,支持上傳文件表單的bean不應(yīng)保存在session 域中,因為應(yīng)用服務(wù)器在應(yīng)用程序重起或服務(wù)器關(guān)閉時要對session bean序列化。

    如果你想讓它們高效的工作,可以把背后的bean保存在request域并且在<x:inputFileUpload>中定義 storage="file"節(jié)省內(nèi)存資源。你可以在UploadedFileDefaultFileImpl添加一個序列化上傳文件的函數(shù)writeObject(),這樣可以解決序列化的問題。為了使這個類更有效率,相應(yīng)的readObject() 應(yīng)該創(chuàng)建臨時文件而不是從內(nèi)存中讀取它的內(nèi)容。

    應(yīng)用程序例子

    前面的章節(jié)中,我們描述了MyFaces如何使用Commons File Upload支持上傳文件功能。現(xiàn)在讓我們來看一個使用這個功能的例子。一個JSF表單(MyForm.jsp)讓用戶選擇文件以及message-digest algorithm,支持的bean(MyBean.java)計算要在別的頁面(MyResult.jsp)顯示的hash值。這些頁面以及支持的bean和一個JSF配置文件(faces-config.xml)相關(guān)聯(lián)。

    MyForm.jsp頁面
    這里的JSF表單使用MyFaces的<x:inputFileUpload>標簽,以及一些標準JSF標簽,這些JSF標簽將在頁面生成labels,messages,以及一個包含message-digest algorithms的下拉列表,還有一個使用了JSF表達式的命令按鈕,這個按鈕用來定義處理上傳文件的action方法。

    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
    <%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>
    <f:view>
    <h:form id="MyForm" enctype="multipart/form-data" >
    ????<h:messages globalOnly="true" styleClass="message"/>
    ????<h:panelGrid columns="3" border="0" cellspacing="5">
    ????????<h:outputLabel for="myFileId" value="File: "/>
    ????????<x:inputFileUpload id="myFileId"
    ????????????value="#{myBean.myFile}"
    ????????????storage="file"
    ????????????required="true"/>
    ????????<h:message for="myFileId"/>
    ????????<h:outputLabel for="myParamId" value="Param: "/>
    ????????<h:selectOneMenu id="myParamId"
    ????????????????value="#{myBean.myParam}"
    ????????????????required="true">
    ????????????<f:selectItem itemLabel="" itemValue=""/>
    ????????????<f:selectItem itemLabel="MD5" itemValue="MD5"/>
    ????????????<f:selectItem itemLabel="SHA-1" itemValue="SHA-1"/>
    ????????????<f:selectItem itemLabel="SHA-256" itemValue="SHA-256"/>
    ????????????<f:selectItem itemLabel="SHA-384" itemValue="SHA-384"/>
    ????????????<f:selectItem itemLabel="SHA-512" itemValue="SHA-512"/>
    ????????</h:selectOneMenu>
    ????????<h:message for="myParamId"/>
    ????????<h:outputText value=" "/>
    ????????<h:commandButton value="Submit"
    ????????????action="#{myBean.processMyFile}"/>
    ????????<h:outputText value=" "/>
    ????</h:panelGrid>
    </h:form>
    </f:view>


    processMyFile() 函數(shù)通過一個輸入流取得上傳文件的內(nèi)容,這個輸入流是通過調(diào)用myFile.getInputStream()函數(shù)返回的。hash值是使用java.security.MessageDigest計算出來的,然后這個值被轉(zhuǎn)換成一個string,用myResult屬性儲存。

    package com.devsphere.articles.jsfupload;
    ...
    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.io.*;
    public class MyBean {
    ????...
    ????public String processMyFile() {
    ????????try {
    ????????????MessageDigest md
    ????????????????= MessageDigest.getInstance(myParam);
    ????????????InputStream in = new BufferedInputStream(
    ????????????????myFile.getInputStream());
    ????????????try {
    ????????????????byte[] buffer = new byte[64 * 1024];
    ????????????????int count;
    ????????????????while ((count = in.read(buffer)) > 0)
    ????????????????????md.update(buffer, 0, count);
    ????????????} finally {
    ????????????????in.close();
    ????????????}
    ????????????byte hash[] = md.digest();
    ????????????StringBuffer buf = new StringBuffer();
    ????????????for (int i = 0; i < hash.length; i++) {
    ????????????????int b = hash[i] & 0xFF;
    ????????????????int c = (b >> 4) & 0xF;
    ????????????????c = c < 10 ? '0' + c : 'A' + c - 10;
    ????????????????buf.append((char) c);
    ????????????????c = b & 0xF;
    ????????????????c = c < 10 ? '0' + c : 'A' + c - 10;
    ????????????????buf.append((char) c);
    ????????????}
    ????????????myResult = buf.toString();
    ????????????return "OK";
    ????????} catch (Exception x) {
    ????????????FacesMessage message = new FacesMessage(
    ????????????????FacesMessage.SEVERITY_FATAL,
    ????????????????x.getClass().getName(), x.getMessage());
    ????????????FacesContext.getCurrentInstance().addMessage(
    ????????????????null, message);
    ????????????return null;
    ????????}
    ????}
    }


    faces-config.xml 文件
    這個JSF配置文件定義了支持的bean在request域以及一個導航規(guī)則:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE faces-config PUBLIC
    ????"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
    ????"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
    <faces-config>
    ????<managed-bean>
    ????????<managed-bean-name>myBean</managed-bean-name>
    ????????<managed-bean-class>
    ????????????com.devsphere.articles.jsfupload.MyBean
    ????????</managed-bean-class>
    ????????<managed-bean-scope>request</managed-bean-scope>
    ????</managed-bean>
    ????<navigation-rule>
    ????????<from-view-id>/MyForm.jsp</from-view-id>
    ????????<navigation-case>
    ????????????<from-outcome>OK</from-outcome>
    ????????????<to-view-id>/MyResult.jsp</to-view-id>
    ????????</navigation-case>
    ????</navigation-rule>
    </faces-config>


    MyResult.jsp 頁面
    這個web頁面顯示了關(guān)于上傳文件和hash值的一些信息:

    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
    <f:view>
    ????<h:panelGrid columns="2" border="0" cellspacing="5">
    ????????<h:outputText value="FileName:"/>
    ????????<h:outputText value="#{myBean.myFile.name}"/>
    ????????<h:outputText value="FileSize:"/>
    ????????<h:outputText value="#{myBean.myFile.size}"/>
    ????????<h:outputText value="Param:"/>
    ????????<h:outputText value="#{myBean.myParam}"/>
    ????????<h:outputText value="Result:"/>
    ????????<h:outputText value="#{myBean.myResult}"/>
    ????</h:panelGrid>
    </f:view>


    事實上,顯示的文件名字可能是在客戶端文件系統(tǒng)的完整路徑,正如在下面的瀏覽器中看到的:

    image
    圖2. 結(jié)果圖

    總結(jié)
    在很多情況下,用戶需要通過他們的瀏覽器上傳文件,但在服務(wù)器方面并沒有處理這些文件的良好方式。把小文件保存在內(nèi)存里是可以接受的,但把大文件保存在臨時文件里會讓情況復(fù)雜。MyFaces讓你選擇的解決方法對你的應(yīng)用程序很有幫助,但這個框架有幾個小問題:當你已不再需要某個臨時文件時,它卻不讓你刪除;文件名有時候是文件路徑;并且用戶上傳過大文件時它沒有任何警告信息。但這些bug是可以修復(fù)的,因為源碼可以修改的。這篇文章已經(jīng)說明哪些地方的代碼可以提高。不過,你可能會發(fā)現(xiàn),對于很多應(yīng)用程序來說,原有的MyFaces就已經(jīng)足夠了。這篇文章的例子是在JSF 1.1.01, MyFaces 1.0.9,和 Commons File Upload 1.0下測試的。


    資源
    本文的范例代碼:
    JavaServer Faces :http://java.sun.com/j2ee/javaserverfaces/
    Apache MyFaces (參見: CodeZoo: MyFaces) :http://myfaces.apache.org/
    Oracle ADF Faces:http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/jsf/index.html
    Commons FileUpload:http://jakarta.apache.org/commons/fileupload/

    Andrei Cioroianu 是Devsphere的創(chuàng)始人,分別在ONJava, JavaWorld, 及 Java Developer's Journal??上發(fā)表了許多文章。

    Feedback

    # re: [轉(zhuǎn)]用JSF和MyFaces上傳文件  回復(fù)  更多評論   

    2007-03-16 20:51 by Derek
    你好,如果我要將文件上傳到tomcat/webapps/upload的目錄下應(yīng)該如何做?

    # re: [轉(zhuǎn)]用JSF和MyFaces上傳文件  回復(fù)  更多評論   

    2007-03-29 14:25 by itVincent
    @Derek
    把myFile寫到文件就可以了,上面的例子中沒有保存myFile

    # re: [轉(zhuǎn)]用JSF和MyFaces上傳文件[未登錄]  回復(fù)  更多評論   

    2007-05-16 15:48 by chris
    我試了下這個例子,但不知道為什么tomahawk的標簽都顯示不出來,也不報錯,能不能告訴我你的QQ或者MSN,我們交流一下

    # re: [轉(zhuǎn)]用JSF和MyFaces上傳文件  回復(fù)  更多評論   

    2007-05-18 16:37 by itVincent
    可以發(fā)我郵件itvincent@126.com,大家交流一下
    主站蜘蛛池模板: 国产伦一区二区三区免费| 国产免费人成视频在线观看 | 亚洲伊人久久大香线蕉AV| 97国产免费全部免费观看| 毛片免费观看网站| 国产又大又黑又粗免费视频| 亚洲综合区小说区激情区| 亚洲AV中文无码乱人伦下载 | 国产精品1024在线永久免费 | 午夜毛片不卡高清免费| 亚洲国产婷婷综合在线精品| 久久久久亚洲AV片无码| 亚洲av片不卡无码久久| 免费播放国产性色生活片| 久久免费美女视频| 最近中文字幕免费mv视频7| 亚洲成a人无码av波多野按摩| 亚洲AV无码成人网站久久精品大| 亚洲国产91在线| 一区二区三区视频免费观看| 亚洲一级免费视频| 亚洲成av人片天堂网老年人| 亚洲网站在线观看| 亚洲av日韩精品久久久久久a| 可以免费观看的毛片| 在线观看无码的免费网站| 亚洲色爱图小说专区| 一本色道久久88—综合亚洲精品| kk4kk免费视频毛片| 97在线线免费观看视频在线观看| 亚洲无码黄色网址| 亚洲小说区图片区| jizz在线免费观看| 国产va精品免费观看| 亚洲愉拍99热成人精品热久久 | 未满十八私人高清免费影院| 麻豆视频免费观看| 中文字幕久久亚洲一区| 久久精品国产亚洲av麻豆蜜芽 | 久久免费香蕉视频| 成人午夜视频免费|