2.手寫,spring+hibernate配置
3.JavaScript時(shí)間和如何實(shí)現(xiàn)繼承
其他略忘了
小菜毛毛技術(shù)分享與大家共同成長 |
1.hibernate中配置int和integer的區(qū)別
2.手寫,spring+hibernate配置 3.JavaScript時(shí)間和如何實(shí)現(xiàn)繼承 其他略忘了
下面的安裝以myeclipse6.0為例
一、下載: http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download(jdaclipse插件主頁) 下載插件:
This release stream is appropriate for Eclipse 3.3.
This release stream is appropriate for Eclipse 3.2.
This release stream is appropriate for Eclipse 3.1.
myeclipse6.0 就下載JadClipse 3.3
下載Jad反編譯工具: 二、安裝: Eclipse中的插件安裝可以參考: 方法2、使用link方式安裝,建立D:"Myplugins"jadclipse3.2.4"eclipse"plugins的目錄結(jié)構(gòu),將jadclipse_3.2.4.jar放到plugins目錄下面(注:其中D:"Myplugins為你自己定義的一個(gè)專門放置插件的目錄)。再在%ECLIPSE_HOME%"links目錄下面建立一個(gè)jadclipse3.2.4.link文件(該文件名隨便取)。文件里面內(nèi)容為:path=D:/Myplugins/jadclipse3.2.4. (一)啟動(dòng)eclipse,打開Window->Preferences->Java->JadClipse,如果沒有找到JadClipse,即JadClipse插件沒有激活。 (1)檢查插件安裝的版 本是否與你安裝的eclipse版本對(duì)應(yīng) (2)使用 –clean參數(shù)來啟動(dòng)eclipse (二)在使用JadClipse插件反編譯class文件時(shí)出現(xiàn)如下類似錯(cuò)誤: /*jadclipse*/
/*
DECOMPILATION REPORT
Decompiled from: D:"Program Files"Java"jdk1.5.0_12"jre"lib"rt.jar
Total time: 16 ms
Jad reported messages/errors:
Exit status: 0
Caught exceptions:
java.io.IOException: CreateProcess: (...)
請(qǐng)確保你的Jad路徑在eclipse中正確制定。 至于Window->Preferences->Java->JadClipse目錄下的Debug,Directives,Formatting,Misc目錄中的參數(shù) 設(shè)置,就不再羅嗦了。 (三)安裝完成后,eclipse沒有自動(dòng)將JadClipse Class File Viewer設(shè)置成class文件的缺省打開方式。 如果沒有默認(rèn),可以在Eclipse的Windows—> Perference—>General->Editors->File Associations中修改“*.class”默認(rèn)關(guān)聯(lián)的編輯器為“JadClipse Class File Viewer”。設(shè)置完成后,雙擊*.class文件,eclipse將自動(dòng)反編譯。OGNL介紹 我們通過表達(dá)式向堆棧對(duì)象操作時(shí),我們并不知道堆棧中有哪些對(duì)象。OgnlValueStack會(huì)根據(jù)堆棧由上向下的順序(先入棧在下面,最后入棧
在最上面)依次去查找與表達(dá)式匹配的對(duì)象方法,找到即進(jìn)行相應(yīng)的存取操作。假設(shè)后面對(duì)象也有相同的方法,將不會(huì)被調(diào)用。
axis2創(chuàng)建web service(一)
http://blog.csdn.net/chnic/archive/2008/03 /13/2179760.aspx http://www.javaeye.com/topic/284387 axis2 是新一代的web service開發(fā)工具,它會(huì)讓你的web service開發(fā)變得輕松,快捷。下面讓我們以一個(gè)實(shí)際的例子來體驗(yàn)一下。 首先,工欲善其事,必先利其器。就讓我們先做好一些必備的準(zhǔn)備工作吧。
1.下載axis2 的2進(jìn)制的包和war,現(xiàn)在的最新版本是1.4.1 發(fā)布時(shí)間是2008-8-25 具體的1.4.1版本的http://ws.apache.org/axis2/download/1_4_1/download.cgi 2.把下載后的war放入tomcat的webapps目錄里,然后啟動(dòng)tomcat,這樣war包就會(huì)自動(dòng)解壓為目錄axis2 在瀏覽器中輸入http://localhost:8080/axis2/ ,如果一切正常你會(huì)看到下面的畫面
下載地址是
http://www.apache.org/dyn/mirrors/mirrors.cgi/ws/axis2/tools/1_4_1/axis2-eclipse-codegen-wizard.zip 下載完2個(gè)壓縮文件后,可以直接把解壓后的文件拷貝到plugins目錄中,也可以在links目錄中寫文件路徑的方式來安裝插件,安裝完插件后, 打開eclipse,在package explorer 中點(diǎn)擊右鍵--->選擇new---->other 如果安裝正確你會(huì)看到
開發(fā)的過程,下回分解。。。。。
工具都已經(jīng)準(zhǔn)備齊全了。我們來動(dòng)手做一個(gè)小例子來小試牛刀! 這一節(jié)我們先利用axis2來發(fā)布一個(gè)web service 的服務(wù),然后在下一節(jié)我們做一客戶端來調(diào)用這個(gè)服務(wù)。 我們的服務(wù)很簡單的,就是輸入一個(gè)字符串,然后打印出一段字符串。 代碼很簡單,主要是測(cè)試用。 Java代碼
主要的過程就是如何利用axis2的eclispe插件來發(fā)布這個(gè)服務(wù)啦。 1。在eclispe 的package Explorer 中點(diǎn)擊右鍵,在菜單中選擇新建--->other...----->Axis2 Service Archiver
2.然后點(diǎn)擊next進(jìn)入了類選擇頁面,在這個(gè)頁面中的Class File Location選擇框中選擇類所在的文件夾。
4. 點(diǎn)擊next之后,進(jìn)入的是選擇jar文件的頁面,這里我們沒有外部的jar,所以點(diǎn)擊next直接跳過這個(gè)頁面。
Generate the service xml automatically這一項(xiàng)
在output File Name中輸入artiver文件的名稱。我起的名字是simpleServer
8.接下來,我們就可以把這個(gè)aar文件放入tomcat中發(fā)布,首先把生成的aar文件拷貝到tomcat目錄中的axis2項(xiàng)目的 service目錄中位置如圖。
9.接下來啟動(dòng)tomcat,在地址欄中輸入http://localhost:8080/axis2 , 你會(huì)看到axis2的歡迎畫面
10.點(diǎn)擊Service連接,你會(huì)看到發(fā)布的服務(wù)列表。這里面就能看到我們發(fā)布的simpleService
![]() 1.在eclispe 的package Explorer 中點(diǎn)擊右鍵,在菜單中選擇新建--->other...----->Axis2 Code Generator
2.點(diǎn)擊next,進(jìn)入下一個(gè)頁面,選擇從wsdl文件來產(chǎn)生java文件。
3. 點(diǎn)擊next,然后選擇wsdl文件,注意此處要填寫上一節(jié)我們
4.點(diǎn)擊next,進(jìn)入設(shè)置頁面,這里我們就用默認(rèn)的設(shè)置。
5. 點(diǎn)擊next,選擇輸出文件的路徑。
除了把backport-util-
concurrent-2.2.jar加到lib中, 加<library
name="lib/backport-util-concurrent-2.2.jar">
<export name="*"/> </library> 到plugsin.xml 還要 1. 把Axis2_Codegen_wizard_1.3.0(eclipse/plugins/Axis2_Codegen_wizard_1.3.0)的 名字改成Axis2_Codegen_wizard_1.4.0 2. 在plugin.xml中在<plugin>中 把Axis2_Codegen_wizard的version="1.3.0"改成version="1.3.0" 在MyEclipse6.5中會(huì)報(bào)錯(cuò):
An error ocurred while completing process -java.lang.reflect.InvocationTargetException 主要的問題在于 Code Generator plugin 內(nèi)缺少了 backport-util-concurrent-3.1.jar 包和geronimo-stax-api_1.0_spec-1.0.1.jar 包。 [解決方案] : 1.關(guān)閉 Eclipse 2.copy %AXIS2_HOME%"lib" 下的 backport-util-concurrent-3.1.jar 和 backport-util-concurrent-3.1.jar 復(fù)制到 MyEclipse 6.5"eclipse"plugins"Axis2_Codegen_Wizard_1.3.0"lib 文件夾下。 3.注冊(cè)此 jar 包: 修改MyEclipse 6.5"eclipse"plugins"Axis2_Codegen_Wizard_1.3.0"plugin.xml 文件 在 <runtime> 內(nèi)加入下面的字串 <library name="lib/geronimo-stax-api_1.0_spec-1.0.1.jar"> <export name="*"/> </library> <library name="lib/backport-util-concurrent-3.1.jar"> <export name="*"/> </library> 到plugin.xml文件中,保存后重新啟動(dòng)Eclipse即可。 ) 6.點(diǎn)擊next,如果看到這個(gè)頁面,恭喜你已經(jīng)生成代碼成功。 7.在package Explorer中刷新一下項(xiàng)目,然后你發(fā)現(xiàn)出現(xiàn)2個(gè)新的文件SimpleServerStub和 SimpleServerCallbackHandler 。打開SimpleServerStub你會(huì)驚喜的發(fā)現(xiàn)。著名的小紅叉一個(gè)接一個(gè)的 這是因?yàn)闆]有axis2的類包。我們可以在下載的axis2-1.4.1-bin中找到lib包,把其中的jar都加入我們的工程中。 然后重新編譯一下工程,這時(shí)我們發(fā)現(xiàn)SimpleServerStub還是有幾個(gè)小紅叉。這個(gè)是因?yàn)檫@個(gè)插件有個(gè)小bug。 生成的代碼沒有實(shí)現(xiàn)序列化方法。我們可以自己來加上,在小紅叉上點(diǎn)一下,彈出一個(gè)小菜單,選擇 Add unimplemented methods .
8. Java代碼
如果一切正常,你就會(huì)看到結(jié)果 log4j:WARN No appenders could be found for logger
(org.apache.axis2.description.AxisService). 調(diào)用服務(wù)成功。這是個(gè)簡單的例子,下節(jié)我們?cè)僮鲆粋€(gè)復(fù)雜一點(diǎn)的例子,來更好的學(xué)習(xí)axis2
我們2005年底就做了一個(gè)Wap網(wǎng)站“WAP一把刀實(shí)用查詢大全”,當(dāng)
時(shí)沒有統(tǒng)計(jì)、沒有廣告,只有簡單的免費(fèi)服務(wù)功能。
2007年Google推出AdSense for Mobile的時(shí)候,我們對(duì)Wap網(wǎng)站代碼進(jìn)行了一些整理,以方便統(tǒng)一加入廣告代碼,同時(shí)我們也加入了一段某公司提供的Wap統(tǒng)計(jì)代碼,可惜做Wap統(tǒng)計(jì) 這樣的免費(fèi)功能只有投入沒有收入,一般公司都不愿意長久做,所以都沒能用很長時(shí)間,換了1、2次統(tǒng)計(jì)代碼后我們也放棄了統(tǒng)計(jì),就從AdSense中的分渠 道統(tǒng)計(jì)移動(dòng)廣告收入的數(shù)據(jù)來大概知道網(wǎng)站的訪問流量。 今年從Analytics的英文官方博客中看到Google終于承擔(dān)起這個(gè)免費(fèi)的Wap統(tǒng)計(jì)任務(wù),不過我忙于其它事情,一直沒有加上代 碼試試。 前些天AdSense移動(dòng)廣告的代碼要求更新,但我們用新代碼卻無法正常訪問,已經(jīng)給Google的人寫郵件詢問去了,等待答復(fù)中。 昨天在為其它Web網(wǎng)站添加Google Webmastertools中的站點(diǎn)地圖時(shí),順便把wap.18dao.com也驗(yàn)證加入了,然后試著將Analytics的移動(dòng)統(tǒng)計(jì)代碼加入,這個(gè)代 碼可以從“Analytics(分析)設(shè)置 - 配置文件設(shè)置 - 檢查狀態(tài) - 跟蹤代碼 - 高級(jí)”中選擇“針對(duì)手機(jī)創(chuàng)建的網(wǎng)站”,可以提供“選擇您的移動(dòng)網(wǎng)站的服務(wù)器端語言”為:
我們以前是用JSP開發(fā)的,選擇JSP后提示: 將代碼粘貼到您的移動(dòng)網(wǎng)站 我們以前開發(fā)時(shí),用的wml 1.x,根本就沒有<html>和</body>標(biāo)記,不過有對(duì)應(yīng)的<wml>和</card>,我一 步一步按照上面的要求設(shè)置了。順便還把以前瀏覽器報(bào)錯(cuò)的地方統(tǒng)一批量修改替換掉。 有幾個(gè)特別說明的地方:
從實(shí)際運(yùn)行的情況看,對(duì)Wap網(wǎng)站沒有特別的影響,也沒有像以前其他小公司搞的統(tǒng)計(jì)代碼都帶個(gè)圖標(biāo)鏈接,Analytics的wap和web版 本一樣,都不在網(wǎng)頁中顯示任何內(nèi)容。 登錄Analytics后臺(tái)已經(jīng)可以看到有統(tǒng)計(jì)數(shù)據(jù)產(chǎn)生了,wap網(wǎng)站的統(tǒng)計(jì)數(shù)據(jù)和web網(wǎng)站的統(tǒng)計(jì)數(shù)據(jù)差不多全面,比以前的其它免費(fèi) wap統(tǒng)計(jì)都強(qiáng)很多,不僅僅是簡單的訪問數(shù)據(jù)統(tǒng)計(jì),更重要的還有各種分析功能。我準(zhǔn)備打開Analytics與AdSense結(jié)合的功能看看能否還統(tǒng)計(jì)出 AdSense的情況,另外也打開內(nèi)部搜索統(tǒng)計(jì)試一試,有新的發(fā)現(xiàn)后再補(bǔ)充在日志中。 用Analytics中的Wap統(tǒng)計(jì)有一點(diǎn)最放心:不用害怕Google過一陣子不再提供這個(gè)服務(wù)了。
有關(guān)插件安裝問題,四種常用的方法在此特別注明:
1. “幫助”->“軟件更新”->“查找并安裝”->“搜索要安裝的新功能部件”->“新建遠(yuǎn)程站點(diǎn)”(此種方式用于在線更新) 2. “幫助”->“軟件更新”->“查找并安裝”->“搜索要安裝的新功能部件”->“新建本地站點(diǎn)”(如果插件已經(jīng)下載到了本地,請(qǐng)不要用第一種方法) 3. 直接拷貝plugins和features兩個(gè)目錄下的內(nèi)容置于$Eclipse_Home$/對(duì)應(yīng)的plugins和features下面 4. 用link外鏈接與外部插件關(guān)聯(lián)
所以,如果插件已經(jīng)下載到了本地,請(qǐng)直接拷貝至$Eclipse_Home$/對(duì)應(yīng)的plugins和features目錄下,也就是用方法三,這樣能避免沖突。 方法四是將所有的插件用一個(gè)外部目錄存放起來,假如是D:\plug-in,將上面所示的插件目錄文件全部拷貝到該目錄下,比如Tomcat插件,
此時(shí)的文件路徑就是D:\plug-in\tomcat_plug\eclipse\plugins\
com.sysdeo.eclipse.tomcat_3.1.0.beta(請(qǐng)注意,方法四一定要嚴(yán)格這樣的目錄路徑放置文件)。然后在$
Eclipse_Home$下新建一個(gè)links目錄,并在links目錄下建立關(guān)聯(lián)文件,假如是tomcat.link,在建立的關(guān)聯(lián)文件中加入如下語
句: 用SAX解析xml文件的例子
2008-07-15 09:46
1. Xml技術(shù)簡介
Xml文件有兩種約束類型,包括文檔類型定義(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的標(biāo)準(zhǔn)里。Xml 模式被包含在W3C的標(biāo)準(zhǔn)中。在xml 數(shù)據(jù)和xml 模式兩者之間有很多的區(qū)別。 A. xml模式支持的數(shù)據(jù)類型比xml DTD多; B. xml模式在無序的情況下使用起來比xml DTD更方便; C. xml模式支持名字空間,可以在不同的文件中定義相同的方法等。 D. xml模式形成的文檔可以被多種標(biāo)準(zhǔn)解析,如dom,sax或者jdom等,而xml DTD方式下確不行。 2. Xml文件解析 在java語言環(huán)境里可以使用三種方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。 SAX提供了基于事件的方式進(jìn)行解析,適合于快速,數(shù)據(jù)量小的解析情況。SAX解析有幾個(gè)缺陷:A.它的解析是連續(xù)的;B.數(shù)據(jù)無法回朔。 DOM解析不同于SAX。它提供了內(nèi)存中完整的xml數(shù)據(jù)映像,數(shù)據(jù)被存儲(chǔ)在樹狀結(jié)構(gòu)中。DOM解析方式更容易獲得和處理數(shù)據(jù)。 JDOM是java語言中特有的,主要用來支持xpath標(biāo)準(zhǔn)。 3. SAX解析方式 上面我簡要介紹了幾種解析xml文件的技術(shù),這里我們使用SAX技術(shù)給出一個(gè)小例子,大家可以從這個(gè)例子中發(fā)現(xiàn)如果你能夠掌握一些開源軟件包,你就可以很 快掌握解析xml數(shù)據(jù)的技術(shù)。 3.1制作一個(gè)簡單的xml文件component.xml <?xml version="1.0"?> 3.2下載xerces.jar軟件包 在Apache網(wǎng)站上×××下載xerces.jar軟件包,這個(gè)包中包含了上面我們列舉的幾種解析xml數(shù)據(jù)的API。然后將這個(gè)軟件包加入到程序的 classpath中。 3.3制作解析類MySaxParser.java import java.io.IOException; 總結(jié),雖然解析xml數(shù)據(jù)很復(fù)雜,因?yàn)樯婕傲撕芏嗟倪f歸算法,但是我們可以使用業(yè)界比較成熟的解析API來進(jìn)行xml數(shù)據(jù)處理。我現(xiàn)在只是給出了一個(gè)非常 簡單的例子,但是在真實(shí)系統(tǒng)中遠(yuǎn)比這個(gè)要復(fù)雜的多,大家以后在使用的使用會(huì)發(fā)現(xiàn)還是有很多的工作要做的。 一、 前言 用 Java解析XML文檔,最常用的有兩種方法:使用基于事件的XML簡單API(Simple API for XML)稱為SAX和基于樹和節(jié)點(diǎn)的文檔對(duì)象模型(Document Object Module)稱為DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口來使用SAX和DOM,通過JAXP,我們可以使用任何與JAXP兼容的XML解析器。 JAXP接口包含了三個(gè)包: (1) org.w3c.dom W3C推薦的用于XML標(biāo)準(zhǔn)規(guī)劃文檔對(duì)象模型的接口。 (2) org.xml.sax 用于對(duì)XML進(jìn)行語法分析的事件驅(qū)動(dòng)的XML簡單API(SAX) (3) javax.xml.parsers解析器工廠工具,程序員獲得并配置特殊的特殊語法分析器。 二、 前提 DOM編程不要其它的依賴包,因?yàn)镴DK里自帶的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以滿意條件了。 三、 使用SAX解析XML文檔 SAX是基于事件的簡單API,同樣的我們也是用一個(gè)最簡單的例子來看看SAX是如何解析XML的 先來看看我們要解析的XML代碼吧 <?xml version="1.0" encoding="gb2312"?> <books> <book email="zhoujunhui"> <name addr="address">rjzjh</name> <price>jjjjjj</price> </book> </books> 簡單的不能再簡單了。但是該有的都有了,根元素、屬性、子節(jié)點(diǎn)。好了,能反應(yīng)問題就行了,下面來看看解析這個(gè)XML文件的Java代碼吧! 1 public class SaxParse { 2 public SaxParse(){ 3 SAXParserFactory saxfac=SAXParserFactory.newInstance(); 4 try { 5 SAXParser saxparser=saxfac.newSAXParser(); 6 InputStream is=new FileInputStream("bin/library.xml"); 7 saxparser.parse(is,new MySAXHandler()); 8 } catch (ParserConfigurationException e) { 9 e.printStackTrace(); 10 } catch (SAXException e) { 11 e.printStackTrace(); 12 } catch (FileNotFoundException e) { 13 e.printStackTrace(); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 } 18 public static void main(String[] args) { 19 new SaxParse(); 20 } 21 } 這段代碼比較短,因?yàn)镾AX是事件驅(qū)動(dòng)的,它的大部分實(shí)現(xiàn)在在另一個(gè)Java文件中,先別管另一個(gè)文件,我們來一個(gè)個(gè)地分析吧! (1)得到SAX解析器的工廠實(shí)例 3 SAXParserFactory saxfac=SAXParserFactory.newInstance(); 這是一個(gè)javax.xml.parsers.SAXParserFactory類的實(shí)例 (2)從SAX工廠實(shí)例中獲得SAX解析器 5 SAXParser saxparser=saxfac.newSAXParser(); 使用javax.xml.parsers.SAXParserFactory工廠的newSAXParser()方法 (3)把要解析的XML文檔轉(zhuǎn)化為輸入流,以便DOM解析器解析它 6 InputStream is=new FileInputStream("bin/library.xml"); InputStream是一個(gè)接口。 (4)解析XML文檔 7 saxparser.parse(is,new MySAXHandler()); 后面就不用看了,都是些沒用的代碼(相對(duì)而言),夠簡單的吧! 注意了,我們新建了一個(gè)實(shí)例new MySAXHandler()這個(gè)實(shí)例里面又有什么東西呢? 這個(gè)實(shí)例就是SAX的精華所在。我們使用SAX解析器時(shí),必須實(shí)現(xiàn)內(nèi)容處理器ContentHandler接口中的一些回調(diào)方法,然而我們不須要全部地實(shí)現(xiàn)這些方法,還好,我們有org.xml.sax.helpers.DefaultHandler類,看它的類申明: public class DefaultHandler implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler 實(shí)現(xiàn)了這么多接口啊,其它的先不管了,至少它實(shí)現(xiàn)了ContentHandler這一接口。 好了,看看這個(gè)類有些什么吧?下面是它的Java代碼! public class MySAXHandler extends DefaultHandler { boolean hasAttribute=false; Attributes attributes=null; /* (非 Javadoc) * @see org.xml.sax.helpers.DefaultHandler#startDocument() */ public void startDocument() throws SAXException { System.out.println("文檔開始打印了"); } /* (非 Javadoc) * @see org.xml.sax.helpers.DefaultHandler#endDocument() */ public void endDocument() throws SAXException { System.out.println("文檔打印結(jié)束了"); } /* (非 Javadoc) * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("books")){ return; } if(qName.equals("book")){ System.out.println(attributes.getQName(0)+attributes.getValue(0)); } if(attributes.getLength()>0){ this.attributes=attributes; this.hasAttribute=true; } } /* (非 Javadoc) * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String uri, String localName, String qName) throws SAXException { if(hasAttribute&&(attributes!=null)){ for(int i=0;i<attributes.getLength();i++){ System.out.println(attributes.getQName(0)+attributes.getValue(0)); } } } /* (非 Javadoc) * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) */ public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch,start,length)); }
} 不要看它一大堆,我一一分解給大家看。我們說SAX是基于事件的API,我們這個(gè)類實(shí)到了ContentHandler接口中的如下方法: (1)startDocument() 用于處理文檔解析開始事件 public void startDocument() throws SAXException { System.out.println("文檔開始打印了"); } (2)endDocument() 用于處理文檔解析結(jié)束事件 public void endDocument() throws SAXException { System.out.println("文檔打印結(jié)束了"); } (3)startElement 用于處理元素開始事件 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("books")){ return; } if(qName.equals("book")){ System.out.println(attributes.getQName(0)+attributes.getValue(0)); } if(attributes.getLength()>0){ this.attributes=attributes; this.hasAttribute=true; } } 第二個(gè)參數(shù)String qName表示這個(gè)元素的名字,如: 根節(jié)點(diǎn) <books></books> 它的qName為“books” 最底層節(jié)點(diǎn) <price>jjjjjj</price> 它的qName為“price” 知道這一點(diǎn)上面程序就好解釋了,當(dāng)遇到根元素“books”時(shí)就什么也不做跳過,當(dāng)遇到“book”元素時(shí)就打出它的屬性(它只有一個(gè)屬性<book email="zhoujunhui"></book>)。 當(dāng)是其它節(jié)點(diǎn)時(shí)(這下只剩下最底層的兩個(gè)節(jié)點(diǎn)“name”和“price”了),就把它的屬性取出來存到this.attributes域中,以后中元素結(jié)束事件好處理。 (4)endElement 用于處理元素結(jié)束事件 public void endElement(String uri, String localName, String qName) throws SAXException { if(hasAttribute&&(attributes!=null)){ for(int i=0;i<attributes.getLength();i++){ System.out.println(attributes.getQName(0)+attributes.getValue(0)); } } } 代碼的作用是如果這個(gè)元素的屬性不為空(hasAttribute&&(attributes!=null)),就把它們打印出來。 (5)characters(char[] ch, int start, int length) 處理元素字符的內(nèi)容 public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch,start,length)); } 我們只用了這么幾個(gè)事件,其它還有其的的一些事件,我們只要看一下ContentHandler這個(gè)接口就行了,如: (6)startPrefixMapping(String prefix,String URI) 處理前綴映射開始事件,參數(shù)表示前綴名稱和所指向的URI (7)endPrefixMapping(String prefix,String URI) 處理前綴映射結(jié)束事件,參數(shù)表示前綴名稱和所指向的URI (8)ignorableWhitespace(Char[] ch,int start,int length) 處理元素中可忽略的空格 (9)processingInstruction(String target,String da
當(dāng)你需要處理XML文檔時(shí),你的首要選擇是使用DOM(文檔對(duì)象模型)還是使用SAX(用于XML的簡單API),即當(dāng)前使用的兩個(gè)主要的XML
API。你可以使用任何一種(或者在同一時(shí)間使用兩種)來處理XML文檔,然而DOM將文檔載入到內(nèi)存中處理,而SAX則相反,它可以檢測(cè)一個(gè)即將到來的
XML流,由此并不需要所有的XML代碼同時(shí)載入到內(nèi)存中。
選擇DOM與SAX,與在一個(gè)數(shù)據(jù)庫中的表單與視圖之前選擇一樣:選擇適合于當(dāng)前實(shí)際情況的方法。如果你只是想簡單地查看XML文檔而不處理它,那么請(qǐng)選擇使用SAX。
SAX是Simple API for XML的縮寫,它并不是由W3C官方所提出的標(biāo)準(zhǔn),可以說是“民間”的事實(shí)標(biāo)準(zhǔn)。實(shí)際上,它是一種社區(qū)性質(zhì)的討論產(chǎn)物。雖然如此,在XML中對(duì)SAX的應(yīng)用絲毫不比DOM少,幾乎所有的XML解析器都會(huì)支持它。 與DOM比較而言,SAX是一種輕量型的方法。我們知道,在處理DOM的時(shí)候,我們需要讀入整個(gè)的XML文檔,然后在內(nèi)存中創(chuàng)建DOM樹,生成 DOM樹上的每個(gè)Node對(duì)象。當(dāng)文檔比較小的時(shí)候,這不會(huì)造成什么問題,但是一旦文檔大起來,處理DOM就會(huì)變得相當(dāng)費(fèi)時(shí)費(fèi)力。特別是其對(duì)于內(nèi)存的需 求,也將是成倍的增長,以至于在某些應(yīng)用中使用DOM是一件很不劃算的事(比如在applet中)。這時(shí)候,一個(gè)較好的替代解決方法就是SAX。 SAX在概念上與DOM完全不同。首先,不同于DOM的文檔驅(qū)動(dòng),它是事件驅(qū)動(dòng)的,也就是說,它并不需要讀入整個(gè)文檔,而文檔的讀入過程也就 是SAX的解析過程。所謂事件驅(qū)動(dòng),是指一種基于回調(diào)(callback)機(jī)制的程序運(yùn)行方法。(如果你對(duì)Java新的代理事件模型比較清楚的話,就會(huì)很 容易理解這種機(jī)制了) 在XMLReader接受XML文檔,在讀入XML文檔的過程中就進(jìn)行解析,也就是說讀入文檔的過程和解析的過程是同時(shí)進(jìn)行的,這和DOM區(qū) 別很大。解析開始之前,需要向XMLReader注冊(cè)一個(gè)ContentHandler,也就是相當(dāng)于一個(gè)事件監(jiān)聽器,在ContentHandler中 定義了很多方法,比如startDocument(),它定制了當(dāng)在解析過程中,遇到文檔開始時(shí)應(yīng)該處理的事情。當(dāng)XMLReader讀到合適的內(nèi)容,就 會(huì)拋出相應(yīng)的事件,并把這個(gè)事件的處理權(quán)代理給ContentHandler,調(diào)用其相應(yīng)的方法進(jìn)行響應(yīng) 本文引自:http://blog.csdn.net/allenzue/archive/2008/12/18/3549959.aspx 另有:http://wiki.ubuntu.org.cn/JBoss_5.0.0GA安裝指南 一.下載與安裝JBoss 在本文中,我下載的JBoss版本為:JBOSS5.0 Beta4。 下載地址: http://www.jboss.org/jbossas/downloads/ 在如上的下載頁中下載JBOSS5.0 Beta4.zip文件。 下載完成后,將其解壓縮后即可完成安裝,解壓 縮后將其放置到一個(gè)不帶空格的目錄(若目錄帶有空格,例如:C:"Program Files,日后可能會(huì)產(chǎn)生一些莫名的錯(cuò)誤),eg:E:"JBossJBOSS5.0 Beta4。同時(shí)在“環(huán)境變量設(shè)置”中設(shè)置名為JBOSS_HOME的環(huán)境變量,值為JBoss的安裝路徑,如下圖所示: 在此,JBoss的安裝工作已經(jīng)結(jié)束,可通過如下方式測(cè)試安裝是否成功: 運(yùn)行JBoss安裝目 錄"bin"run.bat,如果窗口中沒有出現(xiàn)異常,且出現(xiàn):10:16:19,765 INFO [Server] JBoss (MX MicroKernel) [5.0.Beta4 (build: SVNTag=5.0.Beta4 date=20080831605)] Started in 30s:828ms字樣,則表示安裝成功。 我們可以通過訪問: http://localhost:8080/ 進(jìn)入JBoss的歡迎界面,點(diǎn)擊JBoss Management下的JMX Console可進(jìn)入JBoss的控制臺(tái)。 若啟動(dòng)失敗,可能由以下原因引起: 1) JBoss所用的端口(8080,1099,1098,8083等)被占用。一般情況下為8080端口被占用(例如,Oracle占用了8080端口), 此時(shí)需要修改JBoss的端口,方法為進(jìn)入JBoss安裝目錄"server"default"deployer"jboss-web.deployer 目錄,修改其下的server.xml目錄,在此文件中搜索8080,將其改成你想要的端口即可(例如8088); 2) JDK安裝不正確; 3) JBoss下載不完全。 二. JBoss 的目錄結(jié)構(gòu)說明
三. JBoss 的配置 1. 日志文件設(shè)置 若需要修改JBoss默認(rèn)的log4j設(shè)置, 可修改JBoss安裝目錄"server"default"conf下的jboss-log4j.xml文件,在該文件中可以看到,log4j的日志輸出 在JBoss安裝目錄"server"default"log下的server.log文件中。對(duì)于log4j的設(shè)置,讀者可以在網(wǎng)上搜索更加詳細(xì)的信 息。 2. web 服務(wù)的端口號(hào)的修改 這點(diǎn)在前文中有所提及,即修改JBoss安裝目錄"server"default"deployer"jboss-web.deployer下的server.xml文件,內(nèi)容如下: <Connector port="8080" address="${jboss.bind.address}" maxThreads="250" maxHttpHeaderSize="8192" emptySessionPath="true" protocol="HTTP/1.1" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" /> 將上面的8080端口修改為你想要的端口即可。重新啟動(dòng)JBoss后訪問:http://localhost/:新設(shè)置的端口,可看到JBoss的歡迎界面。 3. JBoss 的安全設(shè)置 1) jmx-console 登錄的用戶名和密碼設(shè)置 默認(rèn)情況訪問 http://localhost:8080/jmx-console 就可以瀏覽jboss的部署管理的一些信息,不需要輸入用戶名和密碼,使用起來有點(diǎn)安全隱患。下面我們針對(duì)此問題對(duì)jboss進(jìn)行配置,使得訪問jmx-console也必須要知道用戶名和密碼才可進(jìn)去訪問。步驟如下: i) 找到JBoss安裝目錄/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml文件,去掉<security-domain>java:/jaas/jmx-console</security-domain>的注釋。修改后的該文件內(nèi)容為: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ii)修改與i)中的jboss-web.xml同級(jí)目錄下的web.xml文件,查找到<security-constraint/>節(jié)點(diǎn),去掉它的注釋,修改后該部分內(nèi)容為: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在此處可以看出,為登錄配置了角色JBossAdmin。 iii) 在第一步中的jmx-console安全域和第二步中的運(yùn)行角色JBossAdmin都是在login-config.xml中配置,我們?cè)?/span>JBoss安裝目錄/server/default/config下找到它。查找名字為:jmx-console的application-policy: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 在此處可以看出,登錄的角色、用戶等的信息分別在props目錄下的jmx-console-roles.properties和jmx-console-users.properties文件中設(shè)置,分別打開這兩個(gè)文件。 其中jmx-console-users.properties文件的內(nèi)容如下: ![]() ![]() ![]() ![]() 該文件定義的格式為:用戶名=密碼,在該文件中,默認(rèn)定義了一個(gè)用戶名為admin,密碼也為admin的用戶,讀者可將其改成所需的用戶名和密碼。 jmx-console-roles.properties的內(nèi)容如下: ![]() ![]() ![]() ![]() 該文件定義的格式為:用戶名=角色,多個(gè)角色以“,”隔開,該文件默認(rèn)為admin用戶定義了JBossAdmin和HttpInvoker這兩個(gè)角色。 配置完成后讀者可以通過訪問: http://localhost:8088/jmx-console/ ,輸入jmx-console-roles.properties文件中定義的用戶名和密碼,訪問jmx-console的頁面。 四. 在MyEclipse 中配置JBoss 筆者的MyEclipse版本:6.5 GA JBoss版本:5.0 進(jìn)入Window-> Preferences-> MyEclipse -> Application Servers -> JBoss5,進(jìn)行如下設(shè)置: 選擇JBoss 5下的JDK設(shè)置所用的JDK. 好了,開始JBoss之旅吧. |