JavaBean是一種基於Java的軟件組件。JSP對於在Web 應用中集成JavaBean組件提供了完善的支持。這種支持不僅能縮短開發時間(可以直接利用經測試和可信任的已有組件,避免了重復開發),也為JSP應用帶來了更多的可伸縮性。
文件的上傳功能在基於B/S的開發模式中非常普遍。同其他開發工具相比較,JSP對文件的上傳支持並不是很完美,它既不象ASP那樣一定需要使用組件來完成,也不像PHP那樣直接提供了文件上載的支持。JSP實現文件上傳的實現方式是這樣的:使用ServletRequest類的getInputStream()方法獲得一個客戶端向服務器發出的數據流,然後處理這個數據流,從中分析、得到文件上傳中傳遞到服務器的各個參數和數據,然後將其中的文件數據存儲為一個文件或插入到數據庫中。通常JSP頁面中不處理文件的上傳功能,而是把這些功能放到Servlet 或JavaBean中去實現。使用Servlet完成文件上傳的例子在一些JSP的相關書籍中都有所介紹,我這裡介紹使用JeanBean是如何完成文件上傳的。JSP中實現文件的上傳可以采用兩種方式即采用HTTP協議和FTP協議實現,二者在傳輸的原理上存在很大的差異。以下將結合源代碼對它們的實現做簡單介紹,相信讀者會從中有所收獲。以下程序已經調試通過。調試的環境:window 2000 server+Apache +tomcat4.0,JavaBean調試環境:JDK1.4+Editplus。
在JSP中使用JavaBean實現基於Web的文件上傳功能一般需要三種文件結合完成。這三種文件分別是提供界面的HTML頁面文件、完成調用實現上傳功能的JavaBean的JSP文件和實現JavaBean的Java的類文件。以下我將重點講述采用HTTP協議和FTP協議實現文件上傳功能的JavaBean部分。
1、采用HTTP協議實現多個文件的上傳
在過去的Html中,表單不能實現文件的上傳,這多少限制了一些網頁的功能。RFC1867規范(即Html中實現基於表單的文件上傳)對表單作出了擴展,增加了一個表單元素〈input type=file>。通過使用這個元素,浏覽器會自動生成一個輸入框和一個按鈕,輸入框可供用戶填寫本地的文件名和路徑名,按鈕可以讓浏覽器打開一個文件選擇框供用戶選擇文件。具體的表單實現如下:
<FORMMETHOD="POST" ACTION="*.jsp" ENCTYPE="multipart/form-data">
<INPUT type=file size=50 name=FILE1>
<INPUT type=submit value=Upload>
</FORM>
當選擇了粘貼文件後就直接輸入本地文件的絕對路徑,表單的action屬性值是*.jsp,這意味著請求(包括上載的文件)將發送給*..jsp文件。在這個過程中實際上就實現了HTTP方式的文件上載。文件從客戶端到服務器的上載是由HTTP協議的通用網關界面(CGI)支持的。這種上載方式要求浏覽器和WEBServer兩方面都能夠支持Rfc1867。JavaBean 通過ServletRequest類的getInputStream()方法獲得一個客戶端向服務器發出的數據流、分析上傳的文件格式,根據分析結果將多個文件依次輸出服務器端的目標文件中。本例中的JavaBeande的功能是由testUpload類具體實現。TestUpload類的框架如下:
public class testUpload
{
public testUpload(){……}
public final void initialize(ServletConfig config) throws ServletException
{ m_application = config.getServletContext(); }
public void upload() throws testUploadException, IOException, ServletException
{………}
private void getDataSection(){………}
private void getDataHeader(){………}
public int save (String destPathName)
throws SmartUploadException, IOException, ServletException
{………}
……
}
通過initialize()方法初始化Servlet的運行環境。使用upload()方法獲得輸入流,並分析上傳文件的格式,並將各個上傳文件的屬性賦給多個File類實例處理,這些File類實例由Files類管理。File類根據各文件的屬性調用它的save ()方法將多個文件依次輸出服務器端的目標文件中。其中upload()方法是關鍵,用於分析http1.1協議傳送文件的格式。經過測試,我們得出傳輸流文件的格式,這對理解upload()方法很有用。例如,上傳我的文檔 t.txt文件。格式如下:
//文件分隔符
-----------------------------7d226137250336
//文件信息頭
Content-Disposition: form-data; name="FILE1"; filename="C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documents t.sql"
Content-Type: text/plain
//源文件內容
create table info(
content image null);
//下一個文件的分隔符
-----------------------------7d226137250336
Content-Disposition: form-data; name="FILE2"; filename=""
Content-Type: application/octet-stream
-----------------------------7d226137250336
從以上文件我們可以看出,HTTP協議在上傳多個文件時,是將文件全部放到輸入流並以一定的分隔符來區分的。實際上upload()方法就是要分析上面的文件,確定分隔符的內容、各個文件的內容格式、文件的完整路徑名稱、及其文件的實際數據的始末位置。這裡需要說明的一點是分隔符是隨機的,它是傳輸流文件的第一個回車符之前的所有字符。