posts - 495,  comments - 11,  trackbacks - 0
           

            1、Java編譯器在對源文件編譯前,會先把源文件轉換為unicode編碼,因為這個原因,我們在編譯時一定要把源文件用的是什么編碼方式正確無誤的”告訴”編譯器。

            例如:我們的源文件是以UTF-8的方式保存的,而在編譯時卻把它當作是用GBK方式保存的,這樣編譯器就會按照GBK->Unicode的編碼轉換方法對源文件進行轉換,然后再編譯,這樣當然會出錯,實際上編譯器應當按照UTF-8->Unicode的編碼轉換方法來對源文件進行轉換。

            a.對于控制臺程序,編譯器會把源文件看作是由系統默認的編碼類型來編碼的(系統默認的編碼類型取決于在控制面板區域設置里的配置,中文win2k下通常是GBK),也可以使用-encoding參數來設置,如:javac -encoding UTF-8,這樣編譯器就會把源文件看作是用UTF-8編碼的(這只是告訴編譯器源文件的編碼類型,而不是對源文件轉碼)。在各種語言的平臺上只要在編譯用時-encoding指定與源文件的編碼相同的編碼方式,就不會存在國際化的問題了。

            b.對于JSP,編譯器則會根據設定的字符集來判斷JSP文件使用的是什么編碼方式,進而將其轉換成unicode后進行編譯;若JSP中未指定,編譯器則會把JSP文件看作是按照系統默認的編碼來保存的。在JSP2.0里新增了一個指令來通知編譯器這個源文件所使用的編碼方式。

            2、在處理輸入輸出時,注意設置輸入流和輸出流的編碼類型與用戶輸入時和輸出設備顯示時采用的編碼方式一致。

            由于JRE在處理輸入輸出時會將輸入或輸出的內容進行編碼轉換,對于輸入會轉換為unicode后再送入,因此要正確的匹配實際輸入內容的編碼方式和告知JRE的編碼方式,對于輸出,會由unicode轉換為其他的編碼再送出程序,因此要正確匹配輸出設備顯示時用的編碼方式和告知JRE的編碼方式。

            例如:程序中設置輸入流的編碼是new InputStreamReader(System.in,"GB2312");而程序運行后用戶輸入時用了繁體中文的輸入法,輸入了BIG5編碼的內容,這樣JRE把BIG5編碼的內容當作GB2312的進行了GB2312->unicode的編碼轉換,這樣轉換后的結果顯然不是用戶想要輸入的內容了。

            默認情況下,JRE會把輸入輸出的內容當作是按照系統默認編碼方式編碼的。

            3、在Servlet中,除了一定要把源文件用的是什么編碼方式正確無誤的”告訴”編譯器外,還要注意實際提交的URL數據、表單數據的編碼格式和request中聲明的編碼格式一致。

            客戶端瀏覽器在通過表單和URL提交數據時,容器和JVM會將request中的數據看作是按照request所聲明的編碼方式來編碼的,將數據由這種編碼方式轉換為unicode后再送入servlet(實際上容器會先將request中的數據轉為一種中間編碼方式,具體根據容器的配置而定,再由JVM由這種中間方式轉換為unicode,通常這種中間格式是ISO)。servlet輸出的unicode數據會由容器根據response中聲明的編碼方式進行轉換,再送到客戶端瀏覽器上。

            在接收客戶端輸入時,用request.setCharacterEncoding()聲明請求中數據的編碼方式。

            在向客戶端輸出時用response.setContentType("text/html;charset=");聲明響應的數據的編碼方式,告知瀏覽器以哪種編碼方式顯示。

            4、在JSP中,由于JSP本就會被JSP編譯器編譯為servlet來運行,因此情況與servlet相同。

            這兩個JSP指令聲明了請求和響應的編碼方式。

            只要確保URL參數或表單中數據的編碼方式和所聲明的編碼方式一致,再通過告知JSP編譯器本JSP文件采用的編碼方式及含有哪種字符,即可解決JSP的字符編碼問題。

            這里是一個具體的例子:

            現在因為瀏覽器對UTF-8的支持,我們可以通過在源文件、請求、響應中都使用unicode編碼方式,來輕松達到處理國際化和字符編碼問題的目標。

            以我們使用的tomcat4.1.2為例,過程如下:

            1、編寫JSP頁面時:在每個JSP頁面在頁首都要增加一行:

            在編輯JSP頁面時,一定要確保JSP文件以unicode的方式保存,目前幾乎所有的編輯器都有以unicode編碼保存或將文件內容轉換成unicode的功能。

            2、增加一個用來聲明request的CharacterEncoding的類SetCharacterEncodingFilter.java;

            SetCharacterEncodingFilter的這個類主要的作用就是:把request在從頁面剛提交到server端的時候的encoding聲明為我們想要的encoding,通過調用request的方法setCharacterEncoding (String encoding) 來改變,這樣可以使request的從客戶端傳過來的時候,按我們在web.xml (在第二點可以講到) 中配置的encoding來對提交的數據編碼。

            3、修改web.xml文件,配置一個filter來過濾全部url請求,通過第二步中的類,聲明所有url請求的編碼類型未UTF-8。

            在web.xml文件中加上以下這段:

            

          posted @ 2007-11-03 16:43 jadmin 閱讀(61) | 評論 (0)編輯 收藏

          今天看到有個網友寫到“打字速度是程序員的命根子”的文章(調侃),引發俺進一步想,到底什么才是程序員的命根子。

          首先,程序員(初級)的主要<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5DE5_u4F5C";KeyGate_ads.ShowGgAds(this,"_u5DE5_u4F5C",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BwSwaDzAsR-a0H5ng6wPbwfy5CfqdyzOqkOW0A8CNtwGQvwUQARgBIIS04gcoFDgAUMSai7j4_____wFgnfHcgdAFoAH64sT8A6oBCjIwMDAwMjQxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MTEwMS8xMTAxNTIuaHRtbKkCLOcQc7QAgj7IAuL2oQGoAwHoA_EC9QMABAAA&num=1&adurl=http://www.chinahr.com/%3Fprj%3Dfa%26g%3D22&client=ca-pub-0892797939732602");GgKwClickStat("工作","chinahr.com","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u5DE5_u4F5C"">工作是什么:根據<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u8BBE_u8BA1";KeyGate_ads.ShowGgAds(this,"_u8BBE_u8BA1",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BYxtWDzAsR-a0H5ng6wPbwfy5CZaR2y2es9SAA8CNtwGQvwUQEBgQIIS04gcoFDgAUMnCw4D-_____wFgnfHcgdAFqgEKMjAwMDAyNDEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcxMTAxLzExMDE1Mi5odG1sqQIs5xBztACCPsgC7qPNAqgDAegD8QL1AwAEAAA&num=16&adurl=http://www.team-top.com/&client=ca-pub-0892797939732602");GgKwClickStat("設計","www.team-top.com","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u8BBE_u8BA1"">設計寫代碼;寫文檔;修改bug;功能測試;簡單邏輯設計。

          如果只是看這些工作內容的話,程序員的命根子是什么呢?

          1:基礎編碼能力。這個能力其實不需要大學本科學歷的,技校,自學,或者專業<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u57F9_u8BAD_u673A_u6784";KeyGate_ads.ShowGgAds(this,"_u57F9_u8BAD_u673A_u6784",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BkCTxDzAsR-a0H5ng6wPbwfy5CZSctS342cKABcCNtwGQvwUQChgKIIS04gcoFDgAUJHV_foEYJ3x3IHQBaoBCjIwMDAwMjQxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MTEwMS8xMTAxNTIuaHRtbIACAakCLOcQc7QAgj7IAoS-twOoAwHoA_EC9QMABAAA&num=10&adurl=http://www.whpx.net/%3Fw%3Dgoog&client=ca-pub-0892797939732602");GgKwClickStat("培訓機構","www.whpx.net","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u57F9_u8BAD_u673A_u6784"">培訓機構都可以學到。

          2:打字速度。

          當然,其他諸如“責任心”等不需贅述。綜合來看,打字還真的是程序員的命根子,至少是兩條腿中的一條。

          但是很明顯,“打字是程序員的命根子”很多人都不認同,原因很簡單,我們做的其實不僅僅是程序員(初級)的工作,而是兼作高級程序員,甚至UIDB、系統設計師,測試<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5DE5_u7A0B_u5E08";KeyGate_ads.ShowGgAds(this,"_u5DE5_u7A0B_u5E08",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BpgJSDzAsR-a0H5ng6wPbwfy5CY_v6izj8rLWAsCNtwGgjQYQEhgSIIS04gcoFDgAUMjeixlgnfHcgdAFqgEKMjAwMDAyNDEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcxMTAxLzExMDE1Mi5odG1sqQIs5xBztACCPsgCl8itA6gDAegD8QL1AwAEAAA&num=18&adurl=http://www.gz-benet.com/&client=ca-pub-0892797939732602");GgKwClickStat("工程師","www.gz-benet.com/","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u5DE5_u7A0B_u5E08"">工程師

          這就是為什么我們覺得“打字速度”只是我們工作中極小的一部分了。

          中國的專業分工并不細致,特別是在這個新興的行業里。10年前程序員還是絕對的白領,高級技術<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u4EBA_u5458";KeyGate_ads.ShowGgAds(this,"_u4EBA_u5458",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BJw-yDzAsR-a0H5ng6wPbwfy5Cfmbxi3v-OHCAcCNtwGgnAEQBRgFIIS04gcoFDgAUL3Z9Mj8_____wFgnfHcgdAFoAHHlpP_A6oBCjIwMDAwMjQxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MTEwMS8xMTAxNTIuaHRtbIACAagDAegD8QL1AwAEAAA&num=5&adurl=http://www.weaver.com.cn/solutions/HRM.asp&client=ca-pub-0892797939732602");GgKwClickStat("人員","www.weaver.com.cn","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u4EBA_u5458"">人員。現在的程序員也就是個藍領,工資頂多算是中等,辛苦卻能排高等。做個純粹的程序員似乎看不到前途。并且業屆里有句老話“程序員不過三十”,吃的還是一碗青春飯。這不是純粹的抱怨,事實如此。

          國外情況可能稍有不同。40歲的程序員也大有人在,不少人就喜歡這個工作,不像我們,必須得做的更高尚一點才能揚眉吐氣。這也不能怪我們不夠專業,不夠踏實,行業特點、社會大環境、價值觀等等決定了我們的選擇----必須做的“高級”一點。

          說道做的高級一點,那就是作設計師,作項目經歷,作老板。

          如果相作這些,僅僅編碼和打字就遠遠不夠了。我們中的大多數都在朝這個方向努力吧。學著設計,學著關系業界走向,學著創新。學習之路沒有止境,但是打字速度卻有止境。

          記得有篇文章說,人的職業生涯大體可以這樣分(大意如此):

          興奮期:剛入行(或者剛開始一份新工作),2-3個月。

          疲勞期:3-6個月,甚至更長。很多人在這個極端出局。

          成長期:安全度過疲勞期之后,可能需要幾年

          成熟期:熟練掌握行業要領,開始置身于行業里思考。

          …..

          為了不出局,既需要努力,也需要要不斷的學習和充實自己。

          所以,我們這種程序員(復合型)的命根子是什么?答案是:學習、思考和努力

          每天都學習一些新技術,不斷充實自己。不要以為vs2008僅僅是個beta版就和我沒關系,不要覺得SmartPhone還遠,對于新技術不敏感,很難走很遠。這個,是成長期必不可少的。

          思考是一切進步的積石。出了思考工作范圍之內的,也可以思考整個行業的走向。把自己融入到行業里面才能想得到更深更透徹。等到能思考到創行業之新了,也就離功成名就不遠了。這也就是進入成熟期的保證。

          而對于剛入行的年輕人,多思考也能讓自己盡快度過疲勞期,不至于在這個階段出局。

          然后再加上努力,還有什么事情是做不到的呢。

          ??? 共勉吧。

          posted @ 2007-11-03 16:26 jadmin 閱讀(127) | 評論 (0)編輯 收藏

          最近裝了個 Oracle,突然發現每次訪問http://localhost:8080/ 都要求輸入什么XDB的用戶、口令

          確實不知道輸入什么,不輸又報錯誤,上網查了下,有兩種解決辦法:

          方法1:

          在安裝Tomcat時設置其端口號為8081或其他,也可以在安裝后找到conf目錄下的server.xml文件,修改其端口號;

          方法2:

          重新建個oracle??? database??? -----database??? configration??? assistant-----創建新數據庫new??? database??? 在安裝過程中去掉關于XDB數據庫選項.安裝完畢就可以了。???

          posted @ 2007-10-29 17:32 jadmin 閱讀(350) | 評論 (0)編輯 收藏
          1、使用索引來更快地遍歷表。

            缺省情況下建立的索引是非群集索引,但有時它并不是最佳的。在非群集索引下,數據在物理上隨機存放在數據頁上。合理的索引設計要建立在對各種查詢的分析和預測上。一般來說:
            a.有大量重復值、且經常有范圍查詢( > ,< ,> =,< =)和order by、group by發生的列,可考慮建立群集索引;
            b.經常同時存取多列,且每列都含有重復值可考慮建立組合索引;
            c.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。索引雖有助于提高性能但不是索引越多越好,恰好相反過多的索引會導致系統低效。用戶在表中每加進一個索引,維護索引集合就要做相應的更新工作。

            2、在海量查詢時盡量少用格式轉換。
            3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短語,任何一種索引都有助于SELECT的性能提高。

            4、任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。

            5、IN、OR子句常會使用工作表,使索引失效。如果不產生大量重復值,可以考慮把子句拆開。拆開的子句中應該包含索引。
            6、只要能滿足你的需求,應盡可能使用更小的數據類型:例如使用MEDIUMINT代替INT

            7、盡量把所有的列設置為NOT NULL,如果你要保存NULL,手動去設置它,而不是把它設為默認值。
            8、盡量少用VARCHAR、TEXT、BLOB類型
            9、如果你的數據只有你所知的少量的幾個。最好使用ENUM類型
            10、正如graymice所講的那樣,建立索引。

            以下是我做的一個實驗,可以發現索引能極大地提高查詢的效率:
          我有一個會員信息表users,里邊有37365條用戶記錄:
          在不加索引的時候進行查詢:
          sql語句A:
          select * from users where username like '%許%';
          在Mysql-Front中的8次查詢時長為:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960條記錄
          sql語句B:
          select * from users where username like '許%';
          在Mysql-Front中的8次查詢時長為:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836條記錄
          sql語句C:
          select * from users where username like '%許';
          在Mysql-Front中的8次查詢時長為:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7條記錄
          為username列添加索引:
          create index usernameindex on users(username(6));
          再次查詢:
          sql語句A:
          select * from users where username like '%許%';
          在Mysql-Front中的8次查詢時長為:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960條記錄
          sql語句B:
          select * from users where username like '許%';
          在Mysql-Front中的8次查詢時長為:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836條記錄
          sql語句C:
          select * from users where username like '%許';
          在Mysql-Front中的8次查詢時長為:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7條記錄

            在實驗過程中,我沒有另開任何程序,以上的數據說明在單表查詢中,建立索引的可以極大地提高查詢速度。

            另外要說的是如果建立了索引,對于like '許%'類型的查詢,速度提升是最明顯的。因此,我們在寫sql語句的時候也盡量采用這種方式查詢。

            對于多表查詢我們的優化原則是:
            盡量將索引建立在:left join on/right join on ... +條件,的條件語句中所涉及的字段上。

            多表查詢比單表查詢更能體現索引的優勢。

            11、索引的建立原則:
            如果一列的中數據的前綴重復值很少,我們最好就只索引這個前綴。Mysql支持這種索引。我在上面用到的索引方法就是對username最左邊的6個字符進行索引。索引越短,占用的 磁盤空間越少,在檢索過程中花的時間也越少。這方法可以對最多左255個字符進行索引。

            在很多場合,我們可以給建立多列數據建立索引。
            索引應該建立在查詢條件中進行比較的字段上,而不是建立在我們要找出來并且顯示的字段上
            12、一往情深問到的問題:IN、OR子句常會使用工作表,使索引失效。如果不產生大量重復值,可以考慮把子句拆開。拆開的子句中應該包含索引。

          這句話怎么理解決,請舉個例子
          例子如下:
          如果在fields1和fields2上同時建立了索引,fields1為主索引
          以下sql會用到索引
          select * from tablename1 where fields1='value1' and fields2='value2'
          以下sql不會用到索引
          select * from tablename1 where fields1='value1' or fields2='value2'
            13.索引帶來查詢上的速度的大大提升,但索引也占用了額外的硬盤空間(當然現在一般硬盤空間不成問題),而且往表中插入新記錄時索引也要隨著更新這也需要一定時間.
            有些表如果經常insert,而較少select,就不用加索引了.不然每次寫入數據都要重新改寫索引,花費時間; 這個視實際情況而定,通常情況下索引是必需的.

            14.我在對查詢效率有懷疑的時候,一般是直接用Mysql的Explain來跟蹤查詢情況.
            你用Mysql-Front是通過時長來比較,我覺得如果從查詢時掃描字段的次數來比較更精確一些.
          posted @ 2007-10-25 10:55 jadmin 閱讀(81) | 評論 (0)編輯 收藏

            我們知道 XML+XSLT就可以直接輸出到支持XML的瀏覽器上,如IE 5.0以上,但是,我們還要考慮到有不少瀏覽器不直接支持XML,在這種情況下,我們需要在服務器上進行轉換成html輸出到瀏覽器,這種臨時過渡辦法恐怕要在一段時間內一直要使用.

            使用Jsp 加上tablib標識庫,我們可以完成這種轉換。

            著名open source項目組jakarta.apache.org推出的系列標識庫中,就有這個功能的tanglib:http://jakarta.apache.org/taglibs/doc/xsl-doc/intro.html

            按照jakarta配置方法,有點繁瑣,需要修改或定義Web.xml,本人經過摸索,使用下列相當簡單的辦法,就可以使Jsp能成功運行XSL這個標識庫了。

            xsl標識庫有三個關鍵包:

          posted @ 2007-10-25 07:48 jadmin 閱讀(97) | 評論 (0)編輯 收藏

          JSTL包括四個標簽庫,即Core標簽庫、XML標簽庫、國際化與格式化標簽庫和SQL標簽庫,這里介紹SQL標簽庫


          ?? <%@??? page??? contentType="text/html;??? charset=utf-8" %>???
          ?? <%@??? taglib??? uri="?? <%@??? taglib??? uri="

          一.連接MySQL的幾種方式


          ?? 1.創建普通的數據源


          ???? <sql:setDataSource var="example" driver="com.mysql.jdbc.Driver"???
          ?????? url="jdbc:mysql://127.0.0.1:3306/test"?????
          ?????? user="root" password="" [scope="request"]/>??


          ?? 2.從JNDI名稱空間中獲得一個數據源


          ???? <sql:setDataSource var="example" dataSource="jdbc/bn" />


          二.<sql:query>和<sql:update>(<sql:param>/<sql:dateParam>可以用于query和update)


          ???? <sql:query??? var="qurey"??? dataSource="${example}"??? sql="select??? *??? from??? dept />


          ???? <sql:query??? var="qurey2"??? dataSource="${example}">??


          ??????????? select * from dept


          ???? </sql:query>


          ???? <sql:query var="qurey3" dataSource="${example}" [maxRows="20"] [startRow="1"]


          ????? [scope="request"]>??


          ??????????? select * from dept where deptid=? and deptname=? and createtime=?


          ??????????? <sql:param value="1"/>


          ??????????? <sql:param>wuhui</sql:param>


          ??????????? <sql:dateParam>new Date()</sql:dateParam>


          ???? </sql:query>


          ???? <c:forEach var="row" items="${query.rows}"></c:forEach>//迭代


          ???? <sql:update var="update"?? dataSource="${example}" >


          ??????????? update dept set deptid=? and deptname=?


          ??????????? <sql:param value="1"/>


          ??????????? <sql:param>wuhui</sql:param>


          ?????? update 處理增刪改什么都可以,除了查詢


          ???? </sql:update>


          ????? query和update語法基本一樣


          3.<sql:transaction>事務處理標簽


          ??? <sql:transaction dataSource="example"


          ???? [isolation="read_committed|read_uncommitted|repeatable_read|serializable"]>


          ????????? <sql:query>and<sql:update>語句


          ??? </sql:transaction>

          本示例從sql2000的pubs數據庫中的employee表取出first name、lname.

          <%@ page contentType="text/html; charset=utf-8"%>
          <%@ taglib uri="<%@ taglib uri="<html>
          <head>
          ??? <title>jstl連接SQL Server 2000數據庫</title>
          </head>
          <body>
          <h3>本示例從sql2000的pubs數據庫中的employee表取出first name、lname</h3>
          當然,運行本JSP頁須機器已經安裝了SQL Server 2000數據庫<br>
          ??? <sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" user="sa" password="pass"/>
          ??? <sql:query var="rs">
          ?? select * from employee
          ??? </sql:query>
          ??? <table border="1">
          ???? <tr align="center">
          ????? <td><strong>
          ?????? first name</strong>
          ????? </td>
          ????? <td><strong>
          ?????? last name
          ????? </strong></td>
          ???? </tr>
          ???? <c:forEach items="${rs.rows}" var="row">
          ????? <tr>
          ?????? <td>
          ??????? <c:out value="${row.fname}"></c:out>
          ?????? </td>
          ?????? <td>
          ??????? <c:out value="${row.lname}"></c:out>
          ?????? </td>
          ????? </tr>
          ???? </c:forEach>
          ??? </table>
          ??? <hr>
          </body>
          </html>

          結果:

          本示例從sql2000的pubs數據庫中的employee表取出first name、lname

          當然,運行本JSP頁須機器已經安裝了SQL Server 2000數據庫

          日期輸入頁面:

          dateInput.jsp

          <%@ page pageEncoding="UTF-8" %>
          <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
          <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

          <html>
          <head>

          <title>Currency Formatting</title>
          </head>
          <body>


          <form method="post" action="doDateInput.jsp">
          Please enter your birthday:
          <select name="month">
          <option value="01">January</option>
          <option value="02">February</option>
          <option value="03">March</option>
          <option value="04">April</option>
          <option value="05">May</option>
          <option value="06">June</option>
          <option value="07">July</option>
          <option value="08">August</option>
          <option value="09">September</option>
          <option value="10">October</option>
          <option value="11">November</option>
          <option value="12">December</option>
          </select>

          <select name="day">
          <c:forEach begin="1" end="31" var="day">
          <option><c:out value="${day}"/></option>
          </c:forEach>
          </select>
          <select name="year">
          <c:forEach begin="1930" end="2003" var="year">
          <option><c:out value="${year}"/></option>
          </c:forEach>
          </select>
          <input type="submit" value="Submit" />
          </form>



          </body>
          </html>

          日期處理頁面:

          doDateInput.jsp

          <%@ page pageEncoding="UTF-8" %>
          <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
          <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

          <html>
          <head>

          <title>Currency Formatting</title>
          </head>
          <body>


          <fmt:parseDate
          ?????
          var="date"
          ????? parseLocale
          ="zh_CN"
          ????? value
          ="${param.year}-${param.month}-${param.day}">
          ???
          </fmt:parseDate>

          <fmt:formatDate value="${date}" dateStyle="full"/>



          </body>
          </html>

          提交后,顯示結果諸如1930年11月1日 星期六

          如果日期輸入是en_US格式,也就是做以下改動

          <select name="month">
          <option value="Jan">January</option>
          <option value="Feb">February</option>
          <option value="Mar">March</option>
          <option value="Apr">April</option>
          <option value="May">May</option>
          <option value="Jun">June</option>
          <option value="Jul">July</option>
          <option value="Aug">August</option>
          <option value="Sep">September</option>
          <option value="Oct">October</option>
          <option value="Nov">November</option>
          <option value="Dec">December</option>
          </select>

          則日期處理頁面也要做想應改動

          <fmt:parseDate
          ????? var="date"
          ????? parseLocale="en_US"
          ????? value="${param.month} ${param.day}, ${param.year}">??

          注意逗號后有一個空格,因為英文的日期格式為"May 25, 1997"
          </fmt:parseDate>

          posted @ 2007-10-24 20:11 jadmin 閱讀(97) | 評論 (0)編輯 收藏

          <%@ page contentType="text/html;charset=utf-8" %>
          <%@ taglib uri="<%@ taglib uri="<%@ taglib uri="<%@ taglib uri="


          ?????? URL相關的標簽

          <c:import>
          語法1:資源的內容使用String對象向外暴露
          <c:import url="url" [context="context"]
          [var-"varName"][scope="{page|request|session|application}"]
          [charEncoding="charEncoding"]>
          optional body content for <c:param> subtags
          </c:import>
          語法2:資源的內容使用Reader對象向外暴露
          <c:import url="url" [context="context"]
          varReader="varReaderName"
          [charEncoding="charEncoding"]>
          body content where varReader is consumed by another action
          </c:import>
          例1:??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
          <h3>絕對路徑 URL</h3>
          <blockquote>
          <ex:escapeHtml>
          ?? <c:import url="
          >
          </ex:escapeHtml>
          </blockquote>
          <h3>相對路徑 URL</h3>
          <blockquote>
          <ex:escapeHtml>
          ?? <c:import url="beimport.jsp"/>
          </ex:escapeHtml>
          </blockquote>
          <h3>encode:</h3>
          <a href=<c:url value="beimport.jsp"><c:param name="userName" value="hellking"/></c:url>>--></a>
          相當于<--jsp:include file=""/>
          <c:import var="myurl" url="
          >

          ?? <c:out value="${myurl}"/>

          <c:import var="myurl2" url="beimport.jsp"/>
          ?? <c:out value="${myurl2}"/>
          </pre>
          </blockquote>
          <h3>傳遞參數到指定的URL</h3>
          <blockquote>
          ?? <c:import url="beimport.jsp" charEncoding="gb2312">
          ?? <c:param name="userName" value="hellking"/>
          </c:import>??


          <c:redirect>
          把客戶的請求重定向到另一個資源
          語法1:沒有BODY時.
          <c:redirect url="value" [context="context"]/>
          例1:
          <c:url value="beimport.jsp" var="test"><c:param name="userName" value="hellking"/></c:url>
          <c:redirect url="${test}"/>
          語法2:在BODY中指定查詢的參數.
          <c:redirect url="value" [context="context"]/>
          <c:param>subtags
          </c:redirect>
          例1:
          <c:redirect url="beimport.jsp">
          <c:param name="userName" value="hellking"/>
          </c:redirect>

          <c:url>
          用于構造URL,主要的用途是URL重寫.
          語法1:No Body.
          <c:url value="value" [context="context"]
          [var="varName"][scope="{page|request|session|application}"]/>
          例1:
          <c:url value="beimport.jsp"/>
          語法2:Body.
          <c:url value="value" [context="context"]
          [var="varName"][scope="{page|request|session|application}"]>
          <c:param>subtags
          </c:url>
          例2:
          <c:url?? var="myurl" value="beimport.jsp" scope="session">
          <c:param name="userName" value="hellking"/>
          </c:url>
          <c:out value="${myurl}"/>

          <c:param>
          在<c:import>.<c:url>.<c:redirect>中添加請求的參數.
          語法1:參數的值使用value屬性指定.
          <c:param name="name" value="value"/>

          語法2:參數的值在標簽的BODY中指定.
          <c:param name="name">
          parameter value
          </c:param>

          ?????? 迭代標簽
          <c:forEach>
          在一個包括一系列對象的Collection中迭代計算它的BodyContent,或者重復迭代固定的次數.
          語法1:在Collection中迭代.
          <c:forEach [var="varName"] items="collection"
          [varStatus="varStatusName"]?? //這是迭代狀態
          [begin="begin"][end="end"][step="step"]>
          body content
          </c:forEach>
          例1:迭代Collection
          <table border=1>
          <c:forEach var="users" items="${users}">
          ?? <tr>
          ?? <td><c:out value="${users.userName}"/></td>
          ?? <td><c:out value="${users.password}"/></td>
          ?? <td><c:out value="${users.age}"/></td>
          ?? </tr>
          </c:forEach>
          </table>
          例2:other迭代
          <%
          int[] myIntArray=new int[]{1,2,3,4,5,65,34};
          String[] myStringArray=new String[]{"I ","am ","a ","Java","fans"};
          Vector v=new Vector();
          v.add("this");
          v.add("is");
          v.add("myEnumeration");
          v.add("!");
          Enumeration myEnumeration=v.elements();
          HashMap myNumberMap=new HashMap();
          myNumberMap.put("hellking","23");
          myNumberMap.put("guest","23");
          myNumberMap.put("guest2","223");
          myNumberMap.put("guest3","232");
          request.setAttribute("myIntArray",myIntArray);
          request.setAttribute("myStringArray",myStringArray);
          request.setAttribute("myEnumeration",myEnumeration);
          request.setAttribute("myNumberMap",myNumberMap);
          %>
          <h4>Array of primitives (int)</h4>
          <c:forEach var="i" items="${myIntArray}">
          ?? <c:out value="${i}"/> ?
          </c:forEach>
          <h4>Array of objects (String)</h4>
          <c:forEach var="string" items="${myStringArray}">
          ?? <c:out value="${string}"/><br>
          </c:forEach>
          <h4>myEnumeration (warning: this only works until myEnumeration is exhausted!)</h4>
          <c:forEach var="item" items="${myEnumeration}" begin="0" end="5" step="1">
          ?? <c:out value="${item}"/><br>
          </c:forEach>
          <h4>Properties (Map)</h4>
          <c:forEach var="prop" items="${myNumberMap}" begin="1" end="5">
          ?? <c:out value="${prop.key}"/> = <c:out value="${prop.value}"/><br>
          </c:forEach>
          <h4>String (Common Separated Values)</h4>
          <c:forEach var="token" items="red,blue,green">
          ?? <c:out value="${token}"/><br>
          </c:forEach>


          語法2:迭代固定的次數.
          <c:forEach [var="varName"]
          [varStatus="varStatusName"]
          begin="begin" end="end"[step="step"]>
          body content
          </c:forEach>
          例1:
          <c:forEach var="i" begin="1" end="10">
          ?? <c:out value="${i}"/> -->
          </c:forEach>

          例2:<h4>第二種迭代:1 to 10,step=3</h4>
          <c:forEach var="i" begin="1" end="10" step="3">
          ?? <c:out value="${i}"/> -->
          </c:forEach>

          例3:迭代狀態
          ?? <td><c:out value="${status.index}"/></td>
          ?? <td><c:out value="${status.count}"/></td>
          ?? <td><c:if test="${status.first}">
          ????? <b></c:if>
          ?????? <c:out value="${status.first}"/></b></td>
          ?? <td><c:if test="${status.last}">
          ????? <i> </c:if>
          ????? <c:out value="${status.last}"/></i></td>????
          ?? </tr>

          <c:forTokens>
          用于處理TokenString的迭代,可以指定一個或者多個分隔符.
          語法:
          <c:forTokens items="stringOfTokens" delims="delimiters"
          [var="varName"]
          [varStatus="varStatusName"]
          [begin="begin"][end="end"][step="step"]
          body content
          </c:forTokens>
          例:
          <h4>使用 '|' 作為分割符</h4>
          <c:forTokens var="token" items="blue,red,green|yellow|pink,black|white"
          ?????????????? delims="|">
          ?? <c:out value="${token}"/> &copy;
          </c:forTokens>
          <h4>使用 '|'和',' 作為分割符</h4>
          <c:forTokens var="token" items="blue,red,green|yellow|pink,black|white"
          ?????????????? delims="|,">
          ?? <c:out value="${token}"/> &copy;
          </c:forTokens>
          <h4>使用 '-' 作為分割符</h4>
          <c:forTokens var="token" items="blue--red--green--yellow--pink--black--white"
          ?????????????? delims="--">
          ?? <c:out value="${token}"/> &copy;
          </c:forTokens>


          ?????? 一般用途

          輸出
          <c:out value="&{XXX}" default="這個值不存在">
          設置一個變量
          <c:set>
          例:設置一個javaBean的屬性<c:set value="hk2" target="${user}" property="userName"/>

          刪除某個變量或者屬性
          <c:remove var="${XXX}" [scope="{page|request|...}"]>

          捕獲由嵌套在它里面的標簽拋出的異常
          <c:catch [var="varName"]>
          nested actions
          </c:catch>


          ?????? 條件標簽
          <c:if>
          語法1:無Body的情況
          <c:if test="testCondition"
          var="varName" [scope="{page|request|session|application}"]/>
          例:
          <c:if test="${user.age<18}">
          對不起,你還的年齡過小,不能范圍這個網頁◎!
          </c:if>
          語法2:有Body的情況
          <c:if test="testCondition"
          var="varName" [scope="{page|request|session|application}"]>
          body content
          </c:if>


          <c:choose>?? <c:when> <c:otherwise>
          例:
          <c:choose>
          ???? <c:when test="${user.age <=18}">
          ?????? <font color="blue">
          ???? </c:when>
          ???? <c:when test="${user.age<=30&&user.age>18}">
          ?????? <font color="red">
          ???? </c:when>
          ???? <c:otherwise>
          ?????? <font color="green">
          ???? </c:otherwise>
          ?? </c:choose>
          你的年齡是:<c:out value="${user.age}"/>

          注意,它的Body內容只能由以下的元素構成:
          空格.
          0個或者多個<when>子標簽,<when>必須在<otherwise>標簽之前出現.
          0個或者多個<otherwise>子標簽.


          ?????? 數據庫相關


          QUERY標簽


          語法1?? 無SQL參數
          <sql:query sql="sqlQuery"
          var="varName"
          [scope="{page|request|session|application}"]
          [dataSource="dataSource"]
          [maxRows="maxRows"]
          [startRow="startRow"]>
          SQL
          </sql:query>

          例1:
          <sql:query var="query" dataSource="${example}">
          SELECT * FROM contact
          </sql:query>

          <table border="1">
          ?? <c:forEach var="row" items="${qurey.rows}">
          ?? <tr>
          ?????? <td>Name:<c:out value="${row[0]}"/></td>
          ?????? <td>mobile:<c:out value="{row.mobile}"/></td>
          ?? </tr>
          ?? </c:forEach>
          </table>
          <hr>

          例2:
          <sql:query var="result" dataSource="mbq">
          select?? code, curprice, openprice, highprice, lowprice,?? balanceprice, reservecount,totalamount,curamount, openamount,

          closeamount,?? reservechange, totalmoney,?? buyprice1, sellprice1, buyamount1, sellamount1, buyprice2, sellprice2, buyamount2,

          sellamount2, buyprice3, sellprice3, buyamount3, sellamount3, buyprice4, sellprice4, buyamount4, sellamount4, buyprice5,

          sellprice5, buyamount5, sellamount5, outamount, inamount, time,yesterbalanceprice,closeprice from currentdata WHERE Code <>

          'SYS' order by code
          </sql:query>代碼 現價 開盤 最高 最低 平均 訂貨量 成交量
          <c:forEach var="row" items="${result.rowsByIndex}">${row[0]} ${row[1]} ${row[2]} ${row[3]} ${row[4]}

          ${row[5]} ${row[6]} ${row[7]}
          </c:forEach>

          語法2?? 有query參數
          <sql:query sql="sqlQuery"
          var="varName"
          [scope="{page|request|session|application}"]
          [dataSource="dataSource"]
          [maxRows="maxRows"]
          [startRow="startRow"]>
          [<sql:param>""]
          </sql:query>
          例1:變量傳入
          <c:set var="aa">
          GX0511A
          </c:set>
          <sql:query var="result" dataSource="mbq" sql="select * from currentdata WHERE?? code=? order by code">
          ?? <sql:param>
          ??? ${aa}
          ?? </sql:param>
          </sql:query>代碼 現價 開盤 最高 最低 平均 訂貨量 成交量
          <table border="1">
          <c:forEach var="row" items="${result.rowsByIndex}">
          <tr>
          <td>Name: ${row[0]} </td><td>2:${row[1]}</td> <td>3:$10:02 2005-11-17{row[2]}</td>
          </tr>
          <tr>
          <td>${row[3]}</td><td> ${row[4]}</td><td>${row[5]}</td><td>${row[6]}</td><td>${row[7]}</td>
          </tr>
          </c:forEach>
          </table>

          語法3 有query,且query在body中.
          <sql:query var="varName"
          [scope="{page|request|session|application}"]
          [dataSource="dataSource"]
          [maxRows="maxRows"]
          [startRow="startRow"]>
          query
          [<sql:param>""]
          </sql:query>
          例1:值傳入
          <sql:query var="result" dataSource="mbq">
          select * from currentdata WHERE?? code=? order by code
          ?? <sql:param value="GX0511A"/>
          </sql:query>代碼 現價 開盤 最高 最低 平均 訂貨量 成交量
          <table border="1">
          <c:forEach var="row" items="${result.rowsByIndex}">
          <tr>
          <td>Name: ${row[0]} </td><td>2:${row[1]}</td> <td>3:$10:02 2005-11-17{row[2]}</td>
          </tr>
          <tr>
          <td>${row[3]}</td><td> ${row[4]}</td><td>${row[5]}</td><td>${row[6]}</td><td>${row[7]}</td>
          </tr>
          </c:forEach>
          </table>


          UPDATA標簽

          語法1
          <sql:update sql="sqlUpdate"
          [dataSource="dataSource"]
          [var="varName"][scope="{page|request|session|application}"]/>
          例1
          <sql:update var="update2" sql="insert into users values('測試','9999',1,'test')"
          dataSource="jdbc/quickdb2">

          </sql:update>

          語法2
          <sql:update sql="sqlUpdate"
          [dataSource="dataSource"]
          [var="varName"][scope="{page|request|session|application}"]>
          <sql:param>actions
          </sql:update>
          例1
          <sql:update var="update2" sql="delete from users where username=?" dataSource="jdbc/quickdb2">
          ?? <sql:param value="測試"/>
          </sql:update>

          語法3
          <sql:update [dataSource="dataSource"]
          [var="varName"][scope="{page|request|session|application}"]>
          update statement
          optional<sql:param>actions
          </sql:update>
          例1
          <c:set var="aa" value="測試"/>

          <sql:update var="update2"?? dataSource="jdbc/quickdb2">
          delete from users where username=?
          ?? <sql:param>
          ??? ${aa}
          ?? </sql:param>
          </sql:update>


          TRANSACTION標簽
          <sql:transaction [dataSource="dataSource"]
          [isolation=isolationLevel]>
          <sql:query>and<sql:update>statements
          </sql:transaction>
          isolationLevel::="read_committed"|"read_uncommitted"|"repeatable_read"|"serializable"
          注意:嵌套在它里面的<sql:query>和<sql:update>標簽不用使用DataSource屬性來另外指定數據源.


          ?????? XML標簽
          <x:parse>
          用于解析XML文檔
          語法1:解析由String或者Reader對象組成的XML文檔.
          <x:parse xml="XMLDocument"
          {var="var" [scope="scope"]|varDom="var"[scopeDom="scope"]}
          [systemId="systemId"]
          [filter="filter"]/>

          語法2:解析在Body中指定的XML文檔.
          <x:parse
          {var="var" [scope="scope"]|varDom="var"[scopeDom="scope"]}
          [systemId="systemId"]
          [filter="filter"]>
          XML Document to parse
          </x:parse>
          例1:
          <c:set var="xmlText">
          ?? <a>
          ??? <b>
          ???? <c>
          ????? test1
          ???? </c>
          ??? </b>
          ??? <d>
          ????? test2
          ??? </d>
          ?? </a>
          </c:set>
          <x:parse var="myxml" xml="${xmlText}" />
          <x:out select="$myxml/a/b/c"/>
          <x:out select="$myxml//d"/>
          <x:parse var="bookxml">
          ?? <books>
          ????? <book id="01">
          ???????? <name>jsp 應用開發詳解</name>
          ???????? <price>59</price>
          ????? </book>
          ?? </books>
          </x:parse>
          <x:out select="$bookxml/books//name"/>


          <x:out>
          計算XPath表達式,并把結果返回給JspWriter對象進行輸出
          語法:
          <x.out select="XpathExpression" [escapeXml="true|false}"]/>
          例1:
          <x:parse var="test">
          ?? <books>
          ????? <book id="01">
          ???????? <name>jsp 應用開發詳解</name>
          ???????? <price>59</price>
          ????? </book>?????
          ?? </books>
          </x:parse>
          <x:out select="$test/books//name"/><br>
          <x:out select="$test//name"/><br>
          <x:out select="$test/books/book/name"/><br>
          <x:out select="$test/books/book/price"/><br>


          <x:set>
          計算XPath表達式,并且把結果保存到某個范圍的變量中.
          語法:
          <x:set select="XPathExpression"
          var="varName"[scope="{page|request|session|application}"]/>

          搭建的步驟:

          1、下載、安裝、注冊editplus2。

          2、修改幾處設置,這是可選的。進入tools 》preferences》font,修改成大點的字體,小字累眼睛。在files選項卡里去掉創建備份文件,把Create backup file when saving前面的勾去掉。

          3、加入Java工具,這是最主要的。
          添加Java編譯工具。在tools 》 configure user tools 》Add tool 》Program,在menu test 中輸入“java編譯”,command輸入“javac”,Argument選擇$(FilePath),Initial directory選擇$(FileDir),再選上Capture output。點擊Apply就ok了。
          添加Java解釋器。在tools 》 configure user tools 》Add tool 》Program,在menu test 中輸入“java運行”,command輸入“java”,Argument選擇$(FileNameNoExt),Initial directory選擇$(FileDir)。點擊Apply就ok了。
          添加當前文件目錄下的Dos窗口。在tools 》 configure user tools 》Add tool 》Program,在menu test 中輸入“cmd”,command輸入“cmd”,Initial directory選擇$(FileDir)。 點擊Apply就ok了。
          實現的效果就是:用editplus編輯一個Java源文件,然后按CTRL + 1,編譯;CTRL + 2,運行;當一個文件有多個class,你想運行其中的某一個,CTRL + 3,跳出cmd窗口,已經指向當前目錄了,然后手工輸入就可以了。

          4、修改Java文件模板。到editplus安裝目錄下,用記事本打開template.java文件,修改成你想要的新建Java文件的模板。這樣每次從file 》 new 》java 創建的Java文件都是模板里的格式。

          5、然后下載Java語法高亮文件java.stx,以及Java自動完成文件,java.acp。(這種自動完成沒有eclipse那么智能、變態)

          6、在editplus安裝目錄下面新建一個名為java.ctl的文本文件,內容為:
          #TITLE=JavaCodeClip
          #INFO
          #SORT=y
          重啟editplus,在左上角的Cliptext的下拉列表中選擇JavaCodeClip,點擊add,然后可以添加常用的Java源代碼片段。比如測試經常用的System.out.println();可以這樣添加:在title里面輸入print,在text body中輸入System.out.println(^!); 其中^!的意思是雙擊在文件中插入代碼之后,光標的位置。
          posted @ 2007-10-23 07:53 jadmin 閱讀(59) | 評論 (0)編輯 收藏
          僅列出標題
          共50頁: First 上一頁 21 22 23 24 25 26 27 28 29 下一頁 Last 
          主站蜘蛛池模板: 兰坪| 黄石市| 玛多县| 新巴尔虎左旗| 海林市| 延长县| 咸阳市| 武汉市| 屏东县| 盱眙县| 澜沧| 中宁县| 延吉市| 陆河县| 东明县| 浏阳市| 林芝县| 云阳县| 南江县| 越西县| 新蔡县| 逊克县| 锡林浩特市| 农安县| 民丰县| 共和县| 同江市| 阳春市| 晋宁县| 贵南县| 嵊州市| 醴陵市| 宁蒗| 景洪市| 镶黄旗| 江达县| 阿拉善左旗| 徐州市| 叙永县| 绥江县| 宁夏|