摘要: 本文章主要討論了在Java web系統(tǒng)中亂碼產(chǎn)生的內(nèi)在原理, 是認(rèn)識(shí)和解決亂碼問(wèn)題的基礎(chǔ). 如果您對(duì)亂碼問(wèn)題還沒(méi)有一個(gè)清晰的概念, 請(qǐng)嘗試閱讀本文. 另外, 本文也討論了最近流行的Ajax技術(shù)中的亂碼問(wèn)題, 如果您在使用Ajax技術(shù)中遇到了亂碼, 本文對(duì)您也有一定的參考價(jià)值.
閱讀全文
摘要: 測(cè)試并行程序尤其困難。這是因?yàn)椴⑿袦y(cè)試程序本身就是并行程序,這種程序即難寫(xiě)而且比順序執(zhí)行程序更容易發(fā)生不確定的問(wèn)題。
在這篇文章中將討論一些關(guān)于測(cè)試并行類的話題,提供一些構(gòu)建并行程序的技術(shù),這些技術(shù)使并行程序更容易被測(cè)試。
閱讀全文
摘要: 本方法適用于Oracle9i, 10g以及XE. 在10.2.0.1.0下測(cè)試無(wú)錯(cuò). 需要注意的是, 使用此方法會(huì)破壞數(shù)據(jù)庫(kù)中的原有雙字節(jié)字符. 一種辦法是先將數(shù)據(jù)庫(kù)導(dǎo)出, 修改完字符集后再導(dǎo)入; 另一種辦法就是不管他, 就那樣使用. 一般如果是一個(gè)測(cè)試環(huán)境, 像方法二那樣就可以了, 但是可能某些表無(wú)法讀取, 需要注意.
閱讀全文
BEA公司為weblogic server準(zhǔn)備了petstore for weblogic供開(kāi)發(fā)者安裝, 因?yàn)樽罱鼫y(cè)試Hyperic-HQ, 所以進(jìn)行了petstore for weblogic的安裝.
首先, 需要下載Sun的petstore和在bea.com下載petstore for weblogic. 對(duì)應(yīng)weblogic 8.1服務(wù)器的petstore版本是1.3.2.
下載后, 按照下載包中的readme.txt文件的提示一步一步安裝, 沒(méi)有什么問(wèn)題, readme上說(shuō)得非常清楚. 但是到Step1的第12步和Step2的第7步卻無(wú)法啟動(dòng)weblogic服務(wù)器. 現(xiàn)象為, 啟動(dòng)后拋出如下異常.
<2006/09/06?9時(shí)13分08秒?CST>?<Critical>?<WebLogicServer>?<BEA-000364>?<Server?failed?during?initialization.?Exception:weblogic.security.spi.ProviderInitializationException:?[Security:090314]Entitlement?Engine?unable?to?connect?to?the?embedded?LDAP?server
netscape.ldap.LDAPException:?error?result?(50)
weblogic.security.spi.ProviderInitializationException:?[Security:090314]Entitlement?Engine?unable?to?connect?to?the?embedded?LDAP?server
netscape.ldap.LDAPException:?error?result?(50)
????????at?weblogic.security.providers.authorization.DefaultAuthorizationUtils.getEngine(DefaultAuthorizationUtils.java:130)
????????at?weblogic.security.providers.authorization.DefaultRoleMapperProviderImpl.initialize(DefaultRoleMapperProviderImpl.java:104)
????????at?weblogic.security.service.SecurityServiceManagerDelegateImpl.createSecurityProvider(SecurityServiceManagerDelegateImpl.java:242)
????????at?weblogic.security.service.SecurityServiceManager.createSecurityProvider(SecurityServiceManager.java:957)
????????at?weblogic.security.service.RoleManager.initialize(RoleManager.java:152)
????????at?weblogic.security.service.RoleManager.<init>(RoleManager.java:98)
????????at?weblogic.security.service.SecurityServiceManagerDelegateImpl.doRole(SecurityServiceManagerDelegateImpl.java:513)
????????at?weblogic.security.service.SecurityServiceManagerDelegateImpl.initializeRealm(SecurityServiceManagerDelegateImpl.java:409)
????????at?weblogic.security.service.SecurityServiceManagerDelegateImpl.loadRealm(SecurityServiceManagerDelegateImpl.java:700)
????????at?weblogic.security.service.SecurityServiceManagerDelegateImpl.initializeRealms(SecurityServiceManagerDelegateImpl.java:733)
????????at?weblogic.security.service.SecurityServiceManagerDelegateImpl.initialize(SecurityServiceManagerDelegateImpl.java:876)
????????at?weblogic.security.service.SecurityServiceManager.initialize(SecurityServiceManager.java:734)
????????at?weblogic.t3.srvr.T3Srvr.initializeHere(T3Srvr.java:822)
這個(gè)問(wèn)題的原因是petstore模板中的Critical密鑰已經(jīng)過(guò)期.
解決辦法是找到weblogic的配置文件config.xml.
修改其中的如下這行
<EmbeddedLDAP Name="petstore" Credential="{3DES}78P9aVGmaIE="/>將其中的Credential屬性刪除即可. 再啟動(dòng)weblogic的時(shí)候, 服務(wù)器會(huì)重新自動(dòng)生成一個(gè)Credential.
這個(gè)問(wèn)題在petstore for weblogic的readme中并沒(méi)有提到. 因此不少同志在安裝的時(shí)候遇到這個(gè)問(wèn)題. 在此進(jìn)行一下memo, 以饗后來(lái)人.
一、范型(generic)的支持
支持generic的tiger屬于較1.4及以前最大的變化之一。由于支持范型,所以以前的諸多集合類(譬如,list和map)的接口都做了比較大的變化。而Java developer們從理論上說(shuō)則可以擺脫使用括號(hào)的強(qiáng)制轉(zhuǎn)型;使用類型安全(type-safe)的各種集合類,甚至可以寫(xiě)自己的支持范型的類。
二、枚舉(enumerated)類型的支持新加入了enum關(guān)鍵字,使Java developer們可以創(chuàng)建一種新的類型——枚舉類型。并且,枚舉類型支持switch分支以及行內(nèi)(inline)的創(chuàng)建。和范型配合使用,我們可以創(chuàng)建枚舉類型的map或者set。
三、Autoboxing和Unboxing的支持現(xiàn)在tiger可以自動(dòng)的把primitive type變成與之對(duì)應(yīng)的object類型。Java developer們?cè)僖膊挥檬褂弥T如intValue()或者new Integer()這樣的方法來(lái)把一個(gè)整型的變量變來(lái)變?nèi)チ恕?br />
四、可變長(zhǎng)參數(shù)(vararg)的支持
以前函數(shù)參數(shù)中帶有“...”一直是C++ fans的專利,現(xiàn)在Java developer們也可以享受到其帶來(lái)的好處。
五、Annotation的支持
這是tiger帶給我們的又一偉大的功能。Java developer們現(xiàn)在可以撰寫(xiě)自己的annotation(當(dāng)然,tiger自身帶有annotation,一些先進(jìn)的框架framework也用到annotation)來(lái)給class、method甚至package添加額外信息,這就昭示著可能單體(unit)試驗(yàn)會(huì)更加輕松并且那些習(xí)慣xdoclet的同學(xué)終于可以拋棄它了。
六、for/in語(yǔ)句的支持
這個(gè)特性使Java developer們的代碼更小以及更酷。并且避免了不必要的類型轉(zhuǎn)換。
七、靜態(tài)import的支持
這個(gè)特性最主要的用途我想就是使Java developer們的代碼更酷了。如果搭配枚舉類型,以及printf功能可能讓你寫(xiě)出類似的C風(fēng)格的代碼。
八、線程方面的改進(jìn)在線程方面有各種各樣的改進(jìn),最主要的有三個(gè),添加了Excutor對(duì)象,從此Java developer們可以把線程作為一個(gè)task執(zhí)行,另外,由此,線程的寫(xiě)法也有了徹底的改變;第二,添加了高等synchronizing的支持以及l(fā)ocking地加入;最后,就是原子(atomic)類型的加入。
九、其他
除了以上的主要改進(jìn)以外,還有一些比較重要的修改和增強(qiáng)。譬如說(shuō),加入了printf方法,現(xiàn)在Java也擁有了C語(yǔ)言的經(jīng)典函數(shù);在Array中加入了大量的靜態(tài)方法用來(lái)操作數(shù)組和集合;加入了Queue這種數(shù)據(jù)類型和Comparator這樣一個(gè)排序接口;以及用一個(gè)StringBuilder這個(gè)類使得可以更好的處理Unicode。
第一節(jié):理解XSL?
有一天晚上我做了一個(gè)夢(mèng)。這個(gè)夢(mèng)真嚇人。但如我告訴我的釋夢(mèng)師的,如果你沒(méi)有讀過(guò)寫(xiě)使用XML和我媽媽的菜譜賺錢的計(jì)劃,這個(gè)夢(mèng)就沒(méi)什么意義。
不管怎么說(shuō),這個(gè)夢(mèng)......
那是在公元2001年,我用我媽媽的菜譜建立了一個(gè)網(wǎng)站,而且行得不錯(cuò)。網(wǎng)站的節(jié)讀數(shù)很高,得到的反饋也很多。后來(lái)就到了電話,是Michael?Ovitz打來(lái)的。他告訴我他回來(lái)做生意,想把這些菜譜作為事業(yè)的起點(diǎn)。他認(rèn)為其潛力不僅僅在于它一份菜譜,而是Sally?Field領(lǐng)銜出演的一系列關(guān)于與恐怖份做斗爭(zhēng)的身懷絕藝的技藝精湛的廚師的電影。他所要的是一250個(gè)菜譜的標(biāo)題和它們組成成分的清單。而且他希望在15分內(nèi)得到它們。我狂喜,我顫栗,然后我意識(shí)到我用的是HTML。
我從尖叫中醒來(lái)?-?冷汗順著我的臉往下淌。
為什么是個(gè)噩夢(mèng)呢?夢(mèng)中的是發(fā)生在將來(lái),一個(gè)XML和它的同伴XSL(擴(kuò)展樣式表?-?eXtensible?Stylesheet?Languange)被廣泛使用的時(shí)代。即使這樣,我用HTML建立我的整個(gè)菜譜網(wǎng)站,不是XML。而且,HTML就是HTML?-?我沒(méi)有辦法從中通過(guò)拷貝粘貼提取想要的信息。CSS此時(shí)也毫無(wú)用處。但是如果我在夢(mèng)用了XSL,我就會(huì)很快產(chǎn)生那份清單,然后快樂(lè)地從別人的天和努力中榨取利益。
然而現(xiàn)在,XSL的允諾只是一個(gè)夢(mèng)。關(guān)鍵在于從W3C的第一份草稿到發(fā)布第一份推薦稿至少要八個(gè)月(或至少一年)的時(shí)間。在完成之前,其規(guī)范可能要做根本性的改變。
盡管這樣,微軟還是正在打算在其IE?5的第二個(gè)beta版中支持XSL現(xiàn)有草稿的功能。坦率地說(shuō),我不知道為什么它會(huì)在這上面耗費(fèi)資源。因?yàn)檫@件事對(duì)每個(gè)人來(lái)說(shuō),誰(shuí)都不愿意花費(fèi)時(shí)間在學(xué)習(xí)一種在其實(shí)現(xiàn)之前就過(guò)時(shí)的語(yǔ)言。
雖然如此,但理解XSL的要點(diǎn)還是很重要的?-?它會(huì)使Web開(kāi)發(fā)者的生活更容易些。如果對(duì)XSL一無(wú)所知,對(duì)被經(jīng)常吹捧的XML的一些優(yōu)點(diǎn)的理解就會(huì)有困難。
那么就讓我們看看其中的一些基本概念?-?不太可能改變的東西。
第二節(jié):攀登結(jié)果樹(shù)
你從本文中學(xué)到的最重要的一點(diǎn)是XSL不僅僅是應(yīng)用樣式。當(dāng)使用XML處理器時(shí),XSL源文檔中的信息將被評(píng)價(jià)、重新安排,然后重新組裝。我們最終得到的不只是XML數(shù)據(jù)的可愛(ài)的版本?-?而是可以被容易地添加、修改和重新排序的靈活的源信息。這個(gè)最終產(chǎn)品叫做結(jié)果樹(shù)(Result?Tree)。
這通過(guò)一系列測(cè)試產(chǎn)生。下面是一個(gè)簡(jiǎn)單的例子:
???<xsl:template?match="recipe_name">
?????<P>
???????<xsl:process-children/>
?????</P>
???</xsl:template>
最先要解釋的是以"/"?結(jié)束的標(biāo)記符是空的。即此種類型的標(biāo)記符的起始和結(jié)束標(biāo)記符之前什么也不發(fā)生。在HTML中類似的例子是<img>標(biāo)記符。因?yàn)橐粋€(gè)圖像所需的所有信息都包含在一個(gè)標(biāo)記符中,所以就沒(méi)有必要存在結(jié)束標(biāo)記符</img>。組織良好的XML文檔可以接受空標(biāo)記符,同時(shí)XSL樣式表必須是組織良好的XML。
讓我們?cè)倩氐嚼?,它告訴XSL處理器如果發(fā)現(xiàn)一套<recipe_name>標(biāo)記符,就應(yīng)該分離出內(nèi)容然后用<p>和</p>包圍起來(lái)?;蛘?,如果你想炫耀你的XSL的知識(shí),你可以說(shuō)“添加到結(jié)果樹(shù)中?!?/p>
這是一個(gè)相當(dāng)簡(jiǎn)單的測(cè)試,而且很典型。XML元素的內(nèi)容被表現(xiàn)信息所包圍。
現(xiàn)在讓我們看看書(shū)寫(xiě)菜譜的XSL樣式表的完整例子。
在我講述更多的XSL標(biāo)記之前,我要解釋一個(gè)可能被問(wèn)到的問(wèn)題。誰(shuí)都知道在HTML中<p>本身就足夠了,那么我為什么要使用結(jié)束的</p>標(biāo)記符呢?
有人能回答嗎?答案是:沒(méi)有對(duì)應(yīng)的結(jié)束標(biāo)記符,那部分就不是組織良好的XML,于是會(huì)產(chǎn)生一個(gè)致命的錯(cuò)誤。
第三節(jié):一個(gè)XSL樣式表
下面是一個(gè)完整的樣式表。
<xsl:stylesheet>
???<xsl:template?match?=?"/">
?????<HTML>
?????<BODY>
?????????<xsl:process-children/>
?????</BODY>
?????</HTML>
???</xsl:template>
???<xsl:template?match?=?"author">
?????????<H1>
?????????<xsl:process-children/>'s?fabulous
?????????</H1>
???</xsl:template>
???<xsl:template?match?=?"recipe_name">
??????<H2>
??????<xsl:process-children/>
??????</H2>
???</xsl:template>
???<xsl:template?match?=?"meal">
??????<TABLE><TR><TD><H3>EAT?FOR:</H3></TD>
??????<TD><H3><xsl:process-children/></H3></TD>
??????</TR></TABLE>
???</xsl:template>
???<xsl:template?match?=?"directions">
??????<H4>DIRECTIONS</H4>
??????<P>
??????<xsl:process-children/>
??????</P>
???</xsl:template>
???<xsl:template?match?=?"ingredients">
???????<B>INGREDIENTS</B><BR></BR>
???????<xsl:process-children/>
???</xsl:template>
???<xsl:template?match?=?"item">
???????<BR>
??????<xsl:process-children/>
??????</BR>
???</xsl:template>
</xsl:stylesheet>
其結(jié)果不會(huì)使我得到任何設(shè)計(jì)獎(jiǎng),但是它是一個(gè)能起作用的XSL。這里可能只有下面的命令需要解釋:
??<xsl:template?match?=?"/">
????<HTML>
?????<BODY>
?????????<xsl:process-children/>
?????</BODY>
?????</HTML>
?</xsl:template>
第一行的"/"告訴處理器這個(gè)節(jié)點(diǎn)應(yīng)用到XML文檔的根上。于是,這部分中的命令是結(jié)果樹(shù)的基礎(chǔ)。處理器被告之把<HTML>和<BODY>標(biāo)記符放在文檔的開(kāi)始和結(jié)尾處,然后處理或打印所有的子元素。因?yàn)樗歉?,所以意味著“打印所有的東西?!?/p>
現(xiàn)在,如果你考慮幾秒鐘,就會(huì)覺(jué)得有點(diǎn)古怪。如果根層的process-children命令把源代碼傳遞給結(jié)果樹(shù),那么所有與模板匹配的節(jié)點(diǎn)都可以與已經(jīng)經(jīng)過(guò)處理的源碼一起工作。
然而,出現(xiàn)的問(wèn)題是:XSL有一套確定哪些內(nèi)容被傳遞給結(jié)果樹(shù)的規(guī)則,其中最重要的規(guī)則是,最特定的匹配將會(huì)贏。顯然,元素名的模板匹配比根層的匹配更特定。因此,所有模板匹配的節(jié)點(diǎn)將超越根層的規(guī)則。
注意用XML數(shù)據(jù)添加HTML標(biāo)記符是多么的容易。當(dāng)XSL處理器看到那些不在XSL詞匯表中的標(biāo)記符時(shí),就會(huì)把他們傳遞給結(jié)果樹(shù)。如果你花些時(shí)間,就可能發(fā)現(xiàn)其中巨大的潛力。XSL可以被用做一種轉(zhuǎn)換語(yǔ)言。存儲(chǔ)在一個(gè)XML文件中的數(shù)據(jù)可以用完全不同的標(biāo)記符轉(zhuǎn)換到另一個(gè)文件中。還有,信息可以被修改成與可以對(duì)應(yīng)一套不同的標(biāo)記符集的XML應(yīng)用程序一起工作的形式。
而且還不只這些,如人們所期望的,樣式表可以用匹配的標(biāo)記符打開(kāi)和關(guān)閉,其中是一套組織良好的單元。?很好,但是還有限制。
第四節(jié):選擇XSL
簡(jiǎn)單的<xsl:template?match>還不能完全滿足我們的要求。比如,我希望當(dāng)<course>標(biāo)記符出現(xiàn)時(shí)取消<meal>標(biāo)記符的內(nèi)容。這樣的話我就不用擔(dān)心節(jié)面上同時(shí)顯示"dinner"和"appetizer"。我可能還希望通過(guò)在最后的ingredient后面插入大量的空白來(lái)調(diào)整版面。
如同某個(gè)廣告部的人說(shuō)的:所有這些都是可能的?-?還要更多。SL有一套用來(lái)把元素與其父成員或子成員匹配的工具。它也允許位置上的匹配。例如,可以在第一個(gè)和最后一個(gè)某個(gè)特定元素上應(yīng)用特定的格式,等等。
現(xiàn)在讓我們考慮一些更復(fù)雜的事,比如令我在夢(mèng)中出汗的任務(wù)。我需要菜譜名和它們的成分的清單?,F(xiàn)在,如果我的網(wǎng)頁(yè)與數(shù)據(jù)庫(kù)沒(méi)有聯(lián)系,我就不得不寫(xiě)一個(gè)查詢語(yǔ)句。因?yàn)槲覍?duì)SQL不太熟,所以需要得到的DBA幫助。但是如果知道XSL,我就會(huì)擺脫這些麻煩。
<xsl:style?sheet>
???<xsl:template?match?=?"/">
??????<xsl:for-each?select?="list/recipe">
?????????<TABLE>
?????????<TR><TD>
?????????<xsl:process?select?=?"recipe_name"/></TD>
?????????<TD>
????????????<xsl:for-each?select?=?"ingredients/item">
???????????????<BR><xsl:process-children/></BR>
????????????</xsl:for-each>
?????????</TD></TR>
?????????</TABLE>
??????</xsl:for-each>
???</xsl:template>
</xsl:stylesheet>
結(jié)果并不神奇。但是在table標(biāo)記符中加些花樣將沒(méi)問(wèn)題。顯然,我在XML中存儲(chǔ)了信息,但是我認(rèn)為最好還是仔細(xì)看看。
???<xsl:template?match?=?"/">
??????<xsl:for-each?select?="list/recipe">
第一行很熟悉,只是簡(jiǎn)單地與模板相匹配。但是第二行卻有些不同?-?在元素清單中出現(xiàn)的每個(gè)菜譜元素做每件事,直到</xsl:for-each>標(biāo)記符。然后我開(kāi)始HTML表格,用<xsl:process?select="recipe_name"/>標(biāo)記符把recipe_name元素中的內(nèi)容輸出到表格單元中。在關(guān)閉第一個(gè)表格單元后,事情開(kāi)始變酷。下一行(<xsl:for-each?select="ingredient/item">)開(kāi)始一個(gè)附加的嵌套循環(huán),允許我把全部ingredient輸出到合適的顯示信息中。樣式表的其余部分應(yīng)該很好理解。
但是等等,我知道你在想:“他說(shuō)過(guò)酷了嗎?什么這么酷?”
for-each函數(shù)是XSL的幾個(gè)程序化的特征之一。還有if-then和選擇函數(shù)。這些特征允許任何人都可以以任何能想到的方式(或至少是可行的方式)容易地操縱XML內(nèi)容。如果你能實(shí)現(xiàn)這些特征,就很酷。
第五節(jié):從規(guī)范到實(shí)現(xiàn)
既然你已經(jīng)看到XML的一些功能,那么我想提出一個(gè)問(wèn)題:通過(guò)把內(nèi)容分離到組織良好和有效的XML文件中,XML對(duì)這些內(nèi)容有哪些不能做的呢?如我前面顯示的,數(shù)據(jù)可以被操縱然后放入你選擇的版面中?;蛘邤?shù)據(jù)可以被處理成可以被其它應(yīng)用程序使用的形式。那么,還有其它的嗎?
我們?cè)僖淮蚊鎸?duì)擴(kuò)展性的核心。一旦定義了數(shù)據(jù),我們可以做任何想做的事。如果我們來(lái)到一個(gè)有能處理XML的字處理、電子表格和表現(xiàn)程序的時(shí)代,同一套數(shù)據(jù)幾乎可以被用在任何用途上。
但是,哎!這依然是個(gè)夢(mèng)。
我們只能希望瀏覽器能實(shí)現(xiàn)這些功能,但是我們沒(méi)有理由樂(lè)觀。即使Tim?Bray,XML的教父,也說(shuō)過(guò)對(duì)XSL的嘗試只能在CSS標(biāo)準(zhǔn)完全實(shí)現(xiàn)之后才能實(shí)現(xiàn)。誰(shuí)知道什么時(shí)候才能實(shí)現(xiàn)呢?而且這也不是唯一的問(wèn)題。
XSL要排除另一個(gè)障礙。XSL規(guī)范有兩個(gè)截然不同的部分。第一部分,是我們這里討論的,處理數(shù)據(jù)結(jié)構(gòu)。另一部分是一套用來(lái)應(yīng)用樣式的有格式的對(duì)象。這部分需要做大量工作。在我看來(lái),現(xiàn)在需要很多人去做很多事。例如,應(yīng)該有既適合屏幕又適合打印輸出的命令。如果規(guī)范的制定者繼續(xù)這種“無(wú)所不包”的嘗試,此規(guī)范將最終很難實(shí)現(xiàn),而且最終用戶用起來(lái)也困難。但是現(xiàn)在,我們做不了什么?-?只能過(guò)我們自己快樂(lè)的小日子,同時(shí)盼望負(fù)責(zé)的同志們別把事情弄糟。
在這期間,做了甜夢(mèng)吧!
---
轉(zhuǎn)載自 http://bbs.xml.org.cn/dispbbs.asp?boardID=8&ID=7632