paulwong

          #

          Regular Expression in Java

          1. Introduction

          正規表示式(Regular Expression, 以下簡稱 regexp)在文字處理方面, 已經受到廣泛的應用。而各種程式語言中也幾乎都有提供對 regexp 的支援, 廣受歡迎的 Perl 更是其中的佼佼者。在 Java SDK 1.4 版釋出之前, 若想在 Java 語言中使用 regexp, 就必需依靠由第三方提供之類別函式庫(Third-Party Class Library), 例如 The Apache Jakarta Project 提供的 Jakarta Regexp, 及 GNU Regex for Java 等. 而 Sun 也終於在 Java SDK 1.4 以來開始於其核心 API 中提供 java.util.regex.Pattern 等相關類別, 以提供C0D; regexp 的支援。本文將會介紹前述的三種 regexp package 之使用方法, 希望能提供讀者在 Java 中使用 Regular Expression 的指引。注意, 本文中並不會介紹 regexp 的語法, 若要學習 regexp, 請參考附錄。

          2. java.util.regex.*

          JDK 1.4 中所提供的 regex package 中只有簡單的兩個類別, Pattern 及 Matcher。但這兩個物件已經包含了所有 regexp 的功能, 請看以下的介紹:

          2.1 Pattern 與 split()

          Pattern 類別並沒有建構式(Constructor), 若要使用此一類別, 可運用 Pattern.compile(String regex) 方法(method)。例:

          Pattern?p?=?Pattern.compile("a*b");

          注意若傳入的regexp string有錯誤, compile() 會丟出 PatternSyntaxException, 因此必需自行使用try ... catch 加以處理。
          產生出 Pattern 物件後, 要如何使用呢? 先看看 Pattern 提供的方法 split()。此一方法可以將輸入字串中依符合Pattern的位置進行分段, 如:

          String[]?result?=?p.split("123aba23aabc");
          ????
          for?(int?i?=?0;?i?<?result.length;?i++)?{
          ????????System.out.println(?(i?
          +?1)?+?":?"?+?result[i]);
          ????}

          輸出的結果為:

          	1: 123
          2: a23
          3: c

          2.2 Matcher 與 matches()

          Regular Expression 的功能當然不只如此, 但是 Pattern 類別中只提供了split(), 若要進行比對(match)及取代(replace)則必需靠 Matcher 類別。例如要檢驗輸入字串是否合於Pattern, 可以使用 Pattern 中的靜態方法 matches:

          System.out.println(Pattern.matches("a*b",?"aaaaab"));

          輸出結果為:

          	true

          此一靜態方法是為了方便使用而提供的簡化方法, 其作用等同以下程式:

          Pattern.compile("a*b").matcher("aaaaab").matches();

          另外, 要注意的是, matches() 是完整字串的比對,所以 Pattern.matches("a*b", "aaaaab") 的傳回值為 true 。但是 Pattern.matches("a*b", "aaaaab1") 則會傳回否。因此, 若要在輸入字串中進行部分比對,則必需使用 Matcher 物件中提供的 method。而要如何取得 Matcher 物件呢? 方法如下:

          Pattern?p?=?Pattern.compile("a*b");
          Matcher?matcher?
          =?p.matcher("aaaaab");

          Matcher 中提供了三種比對方法, 您可以依照實際需要來選擇使用:

          • matches: 完整比對, 整個輸入字串必需符合 regexp。例如前例輸入字串 "aaaaab" 完全符合 "a*b", 因此會 matches() 傳回 true.
          • lookingAt: 從輸入字串開頭比對。如前例, 若輸入字串改為 "aaaaab1" 則 matches() 會傳回 false, 而 lookingAt() 會傳回true。
          • find: 從字串中任意位置開始比對,也就是部分比對。如前例, 若輸入字串改為 "22aaaaab1" 則 matches()及lookingAt()皆傳回 false, 而 find() 則會傳回true。

          2.3 replaceFirst(), replaceAll()

          除了比對之外, 取代(replace)也是regexp的常見用途之一, 在 Matcher 中也提供了 replaceFirst() 及 replaceAll() 等方法進行取代。如:

          Pattern?p?=?Pattern.compile("a*b");
          ????Matcher?matcher?
          =?p.matcher("123aaaaab456abcdef");
          ????System.out.println(matcher.replaceFirst(
          "_"));????
          ???????
          //1
          ????matcher.reset();
          ???????
          //2
          ????System.out.println(matcher.replaceAll("_"));
          ???????
          //3


          前例中的 1 會輸出:

          123_456abcdef

          只將第一個 match 的 pattern 取代為 "_", 而 3 則會輸出

          123_456_cdef

          將輸入字串中所有合於 pattern 的字串取代為 "_"。 請注意到 2 的部分呼叫了 matcher.reset(), 此一方法可以讓 Matcher 的比對重新開始, 也就是從輸入字串的開頭開始比對。另外, 若在程式中需要以同一個 Pattern 比對不同的輸入字串, 只需使用 reset(<input>) 方法便可以比對新的輸入字串。

          2.4 gourp(), start() 及 end()

          Matcher還有更進階的用法, 例如群組(Grouping), 在 Matcher 中亦有提供, 請參考以下片段:

          ????Pattern?p?=?Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
          ????Matcher?matcher?
          =?p.matcher("abc?=?123");
          ????System.out.println(
          "find:?"?+?matcher.find());
          ????System.out.println(
          "groupCount():?"?+?matcher.groupCount());
          ????
          //1
          ????for?(int?i?=?1;?i?<=?matcher.groupCount();?i++)?{
          ????
          //2
          ??????System.out.println("group("?+?i?+?"):"?+?matcher.group(i));?
          ??????System.out.println(
          "start("?+?i?+?"):"?+?matcher.start(i));
          ??????System.out.println(
          "end("?+?i?+?"):"?+?matcher.end(i));
          ????}
          ????matcher.reset();
          ????System.out.println(matcher.replaceFirst(
          "$2?=?$1"));
          ????
          //3

          在 regexp 中, 小括號表示群組, 可以在比對之後, 將合於 pattern 的部分紀錄起來, 以便使用 Matcher 中的 gourp() 及相關方法來應用。前例中的 1 呼叫了 groupCount(), 此處會輸出 2 表示 Pattern 中有兩個群組。迴圈 2 會依序印出各 group 的內容, 結果如下:

          	group(1):abc

          start(1):0

          end(1):3

          group(2):123

          start(2):6

          end(2):9

          注意此處的迴圈由 1 開始, 因為 gourp(0) 所代表的是整個合於 pattern 的輸入字串, 以前例而言就是 "abc = 123", start(0) 與 end(0) 則分別為 0 與 9。
          在 Matcher 提供的取代方法( replaceFirst 與 replaceAll )中, 可以使用"回溯參照", 也就是用 $n 來代表找到的群組編號, 如前例中的 3, 其輸出結果為:

          123 = abc

          2.5 比對參數旗標 (Matching flags)

          熟悉 regexp 的讀者一定會覺得奇怪, 如何建立"與大小寫無關(Case-insensitive)" 的比對樣式呢? 又要怎麼在建立的時候, 指定讓 "." 能符合換行字元呢? 有兩種方式, 第一種方法為在建立 Pattern 物件時傳入比對參數旗標, 如:

          ????Pattern?p?=?Pattern.compile("A.b",?Pattern.DOTALL?|?Pattern.CASE_INSENSITIVE);????//1
          ????Matcher?matcher?=?p.matcher("aaa\nbbb");
          ????System.out.println(matcher.replaceAll(
          "_"));

          如此一來, 前例的輸出會是: aa_bb 另一種方法, 則是使用"內嵌式旗標(Embedded flags)", 也就是將旗標直接加在 regexp 字串中, 如前例中的 1 可以改為以下的寫法:

          Pattern?p?=?Pattern.compile("(?si)A.b");

          其中的 ?s 代表單行模式(single-line mode), 也就是 Pattern.DOTALL; 而 ?i 則代表與大小寫無關, 即 Pattern.CASE_INSENSITIVE。事實上,Pattern可接受的旗標共有 7 種, 也都有其對應的內嵌式旗標, 請參考 JDK 1.4 文件。

          最後, 在 JDK 1.4 中, 之前介紹的 split, matches, replaceAll 及 replaceFirst 等 regexp 功能已經整合到 String 物件中了, 例如要將 "abc123abc" 字串中所有的 "a" 或 "b" 取代為 "c", 可以使用以下敍述:

          ????String?tmp?=?"abc123abc";
          ????String?noab?
          =?tmp.replaceAll("(a|b)",?"c");

          若程式中不需要使用到更進階的 regexp 功能, 便可以多加利用在 String 物件中的這些方法。詳細用法請參考 JDK 1.4 文件。

          3. To be continue...

          以上介紹了 JDK 1.4 中內建的 Regular Expression 類別使用方法, 下期將會介紹 Jakarta Regexp 及 GNU Regex for Java 等套件

          4. 附錄:

          本文所提到的套件參考文件可以在以下 URL 找到:

          1. java.util.regex API Documents, http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/package-summary.html
          2. Regular Expressions for Java, http://www.cacas.org/java/gnu/regexp/
          3. Jakarta Regexp, http://jakarta.apache.org/regexp/index.html

          有關 Regular Expressions 的學習, 可以參考以下文件:
          1. Mastering Regular Expressions, http://www.oreilly.com/catalog/regex/
          2. Manual pages of Perl, perlrequick(1), perlretut(1), perlre(1)
          3. Regular Expression 簡介, http://phi.sinica.edu.tw/aspac/reports/94/94019/
          4. 一輩子受用的 Regular Expressions -- 兼談另類的電腦學習態度, http://www.cyut.edu.tw/~ckhung/b/gnu/regexp.shtml
          5. A Tao of Regular Expressions (正規表示式之道) http://sitescooper.org/tao_regexps.html

          posted @ 2006-08-23 21:42 paulwong 閱讀(1268) | 評論 (0)編輯 收藏

          showModalDialog和showModelessDialog

          一、showModalDialog和showModelessDialog有什么不同?


            showModalDialog:被打開后就會始終保持輸入焦點。除非對話框被關閉,否則用戶無法切換到主窗口。類似alert的運行效果。
            showModelessDialog:被打開后,用戶可以隨機切換輸入焦點。對主窗口沒有任何影響(最多是被擋住一下而以。:P)



          二、怎樣才讓在showModalDialog和showModelessDialog的超連接不彈出新窗口?


            在被打開的網頁里加上<base target="_self">就可以了。這句話一般是放在<html>和<body>之間的。

          三、怎樣才刷新showModalDialog和showModelessDialog里的內容?


            在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能彈出菜單。這個只能依靠javascript了,以下是相關代碼:


          <body?onkeydown="if?(event.keyCode==116){reload.click()}">
          <a?id="reload"?href="filename.htm"?style="display:none">reload</a>


            將filename.htm替換成網頁的名字然后將它放到你打開的網頁里,按F5就可以刷新了,注意,這個要配合
          <base?target="_self">

          使用,不然你按下F5會彈出新窗口的。

          四、如何用javascript關掉showModalDialog(或showModelessDialog)打開的窗口。

          <input?type="button"?value="關閉"?onclick="window.close()">

            也要配合<base target="_self">,不然會打開一個新的IE窗口,然后再關掉的。

          五、showModalDialog和showModelessDialog數據傳遞技巧。
            (作者語:本來想用一問一答形式來寫的,但是我想不出這個怎么問,所以只好這樣了。)
            這個東西比較麻煩,我改了好幾次了不是沒辦法說明白(語文水平越來越差了),只好用個例子說明了。
            例子:
          現在需要在一個showModalDialog(或showModelessDialog)里讀取或設置一個變量var_name
          一般的傳遞方式:

          window.showModalDialog("filename.htm",var_name)//傳遞var_name變量
          在showModalDialog(或showModelessDialog)讀取和設置時:
          lert(window.dialogArguments)//讀取var_name變量
          window.dialogArguments="oyiboy"http://設置var_name變量
            這種方式是可以滿足的,但是當你想在操作var_name同時再操作第二個變理var_id時呢?就無法再進行操作了。這就是這種傳遞方式的局限性。
              
          以下是我建議使用的傳遞方式:
            //不管要操作什么變量,只直傳遞主窗口的window對象
          在showModalDialog(或showModelessDialog)讀取和設置時:
          alert(window.dialogArguments.var_name)//讀取var_name變量
          window.dialogArguments.var_name="oyiboy"http://設置var_name變量
           同時我也可以操作var_id變量
           alert(window.dialogArguments.var_id)//讀取var_id變量
           window.dialogArguments.var_id="001"http://設置var_id變量

           同樣還可以對主窗口的任何對象進行操作,如form對象里的元素。
            window.dialogArguments.form1.index1.value="這是在設置index1元素的值"

          六、多個showModelessDialog的相互操作。
            因為光說很費勁,我就偷點懶,直接用代碼來說了,如果不明白的話那就直接來信(oyiboy#163.net(使用時請將#改成@))問我吧。

            以下代碼的主要作用是在一個showModelessDialog里移動別一個showModelessDialog的位置。

            主文件的部份js代碼。
            var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px") //打開控制窗口
            var s2=showModelessDialog('about:blank',window,"dialogTop:200px;dialogLeft:300px")  //打開被控制窗口

            控制.htm的部份代碼。

          <script>
              
          //操作位置數據,因為窗口的位置數據是"xxxpx"方式的,所以需要這樣的一個特殊操作函數。
          function?countNumber(A_strNumber,A_strWhatdo)
          {
          A_strNumber
          =A_strNumber.replace('px','')
          A_strNumber
          -=0
          switch(A_strWhatdo)
          {
          case?"-":A_strNumber-=10;break;
          case?"+":A_strNumber+=10;break;
          }
          return?A_strNumber?+?"px"
          }
            
          </script>


          <input?type="button"?onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'-')"?value="上移">
            
          <input?type="button"?onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'-')"?value="左移">
            
          <input?type="button"?onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'+')"?value="右移">
            
          <input?type="button"?onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'+')"?value="下移">

            以上關鍵部份是:
          窗口命名方式:var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px")
            變量訪問方式:window.dialogArguments.s2.dialogTop

            這個例子只是現實showModelessDialog與showModelessDialog之間的位置操作功能,通過這個原理,在showModelessDialog之間相互控制各自的顯示頁面,傳遞變量和數據等。這要看各位的發揮了。

          posted @ 2006-08-16 14:02 paulwong 閱讀(397) | 評論 (0)編輯 收藏

          PrepareStatement中in中帶問號的又一用法

          String?strSQL = " DELETE?FROM?TAB_DESIREMOTOR?WHERE?DESIREMOTORID?IN?(???) " ;
          ps?
          = ?conn.prepareStatement(strSQL);
          java.util.Vector?v
          = new ?Vector();
          v.addElement(
          new ?Int( 1 ));
          v.addElement(
          new ?Int( 2 ));
          ps.setObject(
          1 ,?v);
          count?
          = ?ps.executeUpdate();

          posted @ 2006-07-30 14:52 paulwong 閱讀(2116) | 評論 (1)編輯 收藏

          MyEclipse 5.0 M2 注冊碼及下載地址和Eclipse 3.2多國語言包

          MyEclipse 5.0 M2 注冊碼及下載地址


          官方介紹:
          The second milestone release (M2) of MyEclipse 5.0 is now available for immediate downolad. Please review the special instructions, release notes and the New and Noteworthy before download. MyEclipse 5.0M2 is compatible with Eclipse 3.2 release candidates. Please be sure to install Eclipse 3.2 prior to installation of MyEclipse 5.0M2.

          Notably, the MyEclipse 5.0M2 release integrates the popular Matisse4MyEclipse Swing UI designer directly into MyEclipse, thereby enabling developers to easily build sophisticated graphical user interfaces for their applications. Though Matisse4MyEclipse is now supported on Linux, Mac users will be unable to utilize the Matisse4MyEclipse, MyUML, and MyEclipse Image Editor functions due to the long-standing Eclipse SWT_AWT bug #145890.
          MyEclipse Enterprise Workbench 5.0 M2 for Windows 98/2000/XP (7/7/2006) 下載地址:


          http://www.myeclipseide.com/Downloads+index-req-getit-lid-59.html


          序列號過期時間為2099年12月31日,估計用上5-10年都有可能(就看myeclipse的更新速度了)。
          Subscriber: www.1cn.biz
          Subscriber Code: jLR8ZC-444-55-4467865481680090

          注冊成功后會發現:

          Subscriber: www.1cn.biz
          Product ID: E3MP (MyEclipse Professional Subscription)
          License version: 9.99
          Full Maintenance Included
          Subscription expiration date (YYYYMMDD): 20991231
          Number of licenses: Unlimited

          Eclipse 3.2多國語言包

          下載地址列表:
          NLpack1 - German, Spanish, French, Italian, Japanese, Korean, Portuguese (Brazil), Traditional Chinese and Simplified Chinese.
          windows OS:

          http://ftp.jaist.ac.jp/pub/eclipse/eclipse/downloads/drops/L-3.2_Language_Packs-200607121700/NLpack1-eclipse-SDK-3.2-win32.zip

          posted @ 2006-07-30 12:13 paulwong 閱讀(2822) | 評論 (0)編輯 收藏

          Websphere Application Server心得

          ??? Websphere Application Server(WAS)是一個JVM容器+WEB容器+EJB容器,能

          解析JAVA的指令,能對HTTP的請求作響應,能解析EJB指令。

          ??? WAS只須裝一次,就能自定義多個CONTAINER,表現在訪問的網址上為不同的

          端口。

          ??? 部署在WAS上的J2EE程序包只能是EAR包或WAR包,如果一個項目內必需多個

          WEB的PROJECT,則只能部署EAR包,EAR包中指定所要包含的WEB PROJECT,事實

          上EAR包的作用就是指定項目中有幾個WEB PROJECT而已;如果一個項目中只有

          一個WEB PROJECT,則部署EAR包或WAR包均可以。

          ??? 安裝EAR包或WAR包都是從控制臺的“安裝新應用程序”中開始,兩者的區別

          是安裝EAR包無須指定上下文根,即:http://localhost:9080/web1中的web1,

          而安裝WAR包則必須指定上下文根,其余則沒什么區別,均須指定安裝在哪個

          CONTAINER上,是否可以使用別名(網址上的不同)等。

          ??? 打包可用Application Server ToolKit,支持從CVS上下載代碼。

          posted @ 2006-07-28 10:27 paulwong 閱讀(572) | 評論 (0)編輯 收藏

          MyEclipse+WebSphere 通過 JNDI 連接 Sybase 簡介

               摘要: 很久不來這里寫東西了,一是工作忙,還有就是我是個初學者也寫不出什么東西。這幾天因工作需要學習了一下 WebSphere5.1, 在網上找了些資料終于了解了如何通過 JNDI 連接 Sybase 數據庫。貼上來一個是怕自己以后忘了,另外就是希望能幫助像我一樣苦苦探索的初學者。 ? ...  閱讀全文

          posted @ 2006-07-24 17:12 paulwong 閱讀(2704) | 評論 (1)編輯 收藏

          WebSphere中流行數據庫連接池的配置(Oracle、SQL Server、Sybase、MySQL)

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

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

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


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




          點擊“管理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提供程序。




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

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



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




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



          resized image

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

          7.測試連接





          系統提示:成功信息,表明,連接池配置成功。
          連接池配置成功后,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





          由于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(包括源程序)
          [Download File]

          posted @ 2006-07-24 16:15 paulwong 閱讀(3738) | 評論 (3)編輯 收藏

          采用輸出內容

          采用<JSP:FORWORD> 該方法是利用服務器端先將數據輸出到緩沖區的機制,在把緩沖區的內容發送到客戶端之前,原來的不發送,改為發送該頁面的內容,如果在<JSP: FORWORD>之前有很多輸出,前面的輸出已使緩沖區滿,將自動輸出到客戶端,那么該語句將不起作用,這一點應該特別注意. 如下面的例子中(1)會輸出index.html的內容,2 不會輸出index.html的內容,而是輸出out.println("@@@@@@@@@@@@@@@@@"); 中的內容,并且在服務端會拋出:java.lang.IllegalStateException: Response already committed 異常,但客戶端沒有任何錯誤輸出。

          (1)

          <%@page?buffer="1kb"%>
          ?
          <%
          long?i=0;
          ?
          for(i=0;i<10;i++)
          {
          ???????out.println(
          "@@@@@@@@@@@@@@@@@");
          }
          %>
          ?
          <jsp:forward?page="./index.html"?/>?

          ?
          (2)

          <%@page?buffer="1kb"%>
          ?
          <%
          long?i=0;
          ?
          for(i=0;i<600;i++)
          {?????????????????
          ???????out.println(
          "@@@@@@@@@@@@@@@@@");
          }
          %>?

          posted @ 2006-07-16 22:45 paulwong 閱讀(225) | 評論 (0)編輯 收藏

          AJAX 網頁程式設計─rico

          rico 是另外一套開放軟體的 JavaScript Framework, 根基於 prototype.js, 但是不僅僅是 prototype.js 的延伸而已, 還創造出一些它獨有的功能, 其中包含以下幾個特色:


          1. 支援 AJAX。
          2. 支援拖拉式介面。
          3. 動畫效果, 如動態改變元件位置大小等。

          rico?下載網址:http://openrico.org/rico/home.page


          rico 的套用方式也非常簡單, 不過它需要配合 prototype.js, 因此必須在 HTML 文件中同時套用這兩套 Framework, 方法如下。


          <head>
          <script?type="text/javascript"?src="script/prototype.js">
          </script>
          <script?type="text/javascript"?src="script/rico.js"></script>
          </head>


          rico 範例:旅遊網站

          rico 的 ajax 實作是以一個 ajaxEngine 物件為核心, 任何 ajax 的動作都是透過這個物件來完成, 事實上, 它的觀念也非常簡單, 非常適合初次使用 ajax 的人學習。在這個小節中, 筆者將透過簡單的範例來介紹 rico ajax 的使用。


          我們設計了一個「臺灣走透透 — 縣市情報通」的網站, 主要功能是提供使用者查詢臺灣各縣市資訊及小吃特產等資訊, 類似旅遊資訊之類的情報站。但是如果我們只是單純將各個縣市的情報寫成 HTML 檔案, 然後讓使用者點選超連結瀏覽, 這樣就不符合前面章節所提的非同步通訊的好處, 所以在這裡我們就改變設計, 讓使用者選擇想要瀏覽的縣市之後, 立刻出現該縣市相關資訊, 當然在這裡我們是要學習 AJAX, 所以這個範例就是利用 AJAX 來完成這樣的動作。


          整個 HTML 檔案主要是由一個 select box 和一個 <DIV> 標籤所構成, 當使用者選取了 select box 中任一個地名時, 右手邊的 <DIV> 區塊便會被置換成相對應的地區介紹, 當然這些介紹文字都是經由 AJAX 向伺服器要來的。


          rico_exam.html
          01?
          <html>
          02?
          <head>
          03?
          <meta?http-equiv="Content-Type"
          04?content
          ="text/html;?charset=UTF-8"?/>
          05?
          <script?type="text/javascript"?src="script/prototype.js">
          06?</script>
          07?
          <script?type="text/javascript"?src="script/rico.js">
          08?</script>
          09
          10?
          <script?type="text/javascript">
          11?var?cur_sel;
          12?function?init()?{
          13?cur_sel?=?'0';
          14?document.getElementById('selField').value=cur_sel;
          15?//?向?ajaxEngine?註冊一個新的要求?-?AID_LOCQUERY
          16?【ajaxEngine.registerRequest('AID_LOCQUERY',?'loc.php');】
          17?//?向?ajaxEngine?註冊一個新的元件?-?descField
          18?【ajaxEngine.registerAjaxElement('descField');】
          19?}
          20
          21?function?queryLocDesc(sel)?{
          22?var?locName?=?sel.value;
          23?if?(locName?!=?'0'?&&?locName?!=?cur_sel)?{
          24?//?送出?AID_LOCQUERY?的要求,並指定參數
          25?【ajaxEngine.sendRequest?('AID_LOCQUERY',?】
          26?【'locName='+locName);】
          27?cur_sel?=?locName;
          28?}
          29?}
          30?</script>
          31?
          <title>臺灣走透透?—?縣市情報通</title>
          32?
          </head>
          33?
          <body?onload="init()">
          34
          35?
          <table?width="50%"?border=0>
          36?
          <tr>
          37?
          <td?width="25%"?valign="top">
          38?請選擇縣市情報:
          39?
          <select?id="selField"?onchange="queryLocDesc(this)">
          40?
          <option?value="0"?selected>----------</option>
          41?
          <option?value="1">臺北市</option>
          42?
          <option?value="2">臺北縣</option>
          43?
          <option?value="3">基隆市</option>
          44?
          <option?value="4">宜蘭縣</option>
          45?
          <option?value="5">桃園縣</option>
          46?
          </select>
          47?
          </td>
          48?
          <td>
          49?
          <div?id="descField"></div>
          50?
          </td>
          51
          52?
          </tr>
          53?
          </table>
          54
          55?
          </body>
          56?
          </html>


          執行結果




          程式說明

          這個範例的流程圖如右:

          ?

          這個範例看起來簡單多了, 這也是我們為什麼要使用 Framework 的目的之一, 重複利用別人的成果, 可以為自己解省力氣, 並專注在開發更精緻的產品上。


          在範例一開始, 我們首先要載入兩個 JavaScript 程式庫, 一個是前面所介紹的 prototype.js, 而一個是 rico.js, 因為 rico.js 實際上是植基於 prototype.js 上, 所以在使用 rico 之前, 務必要先載入 prototype.js, 而且要使用對的版本, 例如在筆者撰寫本章節時, rico 最新的版本是 1.1.0, 它所需要的 prototype.js 最低需求是 1.4.0, 所以你如果要使用這個版本, 同樣的也需要一份 prototype.js 1.4.0 的函式庫。


          在載入 prototype.js 以及 rico.js 之後, 接下來的 script 區塊便是我們自己的程式碼了, 在這個範例中, 筆者只用了短短兩個函式, 第一個函式 init() 是用來在頁面被載入的同時做初始化, 另外一個函式 queryLocDesc() , 是當使用者選擇了 select box 中不同的選項時, 做出對應的動作, 所以我們必須在 select box 的 onchange 事件被觸發時去執行這個函式。


          前面有提到 rico 的 AJAX 是以 ajaxEngine 為核心, 所以整個頁面不管有幾個 AJAX 需求, 都是要跟這個物件註冊, 在第一個範例中, 我們只有一種 AJAX 需求, 所以我們也只對 ajaxEngine 註冊一個要求, 在 rico 中, 你要完成這個動作就是要呼叫 registerRequest() 函式, 不過註冊的動作並不會觸發 XMLHttpRequest 立刻去執行, 而是必須等到我們呼叫了 sendRequest() 這個函式後, ajaxEngine 才會真正有動作。


          因為我們可以對 ajaxEngine 註冊好幾個 AJAX 需求, 為了區別不同的需求, 便需要一個 ID 來辨識, rico 是以一個字串 ID 來為每個 AJAX 需求作辨認, 所以不管你呼叫 registerRequest() 以及 sendRequest() 時都要指定這個 ID, 讓 rico 可以知道你要做的是那個 AJAX 動作, 在我們第一個範例中, 就是以 AID_LOCQUERY 作為這個 ID 字串。又例如以下程式碼便是我們註冊了好幾個 AJAX 需求, 且個別去執行動作。


          function?init()?{
          ajaxEngine.registerRequest('AID_FOODQUERY',?'food.php');
          ajaxEngine.registerRequest('AID_FUNQUERY',?'fun.php');
          ajaxEngine.registerRequest('AID_INFO',?'info.php');
          }

          function?queryFood()?{
          ajaxEngine.sendRequest('AID_FOODQUERY');
          }

          function?queryFun()?{
          ajaxEngine.sendRequest('AID_FUNQUERY');
          }

          function?queryInfo()?{
          ajaxEngine.sendRequest('AID_INFO');
          }

          利用 rico 開發 AJAX 有個限制, 也就是你必須給它適當格式的 XML 文件, 底下便是我們給第一個範例的 XML 文件:


          <?xml?version="1.0"?encoding="UTF-8"?>
          <ajax-response>
          <response?type="element"?id="descField">
          <img?src="/images/sights/taipeicity00.jpg"?/>
          <table?border="0">
          <tr><td><b>面積</b>:?271.7997平方公里</td></tr>
          <tr><td><b>人口</b>:264萬6474人(2001.6)</td></tr>
          <tr><td><b>知?名?小?吃:</b></td></tr>
          <tr><td>香腸、麵線、小籠包、麻辣鍋、滷味、豆乾、芒果冰
          、牛肉麵、藥燉排骨、大餅包小餅、豆花、蛇肉、下午茶、飲茶
          、茶點、夜市小吃、各省料理、各國料理
          </td></tr>
          </table>
          </response>
          </ajax-response>

          在每個給 rico ajaxEngine 的 XML 文件中, 必須是由 <ajax-response> </ajax-response> 所包裝起來, 而在這個區塊中, 你又必須將你真正的資料包裝在 <response> </response> 區塊中, 不過在同一個 <ajax-response> 區塊中, 可以包含多個 <response> 區塊。


          在每個 <response> 的標籤中, 你必須描述這個回應的屬性和辨識 ID, 屬性可以是 element 或者是 object, 端看你向 ajaxEngine 註冊的是 element 或者是 object 而定, 例如在第一個範例中, 我們註冊了一個 element, 它的 ID 是 descField:


          ajaxEngine.registerAjaxElement('descField');

          不過, 在你的 HTML 文件中, 你所註冊的 ID 必須要有相對應的 <DIV> 區塊, 因為當 ajaxEngine 收到伺服器的回應後, 會對這個 <DIV> 區塊做替換的工作, 例如, 在第一個範例中, ajaxEngine 會將 <response> </response> 中所夾帶的 HTML 內容替換到 <DIV id="descField"> </DIV> 中, 因此在瀏覽器上, 我們就可以看到資料的呈現。

          posted @ 2006-07-15 13:45 paulwong 閱讀(719) | 評論 (0)編輯 收藏

          服務器在某些情況下需要進行的調整

          服務器在某些情況下需要進行的調整.

          =======================================================================
          一、中文問題
          如果操作系統不支持中文,應首先使操作系統支持中文。
          附錄中提供為Aix安裝中文補丁包的步驟,其他操作系統請參照相關資料。
          (1)weblogic
          修改startweblogic.sh(startweblogic.cmd)中啟動server的命令,重新設置虛擬機參數
          添加-Ddefault.client.encoding=GBK -Dfile.encoding=GBK -Duser.language=Zh -Duser.region=CN
          具體如下:

          %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS%
          -Ddefault.client.encoding=GBK -Dfile.encoding=GBK -Duser.language=Zh -Duser.region=CN
          -Dweblogic.Name=%SERVER_NAME%
          -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE%
          -Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" weblogic.Server

          (2)websphere
          修改應用程序服務器->進程定義->JVM虛擬機->一般自變量定義
          添加-Ddefault.client.encoding=GBK -Dfile.encoding=GBK -Duser.language=Zh -Duser.region=CN
          =======================================================================
          二、內存調優
          通過分析運行日志,在中間件服務器運行時,可找到管理信息->日志分析
          服務器不運行情況下,可超找服務器主目錄下的fpplogs目錄.
          查看是否存在OutOfMemoryError錯誤,如果存在說明存在超出虛擬機分配的內存,
          應該適當調整虛擬機內存。
          (1)weblogic
          可以設置-Xms(最小使用內存) -Xmx(最大使用內存),-XX:MaxPermSize
          最大使用內存:對于UNIX而言,一般不應超過物理內存的75%;
          對于Windows, 一般不應超過物理內存的50%;
          -XX:MaxPermSize 一般應為ms(最大使用內存)的一半;

          具體操作時,修改startweblogic.sh(startweblogic.cmd)中啟動server的命令,重新設置虛擬機參數

          set MEM_ARGS=-Xms128m -Xmx512m -XX:MaxPermSize=256m
          %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS%
          -Dweblogic.Name=%SERVER_NAME%
          -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE%
          -Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" weblogic.Server

          (2)websphere
          修改應用程序服務器->進程定義->JVM虛擬機
          設置最大最小內存,并重新啟動服務器.
          ========================================================================
          三、連接池的優化
          可以參照同一時間連接數據庫的用戶數量,進行設置,
          數據庫的最大連接數不能小于高峰時期同一時間連接用戶的數量。
          (1)weblogic
          Services->jdbc-->Connection Pools-->centerconn-->connections
          initial Capacity(初始連接數):10
          Maximum Capacity(最大連接數):50
          CapacityIncrement:(每次遞增數):3
          (2)websphere
          請參考weblogic設置數據源的最大最小連接數。

          ========================================================================
          附錄:

          在AIX中使用中文有兩種途徑:第一是在安裝AIX時選擇中文語言,裝好的系統自動顯示中文(這種方法不推薦使用,它沒有第二種方法使用起來靈活)。第二是安裝AIX時選擇英文,系統啟動后手工設置中文環境,方法如下:

          1. 將AIX系統盤的第一張光盤放入光驅;

          2. 運行命令:

          smitty

          --> System Environments

          --> Manage Languange Environment

          --> Change/Show Primary Language Environment

          --> Change/Show Cultural Convention, Language, or Keyboard



          在隨后顯示的菜單中將光標分別移到以下字段:



          Primary CULTURAL Convention

          Primary LANGUAGE translation

          Primary KEYBOARD



          按下,從彈出的菜單中選擇“IBM-eucCN”將上述字段改為簡體中文,按下回車鍵后系統自動從光盤安裝中文環境軟件包。此操作完成后重新啟動系統,操作界面即為簡體中文。


          ========================================================================
          注:本文檔只做參照,并不能千篇一律的這樣做.還需要具體問題具體分析.

          posted @ 2006-07-12 22:00 paulwong 閱讀(458) | 評論 (0)編輯 收藏

          僅列出標題
          共115頁: First 上一頁 107 108 109 110 111 112 113 114 115 下一頁 
          主站蜘蛛池模板: 朝阳县| 于都县| 东安县| 道孚县| 达州市| 滁州市| 萨嘎县| 剑阁县| 太原市| 黄梅县| 平乐县| 琼结县| 永昌县| 昌乐县| 义马市| 来安县| 襄汾县| 凤山市| 沁阳市| 嘉善县| 长丰县| 沽源县| 得荣县| 永康市| 朝阳市| 黄骅市| 金阳县| 邳州市| 柳林县| 方城县| 定西市| 元阳县| 五常市| 新郑市| 江川县| 大关县| 绥江县| 赫章县| 南木林县| 昂仁县| 西乌珠穆沁旗|