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

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

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

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

    2007年11月22日

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

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

    J2EE技術應用

     J2EE是Sun公司推出的一種全新概念的模型,比傳統的互聯網應用程序模型更有優勢。

    J2EE模型

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

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

    J2EE平臺

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

     J2EE支持EJB,因此開發人員可以執行多用戶交易功能。當在J2EE服務器上運行時,Enterprise JavaBeans將應用邏輯分成可再利用和可擴展的代碼段。Enterprise JavaBeans并不是新特征,但是通過定義標準客戶端和服務API,J2EE增強了它的能力和可移植性。

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

     J2EE通過定義一組標準的結構來實現它的優勢,例如:

     1.J2EE Application Programming Model,是一種用于開發多層次、瘦型客戶用戶程序的標準設計模型;

     2. J2EE Platform,是一個標準的平臺,用來整合J2EE的應用程序,并指定一系列的接口和方法;

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

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

    J2EE服務器

     Sun的J2EE服務器通過Java 命名和目錄接口(JNDI)、認證、HTTP及與Enterprise JavaBeans兼容的能力,提供命名和目錄服務。JNDI是Java平臺的一種標準擴展版,向企業內的命名和目錄服務提供具有Java功能的,帶有統一接口的應用,包括LDAP。

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

     JSP是Java Servlet的一種擴展。Java Servlet提供開發和顯示來自服務器的交互式Web頁。如今JSP又有了進一步的改進,它使得創建和支持靜態模板和動態內容相結合的HTML和XML頁面更加容易。

    安全性

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

     J2EE 平臺是Java技術企業級應用的最佳平臺,它可以讓程序員迅速、快捷地開發和分布企業級應應用程序。以下便是它的相關技術:

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

     2.JavaServer Pages,JSP 技術提供了一種簡單、快速的方法來創建動態網頁。通過它,可以快速地開發基于Web的應用程序,并且這些應用程序都是與平臺無關的。因為JSP與ASP很相似,所以熟悉ASP的人學習它就很容易了。

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

     4.J2EE Connector,提供了一種標準結構來聯接不同的企業信息平臺。

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

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

     7.JDBC,幾乎是為所有的數據庫提供了統一的接口,同時可以創建高級工具和接口。

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

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

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

     11.RMI-IIOP,使用它就可以只用Java 技術和Java RMI接口開發客戶機與服務器的遠程接口。

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

     J2EE應用程序的開發階段分為四步:1.Enterprise Bean創建;2.Web Component創建;3.J2EE應用程序裝配;4.J2EE應用程序分布。以下是J2EE兼容產品部分列表:

     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技術的應用

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

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

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

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

     1.可以在各種支持Java的設備上運行;

     2.代碼短小;

     3.充分利用Java語言的優勢;

     4.安全性好;

     5.用J2ME實現的應用可以方便地升級到J2SE、J2EE。

    J2ME的配置和框架

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

     1.JVM層,這層基于宿主操作系統,按照某一種J2ME的配置,實現了JVM。

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

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

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

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

    CLDC技術

     CLDC定義了目標Java平臺,該平臺基于小型的、資源較少的、內存僅有160~512K的設備。CLDC是由KVM和用在蜂窩電話、數字產品、雙向尋呼機、個人組織器和家用電器等核心庫類及接口組成。使用CLDC技術有很多優點:

     1.跨平臺,這點保留了Java一貫的特點,應用程序不會隨著平臺差異而產生變化。

     2.動態性,這點也是很吸引人的,可以根據需要下載自己喜歡的應用程序和服務,并且可以和其它的CLDC設備通信。

     3.安全性,Java 本身的特點造就了這一特性。

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

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

     2.用戶定義類裝載器;

     3.類實例的最終化;

     4.弱的引用;

     5.RMI;

     6.Reflection(映射)。

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

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

    J2SE技術的應用

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

     J2SE 1.4 特點:

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

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

     2.跨平臺

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

     3.支持Web服務

     J2SE 1.4版與以前各J2SE版全面兼容。J2SE 1.4版對SSL、LDAP和CORBA等業界標準技術也給予支持,因此保證了在不同平臺、系統和環境間的互操作能力。J2SE 1.4版支持XML技術和一整套安全服務,因此為基于各類標準的可互操作應用與服務的創建奠定了重要基礎。有了J2SE 1.4版與Java Web Services Developer Pack的結合,開發商就能創建、測試和配置Web服務了。

     4.完整性

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

     總之,J2SE 1.4版是多種不同風格軟件的開發基礎,包括客戶端Java小程序和應用程序,以及獨立的服務器應用程序等。J2SE 1.4版還是J2ME的基礎,是J2EE執行程序的推動力。

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

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

    2007年11月14日

    ArgoUML

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

    Alma

    Alma是一個軟件建模分析的工作平臺,它讀取幾種不同的源代碼,幫你設計面向對像的模型,修改結構和源代碼,輸出新的源代碼、文檔和圖表。

    UMLet

    UMLet是一個開放源代碼輕量級UML建模工具。UMLet能夠讓你快速建模,并且能夠導出各種格式SVG, JPG, PDF and LaTeX-friendly EPS。

    UML/Dot

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

    JUG

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

    Violet

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

    UMLGraph

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

    Fujaba Tool Suite

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

    UniMod

    UniMod是Executable UML思想的實現。UniMod是以Eclipse插件形式存在。可以通過UniMod提供的一個在線Demo了解更多的詳細資料。

    Taylor MDA

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

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

    StarUML

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

    Quick Sequence Diagram Editor

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

    TinyUML

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

    Papyrus

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

     

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

    2007年11月10日

    Struts 運行環境

    1.1 Struts 1.0 和1.1版本

    當前主要有兩個版本,struts 1.0 release 和 struts 1.1 beta 3。Struts 1.0 和1.1差別很大,主要有兩點:

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

    盡管struts 1.0 是正式發布版,但是結構已經老化,功能也已經固化。所以我們的Framework不選用struts 1.0, 而選用 struts 1.1。

    1.2支持struts的應用服務器

    根據apache官方網站的說法,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配置說明

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

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

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

    在其他的應用服務器上,還沒有嘗試struts, 今后根據項目需要會作進一步的研究。

    struts框架

    2.1 struts 體系結構

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


    Struts體系結構


     

    2.1.1 從視圖角度(View)

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

    2.1.2從模型角度(Model)

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

    2.1.3 從控制器角度(Controller)

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

    2.2 struts 的組件

    框架中所使用的組件:

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

    2.3 struts 配置文件

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

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

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

    • 全局轉發
    • ActionMapping類
    • ActionForm bean
    • JDBC數據源

    2.3.1 配置全局轉發

    全局轉發用來在JSP頁之間創建邏輯名稱映射。全局轉發的例子:

    <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 全局轉發的名字
    Path 與目標URL的相對路徑

    2.3.2 配置ActionMapping

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

    <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

    與本操作關聯的Action bean的名稱

    Type

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

    Scope

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

    Prefix

    用來匹配請求參數與bean屬性的前綴

    Suffix

    用來匹配請求參數與bean屬性的后綴

    attribute

    作用域名稱。

    className

    ActionMapping對象的類的完全限定名默認的類是org.apache.struts.action.ActionMapping

    input

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

    unknown

    設為true,操作將被作為所有沒有定義的ActionMapping的URI的默認操作

    validate

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

    通過<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應要轉發的目標。

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

    2.3.3 配置ActionForm Bean

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

    <form

    beans >

    <form

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

    </form

    beans>

    屬性

    描述

    Id

    ID

    className

    ActionForm bean的完全限定名,默認值是org.apache.struts.action.ActionFormBean

    Name

    表單bean在相關作用域的名稱,這個屬性用來將bean與ActionMapping進行關聯

    Type

    類的完全限定名

    2.3.4 配置JDBC數據源

    例子:

    <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 數據源的描述
    autoCommit 數據源創建的連接所使用的默認自動更新數據庫模式
    driverClass 數據源所使用的類,用來顯示JDBC驅動程序接口
    loginTimeout 數據庫登陸時間的限制,以秒為單位
    maxCount 最多能建立的連接數目
    minCount 要創建的最少連接數目
    password 數據庫訪問的密碼
    readOnly 創建只讀的連接
    User 訪問數據庫的用戶名
    url JDBC的URL

    通過指定關鍵字名稱,Action類可以訪問數據源,比如:

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

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

    struts標記庫

    struts 標記庫包含4種類型的標記,分別是:

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

    Struts提供了功能強大的Taglib,充分使用這些Tag,能最大限度的發揮Struts的作用。

    由于標記庫功能強大,所以掌握它需要花費一定的時間。目前我們可以先從 struts-html taglib 學起,主要精力還是要先放在理解掌握struts導航功能上。

    文檔《struts 標記庫》可以幫助學習掌握struts taglib.

    可視化設計工具和代碼生成器Camino

    Camino 是基于 struts framework的可視化建模工具。使用camino 可以實現快速設計和開發,主要特點有:

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

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

    Struts example

    Struts 1.1 beta 3 的包中包含了幾個example, 可以幫助學習struts。

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

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

    建議從struts-example 開始學習,熟讀struts-config.xml, jsp, 和 java 源碼。

    6、統一的IDE工具: eclipse

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

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

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

    7、參考資料

    • 網站:

      struts 官方網站:http://jakarta.apache.org/struts

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

      Camino 網站:http://www.scioworks.com/index.html

      其他網站:http://husted.com/struts/

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

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

    • 文章:

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

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

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

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

      《Struts標記庫》 - 詳細介紹了struts taglib的使用

      《struts turorial》 - 一個網上購書的示例,詳細講解了struts使用步驟

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

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

    <HTML>
    <HEAD>
    <TITLE>合同申請</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <SCRIPT LANGUAGE = JavaScript>
    /** Define object Dsy 構造器
    fieldValues - 三個表單域的名稱, 可以通過 request.getParameter(xxx) 取值
    defalutOptions - 默認選項
    */
    function Dsy(fieldValues, defalutOptions){
      this.Items = {};
      this.defalutOptions = defalutOptions;// 默認選項 
      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"], ["銷售方名稱", "銷售方聯系人", "聯系電話"]);
      var dsy1 = new Dsy(["s4", "s5", "s6"],  ["最終用戶名稱", "最終用戶聯系人", "聯系電話"]);
      var dsy2 = new Dsy(s = ["s7", "s8", "s9"], ["廠商", "廠商銷售", "聯系電話"]);

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

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

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

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

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

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

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

      dsy2.add("0_0", ["張學友", "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(); //依次調用 setup
        dsy1.setup();
        dsy2.setup();
      }

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

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

    </SCRIPT>

    </head>
    <body bgcolor="#E0E0E0" onload="setup()">
    多級關聯菜單:
    <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="監測" onclick="prints1()">

    </form>

    </body>
    </html>



    BeanSoft 2007-10-22 10:43 發表評論

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

    posted @ 2007-11-10 17:21 代林 閱讀(308) | 評論 (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 發表評論

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

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

         摘要:   閱讀全文

    BeanSoft 2007-11-03 18:35 發表評論

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

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

    原創講解JSP過濾器和監聽器

    BeanSoft(劉長炯) 2007年11月

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

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

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

    OK, 以上過程, 就是過濾器和監聽器的真實案例.

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

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

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

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

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

    ??? 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中讀取用戶是否登錄的標志值

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

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

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

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

    ?????? {

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

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

    ?? }

    }

    /*

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

    * 當前web application的訪問路徑,通過判斷用戶是

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

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

    * 該filte濾鏡做了相應配置

    */

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

    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的監聽器類,在該類中,

    *將兩個無為本系統提供服務的兩個對象寫入到了

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

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

    *在本系統的web.xml文件中對該監聽器做了配置

    */

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

    3.請看下面的配置文件內容:

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

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

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



    BeanSoft 2007-11-09 15:05 發表評論

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

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

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

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

      一)Struts

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

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

      Struts的體系結構

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

      從視圖角度(View)

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

      從模型角度(Model)

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

      從控制器角度(Controller)

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

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

      二)Spring

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    7、HTTP Status 404 - /xxx/xxx.jsp
     Forward的path屬性指向的jsp頁面不存在,請檢查路徑和模塊,對于同一模塊中的Action轉向,path中不應包含模塊名;模塊間轉向,記住使用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文件的格式錯誤,仔細檢查它是否是良構的xml文件,關于xml文件的格式這里就不贅述了。

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

      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行插入斷點,并對各變量進行監視。很丟人,我竟然把struts-config.xml文件弄丟了,因此出現了上面的異常,應該是和CVS同步時不小心刪除的。

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

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

    主站蜘蛛池模板: 国产精品黄页免费高清在线观看| 亚洲AV综合色区无码一二三区| 国产日韩精品无码区免费专区国产 | 白白色免费在线视频| 无码人妻精品一二三区免费| 亚洲一卡二卡三卡| 毛片大全免费观看| 亚洲aⅴ无码专区在线观看| 免费无遮挡无码视频网站| 色偷偷亚洲第一综合| 国产乱人免费视频| 一个人免费播放在线视频看片| 高清在线亚洲精品国产二区| 国产福利免费视频| 亚洲成AV人片在| 亚洲国产精品免费观看| 中文无码亚洲精品字幕| 亚洲А∨精品天堂在线| 中国性猛交xxxxx免费看| 亚洲短视频男人的影院| 97在线观免费视频观看| 亚洲avav天堂av在线网毛片| 国产亚洲精品无码专区| 最近免费中文字幕大全免费版视频 | 免费无码看av的网站| 午夜不卡AV免费| 亚洲av日韩av高潮潮喷无码| 国产v精品成人免费视频400条| 亚洲s码欧洲m码吹潮| 久久久久亚洲AV成人网人人软件| 国产精成人品日日拍夜夜免费| 亚洲Av高清一区二区三区| 日本免费无遮挡吸乳视频电影| 一级特黄a免费大片| 久久亚洲精精品中文字幕| 在线jyzzjyzz免费视频| 精品熟女少妇aⅴ免费久久| 亚洲国色天香视频| 狠狠色婷婷狠狠狠亚洲综合| 亚洲精品视频免费在线观看| 国产精品亚洲一区二区三区在线观看|