﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-西瓜地儿-随笔分类-TEMP</title><link>http://www.blogjava.net/ashutc/category/42984.html</link><description>沈阳求职（java3年以上经验）！ashutc@126.com</description><language>zh-cn</language><lastBuildDate>Fri, 17 Jun 2011 21:23:33 GMT</lastBuildDate><pubDate>Fri, 17 Jun 2011 21:23:33 GMT</pubDate><ttl>60</ttl><item><title>标准的策略模式</title><link>http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 17 Jun 2011 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/352524.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/352524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/352524.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">定义:定义了算法族，分别封装起来，让它们之间可以互相替换，此模式让算法的变化独立于使用算法的客户。<br />适用性<br />许多相关的类仅仅是行为有异。&#8220;策略&#8221;提供了一种用多个行为中的一个行为来配置一个类的算法。<br />需要使用一个算法的不同变体。例如，你可能会定义一些反映不容的空间</span><span style="color: #000000; ">/</span><span style="color: #000000; ">时间权衡的算法。当这些变体实现了一个算法的类层次时[H087],可以使用策略模式。<br />算法使用客户不应该知道的数据。可以使用策略模式以避免暴露复杂的、与算法相关的数据结构。<br />一个类定义了多种行为，并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。<br />&nbsp;例子:以下的例子取自一个动作冒险游戏。你将看到代表游戏角色的类和角色可以使用的武器行为的类。每个角色一次只能只用一种武器，但是可以在游戏的过程中切换武器。<br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">：定义武器接口及实现类<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;定义武器行为接口<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;User<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">选择所使用的武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;BowAndArrorBehavior&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现用弓箭射击<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">用弓箭射击</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SwordBehavior&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现用宝剑攻击行为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">用宝剑攻击!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;KnightBehavior&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现用匕首刺杀的行为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">用匕首刺杀!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #000000; ">2</span><span style="color: #000000; ">：定义角色<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;角色的抽象父类&nbsp;定义抽象fight方法以及策略属性<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;User<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">abstract</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Character&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;weapon;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">策略调用&nbsp;&nbsp;武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">abstract</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fight();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;String&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">委托给行为类</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;performFight(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(name</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weapon.userWeapon();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;改变所使用的武器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;weapon<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setWeapon(WeaponBehavior&nbsp;weapon)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.weapon&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;weapon;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;King&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Character&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;King(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.weapon</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SwordBehavior();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">用宝剑</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">King</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fight()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">King&nbsp;fight</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Queen&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Character&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Queen(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.weapon</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KnightBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">queen</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fight()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">queen&nbsp;fight</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />}<br /></span><span style="color: #000000; ">3</span><span style="color: #000000; ">：测试类<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Test&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;args<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">定义能够使用的武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwordBehavior&nbsp;swordBehavior</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SwordBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnightBehavior&nbsp;knightBehavior</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KnightBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BowAndArrorBehavior&nbsp;bowAndArrorBehavior</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BowAndArrorBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">定义角色</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Character&nbsp;king</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;King();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Character&nbsp;queen</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Queen();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">使用默认的武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">**************使用默认武器****************</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;king.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queen.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">切换武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;king.setWeapon(knightBehavior);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queen.setWeapon(swordBehavior);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">**************更换武器后****************</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;king.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queen.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #000000; ">4</span><span style="color: #000000; ">：结果<br /></span><span style="color: #000000; ">**************</span><span style="color: #000000; ">使用默认武器</span><span style="color: #000000; ">****************</span><span style="color: #000000; "><br />King:用宝剑攻击</span><span style="color: #000000; ">!!</span><span style="color: #000000; "><br />queen:用匕首刺杀</span><span style="color: #000000; ">!!</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">**************</span><span style="color: #000000; ">更换武器后</span><span style="color: #000000; ">****************</span><span style="color: #000000; "><br />King:用匕首刺杀</span><span style="color: #000000; ">!!</span><span style="color: #000000; "><br />queen:用宝剑攻击</span><span style="color: #000000; ">!!</span></div><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/ashutc/aggbug/352524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-06-17 15:29 <a href="http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jar 命令说明</title><link>http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 13 Jun 2011 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/352195.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/352195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/352195.html</trackback:ping><description><![CDATA[<br /><div><div><p><strong>jar cf myJarFile.jar *.class</strong></p> <p> 它会创建了一个名为myJarFile.jar的JAR"卷宗"。这个卷宗会包括当前目录下的所有class文件，并且自动生成manifest文件。</p> <p><strong>jar cmf myJarFile.jar myManifestFile.mf *.*</strong></p> <p>把当前目录的<strong>所有文件</strong>都打包，增加个用户自定义的，名为myManifestFile.mf的manifest文件。</p> <p><strong>jar tf myJarFile.jar</strong></p> <p>返回myJarFile.jar所含文件的列表。</p> <p><strong>jar tvf myJarFile.jar</strong></p> <p>加"verbose(详细)"标志，给出更详细的，关于myJarFile.jar当中的文件的信息。</p> <p><strong>jar cvf myApp.jar <em>audio classes image</em></strong></p> <p>假设audio，classes，image都是子目录。这个命令会把这些子目录全都收进myApp.jar。</p></div> <br /> <div><div> <p> 一个JAR"卷宗"只有一个文件，"卷宗"包含两个文件，一个是Zip文件，另一个是描述Zip文件所包含的文件的"manifest(清单)"。</p> 用法：jar&nbsp;<wbr>{ctxu}[vfm0Mi]&nbsp;<wbr>[<em>文件.jar</em>]&nbsp;<wbr>[manifest-文件]&nbsp;<wbr>[-C&nbsp;<wbr>目录]&nbsp;<wbr><em>文件名</em>&nbsp;<wbr>...<br />  选项：<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-c&nbsp;<wbr>&nbsp;<wbr>创建新的存档<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-t&nbsp;<wbr>&nbsp;<wbr>列出存档内容的列表<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-x&nbsp;<wbr>&nbsp;<wbr>展开存档中的命名的（或所有的〕文件<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-u&nbsp;<wbr>&nbsp;<wbr>更新已存在的存档<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-v&nbsp;<wbr>&nbsp;<wbr>生成详细输出到标准输出上<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-f&nbsp;<wbr>&nbsp;<wbr>指定存档文件名<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-m&nbsp;<wbr>&nbsp;<wbr>包含来自标明文件的标明信息<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-0&nbsp;<wbr>&nbsp;<wbr>只存储方式；未用ZIP压缩格式<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-M&nbsp;<wbr>&nbsp;<wbr>不产生所有项的清单（manifest〕文件<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-i&nbsp;<wbr>&nbsp;<wbr>为指定的jar文件产生索引信息<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-C&nbsp;<wbr>&nbsp;<wbr>改变到指定的目录</div> <div>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 文件名，包含的文件,如果一个文件名是一个目录，它将被递归处理。<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 清单（manifest〕文件名和存档文件名都需要被指定，按'm'&nbsp;<wbr>和&nbsp;<wbr>'f'标志指定的相同顺序。</div></div> <br /> </div><img src ="http://www.blogjava.net/ashutc/aggbug/352195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-06-13 15:52 <a href="http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动代码规范CheckStyle</title><link>http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 03 Jun 2011 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/351690.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/351690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/351690.html</trackback:ping><description><![CDATA[<div> <br /> <br /> <div>CheckStyle是什么？<p>　　CheckStyle是SourceForge下的一个项目，提供了一个帮助<a target="_self"><u><strong>JAVA</strong></u></a>开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程，从而使得开发人员从这项重要，但是枯燥的任务中解脱出来[1]。</p><p>　　2.2. CheckStyle检验的主要内容</p><p>　　CheckStyle默认提供一下主要检查内容：</p><p>　　&#183;Javadoc注释</p><p>　　&#183;命名约定</p><p>　　&#183;标题</p><p>　　&#183;Import语句</p><p>　　&#183;体积大小</p><p>　　&#183;空白</p><p>　　&#183;修饰符</p><p>　　&#183;块</p><p>　　&#183;代码问题</p><p>　　&#183;类设计</p><p>　　&#183;混合检查（包活一些有用的比如非必须的System.out和printstackTrace）</p><p>　　从上面可以看出，CheckStyle提供了大部分功能都是对于代码规范的检查，而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是，对于团队开发，尤其是强调代码规范的公司来说，它的功能已经足够强大。</p><p>　　2.3. CheckStyle的主要运行方式</p><p>　　目前，CheckStyle的版本是3.0，与以前的版本不同，它的配置文件是基于XML而非Properties文件。</p><p>　　它的3.0版本提供了两种运行的方式：</p><p>　　&#183;命令行工具</p><p>　　&#183;ANT任务</p><p>　　同时，CheckStyle目前有很多针对流行IDE的插件，例如Eclipse、IntelliJ IDEA、JBuilder等。但是，大部分都是基于2.4的版本，新版本的特性不支持，同时配置也较为复杂。</p><p>　　因为一般情况下，如果与开发过程与环境集成起来，编码规范的检查会更加有效，因此，作为ANT任务的运行方式使用的更加普遍。</p><p>　　在ANT的build.xml文件中添加CheckStyle任务的步骤如下：</p><p>　　1. 将checkstyle-all-3.1.jar拷贝到项目的LIB目录；</p><p>　　2. 建立配置文件；</p><p>　　3. 声明CheckStyle任务：</p><p>＜taskdef resource="checkstyletask.properties" classpath="${lib}/checkstyle-all-3.1.jar"/＞</p><p>　　4. 建立CheckStyle任务：</p><p>＜target name="checkstyle"＞<br />＜checkstyle c＞<br />＜fileset dir="${src}" includes=" **/*.java" /＞<br />＜/checkstyle＞<br />＜/target＞</p><p>　　2.4. 定制CheckStyle</p><p>　　CheckStyle的执行基于XML配置文件，它的主要组成部分是：</p><p>　　&#183;Module：整个配置文件就是一棵Module树。根节点是Checker Module。</p><p>　　&#183;Properties：它来决定一个Module如何进行检查。每个Module都有一个默认值，如果不满足开发需求，可以设定<a target="_self"><u><strong>其它</strong></u></a>的值。</p><p>　　下面是一个示例：</p><p>＜module name="MethodLength"＞<br />＜property name="max" value="60"/＞<br />＜/module＞</p><p>　　它表示，如果方法或者构造函数的长度超过60行，CheckStyle就会报错。而默认值是150行。</p><p>　　以下是一段CheckStyle对于Maven项目源文件的检查报告：</p><p>Method 'createExpression' is not designed for extension - needs to be abstract, final or empty. 91<br />Unable to get class information for JellyException. 91<br />Line has trailing spaces. 93<br />Line has trailing spaces. 104<br />Method 'evaluate' is not designed for extension - needs to be abstract, final or empty. 113<br />Parameter context should be final. 113<br />Line has trailing spaces. 130<br />Method 'getExpressionText' is not designed for extension - needs to be abstract, final or empty. 131<br />Line has trailing spaces. 134<br />Line has trailing spaces. 135<br />Method 'toString' is not designed for extension - needs to be abstract, final or empty. 137<br />Method 'isSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 156<br />Method 'setSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 168<br />Parameter supportAntVariables should be final. 168<br />'supportAntVariables' hides a field. 168<br />Method 'isValidAntVariableName' is not designed for extension - needs to be abstract, final or empty. 183<br />Parameter text should be final. 183</p><p>　　一般情况下，与IDE集成在一起使用的时候，点击出错的条目，可以跳转到相应的代码。<br />本贴来自ZDNetChina中文社区<a href="http://bbs.zdnet.com.cn/">http://bbs.zdnet.com.cn</a>,本贴地址：<a href="http://bbs.zdnet.com.cn/viewthread.php?tid=178617">http://bbs.zdnet.com.cn/viewthread.php?tid=178617</a></p><p>&nbsp;</p><p><br />三、CheckStyle的最佳实践</p><p>　　3.1. Sun&#8217;s Code Conventions的修改</p><p>　　在CheckStyle的最新发布版本中，有一个对于Sun的Java编码规范的配置文件信息。但是，其中有很多条目并不一定符合项目开发的需要。就算是对于很多优秀的开源项目，按照这个规范来进行检查，也会出现成千上万的错误。</p><p>　　下面提出的一些修改意见，是从实际项目执行过程中总结出来的，可以作为大家的参考。我们以CheckStyle3.0配置文件的顺序来介绍：</p><p>　　1. 去除对于每个包都有一个package.html文件的限制；</p><p>＜!--＜module name="PackageHtml"/＞--＞<br />　　<br />　　2. 修改对于JavaDoc Comments的限定：对于很多使用Code Generator的项目来说，需要将手写代码与生成代码、<a target="_self"><u><strong>单元测试</strong></u></a>代码的检查分开进行；</p><p>　  　3.   修改对于体积大小的限制：目前，很多显示器都是17寸，而且打印方面的限制也比以前有所改善，同时，由于代码中Factory等模式的运用，以及有意义的  方法名称等约定，默认每行代码的长度（80）是远远不能满足要求；对于方法长度等等，也应该根据项目情况自行决定：</p><p>＜module name="FileLength"/＞<br />＜module name="LineLength"＞<br />＜property name="max" value="120"/＞<br />＜/module＞<br />＜module name="MethodLength"＞<br />＜property name="max" value="300"/＞<br />＜/module＞<br />＜module name="ParameterNumber"/＞</p><p>　　4. 修改对于Throws的的限制：允许Throws Unchecked Exception以及Throws Subclass Of Another Declared Exception。</p><p>＜module name="RedundantThrows"＞<br />＜property name="allowUnchecked" value="true"/＞<br />＜property name="allowSubclasses" value="true"/＞<br />＜/module＞</p><p>　　5. 修改成员变量的可视性：一般情况下，应该允许Protected Members以及Package Visible Members。</p><p>＜module name="VisibilityModifier"＞<br />＜property name="protectedAllowed" value="true"/＞<br />＜property name="packageAllowed" value="true"/＞<br />＜/module＞</p><p>　　3.2. CheckStyle应用的最佳实践</p><p>　　采用CheckStyle以后，编码规范的检查就变得及其简单，可以作为一项切实可行的实践加以执行。</p><p>　　一般情况下，在项目小组中引入CheckStyle可以按照下面的步骤进行：</p><p>　　1． 强调Code Review与Code Conventions的重要作用；</p><p>　　2． 介绍CheckStyle；</p><p>　　3． 初步应用CheckStyle：参照CheckStyle附带的配置文件，酌情加以剪裁，在项目的Ant配置文件中，添加CheckStyle任务，可以单独执行；</p><p>　　4． 修改、定型CheckStyle的配置文件：按照基本配置文件执行一段时间（2～3周），听取开发人员的反馈意见，修改配置信息；</p><p>　  　5．   作为开发过程的日常实践，强制执行CheckStyle：稳定CheckStyle的配置信息，同时将CheckStyle任务作为Build的依赖任务  或者配置源码控制系统（目前，CheckStyle可以与CVS有效集成），使得代码在加入系统之前必须通过检查。</p><p>　　同时需要指出的是，CheckStyle的有效执行需要依赖两个条件：</p><p>　　&#183;Ant的广泛应用：CheckStyle基于Ant执行的方式比较容易，而且可以在项目内容形成一致的执行环境。同时，也比较容易与其它任务，例如Build等发生关联。</p><p>　  　&#183;IDE Format Code的强大功能：由于CheckStyle本身并没有提供很强大的Code   Format等功能，因此，需要借助IDE的帮助，从而使得在发生错误的时候，可以很容易的进行修复。目前，主流的Java   IDE都提供了这方面的功能，IDEA在这方面尤其突出。它提供的统一、可定义的Code Format   Template（项目小组内部可以使用统一模板）以及方便的快捷键功能(Ctrl+Alt+T：Format Code,   Ctrl+Alt+O：Optimize Import等)。</p><p>　　四、结论</p><p>　　利用CheckStyle可以方便的对于编码的Code Conventions进行检查，同时，也有效地减少了Code Review的<a target="_self"><u><strong>工作</strong></u></a>，使得Reviw人员的精力更多的集中到逻辑和性能检查。<br /></p><p>Checkstyle的结果输出</p><p>序号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出内容意义</p><p>1 Type is missing a javadoc commentClass&nbsp; 缺少类型说明</p><p>2&#8220;{&#8221; should be on the previous line &#8220;{&#8221; 应该位于前一行</p><p>3Methos is missing a javadoc comment方法前面缺少javadoc注释</p><p>4Expected @throws tag for &#8220;Exception&#8221;在注释中希望有@throws的说明</p><p>5&#8220;.&#8221; Is preceeded with whitespace &#8220;.&#8221; 前面不能有空格</p><p>6&#8220;.&#8221; Is followed by whitespace&#8220;.&#8221; 后面不能有空格</p><p>7&#8220;=&#8221; is not preceeded with whitespace&#8220;=&#8221; 前面缺少空格</p><p>8&#8220;=&#8221; is not followed with whitespace&#8220;=&#8221; 后面缺少空格</p><p>9&#8220;}&#8221; should be on the same line&#8220;}&#8221; 应该与下条语句位于同一行</p><p>10Unused @param tag for &#8220;unused&#8221;没有参数&#8220;unused&#8221;，不需注释</p><p>11Variable &#8220;CA&#8221; missing javadoc变量&#8220;CA&#8221;缺少javadoc注释</p><p>12Line longer than 80characters行长度超过80</p><p>13Line contains a tab character行含有&#8221;tab&#8221; 字符</p><p>14Redundant &#8220;Public&#8221; modifier冗余的&#8220;public&#8221; modifier</p><p>15Final modifier out of order with the JSL suggestionFinal modifier的顺序错误</p><p>16Avoid using the &#8220;.*&#8221; form of importImport格式避免使用&#8220;.*&#8221;</p><p>17Redundant import from the same package从同一个包中Import内容</p><p>18Unused import-java.util.listImport进来的java.util.list没有被使用</p><p>19Duplicate import to line 13重复Import同一个内容</p><p>20Import from illegal package从非法包中 Import内容</p><p>21&#8220;while&#8221; construct must use &#8220;{}&#8221;&#8220;while&#8221; 语句缺少&#8220;{}&#8221;</p><p>22Variable &#8220;sTest1&#8221; must be private and have accessor method变量&#8220;sTest1&#8221;应该是private的，并且有调用它的方法</p><p>23Variable &#8220;ABC&#8221; must match pattern &#8220;^[a-z][a-zA-Z0-9]*$&#8221;变量&#8220;ABC&#8221;不符合命名规则&#8220;^[a-z][a-zA-Z0-9]*$&#8221;</p><p>24&#8220;(&#8221; is followed by whitespace&#8220;(&#8221; 后面不能有空格 25&#8220;)&#8221; is proceeded by whitespace&#8220;)&#8221; 前面不能有空格</p><p>&nbsp;</p><p>不太明白的错误解答</p><p>1.&nbsp; 'X' hides a field.</p><p>public class Foo<br />{<br />&nbsp;&nbsp;&nbsp; private int bar;</p><p>&nbsp;&nbsp;&nbsp; public Foo(int bar)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.bar = bar;<br />&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp; public final int getBar()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bar;<br />&nbsp;&nbsp;&nbsp; }<br />}</p><p>解释：全局private int bar;和局部public Foo(int bar)的bar变量名字重复。<br />此错误，可以忽略不检查。</p><p><br />2. Parameter X should be final.</p><p><br />public class Foo<br />{<br />&nbsp;&nbsp;&nbsp; private int bar;</p><p>&nbsp;&nbsp;&nbsp; public Foo(int bar)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.bar = bar;<br />&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp; public final int getBar()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bar;<br />&nbsp;&nbsp;&nbsp; }<br />}</p><p>解释：public Foo(int bar)的局部变量，被认为是不可改变的，检查需要加上final关键字定义public Foo(final int bar)<br />此错误，可以忽略不检查。</p><p>3. Redundant 'X' modifier.</p><p>public interface CacheHRTreeService extends Manager {</p><p>&nbsp;/**<br />&nbsp; * Organization Tree<br />&nbsp; *<br />&nbsp; * @param orgDto<br />&nbsp; * @return<br />&nbsp; * @throws Exception<br />&nbsp; */<br />&nbsp;public void setOrganization(OrganizationDTO orgDto) throws Exception;</p><p>&nbsp;/**<br />&nbsp; * Organization Tree<br />&nbsp; *<br />&nbsp; * @return<br />&nbsp; * @throws Exception<br />&nbsp; */<br />&nbsp;public OrganizationDTO getOrganization() throws Exception;<br />......<br />}</p><p>解释：多余的字段。public OrganizationDTO getOrganization() throws Exception;此时public为多余的字段，因为interface定义的时候，就是public的。</p><p>需要检查。</p><p>4. - Class X should be declared as final.</p><p>解释：对于单例设计模式，要求返回唯一的类对象。但是HRFactory和ContextFactory为优化的两个类，不需求检查。<br /><a target="_self"><u><strong>其他</strong></u></a>的单例类，依然需要进行检查。</p><p><br />5.&nbsp; Utility classes should not have a public or default constructor.</p><p>解释：工具类不必提供默认的构造方法。<br />需要检查，仅仅为提示。</p><p>6. File does not end with a newline.<br />解释：虽然JAVA程序不要求结尾要用新行，但是习惯上应该要空一行。<br />需要检查，仅仅为提示。</p><p>7. - Method 'addChildrenId' is not designed for extension - needs to be<br />&nbsp; abstract, final or empty.</p><p>解释：通过父类继承的，此类有点特殊<br />可以忽略此类。</p><p>8. Variable 'id' must be private and have accessor methods.<br />解释：BaseHRDTO类，为父类，属性给子类继承，比较特殊。<br />但是其他的类，声名需要加上范围'private'关键字<br />需要检查。</p><p>9. -Array brackets at illegal position.<br />解释：代码写法，习惯不一样。<br />需要检查，仅仅提示。</p></div> </div><br /><br /><br /><img src ="http://www.blogjava.net/ashutc/aggbug/351690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-06-03 15:56 <a href="http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计</title><link>http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 09 May 2011 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/349855.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/349855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/349855.html</trackback:ping><description><![CDATA[<br />
<br />
<ol class="article">
    <li>原始单据与实体之间的关系</li>
    <p class="contentNew">可以是一对一、一对多、多对多的关系。在一般情况下，它们是一对一的关系：即一张原始单据对应且只
    对应一个实体。在特殊情况下，它们可能是一对多或多对一的关系，即一张原始单证对应多个实体，或多张原始单证对应一个实体。这里的实体可以理解为基本表。
    明确这种对应关系后，对我们设计录入界面大有好处。</p>
    <p class="contentNew">比如：一份员工履历资料，在人力资源信息系统中，就对应三个基本表：员工基本情况表、社会关系表、工作简历表。这就是&#8220;一张原始单证对应多个实体&#8221;的典型例子。</p>
    <li>主键与外键</li>
    <p class="contentNew">一般而言，一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体,
    可以定义主键，也可以不定义主键（因为它无子孙）, 但必须要有外键（因为它有父亲）。
    主键与外键的设计，在全局数据库的设计中，占有重要地位。当全局数据库的设计完成以后，有个美国数据库设计专家说：&#8220;键，到处都是键，除了键之外，什么也
    没有&#8221;，这就是他的数据库设计经验之谈，也反映了他对信息系统核心（数据模型）的高度抽象思想。因为：主键是实体的高度抽象，主键与外键的配对，表示实体
    之间的连接。</p>
    <li>基本表的性质</li>
    <p class="contentNew">基本表与中间表、临时表不同，因为它具有如下四个特性：</p>
    <ul class="article">
        <li>原子性。基本表中的字段是不可再分解的。</li>
        <li>原始性。基本表中的记录是原始数据（基础数据）的记录。</li>
        <li>演绎性。由基本表与代码表中的数据，可以派生出所有的输出数据。</li>
        <li>稳定性。基本表的结构是相对稳定的，表中的记录是要长期保存的。</li>
    </ul>
    <p class="contentNew">理解基本表的性质后，在设计数据库时，就能将基本表与中间表、临时表区分开来。</p>
    <li>范式标准</li>
    <p class="contentNew">基本表及其字段之间的关系, 应尽量满足第三范式。但是，满足第三范式的数据库设计，往往不是最好的设计。为了提高数据库的运行效率，常常需要降低范式标准：适当增加冗余，达到以空间换时间的目的。</p>
    <p class="contentNew">比如有一张存放商品的基本表，如表1所示。&#8220;金额&#8221;这个字段的存在，表明该表的设计不满足第三范式，因为&#8220;金额&#8221;可以由&#8220;单价&#8221;乘以&#8220;数量&#8221;得到，说明&#8220;金额&#8221;是冗余字段。但是，增加&#8220;金额&#8221;这个冗余字段，可以提高查询统计的速度，这就是以空间换时间的作法。</p>
    <p class="contentNew">在Rose 2002中，规定列有两种类型：数据列和计算列。&#8220;金额&#8221;这样的列被称为&#8220;计算列&#8221;，而&#8220;单价&#8221;和&#8220;数量&#8221;这样的列被称为&#8220;数据列&#8221;。</p>
    <table style="line-height: 150%;" align="center" border="1" cellspacing="0" width="600">
        <tbody>
            <tr>
                <td>商品名称</td>
                <td>商品型号</td>
                <td>单价</td>
                <td>数量</td>
                <td>金额</td>
            </tr>
            <tr>
                <td>电视机</td>
                <td>29吋</td>
                <td>2,500</td>
                <td>40</td>
                <td>100,000</td>
            </tr>
        </tbody>
    </table>
    <p align="center">表1 商品表的表结构</p>
    <li>通俗地理解三个范式</li>
    <p class="contentNew">通俗地理解三个范式，对于数据库设计大有好处。在数据库设计中，为了更好地应用三个范式，就必须通俗地理解三个范式（通俗地理解是够用的理解，并不是最科学最准确的理解）：</p>
    <ul class="article">
        <li>第一范式：1NF是对属性的原子性约束，要求属性具有原子性，不可再分解；</li>
        <li>第二范式：2NF是对记录的惟一性约束，要求记录有惟一标识，即实体的惟一性；</li>
        <li>第三范式：3NF是对字段冗余性的约束，即任何字段不能由其他字段派生出来，它要求字段没有冗余。</li>
    </ul>
    <p class="contentNew">没有冗余的数据库设计可以做到。但是，没有冗余的数据库未必是最好的数据库，有时为了提高运行效率，就必须降低范式标准，适当保留冗余数据。具体做法是：在概念数据模型设计时遵守第三范式，降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段，允许冗余。</p>
    <li>要善于识别与正确处理多对多的关系</li>
    <p class="contentNew">若两个实体之间存在多对多的关系，则应消除这种关系。消除的办法是，在两者之间增加第三个实体。这
    样，原来一个多对多的关系，现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体，实质上是一个较复杂的关系，
    它对应一张基本表。一般来讲，数据库设计工具不能识别多对多的关系，但能处理多对多的关系。</p>
    <p class="contentNew">比如在&#8220;图书馆信息系统&#8221;中，&#8220;图书&#8221;是一个实体，&#8220;读者&#8221;也是一个实体。这两个实体之间的关系，
    是一个典型的多对多关系：一本图书在不同时间可以被多个读者借阅，一个读者又可以借多本图书。为此，要在二者之间增加第三个实体，该实体取名为&#8220;借还
    书&#8221;，它的属性为：借还时间、借还标志（0表示借书，1表示还书），另外，它还应该有两个外键（&#8220;图书&#8221;的主键，&#8220;读者&#8221;的主键），使它能与&#8220;图书&#8221;和
    &#8220;读者&#8221;连接。</p>
    <li>主键PK的取值方法</li>
    <p class="contentNew">PK是供程序员使用的表间连接工具，可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时，建议字段的个数不要太多，多了不但索引占用空间大，而且速度也慢。</p>
    <li>正确认识数据冗余</li>
    <p class="contentNew">主键与外键在多表中的重复出现，不属于数据冗余，这个概念必须清楚，事实上有许多人还不清楚。非键字段的重复出现，才是数据冗余！而且是一种低级冗余，即重复性的冗余。高级冗余不是字段的重复出现，而是字段的派生出现。</p>
    <p class="contentNew">比如商品中的&#8220;单价、数量、金额&#8221;三个字段，&#8220;金额&#8221;就是由&#8220;单价&#8221;乘以&#8220;数量&#8221;派生出来的，它就
    是冗余，而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性，因为同一数据，可能从不同时间、地点、角色上多次录
    入。因此，我们提倡高级冗余（派生性冗余），反对低级冗余（重复性冗余）。</p>
    <li>E-R图没有标准答案</li>
    <p class="contentNew">信息系统的E-R图没有标准答案，因为它的设计与画法不是惟一的，只要它覆盖了系统需求的业务范围
    和功能内容，就是可行的。反之要修改E-R图。尽管它没有惟一的标准答案，并不意味着可以随意设计。好的E—R图的标准是：结构清晰、关联简洁、实体个数
    适中、属性分配合理、没有低级冗余。</p>
    <li>视图技术在数据库设计中很有用</li>
    <p class="contentNew">与基本表、代码表、中间表不同，视图是一种虚表，它依赖数据源的实表而存在。视图是供程序员使用数
    据库的一个窗口，是基表数据综合的一种形式, 是数据处理的一种方法，是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间,
    视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义,
    视图的深度就不受限制了。</p>
    <p class="contentNew">对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统，视图的作用更加重要。这些系统的
    基本表完成物理设计之后，立即在基本表上建立第一层视图，这层视图的个数和结构，与基本表的个数和结构是完全相同。并且规定，所有的程序员，一律只准在视
    图上操作。只有数据库管理员，带着多个人员共同掌握的&#8220;安全钥匙&#8221;，才能直接在基本表上操作。请读者想想：这是为什么？</p>
    <li>中间表、报表和临时表</li>
    <p class="contentNew">中间表是存放统计数据的表，它是为数据仓库、输出报表或查询结果而设计的，有时它没有主键与外键（数据仓库除外）。临时表是程序员个人设计的，存放临时记录，为个人所用。基表和中间表由DBA维护，临时表由程序员自己用程序自动维护。</p>
    <li>完整性约束表现在三个方面</li>
    <p class="contentNew">域的完整性：用Check来实现约束，在数据库设计工具中，对字段的取值范围进行定义时，有一个Check按钮，通过它定义字段的值城。</p>
    <p class="contentNew">参照完整性：用PK、FK、表级触发器来实现。</p>
    <p class="contentNew">用户定义完整性：它是一些业务规则，用存储过程和触发器来实现。</p>
    <li>防止数据库设计打补丁的方法是&#8220;三少原则&#8221;</li>
    <ul class="article">
        <li>一个数据库中表的个数越少越好。只有表的个数少了，才能说明系统的E--R图少而精，去掉了重复的多余的实体，形成了对客观世界的高度抽象，进行了系统的数据集成，防止了打补丁式的设计；</li>
        <li>一个表中组合主键的字段个数越少越好。因为主键的作用，一是建主键索引，二是做为子表的外键，所以组合主键的字段个数少了，不仅节省了运行时间，而且节省了索引存储空间；</li>
        <li>一个表中的字段个数越少越好。只有字段的个数少了，才能说明在系统中不存在数据重复，且很少有数据冗余，更重要的是督促
        读者学会&#8220;列变行&#8221;，这样就防止了将子表中的字段拉入到主表中去，在主表中留下许多空余的字段。所谓&#8220;列变行&#8221;，就是将主表中的一部分内容拉出去，另外单
        独建一个子表。这个方法很简单，有的人就是不习惯、不采纳、不执行。</li>
    </ul>
    <p class="contentNew">数据库设计的实用原则是：在数据冗余和处理速度之间找到合适的平衡点。&#8220;三少&#8221;是一个整体概念，综
    合观点，不能孤立某一个原则。该原则是相对的，不是绝对的。&#8220;三多&#8221;原则肯定是错误的。试想：若覆盖系统同样的功能，一百个实体（共一千个属性）
    的E-R图，肯定比二百个实体（共二千个属性） 的E--R图，要好得多。</p>
    <p class="contentNew">提倡&#8220;三少&#8221;原则，是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系
    统集成为应用数据库，将应用数据库集成为主题数据库，将主题数据库集成为全局综合数据库。集成的程度越高，数据共享性就越强，信息孤岛现象就越少，整个企
    业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。</p>
    <p class="contentNew">提倡&#8220;三少&#8221;原则的目的，是防止读者利用打补丁技术，不断地对数据库进行增删改，使企业数据库变成了随意设计数据库表的&#8220;垃圾堆&#8221;，或数据库表的&#8220;大杂院&#8221;，最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章，不计其数，导致企事业单位的信息系统无法维护而瘫痪。</p>
    <p class="contentNew">&#8220;三多&#8221;原则任何人都可以做到，该原则是&#8220;打补丁方法&#8221;设计数据库的歪理学说。&#8220;三少&#8221;原则是少而精的原则，它要求有较高的数据库设计技巧与艺术，不是任何人都能做到的，因为该原则是杜绝用&#8220;打补丁方法&#8221;设计数据库的理论依据。</p>
    <li>提高数据库运行效率的办法</li>
    <p class="contentNew">在给定的系统硬件和系统软件条件下，提高数据库系统的运行效率的办法是：</p>
    <ul class="article">
        <li>在数据库物理设计时，降低范式，增加冗余，少用触发器, 多用存储过程。</li>
        <li>当计算非常复杂、而且记录条数非常巨大时（例如一千万条），复杂计算要先在数据库外面，以文件系统方式用C++语言计算处理完成之后，最后才入库追加到表中去。这是电信计费系统设计的经验。</li>
        <li>发现某个表的记录太多，例如超过一千万条，则要对该表进行水平分割。水平分割的做法是，以该表主键PK的某个值为界线，将该表的记录水平分割为两个表。若发现某个表的字段太多，例如超过八十个，则垂直分割该表，将原来的一个表分解为两个表。</li>
        <li>对数据库管理系统DBMS进行系统优化，即优化各种系统参数，如缓冲区个数。</li>
        <li>在使用面向数据的SQL语言进行程序设计时，尽量采取优化算法。</li>
    </ul>
    <p class="contentNew">总之，要提高数据库的运行效率，必须从数据库系统级优化、数据库设计级优化、程序实现级优化，这三个层次上同时下功夫。</p>
</ol>
<p class="contentNew">上述十四个技巧，是许多人在大量的数据库分析与设计实践中，逐步总结出来的。对于这些经验的运用，读者不能生帮硬套，死记硬背，而要消化理解，实事求是，灵活掌握。并逐步做到：在应用中发展，在发展中应用。 </p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/349855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-05-09 17:13 <a href="http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hashmap的遍历方式</title><link>http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 14 Apr 2011 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348299.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348299.html</trackback:ping><description><![CDATA[<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;cn.yu.hashmap;<br />
<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.HashMap;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Iterator;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Map;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Map.Entry;<br />
<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;hashmap&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">aaa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bbb</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ccc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">4</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ddd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">5</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">eee</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">6</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fff</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">7</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ggg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hhh</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">9</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">iii</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;遍历hashmap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashmap1(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用keySet遍历<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashmap2(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用entrySet遍历&nbsp;速度快<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashmap3(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hashmap1(HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Map.Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;entry&nbsp;:&nbsp;map.entrySet())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Key:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;entry.getKey()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;value:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;entry.getValue().toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hashmap2(HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;it</span><span style="color: #000000; ">=</span><span style="color: #000000; ">map.keySet().iterator();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这是取得键对象&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(it.hasNext())&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">value:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">map.get(it.next()));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">获得键所对应的值。&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hashmap3(HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;map.entrySet().iterator();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(it.hasNext()){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;entry</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">)it.next();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">entry.getKey()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;value:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">entry.getValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;line(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">========================华丽的分割线===============================</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
&nbsp; Hashmap实际上是一个数组和链表的结合体，利用数组来模拟一个个桶（类似于Bucket Sort）以快速存取不同hashCode的key，对于相同hashCode的不同key，再调用其equals方法从List中提取出和key所相对应的value<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-14 15:43 <a href="http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python模块学习 --- urllib</title><link>http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 21 Mar 2011 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/346695.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/346695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/346695.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">urllib模块提供的上层接口，使我们可以像读取本地文件一样读取www和ftp上的数据。每当使用这个模块的时候，老是会想起公司产品的客户端，同事用C</span><span style="color: #000000;">++</span><span style="color: #000000;">下载Web上的图片，那种&#8220;痛苦&#8221;的表情。我以前翻译过libcurl教程，这是在C</span><span style="color: #000000;">/</span><span style="color: #000000;">C</span><span style="color: #000000;">++</span><span style="color: #000000;">环境下比较方便实用的网络操作库，相比起&nbsp;libcurl，Python的urllib模块的使用门槛则低多了。可能有些人又会用效率来批评Python，其实在操作网络，或者在集群交互的时候，&nbsp;语言的执行效率绝不是瓶颈。这种情况下，一个比较好的方法是，将python嵌入到C</span><span style="color: #000000;">/</span><span style="color: #000000;">C</span><span style="color: #000000;">++</span><span style="color: #000000;">中，让Python来完成一些不是核心的逻辑处理。又扯远了，废话少说，开始urllib之旅吧</span><span style="color: #000000;">~~</span><span style="color: #000000;">&nbsp;（前几天我用这个模块写了个蜘蛛，感兴趣的同学可以在以前的博客中找到代码）<br />
&nbsp;&nbsp;&nbsp;&nbsp;先看一个例子，这个例子把Google首页的html抓取下来并显示在控制台上：<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;#&nbsp;别惊讶，整个程序确实只用了两行代码&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;urllib&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">).read()&nbsp;&nbsp;<br />
<br />
#&nbsp;别惊讶，整个程序确实只用了两行代码<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;urllib<br />
print&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">).read()<br />
<br />
urllib.urlopen(url[,&nbsp;data[,&nbsp;proxies]])&nbsp;:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;创建一个表示远程url的类文件对象，然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径，一般是网址；参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式：post与get。如果你不清楚，也不必太在意，一般情况下很少用到这个参数)；参数proxies用于设置代理（这里不详细讲怎么使用代理，感兴趣的看客可以去翻阅Python手册urllib模块）。urlopen返回&nbsp;一个类文件对象，他提供了如下方法：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read()&nbsp;,&nbsp;readline()&nbsp;,&nbsp;readlines()&nbsp;,&nbsp;fileno()&nbsp;,&nbsp;close()&nbsp;：这些方法的使用方式与文件对象完全一样;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info()：返回一个httplib.HTTPMessage&nbsp;对象，表示远程服务器返回的头信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getcode()：返回Http状态码。如果是http请求，200表示请求成功完成;404表示网址未找到；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;geturl()：返回请求的url；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面来扩充一下上面的例子，看官可以运行一下这个例子，加深对urllib的印象：<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;google&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;header:\n</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.info()&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;status:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.getcode()&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">url:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.geturl()&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;line&nbsp;in&nbsp;google:&nbsp;#&nbsp;就像在操作本地文件&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;line,&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;google.close()&nbsp;&nbsp;<br />
<br />
google&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;header:\n</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.info()<br />
print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;status:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.getcode()<br />
print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">url:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.geturl()<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;line&nbsp;in&nbsp;google:&nbsp;#&nbsp;就像在操作本地文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;line,<br />
google.close()<br />
<br />
urllib.urlretrieve(url[,&nbsp;filename[,&nbsp;reporthook[,&nbsp;data]]])：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径（如果未指定该参数，urllib会生成一个临时文件来保存数据）；参数reporthook是一个回调函数，当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函&nbsp;数来显示当前的下载进度，下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,&nbsp;headers)，filename表示保存到本地的路径，header表示服务器的响应头。下面通过例子来演示一下这个方法的使用，这个例子将新浪首页的html抓取到本地，保存在D:\sina.html文件中，同时显示下载的进度。<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;def&nbsp;cbk(a,&nbsp;b,&nbsp;c):&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''''</span><span style="color: #000000;">回调函数&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@a:&nbsp;已经下载的数据块&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@b:&nbsp;数据块的大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@c:&nbsp;远程文件的大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100.0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;c&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;per&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">%.2f%%</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;per&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;url&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.sina.com.cn</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">.&nbsp;local&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\\sina.html</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">.&nbsp;urllib.urlretrieve(url,&nbsp;local,&nbsp;cbk)&nbsp;&nbsp;<br />
<br />
def&nbsp;cbk(a,&nbsp;b,&nbsp;c):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''</span><span style="color: #000000;">回调函数</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@a:&nbsp;已经下载的数据块<br />
&nbsp;&nbsp;&nbsp;&nbsp;@b:&nbsp;数据块的大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;@c:&nbsp;远程文件的大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100.0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;c<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;per&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">%.2f%%</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;per<br />
<br />
url&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.sina.com.cn</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
local&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\\sina.html</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
urllib.urlretrieve(url,&nbsp;local,&nbsp;cbk)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;上面介绍的两个方法是urllib中最常用的方法，这些方法在获取远程数据的时候，内部会使用URLopener或者&nbsp;FancyURLOpener类。作为urllib的使用者，我们很少会用到这两个类，这里我不想多讲。如果对urllib的实现感兴趣，&nbsp;或者希望urllib支持更多的协议，可以研究这两个类。在Python手册中，urllib的作者还列出了这个模块的缺陷和不足，感兴趣的同学可以打开&nbsp;Python手册了解一下。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;urllib中还提供了一些辅助方法，用于对url进行编码、解码。url中是不能出现一些特殊的符号的，有些符号有特殊的用途。我们知道以get方式提交数据的时候，会在url中添加key</span><span style="color: #000000;">=</span><span style="color: #000000;">value这样的字符串，所以在value中是不允许有</span><span style="color: #000000;">'</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">，因此要对其进行编码；与此同时服务器接收到这些参数的时候，要进行解码，还原成原始的数据。这个时候，这些辅助方法会很有用：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.quote(string[,&nbsp;safe])：对字符串进行编码。参数safe指定了不需要编码的字符;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.unquote(string)&nbsp;：对字符串进行解码；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.quote_plus(string&nbsp;[&nbsp;,&nbsp;safe&nbsp;]&nbsp;)&nbsp;：与urllib.quote类似，但这个方法用</span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">来替换</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">，而quote用</span><span style="color: #000000;">'</span><span style="color: #000000;">%20</span><span style="color: #000000;">'</span><span style="color: #000000;">来代替</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.unquote_plus(string&nbsp;)&nbsp;：对字符串进行解码；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.urlencode(query[,&nbsp;doseq])：将dict或者包含两个元素的元组列表转换成url参数。例如&nbsp;字典{</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">dark-bull</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">}将被转换为</span><span style="color: #000000;">"</span><span style="color: #000000;">name=dark-bull&amp;age=200</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.pathname2url(path)：将本地路径转换成url路径；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.url2pathname(path)：将url路径转换成本地路径；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;用一个例子来体验一下这些方法吧</span><span style="color: #000000;">~~</span><span style="color: #000000;">：<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name&nbsp;=&nbsp;~a+3</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote(data)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;print&nbsp;data1&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">3D</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.unquote(data1)&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;data2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote_plus(data)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;print&nbsp;data2&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">+%</span><span style="color: #000000;">3D</span><span style="color: #000000;">+%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.unquote_plus(data2)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.&nbsp;data3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlencode({&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">dark-bull</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">&nbsp;})&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;print&nbsp;data3&nbsp;#&nbsp;result:&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">200</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">name</span><span style="color: #000000;">=</span><span style="color: #000000;">dark</span><span style="color: #000000;">-</span><span style="color: #000000;">bull&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">.&nbsp;data4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.pathname2url(r</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\a\b\c\23.php</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">.&nbsp;print&nbsp;data4&nbsp;#&nbsp;result:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">/D|/a/b/c/23.php&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.url2pathname(data4)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;D:\a\b\c\</span><span style="color: #000000;">23</span><span style="color: #000000;">.php&nbsp;&nbsp;<br />
<br />
data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name&nbsp;=&nbsp;~a+3</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
<br />
data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote(data)<br />
print&nbsp;data1&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">3D</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3<br />
print&nbsp;urllib.unquote(data1)&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
<br />
data2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote_plus(data)<br />
print&nbsp;data2&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">+%</span><span style="color: #000000;">3D</span><span style="color: #000000;">+%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3<br />
print&nbsp;urllib.unquote_plus(data2)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
<br />
data3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlencode({&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">dark-bull</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">&nbsp;})<br />
print&nbsp;data3&nbsp;#&nbsp;result:&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">200</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">name</span><span style="color: #000000;">=</span><span style="color: #000000;">dark</span><span style="color: #000000;">-</span><span style="color: #000000;">bull<br />
<br />
data4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.pathname2url(r</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\a\b\c\23.php</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
print&nbsp;data4&nbsp;#&nbsp;result:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">/D|/a/b/c/23.php</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">print&nbsp;urllib.url2pathname(data4)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;D:\a\b\c\</span><span style="color: #000000;">23</span><span style="color: #000000;">.php<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/346695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-03-21 18:11 <a href="http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache 部分配置</title><link>http://www.blogjava.net/ashutc/archive/2010/10/21/335780.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 21 Oct 2010 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/10/21/335780.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/ashutc/archive/2010/10/21/335780.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/335780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-10-21 13:56 <a href="http://www.blogjava.net/ashutc/archive/2010/10/21/335780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache与tomcat整合时参数乱码的解决</title><link>http://www.blogjava.net/ashutc/archive/2010/09/06/331235.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 06 Sep 2010 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/09/06/331235.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/331235.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/09/06/331235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/331235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/331235.html</trackback:ping><description><![CDATA[<p>把Apache2.2与Tomcat6进行整合之后，当提交带有中文参数的请求时，经常出现奇怪的现象。在直接访问Tomcat时，可以正常返回结果的请求，一旦经过Apache的代理，就出现问题。</p>
<p>通过Debug发现，Tomcat在经过和不经过Apache代理的两种情况下，得到的中文参数是不同的，而后者是乱码。</p>
<p>从网上查了一下资料，发现Apache在使用AJP13模式代理到Tomcat时，也应该为Tomcat的AJP13设定一些参数。</p>
<p>具体说来，应该在Tomcat的server.xml中设置为： <br />
</p>
<p><br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">Connector&nbsp;port</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">8085</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;protocol</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">HTTP/1.1</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;connectionTimeout</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">20000</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;redirectPort</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">8443</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;防止中文乱码&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useBodyEncodingForURI</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;URIEncoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF8</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Connector&nbsp;port</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">8009</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;protocol</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">AJP/1.3</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;redirectPort</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">8443</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;防止中文乱码&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useBodyEncodingForURI</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;URIEncoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF8</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span></div>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/331235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-09-06 18:33 <a href="http://www.blogjava.net/ashutc/archive/2010/09/06/331235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse启动和运行速度优化</title><link>http://www.blogjava.net/ashutc/archive/2010/08/01/327682.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Sun, 01 Aug 2010 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/08/01/327682.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/327682.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/08/01/327682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/327682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/327682.html</trackback:ping><description><![CDATA[<p>My<a href="http://www.114java.com/MyEclipse_Eclipseshiyong/"><u>Eclipse</u></a>优化如下：<br />
<strong>1、去除不需要加载的模块</strong><br />
Windows &#8211; Preferences - General - Startup and Shutdown，这个时候在右侧就显示出了Eclipse启动时加载的模块，可以根据自己的实际情况去除一些模块。</p>
<p>关掉没用的启动项：</p>
<p>（1）WTP ：一个跟<a href="http://www.114java.com/MyEclipse_Eclipseshiyong/"><u>myeclipse</u></a>差不多的东西，主要差别是 WTP 是免费的，如果使用myeclipse，这个可以取消</p>
<p>（2）Mylyn：组队任务管理工具，类似于 CVS ，以任务为单位管理项目进度，没用到的可以取消</p>
<p>（3）Derby：一种保存成 jar 形式的数据库，我没用到，取消</p>
<p>（4）一大排以 MyEclipse EASIE 打头的启动项：myeclipse 支持的服务器，只选自己用的，其他取消</p>
<p><strong>2、取消MyEclipse在启动时自动验证项目配置文件</strong><br />
默认情况下MyEclipse在启动的时候会自动验证每个项目的配置文件，这是一个非常耗时的过程，可以在Preferences窗口依次选择
MyEclipse Enterprise Workbench - Validation，然后在右侧的Validator列表中只保留 Manual
项就可以了(Manual全部勾选，Bulid项只留下第一项)。</p>
<p>如果需要验证的时候只需要选中文件，然后右键选择 MyEclipse - Run Validation就可以了。</p>
<p><strong>3、去掉拼写检查（如果你觉的有用可以不去）</strong><br />
拼写检查会给我们带来不少的麻烦，我们的方法命名都会是单词的缩写，他也会提示有错，所以最好去掉，没有多大的用处：</p>
<p>windows&#8211;&gt;perferences&#8211;&gt;general&#8211;&gt;editors-&gt;Text Editors-&gt;spelling</p>
<p><strong>4、关闭自动更新</strong><br />
如果是myeclipse7.5：</p>
<p><strong>（1）关掉maven自动更新：</strong></p>
<p>window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven,</p>
<p>关闭所有Download和Update开头的选项，共四项（去掉前面的勾）</p>
<p>（2）关闭更新调度：window &#8211;&gt; preferences &#8211;&gt; General &#8211;&gt; Startup and Shutdown &#8211;&gt; Automatic Updates Scheduler（去掉前面的勾）</p>
<p>（3）window &#8211;&gt; preferences &#8211;&gt;Myeclipse Dashboard,关闭Show Myeclipse Dashboard on startup</p>
<p><strong>5、加大JVM的非堆内存</strong><br />
打开 myeclipse.ini</p>
<p>-Xmx384m</p>
<p>-XX:MaxPermSize=384m</p>
<p>-XX:ReservedCodeCacheSize=96m</p>
<p>可以修改-Xmx，-XX:MaxPermSize，-XX:ReservedCodeCacheSize，</p>
<p>将这三项的值调大，但并不是越大越好，曾经在相同的条件下做过测试（内存2GB），-Xmx，-XX:MaxPermSize的值为384m时比512m时要快（视具体的计算机而定），</p>
<p>-Xmx，-XX:MaxPermSize的值设为同样大小且两者之和不能超出你的计算机本身的内存大小</p>
<p><strong>6、window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven，将Maven JDK改为电脑上安装的JDK，即不使用myeclipse提供的JDK<br />
登记add按钮，选择你的电脑上的JDK即可（注意：不是JRE）</strong></p>
<p><strong>7、window-preferences-MyEclipse Enterprise
Workbench-Matisse4Myeclipse/Swing,将Design-time information(dt.jar)
location 改用电脑安装的JDK的dt.jar<br />
（即不使用myeclipse提供的dt.jar）</strong></p>
<img src ="http://www.blogjava.net/ashutc/aggbug/327682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-08-01 10:40 <a href="http://www.blogjava.net/ashutc/archive/2010/08/01/327682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql 编码修改 gbk和iso-8859-1</title><link>http://www.blogjava.net/ashutc/archive/2010/07/08/325563.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 08 Jul 2010 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/07/08/325563.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/325563.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/07/08/325563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/325563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/325563.html</trackback:ping><description><![CDATA[注册表<br />
SOFTWARE/ORACLE/KEY_QRACLIENT10G_HOME1/NLS_LANG<br />
<br />
iso8859-1 :&nbsp; SIMPLIFIED CHINESE_CHINA.we8iso8859p1<br />
<br />
gbk:<em>&nbsp;&nbsp; SIMPLIFIED CHINESE_CHINA.ZHS16GBK</em><br />
<img src ="http://www.blogjava.net/ashutc/aggbug/325563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-07-08 15:43 <a href="http://www.blogjava.net/ashutc/archive/2010/07/08/325563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>try中的return语句，在finally前执行还是在finally后执行</title><link>http://www.blogjava.net/ashutc/archive/2010/01/16/309798.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Sat, 16 Jan 2010 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/01/16/309798.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/309798.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/01/16/309798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/309798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/309798.html</trackback:ping><description><![CDATA[查询了很多解释，但网上都是转载别人的，好像也没有深究细节问题。<br />
<br />
代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;test002&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;test()&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fun1();<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fun2();<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fun1()&nbsp;{<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">fun1被执行了</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fun2()&nbsp;{<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">fun２被执行了</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;test002().test());<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">}<br />
</span></div>
执行结果：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">fun1被执行了<br />
fun２被执行了<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;"><br />
</span></div>
代码反映的情况是return首先被执行，finally后被执行，return并不是让结果马上返回，而是先把结果放到函数中，然后必须等待finally结果出来后在真正的返回，此时返回的结果就是finally当中的那个结果<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/309798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-01-16 22:09 <a href="http://www.blogjava.net/ashutc/archive/2010/01/16/309798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>完成Test类的sort()方法,对数组a升序排序。</title><link>http://www.blogjava.net/ashutc/archive/2009/12/05/304834.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 04 Dec 2009 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/12/05/304834.html</guid><description><![CDATA[（1）完成Test类的sort()方法,对数组a升序排序。<br />
public class Test {<br />
&nbsp;public int[] sort(int[] a){<br />
&nbsp; //排序代码<br />
&nbsp; return a;<br />
&nbsp;}<br />
}<br />
（2）新建一个类Reflection（Reflection中不能有对Test类的引用），通过反射调用Test类的sort()方
法，打印输出排序前和排序后的数组。<br />
public class Reflection {<br />
&nbsp;private static int[] a = {3,2,8,11,20,5,6,18,7,12};<br />
//&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
}<br />
<br />
<br />
public class test002 {<br />
<br />
&nbsp;&nbsp; &nbsp;public int[] sort(int[] a) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int b;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; a.length - 1; i++) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int j = i + 1; j &lt; a.length; j++) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (a[i] &gt; a[j]) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b = a[i];<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;a[i] = a[j];<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;a[j] = b;// 这个顺数不能变。<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; a.length; i++) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(a[i]);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return a;<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
public class test003 {<br />
<br />
&nbsp;&nbsp; &nbsp;/**<br />
&nbsp;&nbsp; &nbsp; * @param args<br />
&nbsp;&nbsp; &nbsp; */<br />
&nbsp;&nbsp; &nbsp;public static test002 t(String t){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;test002 test=null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;test=(test002) Class.forName("cn.yu.test."+t).newInstance();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (InstantiationException e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (IllegalAccessException e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (ClassNotFoundException e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return test;<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test002 t02=t("test002");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] t=new int[]{1,2,3,4,8,5};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(t02.sort(t));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
}<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/304834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-12-05 00:07 <a href="http://www.blogjava.net/ashutc/archive/2009/12/05/304834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用程序创建一个xml文件c:/test.xml</title><link>http://www.blogjava.net/ashutc/archive/2009/12/04/304827.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 04 Dec 2009 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/12/04/304827.html</guid><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.dom4j.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.dom4j.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;test&nbsp;{<br />
&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写入</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;cXML(){<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;Document&nbsp;document&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DocumentHelper.createDocument();<br />
&nbsp;Element&nbsp;friendsElement&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.addElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">scores</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;Element&nbsp;friends1Element&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;friendsElement.addElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">JAVA</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;Element&nbsp;friends2Element&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;friendsElement.addElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">C</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;Element&nbsp;friends3Element&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;friendsElement.addElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">JS</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;friends1Element.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">85</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;friends2Element.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">80</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;friends3Element.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">90</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;XMLWriter&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XMLWriter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileWriter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:/test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">)));<br />
&nbsp;writer.write(document);<br />
&nbsp;writer.close();<br />
&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">创建XML成功</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;err)&nbsp;{<br />
&nbsp;err.printStackTrace();<br />
}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">读取</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;read(){<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;File&nbsp;f&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:/test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;SAXReader&nbsp;reader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SAXReader();&nbsp;<br />
&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;reader.read(f);&nbsp;<br />
&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;doc.getRootElement();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">已找到XML</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">节点JAVA下的值为：</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">root.elementText(</span><span style="color: #000000;">"</span><span style="color: #000000;">JAVA</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">节点C下的值为：</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">root.elementText(</span><span style="color: #000000;">"</span><span style="color: #000000;">C</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">节点JS下的值为：</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">root.elementText(</span><span style="color: #000000;">"</span><span style="color: #000000;">JS</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception&nbsp;err){<br />
&nbsp;&nbsp;&nbsp;err.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args){<br />
&nbsp;&nbsp;test&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;test();<br />
&nbsp;&nbsp;a.cXML();</span><span style="color: #008000;">//</span><span style="color: #008000;">写入</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;a.read();</span><span style="color: #008000;">//</span><span style="color: #008000;">读取</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;}<br />
} <br />
</span></div>
<pre>（1）用程序创建一个xml文件c:/test.xml, 为该文件增加学生成绩节点内容如下：<br />
<br />
&lt;scores&gt;<br />
&lt;Java&gt;85&lt;/Java&gt;<br />
&lt;C++&gt;80&lt;/C++&gt;<br />
&lt;JS&gt;90&lt;/JS&gt;<br />
&lt;/scores&gt;<br />
<br />
</pre>
<img src ="http://www.blogjava.net/ashutc/aggbug/304827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-12-04 22:43 <a href="http://www.blogjava.net/ashutc/archive/2009/12/04/304827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL入门指导</title><link>http://www.blogjava.net/ashutc/archive/2009/11/20/303001.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 19 Nov 2009 17:38:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/11/20/303001.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/303001.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/11/20/303001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/303001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/303001.html</trackback:ping><description><![CDATA[<p>XSL(EXtensible Stylesheet Language)它是指可扩展样式表语言。 XSL之于 XML 就像 CSS 之于
HTML。说白了就是将XML中的数据用指定的显示格式输出．XML不像HTML,它不包含任何显示格式的信息．&nbsp;XSL 包含两个部分：<br />
</p>
<ul>
    <li>XSLT &#8211; 用于转换 XML 文档的语言. XSLT 是指 XSL 转换 (XSL Transformation) </li>
    <li>XPath &#8211; 用于在 XML 文档中导航的语言 </li>
</ul>
<p><strong>XSL 语法</strong></p>
任何 XSL 文档的第一行实际上都是 XML 声明：<br />
<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
</p>
XSL 与 XML ？遵循相同的语法规则<br />
在 XML 声明之后，就是 XSL 声明，例如：<br />
<p>&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br />
......<br />
&lt;/xsl:stylesheet&gt;<br />
</p>
XSL声明必须要有结束标签，上面的声明中还包含命名空间和 XSL 规范的版本。<br />
<br />
<strong>什么是命名空间</strong><br />
<br />
它
指定一组可以在特定文档中使用的元素名称和属性名称。命名空间的作用是避免命名冲突。由于 XML 和其它与 XML
相关的语言都是用户定义的，所以可能出现命名冲突。&lt;table&gt;可能是指一个布局或是一个座位。由于大多数应用程序同时处理多个 XML
文档，因此经常会有不同 XML
文档相混合的情况，而在这些文档中某个元素可能代表不同的含义。几个文档使用相同的命名空间可以确保元素在每个文档中代表相同含义。否则，就应该使用不同
的命名空间确保元素代表不同的含义。<br />
<br />
命名空间由文档声明中的 xmlns 属性指定,实际上就是网站的地址（例如 http://www.w3.org/1999/XSL/Transform）。其基本原理是 URI 具有唯一性，因此相应的命名空间也是唯一的。文档声明中的 URI 仅用作名称。<br />
<br />
<strong>模板或规则</strong><br />
XSL 文档是由模板或规则构成,每个模板定义应用于特定 XML 节点的规则。XSL 模板如下所示：<br />
<p>&lt;xsl:template match="/"&gt;......&lt;/xsl:template&gt;</p>
模板的作用是用来承载XML文档中的数据的,就像一个模具，如果这个模具是方形的，那么用这个模具做出来的模型也一定是方形的，而XML文档中的数据就是用来真充模具的原料。实际上在模板中可以嵌套子模板，但最上层模板必须将match设为"/"。<br />
happyold.xml<br />
<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;俱乐部&gt;<br />
&lt;会员&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&lt;姓名&gt;cnbruce &lt;/姓名&gt;<br />
&lt;年龄&gt;10 &lt;/年龄&gt;<br />
&lt;性别&gt;男 &lt;/性别&gt;<br />
&lt;描述&gt;他是一个糟糕的家伙！&lt;/描述&gt;<br />
&lt;/会员&gt;<br />
&lt;会员&gt;<br />
&lt;姓名&gt;yufuzi&lt;/姓名&gt;<br />
&lt;年龄&gt;80 &lt;/年龄&gt;<br />
&lt;性别&gt;男 &lt;/性别&gt;<br />
&lt;描述&gt;他是一个优秀的男人！&lt;/描述&gt; <br />
&lt;/会员&gt;<br />
&lt;会员&gt;<br />
&lt;姓名&gt;xiaojin&lt;/姓名&gt;<br />
&lt;年龄&gt;20 &lt;/年龄&gt;<br />
&lt;性别&gt;男 &lt;/性别&gt;<br />
&lt;描述&gt;他人品有问题！&lt;/描述&gt; <br />
&lt;/会员&gt;<br />
&lt;/俱乐部&gt;<br />
</p>
<br />
循环构造<br />
<p>&lt;xsl:for-each select="..."&gt;......&lt;/xsl:for-each&gt;</p>
与典型的 for 循环作用相同。<br />
old.xsl<br />
<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;table border="1"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;姓名&lt;/th&gt;<br />
&lt;th&gt;年龄&lt;/th&gt;<br />
&lt;th&gt;性别&lt;/th&gt;<br />
&lt;th&gt;描述&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;xsl:for-each select="俱乐部/会员"&gt;<br />
&lt;tr&gt;<br />
&lt;!--表达式为何不需要包括父节点或从文档根开始。这是因为这些元素的路径是根据 &lt;xsl:for-each&gt; 构造中的 XPath 表达式来计算的--&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="姓名"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="性别"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="描述"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/table&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />
</p>
将old.xsl与happyold.xml放到同一文件夹下，然后在happyold.xml第二行插队入<br />
<p>&lt;?xml-stylesheet type="text/xsl" href="old.xsl"?&gt;</p>
然后在浏览器中预览一下显示结果。<br />
<br />
使用循环构造，还可以根据条件过滤输出。假设只想显示会员中年龄大于30的会员。<br />
old30.xsl<br />
<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;table border="1"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;姓名&lt;/th&gt;<br />
&lt;th&gt;年龄&lt;/th&gt;<br />
&lt;th&gt;性别&lt;/th&gt;<br />
&lt;th&gt;描述&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;xsl:for-each select="俱乐部/会员[年龄&gt;30]"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="姓名"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="性别"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="描述"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/table&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />
</p>
要定义 XML 节点的条件，可以使用下列任何运算符：<br />
<p>等于 (=) <br />
不等于 (!=)<br />
小于 (&lt;)<br />
小于或等于 (&lt;=) <br />
大于 (&gt;) <br />
大于或等于 (&gt;=) <br />
</p>
<br />
使用&lt;xsl:sort / &gt;构造使输出的结果按指定的节点进行排序，&lt;xsl:sort /&gt; 元素必须嵌套在
&lt;xsl:for-each &gt; 元素中，以确保应用程序可以循环通过所有的项目。sort
元素没有相应的结束标签,所以在其结尾加上"/"使其自结束。<br />
old_sort.xsl<br />
<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;table border="1"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;姓名&lt;/th&gt;<br />
&lt;th&gt;年龄&lt;/th&gt;<br />
&lt;th&gt;性别&lt;/th&gt;<br />
&lt;th&gt;描述&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;xsl:for-each select="俱乐部/会员"&gt;<br />
&lt;xsl:sort select="年龄" order="descending"/&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="姓名"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="性别"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="描述"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/table&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />
</p>
去掉order="descending"再看看显示结果。<br />
<br />
条件构造：<br />
<p>&lt;xsl:choose&gt;<br />
&lt;xsl:when test="表达式"&gt;<br />
<br />
&lt;/xsl:when&gt;<br />
&lt;xsl:otherwise&gt;<br />
<br />
&lt;/xsl:otherwise&gt;<br />
&lt;/xsl:choose&gt;<br />
</p>
条件构造中可以有多个when,但只能有一个otherwise,用于处理未包括在初始测试条件中的所有其它情况.<br />
old_choose.xsl<br />
&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;<br />
&lt;xsl:template match="/"&gt;<br />
&lt;table border="1"&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;姓名&lt;/th&gt;<br />
&lt;th&gt;年龄&lt;/th&gt;<br />
&lt;th&gt;性别&lt;/th&gt;<br />
&lt;th&gt;描述&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;xsl:for-each select="俱乐部/会员"&gt;<br />
&lt;xsl:choose&gt;<br />
&lt;xsl:when test="年龄 &gt; 70"&gt;<br />
&lt;tr bgcolor="#66CCFF"&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="姓名"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="性别"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="描述"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:when&gt;<br />
&lt;xsl:when test="年龄=10"&gt;<br />
&lt;tr bgcolor="blue"&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="姓名"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="性别"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="描述"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:when&gt;<br />
&lt;xsl:otherwise&gt;<br />
&lt;tr bgcolor="red"&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="姓名"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="年龄"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="性别"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of select="描述"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:otherwise&gt;<br />
&lt;/xsl:choose&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/table&gt;<br />
&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />
<strong>注：以上有部分代码在firefox浏览器中需要加&lt;html&gt;&lt;/html&gt;否则显示异常</strong><br />
《本文来源于互联网》<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/303001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-11-20 01:38 <a href="http://www.blogjava.net/ashutc/archive/2009/11/20/303001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j.properties</title><link>http://www.blogjava.net/ashutc/archive/2009/10/11/297781.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Sun, 11 Oct 2009 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/10/11/297781.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/297781.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/10/11/297781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/297781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/297781.html</trackback:ping><description><![CDATA[<p>log4j.rootLogger=error, A2,ccfile,DATABASE</p>
<p><br />
log4j.appender.A2=org.apache.log4j.ConsoleAppender<br />
log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.A2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n</p>
<p><br />
#for file<br />
log4j.appender.ccfile.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.ccfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n<br />
log4j.appender.ccfile=org.apache.log4j.RollingFileAppender<br />
log4j.appender.ccfile.File=ccexample.log<br />
log4j.appender.ccfile.MaxFileSize=10000KB</p>
<p><br />
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender<br />
#log4j.appender.DATABASE.BufferSize=10<br />
log4j.appender.DATABASE.URL=jdbc:oracle:thin:@127.0.0.1:1521:orcl2<br />
log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver<br />
log4j.appender.DATABASE.user=qp<br />
log4j.appender.DATABASE.password=qp<br />
log4j.appender.DATABASE.sql=INSERT INTO tbl_log&nbsp; VALUES ('%m')<br />
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout</p>
<p><br />
#log4j.category.cn.javass.crm=error<br />
#log4j.category.cn.javass.wf=debug</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/297781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-10-11 15:35 <a href="http://www.blogjava.net/ashutc/archive/2009/10/11/297781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJO和JavaBean的区别和联系</title><link>http://www.blogjava.net/ashutc/archive/2009/05/20/271720.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 20 May 2009 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/05/20/271720.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/271720.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/05/20/271720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/271720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/271720.html</trackback:ping><description><![CDATA[&nbsp;POJO和JavaBean是我们常见的两个关键字，一般容易混淆，POJO全称是Plain Ordinary Java Object / Plain Old Java Object，中文可以翻译成：普通Java类，具有一部分getter/setter方法的那种类就可以称作POJO，但是JavaBean则比POJO复杂很多，JavaBean是一种组件技术，就好像你做了一个扳子，而这个扳子会在很多地方被拿去用，这个扳子也提供多种功能(你可以拿这个扳子扳、锤、撬等等)，而这个扳子就是一个组件。<br />
很显然POJO也是JavaBean的一种。一般在web应用程序中建立一个数据库的映射对象时，我们只能称它为POJO。
<img src ="http://www.blogjava.net/ashutc/aggbug/271720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-05-20 15:01 <a href="http://www.blogjava.net/ashutc/archive/2009/05/20/271720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Aptana的字体</title><link>http://www.blogjava.net/ashutc/archive/2009/03/12/259319.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 12 Mar 2009 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/03/12/259319.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/259319.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/03/12/259319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/259319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/259319.html</trackback:ping><description><![CDATA[<p>Aptana的字体选择不正确的话，空格的宽度会窄于字符的宽度，也就是说两个空格的宽度看起来和一个字符的宽度差不多，这给代码缩进带来了很大的麻烦。<br />
<br />
解决办法：<br />
Window -&gt; Preferences -&gt; General -&gt; Appearance -&gt; Colors and Fonts -&gt; Basic -&gt; Text Font -&gt; Change<br />
选择 BitStream Vera Sans Mono （其他几个BitStream的字体应该也可以)</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/259319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-03-12 13:33 <a href="http://www.blogjava.net/ashutc/archive/2009/03/12/259319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>