??xml version="1.0" encoding="utf-8" standalone="yes"?>无码乱人伦一区二区亚洲,日韩亚洲翔田千里在线,国产亚洲一卡2卡3卡4卡新区http://www.tkk7.com/limq/archive/2006/01/19/28585.htmllimqlimqWed, 18 Jan 2006 18:16:00 GMThttp://www.tkk7.com/limq/archive/2006/01/19/28585.htmlhttp://www.tkk7.com/limq/comments/28585.htmlhttp://www.tkk7.com/limq/archive/2006/01/19/28585.html#Feedback27http://www.tkk7.com/limq/comments/commentRss/28585.htmlhttp://www.tkk7.com/limq/services/trackbacks/28585.html阅读全文

limq 2006-01-19 02:16 发表评论
]]>
四舍五入保留数后两?/title><link>http://www.tkk7.com/limq/archive/2005/09/21/13694.html</link><dc:creator>limq</dc:creator><author>limq</author><pubDate>Wed, 21 Sep 2005 15:59:00 GMT</pubDate><guid>http://www.tkk7.com/limq/archive/2005/09/21/13694.html</guid><wfw:comment>http://www.tkk7.com/limq/comments/13694.html</wfw:comment><comments>http://www.tkk7.com/limq/archive/2005/09/21/13694.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/limq/comments/commentRss/13694.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/limq/services/trackbacks/13694.html</trackback:ping><description><![CDATA[<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"><SPAN style="COLOR: #008080"> 1</SPAN> <SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080"> 2</SPAN> <SPAN style="COLOR: #008000"> * Contains static utility methods.<BR></SPAN><SPAN style="COLOR: #008080"> 3</SPAN> <SPAN style="COLOR: #008000"> </SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"> 4</SPAN> <SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> BOUtils {<BR></SPAN><SPAN style="COLOR: #008080"> 5</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080"> 6</SPAN> <SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000"> Double getRoundedDouble( </SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000"> unroundedValue ){<BR></SPAN><SPAN style="COLOR: #008080"> 7</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> Get the integer portion of the value</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080"> 8</SPAN> <SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000"> intPortion </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> Math.floor( unroundedValue );<BR></SPAN><SPAN style="COLOR: #008080"> 9</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> Get the unrounded decimal portion</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">11</SPAN> <SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000"> unroundedDecimalPortion </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> ( unroundedValue </SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000"> intPortion );<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"> ALERT - This next code interferes with I18N. We eventually need   </SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">14</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">         to change this not assume only round to 2 decimal places. </SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">15</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">16</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"> Multiply the decimal places by 100, which shitfs the decimal point<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN> <SPAN style="COLOR: #008000">    /* two places to the left. Then round it so that we get a round to<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN> <SPAN style="COLOR: #008000">    /* two decimal places. For example, if we started with 17.655 and stripped<BR></SPAN><SPAN style="COLOR: #008080">19</SPAN> <SPAN style="COLOR: #008000">    /* off the int portion, which left .655. After we shift, we are left with<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN> <SPAN style="COLOR: #008000">    /* 65.5. Then a round will gives us 66. We can then put it all back<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN> <SPAN style="COLOR: #008000">    /* together </SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">22</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000"> roundedDecimalPortion </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> Math.round( unroundedDecimalPortion </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #000000"> );<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">24</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> Shift the decimal point back two places to the right</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">25</SPAN> <SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">    roundedDecimalPortion </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> roundedDecimalPortion </SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">27</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> Add the int portion and decimal portions back together</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">28</SPAN> <SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000"> total </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> intPortion </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> roundedDecimalPortion;<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN> <SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">30</SPAN> <SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Double( total );<BR></SPAN><SPAN style="COLOR: #008080">31</SPAN> <SPAN style="COLOR: #000000">  }<BR></SPAN><SPAN style="COLOR: #008080">32</SPAN> <SPAN style="COLOR: #000000">}</SPAN></DIV><img src ="http://www.tkk7.com/limq/aggbug/13694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/limq/" target="_blank">limq</a> 2005-09-21 23:59 <a href="http://www.tkk7.com/limq/archive/2005/09/21/13694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakarta Commons:巧用cdlgQ{Q?/title><link>http://www.tkk7.com/limq/archive/2005/09/21/13611.html</link><dc:creator>limq</dc:creator><author>limq</author><pubDate>Wed, 21 Sep 2005 02:03:00 GMT</pubDate><guid>http://www.tkk7.com/limq/archive/2005/09/21/13611.html</guid><wfw:comment>http://www.tkk7.com/limq/comments/13611.html</wfw:comment><comments>http://www.tkk7.com/limq/archive/2005/09/21/13611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/limq/comments/commentRss/13611.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/limq/services/trackbacks/13611.html</trackback:ping><description><![CDATA[Jakarta Commons是Jakarta的子目Q它创徏和维护着许多独立软g包,q些包一般与其他框架或品无养I其中攉了大量小型、实用的lgQ大部分面向服务器端~程?<br /><br />  Commons的包分成两部分:SandboxQCommons代码库。Sandbox是一个测试^収ͼ用来验各U设惟뀁计划。本文介l的lg属于Commons代码库,文章展C各个组件的功能、适用场合Qƈ通过单的例子介绍其用法?<br /><br />  <b>一、概q?/b><br /><br />  可重用性是Jakarta Commons目的灵所在。这些包在设计阶D就已经考虑了可重用性问题。其中一些包Q例如Commons里面用来记录日志的Logging包,最初是为其他项目设计的Q例如Jakarta Struts目Q当Z发现q些包对于其他项目也非常有用Q能够极大地帮助其他目的开发,他们军_些包构造一?公共"的存放位|,q就是Jakarta Commons目?<br /><br />  Z真正提高可重用性,每一个包都必M依赖于其他大型的框架或项目。因此,Commons目的包基本上都是独立的Q不仅是相对于其他项目的独立Q而且相对于Commons内部的大部分其他包独立。虽然存在一些例外的情况Q例如Betwixt包要用到XML APIQ但l大部分只用最基本的APIQ其主要目的是要能够通过单的接口方便地调用?<br /><br />  不过׃崇尚z,许多包的文档变得q于陋,~Zl护和支持,甚至有一部分q有错误的链接,文档也少得可怜。大部分的包需要我们自己去扑և其用法,甚至有时q需要我们自己去分析光用场合。本文将逐一介绍q些包,希望能够帮助你迅速掌握这一U篏了许多h心血的免费代码库?<br /><br />  说明QJakarta Commons?a target="_blank">Apache Commons</a>是不同的Q后者是Apache Software Foundation的一个顶层项目,前者则是Jakarta目的一个子目Q同是也是本文要讨论的主角。本文后面凡是提到Commons的地斚w是指Jakarta的Commons?<br /><br />  Z便于说明Q本文把Commons目十八个成品的组Ӟ排除了EL、Latka和JexlQ分?c,如下表所C?<br /><br /><br />参?<a href="/sean/archive/2005/08.html">http://www.tkk7.com/sean/archive/2005/08.html</a><br /><br /><center> </center><br /><br />  必须指出的是Q这U分cd是ؓ了方便文章说明,Commons目里面实际上ƈ不存在这U分c,同时q些分类的边界有时也存在一定的重叠?<br /><br />  本文首先介绍Web相关cd其他c里面的lgQ下一文章将涉及XML相关、包装这两类Q最后一文章专门介l属于工L的包?<br /><br />  <b>二、其他类</b><br /><br />  CLI、Discovery、Lang和Collections包归入其他类Q这是因为它们都各自针对某个明确、实用的目标,可谓专而精?<br /><br />  <b>2.1 CLI</b><br /><br />  ?概况QCLI即Command Line InterfaceQ也是"命o行接?Q它为JavaE序讉K和解析命令行参数提供了一U统一的接口?<br /><br />  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a><br /><br />  ?何时适用Q当你需要以一U一致的、统一的方式访问命令行参数之时?<br /><br />  ?CZ应用QCLIDemo.java。CLASSPATH中必d含commons-cli-1.0.jar?<br /><br />  ?说明Q?<br /><br />  有多次你不得不Z个新的应用程序重新设计新的命令行参数处理方式Q如果能够只用某个单一的接口,l一完成诸如定义输入参数Q是否ؓ强制参数Q数D是字W串Q等{)、根据一pd规则分析参数、确定应用要采用的\径等dQ那该多好!{案在CLI?<br /><br />  在CLI中,每一个想要在命o中指定的参数都是一个Option对象。首先创Z个Options对象Q将各个Option对象加入Options对象Q然后利用CLI提供的方法来解析用户的输入参数。Option对象可以要求用户必须输入某个参数Q例如必d命o行提供文件名字。如果某个参数是必须的,创徏Option对象的时候就要显式地指定?<br /><br />  下面是用CLI的步骤?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// ? // ? 创徏一个OptionsQ? Options options = new Options(); options.addOption("t", false, "current time"); // ? // ?创徏一个解析器Q分析输入: CommandLineParser parser = new BasicParser(); CommandLine cmd; try { cmd = parser.parse(options, args); } catch (ParseException pe) { usage(options); return; } // ? // ?最后就可以Ҏ用户的输入,采取相应的操作: if (cmd.hasOption("n")) { System.err.println("Nice to meet you: " + cmd.getOptionValue('n')); }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  q就是用CLI的完整过E了。当ӞCLIq提供了其他高选项Q例如控制格式和解析q程{,但基本的使用思\仍是一致的。请参见本文最后提供的CZE序?<br /><br />  <b>2.2 Discovery</b><br /><br />  ?概况QDiscoverylg是发现模式(Discovery PatternQ的一个实玎ͼ它的目标是按照一U统一的方式定位和实例化类以及其他资源?<br /><br />  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?<br /><br />  ?何时适用Q当你想用最佳的法在JavaE序中查找Java接口的各U实C时?<br /><br />  ?应用实例QDiscoveryDemo.javaQMyInterface.javaQMyImpl1.javaQMyImpl2.javaQMyInterface。要求CLASSPATH中必d含commons-discovery.jar和commons-logging.jar?<br /><br />  ?说明Q?<br /><br />  Discovery的意思就?发现"Q它试图用最佳的法查找某个接口的所有已知的实现。在使用服务的场合,当我们想要查找某个服务的所有已知的提供者时QDiscoverylg其有用?<br /><br />  考虑一下这U情形:我们为某个特别复杂的d~写了一个接口,所有该接口的实现都用各不相同的方式来完成这个复杂Q务,最l用户可以根据需要来选择完成d的具体方式。那么,在这U情形下Q最l用户应该用什么办法来扑և接口的所有可用实玎ͼ卛_能的完成d的方式)呢? <br /><br />  上面描述的情形就是所谓的服务-服务提供者体pR服务的功能由接口描qͼ服务提供者则提供具体的实现。现在的问题是最l用戯用某U办法来Lpȝ中已l安装了哪些服务提供者。在q种情Ş下,Discoverylg很有用了,它不仅可以用来查N些实C特定接口的类Q而且q可以用来查找资源,例如囄或其他文件等。在执行q些操作ӞDiscovery遵从Sun的服务提供者体pL定义的规则?<br /><br />  ׃q个原因Q用Discoverylg实带来许多方便。请读者参阅本文后面示例程序中的接口MyInterface.java和两个实现类MyImpl1.java、MyImple2.javaQ了解下面例子的l节。在使用Discovery的时候要提供MyInterface文gQ把它放入META-INF/services目录Q注意该文g的名字对应接口的完整限定名称QFully Qualified NameQ,如果接口属于某个包,该文件的名字也必ȝ应地改变?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// ? // ?创徏一个类装入器的实例? ClassLoaders loaders = ClassLoaders.getAppLoaders(MyInterface.class, getClass(), false); // ? // ?用DiscoverClass的实例来查找实现cR? DiscoverClass discover = new DiscoverClass(loaders); // ? // ?查找实现了指定接口的c: Class implClass = discover.find(MyInterface.class); System.err.println("Implementing Provider: " + implClass.getName());</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  q行上面的代码,可以得到在MyInterface文g中注册的cR再ơ提醒,如果你的实现是封装在包里面的Q在q里注册的名字也应该作相应地修改Q如果该文g没有攑֜正确的位|,或者指定名字的实现cM能找到或实例化,E序抛出DiscoverExceptionQ表C找不到W合条g的实现。下面是MyInterface文g内容的一个例子:MyImpl2 # Implementation 2?<br /><br />  当然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?<br /><br />  Discoveryq可以用来创建服务提供者的(singleton)实例q调用其ҎQ语法如下:((MyInterface)discover.newInstance(MyInterface.class)).myMethod();。注意在q个例子中,我们q不知道到底哪一个服务提供者实CmyMethodQ甚x们根本不必关心这一炏V具体的情Ş与运行这D代码的方式以及q行环境中已l注册了什么服务提供者有养I在不同的环境下运行,实际得到的服务提供者可能不同?<br /><br />  <b>2.3 Lang</b><br /><br />  ?概况QLang是java.lang的一个扩展包Q增加了许多操作String的功能,另外q支持C风格的枚N?<br /><br />  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?<br /><br />  ?何时适用Q当java.lang包提供的Ҏ未能满需要,惌更多的功能来处理String、数值和System属性时Q还有,当你惌使用C风格的枚N时?<br /><br />  ?CZ应用QLangDemo.javaQMortgage.javaQOnTV.java。CLASSPATH中必d含commons-lang.jar?<br /><br />  ?说明Q?<br /><br />  q个包提供了许多Z方便目的而提供的ҎQ它们中的大多数是静态的Q简化了日常~码工作。StringUtilscL其中的一个代表,它得开发者能够超标准的java.lang.String包来处理字符丌Ӏ用这些方法很单,通常只要在调用静态方法时提供适当的参数就可以了。例如,如果要将某个单词的首字符改ؓ大写Q只需调用QStringUtils.capitalise("name")Q调用的输出l果是Name。请览StringUtils API文档了解其他静态方法,也许你会扑ֈ一些可以直接拿来用的代码。本文提供的CZE序C了其中一些方法的使用?<br /><br />  另一个值得注意的类是RandomStringUtilsQ它提供了生成随机字W串的方法,用来创徏随机密码实在太方便了?<br /><br />  NumberUtilscL供了处理数值数据的ҎQ许多方法值得一用,例如L最大、最数的方法,String转换成数值的ҎQ等{。NumberRange和CharRangecd别提供了创徏和操作数D围、字W范围的Ҏ?<br /><br />  Builder包里的类提供了一些特D的ҎQ可用来构造类的toString、hashCode、compareTo和equalsҎQ其基本思\是构造出cȝ高质量的toString、hashCode、compareTo和equalsҎQ从而免M用户自己定义q些Ҏ之劳Q只要调用一下Builder包里面的Ҏ可以了。例如,我们可以用ToStringBuilder来构造出cȝtoString描述Q如下例所C: <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>public class Mortgage { private float rate; private int years; .... public String toString() { return new ToStringBuilder(this). append("rate", this.rate). append("years", this.years). toString(); } }</ccid_code></pre></td></tr></tbody></table><span id="46ie6m2" class="myp11"><font id="zoom">  使用q类Ҏ有什么好处呢Q显Ӟ它得我们有可能通过一U统一的方式处理所有数据类型。所有BuilderҎ的用法都和上例相伹{?<br /><br />  Java没有C风格的枚NQؓ此,lang包提供了一个类型安全的EnumcdQ填补了I白。EnumcL抽象的,如果你要创徏枚D量,p扩展EnumcR下面的例子清楚地说明了Enum的用法?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>import org.apache.commons.lang.enum.Enum; import java.util.Map; import java.util.List; import java.util.Iterator; public final class OnTV extends Enum { public static final OnTV IDOL= new OnTV("Idol"); public static final OnTV SURVIVOR = new OnTV("Survivor"); public static final OnTV SEINFELD = new OnTV("Seinfeld"); private OnTV(String show) { super(show); } public static OnTV getEnum(String show){ return (OnTV) getEnum(OnTV.class, show); } public static Map getEnumMap() { return getEnumMap(OnTV.class); } public static List getEnumList() { return getEnumList(OnTV.class); } public static Iterator iterator() { return iterator(OnTV.class); } }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  以后我们可以按照下面的方式使用枚D变量QOnTV.getEnum("Idol")。该调用从前面创建的枚D数据cdq回Idol。这个例子比较简单,实际上Enumc还提供了许多有用的ҎQ请参见本文后面提供的完整实例?<br /><br />  <b>2.4 Collections</b><br /><br />  ?概况Q扩展了Java Collection框架Q增M新的数据l构、P代机制和比较操作W?<br /><br />  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?<br /><br />  ?何时适用Q几乎所有需要操作数据结构的重要Java开发项目都可以使用Collections API。和Java的标准实现相比,Collections API有着诸多优势?<br /><br />  ?CZ应用QCollectionsDemo.java。要求CLASSPATH中包含commons-collections.jar?<br /><br />  ?说明Q?<br /><br />  要在有限的文章篇q之内详地介绍 Collections API实在是太困难了,不过q里仍将늛大多数最重要的类Q希望能够引起你的兴,认真了解一下其余的cRCollections本n的文档也提供了许多资料ƈ解释了每一个类的用法?<br /><br />  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返回所有唯一元素?<br /><br />  Buffer接口允许按照预定义的ơ序删除集合中的对象Q删除次序可以是LIFOQLast In First OutQ后q先出)Q或FIFOQFirst In First OutQ先q先出)Q另外还可以是自定义的次序。下面来看看如何实现一个BufferQ按照自然次序删除元素?<br /><br />  BinaryHeapcdCBuffer接口Q能够按照自然次序删除元素。如果要颠倒次序,则必M入一个falseQ告诉Heap采用自然ơ序的逆序?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>BinaryHeap heap = new BinaryHeap(); // ? // 元素加入该Heap heap.add(new Integer(-1)); heap.add(new Integer(-10)); heap.add(new Integer(0)); heap.add(new Integer(-3)); heap.add(new Integer(5)); //? // 删除一个元? heap.remove();</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  调用该Heap的removeQ按照自然次序,元素集合中的-10被删除。如果我们要求按照逆序排序Q则被删除的是5?<br /><br />  FastArrayList、FastHashMap和FastTreeMapc能够按照两U模式操作,越了与它们对应的标准Collection。第一U模式是"慢模?Q类的修Ҏ作(d、删除元素)是同步的。与此相对,另一U模式是"快模?Q对q些cȝ讉K假定为只L作,因此不需要同步,速度较快。在快模式中Q结构性的改动通过下列方式完成Q首先克隆现有的c,修改克隆得到的类Q最后用克隆得到的类替换原有的类。FastArrayList、FastHashMap和FastTreeMapcȝ别适合于那U初始化之后大部分操作都是只L作的多线E环境?<br /><br />  iterators包ؓ各种集合和对象提供标准Java Collection包没有提供的q代器。本文的CZ应用C了ArrayIteratorQ通过q代方式讉KArray的内宏Viterators包里面各UP代器的用法基本上与标准Javaq代器一栗?<br /><br />  最后,comparators包提供了一些实用的比较W。所谓比较符其实也是一个类Q它定义的是如何比较两个属于同一cȝ对象Q决定它们的排序ơ序。例如,在前面提到的BuffercMQ我们可以定义自q比较W,用自定义的比较符来决定元素的排序ơ序Q而不是采用元素的自然排序ơ序。下面来看看具体的实现经q?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// ? // ?创徏一个BinaryHeapc,但这一ơ参C // 指定NullComparator。NullComparator比较 // null与其他对象,ҎnullsAreHigh标记? // 判断null值比其他对象大还是小Q如? // nullsAreHigh的值是falseQ则认ؓnull要比 // 其他对象? BinaryHeap heap2 = new BinaryHeap (new NullComparator(false)); // ? // ?一些数据(包括几个null|加入heapQ? heap2.add(null); heap2.add(new Integer("6")); heap2.add(new Integer("-6")); heap2.add(null); // ? // ?最后删除一个元素,Bag包含的null减? // 一个,因ؓnull要比其他对象? heap2.remove();</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  有关其他cCommonslg的介l就到这里结束。如果你想了解更多细节信息,请参见API文档Q最好再看看q些包的源代码?<br /><br />  <b>三、Webc?/b><br /><br />  Webcȝlg用来执行与Web相关的Q务?<br /><br />  <b>3.1 FileUpload</b><br /><br />  ?概况Q一个可以直接用的文g上蝲lg?<br /><br />  ?官方资源Q?a target="_blank">主页</a>。由于这个组件尚未正式发布,今年二月发布的Beta版又有许多BUGQ所以徏议从<a target="_blank">nightly builds</a>下蝲最新的版本?<br /><br />  ?何时适用Q当你想要在Java服务器环境中加入一个易用、高性能的文件上载组件之时?<br /><br />  ?CZ应用Qfileuploaddemo.jspQfileuploaddemo.htmQ和msg.jsp。要求服务器端应用目录的WEB-INF/lib下面有commons-fileupload-1.0-dev.jar?<br /><br />  ?说明Q?<br /><br />  FileUploadlg解决了常见的文g上蝲问题。它提供了一个易用的接口来管理上载到服务器的文gQ可用于JSP和Servlet之中。FileUploadlg遵从RFC1867Q它分析输入hQ向应用E序提供一pd上蝲到服务器的文件。上载的文g可以保留在内存中Q也可以攑օ一个时位|(允许配置一个表C文件大的参数Q如果上载的文g过了该参数指定的大,则把文g写入一个时位|)。另外还有一些参数可供配|,包括可接受的最大文件、时文件的位置{?<br /><br />  下面介绍一下用FileUploadlg的步骤?<br /><br />  首先创徏一个HTML面。注意,凡是要上载文件的表单都必设|enctype属性,且属性的值必Lmultipart/form-dataQ同时请求方法必LPOST。下面的表单除了上蝲两个文gQ另外还有一个普通的文本输入框: <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code><form name="myform" action="fileuploaddemo.jsp" method="post" enctype="multipart/form-data"> 输入你的名字:<br /><input size="15" name="name" /><br /> 囑Ş:<br /><input type="file" name="myimage" /><br /> 文g:<br /><input type="file" name="myfile" /><br /><br /><input type="submit" value="Submit your files" name="Submit" /></form></ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  接下来创建JSP面?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// ? // ?查输入请求是否ؓmultipart的表单数据? boolean isMultipart = FileUpload. isMultipartContent(request); // ? // ?h创徏一个句柄,通过它来解析h。执? // 解析后,所有的表单目都保存在一个List中? DiskFileUpload upload = new DiskFileUpload(); // 通过句柄解析hQ解析得到的目保存在一个List? List items = upload.parseRequest(request); // ? // ?通过循环依次获得List里面的文仉目。要区分表示 // 文g的项目和普通的表单输入目Q用isFormField() // Ҏ。根据处理请求的要求Q我们可以保存上载的? // Ӟ或者一个字节一个字节地处理文g内容Q或者打 // 开文g的输入流? Iterator itr = items.iterator(); while(itr.hasNext()) { FileItem item = (FileItem) itr.next(); // 查当前的目是普通的表单元素Q还是一个上载的文g if(item.isFormField()) { // 获得表单域的名字 String fieldName = item.getFieldName(); // 如果表单域的名字是name? if(fieldName.equals("name")) request.setAttribute("msg", "Thank You: " + item.getString()); } else { // 该项目是一个上载的文gQ把它保存到盘? // 注意item.getName() // 会返回上载文件在客户端的完整路径名称Q这g是一个BUG? // 册个问题,q里使用了fullFile.getName()? File fullFile = new File(item.getName()); File savedFile = new File (getServletContext().getRealPath("/"), fullFile.getName()); item.write(savedFile); } }</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  我们可以通过上蝲句柄的upload.setSizeMax来限制上载文件的大小。当上蝲文g的大超q允许的值时Q程序将遇到异常。在上面的例子中Q文件大的限制值是-1Q表C允怸载Q意大的文g?<br /><br />  q有其他一些略有变化的使用形式Q正如前面所指出的,我们可以在上载的文g上打开一个输入流Q或者让它们ȝ在内存中直至I间占用辑ֈ一定的限制|或者在判断文gcd的基上,以String或Byte数组的Ş式获取其内容Q或者直接删除文件。这一切都只要使用FileItemcL供的Ҏ可以方便地做到QDefaultFileItem是FileItem的一个实玎ͼ?/font></span><span id="soaae2c" class="myp11"><font id="zoom">  <b>3.2 HttpClient</b><br /><br />  ?概况Q这个API扩展了java.net包,提供了模拟浏览器的功能?<br /><br />  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?<br /><br />  ?何时适用Q当你要构造Web览器的功能Q当你的应用需要一U高效的办法q行HTTP/HTTPS通信时?<br /><br />  ?CZ应用QHttpClientDemo.java。要求CLASSPATH中有commons-httpclient.jarQcommon-logging.jar。要求用JDK 1.4或更高版本?<br /><br />  ?说明Q?<br /><br />  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及更高的版本才提供?<br /><br />  ?首先定一个可以通过HTTPS下蝲的页面,本例使用的是https://www.paypal.com/。同时确?JAVA_HOME%/jre/lib/security/java.security文g包含了下面这行代码:security.provider.2=com.sun.net.ssl.internal.ssl.Provider?<br /><br />  除了q些讄之外QHTTPSq接的处理方式没有其他特别的地方--臛_对于本例来说如此。不q,如果q程|站使用的根证书不被你用的Java认可Q则首先必须导入它的证书?<br /><br />  ?创徏一个HttpClient的实例。HttpClientcd以看成是应用的主驱动E序Q所有针对网l的功能都依赖于它。HttpClientc需要一个Connection Manager来管理连接。HttpConnectionManager允许我们创徏自己的连接管理器Q或者,我们也可以直接用内建的SimpleHttpConnectionManager或MultiThreadedHttpConnectionManagercR如果在创徏HttpClient时没有指定连接管理器QHttpClient默认使用SimpleHttpConnectionManager?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// 创徏一个HttpClient的实? HttpClient client = new HttpClient();</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  ?创徏一个HttpMethod的实例,即确定与q程服务器的通信要采用哪U传输方式,HTTP允许采用的传输方式包括:GETQPOSTQPUTQDELETEQHEADQOPTIONSQ以及TRACE。这些传输方式分别作Z个独立的cd玎ͼ但所有这些类都实现HttpMethod接口。在本例中,我们使用的是GetMethodQ创建GetMethod实例时在参数中指定我们想要GET的URL?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// 创徏一个HttpMethod的实? HttpMethod method = new GetMethod(url);</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  ?执行HttpMethod定义的提取操作。执行完毕后QexecuteMethodҎ返回远E服务器报告的状态代码。注意executeMethod属于HttpClientQ而不是HttpMethod?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// 执行HttpMethod定义的提取操? statusCode = client.executeMethod(method);</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  ?d服务器返回的应答。如果前面的q接操作p|Q程序将遇到HttpException或IOExceptionQ其中IOException一般意味着|络出错Ql尝试也不太可能获得成功。服务器q回的应{可以按照多U方式读取,例如作ؓ一个字节数l,作ؓ一个输入流Q或者作Z个String。获得服务器q回的应{后Q我们就可以按照自己的需要Q意处|它了?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>byte[] responseBody = method.getResponseBody();</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  ?最后要做的是释放q接?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>method.releaseConnection();</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  以上只是非常单地介绍了一下HttpClient库,HttpClient实际的功能要比本文介l的丰富得多Q不仅健壮而且高效Q请参阅API文档了解详情?<br /><br />  <b>3.3 Net</b><br /><br />  ?概况Q一个用于操作Internet基础协议的底层API?<br /><br />  ?官方资源Q?a target="_blank">主页</a>Q?a target="_blank">二进?/a>Q?a target="_blank">源代?/a>?<br /><br />  ?何时适用Q当你想要访问各UInternet底层协议之时QFingerQWhoisQTFTPQTelnetQPOP3QFTPQNNTPQ以及SMTPQ?<br /><br />  ?CZ应用QNetDemo.java。要求CLASSPATH中包含commons-net-1.0.0.jar?<br /><br />  ?说明Q?<br /><br />  Net包是一个强大、专业的cdQ类库里的类最初属于一个叫做NetComponents的商业品?<br /><br />  Net包不仅支持对各种低层ơ协议的讉KQ而且q提供了一个高层的抽象。大多数情况下,Net包提供的抽象已能满一般需要,它得开发者不再需要直接面对各U协议的SocketU的低层命o。用高层抽象ƈ不减Q何功能,Net API在这斚w做得很出Ԍ既提供了_的功能,又不至于在特色方面作q多的妥协?<br /><br />  SocketClient是支持所有协议的基础c,它是一个抽象类Q聚合了各种协议都需要的公用功能。各U不同协议的使用q程其实很相|首先利用connectҎ建立一个指向远E服务器的连接,执行必要的操作,最后终止与服务器的q接。下面通过实例介绍具体的用步骤?<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="540" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>// ? // ?创徏一个客L。我们将用NNTPClient //  从新L务器下蝲新闻l清单? client = new NNTPClient(); // ? // ?利用前面创徏的客Lq接到新L务器? //  q里选用的是一个新ȝ较少的服务器? client.connect("aurelia.deine.net"); // ? // ?提取新闻l清单。下面的命o返回一? //  NewsGroupInfo对象的数l。如果指定的? //  务器上不包含新闻l,q回的数l将是空的, //  如果遇到了错误,则返回值是null? list = client.listNewsgroups(); //... // ?最后终止与服务器的q接? if (client.isConnected()) client.disconnect();</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />  必须说明的是QlistNewsgroups命o可能需要较长的旉才能q回Q一斚w是因为网l速度的媄响,另外也可能是׃新闻l清单往往是很庞大的。NewsGroupInfo对象包含有关新闻l的详细信息Qƈ提供了一些操作新ȝ的命令,比如提取文章L、最后发布的文章、发布文章的权限Q等{?<br /><br />  其他客户端,例如FingerClient、POP3Client、TelnetClient{,用法也差不多?<br /><br />  l束语:有关Web相关cd其他cȝ介绍到此结束。在下一文章中Q我们将探讨XMLcd包装c,最后一文章则介绍工具cR?<br /><br />  希望读者有兴趣试试本文提供的程序实例。很多时候Jakarta Commonslh以؜q感觉Q希望本文你加׃对Jakarta Commons了解Q或者至引起了你对Commons子项目以及它提供的各U实用API和库的兴?<br /><br />请从q里下蝲本文代码Q?a target="_blank">JakartaCommons1_code.zip</a><br /></font></span></ccid_nobr><img src ="http://www.tkk7.com/limq/aggbug/13611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/limq/" target="_blank">limq</a> 2005-09-21 10:03 <a href="http://www.tkk7.com/limq/archive/2005/09/21/13611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www321fafa.com" target="_blank">þþþavרѿ</a>| <a href="http://zxbj0471.com" target="_blank">˾þô߽</a>| <a href="http://yg1617.com" target="_blank">91Ƶ߹ۿ</a>| <a href="http://zzjiji.com" target="_blank">þùɫAVѿ</a>| <a href="http://haigoumama.com" target="_blank">AVƬɫ߹ۿ</a>| <a href="http://cz655.com" target="_blank">һѿ</a>| <a href="http://zgnyxx.com" target="_blank">ѹۿƵ</a>| <a href="http://arkinbokis.com" target="_blank">ձѾƷһ</a>| <a href="http://www48646.com" target="_blank">AV鶹Խ</a>| <a href="http://shaonvfushi.com" target="_blank">¹͵Ʒվ</a>| <a href="http://lshwork.com" target="_blank">պƷһ</a>| <a href="http://857434.com" target="_blank">99Ƶѹۿ</a>| <a href="http://34jjjj.com" target="_blank">˳ɵӰ</a>| <a href="http://hbwhgd.com" target="_blank">Ʒɫѿ</a>| <a href="http://yuanzhouxh.com" target="_blank">99͵ͼ</a>| <a href="http://zjlxblog.com" target="_blank">ѿƷ鶹</a>| <a href="http://bjsunic.com" target="_blank">þþƷav18</a>| <a href="http://tmg-beelen.com" target="_blank">þ91ѹۿ</a>| <a href="http://glgg99.com" target="_blank">վѹۿ</a>| <a href="http://cnpc1002.com" target="_blank">޸Ƶַ</a>| <a href="http://nh-car.com" target="_blank">yyƵ</a>| <a href="http://hnqkzj.com" target="_blank">޹˾þһ</a>| <a href="http://gsonlinet.com" target="_blank">ѿŮͰ</a>| <a href="http://chenglide.com" target="_blank">ۺһ</a>| <a href="http://yeyaweiban.com" target="_blank">һƵ</a>| <a href="http://kdp44.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://senimei9.com" target="_blank">AvƷþ</a>| <a href="http://h7277.com" target="_blank">av뾫Ʒַ</a>| <a href="http://31xyz.com" target="_blank">ۺAV߲</a>| <a href="http://xvwenyue.com" target="_blank">պ尡Ƶ߹ۿ </a>| <a href="http://ryhjled.com" target="_blank">޹Ʒվ߲</a>| <a href="http://rdccc.com" target="_blank">69Ƶ߹ۿ</a>| <a href="http://aa77cc.com" target="_blank">޾Һվ</a>| <a href="http://chowngroup.com" target="_blank">պϵ </a>| <a href="http://yangguang882.com" target="_blank">99þ99þþƷѿ </a>| <a href="http://mtripmall.com" target="_blank">99þþþþѿ</a>| <a href="http://079566.com" target="_blank">ŮƵ</a>| <a href="http://chinacmk.com" target="_blank">ѹԺ߹ۿ</a>| <a href="http://wwwav888.com" target="_blank">99ƵƷȫѹۿ</a>| <a href="http://gtja1668.com" target="_blank">337Pձŷ޴ͼ</a>| <a href="http://www2019rz.com" target="_blank">޾ƷĻþò</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>