posts - 9, comments - 5, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2007年11月10日

            隨著Internet網(wǎng)絡(luò)的迅速發(fā)展,基于互聯(lián)網(wǎng)的企業(yè)應(yīng)用要求軟件平臺具有開放性、分布性和平臺無關(guān)性。于是就相繼出現(xiàn)了RPC/COM/CORBA等技術(shù),但這些技術(shù)在實(shí)際應(yīng)用中存在著許多不足和局限。它們的特定協(xié)議難以通過防火墻,因而不適于Web上的應(yīng)用開發(fā)。為了進(jìn)一步開發(fā)基于Web的應(yīng)用,出現(xiàn)了Sun公司的Sun ONE(Open Net Environment 開發(fā)網(wǎng)絡(luò)環(huán)境)和Microsoft公司的.NET等Web 服務(wù)技術(shù)體系。
            Sun ONE體系結(jié)構(gòu)以Java語言為核心,包括J2SE/J2EE/J2ME和一系列的標(biāo)準(zhǔn)、技術(shù)及協(xié)議。它包括Sun獨(dú)有的iPlanet軟件系列,其中有在市場上受歡迎的LDAP目錄服務(wù)器軟件,以及Forte for Java——便于在任何環(huán)境下書寫Java 語言的軟件工具。我們很容易就能從網(wǎng)上免費(fèi)獲得和使用包括Java 集成開發(fā)環(huán)境、Java數(shù)據(jù)庫和中間件(Application Server)服務(wù)器等產(chǎn)品,以及它們的源代碼。Sun ONE更接近或能滿足互聯(lián)網(wǎng)在智能化Web服務(wù)方面對分布性、開發(fā)性和平臺無關(guān)性的要求。

           隨著Java技術(shù)的不斷發(fā)展,它根據(jù)市場進(jìn)一步細(xì)分為:針對企業(yè)網(wǎng)應(yīng)用的J2EE(Java 2 Enterprise Edition)、針對普通PC應(yīng)用的J2SE(Java 2 Standard Edition)和針對嵌入式設(shè)備及消費(fèi)類電器的J2ME(Java 2 Micro Edition)三個版本。本文就Sun ONE的Java核心應(yīng)用——J2SE/J2EE/J2ME作一些介紹。

          J2EE技術(shù)應(yīng)用

           J2EE是Sun公司推出的一種全新概念的模型,比傳統(tǒng)的互聯(lián)網(wǎng)應(yīng)用程序模型更有優(yōu)勢。

          J2EE模型

           J2EE的應(yīng)用編程模型(J2EE Blueprints)提供了一種用于實(shí)施基于J2EE多層應(yīng)用的文檔和實(shí)例套件的體系模型,簡化了這項復(fù)雜的工作。它被開發(fā)人員用作設(shè)計和優(yōu)化組件,以便開發(fā)人員從策略上對開發(fā)工作進(jìn)行分工。

           J2EE應(yīng)用編程模型要求開發(fā)者將自己的工作分成兩類:商業(yè)邏輯和表示邏輯,其余則由系統(tǒng)資源自動處理,不必為中間層管道進(jìn)行編碼。這樣,開發(fā)人員就能將更多的時間花在商業(yè)邏輯和表示邏輯上。對重視縮短項目周期的公司來說,這種轉(zhuǎn)變深受歡迎。

          J2EE平臺

           J2EE平臺是運(yùn)行J2EE應(yīng)用的標(biāo)準(zhǔn)環(huán)境,由J2EE部署規(guī)范(一套所有J2EE平臺產(chǎn)品都必須支持的標(biāo)準(zhǔn))、IETF標(biāo)準(zhǔn)集和CORBA標(biāo)準(zhǔn)組成。最新的J2EE平臺還添加了JavaBean組件模型。開發(fā)人員可以利用JavaBean組件模型來自定義Java類實(shí)例,并可通過已定義的事件訪問Java類。

           J2EE支持EJB,因此開發(fā)人員可以執(zhí)行多用戶交易功能。當(dāng)在J2EE服務(wù)器上運(yùn)行時,Enterprise JavaBeans將應(yīng)用邏輯分成可再利用和可擴(kuò)展的代碼段。Enterprise JavaBeans并不是新特征,但是通過定義標(biāo)準(zhǔn)客戶端和服務(wù)API,J2EE增強(qiáng)了它的能力和可移植性。

           EJB在服務(wù)器的一個容器內(nèi)運(yùn)行,提供所有典型的中間層服務(wù),如事務(wù)管理、安全、遠(yuǎn)程客戶連接、生存周期管理和數(shù)據(jù)庫連接緩沖。為了讓事務(wù)系統(tǒng)在存在EJB容器的情況下運(yùn)行,開發(fā)人員只需在部署描述文件中定義Beans的事務(wù)屬性即可。

           J2EE通過定義一組標(biāo)準(zhǔn)的結(jié)構(gòu)來實(shí)現(xiàn)它的優(yōu)勢,例如:

           1.J2EE Application Programming Model,是一種用于開發(fā)多層次、瘦型客戶用戶程序的標(biāo)準(zhǔn)設(shè)計模型;

           2. J2EE Platform,是一個標(biāo)準(zhǔn)的平臺,用來整合J2EE的應(yīng)用程序,并指定一系列的接口和方法;

           3. J2EE Compatibility Test Suite,是一套兼容測試組件,用來檢測產(chǎn)品是否同J2EE平臺兼容;

           4.J2EE Reference Implementation,用來示范J2EE的能力。

          J2EE服務(wù)器

           Sun的J2EE服務(wù)器通過Java 命名和目錄接口(JNDI)、認(rèn)證、HTTP及與Enterprise JavaBeans兼容的能力,提供命名和目錄服務(wù)。JNDI是Java平臺的一種標(biāo)準(zhǔn)擴(kuò)展版,向企業(yè)內(nèi)的命名和目錄服務(wù)提供具有Java功能的,帶有統(tǒng)一接口的應(yīng)用,包括LDAP。

           J2EE服務(wù)器還利用了Java Servlet技術(shù)。Java Servlet可以看作是運(yùn)行在服務(wù)器上的一個小程序,它向開發(fā)人員提供以組件為基礎(chǔ)創(chuàng)建基于Web應(yīng)用的、獨(dú)立于平臺的方法。它不像利用CGI那樣具有性能局限。Java Servlet是一種擴(kuò)展Web服務(wù)器功能的簡單技巧。由于它是用Java編寫的,因而能夠訪問整個Java API庫,也包括用于訪問企業(yè)數(shù)據(jù)庫的JDBC API。

           JSP是Java Servlet的一種擴(kuò)展。Java Servlet提供開發(fā)和顯示來自服務(wù)器的交互式Web頁。如今JSP又有了進(jìn)一步的改進(jìn),它使得創(chuàng)建和支持靜態(tài)模板和動態(tài)內(nèi)容相結(jié)合的HTML和XML頁面更加容易。

          安全性

           J2EE平臺定義了一種標(biāo)準(zhǔn)的公開存取控制規(guī)則,當(dāng)程序在企業(yè)平臺上開發(fā)時就已被程序師定義和解釋了。J2EE也需要提供一個標(biāo)準(zhǔn)的注冊機(jī)制,以便應(yīng)用程序不會將這些注冊機(jī)制和邏輯相混合,從而使相同的工作執(zhí)行于大量的不同環(huán)境中時并不需要改變源代碼。例如:J2EE應(yīng)用程序開發(fā)人員可以指定幾個安全級別,當(dāng)用戶訪問數(shù)據(jù)時,他們可寫出代碼來檢查當(dāng)前用戶權(quán)限的級別。在開發(fā)階段,開發(fā)人員賦予多組用戶適當(dāng)?shù)陌踩墸箲?yīng)用程序在執(zhí)行限制操作之前能夠容易的判斷限制級。

           J2EE 平臺是Java技術(shù)企業(yè)級應(yīng)用的最佳平臺,它可以讓程序員迅速、快捷地開發(fā)和分布企業(yè)級應(yīng)應(yīng)用程序。以下便是它的相關(guān)技術(shù):

           1.Enterprise JavaBeans Architecture,企業(yè)級JavaBeans 定義了一個應(yīng)用程序接口。它可以使程序員迅速開發(fā)、發(fā)布和管理跨平臺的、基于組件的企業(yè)級應(yīng)用程序。

           2.JavaServer Pages,JSP 技術(shù)提供了一種簡單、快速的方法來創(chuàng)建動態(tài)網(wǎng)頁。通過它,可以快速地開發(fā)基于Web的應(yīng)用程序,并且這些應(yīng)用程序都是與平臺無關(guān)的。因為JSP與ASP很相似,所以熟悉ASP的人學(xué)習(xí)它就很容易了。

           3.Java Servlet,提供了應(yīng)用程序接口。通過它可以簡單快速地開發(fā)并擴(kuò)展服務(wù)器功能。就發(fā)展趨勢來看,它將來有可能取代CGI。

           4.J2EE Connector,提供了一種標(biāo)準(zhǔn)結(jié)構(gòu)來聯(lián)接不同的企業(yè)信息平臺。

           5.Java Naming and Directory Interface(JNDI),在Java 平臺與商業(yè)信息之間,JNDI提供了統(tǒng)一、無縫的標(biāo)準(zhǔn)化連接。通過使用JNDI,程序員可以在企業(yè)多命名與目錄服務(wù)之間傳送Java 應(yīng)用程序。

           6.Java Interface Definition Language(JIDL),通過使用CORBA,可以提供協(xié)同工作的能力。JIDL包括一個IDL-to-Java 編譯器和支持IIOP(Internet Inter-Orb Protocol)的ORB。

           7.JDBC,幾乎是為所有的數(shù)據(jù)庫提供了統(tǒng)一的接口,同時可以創(chuàng)建高級工具和接口。

           8.Java Message Service(JMS),它幾乎規(guī)范了所有企業(yè)級消息服務(wù),如可靠查詢、發(fā)布消息、訂閱雜志等各種各樣的PUSS/PULL技術(shù)的應(yīng)用,并且為它們提供了一個標(biāo)準(zhǔn)接口。

           9.Java Transaction API(JTA),為分布式系統(tǒng)中可處理的應(yīng)用程序規(guī)定了一個高級的管理規(guī)范。

           10.JavaMail,JavaMail應(yīng)用程序接口提供了一整套模擬郵件系統(tǒng)的抽象類。通過JavaMail,可以創(chuàng)建郵件或消息應(yīng)用程序。

           11.RMI-IIOP,使用它就可以只用Java 技術(shù)和Java RMI接口開發(fā)客戶機(jī)與服務(wù)器的遠(yuǎn)程接口。

           J2EE使用固定的文件格式捆綁某個模塊:用.ear文件捆綁J2EE應(yīng)用程序;用.jar捆綁Enterprise Bean。例如,一個.ear文件包含一個.xml文件作為其分布描述,還包含一個或多個.jar和.war文件;一個.jar文件除了包含它的分布描述外,還包含了作為Enterprise bean的.class文件。

           J2EE應(yīng)用程序的開發(fā)階段分為四步:1.Enterprise Bean創(chuàng)建;2.Web Component創(chuàng)建;3.J2EE應(yīng)用程序裝配;4.J2EE應(yīng)用程序分布。以下是J2EE兼容產(chǎn)品部分列表:

           BEA WebLogic Server 6.0、Borland App Server、HP Bluestone Total-e-Server、IBM WebSphere Application Server、IONA iPortal Application Server、iPlanet Application Server、Macromedia JRun Server、Oracle 9i Application Server、SilverStrean Application Server、Sybase EAServer、TogetherSoft ControlCenter、Java 2 SDK Enterprise Edition。

          J2ME技術(shù)的應(yīng)用

           J2ME(Java 2 Platform Micro Edition)是為無線電子市場所設(shè)計的,包括JVM規(guī)范和API規(guī)范。其API規(guī)范是基于J2SE(Java 2 Standard Editon)的。J2ME 定義了一套合適的類庫和虛擬機(jī)技術(shù)。這些技術(shù)可以使用戶、服務(wù)提供商和設(shè)備制造商通過物理(有線)連接或無線連接,按照需要隨時使用豐富的應(yīng)用程序。

           J2ME又被稱為Java 2 微型版,被使用在各種各樣的消費(fèi)電子產(chǎn)品上,例如智能卡、手機(jī)、PDA、電視機(jī)頂盒等方面。當(dāng)然了,J2ME也提供了Java語言一貫的特性,那就是跨平臺和安全網(wǎng)絡(luò)傳輸。它使用了一系列更小的包,而且Javax.microedition.io 為J2SE包的子集。J2ME可以升級到J2SE和J2EE。

           在J2ME出現(xiàn)之前,我們更多接觸到的是Java卡(Java Card)、嵌入式Java(Embedded Java)和實(shí)時Java(Real Time Java)等。其中Java卡是針對SIM卡、智能卡等設(shè)備而定制的最小Java子集,比J2ME還要小,移植性也不強(qiáng)。嵌入式Java則針對特殊用戶自行配置Java類庫和VM(Virtual Machine,虛擬機(jī))。它對資源需求極小,可運(yùn)行在無圖形用戶接口和網(wǎng)絡(luò)的設(shè)備上,可以添加用戶專用的API,但是它就無法移植。實(shí)時Java是由IBM領(lǐng)導(dǎo)的實(shí)時定制Java專家組負(fù)責(zé)實(shí)施的,現(xiàn)在還在不斷完善中。不過,從嚴(yán)格意義上來說,它們都不是真正的J2ME。

           像其它版本一樣,J2ME具有很多Java技術(shù)特性,主要有:

           1.可以在各種支持Java的設(shè)備上運(yùn)行;

           2.代碼短小;

           3.充分利用Java語言的優(yōu)勢;

           4.安全性好;

           5.用J2ME實(shí)現(xiàn)的應(yīng)用可以方便地升級到J2SE、J2EE。

          J2ME的配置和框架

           為了支持用戶和嵌入式市場提出的靈活性和可定制性要求,J2ME被設(shè)計得更加模塊化和可縮放化。J2ME在設(shè)備原有的操作系統(tǒng)上建造了3層軟件來實(shí)現(xiàn)這種要求:

           1.JVM層,這層基于宿主操作系統(tǒng),按照某一種J2ME的配置,實(shí)現(xiàn)了JVM。

           2.配置層,這層對于用戶可見度要低一些,但對框架層非常重要。它針對“水平”市場的需求,定義了Java虛擬機(jī)的最小功能集和Java類庫的最小集合。在某種意義上,配置層定義了開發(fā)者在所有設(shè)備上都可以使用Java特性和類庫的“最小公分母”。

           3.框架層,這層對于用戶和應(yīng)用程序提供者來說是最常見的。它針對“垂直”市場的需求,定義了Java虛擬機(jī)的最小功能集和Java類庫的最小集合。其框架是基于特定的配置層實(shí)現(xiàn)的。只要設(shè)備支持相同的框架層,針對特定框架層開發(fā)的應(yīng)用程序就可以移植到其它設(shè)備上。一個設(shè)備可以支持多個框架層。

           在J2ME設(shè)備中,JVM與配置層緊密相連,它們體現(xiàn)了每一類設(shè)備的基本功能。框架層針對不同的設(shè)備,在配置層的基礎(chǔ)上規(guī)定了附加的API。為了滿足不斷更新的應(yīng)用程序,框架層可以擴(kuò)充新的Java庫類。在不遠(yuǎn)的將來,隨著新設(shè)備的不斷出現(xiàn),J2ME技術(shù)將提供范圍廣泛的框架層、配置層和VM。JCP(Java Community Process)可以為客戶和開發(fā)商提供規(guī)范。根據(jù)JCP的定義,J2ME目前的一種配置層是“面向連接的設(shè)備配置”層(Connected Device Configuration),它采用典型的Java虛擬機(jī)技術(shù)。這種全功能的VM包含了基于臺式機(jī)系統(tǒng)上的虛擬機(jī)的所有功能,適用于擁有至少幾兆字節(jié)內(nèi)存的設(shè)備。對于無線設(shè)備和其它內(nèi)存不足的設(shè)備,J2ME采用“面向連接的受限設(shè)備配置”(CLDC)技術(shù)。

           KVM是J2ME的核心特征。它是一個可移植性非常高的JVM,專用于內(nèi)存小、資源有限、能上網(wǎng)的設(shè)備,例如蜂窩電話、尋呼機(jī)和個人組織器等。這些器件一般都含有16或32位的處理器,最低128KB內(nèi)存。KVM能夠被靈活應(yīng)用到各種行業(yè)、各種類型的設(shè)備上,并能夠適應(yīng)這些設(shè)備的多樣化所帶來的問題,比如處理器的耗電量、內(nèi)存的大小、設(shè)備和應(yīng)用程序的特殊功能等問題。

          CLDC技術(shù)

           CLDC定義了目標(biāo)Java平臺,該平臺基于小型的、資源較少的、內(nèi)存僅有160~512K的設(shè)備。CLDC是由KVM和用在蜂窩電話、數(shù)字產(chǎn)品、雙向?qū)ず魴C(jī)、個人組織器和家用電器等核心庫類及接口組成。使用CLDC技術(shù)有很多優(yōu)點(diǎn):

           1.跨平臺,這點(diǎn)保留了Java一貫的特點(diǎn),應(yīng)用程序不會隨著平臺差異而產(chǎn)生變化。

           2.動態(tài)性,這點(diǎn)也是很吸引人的,可以根據(jù)需要下載自己喜歡的應(yīng)用程序和服務(wù),并且可以和其它的CLDC設(shè)備通信。

           3.安全性,Java 本身的特點(diǎn)造就了這一特性。

           與 J2SE相比,CLDC缺少下列所說的特征:

           1.AWT(抽象窗口開發(fā)包),Swing或其它圖形庫;

           2.用戶定義類裝載器;

           3.類實(shí)例的最終化;

           4.弱的引用;

           5.RMI;

           6.Reflection(映射)。

           CLDC有四個包:java.lang、java.util、java.io和javax.microedition。除了javax.microedition包以外,其它的幾個包都是J2SE包的核心子集。CLDC采用這些J2SE類庫,但是把其中一些在微型設(shè)備中用不到類、屬性和方法去掉了。

           J2ME定義兩個配置:Connected Device Configuration(連接設(shè)備配置,CDC)和限制性更強(qiáng)的Connected Limited Device Configuration(有限連接設(shè)備配置,CLDC)。

          J2SE技術(shù)的應(yīng)用

           Java 2標(biāo)準(zhǔn)版是一種開發(fā)和部署平臺,提供了編寫桌面、工作站應(yīng)用程序所有必需的功能。J2SE軟件是快速開發(fā)、部署關(guān)鍵任務(wù)和企業(yè)應(yīng)用程序的首選解決方案。J2SE 1.4版本是基于Java跨平臺技術(shù)和強(qiáng)有力的安全模塊而開發(fā)的,其最新的特征和功能極大地提高了Java語言的伸縮性、靈活性、適用性,以及可靠性。

           J2SE 1.4 特點(diǎn):

           1.良好的計算性能和縮放能力。

           J2SE 1.4版是一個快速開發(fā)和配置跨平臺的企業(yè)級應(yīng)用與服務(wù)的綜合性平臺。它提升了Java計算的性能與縮放能力,代表了Java技術(shù)的大跨步進(jìn)展。有了J2SE 1.4版,企業(yè)就可以通過更簡易的步驟、花費(fèi)更少的時間,采用Java技術(shù)開發(fā)與配置要求更高的應(yīng)用了。J2SE 1.4版在Java客戶機(jī)應(yīng)用方面得到了重大性能提升。基于Swing的Java小程序和應(yīng)用程序在圖形用戶界面(GUI)的響應(yīng)速度上也大有提高。

           2.跨平臺

           J2SE 1.4版是一個具有綜合性能的平臺,能使一個完整的、可縮放的高性能應(yīng)用配置在任何種類的平臺上。

           3.支持Web服務(wù)

           J2SE 1.4版與以前各J2SE版全面兼容。J2SE 1.4版對SSL、LDAP和CORBA等業(yè)界標(biāo)準(zhǔn)技術(shù)也給予支持,因此保證了在不同平臺、系統(tǒng)和環(huán)境間的互操作能力。J2SE 1.4版支持XML技術(shù)和一整套安全服務(wù),因此為基于各類標(biāo)準(zhǔn)的可互操作應(yīng)用與服務(wù)的創(chuàng)建奠定了重要基礎(chǔ)。有了J2SE 1.4版與Java Web Services Developer Pack的結(jié)合,開發(fā)商就能創(chuàng)建、測試和配置Web服務(wù)了。

           4.完整性

           J2SE 1.4版還是一個完整的開發(fā)環(huán)境。開發(fā)商可基于這一環(huán)境創(chuàng)建功能豐富的交互式應(yīng)用。這些應(yīng)用可以配置在任何平臺上。J2SE 1.4具有新的GUI控制功能、快速的Java 2DT圖形功能、支持國際化與本地化擴(kuò)展和新的配置選項,并對Windows XP提供擴(kuò)展支持。

           總之,J2SE 1.4版是多種不同風(fēng)格軟件的開發(fā)基礎(chǔ),包括客戶端Java小程序和應(yīng)用程序,以及獨(dú)立的服務(wù)器應(yīng)用程序等。J2SE 1.4版還是J2ME的基礎(chǔ),是J2EE執(zhí)行程序的推動力。

           Java之所以能夠發(fā)展得很快,是因為互聯(lián)網(wǎng)的發(fā)展非常快。Java可以和瀏覽器結(jié)合在一起,因而很自然地在桌面系統(tǒng)得到廣泛應(yīng)用。從計算的結(jié)構(gòu)來看,Java主要分三大類:第一是服務(wù)器端,這里就有了J2EE企業(yè)版;第二是桌面PC,這一類用的是J2SE標(biāo)準(zhǔn)版;第三就是掌上電腦、移動設(shè)備,用的都是J2ME。但是,大部分非企業(yè)級軟件還是在J2SE上開發(fā)的比較多。首先,這是因為很多的應(yīng)用軟件都是在J2SE上開發(fā)的;其次,J2SE是和J2EE兼容的,企業(yè)版是在標(biāo)準(zhǔn)版上的擴(kuò)充,在J2SE的版本上開發(fā)的軟件,拿到企業(yè)的平臺上是一樣可以運(yùn)行的;再次,一般開發(fā)還是在J2SE的環(huán)境上,只是說J2ME提供微型版的一個環(huán)境。在J2SE上虛擬出一個環(huán)境,開發(fā)出來的應(yīng)用軟件是可以拿到微型版上運(yùn)行的。

          posted @ 2007-11-22 13:57 代林 閱讀(1417) | 評論 (0)編輯 收藏

          ArgoUML

          使用java編寫的開源UML產(chǎn)品,功能比較全。最受歡迎的UML建模工具。

          Alma

          Alma是一個軟件建模分析的工作平臺,它讀取幾種不同的源代碼,幫你設(shè)計面向?qū)ο竦哪P停薷慕Y(jié)構(gòu)和源代碼,輸出新的源代碼、文檔和圖表。

          UMLet

          UMLet是一個開放源代碼輕量級UML建模工具。UMLet能夠讓你快速建模,并且能夠?qū)С龈鞣N格式SVG, JPG, PDF and LaTeX-friendly EPS。

          UML/Dot

          UML/Dot這個項目從Java源代碼或字節(jié)碼中生成UML類。使用GraphViz Dot生成圖表。用戶可以完全控制處理過程,可以隱藏或顯示任意提取的元素。需要:JAVA v1.4 或更高版本,GraphViz。

          JUG

          Java UML Generator 是用于從Java類文件自動生成UML類圖的工具。最初設(shè)計為一個命令行工具,將.class/.jar文件轉(zhuǎn)換到.emf/.eps文件,現(xiàn)在它提供了一個可視化環(huán)境。

          Violet

          Violet是一種輕量級的UML建模工具。易學(xué)易用 可以快速繪制類圖、對象圖、時序圖和狀態(tài)圖 跨平臺 支持中文 源碼開放

          UMLGraph

          UMLGraph支持說明性規(guī)約(Declarative Specification),類圖(Class Diagram) ,順序圖(Sequence Diagrams).

          Fujaba Tool Suite

          Fujaba Tool Suite結(jié)合UML類圖與UML行為視圖來提供一個強(qiáng)大,易于使用,而且是整齊均稱的系統(tǒng)設(shè)計與規(guī)范語言. 而且Fujaba Tool Suite還支持從整個系統(tǒng)設(shè)計生成Java源代碼從完美地實(shí)現(xiàn)了一個可執(zhí)行的模型.同樣也支持相反操作,因此源代碼可以被解析并被表現(xiàn)在UML中.

          UniMod

          UniMod是Executable UML思想的實(shí)現(xiàn)。UniMod是以Eclipse插件形式存在。可以通過UniMod提供的一個在線Demo了解更多的詳細(xì)資料。

          Taylor MDA

          Taylor MDA是一個基于Eclipse的UML建模工具。它專注于EJB3企業(yè)應(yīng)用程序的生成。Taylor MDA當(dāng)前支持生成:

          • EJB3 Entity Beans
          • EJB3 Stateless Session Beans
          • 利用JBoss內(nèi)置容器的JUnit Tests
          • Maven Project
          • 以后將支持生成:
          • 用于CRUD Portlets的Seam代碼
          • 用于商業(yè)處理與頁面流(page flows)的jBPM/Seam代碼

          StarUML

          StarUML是一個運(yùn)行在Win32上快速,靈活,可擴(kuò)展,功能強(qiáng)大的UML/MDA平臺。開源項目StarUML的目的是提供一個可以用來代替知名商業(yè)UML工具比如Rational Rose,Together等的建模工具和平臺。

          Quick Sequence Diagram Editor

          這個簡單的工具能夠利用對像與信息的描述文本來生成UML時序圖。它采用Java5開發(fā)并打包成一個可執(zhí)行的Jar文件。

          TinyUML

          TinyUML是一個能夠幫助你快速和輕松地繪制UML2圖的開源工具。采用Java5開發(fā)。

          Papyrus

          Papyrus是一個基于Eclipse平臺UML2建模工具。遵從Eclipse UML2、支持由OMG規(guī)定的UML2標(biāo)準(zhǔn)和DI2 (Diagram Interchange)標(biāo)準(zhǔn)、Papyrus的整個架構(gòu)是可擴(kuò)展的允許用戶增加新的圖樣(diagram)和新的代碼生成器等、支持UML2 Profile開發(fā)、嵌套Profile支持等。

           

          posted @ 2007-11-14 10:17 代林 閱讀(2883) | 評論 (2)編輯 收藏

          Struts 運(yùn)行環(huán)境

          1.1 Struts 1.0 和1.1版本

          當(dāng)前主要有兩個版本,struts 1.0 release 和 struts 1.1 beta 3。Struts 1.0 和1.1差別很大,主要有兩點(diǎn):

          • Struts 1.1 中引用了很多 apache其他項目的類包,如:xml 解析、日志、驗證等,因此struts1.1 的包結(jié)構(gòu)與1.0 完全不同。在struts 1.1環(huán)境下,一個webapp 要成功運(yùn)行,除了struts.jar 外,還需要引用12個包。
          • Struts 1.1 增加了很多新功能,例如,支持sub-applications, 動態(tài)FormBean,異常處理,驗證,支持Tile templating等。

          盡管struts 1.0 是正式發(fā)布版,但是結(jié)構(gòu)已經(jīng)老化,功能也已經(jīng)固化。所以我們的Framework不選用struts 1.0, 而選用 struts 1.1。

          1.2支持struts的應(yīng)用服務(wù)器

          根據(jù)apache官方網(wǎng)站的說法,struts幾乎支持所有的servlet containers, 下面是幾種主要的servlet containers

          Servlet Container

          版本

          iPlanet Application Server 6.0sp2 or higher, 6.5
          Tomcat 3.2.x, 4.0 or higher
          Weblogic 6.0 or higher
          Websphere 3.5 or higher
          Orion 1.0 or higher
          Resin 1.2 or higher
          JRun 3.0 or higher

          1.3配置說明

          我們公司目前項目中使用較多的應(yīng)用服務(wù)器是iPlanet Application Server, Tomcat。Struts 1.1 在這兩個應(yīng)用服務(wù)器下已經(jīng)配置通過。

          Tomcat 與struts結(jié)合的很好,只需要將xxx.war 放到 webapp 目錄下,啟動Tomcat 即可,不需要其他額外的配置。

          iPlanet 配置復(fù)雜一些,主要原因是xml parser 版本不一致,和struts 相關(guān)類不能加載。具體的配置說明請見《如何在 iAS 6.x 中配置Struts 1.1 beta x》。

          在其他的應(yīng)用服務(wù)器上,還沒有嘗試struts, 今后根據(jù)項目需要會作進(jìn)一步的研究。

          struts框架

          2.1 struts 體系結(jié)構(gòu)

          struts framework是MVC 模式的體現(xiàn),下面分別從模型、視圖、控制來看看struts的體系結(jié)構(gòu)(Architecture)。下圖顯示了struts framework的體系結(jié)構(gòu)響應(yīng)客戶請求時,各個部分工作的原理。


          Struts體系結(jié)構(gòu)


           

          2.1.1 從視圖角度(View)

          主要由JSP建立,struts自身包含了一組可擴(kuò)展的自定義標(biāo)簽庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags。

          2.1.2從模型角度(Model)

          模型主要是表示一個系統(tǒng)的狀態(tài)(有時候,改變系統(tǒng)狀態(tài)的業(yè)務(wù)邏輯操作也也劃分到模型中)。在Struts中,系統(tǒng)的狀態(tài)主要有ActiomForm Bean體現(xiàn),一般情況下,這些狀態(tài)是非持久性的。如果需要將這些狀態(tài)轉(zhuǎn)化為持久性數(shù)據(jù)存儲,Struts本身也提供了Utitle包,可以方便的與數(shù)據(jù)庫操作。

          2.1.3 從控制器角度(Controller)

          在Struts framework中, Controller主要是ActionServlet,但是對于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協(xié)調(diào)完成。其中,Action扮演了真正的業(yè)務(wù)邏輯的實(shí)現(xiàn)者,而ActionMapping和ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。

          2.2 struts 的組件

          框架中所使用的組件:

          ActionServlet 控制器
          ActionClass 包含事務(wù)邏輯
          ActionForm 顯示模塊數(shù)據(jù)
          ActionMapping 幫助控制器將請求映射到操作
          ActionForward 用來指示操作轉(zhuǎn)移的對象
          ActionError 用來存儲和回收錯誤
          Struts標(biāo)記庫 可以減輕開發(fā)顯示層次的工作

          2.3 struts 配置文件

          Struts-config.xml集中了所有頁面的導(dǎo)航定義。對于WEB項目,通過配置文件可迅速把握其脈絡(luò),這不管是對于前期的開發(fā),還是后期的維護(hù)或升級都是方便的。掌握Struts-config.xml是掌握Struts的關(guān)鍵所在。

          在struts的早先版本中,只有一個struts配置文件struts-config.xml。但是,對大型項目來說,使用和修改這個配置文件,會成為瓶頸。在struts1.1中,支持sub-Application ,可以定義多個配置文件協(xié)同工作。

          通過struts配置文件struts-config.xml 將struts各個組件聯(lián)系在一起。在struts-config.xml 中可以定義下面內(nèi)容:

          • 全局轉(zhuǎn)發(fā)
          • ActionMapping類
          • ActionForm bean
          • JDBC數(shù)據(jù)源

          2.3.1 配置全局轉(zhuǎn)發(fā)

          全局轉(zhuǎn)發(fā)用來在JSP頁之間創(chuàng)建邏輯名稱映射。全局轉(zhuǎn)發(fā)的例子:

          <global-forwards>

          <forwardname="logoff"path="/logoff.do"/>

          <forwardname="logon"path="/logon.jsp"/>

          <forwardname="registration"path="/registration.jsp"/>

          <forwardname="success"path="/mainMenu.jsp"/>

          </global-forwards>

          屬性 描述
          Name 全局轉(zhuǎn)發(fā)的名字
          Path 與目標(biāo)URL的相對路徑

          2.3.2 配置ActionMapping

          ActionMapping對象幫助進(jìn)行框架內(nèi)部的流程控制,它們可將請求URI映射到Action類,并且將Action類與ActionForm bean相關(guān)聯(lián)。ActionServlet在內(nèi)部使用這些映射,并將控制轉(zhuǎn)移到特定Action類的實(shí)例。所有Action類使用perform()或者execute()方法實(shí)現(xiàn)特定應(yīng)用程序代碼,返回一個ActionForward對象,其中包括響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)頁面名稱。例如:

          <action-mappings>

          <actionpath="/logon"

          type="org.apache.struts.webapp.example.LogonAction"

          name="logonForm"

          scope="session"

          input="logon">

          </action>

          <forward name="failure" path="/error.jsp"/>

          <forward name="success" path="/index.jsp"/>

          </ action-mappings>

          屬性

          描述

          Path

          Action類的相對路徑

          Name

          與本操作關(guān)聯(lián)的Action bean的名稱

          Type

          連接到本映射的Action類的全稱(可有包名)

          Scope

          ActionForm bean的作用域(請求或會話)

          Prefix

          用來匹配請求參數(shù)與bean屬性的前綴

          Suffix

          用來匹配請求參數(shù)與bean屬性的后綴

          attribute

          作用域名稱。

          className

          ActionMapping對象的類的完全限定名默認(rèn)的類是org.apache.struts.action.ActionMapping

          input

          輸入表單的路徑,指向bean發(fā)生輸入錯誤必須返回的控制

          unknown

          設(shè)為true,操作將被作為所有沒有定義的ActionMapping的URI的默認(rèn)操作

          validate

          設(shè)置為true,則在調(diào)用Action對象上的perform()方法前,ActionServlet將調(diào)用ActionForm bean的validate()方法來進(jìn)行輸入檢查

          通過<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應(yīng)要轉(zhuǎn)發(fā)的目標(biāo)。

          屬性 描述
          Id ID
          ClassName ActionForward類的完全限定名,默認(rèn)是org.apache.struts.action.ActionForward
          Name 操作類訪問ActionForward時所用的邏輯名
          Path 響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)資源的路徑
          redirect 若設(shè)置為true,則ActionServlet使用sendRedirect()方法來轉(zhuǎn)發(fā)資源

          2.3.3 配置ActionForm Bean

          ActionServlet使用ActionForm來保存請求的參數(shù),這些bean的屬性名稱與HTTP請求參數(shù)中的名稱相對應(yīng),控制器將請求參數(shù)傳遞到ActionForm bean的實(shí)例,然后將這個實(shí)例傳送到Action類。例子:

          <form

          beans >

          <form

          bean name="bookForm" type="BookForm"/>

          </form

          beans>

          屬性

          描述

          Id

          ID

          className

          ActionForm bean的完全限定名,默認(rèn)值是org.apache.struts.action.ActionFormBean

          Name

          表單bean在相關(guān)作用域的名稱,這個屬性用來將bean與ActionMapping進(jìn)行關(guān)聯(lián)

          Type

          類的完全限定名

          2.3.4 配置JDBC數(shù)據(jù)源

          例子:

          <data-sources>

          <data-source>

          <set-property property="autoCommit"

          value="false"/>

          <set-property property="description"

          value="Example Data Source Configuration"/>

          <set-property property="driverClass"

          value="org.postgresql.Driver"/>

          <set-property property="maxCount"

          value="4"/>

          <set-property property="minCount"

          value="2"/>

          <set-property property="password"

          value="mypassword"/>

          <set-property property="url"

          value="jdbc:postgresql://localhost/mydatabase"/>

          <set-property property="user"

          value="myusername"/>

          </data-source>

          </data-sources>

          屬性 描述
          description 數(shù)據(jù)源的描述
          autoCommit 數(shù)據(jù)源創(chuàng)建的連接所使用的默認(rèn)自動更新數(shù)據(jù)庫模式
          driverClass 數(shù)據(jù)源所使用的類,用來顯示JDBC驅(qū)動程序接口
          loginTimeout 數(shù)據(jù)庫登陸時間的限制,以秒為單位
          maxCount 最多能建立的連接數(shù)目
          minCount 要創(chuàng)建的最少連接數(shù)目
          password 數(shù)據(jù)庫訪問的密碼
          readOnly 創(chuàng)建只讀的連接
          User 訪問數(shù)據(jù)庫的用戶名
          url JDBC的URL

          通過指定關(guān)鍵字名稱,Action類可以訪問數(shù)據(jù)源,比如:

          javax.sql.DataSource ds = servlet.findDataSource(“conPool”);

          javax.sql.Connection con = ds.getConnection();

          struts標(biāo)記庫

          struts 標(biāo)記庫包含4種類型的標(biāo)記,分別是:

          • struts-bean taglib:在訪問bean和bean屬性時使用的tag,也包含一些消息顯示的tag。
          • struts-html taglib:用來生成動態(tài)HTML用戶界面和窗體的tag。
          • struts-logic taglib :用來管理根據(jù)條件生成輸出文本,和其它一些用來控制的信息。
          • struts-template taglib:用來定義模板機(jī)制。

          Struts提供了功能強(qiáng)大的Taglib,充分使用這些Tag,能最大限度的發(fā)揮Struts的作用。

          由于標(biāo)記庫功能強(qiáng)大,所以掌握它需要花費(fèi)一定的時間。目前我們可以先從 struts-html taglib 學(xué)起,主要精力還是要先放在理解掌握struts導(dǎo)航功能上。

          文檔《struts 標(biāo)記庫》可以幫助學(xué)習(xí)掌握struts taglib.

          可視化設(shè)計工具和代碼生成器Camino

          Camino 是基于 struts framework的可視化建模工具。使用camino 可以實(shí)現(xiàn)快速設(shè)計和開發(fā),主要特點(diǎn)有:

          • 支持struts 1.0 和 struts 1.1
          • 通過storyboard , 可視化定義頁面導(dǎo)航流程,配置struts-config.xml 文件。
          • Jsp converter wizard 功能可以將普通jsp 轉(zhuǎn)換成帶struts-html taglib 的jsp
          • Code Generator wizard 功能可以自動生成 Action 和 FormBean 類的框架。
          • Camin 3.0 還提供了驗證器和Preview Jsp 的功能。

          目前Camino的版本有2.05 和 3.0, 可以下載試用版。Camino 自帶了幫助文檔,可以方便學(xué)習(xí)Camino。

          Struts example

          Struts 1.1 beta 3 的包中包含了幾個example, 可以幫助學(xué)習(xí)struts。

          Web應(yīng)用程序 描述
          Struts-blank.war 一個簡單的web應(yīng)用程序
          Struts-documentation.war 包含struts站點(diǎn)上所有struts文檔
          Struts-example.war Struts很多特性的示范
          Struts-exercisetaglib.war 主要用于對自定義標(biāo)簽庫進(jìn)行增加而使用的測試頁,但也可以示范如何使用struts標(biāo)記
          Struts-template.war 包含struts模板標(biāo)記的介紹和范例
          Struts-upload.war 一個簡單的例子,示范如何使用struts框架上傳文件

          在Tomcat 4.1.18運(yùn)行環(huán)境下,只需要將 xxx.war 文件放到webapps 目錄下,啟動Tomcat 即可。

          建議從struts-example 開始學(xué)習(xí),熟讀struts-config.xml, jsp, 和 java 源碼。

          6、統(tǒng)一的IDE工具: eclipse

          Eclipse 是由IBM支持的開發(fā)源碼的IDE, 目前的最新版本是2.1。與Netbeans, JBuilder相比,由以下特點(diǎn):

          • 界面設(shè)計精細(xì),布局合理,秉承了IBM的風(fēng)格。
          • 功能齊全,具備了Netbeans, JBuilder(Enterprice fetature 除外)大部分功能,還有一些特有的功能,如:代碼歷史記錄比較、替換,代碼重構(gòu),自動生成get,set方法, 小組協(xié)作方式的版本控制和權(quán)限控制。
          • 速度快,執(zhí)行一個代碼格式化(14,000行)的操作,要比Netbeans快百倍以上。
          • 功能強(qiáng)大的plug-in,可以與Ant, JUnit, Tomcat集成。將來我們也可以編寫自己的插件,有增強(qiáng)功能的潛力。

          目前,每個項目使用的開發(fā)工具都不同,有JBuilder, Netbeans等。從長遠(yuǎn)考慮應(yīng)該采用開發(fā)源碼的IDE, 不存在盜版問題。現(xiàn)在開發(fā)源碼的IDE有Netbeans, Eclipse兩大陣營,分別由Sun 和 IBM支持。綜合上面的Eclipse特性,我推薦統(tǒng)一使用Eclipse。

          7、參考資料

          • 網(wǎng)站:

            struts 官方網(wǎng)站:http://jakarta.apache.org/struts

            struts resource : http://jakarta.apache.org/struts/resources/index.html

            Camino 網(wǎng)站:http://www.scioworks.com/index.html

            其他網(wǎng)站:http://husted.com/struts/

            http://struts.application-servers.com/main.html

            http://www.synthis.com/products/architectures/struts/index.jsp

          • 文章:

            《struts框架詳細(xì)介紹》 - ppt 文檔,描述了struts 框架

            《struts-intro》- ppt 文檔,其中的struts 導(dǎo)航流程圖非常好。

            《Using Struts》 - ppt 文檔,概述了struts 框架和組成

            《如何在 iAS 6.x 中配置Struts 1.1 beta x》- 講述在iPlanet 6.x 如何配置 struts 1.1

            《Struts標(biāo)記庫》 - 詳細(xì)介紹了struts taglib的使用

            《struts turorial》 - 一個網(wǎng)上購書的示例,詳細(xì)講解了struts使用步驟

          posted @ 2007-11-10 17:25 代林 閱讀(2152) | 評論 (2)編輯 收藏

          2005 年的時候幫人收集整理修改的一份腳本級聯(lián)菜單, 沒用到 AJAX, 寫死的數(shù)據(jù). 效果自己試試就知道了. 支持主流瀏覽器. 自己現(xiàn)在看看這代碼就覺得頭大... 呵呵 腳本就是腳本啊. 一段時間放下就看不懂了.

          <HTML>
          <HEAD>
          <TITLE>合同申請</TITLE>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
          <SCRIPT LANGUAGE = JavaScript>
          /** Define object Dsy 構(gòu)造器
          fieldValues - 三個表單域的名稱, 可以通過 request.getParameter(xxx) 取值
          defalutOptions - 默認(rèn)選項
          */
          function Dsy(fieldValues, defalutOptions){
            this.Items = {};
            this.defalutOptions = defalutOptions;// 默認(rèn)選項 
            this.fieldValues = fieldValues;// 三個表單域的名稱
          }

          Dsy.prototype.add = function(id, iArray){
            this.Items[id] = iArray;
          }

          Dsy.prototype.Exists = function(id){
            if (typeof(this.Items[id]) == "undefined")
              return false;
            return true;
          };

          Dsy.prototype.setup = function() {
              this.bean_change(0);
          }

          // This prototype method added by BeanSoft Studio
          Dsy.prototype.bean_change = function(v){
            var str = "0";
            for (i = 0; i < v; i++){
              str += ("_" + (document.getElementById(this.fieldValues[i]).selectedIndex - 1));
            };

            var ss = document.getElementById(this.fieldValues[v]);
            // Avoid a null exception
            if(ss == null) return;

              with(ss){
                length = 0;
                options[0] = new Option(this.defalutOptions[v], this.defalutOptions[v]);
                if (v && document.getElementById(this.fieldValues[v - 1]).selectedIndex > 0 || !v){
                  if (this.Exists(str)){
                    array = this.Items[str];
                    for (i = 0; i < array.length; i++)
                      options[length] = new Option(array[i], array[i]);
                    if (v)
                      options[1].selected = true;
                  }
                }

                if (++v < s.length){
                  this.bean_change(v);
                }
              }
          }

            function change(v){   
              dsy.bean_change(v);// Call test prototype
            }

            // Write form data string, 輸出表單腳本代碼
            // dsy, object name
            // varName, 變量名
            function toString(dsy, varName) {
              var str = "";
              for(i = 0; i < dsy.fieldValues.length; i++) {
                  str += "<select id=\"" + dsy.fieldValues[i] + "\" onChange=\"" + varName + ".bean_change(" + (i + 1)
                      + ");\"></select>\r\n";
              }
              str += "<br/>";
              return str;
            }

          // 第一個對象
            var dsy = new Dsy(["s1", "s2", "s3"], ["銷售方名稱", "銷售方聯(lián)系人", "聯(lián)系電話"]);
            var dsy1 = new Dsy(["s4", "s5", "s6"],  ["最終用戶名稱", "最終用戶聯(lián)系人", "聯(lián)系電話"]);
            var dsy2 = new Dsy(s = ["s7", "s8", "s9"], ["廠商", "廠商銷售", "聯(lián)系電話"]);

          // 填入數(shù)據(jù), 重復(fù)的代碼
            dsy.add("0", ["單位1", "單位2"]);

            dsy.add("0_0", ["單位1聯(lián)系人_1", "單位1聯(lián)系人_2"]);
            dsy.add("0_0_0", ["單位1聯(lián)系人_1聯(lián)系電話"]);
            dsy.add("0_0_1", ["單位1聯(lián)系人_2聯(lián)系電話"]);

            dsy.add("0_1", ["單位2聯(lián)系人_1", "單位2聯(lián)系人_2"]);
            dsy.add("0_1_0", ["單位2聯(lián)系人_1聯(lián)系電話"]);
            dsy.add("0_1_1", ["單位2聯(lián)系人_2聯(lián)系電話"]);

            dsy1.add("0", ["最終用戶1", "最終用戶2"]);

            dsy1.add("0_0", ["最終用戶1_聯(lián)系人1", "最終用戶1_聯(lián)系人2"]);
            dsy1.add("0_0_0", ["最終用戶1_聯(lián)系人1_電話"]);
            dsy1.add("0_0_1", ["最終用戶1_聯(lián)系人2_電話"]);

            dsy1.add("0_1", ["最終用戶2_聯(lián)系人1", "最終用戶2_聯(lián)系人2"]);
            dsy1.add("0_1_0", ["最終用戶2_聯(lián)系人1_電話"]);
            dsy1.add("0_1_1", ["最終用戶2_聯(lián)系人2_電話"]);

            dsy2.add("0", ["BEA", "Horizon"]);

            dsy2.add("0_0", ["張學(xué)友", "BeanSoft"]);
            dsy2.add("0_0_0", ["1234567890"]);
            dsy2.add("0_0_1", ["beansoft@126.com"]);

            dsy2.add("0_1", ["AAA", "BBB"]);
            dsy2.add("0_1_0", ["AAA_99999"]);
            dsy2.add("0_1_1", ["bbb_88888"]);

            function setup(){  // Initialize the object
              dsy.setup(); //依次調(diào)用 setup
              dsy1.setup();
              dsy2.setup();
            }

          function prints1(){
              alert(document.frm.s1.value + " " + document.frm.s2.value + " " + document.frm.s3.value +"\r\n");
          }

          //isNaN()檢查運(yùn)算結(jié)果  http://tech.ccidnet.com/pub/article/c1115_a120997_p1.html

          </SCRIPT>

          </head>
          <body bgcolor="#E0E0E0" onload="setup()">
          多級關(guān)聯(lián)菜單:
          <form name="frm">

          <!-- 方式1: 手工輸出 HTML 代碼, 便于排版
          <select id="s1" onChange="dsy.bean_change(1);"></select>
          <select id="s2" onChange="dsy.bean_change(2);"></select>
          <select id="s3" onChange="dsy.bean_change(3);"></select>
          <br>
          <br>
          <br>
          <select id="s4" onChange="dsy1.bean_change(1);"></select>
          <select id="s5" onChange="dsy1.bean_change(2);"></select>
          <select id="s6" onChange="dsy1.bean_change(3);"></select>
          <br>
          <br>
          <br>
          <select id="s7" onChange="dsy2.bean_change(1);"></select>
          <select id="s8" onChange="dsy2.bean_change(2);"></select>
          <select id="s9" onChange="dsy2.bean_change(3);"></select>
          -->
          <SCRIPT LANGUAGE="JavaScript">
          <!--
          // 方式2: 腳本輸出表單 HTML 代碼, 代碼和上面注釋掉的類似
          document.write(toString(dsy, "dsy"));
          document.write(toString(dsy1, "dsy1"));
          document.write(toString(dsy2, "dsy2"));
          //-->
          </SCRIPT>

          <input type=button name=b1 value="監(jiān)測" onclick="prints1()">

          </form>

          </body>
          </html>



          BeanSoft 2007-10-22 10:43 發(fā)表評論

          文章來源:http://www.aygfsteel.com/beansoft/archive/2007/10/22/154898.html

          posted @ 2007-11-10 17:21 代林 閱讀(311) | 評論 (0)編輯 收藏

          						/*
          						 * WebFXCookie class
          						 */
          						function WebFXCookie() {
              if (document.cookie.length) { this.cookies = ' ' + document.cookie; }
          }
          
          WebFXCookie.prototype.setCookie = function (key, value) {
              document.cookie = key + "=" + escape(value);
          }
          
          WebFXCookie.prototype.getCookie = function (key) {
              if (this.cookies) {
                  var start = this.cookies.indexOf(' ' + key + '=');
                  if (start == -1) { returnnull; }
                  var end = this.cookies.indexOf(";", start);
                  if (end == -1) { end = this.cookies.length; }
                  end -= start;
                  var cookie = this.cookies.substr(start,end);
                  return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1));
              }
              else { returnnull; }
          }
          
          
          
          function getCookieVal (offset) 
          {
              var endstr=document.cookie.indexOf (";",offset);if (endstr==-1) 
              endstr=document.cookie.length;return unescape(document.cookie.substring(offset, endstr));
          }
          
          
          function GetCookie (name)
          {
              var arg=name+"=";var alen=arg.length;var clen=document.cookie.length;var i = 0;while (i<clen)
              {
                  var 
                  j=i+alen;if (document.cookie.substring(i,j)==arg) return getCookieVal (j);i = document.cookie.indexOf(" ",i)+1;if (i==0) 
                  break;
              } 
              returnnull;
          } 
          function DeleteCookie (name) 
          {
              var exp=new Date(); exp.setTime (exp.getTime()-1); var cval=GetCookie (name); 
              document.cookie=name+"="+cval+"; expires="+exp.toGMTString();
          }
          
          


          BeanSoft 2007-10-26 10:52 發(fā)表評論

          文章來源:http://www.aygfsteel.com/beansoft/archive/2007/10/26/156057.html

          posted @ 2007-11-10 17:21 代林 閱讀(286) | 評論 (0)編輯 收藏

               摘要:   閱讀全文

          BeanSoft 2007-11-03 18:35 發(fā)表評論

          文章來源:http://www.aygfsteel.com/beansoft/archive/2007/11/03/157955.html

          posted @ 2007-11-10 17:21 代林 閱讀(352) | 評論 (0)編輯 收藏

          原創(chuàng)講解JSP過濾器和監(jiān)聽器

          BeanSoft(劉長炯) 2007年11月

          關(guān)于這個問題, 比較復(fù)雜的說. 不過我希望通過例子來解釋會方便理解一些.

          假設(shè)有一個非常危險的任務(wù), 是九死一生. 需要你揣著炸藥包從北平開車走高速路過保定去石家莊把鬼子的碉堡給炸了. 注意: 這個任務(wù)十分艱巨, 有可能半路炸藥爆炸. 所以出發(fā)前你需要苦練10元一本的<<鐵布衫>>, 還需要立遺囑交代一下后事. 下面是路線圖:
          去時路線: 北平 ==> 高速路收費(fèi)站入口(都有警察和警犬) A? ==> 保定收費(fèi)站 B ==> 石家莊收費(fèi)站 C ==> 炸碉堡 D ==> 轉(zhuǎn)車(剛才的車已經(jīng)炸沒了) E =>
          回來路線: 石家莊收費(fèi)站 ==> 保定收費(fèi)站 ==> 高速路收費(fèi)站出口(都有警察和警犬) A ==> 安全回到北平 G

          那么我們先簡介可能發(fā)生的情況.? A 點(diǎn)有可能被警察和警犬發(fā)現(xiàn), 所以你只能被扭送回北平.? 即使不被發(fā)現(xiàn), 還可能出現(xiàn)收費(fèi)時發(fā)現(xiàn)10個現(xiàn)大洋一個路口的買路錢沒帶!! 哎, 只能又回去了. 還有最慘的: 高速路入口寫著: 對不起, 到石家莊的路線因為施工不通! 只好回家等著吧.
          到了B和C你可能還會被人發(fā)現(xiàn)帶了炸藥包, 或者發(fā)現(xiàn)買路費(fèi)少帶了! 極有可能又被扭送回北平, 注意已經(jīng)在半道了, 是不會讓你繼續(xù)到石家莊的, 所以你會被從車上逮下來, 然后轉(zhuǎn)到警車上帶回來!? 也就是從 B 或者 C 直接返回.
          好了, 最佳情況就是你炸了碉堡, 也成功的返回了. 然后你可以開心的把<<鐵布衫>>扔了, 然后宣告遺囑作廢.

          OK, 以上過程, 就是過濾器和監(jiān)聽器的真實(shí)案例.

          那么炸碉堡這個任務(wù), 就相當(dāng)于要調(diào)用 JSP 或者 Servlet 來獲得執(zhí)行結(jié)果(炸碉堡 D ).? 在執(zhí)行之前你需要做一些準(zhǔn)備工作, 相當(dāng)于要寫一個
          監(jiān)聽器 com.allanlxf.ums.web.ServiceListener
          在里面你可以做一些事情例如初始化資源, 例如上文的苦練<<鐵布衫>>, 立遺囑, 這個相當(dāng)于代碼中的
          public void contextInitialized(ServletContextEvent sce) 這樣一個初始化事件.
          那么在整個任務(wù)完成之后, 這些事情你就要考慮應(yīng)該作廢了, 所以需要
          public void contextDestroyed(ServletContextEvent sce) 這樣一個銷毀事件, 例如把<<鐵布衫>>扔了, 然后宣告遺囑作廢, 也就是收回資源.

          那么過濾器在哪里呢? 它位于任務(wù)的 A B C 點(diǎn). 注意是雙向路程都會經(jīng)過的. 也就是請求和響應(yīng)都會經(jīng)過. 但是過濾器也會檢查不同的情況, 例如 A 點(diǎn)實(shí)際上有兩個過濾功能: 查炸藥包和收買路錢. 這就相當(dāng)于配置了:
          ??
          ?????? sessionFilter
          ???? * *.do
          ???? * REQUEST
          ???? * FORWARD
          ??
          ?
          兩個過濾功能都要檢查. 如果成功了怎么辦呢? 會繼續(xù)讓你走下一個路口, 注意不是讓你直接成功. 也就是代碼:
          ??????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經(jīng)登錄并且當(dāng)前路徑仍然停留在登錄頁面????? {???????????
          ?????????? chain.doFilter(request, response);//繼續(xù)走下面的過濾器或者任務(wù)(不保證最終任務(wù), 因為下個過濾器也可能讓你回來)
          ?????????? 只有當(dāng)走到 C 點(diǎn)的時候, 下一步才是執(zhí)行了最終的任務(wù): 執(zhí)行JSP或者Servlet.
          ?????? }
          反過來怎么辦? 把你扭送上警車, 強(qiáng)行返回! 這樣你連路口 B C 和最終任務(wù)都無法訪問了. 也就是不會讓你訪問下一個過濾器和執(zhí)行最終的 JSP 或者 Serlvet, 可以選擇直接返回, 或者放警車上帶回去.
          ?????? {
          ?????????? return;// 直接返回
          ?????????? 或者 response.sendRedirect(request.getContextPath() + "/login.jsp");//則扭送上警車, 強(qiáng)行返回到警察局
          ?????? }

          那么在 E 點(diǎn)發(fā)生了什么? 也就是你可能替換掉了原來的 response 對象,? 也就是換車. 這意味著你可以在過濾器里私下修改請求和響應(yīng)對象.

          雖然已經(jīng)不那么抽象了, 但是要理解可能還是需要耐心體會的.

          =====================================================================
          注: 原始問題

          ??? 1.請看下面一段代碼和其注釋:
          import javax.servlet.*;

          import javax.servlet.http.*;

          import java.io.*;

          public class SessionFilter extends HttpFilter

          {

          ?? public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)

          ?????????????? throws ServletException, IOException

          ?? {

          ?????? String path = request.getServletPath();//取得該servlet的路徑名稱

          ?????? path = path.substring(0, path.indexOf("."));?? //獲得路徑中.之前的部分

          ?????? HttpSession session = request.getSession();//從請求中取得session為得是從session中讀取用戶是否登錄的標(biāo)志值

          ?????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經(jīng)登錄并且當(dāng)前路徑仍然停留在登錄頁面

          ?????? {???????????

          ???????? *? chain.doFilter(request, response);//則將當(dāng)前濾鏡加入到濾鏡鏈條當(dāng)中

          ?????? }else//若用戶尚未成功登錄

          ?????? {

          ?????????? response.sendRedirect(request.getContextPath() + "/login.jsp");//則使用請求重定向轉(zhuǎn)到登錄頁面

          ?????? }???????

          ?? }

          }

          /*

          * 該Filter濾鏡類所過濾的是用戶在瀏覽器中輸入的

          * 當(dāng)前web application的訪問路徑,通過判斷用戶是

          * 否成功登錄而決定是否對訪問路徑加以限止

          * 在該web application的web.xml配置文件中為

          * 該filte濾鏡做了相應(yīng)配置

          */

          請問: 上面代碼FilterChain對象盛裝的是Filter對象, 可它是怎么工作的啊?
          加*號的語句是何用意啊,不是過濾路徑嗎, 為什么要將請求與響應(yīng)加入呢?

          2.請看下面一段代碼:

          import javax.servlet.*;

          import javax.servlet.http.*;

          import java.io.*;

          public abstract class HttpFilter implements Filter

          {

          ?? private FilterConfig config;

          ?? public void init(FilterConfig config) throws ServletException

          ?? {

          ?????? this.config = config;

          ?????? init();

          ?? }

          ?? public void init() throws ServletException

          ?? {

          ?? }

          ?? public String getInitParameter(String name)

          ?? {

          ?????? return config.getInitParameter(name);

          ?? }

          ?? public ServletContext getServletContext()

          ?? {

          ?????? return config.getServletContext();

          ?? }

          ?? public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

          ?????????????? throws ServletException, IOException

          ?? {

          ?????? doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);

          ?? }

          ?? public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)

          ?????????????? throws ServletException, IOException;

          ?? public void destroy()

          ?? {

          ?? }

          }

          請問: 該類就這樣寫了一下,沒有包含任何行為,它如何完成過濾工作啊?

          3.請看下面代碼:
          package com.allanlxf.ums.web;

          import javax.servlet.*;

          //import javax.servlet.http.*;

          import com.allanlxf.ums.service.SystemService;

          import com.allanlxf.ums.service.StudentService;

          public class ServiceListener implements ServletContextListener

          {

          ?? public void contextInitialized(ServletContextEvent sce)

          ?? {

          ?????? ServletContext application = sce.getServletContext();

          ?????? StudentService service = new StudentService();

          ?????? application.setAttribute("studentService", service);

          ?????? SystemService systemService = new SystemService();

          ?????? application.setAttribute("systemService", systemService);

          ?? }

          ?? public void contextDestroyed(ServletContextEvent sce)

          ?? {

          ?? }

          }

          /*

          *本類是該web application的監(jiān)聽器類,在該類中,

          *將兩個無為本系統(tǒng)提供服務(wù)的兩個對象寫入到了

          *application隱含對象中(這樣保證在該系統(tǒng)的任何

          *地方都能夠取得這兩個服務(wù)類對象的引用)

          *在本系統(tǒng)的web.xml文件中對該監(jiān)聽器做了配置

          */

          請問: 為什么要將服務(wù)類對象寫入到程序上下文中呢,直接創(chuàng)建不也一樣嗎?
          ???? 監(jiān)聽器只有這樣的功能嗎,是否還有其它功能呢?

          3.請看下面的配置文件內(nèi)容:

          ??
          ?????? sessionFilter
          ?????? com.allanlxf.ums.web.SessionFilter
          ??
          ???
          ??
          ?????? sessionFilter
          ???? * *.do
          ???? * REQUEST
          ???? * FORWARD
          ??
          ???????
          ??
          ?????? com.allanlxf.ums.web.ServiceListener
          ???

          請問: 加*號的三項是什么意思?

          當(dāng)初老師講的時候,許多基本的原則原理尚不清楚,這些根本沒有聽明白,當(dāng)然,老師也未細(xì)講,只說會用即可, 可是若不能明白其本質(zhì),用也只能用這一點(diǎn)兒, 怎么成呢, 希望您能夠比較詳悉的講一下. thank you very much!



          BeanSoft 2007-11-09 15:05 發(fā)表評論

          文章來源:http://www.aygfsteel.com/beansoft/archive/2007/11/09/159374.html

          posted @ 2007-11-10 17:21 代林 閱讀(1156) | 評論 (0)編輯 收藏

          出處:javaresearch 作者:mandyhou
              基于Web的MVC framework在J2EE的世界內(nèi)已是空前繁榮。TTS網(wǎng)站上幾乎每隔一兩個星期就會有新的MVC框架發(fā)布。目前比較好的MVC,老牌的有Struts、Webwork。新興的MVC 框架有Spring MVC、Tapestry、JSF等。這些大多是著名團(tuán)隊的作品,另外還有一些邊緣團(tuán)隊的作品,也相當(dāng)出色,如Dinamica、VRaptor等。這些框架都提供了較好的層次分隔能力。在實(shí)現(xiàn)良好的MVC 分隔的基礎(chǔ)上,通過提供一些現(xiàn)成的輔助類庫,同時也促進(jìn)了生產(chǎn)效率的提高。

            如何選擇一個好的框架應(yīng)用在你的項目中,將會對你的項目的效率和可重用是至關(guān)重要的。本文將對目前最流行、最常用的兩種framework進(jìn)行介紹。

            一)Struts

            Struts是Apache軟件基金下Jakarta項目的一部分。Struts框架的主要架構(gòu)設(shè)計和開發(fā)者是Craig R.McClanahan。Struts 是目前Java Web MVC框架中不爭的王者。經(jīng)過長達(dá)五年的發(fā)展,Struts已經(jīng)逐漸成長為一個穩(wěn)定、成熟的框架,并且占有了MVC框架中最大的市場份額。但是Struts某些技術(shù)特性上已經(jīng)落后于新興的MVC框架。面對Spring MVC、Webwork2 這些設(shè)計更精密,擴(kuò)展性更強(qiáng)的框架,Struts受到了前所未有的挑戰(zhàn)。但站在產(chǎn)品開發(fā)的角度而言,Struts仍然是最穩(wěn)妥的選擇。

            Struts有一組相互協(xié)作的類(組件)、Serlvet以及jsp tag lib組成。基于struts構(gòu)架的web應(yīng)用程序基本上符合JSP Model2的設(shè)計標(biāo)準(zhǔn),可以說是MVC設(shè)計模式的一種變化類型。根據(jù)上面對framework的描述,我們很容易理解為什么說Struts是一個web framwork,而不僅僅是一些標(biāo)記庫的組合。但 Struts 也包含了豐富的標(biāo)記庫和獨(dú)立于該框架工作的實(shí)用程序類。Struts有其自己的控制器(Controller),同時整合了其他的一些技術(shù)去實(shí)現(xiàn)模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與數(shù)據(jù)訪問技術(shù)相結(jié)合,包括EJB,JDBC和Object Relation Bridge。在視圖層,Struts能夠與JSP, Velocity Templates,XSL等等這些表示層組件想結(jié)合。

            Struts的體系結(jié)構(gòu)

            struts framework是MVC 模式的體現(xiàn),下面我們就從分別從模型、視圖、控制來看看struts的體系結(jié)構(gòu)(Architecture)。

            從視圖角度(View)

            主要由JSP建立,struts自身包含了一組可擴(kuò)展的自定義標(biāo)簽庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 這幾個Taglib。有關(guān)它們的詳細(xì)資料請參考struts用戶手冊

            從模型角度(Model)

            模型主要是表示一個系統(tǒng)的狀態(tài)(有時候,改變系統(tǒng)狀態(tài)的業(yè)務(wù)邏輯操作也也劃分到模型中)。在Struts中,系統(tǒng)的狀態(tài)主要有ActiomForm Bean體現(xiàn),一般情況下,這些狀態(tài)是非持久性的。如果需要將這些狀態(tài)轉(zhuǎn)化為持久性數(shù)據(jù)存儲,Struts本身也提供了Utitle包,可以方便的與數(shù)據(jù)庫操作

            從控制器角度(Controller)

            在Struts framework中, Controller主要是ActionServlet,但是對于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協(xié)調(diào)完成(也許這幾個組件,應(yīng)該劃分到模型中的業(yè)務(wù)邏輯一塊)。其中,Action扮演了真正的業(yè)務(wù)邏輯的實(shí)現(xiàn)者,而ActionMapping和ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。

            對于Struts 如何控制、處理客戶請求,讓我們通過對struts的四個核心組件介紹來具體說明。這幾個組件就是:ActionServlet。Action Classes,Action Mapping(此處包括ActionForward),ActionFrom Bean。

            二)Spring

            Spring 實(shí)際上是Expert One-on-One J2EE Design and Development 一書中所闡述的設(shè)計思想的具體實(shí)現(xiàn)。在One-on-One 一書中,Rod Johnson 倡導(dǎo)J2EE 實(shí)用主義的設(shè)計思想,并隨書提供了一個初步的開發(fā)框架實(shí)現(xiàn)(interface21 開發(fā)包)。而Spring 正是這一思想的更全面和具體的體現(xiàn)。Rod Johnson 在interface21 開發(fā)包的基礎(chǔ)之上,進(jìn)行了進(jìn)一步的改造和擴(kuò)充,使其發(fā)展為一個更加開放、清晰、全面、高效的開發(fā)框架。

            Spring是一個開源框架,由Rod Johnson創(chuàng)建并且在他的著作《J2EE設(shè)計開發(fā)編程指南》里進(jìn)行了描述。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使使用基本的JavaBeans來完成以前只可能由EJB完成的事情變得可能了。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。

            簡單來說,Spring是一個輕量的控制反轉(zhuǎn)和面向切面的容器框架。當(dāng)然,這個描述有點(diǎn)過于簡單。但它的確概括出了Spring是做什么的。為了更好地理解Spring,讓我們分析一下這個描述:

            1、輕量;從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對象不依賴于輕量;從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對象不依賴于Spring的特定類。

            2、控制反轉(zhuǎn);Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,對象被動地傳遞它們的依賴而不是自己創(chuàng)建或者查找依賴對象。你可以認(rèn)為IoC與JNDI相反;不是對象從容器中查找依賴,而是容器在對象初始化時不等被請求就將依賴傳遞給它。

            3、面向切面;Spring包含對面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)服務(wù)(例如審計與事物管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對象只做它們應(yīng)該做的;完成業(yè)務(wù)邏輯;僅此而已。它們并不負(fù)責(zé)(甚至是意識)其它的系統(tǒng)關(guān)注點(diǎn),例如日志或事物支持。

            4、容器;Spring包含和管理應(yīng)用對象的配置和生命周期,在這個意義上它是一種容器。你可以配置你的每個bean如何被創(chuàng)建;基于一個配置原形為你的bean創(chuàng)建一個單獨(dú)的實(shí)例或者每次需要時都生成一個新的實(shí)例;以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。

            框架;Spring使由簡單的組件配置和組合復(fù)雜的應(yīng)用成為可能。在Spring中,應(yīng)用對象被聲明式地組合,典型地是在一個XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久性框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你。

            所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種子框架提供了基礎(chǔ)。

          posted @ 2007-11-10 16:58 代林 閱讀(1523) | 評論 (1)編輯 收藏

          以下所說的struts-config.xml和ApplicationResources.properties等文件名是缺省時使用的,如果你使用了多模塊,或指定了不同的資源文件名稱,這些名字要做相應(yīng)的修改。

          1、“No bean found under attribute key XXX”
           在struts-config.xml里定義了一個ActionForm,但type屬性指定的類不存在,type屬性的值應(yīng)該是Form類的全名。或者是,在Action的定義中,name或attribute屬性指定的ActionForm不存在。

          2、“Cannot find bean XXX in any scope”
           在Action里一般會request.setAttribute()一些對象,然后在轉(zhuǎn)向的jsp文件里(用tag或request.getAttribute()方法)得到這些對象并顯示出來。這個異常是說jsp要得到一個對象,但前面的Action里并沒有將對象設(shè)置到request(也可以是session、servletContext)里。

           可能是名字錯了,請檢查jsp里的tag的一般是name屬性,或getAttribute()方法的參數(shù)值;或者是Action邏輯有問題沒有執(zhí)行setAttribute()方法就先轉(zhuǎn)向了。

           還有另外一個可能,純粹是jsp文件的問題,例如會指定一個id值,然后在循環(huán)里使用這個值作為name的值,如果這兩個值不同,也會出現(xiàn)此異常。(都是一個道理,request里沒有對應(yīng)的對象。)

          3、“Missing message for key "XXX"”
           缺少所需的資源,檢查ApplicationResources.properties文件里是否有jsp文件里需要的資源,例如:
            
           這行代碼會找msg.name.prompt資源,如果AppliationResources.properties里沒有這個資源就會出現(xiàn)本異常。在使用多模塊時,要注意在模塊的struts-config-xxx.xml里指定要使用的資源文件名稱,否則當(dāng)然什么資源也找不到,這也是一個很容易犯的錯誤。

          4、“No getter method for property XXX of bean teacher”
           這條異常信息說得很明白,jsp里要取一個bean的屬性出來,但這個bean并沒有這個屬性。你應(yīng)該檢查jsp中某個標(biāo)簽的property屬性的值。例如下面代碼中的cade應(yīng)該改為code才對:  

          5、“Cannot find ActionMappings or ActionFormBeans collection”
           待解決。

          6、“Cannot retrieve mapping for action XXX”
           在.jsp的標(biāo)簽里指定action='/XXX',但這個Action并未在struts-config.xml里設(shè)置過。

          7、HTTP Status 404 - /xxx/xxx.jsp
           Forward的path屬性指向的jsp頁面不存在,請檢查路徑和模塊,對于同一模塊中的Action轉(zhuǎn)向,path中不應(yīng)包含模塊名;模塊間轉(zhuǎn)向,記住使用contextRelative="true"。

          8、沒有任何異常信息,顯示空白頁面
           可能是Action里使用的forward與struts-config.xml里定義的forward名稱不匹配。

          9、“The element type "XXX" must be terminated by the matching end-tag "XXX".”
           這個是struts-config.xml文件的格式錯誤,仔細(xì)檢查它是否是良構(gòu)的xml文件,關(guān)于xml文件的格式這里就不贅述了。

          10、“Servlet.init() for servlet action threw exception”
           一般出現(xiàn)這種異常在后面會顯示一個關(guān)于ActionServlet的異常堆棧信息,其中指出了異常具體出現(xiàn)在代碼的哪一行。我曾經(jīng)遇到的一次提示如下:

            java.lang.NullPointerException
             at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1003)
             at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)

          為解決問題,先下載struts的源碼包,然后在ActionServlet.java的第1003行插入斷點(diǎn),并對各變量進(jìn)行監(jiān)視。很丟人,我竟然把struts-config.xml文件弄丟了,因此出現(xiàn)了上面的異常,應(yīng)該是和CVS同步時不小心刪除的。

          11、“Resources not defined for Validator”
           這個是利用Validator插件做驗證時可能出現(xiàn)的異常,這時你要檢查validation.xml文件,看里面使用的資源是否確實(shí)有定義,form的名稱是否正確,等等。

          posted @ 2007-11-10 16:43 代林 閱讀(231) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 锡林浩特市| 河曲县| 达拉特旗| 宽甸| 昌图县| 托里县| 肇东市| 祁阳县| 阿合奇县| 临泉县| 虹口区| 新密市| 上栗县| 连云港市| 新蔡县| 新兴县| 蓬莱市| 泰兴市| 馆陶县| 弥渡县| 六盘水市| 平江县| 长岭县| 青河县| 黑水县| 鄂尔多斯市| 中阳县| 秭归县| 新晃| 云浮市| 文山县| 乌拉特前旗| 宝兴县| 大同市| 封开县| 互助| 道真| 榆树市| 锡林郭勒盟| 广饶县| 萨迦县|