欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Struts Hibernate簡(jiǎn)化J2EE的文件操作

1. 引言

  每位Web開(kāi)發(fā)者在工程中都必須實(shí)現至少實(shí)現一個(gè)客戶(hù)文件的上載功能。永遠需要!然而,要求用戶(hù)僅提供一個(gè)指向其數據的URL是不公平的。作為一個(gè)開(kāi)發(fā)者,幫助用戶(hù)順利地完成這些正是你的工作。HTTP協(xié)議的使用將十分有助于解決這個(gè)問(wèn)題,但是許多開(kāi)發(fā)者并沒(méi)有選擇使用HTTP協(xié)議。

  你需要解決的問(wèn)題有:存儲上載的文件并找到關(guān)于問(wèn)題"Where?","Why?"和"How?"等等的有關(guān)答案。

  本文將解釋所有在解決這些問(wèn)題中遇到的瓶頸,并提供了功能性的、易于理解的代碼,這些內容很可能會(huì )應用于你將來(lái)的工程中。

  2. 準備工作

  本文將使用當前最流行的開(kāi)發(fā)工具,它們是:

  ·應用程序服務(wù)器:WebLogic 8.1 SP3服務(wù)器

  ·基于Java的構建工具:Apache Ant 1.6.2

  ·數據庫服務(wù)器:MySQL 4.0.16

  ·用于從Java連接到MySQL的:MySQL Connector/J 3.1.7

  Struts 1.2.4用作構建Java Web應用程序的框架,而Hibernate 3.0(RC1)用于對象/關(guān)系持續性操作和查詢(xún)服務(wù)。

  本文雖然基于Windows平臺寫(xiě)成,但在其它操作系統之上,應該稍作修改就能運行。

  另外,讀者還應熟悉BEA WebLogic服務(wù)器以及使用Struts和Hibernate進(jìn)行J2EE應用程序的開(kāi)發(fā)。篇幅所限,本文并沒(méi)有討論關(guān)于應用程序和數據庫服務(wù)器配置的問(wèn)題。

  3. 上載工程分析

  現在讓我們討論存儲上載文件的機制,并回答上面列出的三個(gè)問(wèn)題。

  ·Where?你將會(huì )把上載文件存儲到一個(gè)數據庫中。

  ·Why?在許多情況下,它確實(shí)是合適的解決方案。使用本文的解決方案,你不會(huì )因同步上載文件而煩惱,一旦你正在備份著(zhù)應用程序-你只需要備份數據庫就可以了。而且,你不需要與一個(gè)用戶(hù)及其在一文件系統上的文件一直保持十分笨拙的聯(lián)系。

  ·How?可以使用BLOB(二進(jìn)制大型對象)字段實(shí)現。這樣的字段用于存儲大型的并且經(jīng)常是原始或二進(jìn)制的格式。Hibernate可以使你非常容易地操作這些字段。

  典型情況下,一個(gè)企業(yè)應用程序(EAR)由兩部分組成:Web層(WAR)和商業(yè)層(EJB)。商業(yè)層包含一個(gè)無(wú)狀態(tài)的會(huì )話(huà)bean-它借助于Hibernate的幫助實(shí)現數據的存儲。圖1顯示了EJB的遠程接口。


圖1.HelloSession EJB的接口。

  從Web層角度看,這個(gè)EJB為商業(yè)代理所存取。

  注意,該代碼使用了一個(gè)類(lèi)User的對象。User代表什么意思?它是一個(gè)保留在數據庫中的用戶(hù)實(shí)體的"Plain Old Java Object"(POJO)。你將會(huì )活躍地使用這個(gè)UserPOJO。設置它的屬性并請求EJB來(lái)存儲它,然后帶回一個(gè)所有的已存在于數據庫中的User實(shí)體的列表?;蛘?由它取回一個(gè)專(zhuān)門(mén)的User實(shí)體并存入POJO中,然后使用一個(gè)getter存取器來(lái)存取它的屬性(見(jiàn)圖2)。


圖2.所有的Web層的servlet都使用該User POJO。

  非常明顯,Web層僅由三個(gè)servlet(Struts Action的)組成,一個(gè)用于上載文件,一個(gè)用于下載文件,一個(gè)用于列出所有的User實(shí)體及其相關(guān)文件。

  ·DownloadFileAction:該servlet僅使用一個(gè)參數id,這是在數據庫中的一個(gè)用戶(hù)的id。然后,它裝入該用戶(hù)的實(shí)體并把該文件從BLOB字段傳遞到ServletOutputStream。

  ·UploadFileAction:該servlet負責從一個(gè)HTML表單中提取數據并用這些數據進(jìn)一步生成DynaActionForm。它僅提取用戶(hù)名和上載的文件。

  ·ListAllFilesAction:該servlet沒(méi)有輸入參數或數據,僅負責從數據庫中裝入所有可用的用戶(hù)User實(shí)體。
 

4. 環(huán)境準備

  如果所有相應的軟件被正確下載并安裝在你的PC上,那么下一步,你就可以準備數據庫和存取該數據庫的用戶(hù)而且還要使用名為MySqlDS的JNDI設置好連接池與數據源。同時(shí),請肯定MySQL Connector/J存在于你的類(lèi)路徑中!要檢查這一點(diǎn),只需輸入:

echo %CLASSPATH%

  文件mysql-connector-java-3.1.7-bin.jar(帶有完整的路徑)應該于此。這是必需的,因為WebLogic需要查找到MySQL Connector/J并用該驅動(dòng)程序進(jìn)行工作。

  現在,既然一切準備妥當,我們就可以在數據庫中創(chuàng )建一個(gè)表以用于保存用戶(hù)實(shí)體。以任何MySQL客戶(hù)身份登錄到該數據庫,然后輸入:

drop table if exists TABLE_USER_FILE;
create table TABLE_USER_FILE
(
USER_ID int auto_increment not null,
USER_USERNAME text,
USER_FILENAME text,
USER_FILETYPE text,
USER_FILESIZE text,
USER_FILEBIN longblob,
primary key (USER_ID)
)
type = MyISAM;

  你看,一切都很簡(jiǎn)單。也許在此你最陌生的是longblob類(lèi)型。二進(jìn)制大型對象(BLOB)列是MySQL的秘密武器之一。這些列中存儲了二進(jìn)制的數據,你可以象其它普通的數據類(lèi)型一樣來(lái)檢索和操縱它。根據MySQL指南有關(guān)資料,BLOB是一個(gè)二進(jìn)制大型對象,它能容納不同大小的數據。事實(shí)上,MySQL有四種BLOB類(lèi)型:

  ·tinyblob:僅255個(gè)字符

  ·blob:最大限制到65K字節

  ·mediumblob:限制到16M字節

  ·longblob:可達4GB

  在每個(gè)MySQL的文檔(從MySQL4.0開(kāi)始)的介紹中,一個(gè)longblob列的最大允許長(cháng)度依賴(lài)于在客戶(hù)/服務(wù)器協(xié)議中可配置的最大包的大小和可用內存數。

  你可能對在BLOB中存儲大型文件非常謹慎,但是請放心使用,MYSQL提供了這樣的靈活性!最大包的大小可容易地通過(guò)文件my.ini中的適當行進(jìn)行設置。例如:

set-variable = max_allowed_packet=10M

  你能指定幾乎任何你需要的大小。默認是1M。

  現在,在Hibernate和WebLogic之間還存在一個(gè)問(wèn)題。根據Hibernate的文檔,Hibernate3.0使用ANTLR作為它的新的查詢(xún)分析器。這真是個(gè)遺憾!但是BEA Weblogic在系統類(lèi)路徑中包括了ANTLR的一個(gè)版本,它在任何應用程序庫裝入前就已經(jīng)被加載了。因為Weblog似乎不支持屬性類(lèi)裝載器隔離,在應用程序的上下文中它是不會(huì )看到該Hibernate類(lèi)的。BEA好象在包名前加上前綴來(lái)解決這個(gè)問(wèn)題,但是現已發(fā)布的ANTLR并沒(méi)有這個(gè)前綴。

  這個(gè)問(wèn)題的解決辦法是,把所有的Hibernate和依賴(lài)庫放到你的CLASSPATH中。就象如下這樣:

C:\green\te3>echo %CLASSPATH%
.;C:\mysql-connector-java-3.1.7\mysql-connector-java-3.1.7-bin.jar;C:\hibernate-3.0\hibernate3.jar;
C:\hibernate-3.0\lib\ehcache-1.1.jar;C:\hibernate-3.0\lib\jta.jar;C:\hibernate-3.0\lib\xml-apis.jar;
C:\hibernate-3.0\lib\commons-logging-1.0.4.jar;C:\hibernate-3.0\lib\dom4j-1.5.2.jar;
C:\hibernate-3.0\lib\antlr-2.7.4.jar;C:\hibernate-3.0\lib\cglib-full-2.0.2.jar;
C:\hibernate-3.0\lib\jdbc2_0-stdext.jar;C:\hibernate-3.0\lib\xerces-2.6.2.jar;
C:\hibernate-3.0\lib\jaxen-1.1-beta-4.jar;C:\hibernate-3.0\lib\commons-collections-2.1.1.jar;
C:\hibernate-3.0\lib\log4j-1.2.9.jar;

  現在,unzip源代碼到任何你想要的目錄下。用你喜歡的文件編輯器打開(kāi)build.xml文件,并檢查(如果必要的話(huà),加以改變)前面涉及你的HOME目錄的幾行和你的域的標題。保存你的變化并輸入:

  ant

  當工程建構完成時(shí),你就會(huì )得到一個(gè)文件TE3.EAR,這是一個(gè)準備好等待發(fā)布的包(名字TE3僅是個(gè)普通名字)。然后,你就可以用WebLogic的管理控制臺發(fā)布它,當發(fā)布后,用你的瀏覽器http://localhost:7001/te3/打開(kāi)它。之后,你將看到兩個(gè)選項:"upload file"和"list all files"。
5. 代碼分析

  現在,你已經(jīng)看到了一切是如何工作的,下面解釋一下幾個(gè)更為重要的代碼片斷。如前述,UploadFileAction.java使用DynaActionForm來(lái)保持HTML表單的屬性。下面是它在/WEB-INF/struts-config.xml文件中的定義:

...
<form-beans>
?。糵orm-bean name="uploadFileForm" type="org.apache.struts.action.DynaActionForm" dynamic="true">
 ?。糵orm-property name="myFile" type="org.apache.struts.upload.FormFile"/>
 ?。糵orm-property name="myName" type="java.lang.String"/>
?。?form-bean>
</form-beans>
...
<action-mappings>
<action path="/UploadFile" type="com.prokhorenko.web.UploadFileAction" name="uploadFileForm">
...

  下面的代碼教你怎樣通過(guò)屬性存取來(lái)"存儲"一個(gè)上傳的文件:

...
User per = new User();
DynaActionForm df = (DynaActionForm) form;
FormFile myFile = (FormFile) df.get("myFile");
...
per.setFilebin ( Hibernate.createBlob (myFile.getInputStream()) );
...

  Hibernate.createBlob(...)返回初始的不變的java.sql.Blob對象并使用它,因為為了設置User實(shí)體的filebin屬性,該屬性被定義并被映射為java.sql.Blob。

  接下去一段有趣的代碼來(lái)自于DownloadFileAction.java,它用’id’加載該User實(shí)體:

...
User per = bd.getUser( new Long((String)request.getParameter("id")) );
...

  下一步,你就需要設置響應的頭部,并開(kāi)始把Blob型字段filebin的內容寫(xiě)到ServletOutputStream中:

...
ServletOutputStream outStream = response.getOutputStream();
InputStream in = per.getFilebin().getBinaryStream();
byte[] buffer = new byte[32768];
int n = 0;
while ( ( n = in.read(buffer)) != -1) {
 outStream.write(buffer, 0, n);
}
in.close();
outStream.flush();
...

  6. 最容易的解決方案

  在所有官方檔案中,Hibernate 3.0都包裝了Blob和Clob的實(shí)例,這樣以來(lái)就允許具有類(lèi)型Blob或Clob的屬性的類(lèi)可以被分離、串行化、反串行化以及被傳遞而實(shí)現合并的目的。因此,你會(huì )看到,Struts和Hibernate幾乎為你做了一切事情-而需要你做的僅僅是極少的幾個(gè)步驟。

  現在看來(lái),上載文件并把它們存儲到數據庫中已不再是象以前那樣是一項繁重的任務(wù)。你只需選擇正確的工具并知道如何靈活地使用它們即可!
 
 

 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用Struts2上傳圖片存取到Mysql中并讀取出來(lái)顯示在頁(yè)面上
SSH框架網(wǎng)上商城項目第1戰之整合Struts2、Hibernate4
struts2.2.+spring2.5+hibernate3.2實(shí)踐整合成功
Hibernate配置jdbc數據庫連接池1
配置Middlegen-Hibernate和hibernate-extensions以產(chǎn)生hbm映射文件和POJO - 輕松 - BlogJava
下面是在 WebLogic 8.1 上配置 Hibernate 的具體步驟
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久