本文介紹WebSphere下Oracle、SQL Server、Sybase、MySQL數據庫連接池的配置方法,并給出相應調用連接池的示例。相對于Weblogic,WebSphere連接池的配置要稍微復雜一些,因為缺少相關的文檔,需要一定的技巧和經驗。特別是對于初學者,完整的配置好Websphere連接池還是有一定難度的。

          一、系統準備
          1.在相應的數據庫中建立本文用到的表

          create table TEST(C1 CHAR(10) )
          insert into TEST values('FromTest')


          2.準備環境變量,此部分往往會被初學者忽略。

          image

          點擊“管理WebSphere變量”,ORACLE_JDBC_DRIVER_PATH的值輸入操作系統中jar文件(classes12.jar)的位置。
          “確認”后,界面最上方,點擊“保存”,會再提示“保存”還是“放棄”,再選“保存”。

          為方便起見,本文中,SQL Server的jar文件(msbase.jar、mssqlserver.jar、msutil.jar )、Sybase的jar文件(jconn2.jar)、mySQL的jar文件(mysql-connector-java-3.1.10-bin.jar)都放在同一目錄(如:C:\oracle\ora92\jdbc\lib)。

          3.本文中的所有例子測試均通過,環境:Windows2003、WebShpere5.1、ORACLE9I、SQL Server 2000、SYBASE12.5、MySQL5.0。

          二、Oracle、SQL Server、Sybase、MySQL數據庫連接池在WebSphere中的詳細配置步驟

          (一)、Oracle連接池的配置

          1.進入管理控制臺(http://localhost:9090/admin/)

          2.選擇:資源->JDBC提供程序,點擊“新建”,建立JDBC提供程序。

          image
          點擊“應用”后,類路徑中,輸入“${ORACLE_JDBC_DRIVER_PATH}/classes12.jar”,再點擊“應用”。

          3.定義數據源
          點擊界面中“數據源后”再點擊“新建”,建立數據源。

          image
          JNDI取名ORACLE_JNDI,點擊“應用”。

          4.界面上點擊“定制屬性”,定義連接池的JDBC Driver、URL、用戶名和口令等信息。
          點擊“URL”,URL的值輸入:jdbc:oracle:thin:@localhost:1521:MYHORA,其中,localhost可以為ORACLE的IP地址,MYHORA是ORACLE的服務名稱。
          點擊“確定”保存配置。
          同樣的方法輸入:
          driverType的值oracle.jdbc.driver.OracleDriver
          databasename的值MYHORA
          servername的值localhost
          preTestSQLString的值為SELECT COUNT(1) FROM TEST
          其余的取默認值。

          5.本部分比較關鍵,是初學著比較困惑的地方。
          我們看到,界面上并沒有輸入用戶名、口令的地方,而沒有用戶名稱、口令是無法連接數據庫的。

          image
          在“定制屬性”中點擊“新建”,“名稱”中輸入user,“值”中輸入數據庫的用戶名稱,如:study,點擊“確定”;
          在“定制屬性”中點擊“新建”,“名稱”中輸入password,“值”中輸入數據庫的口令,如:study,點擊“確定”;
          我們看到,“定制屬性”中多了兩個我們自定義的屬性user、password

          image

          6.保存配置,在“定制屬性”界面的最上方點擊“保存”。

          7.測試連接

          image

          系統提示:成功信息,表明,連接池配置成功。
          連接池配置成功后,WebSphere需要重新啟動。

          (二)、SQL server連接池的配置

          SQL Server連接池的配置步驟同Oracle,具體的參數值:
          JDBC 提供程序:下拉選擇Microsoft JDBC driver for MSSQLServer 2000
          Sybase連接池的配置步驟也同Oracle,具體的參數值:
          常規屬性中的名稱:Microsoft JDBC driver for MSSQLServer 2000
          常規屬性中的描述:Microsoft JDBC driver for MSSQLServer 2000
          常規屬性中的類路徑:
          ${ORACLE_JDBC_DRIVER_PATH}/msbase.jar
          ${ORACLE_JDBC_DRIVER_PATH}/mssqlserver.jar
          ${ORACLE_JDBC_DRIVER_PATH}/msutil.jar

          常規屬性中的實現類名:默認
          數據源中的名稱:SQLSERVER_JNDI
          數據源中的JNDI:SQLSERVER_JNDI
          定制屬性中的databaseName:數據庫名稱
          定制屬性中的serverName:Sybase數據庫服務器的名稱或IP
          定制屬性中的portNumber:端口號
          定制屬性中的preTestSQLString:SELECT COUNT(1) FROM TEST
          同Oracle,手工“新建”user和password屬性,值為數據庫的用戶名和口令,該用戶的缺省數據庫必須為databaseName的值。
          其他默認。

          (三)、Sybase連接池的配置

          JDBC 提供程序:下拉選擇Sybase JDBC Driver
          Sybase連接池的配置步驟也同Oracle,具體的參數值:
          常規屬性中的名稱:SYBASE JDBC Driver
          常規屬性中的描述:SYBASE JDBC Driver
          常規屬性中的類路徑:${ORACLE_JDBC_DRIVER_PATH}/jconn2.jar
          常規屬性中的實現類名:默認
          數據源中的名稱:SYBASE_JNDI
          數據源中的JNDI:SYBASE_JNDI
          定制屬性中的databaseName:數據庫名稱
          定制屬性中的serverName:Sybase數據庫服務器的名稱或IP
          定制屬性中的portNumber:端口號
          定制屬性中的preTestSQLString:SELECT COUNT(1) FROM TEST
          同Oracle,手工“新建”user和password屬性,值為數據庫的用戶名和口令,該用戶的缺省數據庫必須為databaseName的值。
          其他默認。

          (四)、MySQL連接池的配置

          MySQL連接池的配置步驟同Oracle稍有不同,JDBC 提供程序中并沒有MySQL中的選項,選Oracle JDBC Driver就可以,實際運行中,WebSphere是以設置的參數為準的。

          具體的參數值:
          常規屬性中的名稱:MySQL JDBC Driver
          常規屬性中的描述:MySQL JDBC Driver
          常規屬性中的類路徑:${ORACLE_JDBC_DRIVER_PATH}/mysql-connector-java-3.1.10-bin.jar
          常規屬性中的實現類名:com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
          數據源中的名稱:MYSQL_JNDI
          數據源中的JNDI:MYSQL_JNDI

          image

          由于WebSphere沒有缺省的MySQL選項,“定制屬性”全部需要手工新建。具體的值要根據MySQL的實際環境要做相應修改(petshop是我機器上的數據庫名稱)。

          三、應用程序中測試連接池。

          1. jsp程序中測試連接池

          附件中的TestConnPoolWeb.ear文件直接發布后,
          運行:http://localhost:9080/TestConnPoolWeb/oracle_pool.jsp,結果:ORACLE_JNDI:FromTest
          運行:http://localhost:9080/TestConnPoolWeb/sqlserver_pool.jsp,結果:SQLSERVER_JNDI:FromTest
          運行:http://localhost:9080/TestConnPoolWeb/sybase_pool.jsp,結果:SYBASE_JNDI:FromTest
          運行:http://localhost:9080/TestConnPoolWeb/mysql_pool.jsp,結果:MYSQL_JNDI:FromTest

          2. 程序說明

          得到連接的方法:

          private static Connection getConnection(String strConnPoolJndi) throws NamingException, SQLException {
          Context ctx = null;
          ctx = new InitialContext();
          DataSource ds = (DataSource)ctx.lookup(strConnPoolJndi);
          Connection conn = ds.getConnection();

          return conn;

          }

          參數strConnPoolJndi分別為:ORACLE_JNDI、SQLSERVER_JNDI、SYBASE_JNDI、MYSQL_JNDI,對于相應的數據庫。
          從表中查詢一條數據:

          public static String getDBData(String strConnPoolJndi) {
          String strReturn="";
          Connection conn = null;
          Statement st = null;
          ResultSet rs = null;

          try {
          conn = getConnection(strConnPoolJndi);
          st = conn.createStatement();
          rs = st.executeQuery( "select C1 from TEST" );

          if (rs.next()) {
          strReturn = rs.getString(1);
          }

          }
          ...

          jsp中打印出表中的一條記錄:

          <%
          out.println("ORACLE_JNDI:" + test.pool.TestPool.getDBData("ORACLE_JNDI"));
          %>


          附件TestConnPoolWeb.ear(包括源程序)
          posted @ 2007-03-28 11:08 edsonjava 閱讀(1682) | 評論 (0)編輯 收藏
           
          1.環境 sun jdk1.4.2,eclipse3.1 MyEclipse 4.0
          2.介紹:MyEclipse配置Websphere6的時候需要做比配置其它server更多的工作;
          ??????? Websphere6必須和MyEclipse安裝在一個機器上;
          ??????? Websphere6必須使用IBM的jdk,位置在<was-install-dir>/java;
          ??????? 只有MyEclipse Enterprise J2EE project可以部署在Websphere6上。
          3.Websphere6安裝和配置
          第一步 點擊創建概要表(profile);
          第二步 輸入概要表名稱(例如 MyEclipse);
          第三步 選擇概要表路徑 D:\IBM\WebSphere\AppServer\profiles\MyEclipse;
          第四步 輸入結點名:MyEclipseNode,主機名:127.0.0.1;
          第五步 輸入端口號,默認端口即可;
          第六步 不選做為windows服務;
          第七步 完成;
          第八步 啟動服務器,打開管理控制臺;
          第九步 點擊服務器-應用服務器,然后點擊服務器名稱;
          第十步 查看標簽“配置”->故障診斷->記錄和跟蹤;
          第十一步 點擊“JVM日志”->配置標簽,修改“文件名”為console,點擊確定;
          第十二步 提示已更改了您的本地配置。單擊“保存”應用對主配置的更改,點擊“保存”,下一頁再點“保存”;
          第十三步 推出管理控制臺,停止服務器;
          4.MyEclipse配置
          第一步 配置 Window > Preferences > MyEclipse > Application Servers > WebSphere 6;
          第二步 配置JDK JRE home directory 為 /java,WebSphere只能運行在IBM JDK上;
          ??????? (WebSphere is known to run on a heavily modified IBM JDK and running it with Sun's JDK, JRockit, GCJ or other JDKs simply will not work)
          第三步 創建 Web project 例如“IBMTestWeb”,再創建 Enterprise project 例如“IBMTest”;
          第四步 部署 必須點擊菜單條上的部署的快捷方式 Deploy MyEclipse J2EE Project to Server;

          (MyEclipse Deployment Manager must be launched by clicking the button on your toolbar as shown in the screenshot below)
          第五步 部署 IBMTest,選擇第二項“Packaged Archive” 部署-完成;
          第六步 在MyEclipse中啟動 Websphere6,等待出現“為電子商務開放服務器 server1”,即啟動完成;
          (wait for the Server server1 open for e-business message as before.)
          第七步 打開Websphere6的管理控制臺 應用程序->安裝新的應用程序,選擇
          ?????????? D:\IBM\WebSphere\AppServer\profiles\MyEclipse\installableApps\IBMTest.ear,點擊下一步;
          第八步 選擇“啟用類重新裝入,點擊下一步;
          第九步 選中 “IBMTestWeb.war”,點擊下一步 ;
          第十步 選中 “IBMTestWeb.war”,點擊下一步 ;
          第十一步 提示“應用程序 IBMTest 安裝成功?!焙?,點擊? “保存到主配置”,最后啟動該應用程序;
          第十二步 刪除以前部署的包,重新部署 IBMTest,選擇第一項“Exploded Archive”,下面選擇“Delete remote resource before deployment” 部署-完成;


          ?最終訪問http://127.0.0.1/IBMTestWeb/index.jsp? 這樣就可以實時調試,實時更新了
          posted @ 2007-03-28 10:41 edsonjava 閱讀(675) | 評論 (0)編輯 收藏
           

          摘自 IBM WebSphere 開發者技術期刊

          引言

          Spring 和 Hibernate 是兩個開放源代碼項目,有些客戶可能有興趣使用它們。本文描述如何配置這些框架,以便與 WebSphere Application Server 一起在各種場景中使用。不過,本文不是對某一框架的認可或推薦。IBM 也不直接支持其中任何一個開放源代碼項目。IBM 支持有限制地使用這些應用程序框架(如下面所述),就像它支持在 WebSphere Application Server 上運行的任何客戶的應用程序一樣。本文還描述一些不支持的場景,在 WebSphere Application Server 和堆棧產品中應該避免此場景。





          回頁首


          產品和客戶技術支持

          一個用戶理應關注的問題是那些使用開放源代碼的項目所獲得的支持,以及使用開放源代碼對供應商支持其許可產品的影響。IBM 了解某些客戶可能希望將非 IBM 的框架和 IBM WebSphere Application Server 結合使用,并且在為客戶提供一些信息,以促進他們為 IBM WebSphere Application Server 創建最可靠的操作環境。IBM 考慮了客戶安裝的開放源代碼和應用程序框架,它們或者綁定為應用程序的一部分,或者作為共享庫成為應用程序代碼的一部分。在使用開放源代碼項目時通過謹慎地利用此信息,客戶可以滿懷信心地使用 IBM 產品,并繼續訪問 IBM 產品和技術支持。如果在將這些框架與 WebSphere 產品結合使用時遇到問題,IBM 將盡力確保 WebSphere 產品不出現問題。

          如果客戶認真研究了本文中的建議,并記住避免和理解以下幾個關鍵點,則預期可以安全地在 IBM 產品上使用 Spring 和 Hibernate 之類的框架:

          • 客戶必須確保按 WebSphere Application Server 允許的方式使用這些框架。具體說來,這意味著客戶在使用內部產品接口時,不應使用框架——遺憾的是,許多開放源代碼框架在未經認真配置的情況下就這樣使用了。客戶應避免在 WebSphere 上明確記錄應避免的場景。

          • 對于開放源代碼框架,客戶應該確保理解并能夠訪問他們與 WebSphere Application Server 一起使用的框架的匹配源代碼和二進制。

          • 建議客戶從開放源代碼社區或使用開放源代碼社區的合作伙伴那里獲取框架的補救性服務。

          有關 IBM 支持和策略的詳細信息,請參考 IBM Support HandbookWebSphere Application Server Support Statement。

          盡管在開放源代碼環境中使用 WebSphere Application Servers 時按照本文的建議做法有助于增強您的體驗,但本文并沒有列出開放源代碼組件影響 WebSphere Application Server 操作或其他組件操作的所有情況。使用開放源代碼的用戶務必檢查所有組件的規范,以避免出現許可、支持和技術問題。

          在本文的剩余部分中,當使用術語“支持”或“受支持”時,描述的用法僅限于使用 IBM 有文檔記錄的功能。作者已盡了最大努力來提供有關如何配置和使用這些框架的建議,以確保其用法與記錄的產品行為一致。





          回頁首


          Hibernate

          Hibernate 是傳統的 Java? 對象 (POJO) 的開放源代碼持久性框架,它通過 XML 配置文件提供 POJO 到關系數據庫表的與對象相關的映射。Hibernate 框架是應用程序調用的、用于數據持久性的數據訪問抽象層。此外,Hibernate 還提供了從 Java 類到數據庫表(以及從 Java 數據類型到 SQL 數據類型)的映射以及數據查詢和檢索功能。Hibernate 生成必需的 SQL 調用,還負責結果集處理和對象轉換。

          Hibernate 由 Gavin King(Hibernate 項目的奠基人)領導的軟件開發團隊開發,目的是解決 EJB 2.x 實體 EJB 中存在的諸多缺陷。Hibernate 與 JBoss Group 緊密關聯,這是由于 JBoss 雇傭了大量的一流 Hibernate 開發人員的結果。最近,在 Java Community Process (JCP) 中的持久性框架的發展中已涉及 Hibernate,并且 Hibernate 的許多概念已合并到 Java Persistence API (JPA) 規范中。最新版本的 Hibernate 將發展為符合 JPA 規范。JPA 似乎將成為主要的 Java 持久性 API。具體說來,JPA 是 Java EE 5 必要部分。(有關如何使用 Hibernate 的 developerWorks 文章,請參見參考資料。)

          盡管下文的描述中支持在 WebSphere Application Server 上使用 Hibernate,但是 IBM 并不直接支持 Hibernate。任何人使用 Hibernate 時都需要按 Hibernate Project Support page 的描述獲取對它的支持。客戶應該保留與開源項目相關的源數據,以用于問題調試。

          使用場景

          以下場景描述了有關如何將 Hibernate 與 WebSphere Application Server 和 WebSphere 堆棧產品結合使用的一些可能場景。這些僅是示例場景,不應認為是推薦的場景。前文已提到,客戶應該保留與開源項目相關的源數據,以用于問題調試

          使用 WebSphere Application Server 數據源

          為使 Hibernate 從 WebSphere Application Server 獲取數據庫連接,必須使用 Java EE(以前稱為 J2EE)規范中強制規定的資源引用。這可以確保 WebSphere Application Server 能夠為連接池、事務語義和隔離級別提供正確的行為。通過設置 hibernate.connection.datasource 屬性(在 Hibernate 配置文件中進行了定義)將 Hibernate 配置為從 WebSphere Application Server 檢索數據源,以引用在模塊的部署描述符中定義的資源引用(例如 java:comp/env/jdbc/myDSRef)。例如:

          <property name="hibernate.connection.datasource">
          	java:/comp/env/jdbc/myDSRef
          </property>

          Web 應用程序的 Java EE 資源引用在 WAR 文件級別定義,這意味著容器中的所有 Servlet 和 Java 類均共享資源引用。在 EJB 模塊內部,資源引用在各個 EJB 組件上定義。這意味著,如果許多 EJB 組件都使用相同的 Hibernate 配置,則每個 EJB 必須在每個 EJB 組件上定義相同的引用名稱。這會導致復雜的情況,稍后我們將進一步討論。

          配置了數據源之后,確保 Hibernate 正常工作的下一個步驟是正確配置事務支持。

          事務策略配置

          為了正確地使用事務,Hibernate 需要兩個重要部分的配置。第一個部分是 hibernate.transaction.factory_class,它定義事務控制,第二個部分是 hibernate.transaction.manager_lookup_class,它定義注冊事務同步的機制,這樣,當持久性管理器需要與數據庫同步更改時會在事務端得到通知。對于事務控制,同時支持容器管理的配置和 Bean 管理的配置。將 Hibernate 和 WebSphere Application Server 結合使用時,必須在 Hibernate.cfg.xml 中設置以下屬性:

          • 對于容器管理的事務:

            <property name="hibernate.transaction.factory_class">
            	org.hibernate.transaction.CMTTransactionFactory
            </property>
            <property name="hibernate.transaction.manager_lookup_class">
            	org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
            </property>

          • 對于 Bean 管理的事務:

            <property name="hibernate.transaction.factory_class">
            	org.hibernate.transaction.JTATransactionFactory
            </property>
            <property name="hibernate.transaction.manager_lookup_class">
            	org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
            </property>
            <property name="jta.UserTransaction">
            	java:comp/UserTransaction
            </property >

          jta.UserTransaction 屬性將工廠類配置為從 WebSphere 容器獲取 UserTransaction 對象實例的實例。

          WebSphere Application Server V6.x 和更高版本在 WebSphere 平臺上支持 hibernate.transaction.manager_lookup_class 屬性,WebSphere Business Integration Server Foundation V5.1 和更高版本也支持此屬性。此屬性將 Hibernate 配置為使用在 WebSphere Business Integration Server Foundation V5.1 和 WebSphere Application Server V6.0 中引入的 ExtendedJTATransaction 接口,WebSphere ExtendedJTATransaction 接口建立了一個模式,并通過 JTA 1.1 規范在 Java EE 5 中正式確立。

          WebSphere Application Server 環境中 Hibernate 的使用模式

          當結合使用 Hibernate 和 WebSphere Application Server 時,Hibernate 的“按請求會話”和“長對話”模式均可使用??蛻舯仨氝x擇適用于其應用程序的模式,不過我們主張使用“按請求會話”模式,因為它可以提供更好的擴展性。

          • 多個隔離級別

            可共享的連接通過讓多個資源用戶能夠共享現有的連接,改進了在 WebSphere Application Server 中的性能。不過,如果可共享的連接和多個隔離級別都是必需的,則為每個連接配置定義單獨的資源引用和 Hibernate 會話工廠。不能夠更改共享連接的隔離級別。因此,也不可能使用 hibernate.connection.isolation 屬性在共享連接上設置隔離級別。有關連接共享的策略和約束的詳細信息,請參見 在 WebSphere Application Server V5 中共享連接。(盡管本文通常適合于在 WebSphere Application Server V5 上使用的所有共享連接,但是連接共享建議仍適用于在 V6.x 上運行的 Hibernate。)

          • Web 應用程序

            可以在 HttpSession 對象中使用和存儲 Hibernate 的“長對話”會話;不過,Hibernate 會話持有活動實例,由于可能需要將會話序列化或將其復制到其他集群成員,因此將其存儲在 HttpSession 中不是可擴展模式。最好使用 HttpSession 來存儲斷開連接的對象(只要它們非常小,即 10KB 到 50KB),并且在需要更新時,重新將它們與新的 Hibernate 會話關聯。這是因為 HttpSession 最適用于書簽,而不適用于緩存。在 Improving HttpSession Performance with Smart Serialization 中討論了如何使 HttpSession 的內存使用率降至最低。不是將 HttpSession 用作緩存,而是考慮使用 ObjectGrid 或 DistributedObjectCache 之類的 WebSphere 數據緩存技術,這在下一部分進行介紹。

          有關高性能、可擴展應用程序的最佳實踐,強烈建議您閱讀 Performance Analysis for Java Websites 一書。

          集成二級緩存

          Hibernate 會話表示工作單元的范圍。在 Hibernate 會話的生命周期中,Session 接口管理持久性。通常,它通過保持對單一線程有效的一級緩存實例并維護它負責的映射實體類實例的識別或狀態做到這一點。在完成工作單元(會話)時釋放緩存。還可以將二級緩存配置為在 SessionFactory 的所有會話之間共享(包括在群集之間共享)。請注意,在 Hibernate 中進行緩存會導致一些需要解決的問題。第一,對于數據庫的外部更改或跨群集更改,無法確保緩存的一致性(除非使用識別群集的緩存)。第二,其他層(如數據庫)可能已經緩存,從而使 Hibernate 緩存的值降至最低。在進行應用程序設計時,必須認真考慮這些問題,但是這些問題超出了本文的討論范圍。

          在發布時,沒有確定與 WebSphere Application Server 相關的 Hibernate 群集識別緩存的行為,因此,還不能確定是否支持該行為,我們對此不做進一步的討論。所以,需要分布式緩存的客戶應當考慮創建使用屬性 hibernate.cache.provider_class 實現 org.hibernate.cache.CacheProvider 的類,這會在 WebSphere 中使用兩個分布式緩存實現中的一個。

          Hibernate 附帶了幾個預配置的緩存。在 Hibernate Cache 文檔頁中可以找到關于這些緩存的信息。對于只讀數據,一個內存緩存可能就足夠了。不過,當聚集應用程序并需要群集識別緩存時,本地只讀緩存是不夠的。如果需要分布式緩存,我們建議使用 WebSphere 提供的分布式緩存實現之一??梢詫⑺鼈冇米?Hibernate 的二級緩存:

          在 WebSphere Enterprise Service Bus 和 WebSphere Process Server 中使用 Hibernate

          WebSphere Process Server 和 WebSphere Enterprise Service Bus (ESB) 將 Service Component Architecture (SCA) 和 Service Data Objects (SDO) 用作 SOA 的裝配和編程模式。(請參見參考資料,了解關于 SCA 和 SDO 的更多信息。)SCA 組件不是 Java EE 組件,因此它們沒有資源引用,但是改為依靠服務和適配器來連接系統。在構建 Java SCA 組件時,不能使用資源引用;因此,SCA 組件不能直接使用 Hibernate。

          在這種情況下,應將 Hibernate 持久性隱藏在某種 Facade 后面。有兩個備選方案:

          • 創建本地 EJB 會話 Facade 以包裝 Hibernate 持久性。會話 Facade 提供適配器邏輯,以便將 Hibernate 實體 POJO 映射到服務數據對象并返回。然后集成開發人員可以使用 EJB 導入調用會話 Facade,并以緊密耦合方式使用對應的服務質量 (QoS) 調用它。

          • 創建 EJB Web 服務會話 Facade 以包裝 Hibernate 持久性。然后集成開發人員可以使用 Web 服務導入調用持久性的 Web 服務。這不需要構建 POJO 到 SDO 的轉換程序,由于目前 SCA 對數據類型只使用 SDO。圖 1 說明了使用兩個模式的業務流程,但該流程的詳細信息不在本文的討論范圍之內。


          圖 1. 示例業務流程
          圖 1. 示例業務流程

          WebSphere Application Server V6.1 上的 Hibernate JPA API

          Hibernate 的 JPA 支持提供 JPA 標準持久性,并且是專有 Hibernate API 的較好備選方案。Hibernate 的 JPA 實現需要基于 Java EE 5 的運行時,因此,它僅在 WebSphere Application Server V6.1 或更高版本上運行。在發布時,Hibernate 的 JPA 支持不能在 WebSphere z/OS 和 iSeries 平臺上運行。Hibernate 文檔描述了如何使用 Hibernate 的 JPA 實現包裝和部署應用程序。

          避免的場景

          以下各部分將描述不支持的配置和用例。這僅表示當前已確定的不支持的場景。其他不支持的場景將在以后確定。

          不支持的事務配置

          Hibernate 文檔描述了用于在 WebSphere Application Server 版本 4 和 5 產品上運行的事務策略配置,但是這些配置使用內部 WebSphere 接口,在那些早期版本上不受支持。在上面的事務策略配置部分中描述了 Hibernate 唯一支持的事務配置。正如前面所述,這意味著僅在 WebSphere Application Server V6.x 之后(包括 V6.x)的版本和 WebSphere Business Integration Server Foundation V5.1 上支持使用 Hibernate。

          不可交互操作的/不可移植的功能

          JPA 規范中的 3.2.4.2 部分描述了可能導致互操作性和潛在的可移植性問題的情況。這與結合使用延遲加載(即 @Basic(fetch=LAZY))和分離對象有關。將分離對象合并回會話時,JPA 將檢查該對象,并使用任何更改值來更新數據存儲。不過,數據對象是簡單的 POJO。在分離時,如果部分 POJO 狀態沒有加載,則在合并回去時可能顯示為已更改。要使它正常工作,供應商必須實現特定于其運行時的序列化技術。這不是互操作的,語義也不能移植。





          回頁首


          Spring

          通常將 Spring 描述為輕量級容器環境,但是將其描述為用于簡化開發的框架可能更適當。其主要概念是使用依賴項注入 (DI) 和面向方面的編程 (AOP) 來簡化和平穩地進行從開發到測試再到生產的轉換。

          Spring 框架是一個流行的開放源代碼框架,它由 Interface21, Inc. 根據 Rod Johnson 發表的關于依賴項注入 (DI) 的設計模型開發。Spring 可以在獨立應用程序或應用服務器中使用。由于 Spring 提供的一些服務通常由應用服務器運行時提供,所以需要認真設計 Spring 與應用服務器的結合使用,以避免在 Spring 實現和應用服務器提供的實現之間發生沖突。

          本部分其余內容將描述使可能發生的實現沖突或矛盾點降至最低的用例,還將描述應避免的其他矛盾點(如果可能)。

          盡管下文的描述中支持在 WebSphere Application Server 上有限使用 Spring,但是 IBM 并不直接支持 Spring。任何人使用 Spring 時都需要按 Spring Product Support page 的描述獲取對它的支持??蛻魬摫A粲糜趲椭{試問題的與開放源代碼項目相關的源。

          使用場景

          以下部分將描述 Spring 在 WebSphere Application Server 上的一些使用場景。不過,應由客戶負責確定這些場景是否適合他們的具體情況。IBM 不支持、也不建議使用 Spring。本文僅演示在 WebSphere Application Server 上使用 Spring 的一組場景,并演示必須如何自定義 Spring 才能與 WebSphere Application Server 一起運行。

          簡單的 Bean 邏輯容器

          使用 Spring 的最常用的場景之一是使用簡單的 Java Bean 類配置并驅動業務邏輯。本文稍后描述的避免了問題的 Spring 應用程序在 WebSphere Application Server 中運行時不應該有任何問題。Spring documentation page 應提供了使用 Spring Bean 構建應用程序的足夠信息。此處不存在任何特定于 WebSphere 的內容。

          在 WebSphere 中使用 Spring DAO 框架

          下面是關于在 WebSphere Application Serveruse 上使用 Spring DAO 功能的三個示例:

          • 基本型 DAO 用法

            WebSphere Application Server 管理在應用服務器執行環境中使用的資源。需要訪問 JDBC 數據源之類資源的 Spring 應用程序應該利用 WebSphere 管理的資源。為此,需要執行以下若干步驟。

            1. 在開發過程中,應該使用資源引用配置 WAR 模塊。例如:

              <resource-ref>
              	<res-ref-name>jdbc/springdb</res-ref-name>
              	<res-type>javax.sql.DataSource</res-type>
              	<res-auth>Container</res-auth>
              	<res-sharing-scope>Shareable</res-sharing-scope>
              </resource-ref>
              

            2. 對于 EJB JAR 文件,應該在需要訪問數據源的每個 EJB 中聲明同一資源引用。

            3. 然后使用與以下類似的內容在 Spring 配置文件中聲明數據源 Bean:

              <bean id="WASDataSource" 
                  class="org.springframework.jndi.JndiObjectFactoryBean">
              	<property name="jndiName" 
              		value="java:comp/env/jdbc/springdb"/>
              	<property name="lookupOnStartup" 
              		value="false"/>
              	<property name="cache" 
              		value="true"/>
              	<property name="proxyInterface" 
              		value="javax.sql.DataSource"/>
              </bean>

              這將配置 Bean,以便從模塊的配置引用查找數據源。注意,jndiName 屬性值匹配與資源引用中聲明的資源引用名稱連接的模式 java:comp/env/

            4. 然后,Spring 應用程序可以在適當情況下使用數據源 Bean。

            5. 將應用程序部署到 WebSphere Application Server 時,必須配置資源提供程序和資源數據源,以便由 Spring 應用程序資源引用使用。在部署過程中,在模塊的部署描述符中聲明的資源引用將綁定到應用服務器的配置數據源。

          • 事務型 DAO 用法

            在 Spring 中,有許多方法可以驅動事務控制下的資源更新。這包括編程形式和聲明形式。聲明形式有注釋形式和非注釋形式。在使用 Spring 事務支持時,獲得權限的重要方法是適當地配置 Spring 對底層事務管理器的使用。在 WebSphere Application Server 中,Spring 使用的事務管理器的唯一支持形式如下:

            <bean d="transactionManager"
            class="org.springframework.transaction.jta.JtaTransactionManager">
            	<property name="autodetectTransactionManager"
            		value="false"/>
            </bean>

            可以將此事務管理器 Bean 提供給 JdbcTemplate 類,或通過事務策略的聲明形式利用。有關為什么這是唯一形式的詳細信息,請參見避免的場景部分。

          • 休眠型 DAO 用法

            Spring 記錄將 Hibernate 和 Spring 一起使用的基本設置。在 WebSphere Application Server 環境中使用 Hibernate 和 Spring 時,有必要將上述對二者的配置要求合并在一起。正如前面所述,在 Spring 和 Hibernate 中使用 JNDI 訪問事務管理的資源和適當配置是必要的。

          Spring Web MVC

          Spring 的 Web MVC 框架在某一時間內一直是其他框架的備選框架。由 WebSphere Application Server 提交、使用和支持的 Web MVC 框架包括 JSF 和 Struts。Spring 參考手冊描述了如何將 Spring 與這些 Web 框架集成。盡管 WebSphere Application Server 支持上面的任何用法,但 IBM 僅為 WebSphere Application Server 附帶的框架提供缺陷支持。

          計劃和線程池

          如果需要異步運行代碼,那么應該使用 WorkManagerTaskExecutor。在 Spring 中,這是唯一使用由 WebSphere Application Server 托管的線程池的 TaskExecutor 實現。其他 TaskExecutor 實現可以啟動非托管線程。有關非托管線程的詳細信息,請參見避免的場景。

          在 WebSphere Application Server 管理控制臺中,通過導航到 Resources => Asynchronous beans => Work managers 可以對 WorkManager 進行設置。然后可以在 Spring 配置文件中使用資源的 JNDI 名稱來定義 WorkManagerTaskExecutor。

          Spring Portlet

          Spring Portlet 可以在 WebSphere Portal V6.0 和 WebSphere Application Server V6.1 Portlet 容器中運行。有關 Spring Portlet 的示例集,請參見 Spring Portlet MVC。在 WebSphere Application Server V6.1 Portlet 容器中運行 Portlet 需要創建其他 Web 應用程序才能定義 Portlet 的布局和聚合。從 WebSphere Application Server 信息中心可以獲得關于如何使用 Portlet 聚合器標記庫的信息,在文章 探索 WebSphere Application Server V6.1 Portlet 容器: 第 1 部分:Portlet 容器介紹 中的其他補充信息中也可找到。

          通常結合使用 JSF 和 Portlet 進行呈現。關于如何將 Spring、Hibernate、JSF 和 WebSphere Portal 組合起來運行的信息可以通過文章 Configuring Hibernate, Spring, Portlets, and OpenInSessionViewFilter with IBM WebSphere Portal Server 了解。

          避免的場景

          已經知道以下場景在 WebSphere Application Server 環境中會出現問題,應該避免它。列出這些場景的原因有許多,不過,最常見的原因是 Spring 使用了內部 WebSphere 接口。這些內部接口的使用破壞了 WebSphere Application Server 保證應用程序環境的完整性和管理應用程序資源的能力。應該避免使用任何依賴于內部 WebSphere 接口的 Spring 功能。

          REQUIRES_NEW 和 NOT_SUPPORTED 事務策略

          WebSphere Application Server 為維護數據完整性提供了可靠的環境。它提供此環境的方法之一是始終確保應用程序邏輯在事務范圍內執行。在容器將要執行業務邏輯時,它會檢查事務狀態。如果全局事務不是動態的,則容器會創建并管理新的 local transaction containment (LTC) 范圍。容器將在業務邏輯結束時完成 LTC,并在任何應用程序啟動的全局事務過程中將它掛起。這可以確保在業務邏輯執行結束時總是正確地清除資源。

          Spring 為管理事務提供了機制。不過,它支持的事務策略超出了通常可以在應用程序級別處理的策略集的范圍。具體說來,它為 REQUIRES_NEW 和 NOT_SUPPORTED 的 EJB 容器管理的語義提供它自已的等效支持。這兩個容器管理的策略都需要掛起和恢復事務的功能,但是為使用 EJB 容器而保留了此功能(不適當的使用會導致數據完整性問題)。為提供此行為,Spring 使用了內部 WebSphere 接口,但不知道它對容器的影響。使用內部接口掛起和恢復事務將破壞 Web 和 EJB 容器管理資源和 LTC 的功能,并可能使容器處于未知狀態,從而可能導致數據損壞。

          以下兩個步驟可以避免此場景:

          • 不使用需要掛起和恢復語義的 Spring 事務策略。
          • 不配置 Spring JtaTransactionManager 使其支持掛起和恢復語義。

          第一是應用程序設計時間限制。如果您構建應用程序,請不要在語義中設計需要使用 Spring 來掛起和恢復事務。如果需要掛起和恢復語義,請改為使用無狀態會話 EJB。

          第二是部署時間配置約束。如果在 WebSphere Application Server 中部署基于 Spring 的應用程序,則該應用程序在嘗試使用 Spring 的掛起和恢復語義時將會失敗。以這種方式失敗比隨機數據損壞錯誤要好得多。下面是必須在 WebSphere Application Server 中配置 Spring JtaTransactionManager 的正確方法:

          <bean id="transactionManager"
          class="org.springframework.transaction.jta.JtaTransactionManager">
          	<property name="autodetectTransactionManager" 
          		value="false"/>
          </bean>
          

          這將把 transactionManager Bean 配置為使用 UserTransaction API 來控制事務的開始、提交和回滾。這使得可以不使用掛起和恢復語義來支持事務控制。

          上面所述的 Spring JtaTransactionManager 用法不支持與現有事務同步的 Spring 注冊功能。要做到這一點,需要使用 WebSphereTransactionManagerFactoryBean。使用 WebSphereTransactionManagerFactoryBean 的客戶或調用內部事務管理器接口的任何其他類將不受支持。

          JDBC 本機連接

          當各種 JDBC 操作需要與本機 JDBC 資源交互時,Spring 可提供訪問本機連接的機制。當在 JdbcTemplate 類上設置了 NativeJdbcExtractor 類時,JdbcTemplate 類才可以利用此功能。設置 NativeJdbcExtractor 類后,當與 WebSphere Application Server 一起使用時,Spring 總是向下找到本機 JDBC 連接。這將忽略以下 WebSphere QoS 功能和優點:

          • 連接處理跟蹤和再關聯
          • 連接共享
          • 事務狀態
          • 池管理
          • 最后的代理事務參與。

          這帶來的另一個問題是 WebSphereNativeJdbcExtractor 類將依賴于內部 WebSphere 適配器類。這些內部類可能因 WebSphere Application Server 的版本而異,并且以后可能更改,從而中斷依賴于此功能的應用程序。

          在 WebSphere Application Server 上不支持使用 NativeJdbcExtractor 類實現(例如 WebSphereNativeJdbcExtractor),客戶應避免需要它的場景。備選方案是使用 WebSphere Application Server WSCallHelper 類來訪問非標準供應商的數據源擴展。

          類加載器的缺點

          Spring 和 WebSphere Application Server 都使用多個開放源代碼項目,遺憾的是,它們共有的項目版本并不總是匹配。應該將 Spring 依賴項包裝為應用程序的一部分,并且應該按照下面的描述設置服務器以避免沖突。否則,類加載器可能無法為運行時或應用程序加載適當的版本。通常,這將導致在日志中出現有關類的版本不匹配、ClassCastExceptions 或 java.lang.VerifyErrors 等異常。

          其中一個示例是使用 Jakarta Commons Logging。配置供應用程序使用的 Jakarta Commons Logging (JCL),或者使用不是由應用服務器提供的其他版本的 JCL(例如,使用應用程序代碼嵌入的 JCL)需要在 WebSphere Application Server 上進行特定的配置。有關如何配置部署的應用程序,以使用內嵌版本的常用技術的策略,請參見 Integrating Jakarta Commons Logging。請關注支持網站,了解是否提供了如何在 WebSphere Application Server V6.x 產品上配置內嵌 JCL 的更新。這僅僅是沖突的一個示例。其他示例可能包括應用程序使用的 JDOM 或特定版本的 JavaMail。不支持將 WebSphere Application Server 的 JAR 文件替換為這些或具有更高版本或不同版本的其他包。

          在 WebSphere Application Server 上困擾 Spring 用戶的另一個類加載器問題是 Spring 加載資源的方法。資源可以包括消息綁定之類的內容,通過類加載器層次結構和在層次結構中查找資源的各種策略,能夠在非目標位置找到使用公共名稱的資源。可以使用 WebSphere Application Server 類加載器查看器來幫助解決此問題。合并資源和包括其他版本的公共庫可能需要應用程序將資源重命名為唯一的名稱。

          非托管線程

          某些 Spring 場景可能導致創建非托管的線程。非托管線程對 WebSphere Application Server 是未知的,并且不能訪問 Java EE 上下文信息。此外,它們可以在 WebSphere Application Server 不知道的情況下利用資源,存在管理員不能控制其數量和資源使用情況的問題,在發生故障時,它們還阻止應用服務器正常關機或恢復資源。應用程序應該避免導致啟動非托管線程的任何場景:

          • registerShutdownHook

            第一種場景是在使用 Spring AbstractApplicationContext 或它的一個子類時。registerShutdownHook 是一個公共方法,它可以創建線程并將其注冊到 Java 虛擬機,以便在關機時運行以關閉 ApplicationContext。應用程序可以避免這一點,方法是利用從 WebSphere 容器接收的常規生命周期通知來顯式調用 ApplicationContext 上的關閉。

          • 入站 JMS 消息

            Spring JMS MessageListenerContainer 類利用啟動非托管線程(例如 SimpleAsyncTaskExecutor)的類來偵聽傳入的 JMS 消息。Spring JMS 容器不僅可以啟動非托管線程,而且還可以使用無法由 Java EE 環境中的應用程序調用的 JMS API。(有關詳細信息,請參見 Java EE 規范 J2EE.6.6 部分。)

            可以使用 Spring 遠程處理 API 生成 JMS 消息,但是客戶應該使用消息驅動的 Bean 處理傳入的消息,避免使用 Spring JMS MessageListenerContainer。這可以使用容器適當地控制和恢復資源和事務。

          • JMX 服務器

            應用程序應避免使用 Spring JMX ConnectorServerFactoryBean,它是啟動非托管線程的另一個類。WebSphere Application Server 已經向 JMX 服務器提供了多個受支持的連接器協議。應用程序可以向 WebSphere Application Server 的 JMX 服務器注冊 MBean,并對它們進行遠程訪問。

          • 非集成的計劃包

            Spring 提供或集成了大量的計劃包。只有與 WebSphere Application Server 托管的線程一起使用的 Spring 計劃包是 CommonJ WorkManager 計劃包。其他包(如 quartz 和 JDK Timer)會啟動非托管線程,應該避免使用。

          • WeakReferenceMonitor

            Spring 為簡化開發 EJB 組件提供了方便的類。請注意,這些方便的類會生成 WeakReferenceMonitor 用來執行清除操作的非托管線程。





          回頁首


          結束語

          如果經過充分考慮避免了問題場景,則可以在 WebSphere 平臺上以完全支持的方式使用 Hibernate 和 Spring。尤其是,客戶必須確保他們使用這些框架不涉及使用內部 WebSphere 接口。獲得 IBM 的 WebSphere Application Server 支持的用戶如果在將 WebSphere Application Server 和 Spring 或 Hibernate 一起使用時遇到問題,可以獲得 IBM 的幫助來診斷問題,除非問題被確認為使用了不支持的場景,或不是 WebSphere Application Server 的問題??蛻魬摪凑障鄳椖烤W絡上的說明自行從其他公司獲得對 Hibernate 和 Spring 框架的支持。


          posted @ 2007-03-27 17:17 edsonjava 閱讀(459) | 評論 (0)編輯 收藏
           
          下載mysql jdbc 驅動

          1.建立用戶自定義配置jdbc提供程序 (!!!)
          配置類路徑指向 mysql jdbc driver jar file
          實現類名為:com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

          2.建立數據源
          設置jndi名等職


          3.定制連接池屬性(!!!)
          自定義下列名稱和值
          名稱 ?? 值
          databaseName schemaname?autoReconnect=true
          factory com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory
          password password
          port 3306???
          serverName localhost??
          user username??
          4.重啟應用服務器,測試連接
          posted @ 2007-03-27 16:59 edsonjava 閱讀(707) | 評論 (0)編輯 收藏
           

          ?



            輕量級的企業應用開發越來越受到廣大J2EE應用開發者的追捧,而Spring框架又是輕量級容器的杰出代 表。由于Spring的使用日漸廣泛,因此已有許多基于WebSphere應用服務器(WAS)的應用采用了Spring框架。本文首先介紹使用 Spring開發Web應用的基本問題,然后結合WebSphere應用服務器,講述Spring應用如何結合容器提供的服務。文章目的是與大家一起探討 如何更好的采用Spring框架開發基于WebSphere應用服務器的應用。

            1、Spring框架的主要思想描述

             Spring框架的核心思想我們可以用兩個字來描述,那就是"解耦"。應用程序的各個部分之間(包括代碼內部和代碼與平臺之間)盡量形成一種松耦合的結 構,使得應用程序有更多的靈活性。應用內部的解耦主要通過一種稱為控制反轉(IOC)的技術來實現。控制反轉的基本思想就是本來由應用程序本身來主動控制 的調用等邏輯轉變成由外部配置文件來被動控制。通常我們用一個所謂的好萊塢原則(Don't call me. I will call you.)來比喻這種控制反轉的關系。由于控制反轉的概念相對比較廣泛,很多應用服務器實際上也實現了不同程度的控制反轉技術,只是這些應用服務器對應用 程序的侵入性太強。因此Martin Fowler專門寫了一篇文章討論控制反轉這個概念,并提出一個描述更為準確的概念,叫依賴注入(Dependency Injection)。

             Spring框架中的各個部分都充分使用了這種依賴注入的技術實現,從而給應用以最大的靈活度。實際上,這種依賴注入的參數化應用控制并不是 Spring的首創,比如IBM的多渠道應用整合平臺(Branch Transformation Toolkit,BTT)很早就采用了這種外部參數化控制的技術。BTT中的"對象工廠"與Spring框架中的BeanFactory也有著異曲同工之 妙。

            Spring框架另外一個比較重要的技術是它對于面向切面的編程(AOP)的支持。隨著應用復雜度的逐漸上升和對應用靈活性要求 的提高,IT邏輯和業務邏輯盡量分離的呼聲也越來越高。AOP技術作為實現這種分離的一種比較好的途徑而越來越受到大家的重視。Spring提供的是一種 動態AOP實現,也即通過代理模式動態地在目標對象的方法前后插入相應的處理代碼。應用程序與底層應用服務器平臺的解耦也可以借助AOP技術來實現。 Spring內置的AOP支持是一種錦上添花的功能。它使得一些本來必須由容器支持的功能,比如事務控制可以脫離開容器運行,從而達到"瘦身"的目的。這 也是為什么Spring框架常被人成為輕量級容器的一個原因。

          Spring框架可以與許多已有的框架技術結合使用。J2EE技術應用的一 個重要特點是相關的開源社區非?;钴S。Web應用的不同層次都有非常多優秀的開源框架存在。比如Web層的Struts,OR映射層的Hibernate 等。Spring框架并不重新發明輪子,它的出現不是為了替代這些已有的框架。相反,Spring框架在設計上可以獨立構建應用或者結合已有的框架一起構 建應用。另外一個值得指出的地方是Spring框架的幾大模塊之間相互耦合度很小,因此Spring框架的使用可以根據實際需要選其部分模塊循序漸進的使 用,而非必須統統照搬。

            2、基于Spring的Web應用基礎

            2.1 Web應用的典型層次

            Web應用一般在邏輯上根據功能分為以下幾層:

            1.展示層

             這一層主要如何生成展示給最終用戶的界面,盡可能少的包含業務邏輯處理。對于基于J2EE的Web應用,JSP是其最為常見的一種技術。Spring對 于展示層的支持非常靈活,除了直接支持JSP之外,它還支持基于FreeMarker模板,基于Velocity模板或其它文檔類型的界面等的表現層實 現。

            2.業務層

            業務層一般包含主要的業務邏輯,尤其是與用例相對應的那些業務邏輯。另外,這一層也適合包含事務管理和安全控制方面的邏輯。良好的業務層設計可以使得展示層可以采用不同的技術而不影響業務層。業務層的功能上可以類比于J2EE技術中的無狀態會話BEAN層次。

            3.數據訪問對象(DAO)接口層

             DAO實際上就是數據接口層,在應用中建議通過接口來體現。DAO的存在使得數據訪問可以與底層持久化層的具體實現相分離。一般在DAO接口中主要就是 實現數據對象的查詢、存儲、刪除等操作。從理論上講,DAO層與底層數據的存儲方式是獨立的,也就是說并不一定要求是關系型數據庫。Spring框架在設 計的時候也考慮到了其它非關系型數據庫數據源的情況。

            4.持久業務對象

            持久業務對象是問題域中業務對象的持久化 表示,比如一個用戶對象,一個銀行帳戶等。我們一般通過某種O/R映射技術來實現這些業務對象的持久化。持久業務對象是可以包含業務邏輯的,與業務層所包 含的業務邏輯不同的地方是持久業務對象所包含的是與具體業務對象直接相關且更為通用的業務邏輯。

            5.企業信息系統

            企業信息系統泛指Web應用需要連接的后臺系統,一般可以分為三大類,即ERP系統,企業傳統的遺留系統和關系型數據庫。大部分Web應用都是基于關系型數據庫的,這也是像Spring等常見框架所主要考慮的企業信息系統。

            設計良好的Web應用在層次一般是上一層依賴下一層,但是下一層不依賴上一層。我們可以暫時概括為"向下而不向上依賴原則"。為了使得不同層次之間的依賴降到最低,建議使用接口耦合。這一點又是Spring框架發揮它外部配置優勢的地方。

            2.2 MVC的選擇

            雖然說MVC這種模式早在Java語言出現前就有了,但是這種模式在J2EE時代才大行其道,為廣大Web應用開發者所接受。對于各種基于MVC的框架而言,其要解決的問題主要可以分為以下幾部分:

            1.將Web頁面中的輸入封裝成一個數據對象,比如像Struts的表單BEAN,Spring MVC中的命令類等。

            2.根據請求的不同,由負責分發的控制器來映射和調用相應的邏輯處理單元,并將上面的數據對象作為參數傳入。

            3.邏輯處理單元完成相應的處理之后又把結果放入一個數據對象。

            4.在選擇的展現界面中把返回的數據對象通過某種方式顯示出來。

             在使用Spring構建MVC的時候,可以選擇直接使用Spring自己的MVC實現,或者利用Spring對已有的一些MVC框架的支持。比如 Spring可以支持Struts,WebWork等,與它們結合使用。Spring引以為傲的非侵入的特性在Spring MVC上表現得并不如人意。它與Servlet API的耦合度較其它部分高,而且需要使用一些Spring的接口和類。

             Spring MVC的主要分發器實現是org.springframework.web.servlet.DispatcherServlet,這是Spring MVC的訪問入口。Spring提供SimpleFormController,AbstractCommandController等類來幫助應用構建 各種控制器動作,并用ModelAndView類來聯系展示和邏輯返回數據。如上節所述,Spring MVC能夠支持不同的界面展示技術,而且界面的展示和其后面控制器的實現是分離的,也即界面展示技術的變化不用修改控制器的實現,只需要利用Spring 的控制反轉技術修改外部配置文件即可。比如,在使用JSP展示技術時,外部配置文件的viewResolver定義如下:








          <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass">
          <value>org.springframework.web.servlet.view.JstlView</value>
          </property>
          <property name="prefix"><value>/view/</value></property>
          <property name="suffix"><value>.jsp</value></property>
          </bean>


            如果切換到FreeMaker模板技術,那么除了頁面模板的修改之外,主要就是把對應的外部配置文件更改一下即可,如下所示。具體的展示邏輯部分不用做什么修改。








          <bean id="viewResolver"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
          <property name="viewClass">
          <value>
          org.springframework.web.servlet.view.freemarker.FreeMarkerView
          </value>
          </property>
          <property name="suffix"><value>.ftl</value></property>
          </bean>
          <bean id="freemarkerConfig"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
          <property name="templateLoaderPath">
          <value>/view/</value>
          </property>
          </bean>


             如果不使用Spring的MVC框架而想結合已有的一些MVC框架,Spring也是支持的。Spring對于常見的MVC框架都提供了支持,包括 Struts,WebWork,Tapestry和JSF等。結合使用這些框架的一個好處是可以使用一些已有的熟悉的技術,另外結合Spring的AOP 攔截器可以相對比較容易地處理框架動作共有的事情,比如動作的日志處理等。如果選擇這些MVC框架,那么在使用框架的配置文件和應用的Spring配置文 件都需要做相應的修改。比如使用Struts的時候,Struts-config.xml配置文件中的映射動作類型一般會設置成 org.springframework.web.struts.DelegatingActionProxy,或者設置控制器為 org.springframework.web.struts.DelegatingRequestProcessor。然后需要在相應應的 WebApplicationContext中定義與Struts Action對應的Bean。這樣就可以充分利用Spring的控制反轉技術來管理Struts的Action了。

            另外在使用這些框 架的時候要解決的一個問題是上下文的裝載。比如使用Struts,可以使用ContextLoaderPlugin來裝載Web上下文。這個 ContextLoaderPlugin替換了原來通過DispacherServlet裝載的方式。需要在struts-config.xml文件中添 加如下條目:<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>。這種方式可以使 Spring的Web上下文隨著Struts ActionServlet的初始化而裝載。

            因此,如果用戶已有的應用是基于某個 MVC框架,或者用戶熟悉某個框架,那么可以利用Spring對這些框架的支持結合使用。因為我們的目的本來就是為了解決問題而不是為了使用某種技術。但 是對其它用戶而言,如果不是對已有的一些MVC框架比較熟悉的話,那就直接使用Spring的MVC框架就可以了。

          2.3 Web Context設置

            對于不依賴于應用服務器的Spring 上下文(Context)設置,通常在應用代碼中通過FileSystemXmlApplicationContext或ClasspathXmlApplicationContext來獲取。比如使用這樣的代碼來得到上下文:








          ApplicationContext ctx = new FileSystemXmlApplicationContext("config.xml");


             但是按照控制反轉的原則,應用程序代碼應該盡可能少的知道上下文的設置。因此,在基于Spring的Web應用中,這樣的代碼也可以省去。Spring 可以通過配置讓Web容器自動裝載上下文配置文件。從本質上講,Web應用的ServletContext就是Spring用來存放應用上下文的地方。 Spring中與Web Context裝載相關的有幾個類:

            1.ContextLoaderListener:一般的應用服務器如WAS都能先裝載Listener,如果不是的話,那么只能使用ContextLoaderServlet。

             2.ContextLoaderServlet:需要配置<load-on-startup>使得它率先裝載。真正裝載Context的類是 ContextLoader,上面兩個類只是兩種調用ContextLoader的不同途徑。ContextLoader內部實際調用的是 XmlWebApplicationContext,其缺省配置文件為/WEB-INF/applicationContext.xml。

            如果使用ContextLoaderListener,其在web.xml中的配置一般如下:








          <listener>
          <listener-class>
          org.springframework.web.context.ContextLoaderListener
          </listener-class>
          </listener>


            如果使用ContextLoaderServlet,其在web.xml中的配置一般如下:








          <servlet>
          <servlet-name>context</servlet-name>
          <servlet-class>
          org.springframework.web.context.ContextLoaderServlet
          </servlet-class>
          <load-on-startup>1</load-on-startup>
          </servlet>


             應用本身可能除了基于HTTP的Web渠道之外還通過別的渠道對外提供服務,因此,一個比較好的做法是把展示相關的配置與后面業務處理部分的配置分開。 這樣如果更改了應用的訪問渠道,只需要修改對應的配置文件即可。因此,Spring提供了一個WebApplicationContext的概念。在 WebApplicationContext中一般包含與Web訪問相關的配置定義,包括各種控制動作的定義、界面展示的定義等等。

             WebApplicationContext一般由DispatcherServlet來初始化。在上下文層次結構上可以把它看成是 ApplcationContext的子上下文。在缺省的情況下,DispatcherServlet裝載的配置文件名稱為其Servlet名稱- Servlet.xml,但是可以通過contextConfigLocation參數來定制。DispatcherServlet在web.xml中的 定義示例如下:








          <servlet>
          <servlet-name>Dispatcher</servlet-name>
          <servlet-class>
          org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <load-on-startup>2</load-on-startup>
          </servlet>
          <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/context/Webcontrollers.xml</param-value>
          </init-param>


            2.4 數據持久化層

             雖然使用J2EE技術的Web應用可以連接多種不同的企業信息系統(EIS),但是毫無疑問數據庫是其中最為重要和常見的一種。正因如此,Spring 對數據庫訪問提供了非常完備的支持。數據訪問對象(DAO)模式是J2EE模式中非常重要的一種。它的主要目的是使得持久化層與業務邏輯層分離,從而屏蔽 持久化層的具體實現。我們可以把Spring的DAO支持分為兩大類,一是直接基于Spring JDBC模板的數據訪問,另一類是基于某種O/R映射框架的數據訪問。這里剛好可以使用Spring的控制反轉特性,通過外部配置文件來定義DAO接口和 實際實現類之間的關系。Spring框架目前支持的O/R映射框架包括Hibernate、JDO、TopLink、iBATIS等。

            假設我們定義了一個userDAO。當使用JDBC來實現這個DAO的時候,定義的類可以如下所示:








          public class userDAOJDBC extends JdbcDaoSupport implements userDAO{ … }


            如果使用Hibernate來實現這個DAO的時候,定義的類如下:








          public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO { … }


            Spring對于其它的O/R映射機制都有相應的抽象類供應用使用,比如對于iBATIS有SqlMapClientDaoSupport,對于JDO有JdoDaoSupport等。

            下面我們看一下如何在Spring的配置文件中定義上述DAO與具體實現的關系。假設我們的userDAO具體實現是通過Hibernate,那么在applicationContext.xml中的一個DAO可以定義如下:








          <bean id="userDAO" class="com.fgw.dao.hibernate.UserDAOHibernate">
          <property name="sessionFactory">
          <ref local="sessionFactory"/>
          </property>
          </bean>


             在這里我們實際DAO接口定義是:com.fgw.dao.UserDAO,而具體實現類為: com.fgw.dao.hibernate.UserDAOHibernate。顯然,對于其它DAO的實現,我們只需要在配置文件中修改相應的實現類 (具體實現類當然是比不可少的)和屬性即可。比如對于JDBC的DAO實現,屬性就定義成相應的數據源。

            3、Spring與WebSphere應用服務器的配合

            Spring與底層J2EE應用服務器還是存在一些需要結合的地方,這里給出WAS中的一些結合點。

            3.1 使用WAS數據源

             在Java應用程序中,數據庫的連接一般有兩種方式來得到。一種是通過java.sql.DriverManager的方式來得到數據庫連接。這種方式 不依賴于應用服務的支持,但是也不提供數據庫連接池的功能。另外一種方式是通過javax.sql.DataSource的方式來得到數據庫連接。在傳統 基于J2EE的應用需要通過JNDI來得到數據源(javax.sql.DataSource)對象,然后再通過數據源來得到相應的數據庫連接。常見的應 用服務器都支持這種方式,且一般都提供了數據庫連接池的支持。雖然說我們一般推薦使用數據庫連接池,但是也有一些時候我們需要脫離開應用服務器的環境使用 數據庫(比如單元測試,比如應用移植等)。然而應用程序使用這兩種方式的時候代碼是不一樣的,因此只能通過代碼來應變。Spring提供了一個統一使用數 據源的解決方案,然后通過控制反轉的機制用外部配置文件來指定使用的數據源。這樣一方面可以統一這兩種得到數據庫連接的方式,另一方面也不需要像通常的 J2EE應用通過繁瑣的JNDI代碼來得到數據源。這樣應用程序也就不需要知道使用的何種數據源。

            Spring提供了一個DriverManagerDataSource類來統一第一種方式的數據源獲取。如果使用WAS中的Cloudscape數據庫,用外部配置文件可配置如下:








          <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName">
          <value>com.ibm.db2j.jdbc.DB2jDriver</value>
          </property>
          <property name="url">
          <value>jdbc:db2j:D:\\DBName</value>
          </property>
          </bean>


            Spring提供了JndiObjectFactoryBean類來支持第二種方式的數據源獲取。假設WAS中已經配置好的數據源名稱為jdbc /MyDB,那么用外部配置文件可配置如下:








          <bean id="dataSource"
          class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName"><value>java:comp/env/jdbc/MyDB</value></property>
          </bean>
          或者
          <bean id="dataSource"
          class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName"><value>jdbc/MyDB</value></property>
          <property name="resourceRef"><value>true</value></property>
          </bean>


             從上面配置我們可以得知,通過使用Spring,應用程序能夠統一使用不同的數據源實現。如果使用環境發生變化,那么只需要修改Spring的配置文件 即可。對于部署在WAS上的Web應用,在生產環境中推薦使用WAS實現的數據庫連接池。一方面是因為連接池實現地比較完善。另一方面,使用WAS提供的 數據庫連接池可以很完善地支持JTA事務。

            3.2 使用WAS的JTA

            Web應用程序在使用事務的時候常常會涉 及一個事務類型的選擇。是選擇像JDBC事務這樣的本地事務呢還是使用JTA支持的全局事務。這個與應用程序需要涉及到的事務管理器類型和個數密切相關。 Spring本身不支持分布式事務,因此分布式事務需要底層的JTA。但是Spring提供了事務的抽象,即底層真正事務實現可以切換而不影響應用程序代 碼。這樣應用程序可以依賴于底層WAS,也可以輕易地脫離開應用服務器的環境。這一點與前面數據源的抽象非常類似。

            WAS本身對于事 務劃分有兩種支持方式,一種是聲明式的,當然這種管理方式需要EJB容器的支持,即所謂的容器管理事務(CMT)。另外一種方式是編程式的,通過程序代碼 來直接使用JTA編程接口。Spring對于事務的劃分也可以分為聲明式和編程式兩種方式。對于Spring編程式的事務劃分方式,總體上可以分為兩大 類。一類是通過直接使用實現PlatformTransactionManager接口的類。另一類是通過使用TransactionTemplate模 板類,模板類的使用可以簡化事務控制代碼。Spring對于聲明式事務劃分的支持實際上是利用了它的AOP機制。相對于編程式事務劃分,這種基于AOP的 方式比較靈活,而且對代碼的侵入性幾乎為零。因此,如果沒有特殊需要推薦使用這種事務劃分方式?;贏OP的常用事務劃分方式可以使用 ProxyFactoryBean加TransactionInterceptor方式,或者使用 TransactionPorxyFactoryBean的方式。前一種方式相對比較靈活,而后一種則對使用相對比較簡單。

            無論是哪 一種事務劃分方式,底層都需要一個事務管理機制作為支撐。如果是單一的事務資源管理器,那么根據所使用的后臺事務管理資源不同的類型,可以選擇的 PlatformTransactionManager實現有DataSourceTransactionManager, HibernateTransactionManager, JdoTransactionManager, PersistenceBrokerTransactionManager,和JmsTransactionManager等。無論是單個還是多個事務資 源管理器,都可以使用JtaTransactionManager類。如果使用JtaTransactionManager,那么所有事務管理實際都會委 托給底層應用服務器的JTA實現。

            例如,如果使用JDBC或iBATIS,那么我們可以使用簡單的DataSourceTransactionManager,外部配置文件片斷如下:








          <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource">
          <ref local="dataSource" />
          </property>
          </bean>


            如果使用Hibernate,那么我們可以使用HibernateTransactionManager,外部配置文件片斷如下:








          <bean id="transactionManager" class="org.springframework.orm.hibernate.
          HibernateTransactionManager">
          <property name="sessionFactory"><ref local="sessionFactory"/></property>
          </bean>


             使用WAS的JTA支持,我們只需要把上述對應bean中的class屬性改成class屬性改為 org.springframework.transaction.jta.JtaTransactionManager,然后再把屬性改為 WebSphere對應的TransactionManager,參考如下:








          <bean id="wasTxMgr"
          class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/>
          <bean id="transactionManager"
          class="org.springframework.transaction.jta.JtaTransactionManager">
          <property name="transactionManager">
          <ref local="wasTxMgr"/>
          </property>
          </bean>


             通過采用Spring的事務支持,底層事務采用何種方式的決定就不必在一開始開發就做出決定。因為我們能夠通過Spring的外部配置文件來進行切換真 正的事務支持。不過,雖然也有第三方的JTA支持,但是WAS能夠提供非常穩定的XA支持,因此推薦使用WAS的JTA,尤其是當應用涉及到分布事務處理 的時候。這樣無論應用涉及幾個事務資源都可以統一解決。

            3.3 如何加載Spring的JAR包

            Spring框 架的核心JAR包是spring.jar,但是根據實際使用情況需要一些擴展JAR包和依賴JAR包。那在WAS中如何處理這些JAR包文件呢?在Web 應用中一個簡單而直接的處理方式放是把這些使用到的JAR文件都拷貝到對應的WEB-INF/lib目錄下面。這種方法雖然簡單,但是當有多個 Spring應用程序的時候這種處理方式就需要在每個應用的WEB-INF/lib目錄下都拷貝一份相同的JAR文件。這里可以通過共享庫的方式來統一解 決類庫共享這個問題。

            共享庫就是WAS專門用來解決不同應用程序之間共享JAR或本地庫文件的一種機制。共享庫由一個名字、一個 JAVA類路徑和/或一個裝載JNI庫本地庫路徑組成。它可以分別在單元,節點和服務器級別定義。但是共享庫定義了并不意味著它會被裝載,只有當這個共享 庫與某個應用程序或應用服務器關聯之后,它才會被加載。如果一個共享庫與一個應用程序關聯,那么這個共享庫由應用程序類加載器加載。如果一個共享庫與應用 服務器關聯,那么這個共享庫就需要一個專門定義的類加載器來加載。這個類加載器需要用戶自己定義。其操作如下:選應用服務器比如server1'類加載器 '新建一個類加載器'加載器與共享庫關聯。

            在創建這個類加載器之前一般都需要預先定義好共享庫。 根據上面的介紹可知,通過共享庫解決Spring應用的JAR包共享問題,主要就是兩個步驟。一是,把Spring應用中需要共享的JAR包定義成為一個 共享庫。二是,選定相應的WAS服務器實例,把它與上面創建的共享庫關聯起來。這樣此WAS服務器實例上的所有應用都能夠使用共享庫中定義的JAR包。使 用共享庫這種方式的時候要注意理解類的裝載次序和方式。如果是這種與WAS服務器實例關聯的共享庫JAR包,其類加載器在層次結構上在應用程序類加載器上 面,即是它的父加載器。關于WAS的類裝載器結構和策略可以進一步參考WAS信息中心。

            4、結束語

             Spring框架的核心內容并不依賴于任何容器,但是顯然基于Web的應用是Spring主要的應用類型。了解和使用Spring框架一方面可以簡化應 用的開發和測試,另一方也可以加深對J2EE技術的理解。另外輕量級的Web應用開發正在成為一種趨勢,因此何樂而不為之。上面所討論的只是Spring 使用中常見的一些內容,Spring框架自己也正變得越來越復雜。當然,Spring、Hibernate等框架中體現的一些思想也正被JEE 5規范所借鑒,尤其是EJB 3中也有了控制反轉的應用和POJO的大量使用。實際上無論是JEE技術標準還是Spring等框架,其目的都是如何簡化企業應用的開發,只是作為標準, JEE要考慮的內容更為廣泛一些,程度也更為深入一些。(源自:IBM )
          posted @ 2007-03-27 16:58 edsonjava 閱讀(385) | 評論 (0)編輯 收藏
           
          package ? com.hull.validatecode; ?
          ? ?
          ? import ? java.util.*; ?
          ? import ? java.io.*; ?
          ? import ? java.awt.*; ?
          ? import ? java.awt.image.*; ?
          ? ?
          ? import ? javax.servlet.*; ?
          ? import ? javax.servlet.http.*; ?
          ? ?
          ? import ? com.sun.image.codec.jpeg.*; ?
          ? ?
          ? public ? class ? ValidateCode ? extends ? HttpServlet ?
          ? { ?
          ? private ? Font ? imgFont ? = ? new ? Font("宋體",Font.BOLD,16); ? //設置字體 ?
          ? ?
          ? public ? void ? doGet(HttpServletRequest ? request,HttpServletResponse ? response) ?
          ? ? ? throws ? ServletException,IOException ?
          ? { ?
          ? doPost(request,response); ?
          ? } ?
          ? ?
          ? public ? void ? doPost(HttpServletRequest ? request,HttpServletResponse ? response) ? ?
          ? ? ? throws ? ServletException,IOException ?
          ? { ?
          ? String ? vCode ? = ? ""; ?
          ? int ? ? intCode ? = ? 0; ?
          ? ?
          ? ?
          ? intCode ? = ? (new ? Random()).nextInt(9999); ?
          ? if(intCode<1000) ? ?
          ? ? ? ? intCode ? += ? 1000; ?
          ? vCode ? = ? intCode+""; ?
          ? ?
          ? /* ?
          ? ? * ? 繪圖 ?
          ? ? */ ?
          ? response.setContentType("image/gif"); ?
          ? ServletOutputStream ? vout ? = ? response.getOutputStream(); ?
          ? BufferedImage ? image ? = ? new ? BufferedImage(50,20,BufferedImage.TYPE_INT_RGB); ?
          ? Graphics ? graph ? = ? image.getGraphics(); ?
          ? ?
          ? // ? 設置背景顏色 ?
          ? graph.setColor(Color.white); ?
          ? graph.fillRect(1,1,48,18); ?
          ? ?
          ? //設置字體顏色 ?
          ? graph.setColor(Color.black); ?
          ? graph.setFont(imgFont); ?
          ? ?
          ? char ? c; ?
          ? for(int ? i=0;i<4;i++) ?
          ? { ?
          ? c ? = ? vCode.charAt(i); ?
          ? graph.drawString(c+"",9*i+4,16); ? ?
          ? } ?
          ? ?
          ? JPEGImageEncoder ? encoder ? = ? JPEGCodec.createJPEGEncoder(vout); ?
          ? encoder.encode(image); ?
          ? ?
          ? // ? 對session賦值 ?
          ? HttpSession ? session ? = ? request.getSession(true); ?
          ? session.removeAttribute("VerifyCode"); ?
          ? session.setAttribute("VerifyCode",vCode); ?
          ? ?
          ? vout.close(); ?
          ? } ?
          ? ?
          ? } ?
          ? ?
          ? 調用: ?
          ? <img ? src="ValidateCode" ? align="center">
          posted @ 2007-03-13 10:55 edsonjava 閱讀(419) | 評論 (0)編輯 收藏
           

          現在有不少網站在用戶填寫表單時,同時要求填寫驗證碼,驗證碼的一個目的就是防范一些惡意的網站下載軟件,這些軟件能通過遍歷鏈接而將網站的所有網頁下載。還可以防止用戶不經過本網站的頁面而使用網站的資源。所以現在有不少網站都使用了驗證碼技術,驗證碼通常是一個在 WEB 服務器上生成的隨機字符串,同時以某種方式保存起來,比如保存到與當前的 Session 中,然后在用戶提交網頁時與用戶輸入的驗證比較是否一致,然而如果直接以明文的方式,還是不能防范一些功能較強的自動填寫表格的軟件。所以一般將驗證碼以圖片的形式顯示出來,同時可以將在圖片中顯示的字符串進行一些處理,比如使用旋轉字符,添加背景紋理等技術以增大被軟件識別的難度。下面簡要介紹一下如果實現這種驗證碼:

          首先實現一個 servlet 用來生成圖片(當然也可以用 jsp 實現):

          import javax.servlet.*;

          import javax.servlet.http.*;

          import java.io.*;

          import java.util.*;

          import com.sun.image.codec.jpeg.*;

          import java.awt.*;

          import com.sun.image.codec.jpeg.*;

          import java.awt.image.BufferedImage;

          import java.awt.image.DataBuffer;

          import java.awt.geom.GeneralPath;

          import javax.swing.*;

          import java.math.*;

          public class Servlet1

          extends HttpServlet {

          //Process the HTTP Get request

          ? public void doGet(HttpServletRequest request, HttpServletResponse response) throws

          ????? ServletException, IOException {

          ??? response.setContentType(CONTENT_TYPE);

          ??? response.setContentType("image/jpeg");? // 必須設置 ContentType image/jpeg

          ??? int length = 4;????? // 設置默認生成 4 個數字

          ??? Date d = new Date();

          ??? long lseed = d.getTime();

          ??? java.util.Random r = new Random(lseed);?? // 設置隨機種子

          ??? if (request.getParameter("length") != null) {

          ????? try {

          ?????? length = Integer.parseInt(request.getParameter("length"));

          ????? }

          ????? catch (NumberFormatException e) {

          ????? }

          ??? }

          ??? StringBuffer str = new StringBuffer();

          ??? for (int i = 0; i <length; i++) {

          ????? str.append(r.nextInt(9));??????? // 生成隨機數字

          }

          // 可以在此加入保存驗證碼的代碼

          ??? // 創建內存圖像

          ??? BufferedImage bi = new BufferedImage(40, 16, BufferedImage.TYPE_INT_RGB);

          ??? Graphics2D g = bi.createGraphics();

          ??? g.clearRect(0, 0, 16, 40);

          ??? g.setColor(Color.green.CYAN);

          ??? g.drawString(str.toString(), 4, 12);

          ??? try {

          ????? // 使用 JPEG 編碼,輸出到 response 的輸出流

          ????? JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.

          ????? getOutputStream());

          ????? JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);

          ????? param.setQuality(1.0f, false);

          ????? encoder.setJPEGEncodeParam(param);

          ????? encoder.encode(bi);

          ??? }

          ??? catch (Exception ex) {

          ???

          ??? }

          ? }???

          }??

          然后在需求顯示驗證碼的加入以下代碼就可以了

          <img alt="" src="/WebModule1/servlet1"?? width="40" height="16"/>

          /WebModule1/servlet1 替換成你用來生成驗證碼的 servlet 的全路徑。

          ?

          posted @ 2007-03-12 16:37 edsonjava 閱讀(220) | 評論 (0)編輯 收藏
           
          JSF-Spring

          This quickstart will show you how to start using JSF-Spring in a web application. It assumes you've got an existing web application. The first steps describe how to install and configure Spring and JSF. If you've got one or both of them installed already, just skip the corresponding sections.

          Installing Spring

          Download Spring (2.0) from http://www.springframework.org/download and extract the following jars to WEB-INF/lib:

          • dist/spring.jar
          • lib/jakarta-commons/commons-logging.jar

          Then, create a basic application context

          WEB-INF/applicationContext.xml

          <?xml version="1.0" encoding="UTF-8"?/gt;
          <!DOCTYPE beans PUBLIC
          	"-//SPRING//DTD BEAN//EN"
          	"http://www.springframework.org/dtd/spring-beans.dtd">
          <beans></beans>

          and define the listener so that Spring initializes itself on application startup:

          WEB-INF/web.xml (partial)

          <listener>
          	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>

          Installing JSF

          Download either Sun's Reference Implementation (v1.1.01) from http://java.sun.com/javaee/javaserverfaces/download.html or MyFaces (Core 1.1.4 Distribution) from http://myfaces.apache.org/download.html and copy the jars from the lib directory of the downloaded archive to WEB-INF/lib. When using Sun's Reference Implementation, you gotta make sure you've got jstl.jar in your path since the distribution doesn't provide it.

          Then, create a basic faces configuration

          WEB-INF/faces-config.xml

          <?xml version='1.0' encoding='UTF-8'?>
          <!DOCTYPE faces-config PUBLIC
          	"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
          	"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
          <faces-config></faces-config>

          and define the faces servlet that will start up JSF and handle all requests:

          WEB-INF/web.xml (partial)

          <servlet>
          	<servlet-name>Faces Servlet</servlet-name>
          	<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
          	<load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
          	<servlet-name>Faces Servlet</servlet-name>
          	<url-pattern>*.jsf</url-pattern>
          </servlet-mapping>

          Installing JSF-Spring

          Download JSF-Spring (4.0) from http://sourceforge.net/project/showfiles.php?group_id=107519 and extract the following jars to WEB-INF/lib:

          • dist/jsf-spring.jar
          • dist/cglib-nodep-2.1_3.jar

          Then, define the listener that initializes JSF-Spring on application startup:

          WEB-INF/web.xml (partial)

          <listener>
          	<listener-class>de.mindmatters.faces.spring.context.ContextLoaderListener</listener-class>
          </listener>

          Note that this is not a replacement for Spring's ContextLoaderListener, you need both. Furthermore, the order in which you define the listeners is important: First Spring's, then JSF-Spring's ContextLoaderListener.

          Testing the Setup - a simple application

          To verify that JSF-Spring is set up properly, we'll create two simple beans: One service bean providing data and one ui bean formatting it for rendering:

          de/mindmatters/faces/quickstart/service/TimeService.java

          package de.mindmatters.faces.quickstart.service;
          
          import java.util.Date;
          
          public interface TimeService {
          	Date getNow();
          }

          de/mindmatters/faces/quickstart/service/TimeServiceImpl.java

          package de.mindmatters.faces.quickstart.service;
          
          import java.util.Date;
          
          public class TimeServiceImpl implements TimeService {
          	public Date getNow() {
          		return new Date();
          	}
          }

          WEB-INF/applicationContext.xml (partial)

          <bean id="timeService" class="de.mindmatters.faces.quickstart.service.TimeServiceImpl" />

          de/mindmatters/faces/quickstart/ui/UiBean.java

          package de.mindmatters.faces.quickstart.ui;
          
          import java.text.SimpleDateFormat;
          
          import org.springframework.beans.factory.InitializingBean;
          import org.springframework.util.Assert;
          
          import de.mindmatters.faces.quickstart.service.TimeService;
          
          public class UiBean implements InitializingBean {
          	private TimeService timeService = null;
          
          	public void afterPropertiesSet() throws Exception {
          		Assert.notNull(getTimeService(), "timeService must be set");
          	}
          
          	public String getShortDate() {
          		return SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT).format(
          				getTimeService().getNow());
          	}
          
          	public TimeService getTimeService() {
          		return timeService;
          	}
          
          	public void setTimeService(TimeService timeService) {
          		this.timeService = timeService;
          	}
          }

          WEB-INF/faces-config.xml (partial)

          <managed-bean>
          	<managed-bean-name>uiBean</managed-bean-name>
          	<managed-bean-class>de.mindmatters.faces.quickstart.ui.UiBean</managed-bean-class>
          	<managed-bean-scope>request</managed-bean-scope>
          	<managed-property>
          		<property-name>timeService</property-name>
          		<value>#{timeService}</value>
          	</managed-property>
          </managed-bean>

          As you can see, uiBean is managed by JSF and references timeService which is managed by Spring. Furthermore, it can benefit from various Spring features, namely InitializingBean in this case.

          Now, create a simple page rendering the current date:

          index.jsp

          <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
          <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
          <f:view>
            <html>
              <head>
          	  <title>jsf-spring quickstart</title>
              </head>
              <body>
              	<h:outputText value="#{uiBean.shortDate}"/>
              </body>
            </html>
          </f:view>

          Remember to view this page by accessing /index.jsf with your browser, when using / or /index.jsp, your request won't be handled by FacesServlet and thus will produce errors.

          posted @ 2007-02-01 17:36 edsonjava 閱讀(435) | 評論 (0)編輯 收藏
           
               摘要: 網上關于 Apache + JK + Tomcat 的集群配置例子很多,按著例子配置下來,基本都能運行,不過,在一些重要的地方卻沒有進一步的說明。這次公司一個產品就是采用 Apache+JK+Tomcat 集群,在整個配置、測試過程中,遇到了許多的問題,經過不斷測試、摸索,最后總算是搞定了,性能也達到了預期的目標。針對網上的例子,感覺有必要再詳細的介紹一下我...  閱讀全文
          posted @ 2006-12-26 10:27 edsonjava 閱讀(470) | 評論 (0)編輯 收藏
           

          [精華] 原來win+apache實現ssl的證書認證如此簡單


          http://www.chinaunix.net 作者:ataman??發表于:2006-02-26 15:45:34
          發表評論】【查看原文】【Web服務器討論區】【關閉

          windows+apache的情況下,實現ssl的證書認證
          (win下用openssl做證書極為困難的問題徹底解決了)

          我寫得非常詳細,一步一步都說得很清楚。實際操作極為簡單,要不了5分鐘,是我的字打得太多了.如果發現錯誤,遺漏請提出。

          首先,到http://hunter.campbus.com/去下載和自己的apache版本相同的的Apache_xxx-xxxOpenssl_xxx-Win32.zip。解壓縮后找到這5個文件mod_ssl.so(modules目錄),ssl.conf,ssl.default.conf(conf目錄,

          其中default.conf作為備份),libeay32.dll,?ssleay32.dll(這2個都在bin目錄)。把它們全都復制到你自己的apahce下的對應目錄。



          ###############################################################################

          接下來,更改設置文件


          對于httpd.conf和ssl.conf,如果你的服務器沒有域名,那么servername就填ip好了。
          比如:ServerName?10.10.10.10:80(httpd.conf)
          ServerName?10.10.10.10:443(ssl.conf)

          打開httpd.conf:
          找到#LoadModule?ssl_module?modules/mod_ssl.so,去掉前面的‘#‘,這樣就在啟動時加載了ssl模塊。

          打開ssl.conf:
          找到#<IfDefine?SSL>;和#</IfDefine>;,把前面的’#‘號都去掉,否則啟動apache時還要加參數,麻煩。
          如下設置:
          SSLMutex?none?????????????????????????(這個我是none,有人是default,具體怎么設可以研究一下)
          SSLCertificateFile?conf/server.crt????(服務器證書的位置,就是公鑰吧?)
          SSLCertificateKeyFile?conf/server.key?(服務器私鑰的位置)
          SSLCACertificateFile?conf/ca.crt??????(CA根證書的位置,進行客戶端驗證時需要。也是一個CA公鑰吧?

          我把它們都放在apache的conf目錄下了)
          DocumentRoot?"xxxxx"??????????????????(指向要ssl加密認證的文檔目錄,比如"f:/http")

          SSLVerifyClient?require???????????????(去掉前面的‘#’號,進行客戶端驗證時需要)
          SSLVerifyDepth??1?????????????????????(去掉前面的‘#’號,把10改為1,進行客戶端驗證時需要)



          ##############################################################################
          現在,就要制作證書了


          去openvpn.net下載并安裝openvpn。
          這是一個虛擬個人網絡制作工具,他能完美的在win(linux,BSD也行)下制作根、服務器、客戶端證書。
          安裝完畢后,開始-程序-附件-命令提示符,進到openvpn的easy-rsa目錄,比如:
          f:\program?files\openvpn\easy-rsa>;_
          輸入:
          init-config?回車

          會產生幾個文件,切換出來,打開vars.bat文件,修改其中的KEY_COUNTRY(國家2位字母),?KEY_PROVINCE(省2位字母),?KEY_CITY(城市),?KEY_ORG(組織),??KEY_EMAIL(電子郵箱)這幾個參數,免的后面制證時

          反復輸入麻煩。保存退出,繼續使用命令提示符。
          依次輸入以下兩個命令,當然是分別回車嘍:
          vars
          clean-all???(這兩個是準備工作)




          ####################################################################################


          1.
          建立CA根證書


          接著輸入build-ca???回車(這個就是建立CA根證書啦)


          然后顯示:

          ai:/usr/share/openvpn/easy-rsa?#?./build-ca
          Generating?a?1024?bit?RSA?private?key
          ............++++++
          ...........++++++
          writing?new?private?key?to?'ca.key'
          -----
          You?are?about?to?be?asked?to?enter?information?that?will?be?incorporated
          into?your?certificate?request.
          What?you?are?about?to?enter?is?what?is?called?a?Distinguished?Name?or?a?DN.
          There?are?quite?a?few?fields?but?you?can?leave?some?blank
          For?some?fields?there?will?be?a?default?value,
          If?you?enter?'.',?the?field?will?be?left?blank.
          -----
          Country?Name?(2?letter?code)?[KG]:??????????國家名2位字母,默認的參數就是我們剛才修改過的。
          State?or?Province?Name?(full?name)?[NA]:????省、州名2位字母
          Locality?Name?(eg,?city)?[BISHKEK]:?????????城市名
          Organization?Name?(eg,?company)?[OpenVPN-TEST]:?????組織名
          Organizational?Unit?Name?(eg,?section)?[]:???????????組織里的單位名
          Common?Name?(eg,?your?name?or?your?server's?hostname)?[]:這個是關鍵,應該輸入頒發根證書單位的域名

          ,不過因為是根證書,所以怎么填都無所謂。只有服務器證書才需要認真填。
          Email?Address?[me@myhost.mydomain]:?電子郵箱

          好了,CA根證書制作完成!在keys目錄下,它的名字就叫ca.crt,CA的私鑰是ca.key


          #######################################################################


          2.
          現在制作服務器證書:
          在命令提示符下,輸入
          build-key-server?server???回車
          你會看到和上面很相似的東西
          但要注意這里的Common?Name?(eg,?your?name?or?your?server's?hostname)?[]:
          這個才是真正的關鍵。這里應該輸入服務器的域名比如www.xxx.com。
          如果沒有域名,就應該填ip,與httpd.conf和ssl.conf里的設置對應,
          ServerName?10.10.10.10:80(httpd.conf)
          ServerName?10.10.10.10:443(ssl.conf)

          也就是說填:10.10.10.10

          接下來看到?a?challenge?password?[]:填不填隨便,我不填
          an?optional?company?name?[]:?填不填隨便,我不填

          sign?the?certificate??[y/n]?敲y回車。用CA根證書對服務器證書簽字認證。
          1?out?1?certificate?requests?certified,commit??[y/n]?敲y回車,確認。

          好了,建好了在keys目錄下的server.crt(證書)和server.key(私鑰)


          #######################################################################


          3.
          現在制作客戶端證書:

          在命令提示符下,輸入
          build-key?client1???回車
          又是一通國家省市組織等等,comman?name也是隨便填的。
          然后
          a?challenge?password?[]:填不填隨便,我不填
          an?optional?company?name?[]:?填不填隨便,我不填

          sign?the?certificate??[y/n]?敲y回車。用CA根證書對客戶端證書簽字認證。
          1?out?1?certificate?requests?certified,commit??[y/n]?敲y回車,確認。

          好了,建好了在keys目錄下的client1.crt(客戶端證書)和client1.key(私鑰)

          等等,?.crt的客戶端證書是不能使用的,必須把它轉化為.pfx格式的文件!!

          所以,還是在命令提示符下,輸入
          openssl?回車
          看到openssl>;
          再輸入
          pkcs12?-export?–in?keys/client1.crt?-inkey?keys/client1.key?-out?keys/client1.pfx
          回車,
          看到Enter?export?password:會要求你建立客戶端證書的輸出密碼,我填hehe,
          verifying-Enter?export?password再確認一遍hehe,好了!


          ########################################################################


          把keys目錄下的ca.crt和server.crt,server.key都復制到apache的conf目錄下,(ssl.conf需要)
          ca.key自己保留吧,找個合適的地方儲存起來.


          #########################################################################


          客戶端安裝證書


          打開internet?explorer(IE),工具-internet選項-內容-證書,點選'個人'
          再點擊導入,把客戶端證書client1.pfx導入到個人組里(別忘了擴展名是pfx)。
          這里還要輸入剛才建立的輸出密碼hehe才能倒入呢。

          接著,點選'受信任的根證書頒發機構',點擊導入,把CA根證書ca.crt導入到受信任的根證書頒發機構里。


          #########################################################################

          好啦,重新啟動apache,打開IE,
          在地址欄里輸入https://10.10.10.10或者域名,彈出個窗口要選擇個人的數字證書。
          點選,然后確定。
          如果服務器證書的common?name填寫正確的話,你就可以直接進入網站了,看到右下角的小鎖頭(可靠的SSL128位)。
          如果服務器證書的common?name填寫不正確,就會彈出個‘安全警報’框,告訴你3條:
          1.安全證書由信任的站點頒發
          (如果說是由不信任的站點頒發,那就是你的ca根證書ca.crt沒有導入到ie的受信任的根證書頒發機構里)

          2.安全證書的日期有效?
          (這個日期缺省是10年,可以在openvpn的easy-rsa目錄下的openssl.cnf里調整修改,然后重新制作一整套證書(openssl.cnf看起來像撥

          號網絡的快捷方式,要用記事本,寫字板打開修改))

          3.“安全證書上的名稱無效,或者與站點名稱不匹配”
          這就是服務器證書的common?name填寫不正確所致,不過這也沒關系,有人好像愿意這樣。我是不想看到這個警告框,煩人。

          即使有安全警報,你仍能進入網站,看到右下角的小鎖頭(可靠的SSL128位)


          #################################
          最后,成功啦!用吧。

          我自己把httpd.conf里的listen?80都加#注釋了,servername改為10.10.10.10:443,只用https不用http,嗬嗬!??!

          posted @ 2006-12-25 17:00 edsonjava 閱讀(431) | 評論 (0)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          主站蜘蛛池模板: 融水| 马山县| 达拉特旗| 石林| 满城县| 砚山县| 上林县| 阿克陶县| 鹤峰县| 进贤县| 昌黎县| 崇左市| 平潭县| 郴州市| 米泉市| 搜索| 昌图县| 孟津县| 宣汉县| 象州县| 滨州市| 定陶县| 吕梁市| 云林县| 大化| 垫江县| 武陟县| 朝阳市| 读书| 剑河县| 衡山县| 汽车| 凤凰县| 洞头县| 平南县| 古交市| 南雄市| 贵州省| 高碑店市| 汕尾市| 古浪县|