與Java相伴的日子
          相識(shí),相知,相戀,到相守......我的日子因你的到來(lái)而充實(shí),我的日子因你的存在而多姿!
          posts - 4,comments - 31,trackbacks - 0
          ??????? J2EE 即Java2平臺(tái)企業(yè)版,它提供了基于組件的方式來(lái)設(shè)計(jì)、開(kāi)發(fā)、組裝和部署企業(yè)應(yīng)用。J2EE使用多層分布式的應(yīng)用模型,這個(gè)多層通常通過(guò)三層或四層來(lái)實(shí)現(xiàn):

          ?????????1、客戶(hù)層,運(yùn)行在客戶(hù)計(jì)算機(jī)上的組件。
          ???????? 2、Web 層,運(yùn)行在J2EE服務(wù)器上的組件。
          ?????????3、業(yè)務(wù)層,同樣是運(yùn)行在J2EE服務(wù)器上的組件。
          ?????????4、企業(yè)信息系統(tǒng)層(EIS),是指運(yùn)行在EIS服務(wù)器上的軟件系統(tǒng)。
          ??????
          ?????????以上層次一般也指三層應(yīng)用,因分布在三個(gè)不同位置:客戶(hù)計(jì)算機(jī)、J2EE服務(wù)器及后臺(tái)的數(shù)據(jù)庫(kù)或過(guò)去遺留下來(lái)的系統(tǒng)。請(qǐng)看圖例:?????????????????????????????????

          ?????????????????????????

          ??????????

          ?????????????????????
          ?????????J2EE組件

          ?????????J2EE應(yīng)用程序是由組件構(gòu)成的。J2EE組件是一個(gè)封裝了功能的軟件單元,能夠與相關(guān)的一些類(lèi)和文件一起組成J2EE應(yīng)用程序。
          ?????????1、應(yīng)用程序客戶(hù)端和Applet是指運(yùn)行在客戶(hù)計(jì)算機(jī)上的組件。
          ?????????2、基于Java Servlet和JSP技術(shù)的組件叫Web組件,它們運(yùn)行在服務(wù)器上。
          ?????????3、企業(yè)JavaBean(EJB)組件叫業(yè)務(wù)組件,同樣運(yùn)行在服務(wù)器上。

          ??????J2EE客戶(hù)端

          ?????????J2EE客戶(hù)端可以是一個(gè)Web組件或者是一個(gè)應(yīng)用程序客戶(hù)端。
          ?????????1、Web客戶(hù)端??
          ?????????包括兩部分,首先是那些動(dòng)態(tài)Web頁(yè)面(HTML、XML等),這些組件運(yùn)行在Web層;另一個(gè)是Web瀏覽器,由客戶(hù)機(jī)上的瀏覽器從服務(wù)器接收并且解析和顯示W(wǎng)eb頁(yè)面。
          ?????????2、小應(yīng)用程序(Applet)?
          ?????????需要運(yùn)行在客戶(hù)端安裝了Java虛擬機(jī)的Web瀏覽器上。
          ?????????3、應(yīng)用程序客戶(hù)端
          ?????????J2EE應(yīng)用程序客戶(hù)端運(yùn)行在客戶(hù)機(jī)上,能提供強(qiáng)大而靈活易用的用戶(hù)界面,如使用Swing或AWT創(chuàng)建的圖形化的用戶(hù)界面(GUI)。應(yīng)用程序可直接訪(fǎng)問(wèn)運(yùn)行在業(yè)務(wù)層的企業(yè)Bean,如果需求允許,也可以打開(kāi)HTTP連接來(lái)建立與運(yùn)行在Web層上的Servlet之間的通訊。
          ?????????4、JavaBean組件架構(gòu)
          ?????????在服務(wù)器和客戶(hù)端兩層中也可能包括了基于JavaBean的組件架構(gòu),通過(guò)JavaBean來(lái)實(shí)現(xiàn)數(shù)據(jù)的流動(dòng),可以是在應(yīng)用程序客戶(hù)或Applet與運(yùn)行在J2EE服務(wù)器上的組件之間,或者是在J2EE服務(wù)器和后臺(tái)數(shù)據(jù)庫(kù)之間。(不過(guò)JavaBean組件并沒(méi)有包含在J2EE規(guī)范里)
          ?????????5、J2EE服務(wù)的通訊
          ?????????客戶(hù)層與J2EE服務(wù)器上運(yùn)行的業(yè)務(wù)層之間的通訊可以是直接的,也可以通過(guò)運(yùn)行在Web層中的Servlet和JSP來(lái)實(shí)現(xiàn),在這種情況下,客戶(hù)端運(yùn)行在瀏覽器中。

          ?????????Web組件

          ?????????J2EE的Web組件可以是Servlet或JSP頁(yè)面。在應(yīng)用程序組裝過(guò)程中,靜態(tài)HTML頁(yè)面和Applet也可以一起打包成Web組件,但這并不是J2EE規(guī)范所認(rèn)可的Web組件。

          ?????????業(yè)務(wù)組件

          ?????????業(yè)務(wù)代碼是指那些由位于業(yè)務(wù)層的企業(yè)Bean(EJB)執(zhí)行的邏輯,它們能夠解決或滿(mǎn)足特定的商業(yè)領(lǐng)域的一些需求。有三種不同類(lèi)型的企業(yè)Bean:會(huì)話(huà)Bean、實(shí)體Bean和消息驅(qū)動(dòng)Bean。會(huì)話(huà)Bean代表客戶(hù)一次短暫的會(huì)話(huà)過(guò)程,當(dāng)客戶(hù)執(zhí)行完成后,會(huì)話(huà)Bean以及它所包含的數(shù)據(jù)也隨之消失。實(shí)體Bean代表的是持久的數(shù)據(jù),即存儲(chǔ)在數(shù)據(jù)庫(kù)表中的一行記錄,即使客戶(hù)終止或者服務(wù)器關(guān)閉,在J2EE底層的服務(wù)會(huì)確保實(shí)體Bean的數(shù)據(jù)被保存下來(lái)。

          ?????????企業(yè)信息系統(tǒng)層

          ?????????企業(yè)信息系統(tǒng)層處理企業(yè)信息系統(tǒng)的軟件,包括企業(yè)組織結(jié)構(gòu)系統(tǒng),例如企業(yè)資源計(jì)劃(ERP)、大型的事務(wù)處理、數(shù)據(jù)庫(kù)系統(tǒng)及其他歷史上遺留下來(lái)的信息系統(tǒng)。

          ?????????J2EE的主要技術(shù)
          ?????????
          ?????????JDBC(Java Database Connectivity): JDBC API?為訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)提供一種統(tǒng)一的方式,其接口包括在java.sql和javax.sql兩個(gè)包中。
          ?????????JNDI(Java Name and Directory Interface):Java名稱(chēng)和目錄服務(wù),包含在javax.naming 及其子包中。它為應(yīng)用程序提供標(biāo)準(zhǔn)的目錄操作的方法 ,如獲得對(duì)象的關(guān)聯(lián)屬性,根據(jù)它們的屬性搜尋對(duì)象等。使用JNDI,一個(gè)J2EE應(yīng)用程序可以存儲(chǔ)和動(dòng)態(tài)獲取任何類(lèi)型的命名Java對(duì)象。JNSI分為兩種:應(yīng)用程序編程接口(API)和服務(wù)供應(yīng)商接口(SPI)。
          ?????????EJB(Enterprise JavaBean):參見(jiàn)上文。
          ?????????RMI(Remote Method Invoke):即遠(yuǎn)程方法調(diào)用,它使用了連續(xù)序列的方式在客戶(hù)端和服務(wù)器端傳遞數(shù)據(jù),將面向?qū)ο缶幊棠P蛿U(kuò)展到了客戶(hù)機(jī)/服務(wù)器系統(tǒng),使開(kāi)發(fā)者可以用本地對(duì)象調(diào)用的語(yǔ)法進(jìn)行遠(yuǎn)程調(diào)用。
          ?????????JSP(Java Server Pages):Java服務(wù)器頁(yè),可以在HTML代碼中嵌入部分Java代碼,這種文件由服務(wù)器編譯成Servlet并執(zhí)行,然后將產(chǎn)生的結(jié)果作為一個(gè)HTML文件傳給瀏覽器。
          ?????????Servlet:Java Servlet實(shí)質(zhì)上是一種小型的,與平臺(tái)無(wú)關(guān)的Java類(lèi),它由容器管理并被編譯成平臺(tái)無(wú)關(guān)的字節(jié)代碼,可以動(dòng)態(tài)地加載到一個(gè)Web服務(wù)器上,并由該Web服務(wù)器運(yùn)行。
          ?????????JMS(Java Message Service):Java 消息服務(wù),是用于和企業(yè)消息傳遞系統(tǒng)相互通信的應(yīng)用程序接口。企業(yè)消息傳遞系統(tǒng)又稱(chēng)為面向消息的中間件(Message Oriented Middle Ware, MOM),它使用松耦合的、非常靈活的方式來(lái)集成應(yīng)用程序,在存儲(chǔ)和轉(zhuǎn)發(fā)的基礎(chǔ)上支持應(yīng)用程序間數(shù)據(jù)的異步傳遞;
          每個(gè)應(yīng)用程序都只與作為中介的MOM通信。
          ?????????JTA(Java Transaction API):指定事務(wù)管理與分布式事務(wù)中涉及的其他系統(tǒng)之間的各種高級(jí)接口。
          ?????????JavaMail:用于存取郵件服務(wù)器的API,提供了一套用于郵件服務(wù)的抽象類(lèi)。
          ?????????JAXP(Java API for XML Processing):Java XML 處理API,支持使用DOM、SAX和XSLT對(duì)XML文檔進(jìn)行處理。
          ?????????J2EE Connector Architecture:J2EE工具提供商提供的J2EE連接體系結(jié)構(gòu),通過(guò)它可以建立支持訪(fǎng)問(wèn)企業(yè)信息系統(tǒng)的資源適配器。??????

          ????????歸納幾個(gè)概念:

          ?????????EJB

          ?????????即Enterprise JavaBean,一種組件架構(gòu),用于開(kāi)發(fā)和部署面向?qū)ο蟮摹⒎植际降摹⑵髽I(yè)級(jí)的應(yīng)用程序。所開(kāi)發(fā)的應(yīng)用程序使用EJB架構(gòu)來(lái)實(shí)現(xiàn)可擴(kuò)展性及管理事務(wù)和安全。
          ?????????EJB包括會(huì)話(huà)Bean(session bean)、實(shí)體Bean(entity bean)和消息驅(qū)動(dòng)Bean(message-driven bean)。其中會(huì)話(huà)Bean分為無(wú)狀態(tài)會(huì)話(huà)Bean(stateless session bean)和有狀態(tài)會(huì)話(huà)Bean(stateful session bean)。而實(shí)體Bean又分為Bean管理實(shí)體Bean和容器管理實(shí)體Bean。由于這種Bean對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的記錄,所以數(shù)據(jù)庫(kù)記錄的任何改變也被同步到組件池中的相關(guān)Bean中,這個(gè)過(guò)程叫做持久性(persistenced),這是實(shí)體Bean最重要的一個(gè)特征。根據(jù)持久性操作方式的不同分為:容器管理持久性(Container-Managed Persistence,CMP)和Bean管理持久性(Bean-Managed Persistence,BMP)。

          ?????????容器

          ?????????即container,一個(gè)實(shí)體,它管理著組件的生命周期、安全、部署和運(yùn)行時(shí)服務(wù)。每個(gè)類(lèi)型的容器都只提供與相應(yīng)類(lèi)型的組件相關(guān)的服務(wù),如EJB、Web、JSP、Applet和應(yīng)用程序客戶(hù)端。其中,EJB容器和Web容器都運(yùn)行在J2EE服務(wù)器中。

          ?????????J2EE

          ?????????即Java 2 Platform Enterprise Edition,Java 2 平臺(tái)企業(yè)版。是開(kāi)發(fā)和部署企業(yè)應(yīng)用程序的一種平臺(tái)或環(huán)境。它由一系列服務(wù)、應(yīng)用程序編程接口(API)、提供多層開(kāi)發(fā)的功能性的協(xié)議以及基于Web的應(yīng)用程序組成。

          ?????????


          ?



          ?

          posted @ 2006-04-16 01:28 南一郎 閱讀(2953) | 評(píng)論 (0)編輯 收藏
               摘要: 以下是我用Swing 組件編寫(xiě)的記事本,功能是模仿微軟的,使用了觀(guān)感,自我覺(jué)得界面比Win的記事本更為好看(臭屁一下吧)。除了沒(méi)有做字體選擇之外,其他功能基本都有了吧。 /**?**/ /** ?*Author: Zhang?Zhijian? ?*Mail: q...  閱讀全文
          posted @ 2006-04-15 01:06 南一郎 閱讀(3222) | 評(píng)論 (14)編輯 收藏
               摘要: 我做過(guò)的一個(gè)項(xiàng)目,需要實(shí)現(xiàn)在線(xiàn)實(shí)時(shí)生成 Excel文件供客戶(hù)端下載的需求,最初考慮的是先在服務(wù)器端生成真實(shí)的文件,然后在客戶(hù)端下載該文件。后來(lái)發(fā)現(xiàn)這樣做不但性能不夠好、速度較慢,而且還要占用服務(wù)器空間。所以采取了在服務(wù)器端生成文件輸出流(ServletOutputStream),通過(guò)HttpServletResponse對(duì)象設(shè)置相應(yīng)的響應(yīng)頭,然后將此輸出流傳往客戶(hù)端的方法實(shí)現(xiàn)。在實(shí)現(xiàn)過(guò)程中,用到了...  閱讀全文
          posted @ 2005-12-30 10:08 南一郎 閱讀(12302) | 評(píng)論 (16)編輯 收藏

          ?

          ??????? 我的一個(gè)項(xiàng)目使用了Hibernate3操作Oracle9i數(shù)據(jù)庫(kù),遇到一個(gè)很奇怪的問(wèn)題,即在按某些使用了聚合函數(shù)的值的升序排序后,翻頁(yè)到一定頁(yè)數(shù)(通常是3或5)以后,顯示的內(nèi)容不會(huì)變化,即出現(xiàn)不是期望的查詢(xún)結(jié)果.
          ??????? 剛開(kāi)始仔細(xì)排查,找不出原因.后來(lái)通過(guò)查Hibernate 包中的Oracle9Dialect及OracleDialect的源碼,將Dialect換成 OracleDialect后問(wèn)題解決.
          ?????? 但是,問(wèn)題雖解決了,根源何在呢?為什么Oracle9卻要用到OracleDialect(源碼注解中說(shuō)這是兼容Oracle8i)的才能解決問(wèn)題呢?!
          ???? ?查看源碼,發(fā)現(xiàn)兩者取得分頁(yè)查詢(xún)字符串的方式是有點(diǎn)區(qū)別的(在 getlimitString()方法中).

          ?? ?在Oracle9Dialect中:

          ?? public ?String?getLimitString(String?sql,? boolean ?hasOffset)? {
          ??
          ??sql?
          = ?sql.trim();
          ??
          boolean ?isForUpdate? = ? false ;
          ??
          if ?(?sql.toLowerCase().endsWith( " ?for?update " )?)? {
          ???sql?
          = ?sql.substring(? 0 ,?sql.length() - 11 ?);
          ???isForUpdate?
          = ? true ;
          ??}

          ??
          ??StringBuffer?pagingSelect?
          = ? new ?StringBuffer(?sql.length() + 100 ?);
          ??
          if ?(hasOffset)? {
          ???pagingSelect.append(
          " select?*?from?(?select?row_.*,?rownum?rownum_?from?(? " );
          ??}

          ??
          else ? {
          ???pagingSelect.append(
          " select?*?from?(? " );
          ??}

          ??pagingSelect.append(sql);
          ??
          if ?(hasOffset)? {
          ???pagingSelect.append(
          " ?)?row_?where?rownum?<=??)?where?rownum_?>?? " );
          ??}

          ??
          else ? {
          ???pagingSelect.append(
          " ?)?where?rownum?<=?? " );
          ??}


          ??
          if ?(isForUpdate)?pagingSelect.append( " ?for?update " );
          ??
          ??
          return ?pagingSelect.toString();
          ?}



          ??????? 在OracleDialect中:

          public ?String?getLimitString(String?sql,? boolean ?hasOffset)? {

          ??sql?
          = ?sql.trim();
          ??
          boolean ?isForUpdate? = ? false ;
          ??
          if ?(?sql.toLowerCase().endsWith( " ?for?update " )?)? {
          ???sql?
          = ?sql.substring(? 0 ,?sql.length() - 11 ?);
          ???isForUpdate?
          = ? true ;
          ??}

          ??
          ??StringBuffer?pagingSelect?
          = ? new ?StringBuffer(?sql.length() + 100 ?);
          ??
          if ?(hasOffset)? {
          ???pagingSelect.append(
          " select?*?from?(?select?row_.*,?rownum?rownum_?from?(? " );
          ??}

          ??
          else ? {
          ???pagingSelect.append(
          " select?*?from?(? " );
          ??}

          ??pagingSelect.append(sql);
          ??
          if ?(hasOffset)? {
          ???pagingSelect.append(
          " ?)?row_?)?where?rownum_?<=???and?rownum_?>?? " );
          ??}

          ??
          else ? {
          ???pagingSelect.append(
          " ?)?where?rownum?<=?? " );
          ??}


          ??
          if ?(isForUpdate)?pagingSelect.append( " ?for?update " );
          ??
          ??
          return ?pagingSelect.toString();
          ?}



          ??????? 兩者的區(qū)別主要在于,前者:
          row_ where rownum <= ?) where rownum_ > ?
          后者:
          where rownum_ <= ? and rownum_ > ?

          我模擬了我的出問(wèn)題的查詢(xún),使用前者問(wèn)題重現(xiàn),使用后者不出問(wèn)題.
          另外是,只在升序排序時(shí)才出問(wèn)題,降序則不會(huì).

          我的語(yǔ)句分別如下:
          *************************************************************************
          第一種:

          select ? * ? from ?(

          ?
          select ?rownum?row_num?,t. * ?? from (
          ?
          select ? Sum (b.disp_Count)?,? Sum (b.click_Count)?,?
          ???
          Sum (b.total_Price)?,? Sum (b.return_Cost)?,?
          ???
          avg (b.rank)??,?b.sta_Date???,?b.keyword_Name??,?
          ???b.union_Name??
          ???
          from ?Bid_Report?b??
          ????????
          where ??(b.sta_Date? = ' 20051129 ' )??
          ??????????
          group ? by ??b.sta_Date,??b.keyword_Name,??b.union_Name?
          ??????????
          order ? by ?? Sum (b.click_Count),?b.sta_Date?
          ????????)?t??
          where ?rownum <= 60
          ??)?
          where ?row_num? > ? 40


          (在Hibernate3中,Oracle9Dialect的getLimitString()方法采取類(lèi)似實(shí)現(xiàn)方式)

          第二種:

          select ? * ? from ?(

          ?
          select ?rownum?row_num?,t. * ?? from (
          ?
          select ? Sum (b.disp_Count)?,? Sum (b.click_Count)?,?
          ???
          Sum (b.total_Price)?,? Sum (b.return_Cost)?,?
          ???
          avg (b.rank)??,?b.sta_Date???,?b.keyword_Name??,?
          ???b.union_Name??
          ???
          from ?Bid_Report?b??
          ????????
          where ??(b.sta_Date? = ' 20051129 ' )??
          ??????????
          group ? by ??b.sta_Date,??b.keyword_Name,??b.union_Name?
          ??????????
          order ? by ?? Sum (b.click_Count),?b.sta_Date??
          ????????)?t??
          ??)?
          where ?row_num? <= 60 ? and ?row_num > 40

          (在Hibernate3中,OracleDialect的getLimitString()方法采取類(lèi)似實(shí)現(xiàn)方式)

          **********************************************************************

          現(xiàn)在,問(wèn)題是:為什么采取后者就可以解決問(wèn)題了呢?這是不是Oracle9Dialect的一個(gè)bug呢?!
          哪位高手能給我詳析,感激不盡!!!!

          posted @ 2005-12-30 09:41 南一郎 閱讀(1359) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 闽清县| 榆中县| 长海县| 得荣县| 红原县| 宁津县| 德州市| 桦南县| 道孚县| 安吉县| 衡阳市| 元朗区| 勃利县| 怀安县| 泾源县| 繁峙县| 彭泽县| 虎林市| 朝阳区| 礼泉县| 灵璧县| 阿勒泰市| 都江堰市| 从化市| 昌黎县| 台前县| 西贡区| 吉水县| 拜城县| 新兴县| 固安县| 昌邑市| 保山市| 抚州市| 驻马店市| 鄯善县| 临夏县| 闸北区| 奉贤区| 固镇县| 迁西县|