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

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

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

    我的Blog我做主^_^

    走向一條通往JAVA的不歸路...

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      64 隨筆 :: 68 文章 :: 77 評論 :: 0 Trackbacks

    2006年12月22日 #

    org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV

    原因是缺少.jar文件

    至于是缺少standard.jar還是servlet-api.jar還是兩個(gè)都缺那就看你引了哪個(gè)了

    posted @ 2011-05-18 11:45 java_蟈蟈 閱讀(2990) | 評論 (0)編輯 收藏

    JDK1.5中,String類新增了一個(gè)很有用的靜態(tài)方法String.format():
    format(Locale l, String format, Object... args) 使用指定的語言環(huán)境、格式字符串和參數(shù)返回一個(gè)格式化字符串。
    format(String format, Object... args) 使用指定的格式字符串和參數(shù)返回一個(gè)格式化字符串。

    舉幾個(gè)這個(gè)方法實(shí)用的例子(注釋是輸出結(jié)果):

    CODE:

    long now = System.currentTimeMillis();

    String s = String.format("%tR", now);   // "15:12"

    CODE:

    // Current month/day/year

    Date d = new Date(now);

    s = String.format("%tD", d);                // "07/13/04"

    CODE:

    s = String.format("%,d", Integer.MAX_VALUE); // "2,147,483,647"

    CODE:

    s = String.format("%05d", 123);              // "00123"
    是不是很方便,讓人動心啊?哈哈,還有更多的效果!

    其實(shí)format函數(shù)有些類似c語言中printf函數(shù),一些格式字符串與 C 類似,但已進(jìn)行了某些定制,以適應(yīng) Java 語言,并且利用了其中一些特性。此方法提供了對布局對齊和排列的支持,以及對數(shù)值、字符串和日期/時(shí)間數(shù)據(jù)的常規(guī)格式和特定于語言環(huán)境的輸出的支持。支持諸如 byte、BigDecimal 和 Calendar 等常見 Java 類型。

    產(chǎn)生格式化輸出的每個(gè)方法都需要格式字符串 和參數(shù)列表。格式字符串是一個(gè) String,它可以包含固定文本以及一個(gè)或多個(gè)嵌入的格式說明符。請考慮以下示例:

    Calendar c = ...;
    String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);

    格式字符串是 format 方法的第一個(gè)參數(shù)。它包含三個(gè)格式說明符 "%1$tm"、"%1$te" 和 "%1$tY",它們指出應(yīng)該如何處理參數(shù)以及在文本的什么地方插入它們。格式字符串的其余部分是包括 "Dukes Birthday: " 和其他任何空格或標(biāo)點(diǎn)符號的固定文本。 參數(shù)列表由傳遞給位于格式字符串之后的方法的所有參數(shù)組成。在上述示例中,參數(shù)列表的大小為 1,由新對象 Calendar 組成。

    1.常規(guī)類型、字符類型和數(shù)值類型的格式說明符的語法如下:%[argument_index$][flags][width][.precision]conversion

    可選的 argument_index 是一個(gè)十進(jìn)制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個(gè)參數(shù)由 "1$" 引用,第二個(gè)參數(shù)由 "2$" 引用,依此類推。
    可選的 flags 是修改輸出格式的字符集。有效標(biāo)志的集合取決于轉(zhuǎn)換類型。
    可選 width 是一個(gè)非負(fù)十進(jìn)制整數(shù),表明要向輸出中寫入的最少字符數(shù)。
    可選 precision 是一個(gè)非負(fù)十進(jìn)制整數(shù),通常用來限制字符數(shù)。特定行為取決于轉(zhuǎn)換類型。
    所需的 conversion 是一個(gè)表明應(yīng)該如何格式化參數(shù)的字符。給定參數(shù)的有效轉(zhuǎn)換集合取決于參數(shù)的數(shù)據(jù)類型。

    2.用來表示日期和時(shí)間類型的格式說明符的語法如下:
    %[argument_index$][flags][width]conversion

    可選的 argument_index、flags 和 width 的定義同上。
    所需的 conversion 是一個(gè)由兩字符組成的序列。第一個(gè)字符是 't' 或 'T'。第二個(gè)字符表明所使用的格式。這些字符類似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的字符。


    3.與參數(shù)不對應(yīng)的格式說明符的語法如下:
    %[flags][width]conversion

    可選 flags 和 width 的定義同上。
    所需的 conversion 是一個(gè)表明要在輸出中所插內(nèi)容的字符。

    轉(zhuǎn)換
    轉(zhuǎn)換可分為以下幾類:
    1. 常規(guī) - 可應(yīng)用于任何參數(shù)類型
    2. 字符 - 可應(yīng)用于表示 Unicode 字符的基本類型:char、Character、byte、Byte、short 和 Short。當(dāng) Character.isValidCodePoint(int) 返回 true 時(shí),可將此轉(zhuǎn)換應(yīng)用于 int 和 Integer 類型
    3. 數(shù)值
          1. 整數(shù) - 可應(yīng)用于 Java 的整數(shù)類型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger
          2. 浮點(diǎn) - 可用于 Java 的浮點(diǎn)類型:float、Float、double、Double 和 BigDecimal
    4. 日期/時(shí)間 - 可應(yīng)用于 Java 的、能夠?qū)θ掌诨驎r(shí)間進(jìn)行編碼的類型:long、Long、Calendar 和 Date。
    5. 百分比 - 產(chǎn)生字面值 '%' ('\u0025')
    6. 行分隔符 - 產(chǎn)生特定于平臺的行分隔符

    下表總結(jié)了受支持的轉(zhuǎn)換。由大寫字符(如 'B'、'H'、'S'、'C'、'X'、'E'、'G'、'A' 和 'T')表示的轉(zhuǎn)換與由相應(yīng)的小寫字符的轉(zhuǎn)換等同,根據(jù)流行的 Locale 規(guī)則將結(jié)果轉(zhuǎn)換為大寫形式除外。后者等同于 String.toUpperCase() 的以下調(diào)用.

     

    轉(zhuǎn)換 參數(shù)類別 說明
    'b', 'B' 常規(guī) 如果參數(shù) arg 為 null,則結(jié)果為 "false"。如果 arg 是一個(gè) boolean 值或 Boolean,則結(jié)果為 String.valueOf() 返回的字符串。否則結(jié)果為 "true"。
    'h', 'H' 常規(guī) 如果參數(shù) arg 為 null,則結(jié)果為 "null"。否則,結(jié)果為調(diào)用 Integer.toHexString(arg.hashCode()) 得到的結(jié)果。
    's', 'S' 常規(guī) 如果參數(shù) arg 為 null,則結(jié)果為 "null"。如果 arg 實(shí)現(xiàn) Formattable,則調(diào)用 arg.formatTo。否則,結(jié)果為調(diào)用 arg.toString() 得到的結(jié)果。
    'c', 'C' 字符 結(jié)果是一個(gè) Unicode 字符
    'd' 整數(shù) 結(jié)果被格式化為十進(jìn)制整數(shù)
    'o' 整數(shù) 結(jié)果被格式化為八進(jìn)制整數(shù)
    'x', 'X' 整數(shù) 結(jié)果被格式化為十六進(jìn)制整數(shù)
    'e', 'E' 浮點(diǎn) 結(jié)果被格式化為用計(jì)算機(jī)科學(xué)記數(shù)法表示的十進(jìn)制數(shù)
    'f' 浮點(diǎn) 結(jié)果被格式化為十進(jìn)制數(shù)
    'g', 'G' 浮點(diǎn) 根據(jù)精度和舍入運(yùn)算后的值,使用計(jì)算機(jī)科學(xué)記數(shù)形式或十進(jìn)制格式對結(jié)果進(jìn)行格式化。
    'a', 'A' 浮點(diǎn) 結(jié)果被格式化為帶有效位數(shù)和指數(shù)的十六進(jìn)制浮點(diǎn)數(shù)
    't', 'T' 日期/時(shí)間 日期和時(shí)間轉(zhuǎn)換字符的前綴。請參閱日期/時(shí)間轉(zhuǎn)換。
    '%' 百分比 結(jié)果為字面值 '%' ('\u0025')
    'n' 行分隔符 結(jié)果為特定于平臺的行分隔符

    任何未明確定義為轉(zhuǎn)換的字符都是非法字符,并且都被保留,以供將來擴(kuò)展使用。

    日期/時(shí)間轉(zhuǎn)換
    以下日期和時(shí)間轉(zhuǎn)換的后綴字符是為 't' 和 'T' 轉(zhuǎn)換定義的。這些類型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的類型。提供其他轉(zhuǎn)換類型是為了訪問特定于 Java 的功能(如將 'L' 用作秒中的毫秒)。

    以下轉(zhuǎn)換字符用來格式化時(shí)間:

    'H' 24 小時(shí)制的小時(shí),被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 23。
    'I' 12 小時(shí)制的小時(shí),被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 01 - 12。
    'k' 24 小時(shí)制的小時(shí),即 0 - 23。
    'l' 12 小時(shí)制的小時(shí),即 1 - 12。
    'M' 小時(shí)中的分鐘,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 59。
    'S' 分鐘中的秒,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 60 ("60" 是支持閏秒所需的一個(gè)特殊值)。
    'L' 秒中的毫秒,被格式化為必要時(shí)帶前導(dǎo)零的三位數(shù),即 000 - 999。
    'N' 秒中的毫微秒,被格式化為必要時(shí)帶前導(dǎo)零的九位數(shù),即 000000000 - 999999999。
    'p' 特定于語言環(huán)境的 上午或下午 標(biāo)記以小寫形式表示,例如 "am" 或 "pm"。使用轉(zhuǎn)換前綴 'T' 可以強(qiáng)行將此輸出轉(zhuǎn)換為大寫形式。
    'z' 相對于 GMT 的 RFC 822 格式的數(shù)字時(shí)區(qū)偏移量,例如 -0800。
    'Z' 表示時(shí)區(qū)縮寫形式的字符串。Formatter 的語言環(huán)境將取代參數(shù)的語言環(huán)境(如果有)。
    's' 自協(xié)調(diào)世界時(shí) (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的秒數(shù),即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值。
    'Q' 自協(xié)調(diào)世界時(shí) (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的毫秒數(shù),即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。

    以下轉(zhuǎn)換字符用來格式化日期:

    'B' 特定于語言環(huán)境的月份全稱,例如 "January" 和 "February"。
    'b' 特定于語言環(huán)境的月份簡稱,例如 "Jan" 和 "Feb"。
    'h' 與 'b' 相同。
    'A' 特定于語言環(huán)境的星期幾全稱,例如 "Sunday" 和 "Monday"
    'a' 特定于語言環(huán)境的星期幾簡稱,例如 "Sun" 和 "Mon"
    'C' 除以 100 的四位數(shù)表示的年份,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 99
    'Y' 年份,被格式化為必要時(shí)帶前導(dǎo)零的四位數(shù)(至少),例如,0092 等于格里高利歷的 92 CE。
    'y' 年份的最后兩位數(shù),被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 99。
    'j' 一年中的天數(shù),被格式化為必要時(shí)帶前導(dǎo)零的三位數(shù),例如,對于格里高利歷是 001 - 366。
    'm' 月份,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 01 - 13。
    'd' 一個(gè)月中的天數(shù),被格式化為必要時(shí)帶前導(dǎo)零兩位數(shù),即 01 - 31
    'e' 一個(gè)月中的天數(shù),被格式化為兩位數(shù),即 1 - 31。

    以下轉(zhuǎn)換字符用于格式化常見的日期/時(shí)間組合。

    'R' 24 小時(shí)制的時(shí)間,被格式化為 "%tH:%tM"
    'T' 24 小時(shí)制的時(shí)間,被格式化為 "%tH:%tM:%tS"。
    'r' 12 小時(shí)制的時(shí)間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標(biāo)記 ('%Tp') 的位置可能與語言環(huán)境有關(guān)。
    'D' 日期,被格式化為 "%tm/%td/%ty"。
    'F' ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"。
    'c' 日期和時(shí)間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。

    任何未明確定義為轉(zhuǎn)換的字符都是非法字符,并且都被保留,以供將來擴(kuò)展使用。


    標(biāo)志
    下表總結(jié)了受支持的標(biāo)志。y 表示該標(biāo)志受指示參數(shù)類型支持。

    標(biāo)志 常規(guī) 字符 整數(shù) 浮點(diǎn) 日期/時(shí)間 說明
    '-' y     y     y     y     y 結(jié)果將是左對齊的。
    '#' y1     -     y3     y     -     結(jié)果應(yīng)該使用依賴于轉(zhuǎn)換類型的替換形式
    '+' -     -     y4     y     -     結(jié)果總是包括一個(gè)符號
    '   ' -     -     y4     y     -     對于正值,結(jié)果中將包括一個(gè)前導(dǎo)空格
    '0' -     -     y     y     -     結(jié)果將用零來填充
    ',' -     -     y2     y5     -     結(jié)果將包括特定于語言環(huán)境的組分隔符
    '(' -     -     y4     y5     -     結(jié)果將是用圓括號括起來的負(fù)數(shù)

    1 取決于 Formattable 的定義。

    2 只適用于 'd' 轉(zhuǎn)換。

    3 只適用于 'o'、'x' 和 'X' 轉(zhuǎn)換。

    4 對 BigInteger 應(yīng)用 'd'、'o'、'x' 和 'X' 轉(zhuǎn)換時(shí),或者對 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分別應(yīng)用 'd' 轉(zhuǎn)換時(shí)適用。

    5 只適用于 'e'、'E'、'f'、'g' 和 'G' 轉(zhuǎn)換。

    任何未顯式定義為標(biāo)志的字符都是非法字符,并且都被保留,以供擴(kuò)展使用。

    寬度   寬度是將向輸出中寫入的最少字符數(shù)。對于行分隔符轉(zhuǎn)換,不適用寬度,如果提供寬度,則會拋出異常。
    精度   對于常規(guī)參數(shù)類型,精度是將向輸出中寫入的最多字符數(shù)。
    對于浮點(diǎn)轉(zhuǎn)換 'e'、'E' 和 'f',精度是小數(shù)點(diǎn)分隔符后的位數(shù)。如果轉(zhuǎn)換是 'g' 或 'G',那么精度是舍入計(jì)算后所得數(shù)值的所有位數(shù)。如果轉(zhuǎn)換是 'a' 或 'A',則不必指定精度。
    對于字符、整數(shù)和日期/時(shí)間參數(shù)類型轉(zhuǎn)換,以及百分比和行分隔符轉(zhuǎn)換,精度是不適用的;如果提供精度,則會拋出異常。
    參數(shù)索引   參數(shù)索引是一個(gè)十進(jìn)制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個(gè)參數(shù)由 "1$" 引用,第二個(gè)參數(shù)由 "2$" 引用,依此類推。
    根據(jù)位置引用參數(shù)的另一種方法是使用 '<' ('\u003c') 標(biāo)志,這將會重用以前格式說明符的參數(shù)。例如,以下兩條語句產(chǎn)生的字符相同:
     

    Calendar c = ...;
    String s1 = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);

    String s2 = String.format("Duke's Birthday: %1$tm %<$te,%<$tY", c);

     


    在JDK1.5中,String類增加了一個(gè)非常有用的靜態(tài)函數(shù)format(String  format, Objece...  argues),可以將各類數(shù)據(jù)格式化為字符串并輸出。其中format參數(shù)指定了輸出的格式,是最復(fù)雜也是最難掌握的一點(diǎn),而argues則是一系列等待被格式化的對象。該函數(shù)對c語言中printf函數(shù)的用法進(jìn)行了一定的模仿,因此有c語言基礎(chǔ)的人學(xué)起來會輕松許多。下面我們著重討論一下format 參數(shù)的格式及含義。
            format參數(shù)中可以包含不需要轉(zhuǎn)化的字符串,這些字符串是你寫什么,最終就輸出什么。同時(shí)還包含一些特殊格式的內(nèi)容,來指定將哪個(gè)對象來轉(zhuǎn)換,以及轉(zhuǎn)換成什么形式。這種特殊的格式通通以%index$開頭,index從1開始取值,表示將第index個(gè)參數(shù)拿進(jìn)來進(jìn)行格式化。這一點(diǎn)比c語言要強(qiáng)一點(diǎn), c語言只能按照參數(shù)的順序依次格式化,而java可以選擇第n個(gè)參數(shù)來格式化。由于該函數(shù)可以對任意一個(gè)對象進(jìn)行格式化,不同的對象適用的參數(shù)也不同,因此我們下面分類來討論。

    1.對整數(shù)進(jìn)行格式化:%[index$][標(biāo)識][最小寬度]轉(zhuǎn)換方式
            我們可以看到,格式化字符串由4部分組成,其中%[index$]的含義我們上面已經(jīng)講過,[最小寬度]的含義也很好理解,就是最終該整數(shù)轉(zhuǎn)化的字符串最少包含多少位數(shù)字。我們來看看剩下2個(gè)部分的含義吧:

     


    標(biāo)識:
    '-'    在最小寬度內(nèi)左對齊,不可以與“用0填充”同時(shí)使用
    '#'    只適用于8進(jìn)制和16進(jìn)制,8進(jìn)制時(shí)在結(jié)果前面增加一個(gè)0,16進(jìn)制時(shí)在結(jié)果前面增加0x
    '+'    結(jié)果總是包括一個(gè)符號(一般情況下只適用于10進(jìn)制,若對象為BigInteger才可以用于8進(jìn)制和16進(jìn)制)
    '  '    正值前加空格,負(fù)值前加負(fù)號(一般情況下只適用于10進(jìn)制,若對象為BigInteger才可以用于8進(jìn)制和16進(jìn)制)
    '0'    結(jié)果將用零來填充
    ','    只適用于10進(jìn)制,每3位數(shù)字之間用“,”分隔
    '('    若參數(shù)是負(fù)數(shù),則結(jié)果中不添加負(fù)號而是用圓括號把數(shù)字括起來(同‘+’具有同樣的限制)

    轉(zhuǎn)換方式:
    d-十進(jìn)制   o-八進(jìn)制   x或X-十六進(jìn)制        上面的說明過于枯燥,我們來看幾個(gè)具體的例子。需要特別注意的一點(diǎn)是:大部分標(biāo)識字符可以同時(shí)使用。

            System.out.println(String.format("%1$,09d", -3123));
            System.out.println(String.format("%1$9d", -31));
            System.out.println(String.format("%1$-9d", -31));
            System.out.println(String.format("%1$(9d", -31));
            System.out.println(String.format("%1$#9x", 5689));

    //結(jié)果為:
    //-0003,123
    //      -31
    //-31     
    //     (31)
    //   0x1639

    2.對浮點(diǎn)數(shù)進(jìn)行格式化:%[index$][標(biāo)識][最少寬度][.精度]轉(zhuǎn)換方式
            我們可以看到,浮點(diǎn)數(shù)的轉(zhuǎn)換多了一個(gè)“精度”選項(xiàng),可以控制小數(shù)點(diǎn)后面的位數(shù)。

    標(biāo)識:
    '-'    在最小寬度內(nèi)左對齊,不可以與“用0填充”同時(shí)使用
    '+'    結(jié)果總是包括一個(gè)符號
    '  '    正值前加空格,負(fù)值前加負(fù)號
    '0'    結(jié)果將用零來填充
    ','    每3位數(shù)字之間用“,”分隔(只適用于fgG的轉(zhuǎn)換)
    '('    若參數(shù)是負(fù)數(shù),則結(jié)果中不添加負(fù)號而是用圓括號把數(shù)字括起來(只適用于eEfgG的轉(zhuǎn)換)

    轉(zhuǎn)換方式:
    'e', 'E'  --  結(jié)果被格式化為用計(jì)算機(jī)科學(xué)記數(shù)法表示的十進(jìn)制數(shù)
    'f'          --  結(jié)果被格式化為十進(jìn)制普通表示方式
    'g', 'G'    --  根據(jù)具體情況,自動選擇用普通表示方式還是科學(xué)計(jì)數(shù)法方式
    'a', 'A'    --   結(jié)果被格式化為帶有效位數(shù)和指數(shù)的十六進(jìn)制浮點(diǎn)數(shù)

    3.對字符進(jìn)行格式化:
            對字符進(jìn)行格式化是非常簡單的,c表示字符,標(biāo)識中'-'表示左對齊,其他就沒什么了。

    4.對百分比符號進(jìn)行格式化:
            看了上面的說明,大家會發(fā)現(xiàn)百分比符號“%”是特殊格式的一個(gè)前綴。那么我們要輸入一個(gè)百分比符號該怎么辦呢?肯定是需要轉(zhuǎn)義字符的,但是要注意的是,在這里轉(zhuǎn)義字符不是“\”,而是“%”。換句話說,下面這條語句可以輸出一個(gè)“12%”:
    System.out.println(String.format("%1$d%%", 12));

    5.取得平臺獨(dú)立的行分隔符:
            System.getProperty("line.separator")可以取得平臺獨(dú)立的行分隔符,但是用在format中間未免顯得過于煩瑣了。于是format函數(shù)自帶了一個(gè)平臺獨(dú)立的行分隔符那就是String.format("%n")。

    6.對日期類型進(jìn)行格式化:
             以下日期和時(shí)間轉(zhuǎn)換的后綴字符是為 't' 和 'T' 轉(zhuǎn)換定義的。這些類型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的類型。提供其他轉(zhuǎn)換類型是為了訪問特定于 Java 的功能(如將 'L' 用作秒中的毫秒)。

    以下轉(zhuǎn)換字符用來格式化時(shí)間:
    'H'     24 小時(shí)制的小時(shí),被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 23。
    'I'     12 小時(shí)制的小時(shí),被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 01 - 12。
    'k'     24 小時(shí)制的小時(shí),即 0 - 23。
    'l'     12 小時(shí)制的小時(shí),即 1 - 12。
    'M'     小時(shí)中的分鐘,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 59。
    'S'     分鐘中的秒,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 60 ("60" 是支持閏秒所需的一個(gè)特殊值)。
    'L'     秒中的毫秒,被格式化為必要時(shí)帶前導(dǎo)零的三位數(shù),即 000 - 999。
    'N'     秒中的毫微秒,被格式化為必要時(shí)帶前導(dǎo)零的九位數(shù),即 000000000 - 999999999。
    'p'     特定于語言環(huán)境的上午或下午 標(biāo)記以小寫形式表示,例如 "am" 或 "pm"。使用轉(zhuǎn)換前綴 'T' 可以強(qiáng)行將此輸出轉(zhuǎn)換為大寫形式。
    'z'     相對于 GMT 的 RFC 822 格式的數(shù)字時(shí)區(qū)偏移量,例如 -0800。
    'Z'     表示時(shí)區(qū)縮寫形式的字符串。Formatter 的語言環(huán)境將取代參數(shù)的語言環(huán)境(如果有)。
    's'     自協(xié)調(diào)世界時(shí) (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的秒數(shù),即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值。
    'Q'     自協(xié)調(diào)世界時(shí) (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的毫秒數(shù),即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。

    以下轉(zhuǎn)換字符用來格式化日期:
    'B'     特定于語言環(huán)境的月份全稱,例如 "January" 和 "February"。
    'b'     特定于語言環(huán)境的月份簡稱,例如 "Jan" 和 "Feb"。
    'h'     與 'b' 相同。
    'A'     特定于語言環(huán)境的星期幾全稱,例如 "Sunday" 和 "Monday"
    'a'     特定于語言環(huán)境的星期幾簡稱,例如 "Sun" 和 "Mon"
    'C'     除以 100 的四位數(shù)表示的年份,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 99
    'Y'     年份,被格式化為必要時(shí)帶前導(dǎo)零的四位數(shù)(至少),例如,0092 等于格里高利歷的 92 CE。
    'y'     年份的最后兩位數(shù),被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 00 - 99。
    'j'     一年中的天數(shù),被格式化為必要時(shí)帶前導(dǎo)零的三位數(shù),例如,對于格里高利歷是 001 - 366。
    'm'     月份,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即 01 - 13。
    'd'     一個(gè)月中的天數(shù),被格式化為必要時(shí)帶前導(dǎo)零兩位數(shù),即 01 - 31
    'e'     一個(gè)月中的天數(shù),被格式化為兩位數(shù),即 1 - 31。

    以下轉(zhuǎn)換字符用于格式化常見的日期/時(shí)間組合。
    'R'     24 小時(shí)制的時(shí)間,被格式化為 "%tH:%tM"
    'T'     24 小時(shí)制的時(shí)間,被格式化為 "%tH:%tM:%tS"。
    'r'     12 小時(shí)制的時(shí)間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標(biāo)記 ('%Tp') 的位置可能與語言環(huán)境有關(guān)。
    'D'     日期,被格式化為 "%tm/%td/%ty"。
    'F'     ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"。
    'c'     日期和時(shí)間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。
    文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/java/javashl/2008107/148918.html

    posted @ 2011-05-17 08:22 java_蟈蟈 閱讀(2705) | 評論 (0)編輯 收藏

    當(dāng)start虛擬器的時(shí)候,之后就彈出:SDL_app:emulator.exe 應(yīng)用程序錯(cuò)誤
    在網(wǎng)上查了些資料,先刪除AVD`,然后重新創(chuàng)建新的AVD,再重新運(yùn)行項(xiàng)目竟然OK了,但關(guān)閉以后重新運(yùn)行又報(bào)相同的錯(cuò)誤。又在網(wǎng)上查了資料,查看任務(wù)管理器進(jìn)程中應(yīng)用是否還在運(yùn)行,但刪除停止應(yīng)用以后重新運(yùn)行項(xiàng)目還是報(bào)相同的錯(cuò)誤!
    解決方法:SD card size 不要設(shè)置,保準(zhǔn)可以。(大家可以試試,我不敢保證可行)。

    新建一個(gè)AVD以后,第一次跑起來OK的,關(guān)閉以后重新跑,又有問題了,難道我每跑一次就重新建AVD?這個(gè)不是解決問題的根本辦法...很多人說,SD card size 不要設(shè)置,可以避免這個(gè)問題出現(xiàn)。


    本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/jincf2011/archive/2011/04/22/6342906.aspx

    posted @ 2011-05-03 15:44 java_蟈蟈 閱讀(2200) | 評論 (4)編輯 收藏

    Tomcat部署時(shí)報(bào)錯(cuò)Could not copy all resources to...

    轉(zhuǎn)自:http://jiake0504.iteye.com/blog/253604

    在使用eclipse開發(fā),發(fā)布應(yīng)用的時(shí)候突然無法成功發(fā)布,提示  
     
    Deployment failure on Tomcat  6.x. Could not copy all resources to D:\...\webapps\eptInfo. If a file is locked, you can wait until the lock times out to redeploy, or stop the server and redeploy, or manually remove the deployment at D:\....\webapps\eptInfo.  
     
    但是我的tomcat服務(wù)并沒有啟動.上網(wǎng)搜索之后發(fā)現(xiàn)和大家范的是一個(gè)毛病,原來工程中我引了一個(gè)包,后來這個(gè)包被我給刪除了,但是因?yàn)橐呀?jīng)發(fā)布過這個(gè)工程了,所以classpath中就有這個(gè)包名了,這樣發(fā)布的時(shí)候也會去找這個(gè)包但是已經(jīng)不存在了,所以無copy,  
     
    解決辦法:在eclipse的工程中點(diǎn)擊右健選擇properties-->java build path中已經(jīng)提示了xx.jar不存在,這樣就把這個(gè)jar信息從Libraries中刪除即可.  
     
    重新發(fā)布應(yīng)用,成功!
    posted @ 2011-05-03 11:27 java_蟈蟈 閱讀(2297) | 評論 (0)編輯 收藏

    刪除掉C:\Documents and Settings\hao\Application Data\Subversion\auth\svn.simple文件夾下的文件即可.
    posted @ 2010-12-14 11:51 java_蟈蟈 閱讀(318) | 評論 (0)編輯 收藏

         摘要: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>       <%@page import="com.rao.bean.Sex"%>    &nbs...  閱讀全文
    posted @ 2010-10-26 11:08 java_蟈蟈 閱讀(600) | 評論 (0)編輯 收藏

         摘要: 今天一個(gè)朋友問起,將自己的想法寫出,以便備用

    EXEC sp_spaceused '表名'
    上面的語句查詢的是該表的數(shù)據(jù)大小及總行數(shù)
    下面的是執(zhí)行過程:
    一、將上述查詢出的總行數(shù)<@totalRow>及數(shù)據(jù)大小<@dataSize>放入臨時(shí)變量中
    二、將待分隔大小與總大小比較,看看要分成幾份,并將份數(shù)<@splitNum>記入臨時(shí)變量中
    三、執(zhí)行:select top @totalRow/@splitNum * into #temp from 表名 ; 并將@totalRow/@splitNum 的值放入@splitRows,并將開始行數(shù)<@startRow>及結(jié)尾行<@endRow>記錄
    四、執(zhí)行:EXEC sp_spaceused '#temp' 判斷其數(shù)據(jù)大小
    五、如果分隔出來的大小在合理范圍內(nèi),則執(zhí)行相同操作
    六、如果分隔出來的大小不在合理范圍內(nèi)則刪除臨時(shí)表,則重新執(zhí)行操作<三>   閱讀全文
    posted @ 2010-06-18 10:52 java_蟈蟈 閱讀(281) | 評論 (0)編輯 收藏

    本文引自:http://www.tkk7.com/176142998/archive/2009/02/03/221507.html

    Spring的JDBCTemplate

    當(dāng)hql等查詢方式不能滿足性能或靈活性的要求,必須使用SQL時(shí),大家有三種選擇:

    第一、使用Hibernate 的sql 查詢函數(shù),將查詢結(jié)果對象轉(zhuǎn)為Entity對象。

    第二、使用Hibernate Session的getConnection 獲得JDBC Connection,然后進(jìn)行純JDBC API操作;

    第三、選擇把Spring的JDBCTemplate作為一種很不錯(cuò)的JDBC Utils來使用。

         JDBCTemplate的使用很簡單,只要在ApplicationContext文件里定義一個(gè)jdbcTemplate節(jié)點(diǎn),POJO獲得注入后可以直接執(zhí)行操作,不需要繼承什么基類,詳見JDBCTemplate參考文檔

         AplicationContext定義:

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>

    實(shí)際使用: 

    SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, params);

    Tips1: jdbcTemplate有很多的ORM化回調(diào)操作將返回結(jié)果轉(zhuǎn)為對象列表,但很多時(shí)候還是需要返回ResultSet,Spring有提供一個(gè)類似ResultSet的 Spring SqlRowSet對象。

             

    Tips2:.注意jdbcTemplate盡量只執(zhí)行查詢操作,莫要進(jìn)行更新,否則很容易破壞Hibernate的二級緩存體系。


    Chapter 11. 使用JDBC進(jìn)行數(shù)據(jù)訪問

    11.1. 簡介

    Spring JDBC抽象框架所帶來的價(jià)值將在以下幾個(gè)方面得以體現(xiàn):(注:使用了Spring JDBC抽象框架之后,應(yīng)用開發(fā)人員只需要完成斜體字部分的編碼工作。)

    1. 指定數(shù)據(jù)庫連接參數(shù)

    2. 打開數(shù)據(jù)庫連接

    3. 聲明SQL語句

    4. 預(yù)編譯并執(zhí)行SQL語句

    5. 遍歷查詢結(jié)果(如果需要的話)

    6. 處理每一次遍歷操作

    7. 處理拋出的任何異常

    8. 處理事務(wù)

    9. 關(guān)閉數(shù)據(jù)庫連接

    Spring將替我們完成所有單調(diào)乏味的JDBC底層細(xì)節(jié)處理工作。

    11.1.1. Spring JDBC包結(jié)構(gòu)

    Spring JDBC抽象框架由四個(gè)包構(gòu)成:coredataSourceobject以及support

    org.springframework.jdbc.core包由JdbcTemplate類以及相關(guān)的回調(diào)接口(callback interface)和類組成。

    org.springframework.jdbc.datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實(shí)現(xiàn)(主要用于單元測試以及在J2EE容器之外使用JDBC)組成。工具類提供了一些靜態(tài)方法,諸如通過JNDI獲取數(shù)據(jù)連接以及在必要的情況下關(guān)閉這些連接。它支持綁定線程的連接,比如被用于DataSourceTransactionManager的連接。

    接下來,org.springframework.jdbc.object包由封裝了查詢、更新以及存儲過程的類組成,這些類的對象都是線程安全并且可重復(fù)使用的。它們類似于JDO,與JDO的不同之處在于查詢結(jié)果與數(shù)據(jù)庫是“斷開連接”的。它們是在org.springframework.jdbc.core包的基礎(chǔ)上對JDBC更高層次的抽象。

    最后,org.springframework.jdbc.support包提供了一些SQLException的轉(zhuǎn)換類以及相關(guān)的工具類。

    在JDBC處理過程中拋出的異常將被轉(zhuǎn)換成org.springframework.dao包中定義的異常。因此使用Spring JDBC進(jìn)行開發(fā)將不需要處理JDBC或者特定的RDBMS才會拋出的異常。所有的異常都是unchecked exception,這樣我們就可以對傳遞到調(diào)用者的異常進(jìn)行有選擇的捕獲。

    11.2. 利用JDBC核心類實(shí)現(xiàn)JDBC的基本操作和錯(cuò)誤處理

    11.2.1. JdbcTemplate

    JdbcTemplate是core包的核心類。它替我們完成了資源的創(chuàng)建以及釋放工作,從而簡化了我們對JDBC的使用。它還可以幫助我們避免一些常見的錯(cuò)誤,比如忘記關(guān)閉數(shù)據(jù)庫連接。JdbcTemplate將完成JDBC核心處理流程,比如SQL語句的創(chuàng)建、執(zhí)行,而把SQL語句的生成以及查詢結(jié)果的提取工作留給我們的應(yīng)用代碼。它可以完成SQL查詢、更新以及調(diào)用存儲過程,可以對ResultSet進(jìn)行遍歷并加以提取。它還可以捕獲JDBC異常并將其轉(zhuǎn)換成org.springframework.dao包中定義的,通用的,信息更豐富的異常。

    使用JdbcTemplate進(jìn)行編碼只需要根據(jù)明確定義的一組契約來實(shí)現(xiàn)回調(diào)接口。PreparedStatementCreator回調(diào)接口通過給定的Connection創(chuàng)建一個(gè)PreparedStatement,包含SQL和任何相關(guān)的參數(shù)。CallableStatementCreateor實(shí)現(xiàn)同樣的處理,只不過它創(chuàng)建的是CallableStatement。RowCallbackHandler接口則從數(shù)據(jù)集的每一行中提取值。

    我們可以在一個(gè)service實(shí)現(xiàn)類中通過傳遞一個(gè)DataSource引用來完成JdbcTemplate的實(shí)例化,也可以在application context中配置一個(gè)JdbcTemplate bean,來供service使用。需要注意的是DataSource在application context總是配制成一個(gè)bean,第一種情況下,DataSource bean將傳遞給service,第二種情況下DataSource bean傳遞給JdbcTemplate bean。因?yàn)镴dbcTemplate使用回調(diào)接口和SQLExceptionTranslator接口作為參數(shù),所以一般情況下沒有必要通過繼承JdbcTemplate來定義其子類。

    JdbcTemplate中使用的所有SQL將會以“DEBUG”級別記入日志(一般情況下日志的category是JdbcTemplate相應(yīng)的全限定類名,不過如果需要對JdbcTemplate進(jìn)行定制的話,可能是它的子類名)。

    11.2.2. NamedParameterJdbcTemplate

    NamedParameterJdbcTemplate類增加了在SQL語句中使用命名參數(shù)的支持。在此之前,在傳統(tǒng)的SQL語句中,參數(shù)都是用'?'占位符來表示的。 NamedParameterJdbcTemplate類內(nèi)部封裝了一個(gè)普通的JdbcTemplate,并作為其代理來完成大部分工作。下面的內(nèi)容主要針對NamedParameterJdbcTemplateJdbcTemplate的不同之處來加以說明,即如何在SQL語句中使用命名參數(shù)。

    通過下面的例子我們可以更好地了解NamedParameterJdbcTemplate的使用模式(在后面我們還有更好的使用方式)。

    // some JDBC-backed DAO class...
    public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(0) from T_ACTOR where first_name = :first_name";
    NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
    return template.queryForInt(sql, namedParameters);
    }

    在上面例子中,sql變量使用了命名參數(shù)占位符“first_name”,與其對應(yīng)的值存在namedParameters變量中(類型為MapSqlParameterSource)。

    如果你喜歡的話,也可以使用基于Map風(fēng)格的名值對將命名參數(shù)傳遞給NamedParameterJdbcTemplateNamedParameterJdbcTemplate實(shí)現(xiàn)了NamedParameterJdbcOperations接口,剩下的工作將由調(diào)用該接口的相應(yīng)方法來完成,這里我們就不再贅述):

    // some JDBC-backed DAO class...
    public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(0) from T_ACTOR where first_name = :first_name";
    NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
    Map namedParameters = new HashMap();
    namedParameters.put("first_name", firstName);
    return template.queryForInt(sql, namedParameters);
    }

    另外一個(gè)值得一提的特性是與NamedParameterJdbcTemplate位于同一個(gè)包中的SqlParameterSource接口。在前面的代碼片斷中我們已經(jīng)看到了該接口的實(shí)現(xiàn)(即MapSqlParameterSource類),SqlParameterSource可以用來作為NamedParameterJdbcTemplate命名參數(shù)的來源。MapSqlParameterSource類是一個(gè)非常簡單的實(shí)現(xiàn),它僅僅是一個(gè)java.util.Map適配器,當(dāng)然其用法也就不言自明了(如果還有不明了的,可以在Spring的JIRA系統(tǒng)中要求提供更多的相關(guān)資料)。

    SqlParameterSource接口的另一個(gè)實(shí)現(xiàn)--BeanPropertySqlParameterSource為我們提供了更有趣的功能。該類包裝一個(gè)類似JavaBean的對象,所需要的命名參數(shù)值將由包裝對象提供,下面我們使用一個(gè)例子來更清楚地說明它的用法。

    // some JavaBean-like class...
    public class Actor {
    private Long id;
    private String firstName;
    private String lastName;
    public String getFirstName() {
    return this.firstName;
    }
    public String getLastName() {
    return this.lastName;
    }
    public Long getId() {
    return this.id;
    }
    // setters omitted...
    }
    // some JDBC-backed DAO class...
    public int countOfActors(Actor exampleActor) {
    // notice how the named parameters match the properties of the above 'Actor' class
    String sql = "select count(0) from T_ACTOR where first_name = :firstName and last_name = :lastName";
    NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
    SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);
    return template.queryForInt(sql, namedParameters);
    }

    大家必須牢記一點(diǎn):NamedParameterJdbcTemplate類內(nèi)部包裝了一個(gè)標(biāo)準(zhǔn)的JdbcTemplate類。如果你需要訪問其內(nèi)部的JdbcTemplate實(shí)例(比如訪問JdbcTemplate的一些方法)那么你需要使用getJdbcOperations()方法返回的JdbcOperations接口。(JdbcTemplate實(shí)現(xiàn)了JdbcOperations接口)。

    NamedParameterJdbcTemplate類是線程安全的,該類的最佳使用方式不是每次操作的時(shí)候?qū)嵗粋€(gè)新的NamedParameterJdbcTemplate,而是針對每個(gè)DataSource只配置一個(gè)NamedParameterJdbcTemplate實(shí)例(比如在Spring IoC容器中使用Spring IoC來進(jìn)行配置),然后在那些使用該類的DAO中共享該實(shí)例。

    11.2.3. SimpleJdbcTemplate

    [Note] Note

    請注意該類所提供的功能僅適用于Java 5 (Tiger)。

    SimpleJdbcTemplate類是JdbcTemplate類的一個(gè)包裝器(wrapper),它利用了Java 5的一些語言特性,比如Varargs和Autoboxing。對那些用慣了Java 5的程序員,這些新的語言特性還是很好用的。

    SimpleJdbcTemplate 類利用Java 5的語法特性帶來的好處可以通過一個(gè)例子來說明。在下面的代碼片斷中我們首先使用標(biāo)準(zhǔn)的JdbcTemplate進(jìn)行數(shù)據(jù)訪問,接下來使用SimpleJdbcTemplate做同樣的事情。

    // classic JdbcTemplate-style...
    public Actor findActor(long id) {
    String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
    RowMapper mapper = new RowMapper() {
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    Actor actor = new Actor();
    actor.setId(rs.getLong(Long.valueOf(rs.getLong("id"))));
    actor.setFirstName(rs.getString("first_name"));
    actor.setLastName(rs.getString("last_name"));
    return actor;
    }
    };
    // normally this would be dependency injected of course...
    JdbcTemplate jdbcTemplate = new JdbcTemplate(this.getDataSource());
    // notice the cast, and the wrapping up of the 'id' argument
    // in an array, and the boxing of the 'id' argument as a reference type
    return (Actor) jdbcTemplate.queryForObject(sql, mapper, new Object[] {Long.valueOf(id)});
    }

    下面是同一方法的另一種實(shí)現(xiàn),惟一不同之處是我們使用了SimpleJdbcTemplate,這樣代碼顯得更加清晰。

    // SimpleJdbcTemplate-style...
    public Actor findActor(long id) {
    String sql = "select id, first_name, last_name from T_ACTOR where id = ?";
    ParameterizedRowMapper<Actor> mapper = new ParameterizedRowMapper<Actor>() {
    // notice the return type with respect to Java 5 covariant return types
    public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
    Actor actor = new Actor();
    actor.setId(rs.getLong("id"));
    actor.setFirstName(rs.getString("first_name"));
    actor.setLastName(rs.getString("last_name"));
    return actor;
    }
    };
    // again, normally this would be dependency injected of course...
    SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(this.getDataSource());
    return simpleJdbcTemplate.queryForObject(sql, mapper, id);
    }

    11.2.4. DataSource接口

    為了從數(shù)據(jù)庫中取得數(shù)據(jù),我們首先需要獲取一個(gè)數(shù)據(jù)庫連接。 Spring通過DataSource對象來完成這個(gè)工作。 DataSource是JDBC規(guī)范的一部分, 它被視為一個(gè)通用的數(shù)據(jù)庫連接工廠。通過使用DataSource, Container或Framework可以將連接池以及事務(wù)管理的細(xì)節(jié)從應(yīng)用代碼中分離出來。 作為一個(gè)開發(fā)人員,在開發(fā)和測試產(chǎn)品的過程中,你可能需要知道連接數(shù)據(jù)庫的細(xì)節(jié)。 但在產(chǎn)品實(shí)施時(shí),你不需要知道這些細(xì)節(jié)。通常數(shù)據(jù)庫管理員會幫你設(shè)置好數(shù)據(jù)源。

    在使用Spring JDBC時(shí),你既可以通過JNDI獲得數(shù)據(jù)源,也可以自行配置數(shù)據(jù)源( 使用Spring提供的DataSource實(shí)現(xiàn)類)。使用后者可以更方便的脫離Web容器來進(jìn)行單元測試。 這里我們將使用DriverManagerDataSource,不過DataSource有多種實(shí)現(xiàn), 后面我們會講到。使用DriverManagerDataSource和你以前獲取一個(gè)JDBC連接 的做法沒什么兩樣。你首先必須指定JDBC驅(qū)動程序的全限定名,這樣DriverManager 才能加載JDBC驅(qū)動類,接著你必須提供一個(gè)url(因JDBC驅(qū)動而異,為了保證設(shè)置正確請參考相關(guān)JDBC驅(qū)動的文檔), 最后你必須提供一個(gè)用戶連接數(shù)據(jù)庫的用戶名和密碼。下面我們將通過一個(gè)例子來說明如何配置一個(gè) DriverManagerDataSource

    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
    dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
    dataSource.setUsername("sa");
    dataSource.setPassword("");

    11.2.5. SQLExceptionTranslator接口

    SQLExceptionTranslator是一個(gè)接口,如果你需要在 SQLExceptionorg.springframework.dao.DataAccessException之間作轉(zhuǎn)換,那么必須實(shí)現(xiàn)該接口。

    轉(zhuǎn)換器類的實(shí)現(xiàn)可以采用一般通用的做法(比如使用JDBC的SQLState code),如果為了使轉(zhuǎn)換更準(zhǔn)確,也可以進(jìn)行定制(比如使用Oracle的error code)。

    SQLErrorCodeSQLExceptionTranslator是SQLExceptionTranslator的默認(rèn)實(shí)現(xiàn)。 該實(shí)現(xiàn)使用指定數(shù)據(jù)庫廠商的error code,比采用SQLState更精確。 轉(zhuǎn)換過程基于一個(gè)JavaBean(類型為SQLErrorCodes)中的error code。 這個(gè)JavaBean由SQLErrorCodesFactory工廠類創(chuàng)建,其中的內(nèi)容來自于 "sql-error-codes.xml"配置文件。該文件中的數(shù)據(jù)庫廠商代碼基于Database MetaData信息中的 DatabaseProductName,從而配合當(dāng)前數(shù)據(jù)庫的使用。

     

    SQLErrorCodeSQLExceptionTranslator使用以下的匹配規(guī)則:

     

    • 首先檢查是否存在完成定制轉(zhuǎn)換的子類實(shí)現(xiàn)。通常SQLErrorCodeSQLExceptionTranslator 這個(gè)類可以作為一個(gè)具體類使用,不需要進(jìn)行定制,那么這個(gè)規(guī)則將不適用。

    • 接著將SQLException的error code與錯(cuò)誤代碼集中的error code進(jìn)行匹配。 默認(rèn)情況下錯(cuò)誤代碼集將從SQLErrorCodesFactory取得。 錯(cuò)誤代碼集來自classpath下的sql-error-codes.xml文件, 它們將與數(shù)據(jù)庫metadata信息中的database name進(jìn)行映射。

    • 如果仍然無法匹配,最后將調(diào)用fallbackTranslator屬性的translate方法,SQLStateSQLExceptionTranslator類實(shí)例是默認(rèn)的fallbackTranslator。

     

    SQLErrorCodeSQLExceptionTranslator可以采用下面的方式進(jìn)行擴(kuò)展:

    public class MySQLErrorCodesTranslator extends SQLErrorCodeSQLExceptionTranslator {
    protected DataAccessException customTranslate(String task, String sql, SQLException sqlex) {
    if (sqlex.getErrorCode() == -12345) {
    return new DeadlockLoserDataAccessException(task, sqlex);
    }
    return null;
    }
    }

    在上面的這個(gè)例子中,error code為'-12345'的SQLException 將采用該轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換,而其他的error code將由默認(rèn)的轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。 為了使用該轉(zhuǎn)換器,必須將其作為參數(shù)傳遞給JdbcTemplate類 的setExceptionTranslator方法,并在需要使用這個(gè)轉(zhuǎn)換器器的數(shù)據(jù) 存取操作中使用該JdbcTemplate。 下面的例子演示了如何使用該定制轉(zhuǎn)換器:

    // create a JdbcTemplate and set data source
    JdbcTemplate jt = new JdbcTemplate();
    jt.setDataSource(dataSource);
    // create a custom translator and set the DataSource for the default translation lookup
    MySQLErrorCodesTransalator tr = new MySQLErrorCodesTransalator();
    tr.setDataSource(dataSource);
    jt.setExceptionTranslator(tr);
    // use the JdbcTemplate for this SqlUpdate
    SqlUpdate su = new SqlUpdate();
    su.setJdbcTemplate(jt);
    su.setSql("update orders set shipping_charge = shipping_charge * 1.05");
    su.compile();
    su.update();

    在上面的定制轉(zhuǎn)換器中,我們給它注入了一個(gè)數(shù)據(jù)源,因?yàn)槲覀內(nèi)匀恍枰?使用默認(rèn)的轉(zhuǎn)換器從sql-error-codes.xml中獲取錯(cuò)誤代碼集。

    11.2.6. 執(zhí)行SQL語句

    我們僅需要非常少的代碼就可以達(dá)到執(zhí)行SQL語句的目的,一旦獲得一個(gè) DataSource和一個(gè)JdbcTemplate, 我們就可以使用JdbcTemplate提供的豐富功能實(shí)現(xiàn)我們的操作。 下面的例子使用了極少的代碼完成創(chuàng)建一張表的工作。

    import javax.sql.DataSource;
    import org.springframework.jdbc.core.JdbcTemplate;
    public class ExecuteAStatement {
    private JdbcTemplate jt;
    private DataSource dataSource;
    public void doExecute() {
    jt = new JdbcTemplate(dataSource);
    jt.execute("create table mytable (id integer, name varchar(100))");
    }
    public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    }
    }

    11.2.7. 執(zhí)行查詢

    除了execute方法之外,JdbcTemplate還提供了大量的查詢方法。 在這些查詢方法中,有很大一部分是用來查詢單值的。比如返回一個(gè)匯總(count)結(jié)果 或者從返回行結(jié)果中取得指定列的值。這時(shí)我們可以使用queryForInt(..)、 queryForLong(..)或者queryForObject(..)方法。 queryForObject方法用來將返回的JDBC類型對象轉(zhuǎn)換成指定的Java對象,如果類型轉(zhuǎn)換失敗將拋出 InvalidDataAccessApiUsageException異常。 下面的例子演示了兩個(gè)查詢的用法,一個(gè)返回int值,另一個(gè)返回 String

    import javax.sql.DataSource;
    import org.springframework.jdbc.core.JdbcTemplate;
    public class RunAQuery {
    private JdbcTemplate jt;
    private DataSource dataSource;
    public int getCount() {
    jt = new JdbcTemplate(dataSource);
    int count = jt.queryForInt("select count(*) from mytable");
    return count;
    }
    public String getName() {
    jt = new JdbcTemplate(dataSource);
    String name = (String) jt.queryForObject("select name from mytable", String.class);
    return name;
    }
    public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    }
    }

    除了返回單值的查詢方法,JdbcTemplate還提供了一組返回List結(jié)果 的方法。List中的每一項(xiàng)對應(yīng)查詢返回結(jié)果中的一行。其中最簡單的是queryForList方法, 該方法將返回一個(gè)List,該List中的每一條 記錄是一個(gè)Map對象,對應(yīng)應(yīng)數(shù)據(jù)庫中某一行;而該Map 中的每一項(xiàng)對應(yīng)該數(shù)據(jù)庫行中的某一列值。下面的代碼片斷接著上面的例子演示了如何用該方法返回表中 所有記錄:

    public List getList() {
    jt = new JdbcTemplate(dataSource);
    List rows = jt.queryForList("select * from mytable");
    return rows;
    }

    返回的結(jié)果集類似下面這種形式:

    [{name=Bob, id=1}, {name=Mary, id=2}]

    11.2.8. 更新數(shù)據(jù)庫

    JdbcTemplate還提供了一些更新數(shù)據(jù)庫的方法。 在下面的例子中,我們根據(jù)給定的主鍵值對指定的列進(jìn)行更新。 例子中的SQL語句中使用了“?”占位符來接受參數(shù)(這種做法在更新和查詢SQL語句中很常見)。 傳遞的參數(shù)值位于一個(gè)對象數(shù)組中(基本類型需要被包裝成其對應(yīng)的對象類型)。

    import javax.sql.DataSource;
    import org.springframework.jdbc.core.JdbcTemplate;
    public class ExecuteAnUpdate {
    private JdbcTemplate jt;
    private DataSource dataSource;
    public void setName(int id, String name) {
    jt = new JdbcTemplate(dataSource);
    jt.update("update mytable set name = ? where id = ?", new Object[] {name, new Integer(id)});
    }
    public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    }
    }

    11.3. 控制數(shù)據(jù)庫連接

    11.3.1. DataSourceUtils

    DataSourceUtils作為一個(gè)幫助類提供易用且強(qiáng)大的數(shù)據(jù)庫訪問能力, 我們可以使用該類提供的靜態(tài)方法從JNDI獲取數(shù)據(jù)庫連接以及在必要的時(shí)候關(guān)閉之。 它提供支持線程綁定的數(shù)據(jù)庫連接(比如使用DataSourceTransactionManager 的時(shí)候,將把數(shù)據(jù)庫連接綁定到當(dāng)前的線程上)。

    注:getDataSourceFromJndi(..)方法主要用于那些沒有使用bean factory 或者application context的場合。如果使用application context,那么最好是在 JndiObjectFactoryBean中配置bean或者直接使用 JdbcTemplate實(shí)例。JndiObjectFactoryBean 能夠通過JNDI獲取DataSource并將 DataSource作為引用參數(shù)傳遞給其他bean。 這樣,在不同的DataSource之間切換只需要修改配置文件即可, 甚至我們可以用一個(gè)非JNDI的DataSource來替換 FactoryBean定義!

    11.3.2. SmartDataSource接口

    SmartDataSourceDataSource 接口的一個(gè)擴(kuò)展,用來提供數(shù)據(jù)庫連接。使用該接口的類在指定的操作之后可以檢查是否需要關(guān)閉連接。 該接口在某些情況下非常有用,比如有些情況需要重用數(shù)據(jù)庫連接。

    11.3.3. AbstractDataSource

    AbstractDataSource是一個(gè)實(shí)現(xiàn)了DataSource 接口的abstract基類。它實(shí)現(xiàn)了DataSource接口的 一些無關(guān)痛癢的方法,如果你需要實(shí)現(xiàn)自己的DataSource,那么繼承 該類是個(gè)好主意。

    11.3.4. SingleConnectionDataSource

    SingleConnectionDataSourceSmartDataSource接口 的一個(gè)實(shí)現(xiàn),其內(nèi)部包裝了一個(gè)單連接。該連接在使用之后將不會關(guān)閉,很顯然它不能在多線程 的環(huán)境下使用。

    當(dāng)客戶端代碼調(diào)用close方法的時(shí)候,如果它總是假設(shè)數(shù)據(jù)庫連接來自連接池(就像使用持久化工具時(shí)一樣), 你應(yīng)該將suppressClose設(shè)置為true。 這樣,通過該類獲取的將是代理連接(禁止關(guān)閉)而不是原有的物理連接。 需要注意的是,我們不能把使用該類獲取的數(shù)據(jù)庫連接造型(cast)為Oracle Connection之類的本地?cái)?shù)據(jù)庫連接。

    SingleConnectionDataSource主要在測試的時(shí)候使用。 它使得測試代碼很容易脫離應(yīng)用服務(wù)器而在一個(gè)簡單的JNDI環(huán)境下運(yùn)行。 與DriverManagerDataSource不同的是,它始終只會使用同一個(gè)數(shù)據(jù)庫連接, 從而避免每次建立物理連接的開銷。

    11.3.5. DriverManagerDataSource

    DriverManagerDataSource類實(shí)現(xiàn)了 SmartDataSource接口。在applicationContext.xml中可以使用 bean properties來設(shè)置JDBC Driver屬性,該類每次返回的都是一個(gè)新的連接。

    該類主要在測試以及脫離J2EE容器的獨(dú)立環(huán)境中使用。它既可以用來在application context中作為一個(gè) DataSource bean,也可以在簡單的JNDI環(huán)境下使用。 由于Connection.close()僅僅只是簡單的關(guān)閉數(shù)據(jù)庫連接,因此任何能夠獲取 DataSource的持久化代碼都能很好的工作。不過使用JavaBean風(fēng)格的連接池 (比如commons-dbcp)也并非難事。即使是在測試環(huán)境下,使用連接池也是一種比使用 DriverManagerDataSource更好的做法。

    11.3.6. TransactionAwareDataSourceProxy

    TransactionAwareDataSourceProxy作為目標(biāo)DataSource的一個(gè)代理, 在對目標(biāo)DataSource包裝的同時(shí),還增加了Spring的事務(wù)管理能力, 在這一點(diǎn)上,這個(gè)類的功能非常像J2EE服務(wù)器所提供的事務(wù)化的JNDI DataSource。

    [Note] Note

    該類幾乎很少被用到,除非現(xiàn)有代碼在被調(diào)用的時(shí)候需要一個(gè)標(biāo)準(zhǔn)的 JDBC DataSource接口實(shí)現(xiàn)作為參數(shù)。 這種情況下,這個(gè)類可以使現(xiàn)有代碼參與Spring的事務(wù)管理。通常最好的做法是使用更高層的抽象 來對數(shù)據(jù)源進(jìn)行管理,比如JdbcTemplateDataSourceUtils等等。

    如果需要更詳細(xì)的資料,請參考TransactionAwareDataSourceProxy JavaDoc 。

    11.3.7. DataSourceTransactionManager

    DataSourceTransactionManager類是 PlatformTransactionManager接口的一個(gè)實(shí)現(xiàn),用于處理單JDBC數(shù)據(jù)源。 它將從指定DataSource取得的JDBC連接綁定到當(dāng)前線程,因此它也支持了每個(gè)數(shù)據(jù)源對應(yīng)到一個(gè)線程。

    我們推薦在應(yīng)用代碼中使用DataSourceUtils.getConnection(DataSource)來獲取 JDBC連接,而不是使用J2EE標(biāo)準(zhǔn)的DataSource.getConnection。因?yàn)榍罢邔伋?unchecked的org.springframework.dao異常,而不是checked的 SQLException異常。Spring Framework中所有的類(比如 JdbcTemplate)都采用這種做法。如果不需要和這個(gè) DataSourceTransactionManager類一起使用,DataSourceUtils 提供的功能跟一般的數(shù)據(jù)庫連接策略沒有什么兩樣,因此它可以在任何場景下使用。

    DataSourceTransactionManager類支持定制隔離級別,以及對SQL語句查詢超時(shí)的設(shè)定。 為了支持后者,應(yīng)用代碼必須使用JdbcTemplate或者在每次創(chuàng)建SQL語句時(shí)調(diào)用 DataSourceUtils.applyTransactionTimeout方法。

    在使用單個(gè)數(shù)據(jù)源的情形下,你可以用DataSourceTransactionManager來替代JtaTransactionManager, 因?yàn)?tt class="classname">DataSourceTransactionManager不需要容器支持JTA。如果你使用DataSourceUtils.getConnection(DataSource)來獲取 JDBC連接,二者之間的切換只需要更改一些配置。最后需要注意的一點(diǎn)就是JtaTransactionManager不支持隔離級別的定制!

    11.4. 用Java對象來表達(dá)JDBC操作

    org.springframework.jdbc.object包下的類允許用戶以更加 面向?qū)ο蟮姆绞饺ピL問數(shù)據(jù)庫。比如說,用戶可以執(zhí)行查詢并返回一個(gè)list, 該list作為一個(gè)結(jié)果集將把從數(shù)據(jù)庫中取出的列數(shù)據(jù)映射到業(yè)務(wù)對象的屬性上。 用戶也可以執(zhí)行存儲過程,以及運(yùn)行更新、刪除以及插入SQL語句。

    [Note] Note

    在許多Spring開發(fā)人員中間存在有一種觀點(diǎn),那就是下面將要提到的各種RDBMS操作類 (StoredProcedure類除外) 通常也可以直接使用JdbcTemplate相關(guān)的方法來替換。 相對于把一個(gè)查詢操作封裝成一個(gè)類而言,直接調(diào)用JdbcTemplate方法將更簡單 而且更容易理解。

    必須說明的一點(diǎn)就是,這僅僅只是一種觀點(diǎn)而已, 如果你認(rèn)為你可以從直接使用RDBMS操作類中獲取一些額外的好處, 你不妨根據(jù)自己的需要和喜好進(jìn)行不同的選擇。

    11.4.1. SqlQuery

    SqlQuery是一個(gè)可重用、線程安全的類,它封裝了一個(gè)SQL查詢。 其子類必須實(shí)現(xiàn)newResultReader()方法,該方法用來在遍歷 ResultSet的時(shí)候能使用一個(gè)類來保存結(jié)果。 我們很少需要直接使用SqlQuery,因?yàn)槠渥宇?MappingSqlQuery作為一個(gè)更加易用的實(shí)現(xiàn)能夠?qū)⒔Y(jié)果集中的行映射為Java對象。 SqlQuery還有另外兩個(gè)擴(kuò)展分別是 MappingSqlQueryWithParametersUpdatableSqlQuery。

    11.4.2. MappingSqlQuery

    MappingSqlQuery是一個(gè)可重用的查詢抽象類,其具體類必須實(shí)現(xiàn) mapRow(ResultSet, int)抽象方法來將結(jié)果集中的每一行轉(zhuǎn)換成Java對象。

    SqlQuery的各種實(shí)現(xiàn)中, MappingSqlQuery是最常用也是最容易使用的一個(gè)。

    下面這個(gè)例子演示了一個(gè)定制查詢,它將從客戶表中取得的數(shù)據(jù)映射到一個(gè) Customer類實(shí)例。

    private class CustomerMappingQuery extends MappingSqlQuery {
    public CustomerMappingQuery(DataSource ds) {
    super(ds, "SELECT id, name FROM customer WHERE id = ?");
    super.declareParameter(new SqlParameter("id", Types.INTEGER));
    compile();
    }
    public Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
    Customer cust = new Customer();
    cust.setId((Integer) rs.getObject("id"));
    cust.setName(rs.getString("name"));
    return cust;
    }
    }

    在上面的例子中,我們?yōu)橛脩舨樵兲峁┝艘粋€(gè)構(gòu)造函數(shù)并為構(gòu)造函數(shù)傳遞了一個(gè) DataSource參數(shù)。在構(gòu)造函數(shù)里面我們把 DataSource和一個(gè)用來返回查詢結(jié)果的SQL語句作為參數(shù) 調(diào)用父類的構(gòu)造函數(shù)。SQL語句將被用于生成一個(gè)PreparedStatement對象, 因此它可以包含占位符來傳遞參數(shù)。而每一個(gè)SQL語句的參數(shù)必須通過調(diào)用 declareParameter方法來進(jìn)行聲明,該方法需要一個(gè) SqlParameter(封裝了一個(gè)字段名字和一個(gè) java.sql.Types中定義的JDBC類型)對象作為參數(shù)。 所有參數(shù)定義完之后,我們調(diào)用compile()方法來對SQL語句進(jìn)行預(yù)編譯。

    下面讓我們看看該定制查詢初始化并執(zhí)行的代碼:

    public Customer getCustomer(Integer id) {
    CustomerMappingQuery custQry = new CustomerMappingQuery(dataSource);
    Object[] parms = new Object[1];
    parms[0] = id;
    List customers = custQry.execute(parms);
    if (customers.size() > 0) {
    return (Customer) customers.get(0);
    }
    else {
    return null;
    }
    }

    在上面的例子中,getCustomer方法通過傳遞惟一參數(shù)id來返回一個(gè)客戶對象。 該方法內(nèi)部在創(chuàng)建CustomerMappingQuery實(shí)例之后, 我們創(chuàng)建了一個(gè)對象數(shù)組用來包含要傳遞的查詢參數(shù)。這里我們只有唯一的一個(gè) Integer參數(shù)。執(zhí)行CustomerMappingQuery的 execute方法之后,我們得到了一個(gè)List,該List中包含一個(gè) Customer對象,如果有對象滿足查詢條件的話。

    11.4.3. SqlUpdate

    SqlUpdate類封裝了一個(gè)可重復(fù)使用的SQL更新操作。 跟所有RdbmsOperation類一樣,SqlUpdate可以在SQL中定義參數(shù)。

    該類提供了一系列update()方法,就像SqlQuery提供的一系列execute()方法一樣。

    SqlUpdate是一個(gè)具體的類。通過在SQL語句中定義參數(shù),這個(gè)類可以支持 不同的更新方法,我們一般不需要通過繼承來實(shí)現(xiàn)定制。

    import java.sql.Types;
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.SqlParameter;
    import org.springframework.jdbc.object.SqlUpdate;
    public class UpdateCreditRating extends SqlUpdate {
    public UpdateCreditRating(DataSource ds) {
    setDataSource(ds);
    setSql("update customer set credit_rating = ? where id = ?");
    declareParameter(new SqlParameter(Types.NUMERIC));
    declareParameter(new SqlParameter(Types.NUMERIC));
    compile();
    }
    /**
    * @param id for the Customer to be updated
    * @param rating the new value for credit rating
    * @return number of rows updated
    */
    public int run(int id, int rating) {
    Object[] params =
    new Object[] {
    new Integer(rating),
    new Integer(id)};
    return update(params);
    }
    }

    11.4.4. StoredProcedure

    StoredProcedure類是一個(gè)抽象基類,它是對RDBMS存儲過程的一種抽象。 該類提供了多種execute(..)方法,不過這些方法的訪問類型都是protected的。

    從父類繼承的sql屬性用來指定RDBMS存儲過程的名字。 盡管該類提供了許多必須在JDBC3.0下使用的功能,但是我們更關(guān)注的是JDBC 3.0中引入的命名參數(shù)特性。

    下面的程序演示了如何調(diào)用Oracle中的sysdate()函數(shù)。 這里我們創(chuàng)建了一個(gè)繼承StoredProcedure的子類,雖然它沒有輸入?yún)?shù), 但是我必須通過使用SqlOutParameter來聲明一個(gè)日期類型的輸出參數(shù)。 execute()方法將返回一個(gè)map,map中的每個(gè)entry是一個(gè)用參數(shù)名作key, 以輸出參數(shù)為value的名值對。

    import java.sql.Types;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.SqlOutParameter;
    import org.springframework.jdbc.datasource.*;
    import org.springframework.jdbc.object.StoredProcedure;
    public class TestStoredProcedure {
    public static void main(String[] args)  {
    TestStoredProcedure t = new TestStoredProcedure();
    t.test();
    System.out.println("Done!");
    }
    void test() {
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("oracle.jdbc.OracleDriver");
    ds.setUrl("jdbc:oracle:thin:@localhost:1521:mydb");
    ds.setUsername("scott");
    ds.setPassword("tiger");
    MyStoredProcedure sproc = new MyStoredProcedure(ds);
    Map results = sproc.execute();
    printMap(results);
    }
    private class MyStoredProcedure extends StoredProcedure {
    private static final String SQL = "sysdate";
    public MyStoredProcedure(DataSource ds) {
    setDataSource(ds);
    setFunction(true);
    setSql(SQL);
    declareParameter(new SqlOutParameter("date", Types.DATE));
    compile();
    }
    public Map execute() {
    // the 'sysdate' sproc has no input parameters, so an empty Map is supplied...
    return execute(new HashMap());
    }
    }
    private static void printMap(Map results) {
    for (Iterator it = results.entrySet().iterator(); it.hasNext(); ) {
    System.out.println(it.next());
    }
    }
    }

    下面是StoredProcedure的另一個(gè)例子,它使用了兩個(gè)Oracle游標(biāo)類型的輸出參數(shù)。

    import oracle.jdbc.driver.OracleTypes;
    import org.springframework.jdbc.core.SqlOutParameter;
    import org.springframework.jdbc.object.StoredProcedure;
    import javax.sql.DataSource;
    import java.util.HashMap;
    import java.util.Map;
    public class TitlesAndGenresStoredProcedure extends StoredProcedure {
    private static final String SPROC_NAME = "AllTitlesAndGenres";
    public TitlesAndGenresStoredProcedure(DataSource dataSource) {
    super(dataSource, SPROC_NAME);
    declareParameter(new SqlOutParameter("titles", OracleTypes.CURSOR, new TitleMapper()));
    declareParameter(new SqlOutParameter("genres", OracleTypes.CURSOR, new GenreMapper()));
    compile();
    }
    public Map execute() {
    // again, this sproc has no input parameters, so an empty Map is supplied...
    return super.execute(new HashMap());
    }
    }

    值得注意的是TitlesAndGenresStoredProcedure構(gòu)造函數(shù)中 declareParameter(..)SqlOutParameter參數(shù), 該參數(shù)使用了RowMapper接口的實(shí)現(xiàn)。 這是一種非常方便而強(qiáng)大的重用方式。 下面我們來看一下RowMapper的兩個(gè)具體實(shí)現(xiàn)。

    首先是TitleMapper類,它簡單的把ResultSet中的每一行映射為一個(gè)Title Domain Object。

    import com.foo.sprocs.domain.Title;
    import org.springframework.jdbc.core.RowMapper;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    public final class TitleMapper implements RowMapper {
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    Title title = new Title();
    title.setId(rs.getLong("id"));
    title.setName(rs.getString("name"));
    return title;
    }
    }

    另一個(gè)是GenreMapper類,也是非常簡單的將ResultSet中的每一行映射為一個(gè)Genre Domain Object。

    import org.springframework.jdbc.core.RowMapper;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import com.foo.domain.Genre;
    public final class GenreMapper implements RowMapper {
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    return new Genre(rs.getString("name"));
    }
    }

    如果你需要給存儲過程傳輸入?yún)?shù)(這些輸入?yún)?shù)是在RDBMS存儲過程中定義好了的), 則需要提供一個(gè)指定類型的execute(..)方法, 該方法將調(diào)用基類的protected execute(Map parameters)方法。 例如:

    import oracle.jdbc.driver.OracleTypes;
    import org.springframework.jdbc.core.SqlOutParameter;
    import org.springframework.jdbc.object.StoredProcedure;
    import javax.sql.DataSource;
    import java.util.HashMap;
    import java.util.Map;
    public class TitlesAfterDateStoredProcedure extends StoredProcedure {
    private static final String SPROC_NAME = "TitlesAfterDate";
    private static final String CUTOFF_DATE_PARAM = "cutoffDate";
    public TitlesAfterDateStoredProcedure(DataSource dataSource) {
    super(dataSource, SPROC_NAME);
    declaraParameter(new SqlParameter(CUTOFF_DATE_PARAM, Types.DATE);
    declareParameter(new SqlOutParameter("titles", OracleTypes.CURSOR, new TitleMapper()));
    compile();
    }
    public Map execute(Date cutoffDate) {
    Map inputs = new HashMap();
    inputs.put(CUTOFF_DATE_PARAM, cutoffDate);
    return super.execute(inputs);
    }
    }

    11.4.5. SqlFunction

    SqlFunction RDBMS操作類封裝了一個(gè)SQL“函數(shù)”包裝器(wrapper), 該包裝器適用于查詢并返回一個(gè)單行結(jié)果集。默認(rèn)返回的是一個(gè)int值, 不過我們可以采用類似JdbcTemplate中的queryForXxx 做法自己實(shí)現(xiàn)來返回其它類型。SqlFunction優(yōu)勢在于我們不必創(chuàng)建 JdbcTemplate,這些它都在內(nèi)部替我們做了。

    該類的主要用途是調(diào)用SQL函數(shù)來返回一個(gè)單值的結(jié)果集,比如類似“select user()”、 “select sysdate from dual”的查詢。如果需要調(diào)用更復(fù)雜的存儲函數(shù), 可以使用StoredProcedureSqlCall

    SqlFunction是一個(gè)具體類,通常我們不需要它的子類。 其用法是創(chuàng)建該類的實(shí)例,然后聲明SQL語句以及參數(shù)就可以調(diào)用相關(guān)的run方法去多次執(zhí)行函數(shù)。 下面的例子用來返回指定表的記錄行數(shù):

    public int countRows() {
    SqlFunction sf = new SqlFunction(dataSource, "select count(*) from mytable");
    sf.compile();
    return sf.run();
    }
    posted @ 2009-03-15 11:27 java_蟈蟈 閱讀(58120) | 評論 (2)編輯 收藏

     因前段時(shí)間碰到j(luò)ava.lang.OutOfMemoryError: PermGen space問題,想到檢控TOMCAT及調(diào)優(yōu)問題,從網(wǎng)上搜到這個(gè)工具,一開始配置了N久后也未配起來,后來偶然間配置好了,隨把過程寫到此,以便共享

    測試:tomcat5+jprofiler_windows_5_1_4 它的注冊碼可到官網(wǎng)上注冊一個(gè),免費(fèi)試用,當(dāng)然是有期限的

    有的時(shí)候Tomcat跑Web應(yīng)用會慢慢死掉,CPU 100%占用。一般情況下是程序哪里出了問題,慢慢的DEBUG,幾乎翻遍所有的代碼,是不是很累?這里介紹一下JProfiler,比較優(yōu)秀的性能監(jiān)控和分析工具。
    JProfiler我用的是4.3.3版本,他是收費(fèi)的,不過google上面很多注冊碼可供使用。
    安裝的時(shí)候會提示一些比如尋找JVM等過程,這里就不多說了。安裝完JProfiler,運(yùn)行,出現(xiàn)如下界面:

    由于我們是要創(chuàng)建對本地tomcat的監(jiān)控,選擇an application server,locally or remotely.
    在接下來的窗口中,選擇tomcat及版本,

    下一步,選擇本地:

    下一步,選擇啟動批處理文件


    注意,這里的選擇如果你是TOMCAT5的話,如果選擇startup.bat跑不起來,你不防把它配置成tomcat.exe我就是在這里卡住了

    下一步,選擇JVM類型:

    接著選擇JProfiler的監(jiān)聽端口:

    接著,選擇直接啟動:

    下面會有一個(gè)很重要的提示,可能很多人在這里都沒有注意而總是配置不好JProfiler:

    上面標(biāo)紅的配置好后,這下面的根本不用配置就可以跑起來了

    第一,需要把
    -agentlib:jprofilerti=port=8849,nowait,id=103,config=C:\Documents and Settings\stefanie_wu\.jprofiler4\config.xml"
    "-Xbootclasspath/a:D:\Program Files\jprofiler4\bin\agent.jar" -Xbootclasspath/a:D:\usr\agent.jar
    兩個(gè)參數(shù)加載啟動項(xiàng)中,
    第二,要把D:\Program Files\jprofiler4\bin\windows放在PATH中。

    我是使用.bat來啟動tomcat的,所以在startup.bat中加入一段代碼:
    set JAVA_OPTS=%JAVA_OPTS% -agentlib:jprofilerti=port=8849,nowait,id=103,config=C:\Documents and Settings\stefanie_wu\.jprofiler4\config.xml -Xbootclasspath/a:D:\Program Files\jprofiler4\bin\agent.jar" -Xbootclasspath/a:D:\usr\agent.jar
    但是這樣啟動會有問題,因?yàn)槠渲新窂桨丝崭瘢?br /> 所以拷貝comfig.xml和agent.jar到一個(gè)新的路徑下面,比如:
    set JAVA_OPTS=%JAVA_OPTS% -agentlib:jprofilerti=port=8849,nowait,id=102,config=D:\usr\config.xml -Xbootclasspath/a:D:\usr\agent.jar

    這里的jprofilerti=port=8849就是剛才設(shè)置的jprofiler監(jiān)控端口。
    設(shè)置完這些,通過startup.bat啟動tomcat,然后

    點(diǎn)OK

    posted @ 2009-01-14 01:39 java_蟈蟈 閱讀(4708) | 評論 (0)編輯 收藏

    今日整到此處,特將網(wǎng)上搜刮來的信息貼于此,以供大家共享之

    window.onbeforeunload = function()   
    {   var n = window.event.screenX - window.screenLeft;      
        var b = n > document.documentElement.scrollWidth-20;      
     if(b && window.event.clientY < 0 || window.event.altKey)   
     {   
     //window.event.returnValue = "1111";      
     userBaseDAO.upIsLogin(${adminbean.id});
     }    
    }    

    三大主流瀏覽器中firefox和IE都支持onbeforeunload事件,opera尚未支持。

    用法:

    • object.onbeforeunload = handler
    • <element onbeforeunload = “handler” … ></element>

    描述:
    事件觸發(fā)的時(shí)候彈出一個(gè)有確定和取消的對話框,確定則離開頁面,取消則繼續(xù)待在本頁。
    handler可以設(shè)一個(gè)返回值作為該對話框的顯示文本。

    觸發(fā)于:

    • 關(guān)閉瀏覽器窗口
    • 通過地址欄或收藏夾前往其他頁面的時(shí)候
    • 點(diǎn)擊返回,前進(jìn),刷新,主頁其中一個(gè)的時(shí)候
    • 點(diǎn)擊 一個(gè)前往其他頁面的url連接的時(shí)候
    • 調(diào)用以下任意一個(gè)事件的時(shí)候:click,document write,document open,document close,window close ,window navigate ,window NavigateAndFind,location replace,location reload,form submit.
    • 當(dāng)用window open打開一個(gè)頁面,并把本頁的window的名字傳給要打開的頁面的時(shí)候。
    • 重新賦予location.href的值的時(shí)候。
    • 通過input type=”submit”按鈕提交一個(gè)具有指定action的表單的時(shí)候。

    可以用在以下元素:
    BODY, FRAMESET, window

    平臺支持:
    IE4+/Win, Mozilla 1.7a+, Netscape 7.2+, Firefox0.9+


     

    標(biāo)簽只有onload\onunload\onbeforeunload事件,而沒有onclose事件。不管頁面是關(guān)閉還是刷新都會執(zhí)行onunload事件。如何捕捉到頁面關(guān)閉呢?
    頁面加載時(shí)只執(zhí)行onload
    頁面關(guān)閉時(shí)只執(zhí)行onunload
    頁面刷新時(shí)先執(zhí)行onbeforeunload,然后onunload,最后onload。這樣我們可以在onbeforeunload中加一個(gè)標(biāo)記,在onunload中判斷該標(biāo)記,即可達(dá)到判斷頁面是否真的關(guān)閉了。
    posted @ 2008-12-08 20:00 java_蟈蟈 閱讀(7868) | 評論 (2)編輯 收藏

         摘要: DAO模式是標(biāo)準(zhǔn)的J2EE設(shè)計(jì)模式之一.開發(fā)人員使用這個(gè)模式把底層的數(shù)據(jù)訪問操作和上層的商務(wù)邏輯分開.一個(gè)典型的DAO實(shí)現(xiàn)有下列幾個(gè)組件:
    1. 一個(gè)DAO工廠類;
    2. 一個(gè)DAO接口;
    3. 一個(gè)實(shí)現(xiàn)DAO接口的具體類;
    4. 數(shù)據(jù)傳遞對象(有些時(shí)候叫做值對象).

      閱讀全文
    posted @ 2008-10-09 15:11 java_蟈蟈 閱讀(1118) | 評論 (1)編輯 收藏

    安裝TOMCAT報(bào)如下錯(cuò)誤:
  • Failed to install Tomcat6 service.     
  • Check your settings and permissions Ignore and     
  • continue anyway(not recommended)!    
  • 原因:
    問題是因?yàn)橹把b過tomcat安裝程序的問題,卸載之后在服務(wù)中還保留有Apache Tomcat服務(wù)項(xiàng)的原因。
    只要刪除這個(gè)服務(wù)項(xiàng)就可以了!

    解決辦法:
    運(yùn)行cmd,用sc delete Tomcat5命令刪除就可以了  

    posted @ 2008-10-05 17:34 java_蟈蟈 閱讀(377) | 評論 (0)編輯 收藏

    最近一段時(shí)間一直在看設(shè)計(jì)模式,看面向?qū)ο?在JDON上面轉(zhuǎn),看別人的學(xué)習(xí)心得,看別人的學(xué)習(xí)經(jīng)驗(yàn),借以提高自己的內(nèi)功.""呵呵""."呵呵"二字已出,都不知道該往下說什么好了.

    在現(xiàn)在的公司做著應(yīng)該干的\干的不順心的\千篇一律的\對自己的技術(shù)<內(nèi)功\外功>沒提高機(jī)會的工作,怎是一個(gè)郁悶了得.想想剛進(jìn)公司時(shí)的雀躍心情\雄心壯志,現(xiàn)在都不知道它們跑那里去了;處在一個(gè)松散的環(huán)境中,做著自己都感覺無聊的工作,想著自己所想的,學(xué)著自己該學(xué)的,談著無聊的話題,走在一條寂寞的小路上,無聊啊,郁悶啊,呵呵,看來我真的該走了,該走出去看看了......

    posted @ 2008-09-20 07:55 java_蟈蟈 閱讀(183) | 評論 (1)編輯 收藏


    解決方法如下:
    1.打開CMD. cmd
    2.查找端口號的PID netstat -a -o
    3.強(qiáng)行關(guān)閉 ntsd -c q -p PID(查詢出來的PID號碼)

    posted @ 2008-07-27 12:06 java_蟈蟈 閱讀(1655) | 評論 (3)編輯 收藏

         摘要: 如果你還不是一名程序員,你是否在為是否從事程序員工作而掙扎呢?
    如果你已經(jīng)是一名程序員,你是否在為程序員的前途而感到迷茫呢?
    如果是,我可以告訴你,做程序員是有前途的!   閱讀全文
    posted @ 2008-06-17 08:26 java_蟈蟈 閱讀(1388) | 評論 (2)編輯 收藏

    今天在測試將EXCEL里的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫時(shí),語句能在查詢分析器里執(zhí)行,但不能在程序里執(zhí)行,報(bào)MSDTC不可用錯(cuò)誤,查了一下,將解決辦法貼出來,供大家共享
      解決辦法:
      在windows控制面版-->管理工具-->服務(wù)-->Distributed   Transaction   Coordinator-->屬性-->啟動
    posted @ 2008-06-13 17:29 java_蟈蟈 閱讀(597) | 評論 (0)編輯 收藏

         摘要: Spring聲明式事務(wù)讓我們從復(fù)雜的事務(wù)處理中得到解脫。使得我們再也無需要去處理獲得連接、關(guān)閉連接、事務(wù)提交和回滾等這些操作。再也無需要我們在與事務(wù)相關(guān)的方法中處理大量的try…catch…finally代碼。
    我們在使用Spring聲明式事務(wù)時(shí),有一個(gè)非常重要的概念就是事務(wù)屬性。事務(wù)屬性通常由事務(wù)的傳播行為,事務(wù)的隔離級別,事務(wù)的超時(shí)值和事務(wù)只讀標(biāo)志組成。我們在進(jìn)行事務(wù)劃分時(shí),需要進(jìn)行事務(wù)定義,也就是配置事務(wù)的屬性。
    Spring在TransactionDefinition接口中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事務(wù)管理的核心接口。  閱讀全文
    posted @ 2008-05-05 21:52 java_蟈蟈 閱讀(280) | 評論 (0)編輯 收藏

         摘要: 使用spring的事務(wù)管理需要作這些事
    1,設(shè)置好事務(wù)源,比如DataSource,hibernate的session。如果有多個(gè)事務(wù)源要考慮他們之間是否有全局事務(wù),如果有,老老實(shí)實(shí)用jta,否則就需要自己寫一個(gè)manager了
    2,設(shè)置manager,根據(jù)你的事務(wù)源選擇對應(yīng)的PlatformTransactionManager
    3,選擇實(shí)現(xiàn)事物的方式,用template還是interceptor。用template代碼直觀點(diǎn),但是template所管轄的manager和你應(yīng)用代碼所用的事務(wù)源要一致。如果用interceptor千萬注意,一定要調(diào)用interceptor那個(gè)bean,而不是原始的那個(gè)target。在壇子上我已經(jīng)看到至少有兩個(gè)朋友說spring事物不起作用,從配置和代碼上看都正確,這時(shí)要好好查查,調(diào)用的bean是哪一個(gè)。
    4,這個(gè)是設(shè)計(jì)問題了,推薦事務(wù)處于一個(gè)較高層次,比如service上的某個(gè)函數(shù),而底層的dao可以不考慮事務(wù),否則可能會出現(xiàn)事務(wù)嵌套,增加程序復(fù)雜度。   閱讀全文
    posted @ 2008-05-05 21:37 java_蟈蟈 閱讀(229) | 評論 (0)編輯 收藏

    錯(cuò)誤描述:....while loading persisted sessions: java.io.EOFException...
    分析:EOFException表示輸入過程中意外地到達(dá)文件尾或流尾的信號,導(dǎo)致從session中獲取數(shù)據(jù)失敗。異常是tomcat本身的問題,由于tomcat上次非正常關(guān)閉時(shí)有一些活動session被持久化(表現(xiàn)為一些臨時(shí)文件),在重啟時(shí),tomcat嘗試去恢復(fù)這些session的持久化數(shù)據(jù)但又讀取失敗造成的。此異常不影響系統(tǒng)的使用。

    徹底解決辦法一下:將work下面的文件清空,主要是*.ser文件,或者只是刪除掉session.ser即可以解決。


     

    引自網(wǎng)絡(luò)

    posted @ 2008-04-24 07:39 java_蟈蟈 閱讀(2451) | 評論 (9)編輯 收藏

         摘要:   基于RBAC模型的權(quán)限管理系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 作者:裴輝東 梁云風(fēng)  來源:網(wǎng)絡(luò) 摘要:提出了基于RBAC模型的權(quán)限管理系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)方案。介紹了采用的J2EE架構(gòu)的多層體系結(jié)構(gòu)設(shè)計(jì),闡述了基于角色的訪問控制RBAC模型的設(shè)計(jì)思想,并討論了權(quán)限管理系統(tǒng)的核心面向?qū)ο笤O(shè)計(jì)模型,以及權(quán)限訪問、權(quán)限控制和權(quán)限存儲機(jī)制等關(guān)鍵技術(shù)。  關(guān)鍵詞:權(quán)限管理系統(tǒng);角色;訪問控制;R...  閱讀全文
    posted @ 2008-03-30 23:40 java_蟈蟈 閱讀(1222) | 評論 (0)編輯 收藏

         摘要: 1、在其他任何事物發(fā)生之前,將分配給對象的存儲空間初始化成二進(jìn)制零。

    2、調(diào)用基類構(gòu)造器。這個(gè)步驟會不斷的反復(fù)遞歸下去,首先是構(gòu)造這種層次結(jié)構(gòu)的根,然后是下一層導(dǎo)出類,等等。直到最低層的導(dǎo)出類。此時(shí),調(diào)用被重載的draw()方法(是的,是在調(diào)用RoundGlyph構(gòu)造器之前調(diào)用的),由于步驟(1)的緣故,我們此時(shí)會發(fā)現(xiàn)radius的值為0。

      閱讀全文
    posted @ 2007-11-13 17:09 java_蟈蟈 閱讀(296) | 評論 (0)編輯 收藏

         摘要: AOP = Proxy Pattern + Method Reflection + Aspect DSL + 自動代碼生成

    Declarative Programming & DSL

    Aspect Oriented Programming(面向方面編程,簡稱AOP)是一種Declarative Programming(聲明式編程)。
    Declarative Programming(聲明式編程)是和Imperative Programming(命令式編程)相對的概念。
    我們平時(shí)使用的編程語言,比如C++、Java、Ruby、Python等,都屬于Imperative Programming(命令式編程)。Imperative Programming(命令式編程)的意思是,程序員需要一步步寫清楚程序需要如何做什么(How to do What)。
      閱讀全文
    posted @ 2007-11-13 14:09 java_蟈蟈 閱讀(364) | 評論 (0)編輯 收藏

         摘要: AOP、OOP在字面上雖然非常類似,但卻是面向不同領(lǐng)域的兩種
    設(shè)計(jì)思想。OOP(面向?qū)ο缶幊蹋┽槍I(yè)務(wù)處理過程的實(shí)體及其屬性和行為進(jìn)行抽象封裝,
    以獲得更加清晰高效的邏輯單元劃分。
    而AOP則是針對業(yè)務(wù)處理過程中的切面進(jìn)行提取,它所面對的是處理過程中的某個(gè)步
    驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。這兩種設(shè)計(jì)思想在目標(biāo)上有
    著本質(zhì)的差異。
      閱讀全文
    posted @ 2007-11-13 13:47 java_蟈蟈 閱讀(566) | 評論 (0)編輯 收藏

    請求加精Eclpise 的錯(cuò)誤myeclipse memory monitor pressing dirty regions 解決方法!

    我的eclipse加載的時(shí)候出現(xiàn)
    an internal error occurred during "myeclipse memory monitor"

    打開xml文檔的時(shí)候出現(xiàn)
    an internal error occurred during "pressing dirty regions"


    你們是不是也出現(xiàn)了這個(gè)錯(cuò)誤那
    很好解決

    只要把JDK 換成1.5.0_05 以上這個(gè)問題就解決了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    因?yàn)閖dk1.5.0不支持新的jar包

    Eclipse3.2 + Myeclipse5.0GA + Tomcat5.5.17 + j2sdk1.5 搭建J2EE開發(fā)環(huán)境
    一、安裝j2sdk1.5.0_07(默認(rèn)),設(shè)定環(huán)境變量。
    所以設(shè)定環(huán)境變量為:
    1. (新建)JAVA_HOME: C:\\Program Files\\Java\\jdk1.5.0_07
    2.(新建) CLASSPATH: .;C:\\Program Files\\Java\\jdk1.5.0_07\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.5.0_07\\lib\\tools.jar (注意:點(diǎn)號不能省略,表示當(dāng)前目錄)
    3. 編輯PATH的變量值,在后面加上 ;%JAVA_HOME%\\bin (注意:要有分號隔開)

    posted @ 2007-11-12 08:34 java_蟈蟈 閱讀(1365) | 評論 (0)編輯 收藏

         摘要: 經(jīng)常會問到的面試題:String s = new String("abc");創(chuàng)建了幾個(gè)String Object?【如這里創(chuàng)建了多少對象? 和一道小小的面試題 】

    這個(gè)問題比較簡單,涉及的知識點(diǎn)包括:

    引用變量與對象的區(qū)別;
    字符串文字"abc"是一個(gè)String對象;
    文字池[pool of literal strings]和堆[heap]中的字符串對象。
      閱讀全文
    posted @ 2007-11-07 10:25 java_蟈蟈 閱讀(866) | 評論 (0)編輯 收藏

         摘要: 內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。內(nèi)部類作為外部類的一個(gè)成員,并且依附于外部類而存在的。內(nèi)部類可為靜態(tài),可用protected和private修飾(而外部類只能使用public和缺省的包訪問權(quán)限)。內(nèi)部類主要有以下幾類:成員內(nèi)部類、局部內(nèi)部類、靜態(tài)內(nèi)部類、匿名內(nèi)部類
      閱讀全文
    posted @ 2007-09-15 17:34 java_蟈蟈 閱讀(237) | 評論 (0)編輯 收藏

         摘要: JdbcTemplate將我們使用的JDBC的流程封裝起來,包括了異常的捕捉、SQL的執(zhí)行、查詢結(jié)果的轉(zhuǎn)換等等。spring大量使用Template Method模式來封裝固定流程的動作,XXXTemplate等類別都是基于這種方式的實(shí)現(xiàn)。
    除了大量使用Template Method來封裝一些底層的操作細(xì)節(jié),spring也大量使用callback方式類回調(diào)相關(guān)類別的方法以提供JDBC相關(guān)類別的功能,使傳統(tǒng)的JDBC的使用者也能清楚了解spring所提供的相關(guān)封裝類別方法的使用。  閱讀全文
    posted @ 2007-06-26 14:34 java_蟈蟈 閱讀(317) | 評論 (0)編輯 收藏

         摘要: 具體實(shí)現(xiàn):

    利用Filter的過濾功能把*.jsp過濾出來,判斷是否存在對應(yīng)的.html文件,如果不存在對應(yīng)的.html文件,則將其內(nèi)容讀出寫入指定的.html文件,再跳轉(zhuǎn)到對應(yīng)的.html即可。如果存在對應(yīng)的.html文件,則直接跳轉(zhuǎn)到對應(yīng)的.html即可。
      閱讀全文
    posted @ 2007-05-30 16:26 java_蟈蟈 閱讀(5928) | 評論 (23)編輯 收藏

    前一段時(shí)間朋友用hibernate+mysql整了一個(gè)應(yīng)用,出現(xiàn)tomcat放一夜,mysql連接出現(xiàn)錯(cuò)誤的情況,具體的錯(cuò)誤信息忘記了。

    在網(wǎng)上查找一下,找到了這個(gè)帖子,還有就是這個(gè)了;原來Mysql在經(jīng)過8小時(shí)不使用后會自動關(guān)閉已打開的連接,摘錄原文如下:

    5.4.

    I have a servlet/application that works fine for a day, and then stops working overnight

    MySQL closes connections after 8 hours of inactivity. You either need to use a connection pool that handles stale connections or use the "autoReconnect" parameter (see "Developing Applications with MySQL Connector/J").

    Also, you should be catching SQLExceptions in your application and dealing with them, rather than propagating them all the way until your application exits, this is just good programming practice. MySQL Connector/J will set the SQLState (see java.sql.SQLException.getSQLState() in your APIDOCS) to "08S01" when it encounters network-connectivity issues during the processing of a query. Your application code should then attempt to re-connect to MySQL at this point.

    現(xiàn)把具體方法貼出來,以供大家共享.
    方法一:
                   設(shè)置你的MYSQL數(shù)據(jù)庫:wait_timeout=24*60*60<秒>,把它的值設(shè)置大一點(diǎn),呵呵
     方法二:
                   配置Hibernate C3p0連接池,配置如下:
    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
       <property name="c3p0.max_size">20</property>
       <property name="c3p0.min_size">5</property>
       <property name="c3p0.timeout">20</property>
       <property name="c3p0.max_statements">100</property>
       <property name="c3p0.idle_test_period">120</property>
       <property name="c3p0.acquire_increment">2</property>

    注意這里標(biāo)紅的部分,要設(shè)置c3p0.timeout的值小于MySql的wait_timeout的值,這樣才行,要不還會出現(xiàn)異常.

    這次是一個(gè)教訓(xùn),所以不論從穩(wěn)定還是性能的考慮,都應(yīng)該選擇相對更加成熟的連接池。

    posted @ 2007-05-23 10:52 java_蟈蟈 閱讀(953) | 評論 (0)編輯 收藏

         摘要: Lucene是apache組織的一個(gè)用java實(shí)現(xiàn)全文搜索引擎的開源項(xiàng)目。其功能非常的強(qiáng)大,api也很簡單??偟脕碚f用Lucene來進(jìn)行建立和搜索與操作數(shù)據(jù)庫是差不多的,Document可以看作是數(shù)據(jù)庫的一行記錄,F(xiàn)ield可以看作是數(shù)據(jù)庫的字段。用lucene實(shí)現(xiàn)搜索引擎就像用JDBC實(shí)現(xiàn)連接數(shù)據(jù)庫一樣簡單。   閱讀全文
    posted @ 2007-05-21 08:17 java_蟈蟈 閱讀(611) | 評論 (0)編輯 收藏

         摘要: struts-menu 權(quán)限控制

    在上一編的基礎(chǔ)上做如下工作即可:

    一、新建一個(gè)類,用于獲取允許顯示的菜單列表
    ......  閱讀全文
    posted @ 2007-05-18 08:45 java_蟈蟈 閱讀(491) | 評論 (0)編輯 收藏

         摘要: 采用Struts+Hibernate

    一、新建菜單表:表根據(jù)配置文件自己建吧,我這里就不寫了

    二、建立表對應(yīng)的Hibernate的配置文件及JAVABEAN




    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">





    閱讀全文
    posted @ 2007-05-17 18:54 java_蟈蟈 閱讀(2419) | 評論 (1)編輯 收藏

         摘要: 人民幣轉(zhuǎn)換...  閱讀全文
    posted @ 2007-04-22 10:46 java_蟈蟈 閱讀(411) | 評論 (0)編輯 收藏

         摘要:  1. Programming Guide 1.1. Prototype是什么? 1.2. 關(guān)聯(lián)文章 1.3. 通用性方法 1.3.1. 使用 $()方法 1.3.2. 使用$F()方法 1.3.3. 使用$A()方法 1.3.4. 使用$H()方法 1.3.5. 使用$R()方法 1.3.6. 使用Try.these()方法 1.4. Ajax 對...  閱讀全文
    posted @ 2007-04-17 17:17 java_蟈蟈 閱讀(246) | 評論 (0)編輯 收藏

    在寫JSP程序的時(shí)候,如果程序中調(diào)用了response.getOutputStream()去向客戶端輸出文件等數(shù)據(jù)流,容器就會拋出這樣的異常:
    Java.lang.IllegalStateException: getOutputStream() has already been called for this response
            at org.apache.catalina.connector.Response.getWriter(Response.java:596)
            at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:186)
      產(chǎn)生這樣的異常原因:是web容器生成的servlet代碼中有out.write(""),這個(gè)和JSP中調(diào)用的response.getOutputStream()產(chǎn)生沖突.即Servlet規(guī)范說明,不能既調(diào)用response.getOutputStream(),又調(diào)用response.getWriter(),無論先調(diào)用哪一個(gè),在調(diào)用第二個(gè)時(shí)候應(yīng)會拋出IllegalStateException,因?yàn)樵趈sp中,out變量實(shí)際上是通過response.getWriter得到的,你的程序中既用了response.getOutputStream,又用了out變量,故出現(xiàn)以上錯(cuò)誤。
      解決方案:在程序的最后添加:
    out.clear();
    out = pageContext.pushBody();
    就可以了。

    http://blog.erp100.com/html/39/3639-1547.html
    posted @ 2007-04-13 11:54 java_蟈蟈 閱讀(320) | 評論 (0)編輯 收藏

         摘要: 詳細(xì)信息...  閱讀全文
    posted @ 2007-04-05 19:02 java_蟈蟈 閱讀(303) | 評論 (0)編輯 收藏

         摘要: A、 簡單工廠模式Simple Factory



    簡單工廠模式就是由一個(gè)工廠類根據(jù)傳入的參量決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。

    實(shí)例:

    商店-----------à銷貨員[工廠] -------賣----à水果[抽象產(chǎn)品]<蘋果[產(chǎn)品一]、梨[產(chǎn)品二]、草莓[產(chǎn)品三]>

    用戶告訴銷貨員水果的名稱,銷貨員通過水果名稱找到相應(yīng)的水果;
      閱讀全文
    posted @ 2007-04-05 00:32 java_蟈蟈 閱讀(244) | 評論 (0)編輯 收藏

         摘要: 數(shù)據(jù)庫被置疑的解決辦法 一:

    在MS SQLSERVER中一直有這樣的問題,SQLSERVER的狀態(tài)"置疑",我們先來分析一下SQLSERVER數(shù)據(jù)庫"置疑"的原因:
    1.錯(cuò)誤的刪除日志;
    2.硬件(HD)損壞,造成日志和數(shù)據(jù)文件寫錯(cuò)誤;
    3.硬盤的空間不夠,比如日志文件過大;  閱讀全文
    posted @ 2007-03-31 16:04 java_蟈蟈 閱讀(7765) | 評論 (0)編輯 收藏

         摘要: 請大家談?wù)?,拿到這樣一個(gè)系統(tǒng),是怎么進(jìn)行分析和設(shè)計(jì)的?怎么處理類與類之間的層次,和通信。

    比如把新聞發(fā)布系統(tǒng)分為話題:注冊登陸、新聞發(fā)布、權(quán)限管理。

    在“注冊登陸”系統(tǒng)中怎么分析?其中有表單類,那么新填寫的注冊、已經(jīng)填寫的注冊、已經(jīng)履行的注冊,這些是當(dāng)成表單類的子類還是表單類的對象,該怎么處理和設(shè)計(jì)?   閱讀全文
    posted @ 2007-03-24 11:44 java_蟈蟈 閱讀(1238) | 評論 (0)編輯 收藏

         摘要: J2EE網(wǎng)站經(jīng)驗(yàn)共享!
    網(wǎng)站包括 商家博客,個(gè)人博客,論壇,新聞等

    設(shè)計(jì)采用了MVC模式,具體調(diào)用的時(shí)候采用了命令模式
    數(shù)據(jù)操作層Model中,例如;BlockDAO,TopicDAO,ResponseDAO,UserDAO等。
    里面封裝了一個(gè)對象所有的數(shù)據(jù)操作

    視圖/傳輸層 View 例如BlockDTO,TopicDTO等,主要是對象的屬性
    jsp用它來顯示,dao用它作為DTO最后就是控制層 Controll 控制層的類都繼承了Service接口
    里面有一個(gè)方法

    下面說說安全架構(gòu):
    網(wǎng)站采用J2EE的身份認(rèn)證系統(tǒng),通過對不同路徑的權(quán)限限制來做到不用角色具有不同操作捐獻(xiàn)
    例如:bbs/user/* 下主要是普通用戶的操作權(quán)限
    想新建帖子的時(shí)候,請求地址是 bbs/user/insertTopic.jsp

    bbs/blockAdmin/*主要是板塊管理員的權(quán)限
    bbs/bbsAdmin/* 下是論壇管理員的權(quán)限
    bbs/sysAdm  閱讀全文
    posted @ 2007-03-24 11:16 java_蟈蟈 閱讀(422) | 評論 (0)編輯 收藏

         摘要: 開始想在服務(wù)器上整一下呢,仔細(xì)一看不行,附Tomcat過濾IP方法:
    限制ip,限制主機(jī)訪問:
    如果想禁止指定的ip或者主機(jī)名來拒絕某些機(jī)器訪問,或者指定某些機(jī)器來訪問。
    也支持分別按Engine, Host, or Context,進(jìn)行以下配置:
    ...
    allow="*.mycompany.com,www.yourcompany.com"/>
    deny="192.168.1.*"/>

    參考:
    http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/context.html
    沒轍,繼續(xù)... <  閱讀全文
    posted @ 2007-03-23 14:48 java_蟈蟈 閱讀(1479) | 評論 (4)編輯 收藏

         摘要: session詳解:
    1、一個(gè)瀏覽器窗口打開到關(guān)閉這個(gè)期間
    2、一系列動作、一次連接
    3、當(dāng)session一詞與網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)時(shí);“面向連接”和/或“保持狀態(tài)”
    4、到了web服務(wù)器蓬勃發(fā)展的時(shí)代;指一類用來在客戶端與服務(wù)器之間保持狀態(tài)的解決方案
    5、有時(shí)候session也用來指這種解決方案的存儲結(jié)構(gòu),如“把xxx保存在session 里
    6、在某種特定語言的語境下,session也被用來指代該語言的解決方案

    看完整篇文章后,不僅讓我想起了"單點(diǎn)登錄"問題;http://www.tkk7.com/wyz191/archive/2007/02/01/97291.html  閱讀全文
    posted @ 2007-03-21 08:36 java_蟈蟈 閱讀(232) | 評論 (0)編輯 收藏

         摘要: 最近在一本雜志上看到,使用Ruby on Rails開發(fā)Web應(yīng)用十分高效,不知是否有人知道RoR最擅長哪方面的應(yīng)用開發(fā)?與J2EE的比較?能否替代J2EE? 請高人指點(diǎn)!我始終認(rèn)為我們目前所用的開發(fā)模式(使用J2EE架構(gòu)+MVC模式,但未用EJB)效率不太高,想換一種架構(gòu)。我想多數(shù)人或許都有這種困惑,粘過來供大家討論  閱讀全文
    posted @ 2007-03-17 14:40 java_蟈蟈 閱讀(288) | 評論 (1)編輯 收藏

         摘要: Portlets
    “Portlets是一種Web組件-就像servlets-是專為將合成頁面里的內(nèi)容聚集在一起而設(shè)計(jì)的。通常請求一個(gè)portal頁面會引發(fā)多個(gè)portlets被調(diào)用。每個(gè)portlet都會生成標(biāo)記段,并與別的portlets生成的標(biāo)記段組合在一起嵌入到portal頁面的標(biāo)記內(nèi)。”(摘自Portlet規(guī)范,JSR 168)

    本文探討了以下內(nèi)容:
    1. Portal頁面的元素
    2. Portal是什么?
    3. Portlets是什么?
    4. 開發(fā)“Hello World” Portlet
    5. 在Pluto上部署HelloWorld Portlet
    6. 如何創(chuàng)建Portal頁面
    7. 結(jié)束語
    8. 資源  閱讀全文
    posted @ 2007-03-09 08:37 java_蟈蟈 閱讀(290) | 評論 (0)編輯 收藏

         摘要: Spring提供一個(gè)多動作控制器,使用它你可以將幾個(gè)動作合并在一個(gè)控制器里,這樣可以把功能組合在一起。多動作控制器存在在一個(gè)單獨(dú)的包中——org.springframework.web.mvc.multiaction——它能夠?qū)⒄埱笥成涞椒椒?,然后調(diào)用正確的方法。比如當(dāng)你在一個(gè)控制器中有很多公共的功能,但是想多個(gè)入口到控制器使用不同的行為,使用多動作控制器就特別方便。   閱讀全文
    posted @ 2007-03-02 11:23 java_蟈蟈 閱讀(8908) | 評論 (0)編輯 收藏

         摘要: flash對聯(lián)廣告......  閱讀全文
    posted @ 2007-02-14 16:35 java_蟈蟈 閱讀(206) | 評論 (0)編輯 收藏

         摘要: JSP避免Form重復(fù)提交的三種方案  閱讀全文
    posted @ 2007-02-12 08:57 java_蟈蟈 閱讀(213) | 評論 (1)編輯 收藏

         摘要: jfreechart例子:
    一、餅圖

    二、柱圖

    三、折線圖  閱讀全文
    posted @ 2007-02-07 10:44 java_蟈蟈 閱讀(4914) | 評論 (2)編輯 收藏

         摘要: 1. Label

    2. FieldSet & Legend


    3. Optgroup
      閱讀全文
    posted @ 2007-02-05 14:31 java_蟈蟈 閱讀(221) | 評論 (0)編輯 收藏

         摘要: 跨domain的SSO的主要難點(diǎn)在于瀏覽器如何設(shè)置不同domain的cookie。所有的cookie都有一個(gè)范圍,叫domain,如“.sun.com”。這個(gè)范圍規(guī)定了只有在訪問相同domain的時(shí)候,瀏覽器才會將此cookie帶上。因此,如果SSO服務(wù)的domain和Web應(yīng)用的domain不相同的情況下,就算當(dāng)前瀏覽器已經(jīng)登錄過SSO的服務(wù),Web應(yīng)用的Agent(Filter)也不能知道。因?yàn)镾SO服務(wù)給此瀏覽器設(shè)置的cookie是Domain A的,在訪問domain B的時(shí)候,這個(gè)cookie是不會帶去的。

      閱讀全文
    posted @ 2007-02-01 15:31 java_蟈蟈 閱讀(245) | 評論 (0)編輯 收藏

         摘要: HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。本文首先介紹 HTTPClient,然后根據(jù)作者實(shí)際工作經(jīng)驗(yàn)給出了一些常見問題的解決方法。  閱讀全文
    posted @ 2007-02-01 15:07 java_蟈蟈 閱讀(201) | 評論 (0)編輯 收藏

         摘要: 單點(diǎn)登錄(SSO)的技術(shù)被越來越廣泛地運(yùn)用到各個(gè)領(lǐng)域的軟件系統(tǒng)當(dāng)中。本文從業(yè)務(wù)的角度分析了單點(diǎn)登錄的需求和應(yīng)用領(lǐng)域;從技術(shù)本身的角度分析了單點(diǎn)登錄技術(shù)的內(nèi)部機(jī)制和實(shí)現(xiàn)手段,并且給出Web-SSO和桌面SSO的實(shí)現(xiàn)、源代碼和詳細(xì)講解;還從安全和性能的角度對現(xiàn)有的實(shí)現(xiàn)技術(shù)進(jìn)行進(jìn)一步分析,指出相應(yīng)的風(fēng)險(xiǎn)和需要改進(jìn)的方面。本文除了從多個(gè)方面和角度給出了對單點(diǎn)登錄(SSO)的全面分析,還并且討論了如何將現(xiàn)有的應(yīng)用和SSO服務(wù)結(jié)合起來,能夠幫助應(yīng)用架構(gòu)師和系統(tǒng)分析人員從本質(zhì)上認(rèn)識單點(diǎn)登錄,從而更好地設(shè)計(jì)出符合需要的安全架構(gòu)。  閱讀全文
    posted @ 2007-02-01 15:06 java_蟈蟈 閱讀(193) | 評論 (0)編輯 收藏

         摘要: 從網(wǎng)上找到了兩種方法都是大同小異,經(jīng)過我整理了一下。先將兩種方法貼出來 尊重原作者,向其致敬
    1.作者:倉木澤
    為了減輕服務(wù)器壓力,將原來的文章管理系統(tǒng)由JSP文件的從數(shù)據(jù)庫中取數(shù)據(jù)顯示改為由jsp生成靜態(tài)html文件后,將相應(yīng)的文件信息存入數(shù)據(jù)庫中,然后直接訪問html文件<這個(gè)問題我想了好久,我怎么就沒有向這方面想呢,要不是別人提醒,恐怕我還要想一陣子,真的是氣人呢,呵呵>。下面是一個(gè)簡單的示例  閱讀全文
    posted @ 2007-01-31 18:31 java_蟈蟈 閱讀(267) | 評論 (0)編輯 收藏

    在網(wǎng)吧客戶端項(xiàng)目中使用了frame的方式,布局如下:

    uploads/200611/15_111251_table.gif

    遇到的問題是當(dāng)main中的內(nèi)容超過main的指定高度時(shí),會同時(shí)出現(xiàn)豎向和橫向滾動條,這是一種極不好的用戶體驗(yàn),理想狀態(tài)應(yīng)該是只出現(xiàn)豎向滾動條,我嘗試了如下解決方法:

    1.直接添加body屬性<body style="overflow-x:hidden;">,結(jié)果是無效;
    (分析原因:overflow-x是IE獨(dú)有的 css 屬性,加上DTD的話可能會被忽略,就像定制滾動條顏色的css屬性一樣)

    2.去掉DOCTYPE聲明<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">以后,橫向滾動條被限制了,目的雖然達(dá)到,但是假設(shè)采用div+css布局的話,去掉文檔聲明會引發(fā)更多的問題,所以還需要嘗試一些其它的方式;

    3.在使用iframe的情況下,可以不刪除DOCTYPE聲明,設(shè)置scrolling="yes",<body style="overflow-x:hidden;">也能生效。

    以上是我做的一些嘗試,知其然而不知其所以然,但是希望能夠在工作中解決一些實(shí)際問題。
    posted @ 2007-01-28 17:50 java_蟈蟈 閱讀(2101) | 評論 (2)編輯 收藏

         摘要: 主要就我所了解的J2EE開發(fā)的框架或開源項(xiàng)目做個(gè)介紹,可以根據(jù)需求選用適當(dāng)?shù)拈_源組件進(jìn)行開發(fā).主要還是以Spring為核心,也總結(jié)了一些以前web開發(fā)常用的開源工具和開源類庫  閱讀全文
    posted @ 2007-01-28 09:49 java_蟈蟈 閱讀(199) | 評論 (0)編輯 收藏

         摘要: 1. org.jboss.Main.main(String[]) 為入口.

    2. main 函數(shù)創(chuàng)建一個(gè)名叫”jboss”的線程組, 然后創(chuàng)建一個(gè)屬于該組的線程, 在線程中執(zhí)行boot方法.

    3. boot 方法首先處理main函數(shù)中的參數(shù)(及一些其它的系統(tǒng)環(huán)境設(shè)置), 接著就用系統(tǒng)的屬性創(chuàng)建了org.jboss.system.server.ServerLoader實(shí)例[new ServerLoader(props)].
      閱讀全文
    posted @ 2007-01-28 09:28 java_蟈蟈 閱讀(725) | 評論 (0)編輯 收藏

         摘要: showModalDialog和showModelessDialog使用心得  閱讀全文
    posted @ 2007-01-20 13:23 java_蟈蟈 閱讀(215) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2007-01-16 16:17 java_蟈蟈 閱讀(2132) | 評論 (0)編輯 收藏




    ????????? ??      ,IVXVYIBttt+::+IVVMMMMMMRR:’
    ?????????    ,YYVYItMYti+i++:X+Rt:tXWRMR,
    ?????????    .YRiIYRMViitVXRWRYMI++++itMM..
    ?????????    .Y+,.,X::,,,YMMMMMMMMRVItXMti
    ?????????     :X+:,X:,. .,iiIRMWMMMBBRMMBY.
    ?????????     tR+:I:i:+Y:IitYVYMMMMMMMMRi.
    ?????????     .+RXt:,::.::XXIBMMMMMMMMM+:
    ?????????      ,RRXitY+,.::RWMMMMMMMMt.
    ?????????       VYI:::,..:tVMMMMMMBY+.
    ?????????       .VBBW:::::,i.MMMMMBi:.
    ?????????       .tWRRVi:::.X:VMMMMMMY.
    ?????????      ,+i+:,XYtt+:,i:,MMMBR:
    ?????????   ...VV..:..:.tt::++:+,RMYMV.
    ?????????  :M:::..:,.:,,,.+t+++Ytt.,+:
    ????????? tRt:,.:,.:,:.:+.,:++tit,
    ????????? tXt:,:,:.:.,,+,:+YRY,
    ?????????  :++:::.,:.:.::+:iMi
    ?????????   ,Ri:::,:::::::+Ii
    ?????????   ,+:Xii:,,::I:tit,.
    ?????????    :BBt,:+::,::i+.
    ?????????    :BWXX::::::iX.
    ?????????    :BWVIi++t+:V+
    ?????????    WBXtItii+iWI.
    ?????????    :MWIYIti+iVRY,
    ?????????     RBXVYItiiIYXWI,
    ?????????     :MRWWVYttttIIIXWt.
    ?????????     .XMBRRXIti+++itIXW,
    ?????????     .BMBBRVIi+:::+ttXX.
    ?????????      ,MMBRXYti:::++tIW:
    ?????????      tMMRWYti+++iittXV
    ?????????       +MRVYti+++iittWI
    ?????????      .VMWVtiiiiiiitIR
    ?????????      .XBBWVtttttttttX
    ?????????     .,WBRBXVtttttttIWi
    ?????????     :RWXWBXYtttttttYR
    ?????????    .iRWVIiBWYIttttttY
    ?????????   .tWVYti:WRVIttittIV    .:,,
    ?????????   tWVIi++:XRVIIttttIX   ..:YYtYi:tittV,
    ?????????   tXYti+++tWRVYttittYWIiIYYVItt:iXW+....
    ?????????  :WIt+++iXRBBVYItitIYXXYti+iIYt++:IMRi:.
    ????????? :Xti+:+tRWt:BVYItitIYWVIIIYXXWXVXYt+i+IV:
    ????????? tYi+::IWI:::BVVItitIXBRVIt:::::::tIVXRiXt
    ????????? Viii++i:itIXBXVttitVW,        tBIX
    ????????? XIiXIttIVRBRBIItttIRX         :VX
    ????????? tXXWWWVi+. RXXItiYRV         ..
    ?????????       ,BWYi+IRX
    ?????????        tBYiitWB,
    ?????????        .WVtiiIRI
    ?????????         VWtiiiIB,
    ?????????         ,BIiiiiWt
    ?????????         .BViiiiYV
    ?????????         XXtii+YV
    ?????????         iRiii+YY
    ?????????         :Btii+XI
    ?????????          Wtii+R:
    ?????????          XY+t+B.
    ?????????          YX+tYR.
    ?????????          tX+iWV
    ?????????          iXi+RI
    ?????????          tYiIXX
    ?????????         ,XtiIXRt.
    ?????????         :BIVYRWIV
    ?????????         +RYXXWiYR.
    ?????????         iWIVYtXMV
    ?????????         tBYItRtM+
    ?????????         XBWttX:B:
    ?????????        YYBXXYR:,R:
    ?????????        tIYYYIY: i:
    posted @ 2007-01-13 18:06 java_蟈蟈 閱讀(180) | 評論 (0)編輯 收藏

         摘要: 期待已久的日子即將到來: 最新版JavaServer Pages (JSP)2.0規(guī)范即將和其他的J2EE 1.4一同發(fā)布。新的JSP版本有一個(gè)新的飛躍,采用了新的方式:由于新的語言表達(dá)式(Expression Language,以下簡稱為EL)和JSP標(biāo)準(zhǔn)標(biāo)簽庫(JSP Standard Tag Library ,以下簡稱為JSTL)這兩種新的方式,在頁面中不需要用java,對于開發(fā)一般的應(yīng)用來說,重用代碼變得更加容易。更具體來說,JSP 2.0帶來了以下的優(yōu)點(diǎn):  閱讀全文
    posted @ 2007-01-08 15:18 java_蟈蟈 閱讀(266) | 評論 (0)編輯 收藏

         摘要: 步驟如下:
    0、把java程序轉(zhuǎn)換為exe文件,下載exe4j來轉(zhuǎn)換:過程比較簡單,選擇regular mode,excutable tyep 選擇GUI Application,選擇其他會有問題,不能成功做成服務(wù),按步驟生成yourApp.exe文件。
    1、下載instsrv.exe和srvany.exe程序,這是win2000自帶的程序,在winxp中因?yàn)榘踩虮蝗コ梢栽诰W(wǎng)上下載到。
    2、把兩個(gè)文件放置在與java的bin目錄下,運(yùn)行 x:\bin\instsrv.exe yourApp x:\bin\srvany.exe ,yourApp是要建立的服務(wù)名。
    3、yourApp服務(wù)已經(jīng)建立起來了,打開注冊表,展開"HKEY_LOCAL_MACHINE\SYSTEM\currentcontrolset\services",找到y(tǒng)ourApp 項(xiàng),在該項(xiàng)下面新建一個(gè)名為"Parameters"的項(xiàng)目,接著在“Parameters”項(xiàng)下新建一個(gè)類型為字符串值的“application”子鍵,該鍵  閱讀全文
    posted @ 2007-01-07 15:27 java_蟈蟈 閱讀(321) | 評論 (0)編輯 收藏

         摘要: 沒有真正理解Java, 沒有真正理解EJB, 沒有真正理解J2EE
    過度設(shè)計(jì)(Over-engineering)
    沒有將業(yè)務(wù)規(guī)則和邏輯表現(xiàn)形式相分離
    沒有在開發(fā)環(huán)境中進(jìn)行適當(dāng)?shù)呐渲?
    選擇了錯(cuò)誤的提供商
    不了解你的提供商
    設(shè)計(jì)中沒有充分考慮到可伸縮性和產(chǎn)品性能
    陳舊的開發(fā)過程
    沒有好的架構(gòu)方式
    項(xiàng)目計(jì)劃和設(shè)計(jì)基于市場效應(yīng),而脫離了技術(shù)現(xiàn)實(shí)
      閱讀全文
    posted @ 2007-01-06 09:53 java_蟈蟈 閱讀(113) | 評論 (0)編輯 收藏

         摘要: 在過去的 5 年中,已經(jīng)有許多人寫了關(guān)于 J2EE 最佳實(shí)踐方面的書以及文章。現(xiàn)在大約有 10 本(或更多的)書以及眾多的文章,它們對如何構(gòu)建 J2EE 應(yīng)用程序提出了深刻的見解。實(shí)際上,這方面的參考資料如此之多,并且這些參考資料之間往往還存在著一些矛盾的推薦,當(dāng)您經(jīng)歷這些迷惑的時(shí)候,這些迷惑會對使用 J2EE 本身形成一種阻礙。為了能夠?yàn)榇嬗写嗣曰蟮娜颂峁┮恍┖唵蔚闹笇?dǎo),于是我們列出了下面的%26#8220;最重要的 10 個(gè)%26#8221;清單,它們是我們感覺最重要的 J2EE 最佳實(shí)踐。遺憾的是,10 項(xiàng)內(nèi)容不足以闡述所有的內(nèi)容,尤其是當(dāng)您將 Web 服務(wù)開發(fā)作為 J2EE 的一部分。因此,為了使 J2EE 得到發(fā)展,我們決定使用%26#8220;最重要的 12 個(gè)%26#8221;清單而不是%26#8220;最重要的 10 個(gè)%26#8221;清單。  閱讀全文
    posted @ 2007-01-06 09:25 java_蟈蟈 閱讀(130) | 評論 (0)編輯 收藏

    書山有路勤為徑     學(xué)海無涯苦作舟

          在交流中學(xué)習(xí),在交流中進(jìn)步;
    QQ:49023500
    學(xué)習(xí)中......

    posted @ 2006-12-22 13:23 java_蟈蟈 閱讀(165) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 久久久久亚洲精品成人网小说| 亚洲人成图片网站| 老司机午夜在线视频免费| 久久午夜伦鲁片免费无码| 亚洲AV成人精品日韩一区18p| 亚洲第一精品电影网| 中国性猛交xxxxx免费看| 精品国产精品久久一区免费式 | 久久精品国产亚洲7777| 国产亚洲精品成人AA片| 一区二区三区观看免费中文视频在线播放| 亚洲精品tv久久久久| 亚洲综合小说另类图片动图| 91热久久免费精品99| 亚洲精品成人片在线观看精品字幕| 国产亚洲欧美日韩亚洲中文色| 97在线观看永久免费视频| 亚洲精品国产成人99久久| 中文字幕一区二区三区免费视频| 国产成人一区二区三区免费视频| 亚洲av极品无码专区在线观看| 日韩精品久久久久久免费| 亚洲国产a∨无码中文777| 一级看片免费视频囗交| 国产无遮挡吃胸膜奶免费看视频| 国产91在线|亚洲| 毛片免费全部播放无码| 亚洲人成亚洲精品| a级在线免费观看| 亚洲日本va在线视频观看| 国产精品综合专区中文字幕免费播放 | 亚洲美日韩Av中文字幕无码久久久妻妇| 亚洲中文无码亚洲人成影院| 波多野结衣中文字幕免费视频| 亚洲欧洲在线观看| 国偷自产一区二区免费视频| 亚洲精品在线视频| 永久免费无码网站在线观看个| 免费吃奶摸下激烈视频| 亚洲AV无码专区在线厂| 日本人护士免费xxxx视频|