ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久人体视频,91精品久久久久久9s密挑,国产精品成人vhttp://www.aygfsteel.com/beansoft/category/17555.html<a >《MyEclipse 6 Java 开发中文教½E‹ã€‹å®Œæ•´ç‰ˆä¹¦ç±ä»£ç å?qi¨¢ng)配套超高清讲解视频免费下è?lt;/a>zh-cnSat, 12 Feb 2011 12:36:48 GMTSat, 12 Feb 2011 12:36:48 GMT60使用 StAX 解析 XMLåQŒç¬¬ 1 部分: Streaming API for XML (StAX) ½Ž€ä»‹[转]http://www.aygfsteel.com/beansoft/archive/2010/09/09/331566.htmlBeanSoftBeanSoftThu, 09 Sep 2010 11:23:00 GMThttp://www.aygfsteel.com/beansoft/archive/2010/09/09/331566.html来源: http://www.ibm.com/developerworks/cn/xml/x-stax1.html

使用 StAX 解析 XMLåQŒç¬¬ 1 部分: Streaming API for XML (StAX) ½Ž€ä»?/h3>

探究其基于指针的 APIåQŒå®ƒæŠ?XML ä½œäØ“(f¨´)标记åQˆæˆ–事äšgåQ‰æµæ‹‰å‡º

¾U§åˆ«åQ?中çñ”

Peter Nehrer (pnehrer@ecliptical.ca), 自由撰稿äº? 独立咨询™åùN—®

2007 òq?3 æœ?02 æ—?/p>

Streaming API for XML (StAX) 是用 Javaâ„?语言处理 XML 的最新标准。作ä¸ÞZ¸€¿Ué¢å‘流的方法,无论从性能˜q˜æ˜¯å¯ç”¨æ€§ä¸Šéƒ½ä¼˜äºŽå…¶ä»–方法,å¦?DOM å’?SAX。本¾pÕdˆ—åˆ†äØ“(f¨´) 3 部分åQŒæœ¬æ–‡æ˜¯½W?1 部分åQŒç®€è¦ä»‹¾läº† StAX å?qi¨¢ng)其处ç?XML 的基于指针的 APIã€?/blockquote>

StAX 概述

从一开始,Java API for XML Processing (JAXP) ž®±æä¾›äº†ä¸¤ç§æ–ÒŽ(gu¨©)³•来处ç?XMLåQšæ–‡æ¡£å¯¹è±¡æ¨¡åž‹ï¼ˆDOMåQ‰æ–¹æ³•是用标准的对象模型表示 XML 文档åQ›Simple API for XML (SAX) æ–ÒŽ(gu¨©)³•使用应用½E‹åºæä¾›çš„事件处理程序来处理 XML。JSR-173 提出了一¿Ué¢å‘流的新æ–ÒŽ(gu¨©)³•åQšStreaming API for XML (StAX)。其最¾lˆç‰ˆæœ¬äºŽ 2004 òq?3 月发布,òq¶æˆä¸ÞZº† JAXP 1.4åQˆå°†åŒ…含在即ž®†å‘布的 Java 6 中)的一部分ã€?/p>

å¦‚å…¶åç§°æ‰€æš—ç¤ºçš„é‚£æ øP¼ŒStAX 把重ç‚ÒŽ(gu¨©)”¾åœ?i>‹¹?/i>上。实际上åQŒStAX 与其他方法的区别ž®±åœ¨äºŽåº”用程序能够把 XML ä½œäØ“(f¨´)一个事件流来处理。将 XML ä½œäØ“(f¨´)一¾l„äº‹ä»¶æ¥å¤„ç†çš„æƒ³æ³•åÆˆä¸æ–°é¢–ï¼ˆäº‹å®žä¸?SAX 已经提出来了åQ‰ï¼Œä½†ä¸åŒä¹‹å¤„在äº?StAX 允许应用½E‹åºä»£ç æŠŠè¿™äº›äº‹ä»‰™€ä¸ªæ‹‰å‡ºæ¥ï¼Œè€Œä¸ç”¨æä¾›åœ¨è§£æžå™¨æ–¹ä¾¿æ—¶ä»Žè§£æžå™¨ä¸­æŽ¥æ”¶äº‹ä»¶çš„处理½E‹åºã€?/p>

StAX 实际上包括两套处ç?XML çš?APIåQŒåˆ†åˆ«æä¾›äº†ä¸åŒ½E‹åº¦çš„æŠ½è±¡ã€‚基于指针的 API 允许应用½E‹åºæŠ?XML ä½œäØ“(f¨´)一个标讎ͼˆæˆ–事ä»Óž¼‰‹¹æ¥å¤„理åQ›åº”用程序可以检查解析器的状态,获得解析的上一个标记的信息åQŒç„¶åŽå†å¤„理下一个标讎ͼŒä¾æ­¤¾cÀLŽ¨ã€‚è¿™æ˜¯ä¸€¿Uä½Žå±?APIåQŒå°½½Ž¡æ•ˆçŽ‡é«˜åQŒä½†æ˜¯æ²¡æœ‰æä¾›åº•å±?XML ¾l“构的抽象。较为高¾U§çš„åŸÞZºŽ˜q­ä»£å™¨çš„ API 允许应用½E‹åºæŠ?XML ä½œäØ“(f¨´)一¾pÕdˆ—事äšg对象来处理,每个对象和应用程序交æ?XML ¾l“构的一部分。应用程序只需要确定解析事件的¾cÕdž‹åQŒå°†å…¶è{换成对应的具体类型,然后利用其方法获得属于该事äšg的信息ã€?/p>



回页�/b>


基本原理

ä¸ÞZº†ä½¿ç”¨˜q™ä¸¤¾c?APIåQŒåº”用程序首先必™å»èŽ·å¾—ä¸€ä¸ªå…·ä½“çš„ XMLInputFactory。根据传¾lŸçš„ JAXP 风格åQŒè¦ç”¨åˆ°æŠ½è±¡å·¥åŽ‚æ¨¡å¼åQ?code>XMLInputFactory ¾cÀLä¾›äº†é™æ€çš„ newInstance æ–ÒŽ(gu¨©)³•åQŒå®ƒè´Ÿè´£å®šä½å’Œå®žä¾‹åŒ–具体的工厂。配¾|®è¯¥å®žä¾‹å¯è®¾¾|®å®šåˆ¶æˆ–者预先定义好的属性(其名¿U°åœ¨¾c?XMLInputFactory 中定义)。最后,ä¸ÞZº†ä½¿ç”¨åŸÞZºŽæŒ‡é’ˆçš?APIåQŒåº”用程序还要通过调用某个 createXMLStreamReader æ–ÒŽ(gu¨©)³•获得一ä¸?span class="Apple-converted-space"> XMLStreamReader。如果要使用åŸÞZºŽäº‹äšg˜q­ä»£å™¨çš„ APIåQŒåº”用程序就要调ç”?span class="Apple-converted-space"> createXMLEventReader æ–ÒŽ(gu¨©)³•获得一ä¸?span class="Apple-converted-space"> XMLEventReaderåQˆå¦‚清单 1 所½Cºï¼‰ã€?/p>
清单 1. 获取和配¾|®é»˜è®¤çš„ XMLInputFactory 
                
// get the default factory instance
XMLInputFactory factory = XMLInputFactory.newInstance();
// configure it to create readers that coalesce adjacent character sections
factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
XMLStreamReader r = factory.createXMLStreamReader(input);
// ...

XMLStreamReader å’?span class="Apple-converted-space"> XMLEventReader éƒ½å…è®¸åº”用程序è„P代底层的 XML ‹¹ã€‚两¿Uæ–¹æ³•的差别在于如何公开解析后的 XML InfoSet 信息片段ã€?code>XMLStreamReader ž®±åƒä¸€ä¸ªæŒ‡é’ˆï¼ŒæŒ‡åœ¨åˆšåˆšè§£æž˜q‡çš„ XML 标记的后面,òq¶æä¾›äº†æ–ÒŽ(gu¨©)³•获得更多关于该标记的信息。这¿Uæ–¹æ³•节¾U¦å†…å­˜ï¼Œå› äØ“(f¨´)不用创徏新的对象。但是,业务应用½E‹åºå¼€å‘äh员可能会(x¨¬)发现 XMLEventReader æ›´ç›´è§‚ä¸€äº›ï¼Œå› äØ“(f¨´)它实际上ž®±æ˜¯ä¸€ä¸ªæ ‡å‡†çš„ Java ˜q­ä»£å™¨ï¼Œž®?XML 变成了事件对象流。每个事件对象都ž®è£…了它所表示的特å®?XML ¾l“构固有的信息。本¾pÕdˆ—的第二部分将详细讨论˜q™ç§åŸÞZºŽäº‹äšg˜q­ä»£å™¨çš„ APIã€?/p>

使用哪种风格çš?API 取决于具体情å†üc(di¨£n)€‚å’ŒåŸÞZºŽæŒ‡é’ˆçš?API 相比åQŒåŸºäºŽäº‹ä»¶è„P代器çš?API å…ähœ‰æ›´å¤šçš„面向对象特征。因此更便于应用于模块化的体¾pȝ»“æž„ï¼Œå› äØ“(f¨´)当前的解析器状态反映在事äšg对象中,应用½E‹åº¾l„äšg在处理事件的时候不需要访问解析器/è¯Õd–器。此外,˜q˜å¯ä»¥ä‹Éç”?code>XMLInputFactory çš?span class="Apple-converted-space"> createXMLEventReader(XMLStreamReader) æ–ÒŽ(gu¨©)³•ä»?span class="Apple-converted-space"> XMLStreamReader åˆ›å¾ XMLEventReaderã€?/p>

StAX ˜q˜å®šä¹‰äº†ä¸€¿Uåºåˆ—化å™?APIåQŒJava 标准 XML 处理支持中一直缺ž®‘的一¿Uç‰¹æ€§ã€‚å’Œè§£æžä¸€æ øP¼Œä¹ŸåŒ…含两¿Ué£Žæ ¼çš„‹¹å¼ APIåQšå¤„理标记的底层 XMLStreamWriter å’Œå¤„理事件对象的高层 XMLEventWriterã€?code>XMLStreamWriter æä¾›äº†å†™å…¥å•ä¸?XML 记号åQˆæ¯”如开始和关闭标记或者元素属性)的方法,不检查这些标记是否格式良好。另一斚w¢åQ?code>XMLEventWriter å…è®¸åº”用½E‹åºå‘输å‡ÞZ¸­æ·ÕdŠ å®Œæ•´çš?XML 事äšg。第 3 部分ž®†è¯¦¾l†è®¨è®?StAX 序列化器 APIã€?/p>

ä¸ÞZ»€ä¹ˆä‹Éç”?StAXåQ?/span>

开始学ä¹?f¨¤n)一¿Uæ–°çš„处ç?XML çš?API 之前åQŒå¯èƒ½è¦é—®æ˜¯å¦å€¼å¾—˜q™æ ·åšã€‚事实上åQŒStAX 所采用的基于拉的方法和其他æ–ÒŽ(gu¨©)³•相比有一些突出的优点。首先,不管使用哪种 API 风格åQŒéƒ½æ˜¯åº”用程序调用读取器åQˆè§£æžå™¨åQ‰è€Œä¸æ˜¯ç›¸åã€‚通过保留解析˜q‡ç¨‹çš„æŽ§åˆ¶æƒåQŒå¯ä»¥ç®€åŒ–调用代码来准确地处理它预期的内宏V€‚或者发生意外时停止解析。此外,ç”׃ºŽè¯¥æ–¹æ³•不åŸÞZºŽå¤„理½E‹åºå›žè°ƒåQŒåº”用程序不需要像使用 SAX 那样模拟解析器的状态ã€?/p>

StAX 仍然保留äº?SAX 相对äº?DOM 的优炏V€‚通过把重心从¾l“果对象模型转移到解析流本èínåQŒä»Žç†è®ºä¸Šè¯´åº”用½E‹åºèƒ½å¤Ÿå¤„理无限çš?XML ‹¹ï¼Œå› äØ“(f¨´)事äšg固有的äÍ(f¨´)时性,不会(x¨¬)在内存中累积èµäh¥ã€‚对于那些ä‹Éç”?XML ä½œäØ“(f¨´)消息传递协议而非表示文档内容的那些应用程序尤光™‡è¦ï¼Œæ¯”如 Web 服务或即时消息应用程序。比方说åQŒå¦‚果只是将其è{换成特定于应用程序的对象模型然后ž®±å°†å…¶ä¸¢å¼ƒï¼Œé‚£ä¹ˆä¸?Web 服务路由å™?servlet 提供一ä¸?DOM ž®±æ²¡æœ‰å¤šž®‘用处。ä‹Éç”?StAX 直接转化成应用程序模型效率更高。对äº?Extensible Messaging and Presence ProtocolåQˆXMPPåQ‰å®¢æˆähœºåQŒæ ¹æœ¬ä¸èƒ½ä‹Éç”?DOMåQŒå› ä¸?XMPP 客户æœ?服务器流是随着用户输入的消息实时生成。等待流的关闭标½{¾ï¼ˆä»¥ä¾¿æœ€¾lˆå¾ç«?DOMåQ‰å°±æ„å‘³ç€½{‰å¾…整个ä¼?x¨¬)话¾l“束。通过æŠ?XML ä½œäØ“(f¨´)一¾pÕdˆ—的事件来处理åQŒåº”用程序能够以最合适的方式响应每个事äšgåQˆæ¯”如显½Cºæ”¶åˆ°çš„åÏx—¶æ¶ˆæ¯½{‰ç­‰åQ‰ã€?/p>

ç”׃ºŽå…¶åŒå‘性,StAX 也支持链式处理,特别是在事äšg层上。接收事ä»Óž¼ˆæ— è®ºä»€ä¹ˆæ¥æºï¼‰çš„能力被ž®è£…åœ?XMLEventConsumeråQˆXMLEventWriter 的扩展)接口中。因此,可以模块化地¾~–写应用½E‹åºä»?XMLEventReaderåQˆä¹Ÿæ˜¯ä¸€ä¸ªæ™®é€šçš„˜q­ä»£å™¨ï¼Œå¯ä»¥æŒ‰è„P代器处理åQ‰è¯»å–和处理 XML 事äšg、然后传递给事äšg消费者(如果需要可以进一步扩展处理链åQ‰ã€‚在½W?2 部分ž®†çœ‹åˆŽÍ¼Œä¹Ÿå¯ä½¿ç”¨åº”用½E‹åºæä¾›çš„筛选器åQˆå®žçŽîCº† EventFilter 接口的类åQ‰æ¥å®šåˆ¶ XMLEventReader 或者ä‹Éç”?EventReaderDelegate 修饰已有çš?XMLEventReaderã€?/p>

总而言之,å’?DOM 以及(qi¨¢ng) SAX 相比åQŒStAX 使应用程序更贴近底层çš?XML。ä‹Éç”?StAXåQŒåº”用程序不仅可以徏立需要的对象模型åQˆè€Œä¸éœ€è¦å¤„理标å‡?DOMåQ‰ï¼Œè€Œä¸”可以随时˜q™æ ·åšï¼Œè€Œä¸å¿…等到解析器回调ã€?/p>

下一节将深入讨论åŸÞZºŽæŒ‡é’ˆçš?API 以及(qi¨¢ng)如何有效åœîC‹É用它处理 XML ‹¹ã€?/p>



回页�/b>


åŸÞZºŽæŒ‡é’ˆçš?API

如果使用åŸÞZºŽæŒ‡é’ˆçš?APIåQŒåº”用程序通过åœ?XML 标记‹¹ä¸­¿UÕdŠ¨é€»è¾‘æŒ‡é’ˆæ¥å¤„ç?XML。基于指针的解析器实质上是一个状态机åQŒåœ¨äº‹äšg的驱动下从一个良好定义的状态è{¿UÕdˆ°å¦ä¸€ä¸ªçŠ¶æ€ã€‚è¿™é‡Œçš„è§¦å‘äº‹äšg是随着应用½E‹åºä½¿ç”¨é€‚当的方法推动解析器在标记流中前˜q›è€Œè§£æžå‡ºæ¥çš„ XML 标记。在每个状态,都可使用一¾l„方法获得上一个事件的信息。一般来è¯ß_(d¨¢)¼Œòq‰™žæ¯ä¸ªçŠ¶æ€ä¸‹éƒ½èƒ½ä½¿ç”¨æ‰€æœ‰çš„æ–ÒŽ(gu¨©)³•ã€?/p>

使用åŸÞZºŽæŒ‡é’ˆçš„æ–¹æ³•,应用½E‹åºé¦–先必须通过调用å…?span class="Apple-converted-space"> createXMLStreamReader æ–ÒŽ(gu¨©)³•ä»?span class="Apple-converted-space"> XMLInputFactory å¾—到 XMLStreamReader。该æ–ÒŽ(gu¨©)³•有多个版本,支持不同¾cÕdž‹çš„输入。比方说åQŒå¯ä»¥åˆ›å»?span class="Apple-converted-space"> XMLStreamReader è§£æž plain java.io.InputStreamã€?code>java.io.Reader æˆ–è€?JAXP SourceåQ?code>javax.xml.transform.SourceåQ‰ã€‚从理论上说åQŒåŽä¸€¿UåŠžæ³•å¾ˆå®ÒŽ(gu¨©)˜“和其ä»?JAXP 技术交互,比如 SAX å’?DOMã€?/p>
清单 2. 创徏 XMLStreamReader è§£æž InputStream 
                
URL url = new URL(uri);
InputStream input = url.openStream();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader r = factory.createXMLStreamReader(uri, input);
// process the stream
// ...
r.close();
input.close();

XMLStreamReader æŽ¥å£åŸºæœ¬ä¸Šå®šä¹‰äº†åŸÞZºŽæŒ‡é’ˆçš?APIåQˆè™½ç„¶æ ‡è®°å¸¸é‡åœ¨å…¶è¶…¾cÕdž‹ XMLStreamConstants æŽ¥å£ä¸­å®šä¹‰ï¼‰ã€‚ä¹‹æ‰€ä»¥ç§°ä¸ºåŸºäºŽæŒ‡é’ˆï¼Œæ˜¯å› ä¸ø™¯»å–器ž®±åƒæ˜¯åº•层标记流上的指针。应用程序可以沿着标记‹¹å‘前推˜q›æŒ‡é’ˆåƈ分析当前指针所在位¾|®çš„æ ‡è®°ã€?/p>

XMLStreamReader æä¾›äº†å¤š¿Uæ–¹æ³•å¯¼èˆªæ ‡è®°æµã€‚äØ“(f¨´)了确定当前指针所指向的标讎ͼˆæˆ–事ä»Óž¼‰çš„类型,应用½E‹åºå¯ä»¥è°ƒç”¨ getEventType()。该æ–ÒŽ(gu¨©)³•˜q”回接口 XMLStreamConstants ä¸­å®šä¹‰çš„一个标记常量。移动到下一个标讎ͼŒåº”用½E‹åºå¯ä»¥è°ƒç”¨ next()。该æ–ÒŽ(gu¨©)³•也返回解析的标记的类型,如果接着调用 getEventType() åˆ™è¿”回的值相同。只有当æ–ÒŽ(gu¨©)³• hasNext() ˜q”回 true æ—Óž¼ˆž®±æ˜¯è¯´è¿˜æœ‰å…¶ä»–标记需要解析)才能调用该方法(以及(qi¨¢ng)å…¶ä»–¿UÕdЍè¯Õd–器的æ–ÒŽ(gu¨©)³•åQ‰ã€?/p>
清单 3. 使用 XMLStreamReader å¤„理 XML 的常用模å¼?/b>
                
// create an XMLStreamReader
XMLStreamReader r = ...;
try {
 int event = r.getEventType();
 while (true) {
 switch (event) {
 case XMLStreamConstants.START_DOCUMENT:
 // add cases for each event of interest
 // ...
 }

 if (!r.hasNext())
 break;
 
 event = r.next();
 }
} finally {
 r.close();
}

˜q˜ä¸Žå…¶ä»–几种æ–ÒŽ(gu¨©)³•可以¿UÕdЍ readerã€?span class="Apple-converted-space"> nextTag() æ–ÒŽ(gu¨©)³•ž®†èŸ©˜q‡æ‰€æœ‰çš„½Iºç™½ã€æ³¨é‡Šæˆ–处理指ä×o(h¨´)åQŒç›´åˆ°é‡åˆ?span class="Apple-converted-space"> START_ELEMENT æˆ?span class="Apple-converted-space"> END_ELEMENT。该æ–ÒŽ(gu¨©)³•在解析只含元素的内容时很有用åQŒå¦‚果在发现标记之前遇到非空白文本(不包括注释或处理指ä×o(h¨´)åQ‰ï¼Œž®×ƒ¼š(x¨¬)抛出异常ã€?code>getElementText() æ–ÒŽ(gu¨©)³•˜q”回元素的开始和关闭标签åQˆå³ START_ELEMENT å’?span class="Apple-converted-space"> END_ELEMENTåQ‰ä¹‹é—´çš„æ‰€æœ‰æ–‡æœ¬å†…宏V€‚如果遇到嵌套的元素ž®×ƒ¼š(x¨¬)抛出异常ã€?/p>

è¯äh³¨æ„ï¼Œ˜q™é‡Œçš?“标记â€?å’?“事件â€?可以互换使用。虽然基于指针的 API 的文档说的是事äšgåQŒä½†æŠŠè¾“入源看成标记‹¹å¾ˆæ–¹ä¾¿ã€‚è€Œä¸”ä¸å®¹æ˜“é€ æˆæ··äØ•åQŒå› ä¸ø™¿˜æœ‰ä¸€æ•´å¥—åŸÞZºŽäº‹äšgçš?APIåQˆé‚£é‡Œçš„事äšg是真正的对象åQ‰ã€‚不˜q‡ï¼ŒXMLStreamReader çš„事件本质上òq‰™žéƒ½æ˜¯æ ‡è®°ã€‚比方说åQ?code>START_DOCUMENT å’?span class="Apple-converted-space"> END_DOCUMENT äº‹äšg不需要对应的标记。前一个事件是解析开始之前发生,后者则在没有更多解析工作要做的时候发生(比如解析完成最后一个元素的关闭标签之后åQŒè¯»å–器处于 END_ELEMENT çŠ¶æ€ï¼Œä½†æ˜¯å¦‚æžœæ²¡æœ‰å‘çŽ°æ›´å¤šçš„æ ‡è®°éœ€è¦è§£æžï¼Œè¯Õd–器就ä¼?x¨¬)切换åˆ?span id="wmqeeuq" class="Apple-converted-space"> END_DOCUMENT çŠ¶æ€ï¼‰ã€?/p>

处理 XML 文档

在每个解析器状态,应用½E‹åºéƒ½å¯é€šè¿‡å¯ç”¨çš„æ–¹æ³•获得相关信息。比如,无论当前是什么类型的事äšgåQ?code>getNamespaceContext() å’?span class="Apple-converted-space"> getNamespaceURI() æ–ÒŽ(gu¨©)³•可以获得当前有效的名¿U°ç©ºé—´ä¸Šä¸‹æ–‡å’Œå¿U°ç©ºé—?URI。类似的åQ?code>getLocation() å¯ä»¥èŽ·å¾—å½“å‰äº‹äšg的位¾|®ä¿¡æ¯ã€‚æ–¹æ³?code>hasName() å’?span class="Apple-converted-space"> hasText() å¯ä»¥åˆ†åˆ«åˆ¤æ–­å½“前事äšg是否有名¿UŽÍ¼ˆæ¯”如元素或属性)或文本(比如字符、注释或 CDATAåQ‰ã€‚æ–¹æ³?span class="Apple-converted-space"> isStartElement()ã€?code>isEndElement()ã€?code>isCharacters() å’?span class="Apple-converted-space"> isWhiteSpace() å¯ä»¥æ–¹ä¾¿åœ°ç¡®å®šå½“前事件的性质。最后,æ–ÒŽ(gu¨©)³• require(int, String, String) 可以声明预期的解析器状态;除非当前事äšg是指定的¾cÕdž‹åQŒåƈ且本地名和名¿U°ç©ºé—ß_(d¨¢)¼ˆå¦‚æžœ¾l™å‡ºçš„话åQ‰ä¸Žå½“前事äšg匚w…åQŒå¦åˆ™è¯¥æ–ÒŽ(gu¨©)³•ž®†æŠ›å‡ºå¼‚常ã€?/p>
清单 4. 如果当前事äšgæ˜?span class="Apple-converted-space"> START_ELEMENT ä½¿ç”¨æœ‰å…³çš„属性方æ³?/b>
                
if (reader.getEventType() == XMLStreamConstants.START_ELEMENT) {
 System.out.println("Start Element: " + reader.getName());
 for(int i = 0, n = reader.getAttributeCount(); i < n; ++i) {
 QName name = reader.getAttributeName(i);
 String value = reader.getAttributeValue(i);
 System.out.println("Attribute: " + name + "=" + value);
 }
}

创徏之后åQ?code>XMLStreamReader ž®†ä»Ž START_DOCUMENT çŠ¶æ€å¼€å§‹ï¼ˆå?span class="Apple-converted-space"> getEventType() ˜q”回 START_DOCUMENTåQ‰ã€‚处理标记的时候应考虑到这一炏V€‚å’Œ˜q­ä»£å™¨ä¸åŒï¼Œä¸éœ€è¦å…ˆ¿UÕdŠ¨æŒ‡é’ˆåQˆä‹Éç”?span class="Apple-converted-space"> next()åQ‰æ¥˜q›å…¥åˆæ³•的状态。同样地åQŒå½“è¯Õd–器è{换到最¾lˆçжæ€?span class="Apple-converted-space"> END_DOCUMENT之后åQŒåº”用程序也不应再移动它。在˜q™ç§çŠ¶æ€ä¸‹åQ?code>hasNext() æ–ÒŽ(gu¨©)³•ž®†è¿”å›?falseã€?/p>

START_DOCUMENT äº‹äšg提供了获取关于文档本íw«ä¿¡æ¯çš„æ–ÒŽ(gu¨©)³•åQŒå¦‚ getEncoding()ã€?code>getVersion() å’?span class="Apple-converted-space"> isStandalone()。应用程序也可调ç”?span class="Apple-converted-space"> getProperty(String) èŽ·å¾—å‘½åå±žæ€§çš„å€û|¼Œä¸è¿‡ä¸€äº›å±žæ€§ä»…在特定状态做了定义(比方è¯ß_(d¨¢)¼Œå¦‚果当前事äšgæ˜?DTDåQŒåˆ™å±žæ€?code>javax.xml.stream.notations å’?span class="Apple-converted-space"> javax.xml.stream.entities åˆ†åˆ«˜q”回所有的½W¦å·å’Œå®žä½“声明)ã€?/p>

åœ?span class="Apple-converted-space"> START_ELEMENT å’?span class="Apple-converted-space"> END_ELEMENT äº‹äšg中,可以使用和元素名¿UîC»¥å?qi¨¢ng)名¿U°ç©ºé—´æœ‰å…³çš„æ–ÒŽ(gu¨©)³•åQˆå¦‚ getName()ã€?code>getLocalName()ã€?code>getPrefix() å’?span class="Apple-converted-space"> getNamespaceXXX()åQ‰ï¼Œåœ?span class="Apple-converted-space"> START_ELEMENT äº‹äšg中还可ä‹É用与属性有关的æ–ÒŽ(gu¨©)³•åQ?code>getAttributeXXX()åQ‰ã€?/p>

ATTRIBUTE å’?span class="Apple-converted-space"> NAMESPACE ä¹Ÿè¢«è¯†åˆ«ä¸ºç‹¬ç«‹çš„事äšgåQŒè™½ç„¶åœ¨è§£æž 典型çš?XML 文档时不ä¼?x¨¬)用到。但是当 ATTRIBUTE æˆ?span class="Apple-converted-space"> NAMESPACE èŠ‚ç‚¹ä½œäØ“(f¨´) XPath 查询¾l“æžœ˜q”回时可以ä‹É用ã€?/p>

和基于文本的事äšgåQˆå¦‚ CHARACTERSã€?code>CDATAã€?code>COMMENT å’?span class="Apple-converted-space"> SPACEåQ‰ï¼Œå¯ä‹É用各¿U?span class="Apple-converted-space"> getTextXXX() æ–ÒŽ(gu¨©)³•取得文本。可以分别ä‹Éç”?span class="Apple-converted-space"> getPITarget() å’?span class="Apple-converted-space"> getPIData() ‹‚€ç´?span class="Apple-converted-space"> PROCESSING_INSTRUCTION çš„目标和数据ã€?code>ENTITY_REFERENCE å’?span class="Apple-converted-space"> DTD ä¹Ÿæ”¯æŒ?code>getText()åQ?code>ENTITY_REFERENCE ˜q˜æ”¯æŒ?span class="Apple-converted-space"> getLocalName()ã€?/p>

解析完成后,应用½E‹åºå…³é—­è¯Õd–å™¨åÆˆé‡Šæ”¾è§£æž˜q‡ç¨‹ä¸­èŽ·å¾—çš„èµ„æºã€‚è¯·æ³¨æ„˜q™æ ·òq¶æ²¡æœ‰å…³é—­åº•层的输入源ã€?/p>

清单 5 提供了一个完整的例子åQŒä‹É用基于指针的 API 处理 XML 文档。首先取å¾?span class="Apple-converted-space"> XMLInputFactory çš„é»˜è®¤å®žä¾‹åÆˆåˆ›å¾ä¸€ä¸?span class="Apple-converted-space"> XMLStreamReader è§£æž¾l™å®šçš„输入流。然后不断检查读取器的状态,æ ÒŽ(gu¨©)®å½“前事äšg的类型报告某些信息(比如åœ?span class="Apple-converted-space"> START_ELEMENT çŠ¶æ€ä¸‹æŠ¥å‘Šå…ƒç´ ååŠ(qi¨¢ng)元素属性)。最后,遇到 END_DOCUMENT æ—¶å…³é—­è¯»å–器ã€?/p>
清单 5. 使用 XMLStreamReader è§£æž XML 文档的完整例å­?/b>
                
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader r = factory.createXMLStreamReader(input);
try {
 int event = r.getEventType();
 while (true) {
 switch (event) {
 case XMLStreamConstants.START_DOCUMENT:
 out.println("Start Document.");
 break;
 case XMLStreamConstants.START_ELEMENT:
 out.println("Start Element: " + r.getName());
 for(int i = 0, n = r.getAttributeCount(); i < n; ++i)
 out.println("Attribute: " + r.getAttributeName(i) 
 + "=" + r.getAttributeValue(i));
 
 break;
 case XMLStreamConstants.CHARACTERS:
 if (r.isWhiteSpace())
 break;
 
 out.println("Text: " + r.getText());
 break;
 case XMLStreamConstants.END_ELEMENT:
 out.println("End Element:" + r.getName());
 break;
 case XMLStreamConstants.END_DOCUMENT:
 out.println("End Document.");
 break;
 }
 
 if (!r.hasNext())
 break;

 event = r.next();
 }
} finally {
 r.close();
}

XMLStreamReader çš„高¾U§ç”¨æ³?/span>

通过调用 XMLInputFactory çš„带有基本读取器çš?span class="Apple-converted-space"> createFilteredReader æ–ÒŽ(gu¨©)³•和一个应用程序定义的½{›é€‰å™¨åQˆå³å®žçް StreamFilter çš„类实例åQ‰ï¼Œå¯ä»¥åˆ›å¾½{›é€‰è¿‡çš?span class="Apple-converted-space"> XMLStreamReader。导航筛选过的读取器æ—Óž¼Œè¯Õd–器每‹Æ¡ç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªæ ‡è®îC¹‹å‰éƒ½ä¼?x¨¬)询问筛选器。如果筛选器认可了当前事ä»Óž¼Œž®±å°†å…¶å…¬å¼€¾l™ç­›é€‰è¿‡çš„读取器。否则蟩˜q‡è¿™ä¸ªæ ‡è®°åƈ‹‚€æŸ¥ä¸‹ä¸€ä¸ªï¼Œä¾æ­¤¾cÀLŽ¨ã€‚è¿™¿Uæ–¹æ³•可以让开发äh员创å»ÞZ¸€ä¸ªä»…处理解析内容子集的基于指针的 XML 处理½E‹åºåQŒåƈ与针对不同的扩展的内å®ÒŽ(gu¨©)¨¡åž‹çš„½{›é€‰å™¨¾l“合使用ã€?/p>

执行更复杂的‹¹æ“ä½œï¼Œå¯ä»¥åˆ›å¾ StreamReaderDelegate çš„子¾cÕdƈ重写合适的æ–ÒŽ(gu¨©)³•。然后ä‹É用这个子¾cȝš„实例包装基本 XMLStreamReaderåQŒä»Žè€ŒäØ“(f¨´)应用½E‹åºæä¾›ä¸€ä¸ªä¿®æ”¹è¿‡çš„基æœ?XML ‹¹çš„视图。可通过˜q™ç§æŠ€æœ¯å¯¹ XML ‹¹æ‰§è¡Œç®€å•的转换åQŒæ¯”如筛掉或者替换特定的标记åQŒç”šè‡›_¢žåŠ æ–°çš„æ ‡è®°ã€?/p>

清单 6 用定制的 StreamReaderDelegate åŒ…装了基æœ?span class="Apple-converted-space"> XMLStreamReaderåQŒé‡å†™äº† next() æ–ÒŽ(gu¨©)³•来蟩˜q?span class="Apple-converted-space"> COMMENT å’?span class="Apple-converted-space"> PROCESSING_INSTRUCTION äº‹äšg。ä‹É用该è¯Õd–器时åQŒåº”用程序不用担心会(x¨¬)遇到˜q™ç§¾cÕdž‹çš„æ ‡è®°ã€?/p>
清单 6. 使用定制çš?span class="Apple-converted-space"> StreamReaderDelegate ½{›é€‰æ³¨é‡Šå’Œå¤„理指ä×o(h¨´)
                
URL url = new URL(uri);
InputStream input = url.openStream();

XMLInputFactory f = XMLInputFactory.newInstance();
XMLStreamReader r = f.createXMLStreamReader(uri, input);
XMLStreamReader fr = new StreamReaderDelegate(r) {
 public int next() throws XMLStreamException {
 while (true) {
 int event = super.next();
 switch (event) {
 case XMLStreamConstants.COMMENT:
 case XMLStreamConstants.PROCESSING_INSTRUCTION:
 continue;
 default:
 return event;
 }
 }
 }
};

try {
 int event = fr.getEventType();
 while (true) {
 switch (event) {
 case XMLStreamConstants.COMMENT:
 case XMLStreamConstants.PROCESSING_INSTRUCTION:
 // this should never happen
 throw new IllegalStateException("Filter failed!");
 default:
 // process XML normally
 }

 if (!fr.hasNext())
 break;

 event = fr.next();
 }
} finally {
 fr.close();
}

input.close();





回页�/b>


åŸÞZºŽæŒ‡é’ˆå¤„理之外的其他技æœ?/span>

可以看到åQŒåŸºäºŽæŒ‡é’ˆçš„ API ä¸»è¦æ˜¯äØ“(f¨´)了提高效率。所有的状态信息可以直接从‹¹è¯»å–器获得åQŒä¸éœ€è¦åˆ›å»ºé¢å¤–的对象。非帔R€‚用于性能和低内存占用臛_…³é‡è¦çš„应用程序ã€?/p>

äºÞZ»¬æ—©å°±è®¤è¯†åˆîCº†æ‹‰å¼ XML 解析的好处。事实上åQŒStAX 本èín源于一¿Uç§°ä¸?span class="Apple-converted-space"> XML Pull Parsing çš„æ–¹æ³•。XML Pull Parser API ¾cÖM¼¼äº?StAX 所提供的基于指针的 APIåQŒå¯ä»¥é€šè¿‡åˆ†æžè§£æžå™¨çš„状态获得上一个解析事件的信息åQŒç„¶åŽç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªï¼Œä¾æ­¤¾cÀLŽ¨ã€‚ä½†æ²¡æœ‰æä¾›åŸÞZºŽäº‹äšg˜q­ä»£å™¨çš„ API。这是一¿Uéžå¸¸è½»åž‹çš„æ–ÒŽ(gu¨©)³•åQŒç‰¹åˆ«é€‚合资源受限的环境,比如 J2ME。但是,很少有实现提供企业çñ”ç‰ÒŽ(gu¨©)€§å¦‚验证åQŒå› æ­?XML Pull 一直未受到企业 Java 开发äh员的å…Ïx³¨ã€?/p>

åŸÞZºŽä»¥å¾€æ‹‰å¼è§£æžå™¨å®žçŽ°çš„¾léªŒåQŒStAX çš„åˆ›å»ø™€…选择了在åŸÞZºŽæŒ‡é’ˆçš?API 之外增加一¿Ué¢å‘对象的 API。虽ç„?span class="Apple-converted-space"> XMLEventReader æŽ¥å£çœ‹è“v来似乎很½Ž€å•,但是åŸÞZºŽäº‹äšg˜q­ä»£å™¨çš„æ–ÒŽ(gu¨©)³•å…ähœ‰ä¸€ä¸ªåŸºäºŽæŒ‡é’ˆçš„æ–ÒŽ(gu¨©)³•不具备的重要优点。通过ž®†è§£æžå™¨äº‹äšg变成一¾U§å¯¹è±¡ï¼Œä»Žè€Œè®©åº”用½E‹åºå¯ä»¥é‡‡ç”¨é¢å‘对象的方式处理它们。这样做有助于模块化和不同应用程序组件之间的代码重用ã€?/p>
清单 7. 使用 StAX XMLEventReader è§£æž XML
                
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLEventReader reader = inputFactory.createXMLEventReader(input);
try {
 while (reader.hasNext()) {
 XMLEvent e = reader.nextEvent();
 if (e.isCharacters() && ((Characters) e).isWhiteSpace())
 continue;
 
 out.println(e);
 }
} finally {
 reader.close();
}





回页�/b>


¾l“束è¯?/span>

本文介绍äº?StAX å?qi¨¢ng)å…¶åŸÞZºŽæŒ‡é’ˆçš?API。第 2 部分ž®†æ·±å…¥è®¨è®ÞZº‹ä»¶è„P代器 APIã€?/p>

参考资�/span>

学习(f¨¤n)

获得产品和技�/b>

讨论


关于作�/span>

Peter Nehrer 是一名专长于åŸÞZºŽ Eclipse 的企业解å†Ïx–¹æ¡ˆå’Œ Java EE 应用½E‹åºçš„èÊY仉™¡¾é—®ã€‚他创徏äº?Ecliptical Software Inc.åQŒåƈ且是一些和 Eclipse 有关的开放源码项目的贡献者。他拥有从马萨诸塞州大学阉K»˜æ–¯ç‰¹æ ¡åŒºèŽ·å¾—çš„è®¡½Ž—机¿U‘å­¦¼‹•士学位ã€?/p>




]]>JavaRebelçš„XXXhttp://www.aygfsteel.com/beansoft/archive/2008/11/24/242373.htmlBeanSoftBeanSoftMon, 24 Nov 2008 13:47:00 GMThttp://www.aygfsteel.com/beansoft/archive/2008/11/24/242373.html本XXX只能用于 JavaRabel 的早期版æœ? å¯ÒŽ(gu¨©)œ€æ–°ç‰ˆæ— æ•ˆ: ZeroTurnaround JavaRebel 1.2.2 (200812021546) 如有需要可ä»?Mail æˆ?
XXX是什ä¹? 大家自己体会(x¨¬). 原则上这个XXX是只供我本äh自己试用çš? 现在提供¾l™å¤§å®¶æ¥è¯•用. 2K, 用法见文件注é‡?

下蝲地址1:

http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/java/jrebel.rar

下蝲地址2:

http://beansoft.java-cn.org/download/jrebel.rar



]]>
Head First EJB 中文版电(sh¨´)子书下蝲[MOVED]http://www.aygfsteel.com/beansoft/archive/2008/05/02/197757.htmlBeanSoftBeanSoftFri, 02 May 2008 09:28:00 GMThttp://www.aygfsteel.com/beansoft/archive/2008/05/02/197757.html Head First EJB 中文版电(sh¨´)子书下蝲

]]>
New Features in EJB 3.1以及(qi¨¢ng)Spring加入Java EE 6 阵营http://www.aygfsteel.com/beansoft/archive/2008/04/27/196416.htmlBeanSoftBeanSoftSun, 27 Apr 2008 03:00:00 GMThttp://www.aygfsteel.com/beansoft/archive/2008/04/27/196416.htmlNew Features in EJB 3.1, http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-1.

New Features in EJB 3.1 - Part 2, http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31

Enterprise Java Community: The New Features in EJB 3.1 - Part 3 Enterprise Java Community- The New Features in EJB 3.1 - Part 3

看看下面的链接:(x¨¬)

JSR 316: Java EE 6, http://jcp.org/en/jsr/detail?id=316.

成员列表åQˆä»¥å‰çš„反叛者,åïL(f¨¥ng)§°ä¸ç”¨EJBçš„Spring后台公司åQŒçº¢å­—部分,也加入了Java EE 6 的大家庭åQŒçœ‹æ¥æ–°ç‰ˆJava EE也许是大势所­‘‹å•ŠåQŒå‘µå‘µï¼‰åQ?/p>
Specification Lead
  Roberto Chinnici   Sun Microsystems, Inc.
Star Spec Lead Bill Shannon   Sun Microsystems, Inc.
 
Expert Group
BEA Systems   Bien, Adam   Blevins, David
Divakaran, Rejeev   Ericsson AB   Genender, Jeff
Goncalves, Antonio   IBM   Inria
Interface21 Inc   KEIL, Werner   Kohen, Elika S.
Leme, Felipe   NCsoft Corporation   Oracle
Peking University   Pramati Technologies   Prasanna, Dhanji R.
Rahman, M. Reza   Red Hat Middleware LLC   SAP AG
Suleiman, Hani   Sun Microsystems, Inc.   Sybase
Tmax Soft, Inc.   TongTech Ltd

 

再看Springç›´æŽ¥å¼€å§‹äº†ä½œäØ“(f¨´)EJB容器的实现的支持™å¹ç›®åQŒæˆ‘一直说Spring只不˜q‡æ˜¯å¦ä¸€ä¸ªApplication ServeråQˆè€Œä¸”˜q˜ä¸æ˜¯æ€§èƒ½å¾ˆå¥½çš„é‚£¿Uï¼‰åQŒçŽ°åœ¨ç»ˆäºŽå¾—åˆîCº†éªŒè¯åQŒçº¢å­—çš„ž®±æ˜¯ Rod 大叔åQˆJava的开源,大多数最后都ä¼?x¨¬)成立公司,成äØ?f¨´)商业™å¹ç›®æ¥è¿è¥ï¼Œä»ŽHibernate,JBoss再到SpringåQŒæ— ä¸€ä¾‹å¤–åQŒç›–™å¹ç›®ä»£ç å¤§äº†ä»¥åŽåQŒå°±æ˜¯å¼€æºäº†åQŒå¤–äºÞZ¹Ÿçœ‹ä¸æ‡‚)åQ?/p>

http://static.interface21.com/projects/pitchfork/files/m4/docs/reference/html_single/

Pitchfork: Spring JEE Support

Reference Documentation

Rod Johnson
Costin Leau
Michael Chen

Version 1.0-m4

At the moment, Spring JEE support understands the following annotations, which are part of the JSR 250 and JSR 220:

  • JSR 250 injection annotations (javax.annotation): @PostCostruct, @PreDestroy and @Resource

  • EJB3 interception annotations (javax.interceptor): @AroundInvoke, @ExcludeClassInterceptors, @ExcludeDefaultInterceptors, @Interceptors, @Invocation

  • EJB3 transaction annotations (javax.ejb): @Stateless, @ApplicationException and @TransactionAttribute

  • EJB3 injection annotation (javax.ejb): @EJB (since M2)

In short, Spring can understand Java EE 5.0 injection, interception and transactional metadata.



]]>
独家åQšJava EE 5 中文 API 文档在线阅读和操作视é¢?有声)http://www.aygfsteel.com/beansoft/archive/2008/04/20/194353.htmlBeanSoftBeanSoftSun, 20 Apr 2008 11:30:00 GMThttp://www.aygfsteel.com/beansoft/archive/2008/04/20/194353.html

如无法全屏,è¯ïL(f¨¥ng)‚¹å‡»è¿™é‡Œï¼š(x¨¬)http://6.cn/watch/4599331.html 

图文版说明及(qi¨¢ng)无声视频请参è€?a href="/beansoft/archive/2008/04/17/193691.html">独家åQšJava EE 5 中文 API 文档在线阅读和操作视é¢?/a>



]]>
独家åQšJava EE 5 中文 API 文档在线阅读和操作视é¢?/title><link>http://www.aygfsteel.com/beansoft/archive/2008/04/17/193691.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 17 Apr 2008 03:37:00 GMT</pubDate><guid>http://www.aygfsteel.com/beansoft/archive/2008/04/17/193691.html</guid><description><![CDATA[<p>本文ç”?a href="mailto:BeanSoft@126.com">BeanSoft@126.com</a>åQˆåˆ˜é•¿ç‚¯åQ‰åŽŸåˆ›ï¼Œè½¬è²è¯äh³¨æ˜Žå‡ºå¤„!</p> <p> 最˜q‘互联网上挂起了一股到处散发广告传单,严重òq²æ‰°å·¥ä½œå­¦ä¹ (f¨¤n)的歪风。我æƒÏxžæŠ€æœ¯çš„爱国的话ž®±å¤šåˆ†äín点资料和¾léªŒå§ï¼˜q™æ ·æ€ÀL¯”那些整天只知道空谈爱国,动辄抵制XX的“爱国青òq´â€å¼ºç‚V€‚多sharež®±æ˜¯æœ€å¤§çš„爱国åQ?/p> <p>相比较微软的开发工兯‚¯¦¾l†çš„中文文档外,Java çš„API长期以来只有英文åQŒè¿˜å¥½æœ€˜q‘å·²¾læœ‰äº†ä¸­æ–‡çš„Java SE文档。不˜q‡ï¼ŒJava EE 5 的中文API 却难得一见,然而,òq¸è¿çš„æ˜¯çŽ°åœ¨æˆ‘ä»¬¾lˆäºŽå¯ä»¥çœ‹åˆ°ä¸­æ–‡çš?Java EE 5文档了,虽然有些遗憾只能在线‹¹è§ˆåQŒä¸˜q‡æ€ÀL¯”没有强,以后它们肯定ä¼?x¨¬)提供中文版的文档包下蝲的ï¼?/p> <p> </p> <p>˜q™ä¸ªé˜…读文档的地址ž®±æ˜¯<a title="http://doc.java.sun.com/DocWeb/" >http://doc.java.sun.com/DocWeb/</a>åQŒè€Œä¸”åQŒå®ƒé‡‡ç”¨å¼€æºçš„协议åQŒè¯»è€…可以注册一个用户参与翻译。也正因为如此,我认为其中的文档òq¶ä¸å…¨é¢åQŒéœ€è¦æœ‰æ¡äšgçš„äh共同参与完成中文化文档。下面我们就看看如何阅读中文文档ã€?/p> <p>˜q›å…¥é¦–页åQ?/p> <p><a href="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/-2008-04-17_110035_2.png"><img border="0" alt="-2008-04-17_110035" src="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/-2008-04-17_110035_thumb.png" width="952" height="233"></a> </p> <p><a href="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/image_2.png"><img border="0" alt="image" src="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/image_thumb.png" width="222" height="396"></a> <a href="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/image_4.png"><img border="0" alt="image" src="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/image_thumb_1.png" width="716" height="265"></a> </p> <p>如果要查看单½‹‡ä¸­æ–‡æ–‡æ¡£ï¼Œå¯ä»¥åœ¨â€œEJB日”上点右键,选择菜单™å¹â€œåœ¨æ–°çª—口中打开”即可。如下图所½Cºï¼š(x¨¬)</p> <p><a href="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/image_6.png"><img border="0" alt="image" src="http://www.aygfsteel.com/images/blogjava_net/beansoft/WindowsLiveWriter/JavaEE5API_981D/image_thumb_2.png" width="442" height="339"></a> </p> <p>下面是操作视频:(x¨¬)</p> <p> </p><embed height="768" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="1024" src="http://beansoft.java-cn.org/download/javaee5doc_cn.swf" quality="high" bgcolor="#FFFFFF"></embed><img src ="http://www.aygfsteel.com/beansoft/aggbug/193691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/beansoft/" target="_blank">BeanSoft</a> 2008-04-17 11:37 <a href="http://www.aygfsteel.com/beansoft/archive/2008/04/17/193691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐资料åQšHibernate 3 入門和JPA æ‰ÒŽ(gu¨©)³¨å‚考(中文åQ‰[MOVED]http://www.aygfsteel.com/beansoft/archive/2008/03/08/184740.htmlBeanSoftBeanSoftSat, 08 Mar 2008 12:40:00 GMThttp://www.aygfsteel.com/beansoft/archive/2008/03/08/184740.htmlhttp://www.beansoft.biz/?p=253

]]>
Ant 入门讲解视频(22åˆ?3¿U?[MOVED]http://www.aygfsteel.com/beansoft/archive/2007/11/03/157955.htmlBeanSoftBeanSoftSat, 03 Nov 2007 10:35:00 GMThttp://www.aygfsteel.com/beansoft/archive/2007/11/03/157955.html阅读全文

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ¼ªÁÖÊ¡| ÊæÀ¼ÊÐ| ÍÐÀïÏØ| Ì«ºþÏØ| ÐÞË®ÏØ| ͨºÓÏØ| ÊÖÓÎ| ¸ÞÀ¼ÏØ| äÒÖÐÏØ| ǧÑôÏØ| °²¼ªÏØ| ÅíÖÝÊÐ| ¶«·½ÊÐ| ºÊÔóÊÐ| ´ï¶û| ÕżҸÛÊÐ| Çú¾¸ÊÐ| ÄÉÓºÏØ| ·½ÕýÏØ| å´²ýÏØ| IJ¶¨ÏØ| ÁÙå¢ÏØ| °²ÏªÏØ| ÎåÔ­ÏØ| ²ìÑÅÏØ| Íû½­ÏØ| ¿ËÀ­ÂêÒÀÊÐ| ºÍ¾²ÏØ| µÂ»¯ÏØ| ÕÅÒ´ÊÐ| ¶«Ô´ÏØ| ÎäÍþÊÐ| ËçÀâÏØ| ¡²ýÏØ| ÜdzÇÏØ| פÂíµêÊÐ| Èʲ¼ÏØ| ÜõÍåÇø| ÓÜÖÐÏØ| Éç»á| µÂÐËÊÐ|