??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码一区二区乱子伦,国产成人亚洲精品影院,亚洲日韩在线第一页http://www.tkk7.com/yyg1107/category/15861.html<center>q家伙很?什么都没有留下</center>zh-cnSun, 08 Apr 2007 00:23:45 GMTSun, 08 Apr 2007 00:23:45 GMT60Hibernate Gossip: 樂觀鎖定QOptimistic lockingQ?/title><link>http://www.tkk7.com/yyg1107/articles/94336.html</link><dc:creator>young</dc:creator><author>young</author><pubDate>Tue, 16 Jan 2007 17:29:00 GMT</pubDate><guid>http://www.tkk7.com/yyg1107/articles/94336.html</guid><wfw:comment>http://www.tkk7.com/yyg1107/comments/94336.html</wfw:comment><comments>http://www.tkk7.com/yyg1107/articles/94336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yyg1107/comments/commentRss/94336.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yyg1107/services/trackbacks/94336.html</trackback:ping><description><![CDATA[ <p>悲觀鎖定假定M時刻存取資料時,都可能有另一個客戶也正在存取同一{資料,因而對資料採取了資料n層次的鎖定狀態,在鎖定的時間內其他的客戶不能資料進行存取Q對於單或系ip言Q這並不成問題Q然而如果是在網路上的系i,同時間會有許多連線Q如果每一ơ讀取資料都造成鎖定Q其後繼的存取就必須{待Q這將造成效能上的問題Q造成後繼使用者的h間等待?<br /><br />樂觀鎖定QOptimistic lockingQ則樂觀的認料的存取很少發生同時存取的問,因而不作資料n層次上的鎖定Q為了維h的資料Q樂觀鎖定使用應用E式上的邏輯實現版本控制的解決?<br /><br />在不實行悲觀鎖定{略的情況下Q資料不一致的情況一但發生,有幾個解決的ҎQ一E是先更新為主,一E是後更新的ZQ比較複雜的是檢查發生變動的資料來實現Q或是檢查所有屬性來實現樂觀鎖定?<br /><br />Hibernate中透過版本號檢查來實現後更新為主,這也是Hibernate所推薦的方式,在資料n中加入一個versionƄ位a錄Q在讀取資料時連同版本號一同讀取,並在更新資料時比版本號與資料n中的版本號,如果{於資料庫中的版本號則予以更斎ͼ並遞增版本號Q如果小D料n中的版本號就丟出例外?br /><br />實際來透過例瞭解Hibernate的樂觀鎖定如何實現Q首先在資料庫中新增一個表|<br /></p> <div style="MARGIN-LEFT: 40px; FONT-FAMILY: Courier New,Courier,monospace"> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff">CREATE</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">TABLE</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff00ff">user</span> <span style="COLOR: #000000"> (<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    id </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">INT</span> <span style="COLOR: #000000">(</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">11</span> <span style="COLOR: #000000">) </span> <span style="COLOR: #808080">NOT</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">NULL</span> <span style="COLOR: #000000"> auto_increment </span> <span style="COLOR: #0000ff">PRIMARY</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">KEY</span> <span style="COLOR: #000000">,<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    version </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">INT</span> <span style="COLOR: #000000">,<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    name </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span> <span style="COLOR: #000000">(</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">100</span> <span style="COLOR: #000000">) </span> <span style="COLOR: #808080">NOT</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">NULL</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">default</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">''</span> <span style="COLOR: #000000">,<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    age </span> <span style="FONT-WEIGHT: bold; COLOR: #000000">INT</span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />);</span> </div> <br /> </div> <p> <br />這個user表格中的version用來a錄版本號,以供Hibernate實現樂觀鎖定Q接著設aUser別Q當中必須包括version屬性:<br /></p> <p> </p> <span id="Codehighlighter1_57_702_Open_Text"> <ul> <li>User.java </li> </ul> <pre>package onlyfun.caterpillar;<br /><br />public class User {<br /> private Integer id;<br /><span style="FONT-WEIGHT: bold"> private Integer version; // 增加版本屬? </span><br /> private String name;<br /> private Integer age;<br /><br /> public User() {<br /> }<br /><br /> public Integer getId() {<br /> return id;<br /> }<br /><br /> public void setId(Integer id) {<br /> this.id = id;<br /> }<br /><br /> public Integer getVersion() {<br /> return version;<br /> }<br /><br /> public void setVersion(Integer version) {<br /> this.version = version;<br /> }<br /><br /> public String getName() {<br /> return name;<br /> }<br /><br /> public void setName(String name) {<br /> this.name = name;<br /> }<br /><br /> public Integer getAge() {<br /> return age;<br /> }<br /><br /> public void setAge(Integer age) {<br /> this.age = age;<br /> }<br />}</pre> <p> </p> </span> <br />在映文件的定義斚wQ則如下所C:<br /><ul><li>User.hbm.xml </li></ul><pre><?xml version="1.0" encoding="utf-8"?> <br /><!DOCTYPE hibernate-mapping <br /> PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <br /> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <br /><br /><hibernate-mapping> <br /><br /> <class name="onlyfun.caterpillar.User" <br /> table="user"<br /><span style="FONT-WEIGHT: bold">optimistic-lock="version"</span>> <br /><br /> <id name="id" column="id" type="java.lang.Integer"> <br /> <generator class="native"/> <br /> </id> <br /><br /><span style="FONT-WEIGHT: bold"> <version name="version" </span><br style="FONT-WEIGHT: bold" /><span style="FONT-WEIGHT: bold"> column="version"</span><br style="FONT-WEIGHT: bold" /><span style="FONT-WEIGHT: bold"> type="java.lang.Integer"/> </span><br /><br /> <property name="name" column="name" type="java.lang.String"/> <br /><br /> <property name="age" column="age" type="java.lang.Integer"/> <br /><br /> </class> <br /><br /></hibernate-mapping></pre><p><br />注意<version>標籤必須出現?lt;id>標籤之後Q接著您可以試著在資料n中新增資料,例如Q?br /></p><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">User user = new User(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">user.setName("caterpillar"); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">user.setAge(new Integer(30)); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">Session session = sessionFactory.openSession();</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">Transaction tx =  session.beginTransaction();</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">session.save(user); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">tx.commit(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">session.close();</span><br /></div><p><br /><span id="zpjlxrr" class="postbody">您可以檢視資料n中的資料Q每一ơ對同一{資料進行更新QversionƄ位的內定w會自動更斎ͼ接著來作個實驗,直接以範例說明:<br /></span></p><div style="MARGIN-LEFT: 40px; FONT-FAMILY: Courier New,Courier,monospace"><span id="trxlxzh" class="postbody" style="FONT-WEIGHT: bold">// 有?者開啟了一個session1</span><br style="FONT-WEIGHT: bold" /><span id="lvlznvt" class="postbody" style="FONT-WEIGHT: bold">Session session1 = sessionFactory.openSession();</span><br style="FONT-WEIGHT: bold" /><span id="fpzvxvt" class="postbody" style="FONT-WEIGHT: bold">// 在這之後,馬上有另一個用?開啟了session2</span><br style="FONT-WEIGHT: bold" /><span id="bbhxzvn" class="postbody" style="FONT-WEIGHT: bold">Session session2 = sessionFactory.openSession();</span><br style="FONT-WEIGHT: bold" /><span id="fnhrdjz" class="postbody" style="FONT-WEIGHT: bold">        </span><br style="FONT-WEIGHT: bold" /><span id="ddxxjxn" class="postbody" style="FONT-WEIGHT: bold">Integer id = new Integer(1);</span><br style="FONT-WEIGHT: bold" /><span id="vfrjvlz" class="postbody" style="FONT-WEIGHT: bold"></span><br style="FONT-WEIGHT: bold" /><span id="prpjttp" class="postbody" style="FONT-WEIGHT: bold">// 使用?查詢資料        </span><br style="FONT-WEIGHT: bold" /><span id="nnfpzxf" class="postbody" style="FONT-WEIGHT: bold">User userV1 = (User) session1.load(User.class, id);</span><br style="FONT-WEIGHT: bold" /><span id="nphlnlj" class="postbody" style="FONT-WEIGHT: bold">// 使用?查詢同一{資?/span><br style="FONT-WEIGHT: bold" /><span id="pprtxtj" class="postbody" style="FONT-WEIGHT: bold">User userV2 = (User) session2.load(User.class, id);</span><br style="FONT-WEIGHT: bold" /><span id="btxrjzx" class="postbody" style="FONT-WEIGHT: bold"></span><br style="FONT-WEIGHT: bold" /><span id="llrfhnj" class="postbody" style="FONT-WEIGHT: bold">// 此時兩個版本號是相同的</span><br style="FONT-WEIGHT: bold" /><span id="tdnrthf" class="postbody" style="FONT-WEIGHT: bold">System.out.println(" v1 v2 " </span><br style="FONT-WEIGHT: bold" /><span id="jrlnhfl" class="postbody" style="FONT-WEIGHT: bold">                + userV1.getVersion().intValue() + " " </span><br style="FONT-WEIGHT: bold" /><span id="xzjlvlj" class="postbody" style="FONT-WEIGHT: bold">                + userV2.getVersion().intValue());</span><br style="FONT-WEIGHT: bold" /><span id="xzjvxlb" class="postbody" style="FONT-WEIGHT: bold">        </span><br style="FONT-WEIGHT: bold" /><span id="hplnnvj" class="postbody" style="FONT-WEIGHT: bold">Transaction tx1 = session1.beginTransaction();</span><br style="FONT-WEIGHT: bold" /><span id="bdnrrhf" class="postbody" style="FONT-WEIGHT: bold">Transaction tx2 = session2.beginTransaction();</span><br style="FONT-WEIGHT: bold" /><span id="fxzzljh" class="postbody" style="FONT-WEIGHT: bold"></span><br style="FONT-WEIGHT: bold" /><span id="dfzzdjr" class="postbody" style="FONT-WEIGHT: bold">// 使用?更新資料        </span><br style="FONT-WEIGHT: bold" /><span id="rjbvffd" class="postbody" style="FONT-WEIGHT: bold">userV1.setAge(new Integer(31));</span><br style="FONT-WEIGHT: bold" /><span id="fpjlvdb" class="postbody" style="FONT-WEIGHT: bold">tx1.commit();</span><br style="FONT-WEIGHT: bold" /><span id="hzrlxld" class="postbody" style="FONT-WEIGHT: bold"></span><br style="FONT-WEIGHT: bold" /><span id="ppbddlj" class="postbody" style="FONT-WEIGHT: bold">// 此時由於資料更新Q資料n中的版本號遞增了</span><br style="FONT-WEIGHT: bold" /><span id="fxrlvtj" class="postbody" style="FONT-WEIGHT: bold">// 兩筆資料版本號不一樣了</span><br style="FONT-WEIGHT: bold" /><span id="vxxblbr" class="postbody" style="FONT-WEIGHT: bold">System.out.println(" v1 v2 " </span><br style="FONT-WEIGHT: bold" /><span id="dprjdlj" class="postbody" style="FONT-WEIGHT: bold">                + userV1.getVersion().intValue() + " " </span><br style="FONT-WEIGHT: bold" /><span id="llnprpv" class="postbody" style="FONT-WEIGHT: bold">                + userV2.getVersion().intValue());</span><br style="FONT-WEIGHT: bold" /><span id="zjlvpvd" class="postbody" style="FONT-WEIGHT: bold">        </span><br style="FONT-WEIGHT: bold" /><span id="hprnxnd" class="postbody" style="FONT-WEIGHT: bold">// userV2 ?age 資料還是舊的 </span><br style="FONT-WEIGHT: bold" /><span id="dnpzlrp" class="postbody" style="FONT-WEIGHT: bold">// 資料更新</span><br style="FONT-WEIGHT: bold" /><span id="nxrbdtr" class="postbody" style="FONT-WEIGHT: bold">userV2.setName("justin");</span><br style="FONT-WEIGHT: bold" /><span id="jtfxbpn" class="postbody" style="FONT-WEIGHT: bold">// 因版本號比資料n中的?/span><br style="FONT-WEIGHT: bold" /><span id="fpzlxdr" class="postbody" style="FONT-WEIGHT: bold">// 送出更新資料會失敗,丟出</span><span style="FONT-WEIGHT: bold">StableObjectStateException例外</span><br style="FONT-WEIGHT: bold" /><span id="tlxzjpf" class="postbody" style="FONT-WEIGHT: bold">tx2.commit();</span><br style="FONT-WEIGHT: bold" /><span id="ldxrbhp" class="postbody" style="FONT-WEIGHT: bold">        </span><br style="FONT-WEIGHT: bold" /><span id="jzbfpfb" class="postbody" style="FONT-WEIGHT: bold">session1.close();</span><br style="FONT-WEIGHT: bold" /><span id="xpjdnvt" class="postbody" style="FONT-WEIGHT: bold">session2.close();</span><br /><span id="vdztdrr" class="postbody"></span></div><p><span id="ttxzbhx" class="postbody"><br />運行以下的程式片D,會出現以下的i果Q?br /></span></p><div style="MARGIN-LEFT: 40px; FONT-FAMILY: Courier New,Courier,monospace"><span id="xxjjnjh" class="postbody"><span style="FONT-WEIGHT: bold">Hibernate: select user0_.id as id0_, user0_.version as version0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=?</span></span><br style="FONT-WEIGHT: bold" /><span id="tjnphnf" class="postbody"><span style="FONT-WEIGHT: bold">Hibernate: select user0_.id as id0_, user0_.version as version0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=?</span></span><br style="FONT-WEIGHT: bold" /><span id="vvpjlrz" class="postbody"><span style="FONT-WEIGHT: bold"> v1 v2 0 0</span></span><br style="FONT-WEIGHT: bold" /><span id="dtvrtrf" class="postbody"><span style="FONT-WEIGHT: bold">Hibernate: update user set version=?, name=?, age=? where id=? and version=?</span></span><br style="FONT-WEIGHT: bold" /><span id="xrblnlj" class="postbody"><span style="FONT-WEIGHT: bold"> v1 v2 1 0</span></span><br style="FONT-WEIGHT: bold" /><span id="phrlndb" class="postbody"><span style="FONT-WEIGHT: bold">Hibernate: update user set version=?, name=?, age=? where id=? and version=?</span></span><br style="FONT-WEIGHT: bold" /><span id="xpbbvlt" class="postbody" style="COLOR: rgb(255,0,0)"><span style="FONT-WEIGHT: bold">16:11:43,187 ERROR AbstractFlushingEventListener:277 - Could not synchronize database state with session</span></span><br style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)" /><span id="zhtvfdl" class="postbody" style="COLOR: rgb(255,0,0)"><span style="FONT-WEIGHT: bold">org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [onlyfun.caterpillar.User#1]</span></span><br style="FONT-WEIGHT: bold; COLOR: rgb(255,0,0)" /><span id="llvxrxx" class="postbody" style="COLOR: rgb(255,0,0)"><span style="FONT-WEIGHT: bold">    at org.hibernate.persister.entity.BasicEntityPersister.check(BasicEntityPersister.java:1441)</span></span><br /><span id="jrlnxnv" class="postbody"></span></div><p><span id="vfhrjrh" class="postbody"><span style="FONT-FAMILY: Courier New,Courier,monospace"></span><br />由於新的版本號是1Q而userV2的版本號還是0Q因此更新失敗丟出StableObjectStateExceptionQ您可以捕捉這個例外作善後處理Q例如在處理中重新讀取資料n中的資料Q同時將目前的資料與資料庫中的資料秀ZQ讓使用者有會比對不一致的資料Q以決定要變更的部䆾Q或者您可以a計E式自動讀取新的資料,並比真正要更新的資料,這一切可以在背景埯Q而不用讓您的使用者知道?<br /><br />要注意的是,由於樂觀鎖定是用系i׃的程式來控制Q而不是用資料n中的鎖定制Q因而如果有人特意自行更新版本訊息來過檢查Q則鎖定制會無效Q例如在上例中自行更改userV2的version屬性,使之與資料n中的版本號相同的話就不會有錯誤,像這樣版本號被更改Q或是由D料是由外部系ip來Q因而版本資a不受控制時Q鎖定機制將會有問題Q設a時必須注意?br /></span><br /><br />from : <a >http://caterpillar.onlyfun.net/Gossip/HibernateGossip/HibernateGossip.html</a></p><img src ="http://www.tkk7.com/yyg1107/aggbug/94336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yyg1107/" target="_blank">young</a> 2007-01-17 01:29 <a href="http://www.tkk7.com/yyg1107/articles/94336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:如何在JAVA中用日?http://www.tkk7.com/yyg1107/articles/81469.htmlyoungyoungThu, 16 Nov 2006 03:03:00 GMThttp://www.tkk7.com/yyg1107/articles/81469.htmlhttp://www.tkk7.com/yyg1107/comments/81469.htmlhttp://www.tkk7.com/yyg1107/articles/81469.html#Feedback0http://www.tkk7.com/yyg1107/comments/commentRss/81469.htmlhttp://www.tkk7.com/yyg1107/services/trackbacks/81469.html阅读全文

young 2006-11-16 11:03 发表评论
]]>
Jakarta Commons:巧用cdlg1 Q?Q?/title><link>http://www.tkk7.com/yyg1107/articles/77720.html</link><dc:creator>young</dc:creator><author>young</author><pubDate>Fri, 27 Oct 2006 11:42:00 GMT</pubDate><guid>http://www.tkk7.com/yyg1107/articles/77720.html</guid><wfw:comment>http://www.tkk7.com/yyg1107/comments/77720.html</wfw:comment><comments>http://www.tkk7.com/yyg1107/articles/77720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yyg1107/comments/commentRss/77720.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yyg1107/services/trackbacks/77720.html</trackback:ping><description><![CDATA[ <strong>3.2 HttpClient</strong> <p style="TEXT-INDENT: 2em">  ?概况Q这个API扩展了java.net包,提供了模拟浏览器的功能?</p> <p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?</p> <p style="TEXT-INDENT: 2em">  ?何时适用Q当你要构造Web览器的功能Q当你的应用需要一U高效的办法q行HTTP/HTTPS通信时?</p> <p style="TEXT-INDENT: 2em">  ?CZ应用QHttpClientDemo.java。要求CLASSPATH中有commons-httpclient.jarQcommon-logging.jar。要求用JDK 1.4或更高版本?</p> <p style="TEXT-INDENT: 2em">  ?说明Q?</p> <p style="TEXT-INDENT: 2em">  HttpClient扩展和增Z标准java.net包,是一个内容广泛的代码库,功能极其丰富Q能够构造出各种使用HTTP协议的分布式应用Q或者也可以嵌入到现有应用,为应用增加访问HTTP协议的能力。在CommonsE_版中QHttpClient的文档似乎要比其他包更完善一些,而且q带有几个实例。下面我们通过一个简单的例子来了解如何提取一个Web面QHttpClient文档中也有一个类似的例子Q我们将扩充那个例子使其支持SSL。注意本例需要JDK 1.4支持Q因为它要用到Java Secure Socket Connection库,而这个库只有JDK 1.4及更高的版本才提供?</p> <p style="TEXT-INDENT: 2em">  ?首先定一个可以通过HTTPS下蝲的页面,本例使用的是https://www.paypal.com/。同时确?JAVA_HOME%/jre/lib/security/java.security文g包含了下面这行代码:security.provider.2=com.sun.net.ssl.internal.ssl.Provider?</p> <p style="TEXT-INDENT: 2em">  除了q些讄之外QHTTPSq接的处理方式没有其他特别的地方--臛_对于本例来说如此。不q,如果q程|站使用的根证书不被你用的Java认可Q则首先必须导入它的证书?</p> <p style="TEXT-INDENT: 2em">  ?创徏一个HttpClient的实例。HttpClientcd以看成是应用的主驱动E序Q所有针对网l的功能都依赖于它。HttpClientc需要一个Connection Manager来管理连接。HttpConnectionManager允许我们创徏自己的连接管理器Q或者,我们也可以直接用内建的SimpleHttpConnectionManager或MultiThreadedHttpConnectionManagercR如果在创徏HttpClient时没有指定连接管理器QHttpClient默认使用SimpleHttpConnectionManager?<br /></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 创徏一个HttpClient的实?/span> <span style="COLOR: #008000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #000000">HttpClient client </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> HttpClient();</span> </div> <br />?创徏一个HttpMethod的实例,即确定与q程服务器的通信要采用哪U传输方式,HTTP允许采用的传输方式包括:GETQPOSTQPUTQDELETEQHEADQOPTIONSQ以及TRACE。这些传输方式分别作Z个独立的cd玎ͼ但所有这些类都实现HttpMethod接口。在本例中,我们使用的是GetMethodQ创建GetMethod实例时在参数中指定我们想要GET的URL?<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创徏一个HttpMethod的实?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">HttpMethod method </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> GetMethod(url);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />?执行HttpMethod定义的提取操作。执行完毕后QexecuteMethodҎ返回远E服务器报告的状态代码。注意executeMethod属于HttpClientQ而不是HttpMethod?<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 执行HttpMethod定义的提取操?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">statusCode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> client.executeMethod(method);</span></div><br />?d服务器返回的应答。如果前面的q接操作p|Q程序将遇到HttpException或IOExceptionQ其中IOException一般意味着|络出错Ql尝试也不太可能获得成功。服务器q回的应{可以按照多U方式读取,例如作ؓ一个字节数l,作ؓ一个输入流Q或者作Z个String。获得服务器q回的应{后Q我们就可以按照自己的需要Q意处|它了? <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] responseBody </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> method.getResponseBody();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br /> ?最后要做的是释放q接?<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">method.releaseConnection();</span></div><br /><p style="TEXT-INDENT: 2em">  以上只是非常单地介绍了一下HttpClient库,HttpClient实际的功能要比本文介l的丰富得多Q不仅健壮而且高效Q请参阅API文档了解详情?</p><p style="TEXT-INDENT: 2em">  <b>3.3 Net</b></p><p style="TEXT-INDENT: 2em">  ?概况Q一个用于操作Internet基础协议的底层API?</p><p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?</p><p style="TEXT-INDENT: 2em">  ?何时适用Q当你想要访问各UInternet底层协议之时QFingerQWhoisQTFTPQTelnetQPOP3QFTPQNNTPQ以及SMTPQ?</p><p style="TEXT-INDENT: 2em">  ?CZ应用QNetDemo.java。要求CLASSPATH中包含commons-net-1.0.0.jar?</p><p style="TEXT-INDENT: 2em">  ?说明Q?</p><p style="TEXT-INDENT: 2em">  Net包是一个强大、专业的cdQ类库里的类最初属于一个叫做NetComponents的商业品?</p><p style="TEXT-INDENT: 2em">  Net包不仅支持对各种低层ơ协议的讉KQ而且q提供了一个高层的抽象。大多数情况下,Net包提供的抽象已能满一般需要,它得开发者不再需要直接面对各U协议的SocketU的低层命o。用高层抽象ƈ不减Q何功能,Net API在这斚w做得很出Ԍ既提供了_的功能,又不至于在特色方面作q多的妥协?</p><p style="TEXT-INDENT: 2em">  SocketClient是支持所有协议的基础c,它是一个抽象类Q聚合了各种协议都需要的公用功能。各U不同协议的使用q程其实很相|首先利用connectҎ建立一个指向远E服务器的连接,执行必要的操作,最后终止与服务器的q接。下面通过实例介绍具体的用步骤?<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ① 创Z个客L。我们将用NNTPClient<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  从新L务器下蝲新闻l清单?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">client </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> NNTPClient();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ② 利用前面创建的客户端连接到新闻服务器?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  q里选用的是一个新ȝ较少的服务器?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">client.connect(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">aurelia.deine.net</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ③ 提取新ȝ清单。下面的命o返回一?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  NewsGroupInfo对象的数l。如果指定的?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  务器上不包含新闻l,q回的数l将是空的,<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  如果遇到了错误,则返回值是null?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> client.listNewsgroups();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.tkk7.com/images/dot.gif" /><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ④ 最后终止与服务器的q接?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (client.isConnected())<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />   client.disconnect();</span></div><br />必须说明的是QlistNewsgroups命o可能需要较长的旉才能q回Q一斚w是因为网l速度的媄响,另外也可能是׃新闻l清单往往是很庞大的。NewsGroupInfo对象包含有关新闻l的详细信息Qƈ提供了一些操作新ȝ的命令,比如提取文章L、最后发布的文章、发布文章的权限Q等{? <p style="TEXT-INDENT: 2em">  其他客户端,例如FingerClient、POP3Client、TelnetClient{,用法也差不多?</p><p style="TEXT-INDENT: 2em">  l束语:有关Web相关cd其他cȝ介绍到此结束。在下一文章中Q我们将探讨XMLcd包装c,最后一文章则介绍工具cR?</p><p style="TEXT-INDENT: 2em">  希望读者有兴趣试试本文提供的程序实例。很多时候Jakarta Commonslh以؜q感觉Q希望本文你加׃对Jakarta Commons了解Q或者至引起了你对Commons子项目以及它提供的各U实用API和库的兴?</p><p style="TEXT-INDENT: 2em">请从q里下蝲本文代码Q?a href="" target="_blank">JakartaCommons1_code.zip</a></p><img src ="http://www.tkk7.com/yyg1107/aggbug/77720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yyg1107/" target="_blank">young</a> 2006-10-27 19:42 <a href="http://www.tkk7.com/yyg1107/articles/77720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakarta Commons:巧用cdlg1 Q?Q?/title><link>http://www.tkk7.com/yyg1107/articles/77719.html</link><dc:creator>young</dc:creator><author>young</author><pubDate>Fri, 27 Oct 2006 11:38:00 GMT</pubDate><guid>http://www.tkk7.com/yyg1107/articles/77719.html</guid><wfw:comment>http://www.tkk7.com/yyg1107/comments/77719.html</wfw:comment><comments>http://www.tkk7.com/yyg1107/articles/77719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yyg1107/comments/commentRss/77719.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yyg1107/services/trackbacks/77719.html</trackback:ping><description><![CDATA[              使用q类Ҏ有什么好处呢Q显Ӟ它得我们有可能通过一U统一的方式处理所有数据类型。所有BuilderҎ的用法都和上例相伹{? <p style="TEXT-INDENT: 2em">  Java没有C风格的枚NQؓ此,lang包提供了一个类型安全的EnumcdQ填补了I白。EnumcL抽象的,如果你要创徏枚D量,p扩展EnumcR下面的例子清楚地说明了Enum的用法?<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.commons.lang.</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">.Enum;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.List;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Iterator;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    <br /><img id="Codehighlighter1_156_700_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_700_Open_Text.style.display='none'; Codehighlighter1_156_700_Closed_Image.style.display='inline'; Codehighlighter1_156_700_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_156_700_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_700_Closed_Text.style.display='none'; Codehighlighter1_156_700_Open_Image.style.display='inline'; Codehighlighter1_156_700_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> OnTV </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> Enum </span><span id="Codehighlighter1_156_700_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_156_700_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            <br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> OnTV IDOL</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> OnTV(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Idol</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> OnTV SURVIVOR </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> OnTV(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Survivor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> OnTV SEINFELD </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> OnTV(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Seinfeld</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_378_396_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_396_Open_Text.style.display='none'; Codehighlighter1_378_396_Closed_Image.style.display='inline'; Codehighlighter1_378_396_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_378_396_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_378_396_Closed_Text.style.display='none'; Codehighlighter1_378_396_Open_Image.style.display='inline'; Codehighlighter1_378_396_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> OnTV(String show) </span><span id="Codehighlighter1_378_396_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_378_396_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">(show);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_438_484_Open_Image" onclick="this.style.display='none'; Codehighlighter1_438_484_Open_Text.style.display='none'; Codehighlighter1_438_484_Closed_Image.style.display='inline'; Codehighlighter1_438_484_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_438_484_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_438_484_Closed_Text.style.display='none'; Codehighlighter1_438_484_Open_Image.style.display='inline'; Codehighlighter1_438_484_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> OnTV getEnum(String show)</span><span id="Codehighlighter1_438_484_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_438_484_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (OnTV) getEnum(OnTV.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">, show);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_518_554_Open_Image" onclick="this.style.display='none'; Codehighlighter1_518_554_Open_Text.style.display='none'; Codehighlighter1_518_554_Closed_Image.style.display='inline'; Codehighlighter1_518_554_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_518_554_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_518_554_Closed_Text.style.display='none'; Codehighlighter1_518_554_Open_Image.style.display='inline'; Codehighlighter1_518_554_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Map getEnumMap() </span><span id="Codehighlighter1_518_554_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_518_554_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> getEnumMap(OnTV.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_590_627_Open_Image" onclick="this.style.display='none'; Codehighlighter1_590_627_Open_Text.style.display='none'; Codehighlighter1_590_627_Closed_Image.style.display='inline'; Codehighlighter1_590_627_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_590_627_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_590_627_Closed_Text.style.display='none'; Codehighlighter1_590_627_Open_Image.style.display='inline'; Codehighlighter1_590_627_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> List getEnumList() </span><span id="Codehighlighter1_590_627_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_590_627_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> getEnumList(OnTV.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_664_698_Open_Image" onclick="this.style.display='none'; Codehighlighter1_664_698_Open_Text.style.display='none'; Codehighlighter1_664_698_Closed_Image.style.display='inline'; Codehighlighter1_664_698_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_664_698_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_664_698_Closed_Text.style.display='none'; Codehighlighter1_664_698_Open_Image.style.display='inline'; Codehighlighter1_664_698_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Iterator iterator() </span><span id="Codehighlighter1_664_698_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_664_698_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> iterator(OnTV.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>以后我们可以按照下面的方式使用枚D变量QOnTV.getEnum("Idol")。该调用从前面创建的枚D数据cdq回Idol。这个例子比较简单,实际上Enumc还提供了许多有用的ҎQ请参见本文后面提供的完整实例?</p><p style="TEXT-INDENT: 2em">  <b>2.4 Collections</b></p><p style="TEXT-INDENT: 2em">  ?概况Q扩展了Java Collection框架Q增M新的数据l构、P代机制和比较操作W? </p><p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>? </p><p style="TEXT-INDENT: 2em">  ?何时适用Q几乎所有需要操作数据结构的重要Java开发项目都可以使用Collections API。和Java的标准实现相比,Collections API有着诸多优势? </p><p style="TEXT-INDENT: 2em">  ?CZ应用QCollectionsDemo.java。要求CLASSPATH中包含commons-collections.jar? </p><p style="TEXT-INDENT: 2em">  ?说明Q? </p><p style="TEXT-INDENT: 2em">  要在有限的文章篇q之内详地介绍 Collections API实在是太困难了,不过q里仍将늛大多数最重要的类Q希望能够引起你的兴,认真了解一下其余的cRCollections本n的文档也提供了许多资料ƈ解释了每一个类的用法? </p><p style="TEXT-INDENT: 2em">  Bag接口扩展标准的Java CollectionQ允许生成计数器来跟tBag里面的所有元素。当你想要跟t进出某个集合的元素的LӞBag是非常有用的。由于Bag本n是一个接口,所以实际用的应该是实C该接口的c,例如HashBag或TreeBag--从这些类的名字也可以看出QHashBag实现的是一个HashMap的BagQ而TreeBag实现的是TreeMap的Bag。Bag接口中两个最重要的方法是QgetCount(Object o)Q用来返回Bag里面特定对象的出现次敎ͼuniqueSet()Q返回所有唯一元素? </p><p style="TEXT-INDENT: 2em">  Buffer接口允许按照预定义的ơ序删除集合中的对象Q删除次序可以是LIFOQLast In First OutQ后q先出)Q或FIFOQFirst In First OutQ先q先出)Q另外还可以是自定义的次序。下面来看看如何实现一个BufferQ按照自然次序删除元素? </p><p style="TEXT-INDENT: 2em">  BinaryHeapcdCBuffer接口Q能够按照自然次序删除元素。如果要颠倒次序,则必M入一个falseQ告诉Heap采用自然ơ序的逆序?/p><p> </p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BinaryHeap heap </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BinaryHeap();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 元素加入该Heap</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">heap.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 删除一个元?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">heap.remove();</span></div><br />调用该Heap的removeQ按照自然次序,元素集合中的-10被删除。如果我们要求按照逆序排序Q则被删除的是5? <p style="TEXT-INDENT: 2em">  FastArrayList、FastHashMap和FastTreeMapc能够按照两U模式操作,越了与它们对应的标准Collection。第一U模式是"慢模?Q类的修Ҏ作(d、删除元素)是同步的。与此相对,另一U模式是"快模?Q对q些cȝ讉K假定为只L作,因此不需要同步,速度较快。在快模式中Q结构性的改动通过下列方式完成Q首先克隆现有的c,修改克隆得到的类Q最后用克隆得到的类替换原有的类。FastArrayList、FastHashMap和FastTreeMapcȝ别适合于那U初始化之后大部分操作都是只L作的多线E环境? </p><p style="TEXT-INDENT: 2em">  iterators包ؓ各种集合和对象提供标准Java Collection包没有提供的q代器。本文的CZ应用C了ArrayIteratorQ通过q代方式讉KArray的内宏Viterators包里面各UP代器的用法基本上与标准Javaq代器一栗? </p><p style="TEXT-INDENT: 2em">  最后,comparators包提供了一些实用的比较W。所谓比较符其实也是一个类Q它定义的是如何比较两个属于同一cȝ对象Q决定它们的排序ơ序。例如,在前面提到的BuffercMQ我们可以定义自q比较W,用自定义的比较符来决定元素的排序ơ序Q而不是采用元素的自然排序ơ序。下面来看看具体的实现经q?<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ① 创Z个BinaryHeapc,但这一ơ参C<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    指定NullComparator。NullComparator比较<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    null与其他对象,ҎnullsAreHigh标记?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    判断null值比其他对象大还是小Q如?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    nullsAreHigh的值是falseQ则认ؓnull要比<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    其他对象?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BinaryHeap heap2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BinaryHeap<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> (</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> NullComparator(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ② 将一些数据(包括几个null|加入heapQ?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">heap2.add(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap2.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap2.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Integer(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-6</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />heap2.add(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ③ 最后删除一个元素,Bag包含的null减?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    一个,因ؓnull要比其他对象?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">heap2.remove();</span></div><br />有关其他cCommonslg的介l就到这里结束。如果你想了解更多细节信息,请参见API文档Q最好再看看q些包的源代码? <p style="TEXT-INDENT: 2em">  <b>三、Webc?/b></p><p style="TEXT-INDENT: 2em">  Webcȝlg用来执行与Web相关的Q务? </p><p style="TEXT-INDENT: 2em">  <b>3.1 FileUpload</b></p><p style="TEXT-INDENT: 2em">  ?概况Q一个可以直接用的文g上蝲lg? </p><p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>。由于这个组件尚未正式发布,今年二月发布的Beta版又有许多BUGQ所以徏议从<a target="_blank">nightly builds</a>下蝲最新的版本? </p><p style="TEXT-INDENT: 2em">  ?何时适用Q当你想要在Java服务器环境中加入一个易用、高性能的文件上载组件之时? </p><p style="TEXT-INDENT: 2em">  ?CZ应用Qfileuploaddemo.jspQfileuploaddemo.htmQ和msg.jsp。要求服务器端应用目录的WEB-INF/lib下面有commons-fileupload-1.0-dev.jar? </p><p style="TEXT-INDENT: 2em">  ?说明Q? </p><p style="TEXT-INDENT: 2em">  FileUploadlg解决了常见的文g上蝲问题。它提供了一个易用的接口来管理上载到服务器的文gQ可用于JSP和Servlet之中。FileUploadlg遵从RFC1867Q它分析输入hQ向应用E序提供一pd上蝲到服务器的文件。上载的文g可以保留在内存中Q也可以攑օ一个时位|(允许配置一个表C文件大的参数Q如果上载的文g过了该参数指定的大,则把文g写入一个时位|)。另外还有一些参数可供配|,包括可接受的最大文件、时文件的位置{? </p><p style="TEXT-INDENT: 2em">  下面介绍一下用FileUploadlg的步骤? </p><p style="TEXT-INDENT: 2em">  首先创徏一个HTML面。注意,凡是要上载文件的表单都必设|enctype属性,且属性的值必Lmultipart/form-dataQ同时请求方法必LPOST。下面的表单除了上蝲两个文gQ另外还有一个普通的文本输入框: <br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><</span><span style="COLOR: #000000">form name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myform</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> action</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">fileuploaddemo.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> method</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">post</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> enctype</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">multipart/form-data</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    输入你的名字:</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">br </span><span style="COLOR: #000000">/></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">input type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> size</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/><</span><span style="COLOR: #000000">br </span><span style="COLOR: #000000">/></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  囑Ş:</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">br </span><span style="COLOR: #000000">/></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">input type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myimage</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">><</span><span style="COLOR: #000000">br</span><span style="COLOR: #000000">/></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  文g:</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">br </span><span style="COLOR: #000000">/></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">input type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myfile</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">><</span><span style="COLOR: #000000">br </span><span style="COLOR: #000000">/><</span><span style="COLOR: #000000">br </span><span style="COLOR: #000000">/></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">input type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">submit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Submit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />     value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Submit your files</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/></span></div><br />接下来创建JSP面?<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ① 检查输入请求是否ؓmultipart的表单数据?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isMultipart </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FileUpload.<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  isMultipartContent(request);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ② ؓ该请求创Z个句柄,通过它来解析h。执?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    解析后,所有的表单目都保存在一个List中?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">DiskFileUpload upload </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DiskFileUpload();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 通过句柄解析hQ解析得到的目保存在一个List?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">List items </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> upload.parseRequest(request);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ③ 通过循环依次获得List里面的文仉目。要区分表示<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    文g的项目和普通的表单输入目Q用isFormField()<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    Ҏ。根据处理请求的要求Q我们可以保存上载的?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    Ӟ或者一个字节一个字节地处理文g内容Q或者打<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    开文g的输入流?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Iterator itr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> items.iterator();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_486_1054_Open_Image" onclick="this.style.display='none'; Codehighlighter1_486_1054_Open_Text.style.display='none'; Codehighlighter1_486_1054_Closed_Image.style.display='inline'; Codehighlighter1_486_1054_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_486_1054_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_486_1054_Closed_Text.style.display='none'; Codehighlighter1_486_1054_Open_Image.style.display='inline'; Codehighlighter1_486_1054_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(itr.hasNext()) </span><span id="Codehighlighter1_486_1054_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_486_1054_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    FileItem item </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (FileItem) itr.next();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 查当前的目是普通的表单元素Q还是一个上载的文g</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_590_765_Open_Image" onclick="this.style.display='none'; Codehighlighter1_590_765_Open_Text.style.display='none'; Codehighlighter1_590_765_Closed_Image.style.display='inline'; Codehighlighter1_590_765_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_590_765_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_590_765_Closed_Text.style.display='none'; Codehighlighter1_590_765_Open_Image.style.display='inline'; Codehighlighter1_590_765_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(item.isFormField()) </span><span id="Codehighlighter1_590_765_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_590_765_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 获得表单域的名字</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    String fieldName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> item.getFieldName();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 如果表单域的名字是name?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(fieldName.equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        request.setAttribute(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">msg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, <br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Thank You: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> item.getString());<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img id="Codehighlighter1_772_1052_Open_Image" onclick="this.style.display='none'; Codehighlighter1_772_1052_Open_Text.style.display='none'; Codehighlighter1_772_1052_Closed_Image.style.display='inline'; Codehighlighter1_772_1052_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_772_1052_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_772_1052_Closed_Text.style.display='none'; Codehighlighter1_772_1052_Open_Image.style.display='inline'; Codehighlighter1_772_1052_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_772_1052_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_772_1052_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 该项目是一个上载的文gQ把它保存到盘?br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 注意item.getName()<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 会返回上载文件在客户端的完整路径名称Q这g是一个BUG?br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 册个问题,q里使用了fullFile.getName()?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        File fullFile  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(item.getName());  <br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        File savedFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        (getServletContext().getRealPath(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        fullFile.getName());<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        item.write(savedFile);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />我们可以通过上蝲句柄的upload.setSizeMax来限制上载文件的大小。当上蝲文g的大超q允许的值时Q程序将遇到异常。在上面的例子中Q文件大的限制值是-1Q表C允怸载Q意大的文g? <p style="TEXT-INDENT: 2em">  q有其他一些略有变化的使用形式Q正如前面所指出的,我们可以在上载的文g上打开一个输入流Q或者让它们ȝ在内存中直至I间占用辑ֈ一定的限制|或者在判断文gcd的基上,以String或Byte数组的Ş式获取其内容Q或者直接删除文件。这一切都只要使用FileItemcL供的Ҏ可以方便地做到QDefaultFileItem是FileItem的一个实玎ͼ?</p><img src ="http://www.tkk7.com/yyg1107/aggbug/77719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yyg1107/" target="_blank">young</a> 2006-10-27 19:38 <a href="http://www.tkk7.com/yyg1107/articles/77719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakarta Commons:巧用cdlg1 Q?Q?/title><link>http://www.tkk7.com/yyg1107/articles/77718.html</link><dc:creator>young</dc:creator><author>young</author><pubDate>Fri, 27 Oct 2006 11:36:00 GMT</pubDate><guid>http://www.tkk7.com/yyg1107/articles/77718.html</guid><wfw:comment>http://www.tkk7.com/yyg1107/comments/77718.html</wfw:comment><comments>http://www.tkk7.com/yyg1107/articles/77718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yyg1107/comments/commentRss/77718.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yyg1107/services/trackbacks/77718.html</trackback:ping><description><![CDATA[Jakarta Commons是Jakarta的子目Q它创徏和维护着许多独立软g包,q些包一般与其他框架或品无养I其中攉了大量小型、实用的lgQ大部分面向服务器端~程? <p style="TEXT-INDENT: 2em">  Commons的包分成两部分:SandboxQCommons代码库。Sandbox是一个测试^収ͼ用来验各U设惟뀁计划。本文介l的lg属于Commons代码库,文章展C各个组件的功能、适用场合Qƈ通过单的例子介绍其用法? </p><p style="TEXT-INDENT: 2em">  <b>一、概q?/b></p><p style="TEXT-INDENT: 2em">  可重用性是Jakarta Commons目的灵所在。这些包在设计阶D就已经考虑了可重用性问题。其中一些包Q例如Commons里面用来记录日志的Logging包,最初是为其他项目设计的Q例如Jakarta Struts目Q当Z发现q些包对于其他项目也非常有用Q能够极大地帮助其他目的开发,他们军_些包构造一?公共"的存放位|,q就是Jakarta Commons目? </p><p style="TEXT-INDENT: 2em">  Z真正提高可重用性,每一个包都必M依赖于其他大型的框架或项目。因此,Commons目的包基本上都是独立的Q不仅是相对于其他项目的独立Q而且相对于Commons内部的大部分其他包独立。虽然存在一些例外的情况Q例如Betwixt包要用到XML APIQ但l大部分只用最基本的APIQ其主要目的是要能够通过单的接口方便地调用? </p><p style="TEXT-INDENT: 2em">  不过׃崇尚z,许多包的文档变得q于陋,~Zl护和支持,甚至有一部分q有错误的链接,文档也少得可怜。大部分的包需要我们自己去扑և其用法,甚至有时q需要我们自己去分析光用场合。本文将逐一介绍q些包,希望能够帮助你迅速掌握这一U篏了许多h心血的免费代码库? </p><p style="TEXT-INDENT: 2em">  说明QJakarta Commons?a target="_blank">Apache Commons</a>是不同的Q后者是Apache Software Foundation的一个顶层项目,前者则是Jakarta目的一个子目Q同是也是本文要讨论的主角。本文后面凡是提到Commons的地斚w是指Jakarta的Commons? </p><p style="TEXT-INDENT: 2em">  Z便于说明Q本文把Commons目十八个成品的组Ӟ排除了EL、Latka和JexlQ分?c,如下表所C? </p><p style="TEXT-INDENT: 2em"></p><center><img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://linux.ccidnet.com/col/attachment/2003/8/247208.gif" /></center><p style="TEXT-INDENT: 2em">  必须指出的是Q这U分cd是ؓ了方便文章说明,Commons目里面实际上ƈ不存在这U分c,同时q些分类的边界有时也存在一定的重叠? </p><p style="TEXT-INDENT: 2em">  本文首先介绍Web相关cd其他c里面的lgQ下一文章将涉及XML相关、包装这两类Q最后一文章专门介l属于工L的包? </p><p style="TEXT-INDENT: 2em">  <b>二、其他类</b></p><p style="TEXT-INDENT: 2em">  CLI、Discovery、Lang和Collections包归入其他类Q这是因为它们都各自针对某个明确、实用的目标,可谓专而精? </p><p style="TEXT-INDENT: 2em">  <b>2.1 CLI</b></p><p style="TEXT-INDENT: 2em">  ?概况QCLI即Command Line InterfaceQ也是"命o行接?Q它为JavaE序讉K和解析命令行参数提供了一U统一的接口? </p><p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a></p><p style="TEXT-INDENT: 2em">  ?何时适用Q当你需要以一U一致的、统一的方式访问命令行参数之时? </p><p style="TEXT-INDENT: 2em">  ?CZ应用QCLIDemo.java。CLASSPATH中必d含commons-cli-1.0.jar? </p><p style="TEXT-INDENT: 2em">  ?说明Q? </p><p style="TEXT-INDENT: 2em">  有多次你不得不Z个新的应用程序重新设计新的命令行参数处理方式Q如果能够只用某个单一的接口,l一完成诸如定义输入参数Q是否ؓ强制参数Q数D是字W串Q等{)、根据一pd规则分析参数、确定应用要采用的\径等dQ那该多好!{案在CLI? </p><p style="TEXT-INDENT: 2em">  在CLI中,每一个想要在命o中指定的参数都是一个Option对象。首先创Z个Options对象Q将各个Option对象加入Options对象Q然后利用CLI提供的方法来解析用户的输入参数。Option对象可以要求用户必须输入某个参数Q例如必d命o行提供文件名字。如果某个参数是必须的,创徏Option对象的时候就要显式地指定? </p><p style="TEXT-INDENT: 2em">  下面是用CLI的步骤?<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ①  创Z个OptionsQ?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Options options </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Options();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />options.addOption(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">t</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">current time</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ② 创Z个解析器Q分析输入:</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">CommandLineParser parser </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BasicParser();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />CommandLine cmd;<br /><img id="Codehighlighter1_195_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_195_234_Open_Text.style.display='none'; Codehighlighter1_195_234_Closed_Image.style.display='inline'; Codehighlighter1_195_234_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_195_234_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_195_234_Closed_Text.style.display='none'; Codehighlighter1_195_234_Open_Image.style.display='inline'; Codehighlighter1_195_234_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_195_234_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_195_234_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    cmd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> parser.parse(options, args); <br /><img id="Codehighlighter1_262_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_262_290_Open_Text.style.display='none'; Codehighlighter1_262_290_Closed_Image.style.display='inline'; Codehighlighter1_262_290_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_262_290_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_262_290_Closed_Text.style.display='none'; Codehighlighter1_262_290_Open_Image.style.display='inline'; Codehighlighter1_262_290_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (ParseException pe) </span><span id="Codehighlighter1_262_290_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_262_290_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    usage(options);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ③ 最后就可以Ҏ用户的输入,采取相应的操作:</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_348_420_Open_Image" onclick="this.style.display='none'; Codehighlighter1_348_420_Open_Text.style.display='none'; Codehighlighter1_348_420_Closed_Image.style.display='inline'; Codehighlighter1_348_420_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_348_420_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_348_420_Closed_Text.style.display='none'; Codehighlighter1_348_420_Open_Image.style.display='inline'; Codehighlighter1_348_420_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (cmd.hasOption(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)) </span><span id="Codehighlighter1_348_420_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_348_420_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    System.err.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Nice to meet you: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    cmd.getOptionValue(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">n</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />q就是用CLI的完整过E了。当ӞCLIq提供了其他高选项Q例如控制格式和解析q程{,但基本的使用思\仍是一致的。请参见本文最后提供的CZE序? <p style="TEXT-INDENT: 2em">  <b>2.2 Discovery</b></p><p style="TEXT-INDENT: 2em">  ?概况QDiscoverylg是发现模式(Discovery PatternQ的一个实玎ͼ它的目标是按照一U统一的方式定位和实例化类以及其他资源? </p><p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>? </p><p style="TEXT-INDENT: 2em">  ?何时适用Q当你想用最佳的法在JavaE序中查找Java接口的各U实C时? </p><p style="TEXT-INDENT: 2em">  ?应用实例QDiscoveryDemo.javaQMyInterface.javaQMyImpl1.javaQMyImpl2.javaQMyInterface。要求CLASSPATH中必d含commons-discovery.jar和commons-logging.jar? </p><p style="TEXT-INDENT: 2em">  ?说明Q? </p><p style="TEXT-INDENT: 2em">  Discovery的意思就?发现"Q它试图用最佳的法查找某个接口的所有已知的实现。在使用服务的场合,当我们想要查找某个服务的所有已知的提供者时QDiscoverylg其有用? </p><p style="TEXT-INDENT: 2em">  考虑一下这U情形:我们为某个特别复杂的d~写了一个接口,所有该接口的实现都用各不相同的方式来完成这个复杂Q务,最l用户可以根据需要来选择完成d的具体方式。那么,在这U情形下Q最l用户应该用什么办法来扑և接口的所有可用实玎ͼ卛_能的完成d的方式)呢? </p><p style="TEXT-INDENT: 2em">  上面描述的情形就是所谓的服务-服务提供者体pR服务的功能由接口描qͼ服务提供者则提供具体的实现。现在的问题是最l用戯用某U办法来Lpȝ中已l安装了哪些服务提供者。在q种情Ş下,Discoverylg很有用了,它不仅可以用来查N些实C特定接口的类Q而且q可以用来查找资源,例如囄或其他文件等。在执行q些操作ӞDiscovery遵从Sun的服务提供者体pL定义的规则? </p><p style="TEXT-INDENT: 2em">  ׃q个原因Q用Discoverylg实带来许多方便。请读者参阅本文后面示例程序中的接口MyInterface.java和两个实现类MyImpl1.java、MyImple2.javaQ了解下面例子的l节。在使用Discovery的时候要提供MyInterface文gQ把它放入META-INF/services目录Q注意该文g的名字对应接口的完整限定名称QFully Qualified NameQ,如果接口属于某个包,该文件的名字也必ȝ应地改变?br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ① 创Z个类装入器的实例?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">ClassLoaders loaders </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    ClassLoaders.getAppLoaders(MyInterface.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">, getClass(), </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ② 用DiscoverClass的实例来查找实现cR?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">DiscoverClass discover </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DiscoverClass(loaders);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ③ 查扑֮C指定接口的类Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Class implClass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> discover.find(MyInterface.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />System.err.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Implementing Provider: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> implClass.getName());</span></div><br />q行上面的代码,可以得到在MyInterface文g中注册的cR再ơ提醒,如果你的实现是封装在包里面的Q在q里注册的名字也应该作相应地修改Q如果该文g没有攑֜正确的位|,或者指定名字的实现cM能找到或实例化,E序抛出DiscoverExceptionQ表C找不到W合条g的实现。下面是MyInterface文g内容的一个例子:MyImpl2 # Implementation 2? <p style="TEXT-INDENT: 2em">  当然Q实现类的注册办法ƈ非只有这么一U,否则的话Discovery的实用性就要大打折扣了Q实际上Q按照Discovery内部的类查找机制Q按照这U方法注册的cd是Discovery最后找到的cR另一U常用的注册Ҏ是通过pȝ属性或用户定义的属性来传递实现类的名字,例如Q放弃META-INF/services目录下的文gQ改为执行java -DMyInterface=MyImpl1 DiscoveryDemo命o来运行示例程序,q里的系l属性是接口的名字,值是该接口的提供者,q行的结果是完全一L? </p><p style="TEXT-INDENT: 2em">  Discoveryq可以用来创建服务提供者的(singleton)实例q调用其ҎQ语法如下:((MyInterface)discover.newInstance(MyInterface.class)).myMethod();。注意在q个例子中,我们q不知道到底哪一个服务提供者实CmyMethodQ甚x们根本不必关心这一炏V具体的情Ş与运行这D代码的方式以及q行环境中已l注册了什么服务提供者有养I在不同的环境下运行,实际得到的服务提供者可能不同? </p><p style="TEXT-INDENT: 2em">  <b>2.3 Lang</b></p><p style="TEXT-INDENT: 2em">  ?概况QLang是java.lang的一个扩展包Q增加了许多操作String的功能,另外q支持C风格的枚N? </p><p style="TEXT-INDENT: 2em">  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>? </p><p style="TEXT-INDENT: 2em">  ?何时适用Q当java.lang包提供的Ҏ未能满需要,惌更多的功能来处理String、数值和System属性时Q还有,当你惌使用C风格的枚N时? </p><p style="TEXT-INDENT: 2em">  ?CZ应用QLangDemo.javaQMortgage.javaQOnTV.java。CLASSPATH中必d含commons-lang.jar? </p><p style="TEXT-INDENT: 2em">  ?说明Q? </p><p style="TEXT-INDENT: 2em">  q个包提供了许多Z方便目的而提供的ҎQ它们中的大多数是静态的Q简化了日常~码工作。StringUtilscL其中的一个代表,它得开发者能够超标准的java.lang.String包来处理字符丌Ӏ用这些方法很单,通常只要在调用静态方法时提供适当的参数就可以了。例如,如果要将某个单词的首字符改ؓ大写Q只需调用QStringUtils.capitalise("name")Q调用的输出l果是Name。请览StringUtils API文档了解其他静态方法,也许你会扑ֈ一些可以直接拿来用的代码。本文提供的CZE序C了其中一些方法的使用? </p><p style="TEXT-INDENT: 2em">  另一个值得注意的类是RandomStringUtilsQ它提供了生成随机字W串的方法,用来创徏随机密码实在太方便了? </p><p style="TEXT-INDENT: 2em">  NumberUtilscL供了处理数值数据的ҎQ许多方法值得一用,例如L最大、最数的方法,String转换成数值的ҎQ等{。NumberRange和CharRangecd别提供了创徏和操作数D围、字W范围的Ҏ? </p><p style="TEXT-INDENT: 2em">  Builder包里的类提供了一些特D的ҎQ可用来构造类的toString、hashCode、compareTo和equalsҎQ其基本思\是构造出cȝ高质量的toString、hashCode、compareTo和equalsҎQ从而免M用户自己定义q些Ҏ之劳Q只要调用一下Builder包里面的Ҏ可以了。例如,我们可以用ToStringBuilder来构造出cȝtoString描述Q如下例所C: <br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_22_216_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_216_Open_Text.style.display='none'; Codehighlighter1_22_216_Closed_Image.style.display='inline'; Codehighlighter1_22_216_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_22_216_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_216_Closed_Text.style.display='none'; Codehighlighter1_22_216_Open_Image.style.display='inline'; Codehighlighter1_22_216_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Mortgage </span><span id="Codehighlighter1_22_216_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_22_216_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> rate;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> years;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.tkk7.com/images/dot.gif" />.<br /><img id="Codehighlighter1_97_214_Open_Image" onclick="this.style.display='none'; Codehighlighter1_97_214_Open_Text.style.display='none'; Codehighlighter1_97_214_Closed_Image.style.display='inline'; Codehighlighter1_97_214_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_97_214_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_97_214_Closed_Text.style.display='none'; Codehighlighter1_97_214_Open_Image.style.display='inline'; Codehighlighter1_97_214_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String toString() </span><span id="Codehighlighter1_97_214_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_97_214_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ToStringBuilder(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">).<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            append(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">rate</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,  </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.rate).<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            append(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">years</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.years).<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            toString();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><img src ="http://www.tkk7.com/yyg1107/aggbug/77718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yyg1107/" target="_blank">young</a> 2006-10-27 19:36 <a href="http://www.tkk7.com/yyg1107/articles/77718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts VS Turbine [转]http://www.tkk7.com/yyg1107/articles/76728.htmlyoungyoungMon, 23 Oct 2006 04:13:00 GMThttp://www.tkk7.com/yyg1107/articles/76728.htmlhttp://www.tkk7.com/yyg1107/comments/76728.htmlhttp://www.tkk7.com/yyg1107/articles/76728.html#Feedback0http://www.tkk7.com/yyg1107/comments/commentRss/76728.htmlhttp://www.tkk7.com/yyg1107/services/trackbacks/76728.html?Turbine 则不?它的设计思\军_了它是一?Web 应用的完全解x?Turbine q不是十分符?J2EE 标准.它有自己一整套解决Ҏ,它是一个真正意义上?MVC 模式框架.它具有大量的子项目来支持它的应用(子项目树仅次于Jarkarta Commons 位居W二)
Turbine 要比 Struts 隄?隑֭,但是掌握它是有意义的.如果你只是要写一?Web App 的话,Turbine 开发要?Struts ?
Turbine 支持 Velocity,WebMacro,Cocoon(XSLT) {等,虽然它也支持JSP,不过它的最最亲密的战友Q?Velocity.
Struts 对于写过 JSP ?Servlet 的h来说可能会很d.Jakarta 目l的相关目 Taglibs 提供了大量的 Tag 以支?Struts,?Struts 的结构性和l一性变得很?Struts 的另一?Turbine 不如的地Ҏ它的 mapping-forward 机制,?Struts 中是?struts-config.xml 文g来管理的,虽然随着你的目的扩?q个xml文g会变得很大以至于难以l护(一般大的项目中会有专h理q个文g),但是它的l一性和D逻辑性比 Turbine 好的?Turbine 把相应的逻辑?Velcoity Template cL控制.在相应的Velocity 面中也会用相关的导?
?Struts ?struts-config.xml 相比有些?不知?Turbine 3.0 中会不会有些提高).
Turbine 的一个极的子项目是 Torque,它提供了一个很好的 JDO 环境,而且 Torque 的机制会?XML 格式的数据定义编辑成相关数据库的?支持现在行的几乎所有的数据?,q编译出和表l构一一对应的Java Class.
Torque 中的 Criteria ?BasePeer cd有极高的代码水准,我会在以后的文章中仔l剖析这两个c?
写到q里?最q的文章我会针对?Turbine 做详l的分析和说?
q有一点很重要,现在 Turbine 支持分布式计方?以前批评 Turbine 应用局限性的很重要的理由),q个子项目叫 JCS.
http://jakarta.apache.org/turbine
http://jakarta.apache.org/struts
?大家都用q?Tomcat ?在Tomcat 4.1.10 以上版本提供?Administrator Tools 囑Ş配置界面,q个pȝ是基于Struts?看看源代码吧,几乎用到?Struts 所有的cdҎ,极好的示例代码哦


young 2006-10-23 12:13 发表评论
]]>
JDBC数据库连接池http://www.tkk7.com/yyg1107/articles/73015.htmlyoungyoungSat, 30 Sep 2006 05:42:00 GMThttp://www.tkk7.com/yyg1107/articles/73015.htmlhttp://www.tkk7.com/yyg1107/comments/73015.htmlhttp://www.tkk7.com/yyg1107/articles/73015.html#Feedback0http://www.tkk7.com/yyg1107/comments/commentRss/73015.htmlhttp://www.tkk7.com/yyg1107/services/trackbacks/73015.html阅读全文

young 2006-09-30 13:42 发表评论
]]>
վ֩ģ壺 ߹ۿƵ| 18ëƬaëƬѿ| պƬӰѹۿ| avav߲| ƷƬ߹ۿ| ˾ƷþѶ| AV뾫Ʒ| av˻վ߹ۿ| ߿ƬѲ˳Ƶ | պƷרձ| ձƵ| þѾƷһ| ޴߶רһ| ޾þþþþ77777| 99re6ƵƷѹۿ| Ƶѹۿ| Ůһ| Ļa| ѻɫСƵվ| aëƬѹۿ| ŮƵվa| һ245699| þù˾Ʒ| þһѵ| ѻվ߹ۿ| ۲ӰԺѹۿ| ˳վ߹ۿ| ŷƵ| þþþƷ޳18վ| ػaëƬƵ| þ99Ʒѿ| һ˿Ƶ| avҹӰ߹ۿ| ˳ѵӰ| ޳һ| 91鶹ƷԲ߹ۿ | ۺһƷ| þþþavר| С˵ͼƬ| ޵ӰպƷ| ùƵ|