<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>hdwangyi</title>
    <description></description>
    <link>http://hdwangyi.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>在NetBeans6.1中慎装groovy-grails插件</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/189038" style="color:red;">http://hdwangyi.javaeye.com/blog/189038</a>&nbsp;
          发表时间: 2008年05月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近学习Groovy，想在NetBeans中安装Groovy-Grails插件，当时手头使用的是NetBeans6.1RC2，通过更新中心装了Groovy Grails插件之后，IDE显示其他组件不能与之相匹配，只好作罢。<br /><br />等到NetBeans6.1正式版发布后，又试了一次，看到下载时间很长，所以就干别的事去了，没有看安装的进度中的提示。等到装完了后，这一次到是可以用了，不过在使用NetBeans的C++编辑器的时候，按“Ctrl+\”快捷键时，IDE报告异常。<br /><br />想想可能是插件的影响，于是卸载了一个又一个插件，但还是错误依旧。为了查出到底是哪一个插件，于是把NB重装了一遍，别的插件装完了都没有问题，而在装Groovy-Grails插件时，看到下载进度的提示文字的时候，居然发现该插件竟然在又在下载目前已经安装了的插件，感觉这简直是岂有此理！看来就是这个插件影响了NetBeans，因为它下载的插件有可能和已存在的插件相冲突。为了验证这个想法，我让它下载完成，然后重启IDE，这次竟然连IDE也没有办法启动了。看来果然是Groovy-Grails造成的。<br /><br />  因为这个Groovy-Grails插件，使得我不得不又重装了一遍IDE，这次决定暂时不要这个惹麻烦的插件了。想想这里原因，可能有两个：<br /><br />（1）Groovy-Grails插件作者的开发环境是NetBeans的开发版本，所以和发行出来的RC版有冲突。发现这个问题后，插件作者干脆把他们认为最新的其他插件也打了包，让用户一同下载，但这些“新”的插件在NB6.1推出后又有了更新，所以产生了冲突。<br /><br />（2）插件作者设定了正确的插件更新规则，但由于某种机制，检查用户已安装的插件版本出了问题，所以出现了下载不该下载的插件的现象。造成这一原因有可能是我的NetBeans的配置文件存储到了中文目录。<br /><br />不管怎么样，看来Groovy-Grails插件在NetBeans6.1上是暂时用不了了，这里提醒一下各位朋友。也许把NetBeans的配置文件改到非中文的目录下可能会解决问题，但鉴于已经重装两遍IDE，我已经没心思再试了。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/189038#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 03 May 2008 12:29:23 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/189038</link>
        <guid>http://hdwangyi.javaeye.com/blog/189038</guid>
      </item>
      <item>
        <title>心情随想－观《贝武夫》有感</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/163970" style="color:red;">http://hdwangyi.javaeye.com/blog/163970</a>&nbsp;
          发表时间: 2008年02月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　几天前看了《贝武夫》，这个故事源自英国古老的传说：在寒冷的北国，苦难的人们倍受巨人格伦德尔的欺负。贝武夫从遥远的国度赶来，杀死了这个危害众生的巨人。<br /><br />　　不能不说电影拍的很好，从最初的格伦德尔的出现，这个巨人的残忍和凶暴在电影中被塑造得让人心惊胆寒。它只是因为人们的狂欢影响了自己的休息，就闯进宴会厅疯狂的杀戮，有一镜头是它活活把人撕成了两片。从此之后，北海的人们陷入了巨大的恐惧和痛苦中。<br /><br />　　勇者贝武夫应国王的邀请赶到。在欢迎宴会上，高达英俊的贝武夫与年轻的王后一见钟情。影片中，王后弹着竖琴，唱着令人永远难忘的动人歌曲。<br /><br />　　可怕的巨人终于来了，在武士门的高声喧哗欢歌声中，暴虐的格伦德尔再次出现，大厅里火红的篝火一下子熄灭，代而燃起的是可怕的绿色鬼火。在先头武士纷纷倒下时，贝武夫再次点燃了篝火。熊熊火焰的照耀下，贝武夫和狰狞可怕的巨人面面相对，红红的火光映衬出贝武夫坚毅无畏的面容。经过激烈的战斗，贝武夫利用智慧和力量，战胜了格伦德尔，巨人在断掉一条手臂后，仓皇逃回自己的洞穴后死去了。<br /><br />　　很喜欢贝武夫与格伦德尔第一次对峙的场面，那时的贝武夫显示的刚强与勇敢让人肃然起敬。也很喜欢王后唱的那只歌曲，她让我想起了希腊神话中大海中的塞壬女妖魅惑航行中的水手的歌声，也许只有这样的歌声才是真正的接近于神的歌曲吧。这是我看过的最能体现远古神话意境的片子了。我在大学时代很喜欢这些神话和传说，那时候情感没有依托，有的只是对某个喜欢的女生的一些似有若无的期望。每到冬天晨炼时，迎着初起的太阳，感受着大地的严寒，想起大力神赫拉克利斯在远古时代，流浪奔走于旷无人人迹的平原和高山之间，不知他会有什么样的感觉。写写当时自己的感受吧：<br /><br />　　　我听到林中那缥缈的歌声，<br />　　　伴随着落叶在天际回荡。<br />　　　当太阳升起在北方寒冷的大地，<br />　　　那遥远的地平线，<br />　　　可是英雄流浪的远方。<br /><br />　　　明亮的月亮挂在天上，<br />　　　她带来的是欢乐还是忧伤。<br />　　　我看到旷野中无边的寒霜，<br />　　　映衬着金色的月亮，<br />　　　还有树叶上那晶莹的泪光。<br /><br />　　　苍穹中的浮云已穿过多少时光，<br />　　　只有溪水在静静的流淌。<br />　　　在蓝色的碧空中，<br />　　　一切都融入天外的故乡，<br />　　　那里没有眼泪，<br />　　　也没有忧伤，<br />　　　有的只是永恒的等待，<br />　　　和无尽的希望。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/163970#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Feb 2008 17:09:47 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/163970</link>
        <guid>http://hdwangyi.javaeye.com/blog/163970</guid>
      </item>
      <item>
        <title>利用NSIS制作Netbeans、JDK的绿色安装程序</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/160900" style="color:red;">http://hdwangyi.javaeye.com/blog/160900</a>&nbsp;
          发表时间: 2008年02月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　最近在外面做培训时，培训的教师机和学员机的硬盘都做了保护，很多人在安装netbeans、jdk后，一旦关机重启，因为系统盘已被还原，所以Netbeans中设定的热键、打开的工程、数据库的设定等设置信息也被还原了。<br /><br />　　默认情况下，Netbeans的配置文件夹存放在登录用户的主目录中，这时需要修改netbeans的安装目录中的etc/netbeans.conf文件中netbeans_default_userdir项目，让它指向一个没有被系统保护的硬盘分区中的文件夹。由于Netbeans在安装和运行时都没有一个直观的办法修改netbeans.conf中的这个项目，所以导致了很多麻烦，因为菜鸟们总对修改文件感到触头。<br /><br />　　让事情简单化的手段有2个方面：<br />　　1、修改netbeans.conf文件，将其中设定为绝对路径的项目改为相对路径<br /><br />　　2、做一个安装文件，让它安装后，把Netbeans添加到开始菜单项，再做个Netbeans的桌面快捷方式，同时让Netbeans和Java源文件相关联,让javaw.exe文件和JAR相关联。最好还能设置一下Java相关的环境变量。这个工作用NSIS来解决。<br />    <br />　　 首先下载一个zip版的Netbeans,解压后到某个文件夹后，然后把JDK也拷到这个文件夹。现在我的文件夹结构所下所示：<br />　　　　　解压目录(D:\nb6)<br />　　　　　　　　　|<br />　　　　　　　　　|－－－－netbeans<br />　　　　　　　　　　　　　　　|<br />　　　　　　　　　　　　　　　|<br />　　　　　　　　　　　　　　　|-------bin----netbeans.exe<br />　　　　　　　　　　　　　　　|-------etc----netbeans.conf<br />　　　　　　　　　　　　　　　|<br />　　　　　　　　　　　　　　　|（netbeans的其他目录）<br /> 　　　　　　　　　<br />　　　　　　　　　|--------jdk1.6.0_04<br /><br />　　现在，用记事本打开netbeans.conf文件，修改其中的netbeans_default_userdir和netbeans_jdkhome两项的值：<br /><pre name="code" class="java">
netbeans_default_userdir="../nbsettings/6.0"
netbeans_jdkhome="../jdk1.6.0_04"
</pre><br />　　这样之后，只要拷贝nb6这个文件夹，到哪里Netbeans都会找到同一文件夹下的jdk1.6.0_04，也不会丢失配置信息了。<br /><br />　　现在，准备完成第2步，即把d:\nb6中的jdk和netbeans打包在一起，做成一个安装文件。NSIS是一个开源、基于脚本的安装程序生成器。它支持多国语言，Windows上很多知名的软件的安装程序都是用它做的，比如电骡、Winamp等等。它用一种特殊的脚本语语言控制安装的界面和流程，在逻辑控制上很有趣，和汇编语言有那么一点儿相象，打包之后的文件压缩率还是很高的。下面开始进行软件环境的安装：<br /><br />　　首先，从nsis的官方网站：<a href="http://http://nsis.sourceforge.net" target="_blank">http://http://nsis.sourceforge.net</a>下载一个NSIS的安装文件，然后再在<a href="http://hmne.sourceforge.net/" target="_blank">http://hmne.sourceforge.net/</a>下载一个可编辑、编译NSIS安装脚本的编辑器HM NIS Editor，基本的安装程序就装好了。<br /><br />　　启动HM NIS Editor，它的"文件->新建脚本：向导"菜单提供了一个很好用的向导，可以帮你生成基本的脚本框架代码，结合NSIS的帮助文件和官方网站的提供的各种样例，我们可以很快地掌握安装脚本的编写。下面是我编写的打包D:\NB6目录中的JDK和Netbeans的脚本文件，它生成的安装文件提供了3种安装方式：<br />　　（1）完全安装，包括JDK、Netbeans<br />　　（2）最小安装，只包括Netbeans<br />　　（3）定制安装，可以自己选择安装项目，但Netbeans还是必选的。<br /><br />　　除去安装的功能之外，该安装程序还把.java文件和netbeans关联；如果用户安装时选择了JDK，则将.jar文件和javaw.exe关联，同时在系统中加入JAVA_HOME环境变量，并在PATH环境变量中加入JDK中的bin目录。<br /><br />　　由于文件比较长，这里就不直接贴出源代码了，请参看帖子中的附件，该附件解压后包含三个文件，这里做一下简要介绍：<br />　　（1）JDevIns.nsi，这是主安装脚本，它要包含（2）、（3）两个脚本，注意，（2）、（3）脚本要拷贝到NSIS安装目录中的Include子目录中，否则JDevIns.nsi将通不过编译。<br />　　（2）AddPath.nsh，它负责在PATH环境变量中加入需要的路径，请将其拷贝到NSIS(注意，不是HM NIS Editor)的Include子目录<br />　　（3）WriteEnvStr.nsh，它负责生成指定名称的环境变量，同样，也要把它拷贝到NSIS的Include子目录中<br />    <br />　　在HM NIS Editor中，完成上述设定后，打开JDevINs.nsi，按Ctrl+F9键，就可编译生成安装文件。<br /><br />　　利用这个安装程序安装Netbeans和JDK后，把安装目录中的文件拷走到任何计算机中，Netbeans都可以直接运行；但严格来讲，这个安装程序还不能说是“绿色”的，因为它修改了系统的注册表和环境变量，不过，在卸载的时候，它会把这些修改再改回来的。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/160900#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Feb 2008 09:27:48 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/160900</link>
        <guid>http://hdwangyi.javaeye.com/blog/160900</guid>
      </item>
      <item>
        <title>给有C基础的Java初学者的Netbeans使用介绍</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/159039" style="color:red;">http://hdwangyi.javaeye.com/blog/159039</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Netbeans按照Project组织代码，每个可执行的Java程序都是一个Project。所以，利用Netbeans开始工作的第一步就是在Netbeans中新建一个Project,这可以利用Netbeans中的菜单： File->New Project...，选择了这个菜单后，Netbeans会提示一个对话框，要求选择Project的类型，因为这里只介绍Java的Application，所以在该对话框的左侧选"Java"，右侧选"Java Application"，然后按照Netbeans的提示，输入Project的名称后，按照默认的提示，一路next下去，就可以看到Netbeans新建了一个Project, 并在这个Project中生成了一个名为Main.java的文件，这个就是Java的源文件了，你可以在这个文件编写一些基础的Java代码。<br /><br />   一个Project中可以有多个文件，每一个文件中都可以编写Java源代码，Java的源代码文件的扩展名必须是.java，Java程序就是由一个个的Java源文件构成的。<br /><br />   如果要执行所写的代码，在Netbeans中有两种方法：<br />  （1）打开你写的源文件，如果源文件满足可执行的条件，可以点击鼠标的右键，在弹出的菜单里选择"Run File"，也可以按快捷键"Shift+F6"<br /><br />  （2）按照Project的设定运行代码，此时只要用选择Netbeans菜单中的Run->Run Main Project，注意，如果在Netbeans中建立了多个Project，此时运行的是Main Project，有关Main Project的介绍请参见下文。<br /><br />   下面介绍Netbeans对Java程序的组织方法和一些Java语言的基础知识。<br /><br />   Java以"类（class）"为单位组织程序，每个Java源文件中可以有一个或多个类的定义，但习惯上，往往一个Java源文件中只存放一个类的定义。类（class）是编写Java程序的基本单位。<br /><br />    我们都知道，程序是由代码构成的，而代码在目前的大多数编程语言中，都是写在函数里面的，这就是C语言组织程序的方式；Java在三种基本代码（即顺序、选择、循环）的语法上和C语言基本上是一样的，它的代码也要写在函数里，但Java进一步要求，函数必须写在类当中，数据，也就变量、常量等等的定义，也必须要写在类当中。而类则要写在扩展名为.java的源文件中。<br /><br />     一个程序往往由多个源文件组成，NetBeans利用Project来管理它们，每个Project代表着一种Java程序的类型，比如可以是一个网站、一个企业级的应用程序。Netbeans提供多种Project供编程者选择。我们学习的是Java应用程序，所以前面选择Project的类型是Java Application。<br /><br />    在Netbeans中创建Project的方法就是通过File->New 菜单，这个菜单可以反复使用，以便编程者创建多种Java应用程序。这样，Netbeans中就可能有多个Project，但这些Project中只有一个Project是活动的，即当你利用Netbeans的菜单完成编译、运行等工作时，这些工作只能作用于一个Project上，该Project被称为Main Project。当你用File->New菜单创建一个Project时，这个Project就会自动变为Main Project，它的工程的名字在显示时会是一种黑体颜色。<br /><br />    利用File->New菜单创建Project时，每创建一个Project，就会导致Main Project改变为当前新创建的Project。如果想让某个非Main Project成为Main Project，可以用右键点击这个Project，然后在弹出的菜单中选择"Set As Main Project"。这一点对于初学者相当重要，因为，在想运行Project时，如果该Project不是Main Project，则运行的结果则是另一个Main Project中程序运行的结果，而不是当前的Project的结果。<br /><br />   下面的这个图显示了上述的内容：<br /><br />      Project1（Main Project）<br />       |<br />       |-----------------------Class1.java(类Class1所在的源文件)<br />       |　　　　　　　　　　　　　|<br />       |　　　　　　　　　　　　　|<br />       |　　　　　　　　　　　　　|-----------Class1（类Class1的定义）<br />       |　　　　　　　　　　　　　　　　　　　|<br />       |　　　　　　　　　　　　　　　　　　　|----------Class1中的变量、常量定义<br />       |　　　　　　　　　　　　　　　　　　　|<br />       |　　　　　　　　　　　　　　　　　　　|-----------Class1中的函数定义<br />       |<br />       |-----------------------Class2.java<br />       |<br />       |-----------------------其他类定义所在的源文件<br />       |<br />       Project2（非Main Project，该Project的颜色不是黑体字的颜色）<br />       |<br />       |<br />       |<br />       ProjectN<br /><br />  再介绍一些Java的语义方法的知识：<br /><br />  Java用关键字class定义类，格式如下：<br />  class 类名{<br />  }<br />  类的前面可以用public关键字修饰，也可以没有任何修饰。如果一个类前面用了public修饰，按照Java的要求，该类所在的源文件名必须要和此类的类名一样，举个例子：<br />  类Class1的定义：<br />  public class Class1{<br /><br />        int a;//这是类中的变量定义<br /><br />        void printA(){<br />          //这里是函数中的代码<br />        }<br />  }<br /><br />这时，由于类Class1的定义前有一个public关键字的修饰，所以Class1的定义代码必须要存放在一个名为Class1.java的源文件里，否则会导致编译错误。<br /><br />     为了避免这个类名和文件名之间的关联问题，利用Netbeans编写Java程序时，要加入一个新的类，可以使用工具栏中最左边的一个按钮，点击之后，在弹出的对话框中选择Java Class，这个向导会自动生成一个你所指定的类的源文件和大体上的代码，可以在生成代码的基础上进一步学习类的编写。<br /><br />   为什么Java要求函数一定要写在类当中呢？这就是Java的所谓面向对象的特性了。程序设计的最终目的是将原来由人所做的繁杂的事情交给计算机去完成，而编程语言就是完成这件工作的工具。人类在做事情时，事情完成的主体是某个人，这个人在做事情时会结合自己掌握的资料，来思考如何根据这些资料来做这个事情；也就是说，人在做事情的时候是将数据和处理数据的方法放在一起来考虑的。实际上，面向对象的编程就是模拟了这个特点，它用类来抽象一个需要完成的任务：完成这个任务的资料，在Java语言中就是类中定义的变量和常量；而做事情的步骤，在Java语言中就是那些写在函数中的代码。事实证明，以类为主体设计代码，可以更有效地表达编程中涉及到的任务。<br /><br />   我们可以将这种方式和C语言对比一下，在C中，写程序的基本单位是函数，而函数处理的数据并没有和函数明确的放在一起。要传递这些数据，要么通过全局变量，要么通过函数的参数，这使得在处理数据增多的情况下，函数的编写变得非常复杂。而Java语言则以类为写程序的基本单位，通过合理分配每个类中的定义的数据和函数，在处理大量数据的时候，程序可以对这些数据按照类进行分组，再按照这些分组后的数据设计与之相关的函数，从而有效地解决了C中需要大量传递参数的问题。<br /><br />    其实，设计类只是在面向对象编程中的第一步，类的设计相当于完成了一个做事情的图纸。为了能够根据这些图纸真正做完成任务，就必须执行图纸中描述的任务。这在Java语言中就是调用这些类中定义的数据和函数，如何去调用这些类中的数据和函数呢？也就是说，如何使用定义好的这些类呢？<br /><br />  首先，需要明确的是，Java中的数据分为两种类型：<br />  1、基础数据类型，也被称为值类型，即类似于C中的那些基础数据类型，如整型、浮点型等等<br /> 2、复合数据类型，也被称为引用数据类型，这种数据类型就是程序员在源文件中定义的类。其实，类和C中的结构体数据类型有些相象，和结构体不同的是，它既具有内部的成员的定义，也具有函数的定义。<br /><br />   Java程序中，编程的实质就是利用复合数据类型，封装对于基础数据的处理。类设计好了之后，就相当于有了一种新的数据类型。这种新的数据类型如果要使用的话，就要利用这种数据类型去声明一个变量，然后通过该变量来使用类中定义的数据，或调用类中定义的函数。这就是在Java语言中使用类的方式。<br /><br />  用类声明一个变量在形式上和定义一个普通变量差不多，如：<br /><br />Class1 c1;<br /><br /> 这个形式和C语言中定义结构体类型的变量是很相象的，但和C语言不同的是，结构体类型的变量在声明后，其中包含的数据会自动分配内存，而Java的类这种类型的变量必须要明确的分配给它内存，否则，它将无法使用。分配的语法如下：<br />c1=new Class1();<br />也可以把这两句合并在一起：<br />Class1 c1=new Class1();<br /><br />  定义了类型为Class1，名为c1的变量之后，如何去调用Class1中定义的变量和函数呢？<br />对于类中定义的变量，可以用这种方式对其进行引用：<br />  c1.变量名<br /><br />可以看到，Java中引用类中定义的变量的方式和C中引用结构体成员的方式也是一致的。<br /><br /> 对于类中定义的函数，可以用这种方式进行调用：<br />  c1.函数名(实际参数列表);<br /><br />在明确了类的使用方式之后，那么上述对类中的变量和函数进行调用的语句从那里开始执行呢？<br /><br />这里需要一个程序执行的开始点。Java和C一样，都有一个名为main的函数，但Java对这个函数有一系列的要求，即这个函数必须要按照如下方式定义：<br />     public static void main(String args[]){<br />          //编写执行代码<br />    }<br />在这个函数中，将上述调用类中的数据和函数的代码写在这里就会得到执行了。<br /> <br />综上所述，Java的程序设计的步骤可按以下三步来做：<br /><br />1、考虑要解决的问题，看看它可以分成几个部分来解决，每个部分都需要哪些数据和处理这些数据的函数<br /><br /> 2、按照步骤1中的所列的部分，设计类，在类中定义需要处理的数据和函数<br /><br />3、考虑这些设计好的类如何调用，将调用的代码写在如下的一个函数里：<br />     public static void main(String args[]){<br />          //编写执行代码<br />    }<br />   由于Java要求所有的函数都要放到类中定义，所以，这个main函数也要放在一个类中进行定义，习惯上，会把main函数放到一个单独的文件中，在该文件中定义其所在的类，该类被称为Java程序的主类（Netbeans在生成Project时，默认情况下就会生成这个主类的代码，同时会给它起一个叫做"Main"的名称）。<br /><br />  在Java中，由于变量或常量都要定义在类中，所以这种定义在类中的变量或常量被称为"字段"，也有的书上叫它们为"属性"，还有的书上叫它们"数据成员"；而函数也要定义在类当中，一般术语上称之为"方法"。<br /><br />   一个Java程序中，理论上讲，应该只有一个类中有main方法（函数），但有时，为了编程方便，可能会有不止一个类包含有main方法。凡是包含有main方法的类都是可以运行的，在Netbeans中，在这种文件中点击右键，就可直接运行它，这就是在开头提到的第一种运行Java程序的方式。上面说的第二种方式，即通过选择Run->Run Main Project运行Java程序，这种方式要求Main Project必须指定到底是要运行哪个类中的main方法。在默认情况下，创建Project时，生成的Main.java中的Main类中的main方法就是在选择Run->Run Main Project是运行的方法。如果你想更改这个设定，可以在工程名称上面点击鼠标右键，在弹出的菜单中选择"Properties"，在弹出的对话框的左侧选择"Run"结点，然后在右侧的"Main Class:"编辑框中输入包含main方法的类名，或点击编辑框右侧"Browse"按钮，让Netbeans帮你指定要运行的主类。<br /><br />  希望通过这个概要的介绍，对Java语言和Netbeans的使用有一个初步的了解。附上一个我做培训时用的Netbeans使用介绍的ppt文件。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/159039#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 13:04:33 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/159039</link>
        <guid>http://hdwangyi.javaeye.com/blog/159039</guid>
      </item>
      <item>
        <title>Ubuntu7.10中Netbeans的中文问题彻底解决</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/144905" style="color:red;">http://hdwangyi.javaeye.com/blog/144905</a>&nbsp;
          发表时间: 2007年11月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前面写了一篇关于·<a href="http://hdwangyi.javaeye.com/blog/134593" target="_blank">Ubuntu中使用Netbeans</a>的文章，其中有一个问题没有解决，即Netbeans的控制台输出中文时还是显示为一个一个的方框。由于我主要开发的工作是Web项目，所以这个影响不是很大。由于项目时间紧，直到最近轻松下来，花了一段时间，终于解决了这个问题。<br /><br />    我的系统是Ubuntu7.10，JDK1.6.0_3，Netbeans是6.0RC2，这个问题的解决方案其实和Netbeans无关，主要是解决JDK读取字体方面的问题，所以，它也同样适用于所有的Swing界面的Java应用程序，具体的解决方法按照如下3步即可：<br /><br />    （1）将JDK安装目录中，进入jre/lib目录，将fontconfig.RedHat.3.properties.src拷贝成fontconfig.properties<br />     (2)在usr/share/fonts目录中，建立一个名为zh_CN的目录，再在这个目录中建立一个名为TrueType的目录。<br />     (3)将某种你喜欢的支持中文的truetype字体文件（扩展名为.ttf）拷贝到上述的TrueType目录，并改名为zysong.ttf。我用的是从网上下载的微软雅黑字体，在google上用"微软雅黑字体下载"搜索一下，可以找到很多下载的站点，这种字体即可用于Windows系统，也可以用在Ubuntu中。<br /><br />     上述设置完成后，只要启动Netbeans，不再需要设定任何选项，netbeans都可以正常地在编辑器和控制台中显示中文字体了。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/144905#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 Nov 2007 18:00:33 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/144905</link>
        <guid>http://hdwangyi.javaeye.com/blog/144905</guid>
      </item>
      <item>
        <title>使用Struts1.x中的多模块功能时的注意事项</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/136386" style="color:red;">http://hdwangyi.javaeye.com/blog/136386</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Struts1.x是目前在项目中应用的较为广泛的框架，它的多模块功能在团队开发时很有用，但在很多书上讲的并不多，Struts自身的文档也说的比较简单，用起来好像比较简单，但有时候经常会造成一些问题，对初次接触多模块的人，这些问题会造成一些不必要的困惑。现将采用Struts的多模块时应注意的事项总结一下，在此和大家共享：<br /><br />（1）在web.xml文件中添加模块的配置文件时，一定要保留默认的配置文件，即web.xml文件中至少保持两个 &lt;init-param>标记，一个用于定义默认的struts-config.xml，一个用于定义你需要的模块配置文件。如果只定义了模块使用的配置文件，而删除了默认的配置文件，struts将不能正常的工作。<br /><br />（2）在模块的配置文件中定义action、formbean的方法和不采用模块时的配置方法是一样的；但在定义forward时，一定不要忘了设置contextRelative="true"，否则在跳转时struts会在forward要转向的网页前面加上模块的前缀作为在WEB程序中的查找路径，这样就会在转发时出现找不到JSP页面的错误。<br /><br />（3）模块中的JSP页面如果使用了&lt;html:form>标记来获得formbean中的数据，一定要注意，这种JSP页面不能直接作为直接的链接让用户点击，而是应该在该模块的action中，使用非重定向forward转入，否则该页面中的&lt;html:form>会导致错误。另外，&lt;html:form>标记的action属性要直接设置为该模块中对应的action的path属性，不需要加上模块的前缀。鉴于这些原因，一般都会把模块中的JSP页面放入/WEB-INF目录中的某个文件夹，比如/WEB-INF/jsps目录，由于/WEB-INF目录不能直接被用户访问，这样，就会阻止用户无意中访问了对应的JSP文件而造成的错误。<br /><br />从以上的总结可以看出，利用struts多模块编程时，比较好的策略是，将所有struts管理的页面都放入/WEB-INF文件夹的某个目录中，最好在这个目录下为每一个模块建立一个见名知义的文件夹，然后将这些JSP页面按照其所属的模块，放入这些文件夹，而访问这些JSP页面都要通过对应模块中的action进行转发，这实际上也是MVC所要求的一种设计和运行模式。另外，不要由一个模块的action直接转发到另一个模块的action负责管理的页面，这样即破坏了MVC的分工原则，又会带来多模块中页面的路径和formbean的问题。如果需要模块之间的页面转移，可以利用重定向forward直接转发到另一个模块的action，再由这个action决定将用户转发到本模块中的具体的JSP页面。这样即保持了MVC的分工原则，又保护了多模块中使用formbean的JSP页面。最后，建议在多模块中，最好采用DispatchAction，这样action的代码比较清晰明确，易于维护。<br /><br />附件是一个样本war文件，其中包含了源代码，用到了LazyFormBean.
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/136386#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 15:56:05 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/136386</link>
        <guid>http://hdwangyi.javaeye.com/blog/136386</guid>
      </item>
      <item>
        <title>民工之乐</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/135606" style="color:red;">http://hdwangyi.javaeye.com/blog/135606</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　几天前，路过一个建筑工地，看见一群民工兄弟正在路边露天看录像。虽然放录像的电视机很小，好像只有12寸的屏幕，但看的人却兴高采烈，不时发出一阵阵笑声。。。<br /><br />　　我记得小的时候我也在露天的大院里看过电视，大家也是其乐融融，那种感觉似乎已经消失了很久，但看到现在的这帮快乐的兄弟们，儿时的回忆似乎又回到了眼前。真是久违了，何时我也能够再回到这种快乐的集体里？<br /><br />　　现在的我已经离开了农村里那块朴实的土地，脚下已不是村庄里那松软的土壤，而是城市中坚实的柏油路。我也早就离开了儿时那有着几十个孩子的热闹的大院，同时也离开了能够不时响起年轻人欢声笑语的宿舍楼，住进了只有二人世界的楼房里。但离开了那些快乐的同伴之后，我的心里还会有快乐吗？至少我现在就很羡慕这些民工兄弟，因为他们处在一个快乐的集体里，虽然工作很苦很累，但他们却很快活。<br /><br />　　我喜欢热闹的集体，向往无忧无虑的生活，不过，对于住在热闹的城市里的孤独的人来说，这些似乎只是一个奢望而已。现在的生活让我要去养家，要还银行的贷款，要完成领导的任务，要不断的提升自己。。。<br /><br />　　知足者长乐，但偏偏很多人都不是那么容易知足的，尤其是现在京城里的人。愿天下所有的人都能长乐！
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/135606#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 04:04:33 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/135606</link>
        <guid>http://hdwangyi.javaeye.com/blog/135606</guid>
      </item>
      <item>
        <title>VMWare下的Ubuntu7.10安装试用手记</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/134593" style="color:red;">http://hdwangyi.javaeye.com/blog/134593</a>&nbsp;
          发表时间: 2007年10月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近看到了大家都在讨论Ubuntu7.10的发布，原来一直在用Redhat，总是感觉对中文支持的不是太好，听说Ubuntu在中文方面比较好，所以就下了一份光盘的ISO映像，准备在本本上装一份试试。<br /><br />     我的本子是在06年初买的HP的nx6120，内存加到了1G，平时做Java开发感觉不错。但HP在笔记本方面对Linux支持的不是很好，原打算主要以Linux为开发平台，但HP的网站上根本就没有相关的驱动。担心硬件得不到支持，所以就用了VMWare进行了虚拟。<br /><br />     在Java开发方面，我一直在用Netbeans，不过在VMWare中安装的Redhat Enterprise Server 4上，使用JDK6和Netbeans6一直有问题，动不动就导致整个IDE死掉，用JDK5和NB5.5到是不错。这次决定试试Ubuntu7.10。<br /><br />      我用的VMWare是5.5，主要是因为它的块头比较小，也对Ubuntu有直接的支持。在VMWare中采用默认的设定新建了一个虚拟机（这让我在后面的安装吃了不少苦头），建好虚拟机后，利用XP中的Daemon Tools把Ubuntu的光盘映像虚拟了一个光驱，然后就开始了安装。<br /><br />      Ubuntu的安装界面是一个图形界面，一开始觉得非常有特色。接下来就是一套傻瓜化的安装过程，一直也很顺利。但一到82%时，就出了事情：安装程序一直停着不动，提示在扫描镜像站点。实在没想到Ubuntu竟然在安装时还要去网络下载其余的文件，而VMWare中利用默认设定建立的虚拟机是不能直接联通到网络的。这一点上感觉Ubuntu做得很不好。如果你在安装过程需要访问网络，至少也该在安装中提示一下用户做好网络方面的设置，否则的话还不是白白地浪费时间！我一直等了将近20分钟，看到安装程序一直没有反应，以为是这个Ubuntu版本和VMWare不是太兼容，所以就把安装信息进度窗口关掉了，没想到一关掉，安装进度又开始了！<br /><br />    接下去一帆风顺，重启虚拟机，然后登录，由于安装选择了中文界面，所以进去也是中文，但随后发现SCIM中根本就没有中文输入法，想想可能是安装时取消了进度窗口的原因。Google了一下，说是要利用sudo apt-get指令再安装SCIM，但试了一下，系统提示SCIM已经安装。一时也没有别的办法，就想先看看当前这个系统好不好用。<br /><br />       比较让我恼火的是，Ubuntu在VMWare中默认的分辨率太高，根本就无法正常查看窗口中的内容。所以就想改掉屏幕分辨率。但在上方的“首选项”->“屏幕分辨率”菜单中，改了几次都不见有效。感觉有些恼火了。后来想想可能是没装VMWare Tools的原因。于是安装VMware Tools，但安装过程中发现出错，一怒之下重启，发现分辨率居然生效了。于是开始安装JDK，NB6，试运行，没有象Redhat那样死掉，还挺好，觉得Ubuntu还是值得一用的。接下来，把原来的一个准备升级的项目CVS下来，打开一看，所有的中文都是方块，没办法，不支持中文啊。于是，下狠心，重装Ubuntu!<br /><br />    这次有了上次的教训，把虚拟机的网络设定改为NAT，让当前的客户操作系统使用主操作系统的网卡，然后安装，一路绿灯！安装完毕，中文终于可以通过SCIM输入了!<br />  <br />   再安装VMWare Tools，依旧出错，看来，目前这个Ubuntu7.10，VMWare5.5支持的还不是太好，但没有什么大碍，只是在切换系统时多按了“CTRL+ALT”两键而已，这是可以接受的。<br /><br />     于是再次安装JDK6，NB6，打开中文文件，还是一个一个的方块！试着输入中文，对不起，根本就没有机会让你输进去！<br /><br />     静下心，想想在Redhat中的经验，就又安装了一个JDK5，更改NB6，让他跑在JDK5中，效果依旧！Google一下，发现众多劳苦大众都在抱怨Swing和SCIM之间的关系。很多人都说，还是原来的小企鹅-fcitx比较好，不会造成太多问题。<br /><br />        于是，先是利用sudo apt-get install fcitx，安装了小企鹅，同时利用Kill命令，停止SCIM，果真能够在NB中输入中文了，虽然还是方块，但确实可以输入了！于是决定彻底删除SCIM，使用小企鹅。利用sudo apt-get remove SCIM，将其删除，重启系统后，fcitx已经是默认的中文输入了，用着还是挺顺手的，现在这篇文章就是用小企鹅的五笔打的。<br /><br />     现在准备解决Netbeans的中文字体显示问题。其实，只要在NB的字体选项中，选择一个支持中文的字体就可以了，我选的是文鼎宋PL细上海宋Uni字体，看起来虽然不是太好看，但至少中文可以正常显示了，不过在Netbeans的输出窗口中，如果程序输出中文，还是乱码，不过我的项目是基于Web，用不着在控制台输出，所以就算凑合了。看了论坛老大的帖子，可以通过修改JDk中的字体文件彻底解决中文显示，但需要做得的工作不少，在目前时间内，暂时还是不去研究了。也希望坛子里的高手能够指点一下。<br /><br />    目前，一直在用这个Ubuntu7.10，感觉中文支持还是不错的，火狐的字体看起来已经比较舒服了。不过说实话，和Turbo Linux的中文相比，还是有些差距的，但比Redhat要好不少。<br /><br />     总结一下，Java开发者在利用VMWare安装Ubuntu看来需要注意以下几点：<br /><br />   （1）安装过程最好确保网络通畅，以避免安装后不能使用中文的缺点。希望后续的Ubuntu能够在这方面改进一下，毕竟在安装系统时大部分电脑是不能联通网络的，Ubuntu联网看起来是为了简化操作，实际有些 弄巧成拙的感觉。<br /><br />     (2)在Ubuntu中，SCIM和Swing之间存在严重的冲突，所以最好安装后卸载SCIM，改用fcitx。<br /><br />    （3）对于Swing程序，按照目前的安装，几乎所有的利用GUI输出中文的程序都会是方块，这是一个很严重的问题，而解决的方案比较复杂，所以想转到Ubuntu7.10下时，需要三思而后行。希望高手能够多贴一些方案。<br /><br />     (4)对于Netbeans而言，目前在Ubuntu7.10中，需要注意编辑器默认字体的设定，要选择能显示中文的字体，作为默认的编辑器字体，而默认的Mono字体是不能显示中文的。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/134593#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Oct 2007 22:26:00 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/134593</link>
        <guid>http://hdwangyi.javaeye.com/blog/134593</guid>
      </item>
      <item>
        <title>不要在高校的食堂蹭饭</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/124559" style="color:red;">http://hdwangyi.javaeye.com/blog/124559</a>&nbsp;
          发表时间: 2007年09月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看到报纸、网络在不停的报道高校里的“蹭饭一族”，上班族的白领和学生一起在学校的食堂抢饭吃，享受学校食堂的“优惠”，弄得学生吃不上饭。报道提醒这些白领，请爱护我们的学子，不要让他们吃不饱、吃不上饭。<br /><br />   看到这些报道，想想当年，不仅颇多感慨。我上学的那会儿，学校食堂的饭菜被称为“饲养员”做出的“饲料”，而且，我可以负责的说，这种状况目前在大多数高校中并没有得到太大的改善。以前，很多学生在毕业时，都庆幸终于不用每天在去吃食堂饭了！如今，这样的饭菜，却被公司的白领青睐，还会被说成是占了学校的“便宜”，真不知这是对我们现在学子们的爱护，还是我们当前社会的一种无奈的悲哀。<br /><br />  现在的都市生活成本越来越高，大多数年轻的上班族都要精心的计算自己一个月的花销，房子不论是租的，还是按揭贷款买的，价格都在不断的攀升，大米、白面、蔬菜也是节节在涨，唯有不变的往往是自己的薪水。正因为这样，才有了“白领办公室省钱秘籍”，才有了“高校里蹭饭一族”，他们首先要为生计而奔忙。不知道做出这些报道的记者们，当你们想着如何爆料才能吸引眼球的时候，有没有想过那些要在清晨挤公交、挤城铁的上班族的辛苦和焦急？有没有想过那些每一天都需要仔细计算花销，稍不小心就会为吃饭犯愁的年轻人的愁苦？<br /><br />   希望每一个人都应得到应有的尊重，不要指责那些为了谋求生存而做出无奈选择的人们。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/124559#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 16 Sep 2007 18:58:06 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/124559</link>
        <guid>http://hdwangyi.javaeye.com/blog/124559</guid>
      </item>
      <item>
        <title>有感于海淀图书城的兴衰</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/109892" style="color:red;">http://hdwangyi.javaeye.com/blog/109892</a>&nbsp;
          发表时间: 2007年08月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　最近放假，一直在家里写文章，因为想研究关于Java的类加载器方面的问题，在网上查到的资料不是很详细，所以决定去海淀图书城查一查关于《深入Java虚拟机》这一本书。<br /><br />　　到了图书城之后，进了昊海楼的电子工业出版社。我已经有大约１年的时间不上这里来了，望着昊海楼外面步行街上疏疏落落的人群，感觉熟悉却又陌生。我对昊海楼有着很深的感情，到这里总是能够给我带来过去岁月的记忆。<br /><br />　　那时是９０年代末期，我正准备考研，经常跑到这里和籍海楼的考试书店，看看最新的考研的大纲有没有下来，盘算着是不是要买王长喜的英语考试指南，当时这本书可是考研的宝典啊，就是当时口袋里的银子不多，老得算计着花，最后咬咬牙还是买下了。那时还在附近的人大报了个考研政治辅导班，里面有个老师叫岳华亭，讲马克思哲学特别好，我也很欣赏他的外型，觉得他的模样和讲课的动作有些象希特勒<img src="/images/smiles/icon_biggrin.gif"/>，他留着希特勒式的中分头，讲到激动时，头发就会贴在前额上，口水四射，很有激情的那种<img src="/images/smiles/icon_razz.gif"/><br /><br />　　那时的昊海楼的名字还没起好，向社会有奖征集这栋楼的名字。我的一位同学得了一等奖，他起的名字是“宬（音cheng）海楼”，“宬”是书的宝藏的意思，我觉得这个名字即文雅又有深度，给人一种谦虚又胸怀万卷的含蓄之美，而现在这个“昊海楼”的名字有那么点俗气，所以，我总会不自觉在心里是叫她宬海楼。<br /><br />　　当时除去图书城的这两栋楼之外，昊海楼对面的新华书店和外文书店也是我经常光顾的地方，那时这里几乎每天都是人山人海的，而步行街上则是各种店铺俱全，还可以随时欣赏全国最流行的歌曲，这个星期是《潇洒走一回》，再过一个星期就是《九妹》，再就是孟庭苇的仿佛来自于天际的金属般声音《羞答答的玫瑰静悄悄的开》，和同学走在这里，听着歌，看着书，再时不时拿上一串街边的糖葫芦啃啃，现在想想真是幸福的日子啊！<br />　　<br />　　当时的胜象似乎和我的青春一样一去不回了，挥别了大学和研究生的那些日子，同学各奔东西，而最近几年到这里，发现这里的人却也逐渐少了，按道理来说，这里紧挨着北大、人大，附近还有清华、理工、交大、地质、语言学学院、北科大、矿大、中科院，而２０００后大学扩招，研究生也扩招，需要看书、买书的人应该越来越多，怎么反而会变少了呢？我想可能有以下几个原因吧：<br /><br />　　第一，新的书店建立分散了人流，在图书城的西边现在又有了一个中关村图书大厦；<br /><br />　　第二，图书城周边环境的变化，城市的改建让人们有了更好的读书场所，西单图书大厦的周边环境就比这里要好的多；<br /><br />　　第三，也是最为重要的一点，就是网络的兴起。现在互联网已经成为人们查找信息的最为便捷的渠道，如今的大学生在网上泡的时间要远远大于在图书馆和书店的时间，他们认为网络是最方便，也是最省事的找资料的方法。<br /><br />　　但我总觉得，逛书店，闻闻书中的油墨味儿，是一种难得的享受。。。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/109892#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Aug 2007 01:20:16 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/109892</link>
        <guid>http://hdwangyi.javaeye.com/blog/109892</guid>
      </item>
      <item>
        <title>判定文件编码或文本流编码的方法</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/108540" style="color:red;">http://hdwangyi.javaeye.com/blog/108540</a>&nbsp;
          发表时间: 2007年08月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在程序中，文本文件经常用来存储标准的ASCII码文本，比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符，如基于GBK的简体中文，基于GIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式；而在读取这些文本文件时，有时候就需要自动判定文件的编码格式。<br /><br />  按照给定的字符集存储文本文件时，在文件的最开头的三个字节中就有可能存储着编码信息，所以，基本的原理就是只要读出文件前三个字节，判定这些字节的值，就可以得知其编码的格式。其实，如果项目运行的平台就是中文操作系统，如果这些文本文件在项目内产生，即开发人员可以控制文本的编码格式，只要判定两种常见的编码就可以了：GBK和UTF-8。由于中文Windows默认的编码是GBK，所以一般只要判定UTF-8编码格式。<br /><br />  对于UTF-8编码格式的文本文件，其前3个字节的值就是-17、-69、-65，所以，判定是否是UTF-8编码格式的代码片段如下：<br />  <pre name="code" class="java">
    java.io.File f=new java.io.File("待判定的文本文件名");
    try{
      java.io.InputStream ios=new java.io.FileInputStream(f);
      byte[] b=new byte[3];
      ios.read(b);
      ios.close();
      if(b[0]==-17&&b[1]==-69&&b[2]==-65)
         System.out.println(f.getName()+"编码为UTF-8");
      else System.out.println(f.getName()+"可能是GBK");
    }catch(Exception e){
       e.printStackTrace();
    }
  </pre><br />上述代码只是简单判定了是否是UTF-8格式编码的文本文件，如果项目对要判定的文本文件编码不可控（比如用户上传的一些HTML、XML等文本），可以采用一个现成的开源项目：cpdetector，它所在的网址是：<a href="http://cpdetector.sourceforge.net/" target="_blank">http://cpdetector.sourceforge.net/</a>。它的类库很小，只有500K左右，利用该类库判定文本文件的代码如下：<br /><pre name="code" class="java">
  /*------------------------------------------------------------------------
    detector是探测器，它把探测任务交给具体的探测实现类的实例完成。
    cpDetector内置了一些常用的探测实现类，这些探测实现类的实例可以通过add方法
    加进来，如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。  
    detector按照“谁最先返回非空的探测结果，就以该结果为准”的原则返回探测到的
    字符集编码。
  --------------------------------------------------------------------------*/
  cpdetector.io.CodepageDetectorProxy detector =
  cpdetector.io.CodepageDetectorProxy.getInstance();
  /*-------------------------------------------------------------------------
    ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
    指示是否显示探测过程的详细信息，为false不显示。
  ---------------------------------------------------------------------------*/
  detector.add(new cpdetector.io.ParsingDetector(false)); 
  /*--------------------------------------------------------------------------
    JChardetFacade封装了由Mozilla组织提供的JChardet，它可以完成大多数文件的编码
    测定。所以，一般有了这个探测器就可满足大多数项目的要求，如果你还不放心，可以
    再多加几个探测器，比如下面的ASCIIDetector、UnicodeDetector等。
   ---------------------------------------------------------------------------*/ 
  detector.add(cpdetector.io.JChardetFacade.getInstance());
  //ASCIIDetector用于ASCII编码测定
  detector.add(cpdetector.io.ASCIIDetector.getInstance());
  //UnicodeDetector用于Unicode家族编码的测定
  detector.add(cpdetector.io.UnicodeDetector.getInstance());
  java.nio.charset.Charset charset = null;
  File f=new File("待测的文本文件名");
  try {
        charset = detector.detectCodepage(f.toURL());
  } catch (Exception ex) {ex.printStackTrace();}
  if(charset!=null){
       System.out.println(f.getName()+"编码是："+charset.name());
  }else
      System.out.println(f.getName()+"未知");
</pre><br /> 上面代码中的detector不仅可以用于探测文件的编码，也可以探测任意输入的文本流的编码，方法是调用其重载形式：<br /><pre name="code" class="java">
 charset=detector.detectCodepage(待测的文本输入流,测量该流所需的读入字节数);
</pre><br />上面的字节数由程序员指定，字节数越多，判定越准确，当然时间也花得越长。要注意，字节数的指定不能超过文本流的最大长度。<br /><br />  判定文件编码的具体应用举例：<br />  属性文件(.properties)是Java程序中的常用文本存储方式，象STRUTS框架就是利用属性文件存储程序中的字符串资源。它的内容如下所示：<br />  <pre name="code" class="java">
   #注释语句
   属性名=属性值
  </pre><br />  读入属性文件的一般方法是：<br />  <pre name="code" class="java">
  FileInputStream ios=new FileInputStream("属性文件名");
  Properties prop=new Properties();
  prop.load(ios);
  ios.close();
  </pre><br />  利用java.io.Properties的load方法读入属性文件虽然方便，但如果属性文件中有中文，在读入之后就会发现出现乱码现象。发生这个原因是load方法使用字节流读入文本，在读入后需要将字节流编码成为字符串，而它使用的编码是“iso-8859-1”,这个字符集是ASCII码字符集，不支持中文编码，所以这时需要使用显式的转码:<br /> <pre name="code" class="java">
   String value=prop.getProperty("属性名");
   String encValue=new String(value.getBytes("iso-8859-1"),"属性文件的实际编码");
 </pre><br />  在上面的代码中，属性文件的实际编码就可以利用上面的方法获得。当然，象这种属性文件是项目内部的，我们可以控制属性文件的编码格式，比如约定采用Windows内定的GBK，就直接利用"gbk"来转码，如果约定采用UTF-8，也可以是使用"UTF-8"直接转码。如果想灵活一些，做到自动探测编码，就可利用上面介绍的方法测定属性文件的编码，从而方便开发人员的工作。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/108540#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Aug 2007 12:26:17 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/108540</link>
        <guid>http://hdwangyi.javaeye.com/blog/108540</guid>
      </item>
      <item>
        <title>再论Tomcat和STRUTS中的中文问题</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/107759" style="color:red;">http://hdwangyi.javaeye.com/blog/107759</a>&nbsp;
          发表时间: 2007年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tomcat中开发WEB程序的中文问题困扰了许多人，网上也有大量讨论解决的方法。本文也准备在此讨论一下这个问题。<br />  中文问题有两个方面：<br /><br />（1）中文的显示问题<br /><br />   JSP页面：<br />   这个问题只需要在JSP页面中设定如下指令就可以解决：<br />   <pre name="code" class="java"> 
   &lt;%@page pageEncoding="支持中文的编码"%>
   </pre> <br />   Servlet：<br />   在doGet或doPost方法中，利用以下语句（假设HttpServletResponse参数名为response）：<br />   <pre name="code" class="java">
   response.setContentType("text/html;charset=支持中文的编码");
   </pre><br />   HTML:<br />   可以在&lt;HEAD>标记中设定<br />  <pre name="code" class="java">
  &lt;HEAD>
  &lt;meta http-equiv="Content-Type" content="text/html; charset=支持中文的编码">
  &lt;/HEAD> 
 </pre><br /><br />  对于支持中文编码的具体选择，很多文章推荐利用GBK，这个当然可以，不过，利用UTF-8要更好一些，因为现在Java类库中为了能够适应国际化的需要，许多字符都是采用UTF-8进行的编码，所以，推荐采用UTF-8。<br /><br />   另外一点需要注意的是，在存储JSP或HTML文件时，一定要保证存储文件的编码格式要与声明的中文编码的格式相同，否则的话会由于文件的实际编码和声明的编码不一至产生乱码。大部分的专业开发工具，比如MyEclipse、Netbeans等等，都会按照文件中声明的编码格式自动存储文件，所以不会有什么问题。但是，如果利用一些简单的工具，比如Windows的记事本，它不会自动按照声明的格式存储文件。在大部分情况下，文件会按照Windows系统默认的编码格式进行存储，即GBK编码。如果声明了UTF-8，这时反而会出现乱码。不过，记事本也支持不同的文本存储编码，只是需要手工指定：使用"文件"->"另存为"菜单，在文件存储对话框最后的“编码”框中选择UTF-8就可以了。<br /><br />（2）中文参数的接收和传递问题<br />  <br />  在WEB中除去要显示中文信息之外，中文信息的接受和传递也是必不可少的。在WEB程序中，用户输入的数据和程序交互的主要方式就是利用HTTP协议的GET方法或POST方法，而用户的数据往往是由浏览器传递给Tomcat，Tomcat再交给WEB程序来处理这些数据。<br /><br />   鉴于这个过程，要保证正确的中文信息接受和传递，首先要保证浏览器中的传递过来的数据要正确，所以，在显示用户界面时，应该要保证在JSP或HTML中设定了正确的字符编码。其实，只要按照问题（1）中的设定，一般都不会有问题。<br /><br />   接下来就是程序中接受中文，此时问题稍稍有些复杂，这是由于在Tomcat不同的版本中，处理GET协议和POST协议的有不同方式造成的。<br /><br />  （A）Tomcat4.x<br />   对于Tomcat4.x版本，它采用相同的方式处理HTTP协议中的get和set方法，所以，要处理这个问题，只需要在WEB程序中接受request参数时，在取出参数之前，在JSP的页面或Servlet的doGet(或doPost)利用如下代码就可以解决中文参数的获取问题：<br /><pre name="code" class="java">  
 //该语句一定要位于取出参数值之前!
 request.setCharacterEncoding("编码名");
 String param=request.getParameter("param");
</pre><br />至于编码名具体采取什么，应按照你的传入数据的JSP页面或HTML页面中的字符编码而定，如果设定的为GBK，则此处也应是GBK，如果是UTF-8，此处也应设为UTF-8。<br /><br />   要想在Tomcat4.x中免掉这个在接受参数前都要进行编码设定的麻烦，可以写一个过滤器Servlet，在它的doFilter方法中的第一行加入request.setCharacterEncoding()这条设置语句，然后让该过滤器监控所有的URL请求，即可直接在WEB程序中接受来自于request中的中文参数。<br /> <br />   STRUTS程序:<br />   由于框架封装了对于request参数的获取，所以，要先于框架对request参数进行编码设定，此时使用过滤器是一个好的选择。<br /><br />  (B)Tomcat5.x<br />  在Tomcat5.x中，它采用不同的方式处理GET和POST请求，这时，如果按照上述的设定request的setCharacterEncoding方法，就只能对采用POST方法提交的数据起作用，而对于GET方法，request.setCharacterEncoding则失去了作用。<br /><br />  因此，在Tomcat5.x中，需要单独处理GET方法的请求。如果直接在Apache的网站上下载Tomcat，则其默认的GET参数请求的编码均为ISO-8859-1，所以，要解决这个GET方法的中文问题，就需要在接受GET方式传过来的request中的参数时，首先将该参数转变为ISO-8859-1方式的字节数组，在利用String类的String(字节数组,"编码名称")构造方法，将该参数转变为正确的编码，这里，String构造方法中的"编码名称"，应按照传过来数据的JSP或HTML中的编码来设定，如为GBK,则也应设定为GBK，如为UTF-8，也应设定为UTF-8，具体的过程如下：（以UTF-8编码为例）<br />  <pre name="code" class="java">
    //p1参数来源于一个编码为UTF-8的JSP页面或HTML页面中的表单元素
    String p1=request.getParameter("p1");
    //pc中存储了正确的中文字符串
    String pc=new String(p1.getBytes("ISO-8859-1"),"UTF-8");
  </pre><br /><br />  由此可见，处理在Tomcat5.x中的中文有些麻烦，能不能不单独处理GET请求，就象Tomcat4.x中那样，只要设定request就可以解决问题呢？<br />  <br />  答案就是修改Tomcat5.x中的config目录中的server.xml文件中的处理GET请求的URIEncoding参数，将该参数的值设置为支持中文的编码即可。在此，还是推荐采用UTF-8作为URIEncoding参数的值。具体的设置方法请参看我的另一篇文章：<a href="http://hdwangyi.javaeye.com/blog/107709" target="_blank">让Tomcat支持中文文件和目录</a><br /><br />  这样，在设置完成后，只要保证存储用户数据表单所在的JSP或HTML设定了和URIEncoding参数一样的编码，就可直接从request参数中获取到GET方法传过来的正确正文信息，无需再次转码。<br /><br />   按照这样的设定，就可以象Tomcat4.x，写一个过滤器来处理所有的POST请求，而GET就无需设定了。<br /><br />   对于Tomcat5.x中的STRUTS程序，设定server.xml文件中URIEncoding参数，然后在WEB程序中添加处理request的编码的过滤器Servlet，是一种相当方便的处理中文的方法，因为此时就无需程序中采用特殊的步骤处理传入的中文参数了。<br /><br />   总结一下：<br />  （1）推荐JSP和HTML的编码都设置为UTF-8；<br />  （2）对于Tomcat4.x，为WEB程序编写一个监控所有URL请求的过滤器Servlet，在doFilter方法中对request参数执行request.setCharacterEncoding("UTF-8");，则在WEB程序中将不受中文问题的困扰，无论你采用什么样的WEB框架。<br /><br />  （3）对于Tomcat5.x，在上述步骤的基础上，只要修改安装目录中的config/server.xml，添加参数URIEncoding，将其设置为UTF-8。<br /><br />  按照上面的设定之后，在JSP或Servlet中取GET或POST过来的数据只需要如下一行常规的代码就可以了：<br />  <pre name="code" class="java">
    String p1=request.getParameter("p1");
  </pre><br />  对于STRUTS，也可以直接使用它在Formbean中存储的表单数据了。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/107759#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Aug 2007 12:38:06 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/107759</link>
        <guid>http://hdwangyi.javaeye.com/blog/107759</guid>
      </item>
      <item>
        <title>让Tomcat支持中文路径名和中文文件名</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/107709" style="color:red;">http://hdwangyi.javaeye.com/blog/107709</a>&nbsp;
          发表时间: 2007年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tomcat是Java开发者使用得较多的一个Web服务器，因为它占用资源小，运行速度快等特点，深受Java Web程序员的喜爱。不过，在使用中，由于Java中的中文问题的存在，如果不经过配置，在WEB程序中，不能直接支持具有中文文件名的文件的下载，这为Java Web程序的开发带来一定的不便。本文拟介绍一种手段，解决这个问题。<br /><br />   解决问题的核心在于修改Tomcat的配置，在Server.xml文件中添加一个名为URIEncoding的属性，它用于对HTTP请求中的get方法传过来的URL进行编码。如果直接从Apache站点中下载Tomcat，无论是安装版的exe文件，还是解压缩的ZIP文件，内置的对于get协议中的URL编码都是ISO-8859-1,这个字符集不能直接支持中文等双字节的信息，而中文文件的下载链接恰恰是通过get协议进行的。以下说明修改Tomcat安装目录中的config文件夹中的server.xml文件的方法。<br /><br />   打开config/server.xml文件，如果没有修改过这个文件，应该可以在其中找到如下代码：<br />   <br />   &lt;Connector port="8080"  protocol="HTTP/1.1" <br />               connectionTimeout="20000" <br />               redirectPort="8443" /><br />   <br />   这段代码规定了Tomcat监听HTTP请求的端口号等信息，可以在这里添加一个属性：URIEncoding，将该属性值设置为UTF-8，即可让Tomcat不再以ISO-8859-1的编码处理get请求。更改后的代码如下所示（红色部分为新添加的代码）：<br />  <br />  &lt;Connector port="8080" <br />             <span style="color: red">URIEncoding="utf-8"</span><br />             protocol="HTTP/1.1" <br />             connectionTimeout="20000" <br />             redirectPort="8443" /><br />  <br />  下面，我们准备测试一下更改后的效果。<br /><br />   最为简单的测试方法就是让Tomcat自己列出WEB程序中的目录和文件，默认情况下，Tomcat不会直接列出WEB程序目录中的文件和文件夹，但是，我们可以修改位于安装目录中的config文件夹中的web.xml，使其能够支持自动列出WEB程序中的目录和文件。<br />   在config/web.xml文件中找到如下代码：<br />   <br />    &lt;servlet><br />    &lt;servlet-name>default&lt;/servlet-name><br />    &lt;servlet-class>org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class><br />    &lt;init-param><br />      &lt;param-name>debug&lt;/param-name><br />      &lt;param-value>0&lt;/param-value><br />    &lt;/init-param><br />    &lt;init-param><span style="color: red"><br />      &lt;param-name>listings&lt;/param-name><br />      &lt;param-value>false&lt;/param-value></span><br />    &lt;/init-param><br />    &lt;load-on-startup>1&lt;/load-on-startup><br />  &lt;/servlet><br />   <br />   将上面的代码中标为红色的部分改为如下内容：<br />  <br />   &lt;init-param><br />      &lt;param-name>listings&lt;/param-name><br />      &lt;param-value><span style="color: red">true</span>&lt;/param-value><br />   &lt;/init-param><br />   <br /><br />   即将参数listings的属性改为true，就可让Tomcat自动列出某个WEB程序目录中的文件和文件夹。<br /><br />   现在，我们的设置已经完成，将修改的文件保存后，就可以启动Tomcat进行测验了，当然，如果Tomcat正在运行，则需要重新启动，以便配置生效。<br /><br />   现在，可以在Tomcat安装目录中的webapps目录中建立一个名为cntest的文件夹，作为测试的web程序的上下文路径（注意：对于WEB程序的上下文路径，请不要使用中文）。请在cntest中添加一些中文目录和文件，然后在浏览器中打开该WEB程序，如，http://localhost:8080/cntest，测验一下效果吧。当然，也可以在JSP或HTML文件中使用那些包含中文的文件夹或文件名的超级链接。<br /><br />   说明：以上修改均使用Tomcat5.5做的测试，在5.5以上都应该可以，至于5.0和4.x，我没有实验过，不过对于5.0应该也是可以的，但4.x不能保证（4.x在处理HTTP的get和post方法和5.x不大一样）。
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/107709#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Aug 2007 11:04:54 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/107709</link>
        <guid>http://hdwangyi.javaeye.com/blog/107709</guid>
      </item>
      <item>
        <title>获取Java程序运行的路径</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/105707" style="color:red;">http://hdwangyi.javaeye.com/blog/105707</a>&nbsp;
          发表时间: 2007年07月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于Java程序，无论是未打包的还是打包的JAR或WAR文件，有时候都需要获取它运行所在目录信息，如何做到这一点呢？<br /><br />在Java处理的文件系统中，目录的表示方式有两种：<br /><br />（1）绝对目录，它以"/"为起始字符，代表从根目录下开始寻找给出的目录，如/c:/java<br /><br />（2）相对路径，它以不带“/”的目录名表示，表示以当前Java程序正在运行的目录作为起始目录来寻找给出的目录。如java/classes。在相对路径中，有一些特定的字符，可以代表特的的目录，比如，“.”代表当前目录，“..”代表当前目录的上一级目录。在网上很多给出的例子中，就是利用"."作为目录名，构造File对象的实例，然后通过File对象的方法来获取当前程序运行的目录。<br /><br />    这种方法虽然简单，但有时不能正确的得出当前程序的运行目录。原因在于，运行Java程序不一定要进入到该程序的类文件或JAR文件所在的目录，只要在运行时指定了正确的类路径信息，就可以在任何目录中运行Java程序，此时利用这种方法只能得到发出运行命令时所在的目录信息。<br /><br />     从上面的分析可以看出，对于很多Java程序，尤其是WEB程序，利用当前路径的“.”表示法，都不能满足要求。那么怎样才能正确的得到运行目录信息呢？<br /><br />     在Web程序中，利用Servlet API可以获得一些路径信息，比如HttpServletRequest接口中定义的getRealPath方法，但类似这些方法都依赖于Servlet环境，不便于程序的单元测试。<br /><br />    本文提供了一种只使用Java标准API的路径探测方法，就是利用ClassLoader抽象类。<br /><br />    利用java.lang.Class的getClassLoader方法，可以获得给定类的ClassLoader实例，它的getResource方法可以获得当前类装载器中的资源的位置，我们可以利用类文件的名称作为要查找的资源，经过处理后就可获得当前Java程序的运行位置信息，其伪代码如下：<br />    <br />    获得Class参数的所在的类名<br />    取得该类所在的包名<br />    将包名转换为路径<br />    利用getResource得到当前的类文件所在URL<br />    利用URL解析出当前Java程序所在的路径<br />  <br />   具体代码如下：<br /><pre name="code" class="java">
  
    /**-----------------------------------------------------------------------
     *getAppPath需要一个当前程序使用的Java类的class属性参数，它可以返回打包过的
     *Java可执行文件（jar，war）所处的系统目录名或非打包Java程序所处的目录
     *@param cls为Class类型
     *@return 返回值为该类所在的Java程序运行的目录
     -------------------------------------------------------------------------*/
    public static String getAppPath(Class cls){
        //检查用户传入的参数是否为空
        if(cls==null) 
         throw new java.lang.IllegalArgumentException("参数不能为空！");
        ClassLoader loader=cls.getClassLoader();
        //获得类的全名，包括包名
        String clsName=cls.getName()+".class";
        //获得传入参数所在的包
        Package pack=cls.getPackage();
        String path="";
        //如果不是匿名包，将包名转化为路径
        if(pack!=null){
            String packName=pack.getName();
           //此处简单判定是否是Java基础类库，防止用户传入JDK内置的类库
           if(packName.startsWith("java.")||packName.startsWith("javax.")) 
              throw new java.lang.IllegalArgumentException("不要传送系统类！");
            //在类的名称中，去掉包名的部分，获得类的文件名
            clsName=clsName.substring(packName.length()+1);
            //判定包名是否是简单包名，如果是，则直接将包名转换为路径，
            if(packName.indexOf(".")&lt;0) path=packName+"/";
            else{//否则按照包名的组成部分，将包名转换为路径
                int start=0,end=0;
                end=packName.indexOf(".");
                while(end!=-1){
                    path=path+packName.substring(start,end)+"/";
                    start=end+1;
                    end=packName.indexOf(".",start);
                }
                path=path+packName.substring(start)+"/";
            }
        }
        //调用ClassLoader的getResource方法，传入包含路径信息的类文件名
        java.net.URL url =loader.getResource(path+clsName);
        //从URL对象中获取路径信息
        String realPath=url.getPath();
        //去掉路径信息中的协议名"file:"
        int pos=realPath.indexOf("file:");
        if(pos>-1) realPath=realPath.substring(pos+5);
        //去掉路径信息最后包含类文件信息的部分，得到类所在的路径
        pos=realPath.indexOf(path+clsName);
        realPath=realPath.substring(0,pos-1);
        //如果类文件被打包到JAR等文件中时，去掉对应的JAR等打包文件名
        if(realPath.endsWith("!"))
            realPath=realPath.substring(0,realPath.lastIndexOf("/"));
      /*------------------------------------------------------------
       ClassLoader的getResource方法使用了utf-8对路径信息进行了编码，当路径
        中存在中文和空格时，他会对这些字符进行转换，这样，得到的往往不是我们想要
        的真实路径，在此，调用了URLDecoder的decode方法进行解码，以便得到原始的
        中文及空格路径
      -------------------------------------------------------------*/
      try{
        realPath=java.net.URLDecoder.decode(realPath,"utf-8");
       }catch(Exception e){throw new RuntimeException(e);}
       return realPath;
    }//getAppPath定义结束
   //-----------------------------------------------------------------
</pre><br />该方法既可以用于JAR或WAR文件，也可以用于非JAR文件。但要注意以下2点：<br /><ol><li>不要传递系统的类，作为getAppPath的参数，如java.lang.String.class，当然，也不要传递那些已经位于JDK中的那些类，比如xml相关的一些类等等。</li><li>要传递应该是程序中主要的运行类，不要传递程序中的支持类库中的类文件，也就是那些第三方的类库中的类文件，否则得到的将是那些类库的位置。</li></ol>
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/105707#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jul 2007 11:07:43 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/105707</link>
        <guid>http://hdwangyi.javaeye.com/blog/105707</guid>
      </item>
      <item>
        <title>Java程序中的配置文件的存放和读取</title>
        <author>hdwangyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hdwangyi.javaeye.com">hdwangyi</a>&nbsp;
          链接：<a href="http://hdwangyi.javaeye.com/blog/105512" style="color:red;">http://hdwangyi.javaeye.com/blog/105512</a>&nbsp;
          发表时间: 2007年07月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家可能经常会遇到在Java程序中存取程序配置文件的需求，比如，为了能够和不同的数据库连接，我们经常把数据库连接的信息存放到属性文件中，这些信息一般包括数据库驱动程序类名、数据库连接的URL，数据库的用户名和口令等等。为了便于程序的安装或部署，我们经常会把这些的配置文件存放到程序安装的根目录中。由于Java程序用包来分组类，有时候将这些配置文件放入到读取它们的类所在的包目录中会更好一些。比如，在下面的图示中，将数据库配置文件 database.properties放到数据库读取类所在的包目录就是一种比较清晰的存储方案：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /-----------其它包目录<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;&nbsp; |<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;&nbsp; |<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;&nbsp; -------edu.ec.database<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---------------ConnectionPool（数据库连接池类）<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---------------Dao（数据库访问对象类）<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---------------DaoFactory（Dao的工厂类）<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---------------database.properties（数据库配置属性文件）<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---------------RecordSet（记录集类）<br />
&nbsp; &nbsp;<br />
在这种存储方案中，所有的与数据库相关的类和配置文件都在同一个包目录中；在开发过程中，配置文件和源文件也按采用这种方式进行组织，这样会使得程序的数据库访问维护变得相当清晰明了。<br />
<br />
大部分开发工具在编译打包这样的源文件组织时，会自动将相关配置文件和类文件放到生成的目标文件夹中或JAR文件中。一般情况下，我们在发布自己的 Java程序时，都是以JAR或WAR形式将程序打包发布，而对应的配置文件也会按照上述的目录格式被放到了JAR或WAR文件中，这样，就实现了配置文件和程序文件打包在一起发布的目的。<br />
<br />
现在的问题是，我们如何读取位于程序安装文件中的配置文件的信息？比如，在上面的图中， ConnectionPool是一个数据库连接池类，它需要在系统启动时自动读取存储在database.properties中的数据库连接和配置信息，以便设置相关的数据库连接。这样，我们 就需要在程序中测定目前程序安装或部署的位置，以便读取对应的属性文件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在很多其他语言编写的程序中，我们可以利用一些系统提供的API或一些全局对象获取目前应用程序运行所在的目录。比如VB,我们可以使用Application对象测定当前程序的安装位置，在Java程序中如何完成类似的任务呢？<br />
<br />
Java程序并没有类似于VB那种全局对象，但如果我们观察位于上述目录结构中的database.properties文件，应该发现其处于应用程序的CLASSPATH中，这样，我们就可以使用Java中的类装载器中的相关的方法，读出这些配置文件的信息，该类名为ClassLoader。比如，在上例中，我们可以先得到ConnectinPool的类装载器，然后测定ConnectionPool类所在的包路径，然后利用 ConnectionPool所在的包目录读出database.properties文件的信息，对应的伪代码如下：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassLoader loader=ConnectionPool.class.getClassLoader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 得到ConnectionPool所在的包名;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将包名转换为对应的目录名，存入一个名为path的字符串变量中;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用loader的getResourceAsStream(path+&quot;database.properties&quot;)，得到输入流<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是一个可实际运行的样例代码片段，它可自动测定传入的类所在的包目录，返回传入的属性文件所代表的输入流。它还有一个附加的功能：如果属性文件直接放到了当前类所在的根目录（比如位于JAR文件的根目录或WAR文件的WEB-INF/classes目录中）、系统的用户目录系统、系统其他的类路径中时，它也可以找到；当然，如果还是找不到，它将返回null。具体的代码如下：<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class PropHelper{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *guessPropFile:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *@param cls:和要寻找的属性文件处于相同的包中的任意的类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *@param propFile:要寻找的属性文件名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; static java.io.InputStream guessPropFile(Class cls,String propFile){<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;&nbsp;&nbsp;&nbsp; try{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到类的类装载器<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassLoader loader=cls.getClassLoader();<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //先从当前类所处路径的根目录中寻找属性文件<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.InputStream in=loader.getResourceAsStream(propFile);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(in!=null) return in;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有找到，就从该类所处的包目录中查找属性文件<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Package pack=cls.getPackage();<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pack!=null){<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String packName=pack.getName();<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path=&quot;&quot;;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(packName.indexOf(&quot;.&quot;) &lt; 0 ) <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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path=packName+&quot;/&quot;;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<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;&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; int start=0,end=0;<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;&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; end=packName.indexOf(&quot;.&quot;);<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;&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; while(end!=-1){<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;&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;&nbsp;&nbsp;&nbsp;&nbsp; path=path+packName.substring(start,end)+&quot;/&quot;;<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;&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;&nbsp;&nbsp;&nbsp;&nbsp; start=end+1;<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;&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;&nbsp;&nbsp;&nbsp; end=packName.indexOf(&quot;.&quot;,start);<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;&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; }<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;&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; path=path+packName.substring(start)+&quot;/&quot;;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in=loader.getResourceAsStream(path+propFile);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(in!=null) return in;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<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;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果没有找到，再从当前系统的用户目录中进行查找<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File f=null;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String curDir=System.getProperty(&quot;user.dir&quot;);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f=new java.io.File(curDir,propFile);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(f.exists()) return new java.io.FileInputStream(f);<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;&nbsp;&nbsp;&nbsp; &nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果还是没有找到，则从系统所有的类路径中查找<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String classpath=System.getProperty(&quot;java.class.path&quot;);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] cps=classpath.split(System.getProperty(&quot;path.separator&quot;));<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;&nbsp;&nbsp;&nbsp; &nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i &lt; cps.length; i++){<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f=new java.io.File(cps[i],propFile);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(f.exists()) break;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f=null;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(f!=null) return new java.io.FileInputStream(f);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<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; }catch(Exception e){throw new RuntimeException(e);}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
使用举例：利用上述的方法，可在ConnectionPool中自动查找和ConnectionPool处于同一个包目录中的database.properties的输入流，并利用该输入流读入对应的属性值的代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class ConnectionPool{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //静态初始化器，将在ConnectionPools加载时自动执行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Properties dbProp=new java.util.Properties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.InputStream in=PropHelper.guessPropFile(edu.ec.database.ConnectionPool.class,&quot;database.properties&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(in!=null) dbProp.load(in);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //利用dbProp，为相应的数据源对象设置相关的属性，比如C3P0........<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }
          <br/>
          <span style="color:red;">
            <a href="http://hdwangyi.javaeye.com/blog/105512#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jul 2007 00:40:22 +0800</pubDate>
        <link>http://hdwangyi.javaeye.com/blog/105512</link>
        <guid>http://hdwangyi.javaeye.com/blog/105512</guid>
      </item>
  </channel>
</rss>