﻿<?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-　　　　　　　　　　　　　彬 ^_^ -随笔分类-Java</title><link>http://www.blogjava.net/libin2722/category/25647.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Thu, 29 May 2008 11:27:59 GMT</lastBuildDate><pubDate>Thu, 29 May 2008 11:27:59 GMT</pubDate><ttl>60</ttl><item><title>将JBoss启动做成Windows的系统服务</title><link>http://www.blogjava.net/libin2722/archive/2008/05/29/203794.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 29 May 2008 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/05/29/203794.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/203794.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/05/29/203794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/203794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/203794.html</trackback:ping><description><![CDATA[<font size="2">里将用到JavaService.exe 这个程序将JBoss启动做成Windows的系统服务。</font>
<div><font size="2">第一步:下载jboss-4.2.2,并安装到某一个目录下.</font></div>
<div><font size="2">第二步： 复制 JavaService.exe 文件到%JBOSS_HOME%\bin目录下；</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>如果没有JavaService.exe 可以在</font><a href="http://javaservice.objectweb.org/"><font size="2">http://javaservice.objectweb.org/</font></a><font size="2"> 网站上下载；</font></div>
<div><font size="2">第三步： 设置环境变量：</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>将JAVA_HOME设置成jdk的目录，例如：D:\develop\java\jdk1.6.0</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>将JBOSS_HOME设置成JBOSS的目录，例如：D:\Develop\jboss-4.2.0.GA</font></div>
<div><span style="color: red;"><font size="2">注意：在环境变量中目录不能有空格，否则会造成服务无法启动。</font></span></div>
<div><font size="2">第三步： 通过Windows的运行&#8220;cmd&#8221;或者&#8220;command&#8221;打开dos运行窗口；进入&#8220;%JBOSS_HOME%\bin&#8221;路径；</font></div>
<div><font size="2"><font face="Arial">JavaService.exe -install JBoss
%Java_Home%\jre\bin\server\jvm.dll
-Djava.class.path="%JBOSS_HOME%\bin\run.jar;%JAVA_HOME%\lib\tools.jar"
-Xms64M -Xmx128M -start org.jboss.Main -stop org.jboss.Main -method
systemExit -out "%JBOSS_HOME%\server\default\log\out.log" -err
"%JBOSS_HOME%\server\default\log\err.log" -current "%JBOSS_HOME%\bin"
-overwrite -startup 6</font></font></div>
<div><font size="2">运行后，将会提示：&#8220;The JBoss automatic service war
successfully
installed&#8221;，提示服务安装完成，可以在Windows的服务管理列表中找到名称为&#8220;JBoss&#8221;的服务。输入：&#8220;net start
JBoss&#8221;启动服务，服务启动可能需要一定时间，打开新的IE浏览器在地址栏输入：</font><a href="http://localhost:8080/"><font size="2">http://localhost:8080</font></a><font size="2"> 会有提示页面，表示服务启动成功。</font></div>
<div><font size="2">注意:如何卸载服务：</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>在dos命令窗口输入：&#8220;JavaService.exe &#8211;uninstall 服务名称(一般是jboss)&#8221;</font></div>
<div><font size="2">另外此方法也使用于其他的服务，需要在第四步时更改相应的参数。</font></div>
<img src ="http://www.blogjava.net/libin2722/aggbug/203794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-05-29 12:46 <a href="http://www.blogjava.net/libin2722/archive/2008/05/29/203794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smsql自动生成.</title><link>http://www.blogjava.net/libin2722/archive/2008/02/28/182720.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 28 Feb 2008 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/28/182720.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/182720.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/28/182720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/182720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/182720.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/libin2722/aggbug/182720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-28 16:20 <a href="http://www.blogjava.net/libin2722/archive/2008/02/28/182720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA与正则表达式</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179862.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179862.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179862.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179862.html</trackback:ping><description><![CDATA[<h3 style="margin: 13pt 0cm;"><a><font size="5">1<span style="font-family: 宋体;">黑暗岁月</span></font></a></h3>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>有一个</a></span><span style="font-size: 12pt;"><a>String</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>，如何查询其中是否有</a></span><span style="font-size: 12pt;"><a>y</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>和</a></span><span style="font-size: 12pt;"><a>f</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>字符？最黑暗的办法就是：</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>程序</a></span><span style="font-size: 12pt;"><a>1</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>：我知道</a></span><span style="font-size: 12pt;"><a>if</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>for</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>语句和</a></span><span style="font-size: 12pt;"><a>charAt()</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>啊。</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>class Test{</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp; </a><a>public static void main(String args[]) {</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>String str="For my money, the important thing "+</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>"about the meeting was bridge-building";</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>char x='y';</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>char y='f';</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>boolean result=false;</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>for(int i=0;i</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>char z=str.charAt(i);&nbsp;//System.out.println(z);</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>if(x==z||y==z) {</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>result=true;</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>break;</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>}</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>else result=false;</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>}&nbsp;</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>System.out.println(result);</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>}</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>}</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>好像很直观，但这种方式难以应付复杂的工作。如查询一段文字中，是否有</a></span><span style="font-size: 12pt;"><a>is</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>？是否有</a></span><span style="font-size: 12pt;"><a>thing</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>或</a></span><span style="font-size: 12pt;"><a>ting</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>等。这是一个讨厌的工作。</a></span></p>
<h3 style="margin: 13pt 0cm;"><a><font size="5"><span style="font-family: 宋体;">&#167;</span>2 Java<span style="font-family: 宋体;">的</span>java.util.regex<span style="font-family: 宋体;">包</span></font></a></h3>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>按照面向对象的思路，把希望查询的字符串如</a></span><span style="font-size: 12pt;"><a>is</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>thing</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>或</a></span><span style="font-size: 12pt;"><a>ting</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>封装成一个对象，以这个对象作为模板去匹配一段文字，就更加自然了。作为模板的那个东西就是下面要讨论的正则表达式。先不考虑那么复杂，看一个例子：</a></span></p>
<p style="margin: 0cm 0cm 0pt 0.05pt; text-indent: 18pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>程序</a></span><span style="font-size: 12pt;"><a>2</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>：不懂。先看看可以吧？</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>import java.util.regex.*;</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>class Regex1{</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp; </a><a>public static void main(String args[]) {</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>String str="For my money, the important thing "+</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>"about the meeting was bridge-building";</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>String regEx="a|f";&nbsp;&nbsp; //</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: 宋体;"><a>表示</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>a</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: 宋体;"><a>或</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>f </a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>Pattern p=Pattern.compile(regEx);</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>Matcher m=p.matcher(str);</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>boolean result=m.find();</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>System.out.println(result);</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>}</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>}</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>如果</a></span><span style="font-size: 12pt;"><a>str</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>匹配</a></span><span style="font-size: 12pt;"><a>regEx</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>，那么</a></span><span style="font-size: 12pt;"><a>result</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>为</a></span><span style="font-size: 12pt;"><a>true</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>，否则为</a></span><span style="font-size: 12pt;"><a>flase</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>。如果想在查找时忽略大小写，则可以写成：</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>Pattern&nbsp;p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>虽然暂时不知道</a></span><span style="font-size: 12pt;"><a>Pattern</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>（模板、模式）和</a></span><span style="font-size: 12pt;"><a>Matcher</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>（匹配器）的细节，程序的感觉就比较爽，如果先查询</a></span><span style="font-size: 12pt;"><a>is</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、后来又要查询</a></span><span style="font-size: 12pt;"><a>thing</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>或</a></span><span style="font-size: 12pt;"><a>ting</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>，我们只需要修改一下模板</a></span><span style="font-size: 12pt;"><a>Pattern</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>，而不是考虑</a></span><span style="font-size: 12pt;"><a>if</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>语句和</a></span><span style="font-size: 12pt;"><a>for</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>语句，或者通过</a></span><span style="font-size: 12pt;"><a>charAt()</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>。</a></span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span style="font-size: 12pt;"><a>1、</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>写一个特殊的字符串——正则表达式如</a></span><span style="font-size: 12pt;"><a>a|f</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>。</a></span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span style="font-size: 12pt;"><a>2、</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>将正则表达式编译成一个模板：</a></span><span style="font-size: 12pt;"><a>p</a></span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span style="font-size: 12pt;"><a>3、</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>用模板</a></span><span style="font-size: 12pt;"><a>p</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>去匹配字符串</a></span><span style="font-size: 12pt;"><a>str</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>。</a></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: -21pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>思路清楚了，现在看</a></span><span style="font-size: 12pt;"><a>Java</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>是如何处理的（</a></span><span style="font-size: 12pt;"><a>Java</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>程序员直到</a></span><span style="font-size: 12pt;"><a>JDK1.4</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>才能使用这些类。</a></span></p>
<h3 style="margin: 13pt 0cm;"><a><font size="5"><span style="font-family: 宋体;">&#167;</span>3 Pattern<span style="font-family: 宋体;">类与查找</span></font></a></h3>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>①</a></span><span style="font-size: 12pt;"><a>public final class <strong>java.util.regex.Pattern</strong></a></span><span style="font-size: 12pt; font-family: 宋体;"><a>是</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>正则表达式编译后的表达法。下面的语句将创建一个</a></span><a><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">对象并赋值给句柄</span><span style="font-size: 12pt;">p</span><span style="font-size: 12pt; font-family: 宋体;">：</span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Pattern p=Pattern.compile(regEx);</span></a></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>有趣的是，</a></span><a><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">类是</span><span style="font-size: 12pt;">final</span><span style="font-size: 12pt; font-family: 宋体;">类，而且它的构造器是</span><span style="font-size: 12pt;">private</span><span style="font-size: 12pt; font-family: 宋体;">。也许有人告诉你一些设计模式的东西，或者你自己查有关资料。这里的结论是：</span><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">类不能被继承，我们不能通过</span><span style="font-size: 12pt;">new</span><span style="font-size: 12pt; font-family: 宋体;">创建</span><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">类的对象。</span></a></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>因此在</a></span><a><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">类中，提供了</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt; font-family: 宋体;">个重载的静态方法，其返回值是</span><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">对象（的引用）。如：</span></a></p>
<p style="margin: 0cm 0cm 0pt;"><a><strong><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; public static Pattern compile(String regex) {</span></strong></a></p>
<p style="margin: 0cm 0cm 0pt;"><a><strong><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-size: 12pt;">return new Pattern(regex, 0);</span></a></p>
<p style="margin: 0cm 0cm 0pt;"><a><strong><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; }</span></strong></a></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>当然，我们可以声明</a></span><a><strong><span style="font-size: 12pt;">Pattern</span></strong><span style="font-size: 12pt; font-family: 宋体;">类的句柄，如</span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Pattern p=null</span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: 宋体;">；</span></a></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>②</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>p.matcher(str)</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>表示以用模板</a></span><span style="font-size: 12pt;"><a>p</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>去生成一个字符串</a></span><span style="font-size: 12pt;"><a>str</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>的匹配器，它的返回值是一个</a></span><span style="font-size: 12pt;"><a>Matcher</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>类的引用，为什么要这个东西呢？按照自然的想法，返回一个</a></span><span style="font-size: 12pt;"><a>boolean</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>值不行吗？</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>我们可以简单的使用如下方法：</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>boolean result=Pattern.compile(regEx).matcher(str).find();</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>呵呵，其实是三个语句合并的无句柄方式。无句柄常常不是好方式。后面再学习</a></span><span style="font-size: 12pt;"><a>Matcher</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>类吧。先看看</a></span><span style="font-size: 12pt;"><a>regEx</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>——这个怪咚咚。</a></span></p>
<h3 style="margin: 13pt 0cm;"><a><font size="5"><span style="font-family: 宋体;">&#167;</span>4 <span style="font-family: 宋体;">正则表达式之限定符</span></font></a></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.5pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: 宋体;"><a>正则表达式（</a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>Regular Expression</a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: 宋体;"><a>）</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>是一种<span style="background: yellow none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">生成字符串的字符串</span>。晕吧。比如说，</a></span><span style="font-size: 12pt;"><a>String regEx="me+";</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>这里字符串</a></span><span style="font-size: 12pt;"><a>me+</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>能够生成的字符串是：</a></span><span style="font-size: 12pt;"><a>me</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>mee</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>meee</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>meeeeeeeeee</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>等等，一个正则表达式可能生成无穷的字符串，所以我们不可能（有必要吗？）输出正则表达式产生的所有东西。</a></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.5pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>反过来考虑，对于字符串：</a></span><span style="font-size: 12pt;"><a>me</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>mee</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>meee</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>meeeeeeeeee</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>等等，我们能否有一种<strong><span style="background: yellow none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">语言</span></strong>去描述它们呢？显然，正则表达式语言是这种语言，它是一些字符串的模式——简洁而深刻的描述。</a></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20.5pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>我们使用正则表达式，用于<span style="background: yellow none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">字符串查找、匹配、指定字符串替换、字符串分割</span>等等目的。</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>生成字符串的字符串——正则表达式，真有些复杂，因为我们希望</a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333; font-family: 宋体;"><a>由普通字符（例如字符</a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a> a </a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333; font-family: 宋体;"><a>到</a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a> z</a></span><span style="background: yellow none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333; font-family: 宋体;"><a>）以及特殊字符（称为元字符）</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>描述</a></span><span style="font-size: 12pt; color: #333333; font-family: 宋体;"><a>任意的字符串，而且要准确。</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; color: #333333; font-family: 宋体;"><a>先搞几个</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>正则表达式</a></span><span style="font-size: 12pt; color: #333333; font-family: 宋体;"><a>例子：</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>程序</a></span><span style="font-size: 12pt;"><a>3</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>：我们总用这个程序测试正则表达式。</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><span style="background: #d9d9d9 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a>import java.util.regex.*;</a></span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>class Regex1{</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>&nbsp; </a><a>public static void main(String args[]) {</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>String str="For my money, the important thing "</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333; font-family: 宋体;"><a>；</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>String regEx="ab*"; </a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>boolean result=Pattern.compile(regEx).matcher(str).find();</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>&nbsp; </a><a>System.out.println(result);</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a><a>}</a></span></p>
<p style="margin: 0cm 0cm 0pt 21pt;"><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>}//ture</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>①</a></span><span style="font-size: 12pt;"><a>"ab*"</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>——能匹配</a></span><span style="font-size: 12pt;"><a>a</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>ab</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>abb</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>abbb</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>&#8230;&#8230;。所以，</a></span><span style="font-size: 12pt;"><a>*</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>表示前面字符可以有零次或多次。如果仅仅考虑查找，直接用</a></span><span style="font-size: 12pt;"><a>"a"</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>也一样。但想想替换的情况。</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>问题</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>regEx="abb*"</a></span><span style="font-size: 12pt; color: #333333; font-family: 宋体;"><a>结果如何？</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>②</a></span><span style="font-size: 12pt;"><a>"ab+"</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>——能匹配</a></span><span style="font-size: 12pt;"><a>ab</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>abb</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>abbb</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>&#8230;&#8230;。等价于</a></span><span style="background: #d9d9d9 none repeat scroll 0% 50%; font-size: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #333333;"><a>"abb*"</a></span><span style="font-size: 12pt; color: #333333; font-family: 宋体;"><a>。</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>问题</a></span><span style="font-size: 12pt;"><a>regEx="or+"</a></span><span style="font-size: 12pt; color: #333333; font-family: 宋体;"><a>结果如何？</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;"><a>③</a></span><span style="font-size: 12pt;"><a>"or?"</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>——能匹配</a></span><span style="font-size: 12pt;"><a>o</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>和</a></span><span style="font-size: 12pt;"><a>or</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>。</a></span><span style="font-size: 12pt;"><a>? </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>表示前面字符可以有零次或一次。</a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 12pt; font-family: 宋体;"><a>这些限定符</a></span><span style="font-size: 12pt;"><a>*</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>+</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>、</a></span><span style="font-size: 12pt;"><a>?</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>方便地表示了其前面字符</a></span><span style="font-size: 12pt;"><a>(</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>子串</a></span><span style="font-size: 12pt;"><a>)</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>出现的次数（我们用</a></span><span style="font-size: 12pt;"><a>{}</a></span><span style="font-size: 12pt; font-family: 宋体;"><a>来描述）：</a></span></p>
<div align="center">
<table style="border: medium none ; margin: auto auto auto 63pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; background-color: transparent;" valign="top">
            <p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;">x*</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background-color: transparent;" valign="top">
            <p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">零次或多次</span><span style="font-size: 12pt; font-family: 宋体;">&#8801;{0,}</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt;"  100%="" border="0" align="center">
            <br />
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/179862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 23:09 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>File　Class</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179861.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179861.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179861.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179861.html</trackback:ping><description><![CDATA[ 1.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;class　File对象描述了所指定路径下的文件和目录的信息。通过File对象，可以查看某个路径下的文件和目录信息，并可操作路径下的文件和目录。<br />
2.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;class　File的应用<br />
2.1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 查看（查询）某个路径下的文件信息。<br />
2.1.1&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; class　File的构造函数<br />
class
File有两类构造函数，一类带有一个参数，用于产生一个描述参数所所指向的路径下的文件系统的对象；另一类带有两数，第一个参数表示路径，第二个参数
表示子目录，用来产生描述第一个参数所指向的路径下的某个子目录的文件信息，子目录名称由第二个参数指定。如：<br />
File path = new File(&#8220;c:""&#8221;);产生一个描述c:"下的文件信息的对象<br />
File path = new File(&#8220;c:""&#8221;, &#8220;test&#8221;);产生一个描述c:"的test子目录的文件信息的对象。<br />
2.1.2&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; list()和list(FilenameFilter filter)函数<br />
1)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;list()函数以String数组的形式返回一个File对象所描述的文件信息。返回的是路径下的所有文件和目录的文件名和目录名。<br />
2)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;list(FilenameFilter filter)函数则提供了查询功能，通过它可能查询出满足特定条件的文件名和目录名。<br />
2.1.3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 用FinenameFilter接口进行文件或目录的查询<br />
2.1.3.1.&nbsp;&nbsp;
这个接口只包含一个函数：boolean accept(File dir, String
name)，第二个参数代表一个文件或目录的名称，第一个参数代表文件或目录所在的目录的名称。当返回true，表示文件满足查询条件，要被放入结果中；
否则，表示文件不满足要求。<br />
2.1.3.2.&nbsp;&nbsp;工作原理<br />
当调用某个File对象的list(FilenameFilter
filter)函数时，
会对File对象中的每一个文件或目录调用参数filter中的accept()方法。在对一个文件或目录调用accept()函数时把它的名称以及一个
描述它所在的目录的File对象作为参数传给accept()函数。<br />
2.1.4&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 一个简单的实例<br />
import java.io.File;<br />
import java.io.FilenameFilter;<br />
class DirList{<br />
&nbsp;&nbsp;&nbsp; public void printFile(String dir, String filter){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File path = new File(dir);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[] fileList;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(filter.length()==0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(""nAll file:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileList = path.list();　//取得所有文件信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
System.out.println(""nAll file including " + filter);<br />
//取得满足查询条件的文件信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileList = path.list(new DirFilter(filter));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;fileList.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fileList[i]);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void printFile(String dir){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printFile(dir, "");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
class DirFilter implements FilenameFilter{<br />
&nbsp;&nbsp;&nbsp; String afn;　//存放查询条件<br />
DirFilter(String afn) { this.afn = afn; }<br />
//满足查询条件，返回true<br />
&nbsp;&nbsp;&nbsp; public boolean accept(File dir, String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return name.indexOf(afn)!=-1;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
public class TestIO{<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DirList dirList = new DirList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示F:"test下的文件信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirList.printFile("F:""test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示F:"test下名称包含&#8220;.rar&#8221;文件信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirList.printFile("F:""test", ".rar");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示F:"test下名称包含&#8220;r&#8221;文件信息<br />
dirList.printFile("F:""test", "r");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
这个只是一个简单的例子，只要完善accept()函数，你也可以做出一个Java版的dir命令来。<br />
2.2&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 当然，我们还能通过File来文件或目录进行创建、删除和改名的操作。<br />
import java.io.File;<br />
import java.io.FilenameFilter;<br />
import java.util.Date;<br />
import java.text.SimpleDateFormat;<br />
class DirFilter implements FilenameFilter{<br />
&nbsp;&nbsp;&nbsp; String afn;<br />
&nbsp;&nbsp;&nbsp; DirFilter(String afn) { this.afn = afn; }<br />
&nbsp;&nbsp;&nbsp; public boolean accept(File dir, String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return name.indexOf(afn)!=-1;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
class OptFile{<br />
&nbsp;&nbsp;&nbsp; public static String getAbsolutePath(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.getAbsolutePath();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static String getPath(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.getParent();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static String getName(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.getName();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static long getLength(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.length();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static String getParent(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.getParent();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static String getLastModified(File f, String format){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(format.equals("ymdh"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sdf = new SimpleDateFormat("yyyy-MM-dd hh");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(format.equals("ymdhm"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sdf.format((new Date(f.lastModified())));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static String getLastModified(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getLastModified(f, "ymd");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean canRead(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.canRead();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean canWrite(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.canWrite();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean isFile(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.isFile();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean isDir(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.isDirectory();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean rename(File oldName, File newName){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return oldName.renameTo(newName);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean delete(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.delete();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static boolean mkdir(File f){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f.mkdirs();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 从指定路径中查询文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public static File[] findFile(String filePath, String fileName){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File f = new File(filePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[] result = f.listFiles(new DirFilter(fileName));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static void printFileAtt(File f){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" Absolute path: " + getAbsolutePath(f) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n Can read: " + canRead(f) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n Can write: " + canWrite(f) +&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n path: " + getPath(f) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n name: " + getName(f) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n parent: " + getParent(f) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n length: " + getLength(f) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n lastModified: " + getLastModified(f));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isFile(f))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(" it's a file");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(isDir(f))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(" it's a directory");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
public class TestIO{<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File f1 = new File("F:""nepalon""thinkinginjava""test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File f2 = new File("F:""nepalon""thinkinginjava""test""aa ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OptFile.printFileAtt(f1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OptFile.printFileAtt(f2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当对文件或目录进行改名，且更新到一个不同的下时，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//会先把文件或整个目录剪切到新目录下，再重新命名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File nf2 = new File("F:""nepalon""thinkinginjava""使用log4j.files");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(OptFile.rename(f2, nf2)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("after rename f2:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OptFile.printFileAtt(nf2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("rename nf2 failly");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//进行删除操作时，只能删除文件；如果删除的是目录，会返回false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File df = new File("F:""nepalon""thinkinginjava""test""1001.doc");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(OptFile.delete(df))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Delete df successfully");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Delete df failly");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Find file with name ""1001""");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OptFile.findFile("F:""nepalon""thinkinginjava""test", "1001");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File mf = new File("F:""nepalon""thinkinginjava""test""1001");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(OptFile.mkdir(mf))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("create directory mf successfully");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("create directory mf failly");<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<img src ="http://www.blogjava.net/libin2722/aggbug/179861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 23:08 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringBuffer类型</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179860.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179860.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179860.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179860.html</trackback:ping><description><![CDATA[<span style="color: darkblue;">描述：在实际应用中，经常回遇到对字符串进行动态修改。这时候，String类的功能受到限制，而StringBuffer类可以完成字符串的动态添加、插入和替换等操作。 <br />
<br />
<span style="color: blue;">１、构造函数。</span> <br />
<ul>StringBuffer() ：构造一个没有任何字符的StringBuffer类。 <br />
    StringBuffer(int length) ： ：构造一个没有任何字符的StringBuffer类，并且，其长度为length。 <br />
    StringBuffer(String str) ：以str为初始值构造一个StringBuffer类。</ul>
    <br />
    <br />
    <span style="color: blue;">２、方法。</span> <br />
    <span style="color: red;">说明： <br />
    1. 所有方法均为public； <br />
    2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span><span style="color: olive;"> <br />
    如： <br />
    static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span> <br />
    <br />
    <ul>1. StringBuffer append(boolean b) <br />
        2. StringBuffer append(char c) <br />
        3. StringBuffer append(char[] str) <br />
        4. StringBuffer append(char[] str, int offset, int len) <br />
        5. StringBuffer append(double d) <br />
        6. StringBuffer append(float f) <br />
        7. StringBuffer append(int i) <br />
        8. StringBuffer append(long l) <br />
        9. StringBuffer append(Object obj) <br />
        10. StringBuffer append(String str) <br />
        11. StringBuffer append(StringBuffer sb) <br />
        以上的方法都是向字符串缓冲区&#8220;追加&#8221;元素，但是，这个&#8220;元素&#8221;参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度，Java将自动进行扩充。</ul>
        <br />
        </span>
        <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
            <tbody>
                <tr>
                    <td><strong>代码:</strong></td>
                </tr>
                <tr>
                    <td>&nbsp; &nbsp;&nbsp; &nbsp;String question = new String("1+1="); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;int answer = 3; <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;boolean result = (1+1==3); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp; <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb = new StringBuffer(); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;sb.append(question); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;sb.append(answer); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;sb.append('"t'); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;sb.append(result); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp; <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;System.out.println(sb); <br />
                    结果为： <br />
                    1+1=3&nbsp; &nbsp;false</td>
                </tr>
            </tbody>
        </table>
        <span><br />
        <ul>12. int capacity() ：返回当前StringBuffer对象（字符串缓冲区）的总空间，而非字符号串的长度。 <br />
            13. char charAt(int index) ：在当前StringBuffer对象中取索引号为index的字符。第一个字符的索引为&#8220;0&#8221; <br />
            14. StringBuffer delete(int start, int end) ：删除当前StringBuffer对象中以索引号start开始，到end结束的子串。 <br />
            15. StringBuffer deleteCharAt(int index) ：删除当前StringBuffer对象中索引号为index的字符。 <br />
            16.
            void ensureCapacity(int minimumCapacity)
            ：重新设置字符号串缓冲区的总空间。如果minimumCapacity大于当前的总空间，则新的空间被设置：一种结果是
            minimumCapacity；另一种结果是{&#8220;老空间&#8221;乘2加2}。</ul>
            <br />
            </span>
            <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
                <tbody>
                    <tr>
                        <td><strong>代码:</strong></td>
                    </tr>
                    <tr>
                        <td>&nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb1 = new StringBuffer(5); <br />
                        &nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb2 = new StringBuffer(5); <br />
                        &nbsp; &nbsp;&nbsp; &nbsp; <br />
                        &nbsp; &nbsp;&nbsp; &nbsp;sb1.ensureCapacity(6); <br />
                        &nbsp; &nbsp;&nbsp; &nbsp;sb2.ensureCapacity(100); <br />
                        &nbsp; &nbsp;&nbsp; &nbsp; <br />
                        &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "sb1.Capacity: " + sb1.capacity() ); <br />
                        &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "sb2.Capacity: " + sb2.capacity() ); <br />
                        结果为： <br />
                        sb1.Capacity: 12 <br />
                        sb2.Capacity: 100</td>
                    </tr>
                </tbody>
            </table>
            <span><br />
            <ul>17. void getChars(int srcBegin, int srcEnd, char[] dst, int
                dstBegin)
                ：从当前StringBuffer对象的索引号srcBegin开始，到srcEnd结束的子串，赋值到字符数组dst中，并且从dst的索引号
                dstBegin开始。</ul>
                <br />
                </span>
                <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
                    <tbody>
                        <tr>
                            <td><strong>代码:</strong></td>
                        </tr>
                        <tr>
                            <td>&nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb = new StringBuffer("I love her!"); <br />
                            &nbsp; &nbsp;&nbsp; &nbsp;char[] i = {'I',' ','l','o','v','e',' ','y','o','u'}; <br />
                            &nbsp; &nbsp;&nbsp; &nbsp; <br />
                            &nbsp; &nbsp;&nbsp; &nbsp;sb.getChars(7,10,i,7); <br />
                            &nbsp; &nbsp;&nbsp; &nbsp; <br />
                            &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "sb: " + sb ); <br />
                            结果为：sb: I love her!</td>
                        </tr>
                    </tbody>
                </table>
                <span><br />
                <ul>18. int indexOf(String str) ：返回当前StringBuffer对象中，第一个满足str子串的位置。 <br />
                    19. int indexOf(String str, int fromIndex) ：从当前StringBuffer对象的fromIndex开始查找，返回第一个满足str子串的位置。 <br />
                    20. StringBuffer insert(int offset, boolean b) <br />
                    21. StringBuffer insert(int offset, char c) <br />
                    22. StringBuffer insert(int offset, char[] str) <br />
                    23. StringBuffer insert(int index, char[] str, int offset, int len) <br />
                    24. StringBuffer insert(int offset, double d) <br />
                    25. StringBuffer insert(int offset, float f) <br />
                    26. StringBuffer insert(int offset, int i) <br />
                    27. StringBuffer insert(int offset, long l) <br />
                    28. StringBuffer insert(int offset, Object obj) <br />
                    29. StringBuffer insert(int offset, String str) <br />
                    以上的方法都是在当前StringBuffer对象中插入一个元素，在索引号offset处插入相应的值。 <br />
                    30. int lastIndexOf(String str) ：返回当前StringBuffer对象中，最后一个满足str子串的位置。 <br />
                    31. int lastIndexOf(String str, int fromIndex) ：从当前StringBuffer对象的fromIndex开始查找，返回最后一个满足str子串的位置。 <br />
                    32. int length() ：返回当前StringBuffer对象（字符缓冲区）中，字符串的长度。<span style="color: red;">注意：此方法与capacity() 不同。</span><br />
                    33. StringBuffer replace(int start, int end, String str) ：替换当前StringBuffer对象的字符串。从start开始，到end结束的位置替换成str。 <br />
                    34. StringBuffer reverse() ：将字符串翻转。</ul>
                    <br />
                    </span>
                    <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
                        <tbody>
                            <tr>
                                <td><strong>代码:</strong></td>
                            </tr>
                            <tr>
                                <td>&nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb = new StringBuffer("0123456789"); <br />
                                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "sb.reverse(): " + sb.reverse() ); <br />
                                结果为：sb.reverse(): 9876543210</td>
                            </tr>
                        </tbody>
                    </table>
                    <span><br />
                    <ul>35. void setCharAt(int index, char ch) ：设置索引号index的字符为ch。 <br />
                        36. void setLength(int newLength) ：重新设置字符串缓冲区中字符串的长度，如果newLength小于当前的字符串长度，将截去多余的字符。</ul>
                        <br />
                        </span>
                        <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
                            <tbody>
                                <tr>
                                    <td><strong>代码:</strong></td>
                                </tr>
                                <tr>
                                    <td>&nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb = new StringBuffer("0123456789"); <br />
                                    &nbsp; &nbsp;&nbsp; &nbsp;sb.setLength(5); <br />
                                    &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "sb: " + sb ); <br />
                                    结果为：sb: 01234</td>
                                </tr>
                            </tbody>
                        </table>
                        <span><br />
                        <ul>37. String substring(int start) ：取当前StringBuffer对象中，从start开始到结尾的子串。 <br />
                            38. String substring(int start, int end) ：取当前StringBuffer对象中，从start开始到end的子串。 <br />
                            39. String toString() ：将当前StringBuffer对象转换成String对象。</ul>
                            </span>
<img src ="http://www.blogjava.net/libin2722/aggbug/179860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 23:07 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizer：字符串分隔解析类型</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179859.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179859.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179859.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179859.html</trackback:ping><description><![CDATA[<span style="color: indigo;">属于：java.util包。 <br />
<br />
<span style="color: blue;">１、构造函数。</span> <br />
<ul><br />
    1. <span style="color: green;">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是&#8220;空格&#8221;、&#8220;制表符(&#8216;"t&#8217;)&#8221;、&#8220;换行符(&#8216;"n&#8217;)&#8221;、&#8220;回车符(&#8216;"r&#8217;)&#8221;。 <br />
    2. <span style="color: green;">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。 <br />
    3. <span style="color: green;">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。</ul>
    <br />
    <br />
    <span style="color: blue;">２、方法。</span> <br />
    <span style="color: red;">说明： <br />
    1. 所有方法均为public； <br />
    2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span><span style="color: olive;"> <br />
    如： <br />
    static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span> <br />
    <br />
    <ul>1. <span style="color: green;">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。 <br />
        2. <span style="color: green;">boolean hasMoreTokens() </span>：返回是否还有分隔符。 <br />
        3. <span style="color: green;">boolean hasMoreElements() </span>：结果同2。 <br />
        4. <span style="color: green;">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。 <br />
        5. <span style="color: green;">Object nextElement() </span>：结果同4。 <br />
        6. <span style="color: green;">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。</ul>
        <br />
        <br />
        <span style="color: olive;">例子：</span> <br />
        </span>
        <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
            <tbody>
                <tr>
                    <td><strong>代码:</strong></td>
                </tr>
                <tr>
                    <td>&nbsp; &nbsp;&nbsp; &nbsp;String s = new String("The Java platform is the ideal platform for network computing"); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;StringTokenizer st = new StringTokenizer(s); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "Token Total: " + st.countTokens() ); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;while( st.hasMoreElements() ){ <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println( st.nextToken() ); <br />
                    } <br />
                    结果为： <br />
                    Token Total: 10 <br />
                    The <br />
                    Java <br />
                    platform <br />
                    is <br />
                    the <br />
                    ideal <br />
                    platform <br />
                    for <br />
                    network <br />
                    computing <br />
                    </td>
                </tr>
            </tbody>
        </table>
        <br />
        <span style="color: olive;">例2: <br />
        </span>
        <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
            <tbody>
                <tr>
                    <td><strong>代码:</strong></td>
                </tr>
                <tr>
                    <td>&nbsp; &nbsp;&nbsp; &nbsp;String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing"); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;StringTokenizer st = new StringTokenizer(s,"=",true); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;System.out.println( "Token Total: " + st.countTokens() ); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;while( st.hasMoreElements() ){ <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println( st.nextToken() ); <br />
                    &nbsp; &nbsp;&nbsp; &nbsp;} <br />
                    结果为： <br />
                    Token Total: 19 <br />
                    The <br />
                    = <br />
                    Java <br />
                    = <br />
                    platform <br />
                    = <br />
                    is <br />
                    = <br />
                    the <br />
                    = <br />
                    ideal <br />
                    = <br />
                    platform <br />
                    = <br />
                    for <br />
                    = <br />
                    network <br />
                    = <br />
                    computing </td>
                </tr>
            </tbody>
        </table>
<img src ="http://www.blogjava.net/libin2722/aggbug/179859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 23:06 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Random：随机类型</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179858.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179858.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179858.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179858.html</trackback:ping><description><![CDATA[<span style="color: indigo;">属于包：java.util.Random</span>&nbsp;<br />
<br />
<br />
<br />
<span style="color: blue;">１、属性。</span> <br />
<br />
无。 <br />
<br />
<span style="color: blue;">２、构造函数。</span> <br />
<br />
<span style="color: green;">Random()</span> ：创建一个新的随机数发生器。 <br />
<br />
<span style="color: green;">Random(long seed) </span>：用一个种子（长整型）创建一个随机数发生器。 <br />
<br />
<span style="color: blue;">３、方法。</span> <br />
<span style="color: red;">说明： <br />
1. 所有方法均为public； <br />
2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span><span style="color: olive;"> <br />
如： <br />
static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span> <br />
<br />
<br />
<ul>1. <span style="color: green;">protected int next(int bits) </span>：产生下一个伪随机数。 <br />
    <br />
    2. <span style="color: green;">boolean nextBoolean() </span>：返回下一个从随机发生器的系列中得到的均匀分布的布尔值。 <br />
    <br />
    3. <span style="color: green;">void nextBytes(byte[] bytes) </span>：产生随机字节数组放到指定的数组中。 <br />
    <br />
    4. <span style="color: green;">double nextDouble() </span>：返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的双精度类型值。 <br />
    <br />
    5. <span style="color: green;">float nextFloat() </span>：返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的浮点类型值。 <br />
    <br />
    6. <span style="color: green;">double nextGaussian()</span> ：返回下一个从随机发生器的系列中得到的符合均匀分布的0.0的平均数到1.0方差的高斯分布双精度类型值。 <br />
    <br />
    7. <span style="color: green;">int nextInt() </span>：返回下一个从随机发生器的系列中得到的均匀分布的整型值。 <br />
    <br />
    8. <span style="color: green;">int nextInt(int n) </span>：返回下一个从随机发生器的系列中得到的均匀分布的0到指定整型数（n）之间的整型值。 <br />
    <br />
    9. <span style="color: green;">long nextLong() </span>：返回下一个从随机发生器的系列中得到的均匀分布的长整型值。 <br />
    <br />
    10. <span style="color: green;">void setSeed(long seed) </span>：设置随机数发生器的种子为一个长整型数。</ul>
    <br />
    <br />
    <span style="color: red;">关于种子的描述：</span> <br />
    这个类的对象使用一个48位的种子， <br />
    如果这个类的两个实例是用同一个种子创建的， <br />
    并且，各自对它们以同样的顺序调用方法， <br />
    则它们会产生相同的数字序列。 <br />
    <br />
    下面就对上面的介绍做一个实验， <br />
    尤其注意相同种子时的结果， <br />
    <span style="color: brown;">如果用默认的构造函数构造对象， <br />
    他们是属于同一个种子的。</span> <br />
    <br />
    <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
        <tbody>
            <tr>
                <td><strong>代码:</strong></td>
            </tr>
            <tr>
                <td>import java.util.Random; <br />
                <br />
                public class TestRandom{ <br />
                &nbsp; &nbsp;public static void main(String[] args){ <br />
                &nbsp; &nbsp;&nbsp; &nbsp;Random r1 = new Random(50); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("第一个种子为50的Random对象"); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r1.nextBoolean():"t" + r1.nextBoolean()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r1.nextInt():"t"t" + r1.nextInt()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r1.nextDouble():"t" + r1.nextDouble()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r1.nextGaussian():"t" + r1.nextGaussian()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("---------------------------"); <br />
                &nbsp; &nbsp;&nbsp; &nbsp; <br />
                &nbsp; &nbsp;&nbsp; &nbsp;Random r2 = new Random(50); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("第二个种子为50的Random对象"); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r2.nextBoolean():"t" + r2.nextBoolean()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r2.nextInt():"t"t" + r2.nextInt()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r2.nextDouble():"t" + r2.nextDouble()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r2.nextGaussian():"t" + r2.nextGaussian()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("---------------------------"); <br />
                &nbsp; &nbsp;&nbsp; &nbsp; <br />
                &nbsp; &nbsp;&nbsp; &nbsp;Random r3 = new Random(100); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("种子为100的Random对象"); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r3.nextBoolean():"t" + r3.nextBoolean()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r3.nextInt():"t"t" + r3.nextInt()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r3.nextDouble():"t" + r3.nextDouble()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("r3.nextGaussian():"t" + r3.nextGaussian()); <br />
                &nbsp; &nbsp;&nbsp; &nbsp; <br />
                &nbsp; &nbsp;&nbsp; &nbsp;System.out.println("结果一目了然！"); <br />
                &nbsp; &nbsp;} <br />
                }</td>
            </tr>
        </tbody>
    </table>
    <br />
    结果： <br />
    <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
        <tbody>
            <tr>
                <td><strong>代码:</strong></td>
            </tr>
            <tr>
                <td><br />
                第一个种子为50的Random对象 <br />
                r1.nextBoolean():&nbsp; &nbsp; &nbsp; &nbsp;true <br />
                r1.nextInt():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-1727040520 <br />
                r1.nextDouble():&nbsp; &nbsp; &nbsp; &nbsp; 0.6141579720626675 <br />
                r1.nextGaussian():&nbsp; &nbsp; &nbsp; 2.377650302287946 <br />
                --------------------------- <br />
                第二个种子为50的Random对象 <br />
                r2.nextBoolean():&nbsp; &nbsp; &nbsp; &nbsp;true <br />
                r2.nextInt():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-1727040520 <br />
                r2.nextDouble():&nbsp; &nbsp; &nbsp; &nbsp; 0.6141579720626675 <br />
                r2.nextGaussian():&nbsp; &nbsp; &nbsp; 2.377650302287946 <br />
                --------------------------- <br />
                种子为100的Random对象 <br />
                r3.nextBoolean():&nbsp; &nbsp; &nbsp; &nbsp;true <br />
                r3.nextInt():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-1139614796 <br />
                r3.nextDouble():&nbsp; &nbsp; &nbsp; &nbsp; 0.19497605734770518 <br />
                r3.nextGaussian():&nbsp; &nbsp; &nbsp; 0.6762208162903859 </td>
            </tr>
        </tbody>
    </table>
<img src ="http://www.blogjava.net/libin2722/aggbug/179858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 23:03 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Double：双精度类型</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179857.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179857.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179857.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179857.html</trackback:ping><description><![CDATA[<span style="color: blue;">１、属性。 <br />
<br />
<ul><br />
    1. <span style="color: green;">static Double MAX_VALUE</span> ： 返回最大双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7fefffffffffffffL)计算得出。 <br />
    2. <span style="color: green;">static Double MIN_VALUE</span> ： 返回最小双精度数，在不同硬件平台中由Double.longBitsToDouble(0x1L)计算得出。 <br />
    3. <span style="color: green;">static Double NaN </span>： 表示非数值类型的双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7ff8000000000000L)计算得出。 <br />
    4. <span style="color: green;">static Double NEGATIVE_INFINITY</span>：返回负无穷双精度数，在不同硬件平台中由Double.longBitsToDouble(0xfff0000000000000L)计算得出。 <br />
    5. <span style="color: green;">static Double POSITIVE_INFINITY </span>：返回正无穷双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7ff0000000000000L)计算得出。 <br />
    6. <span style="color: green;">static Class TYPE</span> ：返回当前类型。</ul>
    <br />
    <span style="color: blue;">２、构造函数。</span> <br />
    <br />
    <ul><span style="color: green;">Double(double value)</span> ：以double类型为参数创建Double对象。 <br />
        <span style="color: green;">Double(String s)</span> ：以String类型为参数创建String对象。</ul>
        <br />
        <span style="color: blue;">３、方法。</span> <br />
        <span style="color: red;">说明： <br />
        1. 所有方法均为public； <br />
        2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span><span style="color: olive;"> <br />
        如： <br />
        static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span> <br />
        <br />
        <ul><br />
            1. <span style="color: green;">byte byteValue()</span> ：返回以字节表示的双精度数。 <br />
            2. <span style="color: green;">static int compare(double d1, double d2) </span>：此为类方法，比较d1和d2。相当于new Double(d1).compareTo(new Double(d2))。如果d1与d2相等，返回０；小于关系，返回负数；大于关系，返回正数。 <br />
            3. <span style="color: green;">int compareTo(Double anotherDouble)</span> ：此为对象方法，当前对象与anotherDouble比较。与2的比较规则相同。 <br />
            4. <span style="color: green;">int compareTo(Object o)</span> ：当前对象与o进行比较，如果o属于Double类，那么，相当于3；如果是其他类，则抛出ClassCastException异常。 <br />
            5. <span style="color: green;">static long doubleToLongBits(double value) </span>：把value按照IEEE 754转化成long并输出它的十进制数值。 <br />
            6. <span style="color: green;">double doubleValue() </span>：返回该双精度数对象的双精度数值。 <br />
            7. <span style="color: green;">boolean equals(Object obj) </span>：比较当前Double对象与obj的内容是否相同。大多数情况是比较两个Double对象的值是否相等，相当于d1.doubleValue() == d2.doubleValue()的值。 <br />
            8. <span style="color: green;">float floatValue()</span> ：返回该浮点数对象的浮点数值。 <br />
            9. <span style="color: green;">int hashCode() </span>：返回该Double对象的哈希表码。 <br />
            10. <span style="color: green;">int intValue()</span> ：返回该Double对象的整数值（整数部分）。 <br />
            11. <span style="color: green;">boolean isInfinite()</span> ：判断该Double对象是否是无穷。 <br />
            12. <span style="color: green;">static boolean isInfinite(double v) </span>：与11类似，不同的是：此为类方法，判断的是v。 <br />
            13. <span style="color: green;">boolean isNaN()</span> ：判断该Double对象是否为非数值。 <br />
            14. <span style="color: green;">static boolean isNaN(double v) </span>：功能与13一样，只不过判断v。 <br />
            15. <span style="color: green;">long longValue()</span> ：返回该Double对象的长整数值。 <br />
            16. <span style="color: green;">static float parseFloat(String s) </span>：将字符串转换成双精度数。 <br />
            17. <span style="color: green;">short shortValue()</span> ：返回该Double对象的短整数值。 <br />
            18. <span style="color: green;">String toString()</span> ：将该Double对象转换成字符串。 <br />
            19. <span style="color: green;">static String toString(Double f)</span> ：功能与18一样，只是转换f。 <br />
            20. <span style="color: green;">static Double valueOf(String s)</span> ：将字符串转换成双精度数。</ul>
            </span>
<img src ="http://www.blogjava.net/libin2722/aggbug/179857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 23:02 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整理一个ANT在J2EE项目中的应用</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179856.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179856.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179856.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179856.html</trackback:ping><description><![CDATA[<p><span style="font-size: 12pt; color: #000080;">首先，假设我们的项目的结构如下 ${project.root}<br />
&nbsp; |<br />
&nbsp; +-- build/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- WAR/EAR档的目录<br />
&nbsp; +-- classes/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- 编译的输出目录，与JBuilder兼容<br />
&nbsp; +-- src/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- Java源文件目录<br />
&nbsp; +-- web/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- WEB Content 目录<br />
&nbsp; |&nbsp;&nbsp;&nbsp; |<br />
&nbsp; |&nbsp;&nbsp;&nbsp; +--pages/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- JSP 文件目录<br />
&nbsp; |&nbsp;&nbsp;&nbsp; +--WEB-INF/&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- web.xml 等配置文件<br />
&nbsp; +-- ejb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- EJB Content 目录<br />
&nbsp; |&nbsp;&nbsp;&nbsp; |<br />
&nbsp; |&nbsp;&nbsp;&nbsp; +---INF/&nbsp;&nbsp;&nbsp; &lt;-- EJB 配置文件<br />
&nbsp; +-- ear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- EAR Content 目录<br />
&nbsp; |&nbsp;&nbsp;&nbsp; |<br />
&nbsp; |&nbsp;&nbsp;&nbsp; +---INF/&nbsp;&nbsp;&nbsp; &lt;-- EAR 配置文件<br />
&nbsp; |-- lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- 项目所要用到的library </span></p>
<p><span style="font-size: 12pt; color: #000080;">接下来第一步，就是要先定义好一些全局的参数，以便以后更改起来方便，风格<br />
大家自己选择好了，我用的是如下的方式：</span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(1) 给出项目的目录：<br />
&nbsp;
&lt;!--// project directories //--&gt;&lt;property name="dir.project"
="D:/Code/MyProject"/&gt;&lt;property name="dir.project.lib"
="${dir.project}/lib"/&gt;&lt;property name="dir.project.src"
="${dir.project}/src"/&gt;&lt;property name="dir.project.web_module"
="${dir.project}/web"/&gt;&lt;property name="dir.project.ejb_module"
="${dir.project}/ejb"/&gt;&lt;property name="dir.project.ear_module"
="${dir.project}/ear"/&gt;&lt;!--// compile, build and deploy
directories //--&gt;&lt;property name="dir.project.compile"
="${dir.project}/classes"/&gt;&lt;property
name="dir.project.compile.jspcache"
="${dir.project.compile}/jspcache"/&gt;&lt;property
name="dir.project.build" ="${dir.project}/build"/&gt;&lt;!--// J2EE
Container //--&gt;&lt;property name="dir.appserver.tomcat.home"
="D:/J2EE_HOME/AppServer/Tomcat"/&gt;&lt;property
name="dir.appserver.oc4j.j2ee.home"
="D:/J2EE_HOME/AppServer/OC4J/j2ee/home"/&gt;<br />
&nbsp;</span></span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(2) 定义Java Source的编译选项<br />
&lt;!--//
Java compiler options //--&gt; &lt;property name="opt.compile.source"
="1.4"/&gt;&lt;property name="opt.compile.target"
="1.4"/&gt;&lt;property name="opt.compile.encoding"
="UTF-8"/&gt;&lt;property name="opt.compile.deprecation"
="on"/&gt;&lt;property name="opt.compile.debug" ="on"/&gt;&lt;property
name="opt.compile.optimize" ="off"/&gt;<br />
&nbsp;</span></span></p>
<p><span style="font-size: 12pt; color: #000080;">(3) 如果需要 import EJB library 的话，给出下面的定义，后面会用到<br />
&nbsp;&nbsp;&nbsp; &lt;!--// EJB imported resource //--&gt;&lt;property name="import.ejb.report.server" ="${dir.project.lib}/Appwork.jar"/&gt;<br />
&nbsp;</span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(4) 给出部署WAR/EAR文件的名称：<br />
&nbsp;
&lt;!--// Deployment //--&gt;&lt;property name="deploy.file.ejb_module"
="MyApp_EJB.jar" /&gt;&lt;property name="deploy.file.web_module"
="MyApp_WEB.war" /&gt;&lt;property name="deploy.file.ear_module"
="MyApp.ear" /&gt;<br />
&nbsp;</span></span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(5) 给出CLASSPATH的定义，引入相关的Library和项目编译生成的Java Classes<br />
&nbsp;
&lt;path id="CLASSPATH"&gt;&lt;!--// Tomcat Libraries
//--&gt;&lt;fileset dir="${dir.appserver.tomcat.home}/bin"&gt;
&lt;include name="*.jar"/&gt;&lt;/fileset&gt; &lt;fileset
dir="${dir.appserver.tomcat.home}/server/lib"&gt; &lt;include
name="*.jar"/&gt; &lt;/fileset&gt; &lt;fileset
dir="${dir.appserver.tomcat.home}/common/lib"&gt; &lt;include
name="*.jar"/&gt; &lt;/fileset&gt; &lt;!--// Depended Libraries
//--&gt;&lt;pathelement
location="${dir.project.lib}/abc.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/AppServer.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/AppServiceClient.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/AppUtil.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/xport.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/jaxen-full.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/jstl.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/log4j-1.2.13.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/ojdbc14.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/saxpath.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/standard.jar"/&gt;&lt;pathelement
location="${dir.project.lib}/taglibs-log.jar"/&gt;&lt;!--// Project
classes //--&gt;&lt;pathelement
location="${dir.project.compile}"/&gt;&lt;/path&gt;<br />
&nbsp;</span></span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(6) 基本的clean和init的task<br />
&nbsp;
&lt;target name="clean"&gt;&lt;delete
dir="${dir.project.build}"/&gt;&lt;delete
dir="${dir.project.compile.jspcache}"/&gt;&lt;delete
dir="${dir.project.compile}"/&gt;&lt;delete
dir="${dir.project.web_module}/WEB-INF/classes"/&gt;&lt;delete
dir="${dir.project.web_module}/WEB-INF/lib"/&gt;&lt;/target&gt;&lt;target
name="init"&gt;&lt;mkdir dir="${dir.project.compile}"/&gt;&lt;mkdir
dir="${dir.project.compile.jspcache}"/&gt;&lt;mkdir
dir="${dir.project.web_module}/WEB-INF/classes"/&gt;&lt;mkdir
dir="${dir.project.web_module}/WEB-INF/lib"/&gt;&lt;mkdir
dir="${dir.project.build}"/&gt;&lt;/target&gt;<br />
&nbsp;</span></span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(7) 编译Java Source<br />
&lt;target
name="src_compile" depends="init"&gt;&lt;!--// compile the Java source
//--&gt;&lt;javac srcdir="${dir.project.src}"
destdir="${dir.project.compile}" encoding="${opt.compile.encoding}"
source="${opt.compile.source}" target="${opt.compile.source}"
deprecation="${opt.compile.deprecation}"debug="${opt.compile.debug}"
optimize="{opt.compile.optimize}" &gt;&lt;classpath
refid="CLASSPATH"/&gt;&lt;include
name="**/*.java"/&gt;&lt;/javac&gt;&lt;!--// copy the classpath
resources //--&gt;&lt;copy
todir="${dir.project.compile}"&gt;&lt;fileset
dir="${dir.project.src}"&gt;&lt;exclude
name="**/*.java"/&gt;&lt;/fileset&gt;&lt;/copy&gt; &lt;/target&gt;<br />
&nbsp;</span></span></p>
<p><span><span style="font-size: 12pt; color: #000080;">(8) 预编译JSP文件，可选择基于Tomcat或是Oracle Application Server<br />
&nbsp;
&lt;!--// for Tomcat //--&gt; &lt;target name="jsp_src_generate"
depends="src_compile"&gt;&lt;taskdef classname="org.apache.jasper.JspC"
name="jasper2"&gt;&lt;classpath refid="CLASSPATH"/&gt;
&lt;/taskdef&gt;&lt;jasper2 validateXml="false"
verbose="9"uriroot="${dir.project.web_module}"
outputDir="${dir.project.compile.jspcache}"
webXmlFragment="${dir.project.compile.jspcache}/generated-web.xml"
/&gt; &lt;/target&gt;&lt;target name="jsp_src_compile"&gt;&lt;javac
srcdir="${dir.project.compile.jspcache}"
destdir="${dir.project.compile.jspcache}"
encoding="${opt.compile.encoding}" source="${opt.compile.source}"
target="${opt.compile.source}"
deprecation="${opt.compile.deprecation}"debug="${opt.compile.debug}"
optimize="{opt.compile.optimize}" &gt;&lt;classpath
refid="CLASSPATH"/&gt;&lt;include
name="**"/&gt;&lt;/javac&gt;&lt;/target&gt;&lt;target
name="jsp_precompile" depends="src_compile, jsp_src_generate,
jsp_src_compile" /&gt;<br />
&nbsp;</span></span></p>
<span><span style="font-size: 12pt; color: #000080;">(9) 开始进行compile，make 和 build，并生成部署档案<br />
&nbsp;
&lt;target name="compile" depends="src_compile, jsp_precompile"
/&gt;&lt;!--// Build WAR file //--&gt;&lt;target name="make.web_module"
depends="compile"&gt;&lt;war
destfile="${dir.project.build}/${deploy.file.web_module}"
webxml="${dir.project.web_module}/WEB-INF/web.xml"&gt;&lt;fileset
dir="${dir.project.web_module}" &gt;&lt;include
name="**"/&gt;&lt;exclude name="WEB-INF/classes/**"/&gt;&lt;exclude
name="WEB-INF/lib/**"/&gt;&lt;/fileset&gt;&lt;classes
dir="${dir.project.compile}"&gt;&lt;include name="**"/&gt;&lt;exclude
name="project/package/trx/**"/&gt;&lt;exclude
name="jspcache/**"/&gt;&lt;/classes&gt;&lt;lib
dir="${dir.project.lib}"&gt;&lt;include
name="AppUtil.jar"/&gt;&lt;include
name="AppClient.jar"/&gt;&lt;/lib&gt;&lt;/war&gt;&lt;/target&gt;&lt;!--//
Build EJB Jar file //--&gt;&lt;target name="make.ejb_module"
depends="src_compile"&gt;&lt;jar
destfile="${dir.project.build}/${deploy.file.ejb_module}"&gt;&lt;zipgroupfileset
dir="${dir.project.lib}"&gt;&lt;include
name="AppServer.jar"/&gt;&lt;/zipgroupfileset&gt;&lt;fileset
dir="${dir.project.ejb_module}"&gt;&lt;include
name="**"/&gt;&lt;/fileset&gt;&lt;fileset
dir="${dir.project.compile}"&gt;&lt;include name="**"/&gt;&lt;exclude
name="project/package/controller/**"/&gt;&lt;exclude
name="jspcache/**"/&gt;&lt;/fileset&gt;&lt;/jar&gt;&lt;/target&gt;&lt;!--//
Build EAR file //--&gt;&lt;target name="make.ear_module"
depends="compile, make.web_module, make.ejb_module"&gt;&lt;ear
destfile="${dir.project.build}/${deploy.file.ear_module}"
appxml="${dir.project.ear_module}/-INF/application.xml"&gt;&lt;fileset
dir="${dir.project.build}"&gt;&lt;include
name="${deploy.file.web_module}"/&gt;&lt;include
name="${deploy.file.ejb_module}"/&gt;&lt;/fileset&gt;&lt;/ear&gt;&lt;/target&gt;&lt;target
name="make" depends="init, compile, make.web_module, make.ejb_module,
make.ear_module" /&gt;&lt;target name="build" depends="clean, init,
make" /&gt;</span></span>
<img src ="http://www.blogjava.net/libin2722/aggbug/179856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 22:59 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配合ant开发web项目（原创）</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179855.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179855.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179855.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179855.html</trackback:ping><description><![CDATA[<p>引用地址：<a href="http://www.easydone.cn/014/200604110005145285.htm">http://www.easydone.cn/014/200604110005145285.htm</a><br />
<br />
配合ａｎｔ开发ｗｅｂ项目<br />
应用相关说明：<br />
1、ａｎｔ版本：apache-ant-1.6.1<br />
2、eclipse版本：eclipse-SDK-3.0.1-win32<br />
3、j2sdk1.4.2_08<br />
4、jakarta-tomcat-5.0.19<br />
5、mysql<br />
目录结构如下：<br />
</p>
<img src="http://www.easydone.com.cn/html/UploadFile/2006041100061630.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
ａｎｔ具体配置如下<br />
1、"Easydone"project"demo"bin目录下新建build.xml<br />
内容如下：<br />
<br />
&lt;?xml version="1.0"&nbsp; encoding="GB2312" ?&gt;<br />
&lt;project name="Demo-Home" basedir="." default="usage"&gt;
<p>&nbsp;&lt;property name="app.name" ="demo"/&gt;<br />
&nbsp;&lt;property name="app.dir" location="../WebRoot"/&gt;<br />
&nbsp;&lt;property name="webserver.home" location="../../../platform/jakarta-tomcat-5.0.19"/&gt;<br />
&nbsp;&lt;property name="webserver.deploy" location="${webserver.home}/webapps/"/&gt;<br />
&nbsp;&lt;property name="src.dir" location="../src"/&gt;<br />
&nbsp;&lt;property name="build.dir" location="${app.dir}/WEB-INF/classes"/&gt;<br />
&nbsp;&lt;property name="lib.dir" location="${app.dir}/WEB-INF/lib"/&gt;<br />
&nbsp;&lt;property name="dist.dir" location="../dist"/&gt;<br />
&nbsp;&lt;property name="properties.dir" location="${src.dir}/com/easydone/struts/ApplicationResources.properties"/&gt;<br />
&nbsp;&lt;property name="properties_zh.dir" location="${build.dir}/com/easydone/struts/ApplicationResources_zh.properties"/&gt;<br />
&nbsp;&lt;property name="doc.dir" ="../api"/&gt;<br />
&nbsp;&lt;property name="packages" ="com.easydone.*"/&gt;<br />
&nbsp;<br />
&nbsp;&lt;echo&gt;+--------------------------------------------------+&lt;/echo&gt;<br />
&nbsp;&lt;echo&gt;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&lt;/echo&gt;<br />
&nbsp;&lt;echo&gt;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R U N N I N G&nbsp;&nbsp; A N T&nbsp;&nbsp;&nbsp; REPOSITORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&lt;/echo&gt;<br />
&nbsp;&lt;echo&gt;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&lt;/echo&gt;<br />
&nbsp;&lt;echo&gt;+--------------------------------------------------+&lt;/echo&gt;<br />
&nbsp;&lt;!---Help Information--&gt;<br />
&nbsp;&lt;target name="usage" &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message=""/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="-------------------------------------------------------------"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="操作说明："/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="首先将您编写的java文件拷贝至${src.dir}目录下,按先后顺序执行以下命令既可。"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="第一步：compile 命令编译*.java"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="第二步：deploy 命令生成${app.name}.jar文件"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="第三步：doc 命令生成详细javadoc文档"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="每一步操作都能看到 BUILD SUCCESSFUL提示后，表示您操作成功！"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="-------------------------------------------------------------"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message=""/&gt;<br />
&nbsp;&lt;/target&gt;&nbsp;&nbsp;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 设置应用环境变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;&nbsp;<br />
&nbsp;&lt;path id="compile.classpath"&gt;<br />
&nbsp;&nbsp;&lt;pathelement path ="${build.dir}"/&gt;<br />
&nbsp;&nbsp;&lt;fileset dir="${lib.dir}"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;include name="**/*.jar"/&gt;<br />
&nbsp;&nbsp;&lt;/fileset&gt;<br />
&nbsp;&lt;/path&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 格式化中文资源包，解决国际化中文问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="checkToZh"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;uptodate property="toZh.notRequired"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcfile="${properties.dir}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targetfile="${properties_zh.dir}"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="toZh" depends="checkToZh" unless="toZh.notRequired"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;delete file="${properties_zh.dir}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- native2ascii struts.properties --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exec executable="native2ascii"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg line=" ${properties.dir}&nbsp; ${properties_zh.dir}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exec&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="toZh performed!"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 初始化创建相关应用目录&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="prepare" deion="create build,dist files"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;mkdir dir="${build.dir}"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;mkdir dir="${dist.dir}"/&gt;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 初始化应用程序，删除相关目录&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;&nbsp;<br />
&nbsp;&lt;target name="clean" deion="Delete build files"&gt;<br />
&nbsp;&nbsp;&lt;delete dir="${build.dir}"/&gt;<br />
&nbsp;&nbsp;&lt;delete dir="${dist.dir}"/&gt;<br />
&nbsp;&lt;/target&gt;<br />
&nbsp;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- compile 命令，执行javac编译命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;&nbsp;<br />
&nbsp;&lt;target name="compile" depends="prepare"&gt;<br />
&nbsp;&nbsp;&lt;javac srcdir="${src.dir}" destdir="${build.dir}" debug="on"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;classpath refid="compile.classpath"/&gt;<br />
&nbsp;&nbsp;&lt;/javac&gt;<br />
&nbsp;&lt;/target&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- update命令，编译及处理国际化中文资源文件 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp;&lt;target name="update" depends="compile,toZh"&gt;<br />
&nbsp;&nbsp;&lt;!--copy classes--&gt;<br />
&nbsp;&nbsp;&lt;copy todir="${webserver.deploy}/${app.name}/WEB-INF/classes" includeEmptyDirs="no"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;fileset dir="${build.dir}"/&gt;<br />
&nbsp;&nbsp;&lt;/copy&gt;<br />
&nbsp;&nbsp;&lt;!--copy pages--&gt;<br />
&nbsp;&nbsp;&lt;copy todir="${webserver.deploy}/${app.name}" includeEmptyDirs="no"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;fileset dir="${app.dir}"/&gt;<br />
&nbsp;&nbsp;&lt;/copy&gt;<br />
&nbsp;&nbsp;&lt;!-- copy libs--&gt;<br />
&nbsp;&nbsp;&lt;copy todir="${webserver.deploy}/${app.name}/WEB-INF/lib" includeEmptyDirs="no"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;fileset dir="${lib.dir}"/&gt;<br />
&nbsp;&nbsp;&lt;/copy&gt;<br />
&nbsp;&lt;/target&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 部署应用程序，依赖于 compile命令clean,prepare,compile,dist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;</p>
&nbsp;&lt;target name="deploy" depends="clean,prepare,compile,toZh,dist"&gt;<br />
&nbsp;&nbsp;&lt;delete dir="${webserver.deploy}/${app.name}.war"/&gt;<br />
&nbsp;&nbsp;&lt;delete dir="${webserver.deploy}/${app.name}"/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;copy todir="${webserver.deploy}" includeEmptyDirs="no"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;fileset dir="${dist.dir}"/&gt;<br />
&nbsp;&nbsp;&lt;/copy&gt;<br />
&nbsp;&lt;/target&gt;&nbsp;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 部署应用程序，将其打为mshome.war包，依赖于 compile命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;&nbsp;<br />
&nbsp;&lt;target name="dist" depends="compile"&gt;<br />
&nbsp;&nbsp; &lt;echo&gt;building war...&lt;/echo&gt;<br />
&nbsp;&nbsp; &lt;war warfile="${dist.dir}/${app.name}.war"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; webxml="${app.dir}/WEB-INF/web.xml"&gt;<br />
&nbsp;&nbsp; &nbsp; &lt;fileset dir="${app.dir}"/&gt;<br />
&nbsp;&nbsp; &nbsp; &lt;classes dir="${build.dir}"/&gt;<br />
&nbsp;&nbsp; &nbsp; &lt;classes dir="${lib.dir}"&gt;<br />
&nbsp;&nbsp; &nbsp; &nbsp;&lt;include name="*.propertries"/&gt;<br />
&nbsp;&nbsp; &lt;/classes&gt;<br />
&nbsp;&nbsp; &lt;lib dir="${lib.dir}"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;include name="*.jar"/&gt;<br />
&nbsp;&nbsp; &lt;/lib&gt;<br />
&nbsp;&nbsp;&lt;/war&gt;<br />
&nbsp;&lt;/target&gt;&nbsp;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 生成说明文档(api)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp;&lt;target name="javadoc" depends="usage,compile"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;delete dir="${doc.dir}"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;mkdir dir="${doc.dir}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;javadoc packagenames="${packages}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sourcepath="${src.dir}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destdir="${doc.dir}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; author="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; splitindex="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; windowtitle="${app.name} API"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doctitle="${app.name}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="compile.classpath"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/javadoc&gt;<br />
&nbsp; &lt;/target&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt;<br />
&nbsp; &lt;!-- 执行一个数据库操作，其中demo为您的数据库名，可测试相关jdbc连接<br />
&nbsp; &nbsp;&nbsp;&nbsp; 查询语句为bin目录下的db.sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;!-- =================================================================== --&gt; &nbsp;<br />
&nbsp;&lt;target name = "mysqlInit"&gt;<br />
&nbsp;&lt;echo&gt;ANT 操作数据库开始.....&lt;/echo&gt;<br />
&nbsp;&lt;sql<br />
&nbsp;&nbsp;driver = "org.gjt.mm.mysql.Driver"<br />
&nbsp;&nbsp;url = "jdbc:mysql://localhost:3306/demo"<br />
&nbsp;&nbsp;userid = "root"<br />
&nbsp;&nbsp;password = "*******"<br />
&nbsp;&nbsp;src = "db.sql"<br />
&nbsp;&nbsp;print="yes"<br />
&nbsp;&nbsp;="continue"<br />
&nbsp;/&gt;<br />
&nbsp;&lt;/target&gt;<br />
&nbsp;&lt;!--END--&gt;<br />
&lt;/project&gt;<br />
<br />
2、在"Easydone"project"demo"bin目录下新建setEnv.bat<br />
dos处理脚本，主要为设置环境变量（这样做您无需手工配置环境变量，将整个工程移动到任何目录都可以使用），内容如下：<br />
<br />
set ANT_HOME=../../../platform/apache-ant-1.6.1<br />
set JAVA_HOME=../../../platform/j2sdk1.4.2_08<br />
set CLASSPATH=%JAVA_HOME%/lib/toos.jar;%JAVA_HOME%/lib/dt.jar<br />
set CATALINA_HOME=../../../platform/jakarta-tomcat-5.0.19<br />
set PATH=%ANT_HOME%/bin;%CATALINA_HOME%/BIN;%JAVA_HOME%/bin;%CATALINA_HOME%/BIN<br />
3、服务控制脚本：<br />
tomcat启动服务：<br />
在"Easydone"project"demo"bin目录下新建　<strong>run.cmd：</strong><br />
<br />
call setEnv.bat<br />
startup<br />
<br />
tomcat停止服务：<br />
在"Easydone"project"demo"bin目录下新建　<strong>down.cmd<br />
</strong><br />
call setEnv.bat<br />
shutdown<br />
<br />
更新脚本：<br />
在"Easydone"project"demo"bin目录下新建　<strong>update.cmd<br />
</strong>call setEnv.bat<br />
ant -buildfile build.xml&nbsp; update<br />
<br />
部署脚本：<br />
在"Easydone"project"demo"bin目录下新建　<strong>deploy.cmd<br />
</strong>call setEnv.bat<br />
ant -buildfile build.xml&nbsp; deploy<br />
<br />
java doc 脚本：<br />
在"Easydone"project"demo"bin目录下新建　<strong>doc.cmd</strong><br />
call setEnv.bat<br />
ant -buildfile build.xml&nbsp; javadoc<br />
<br />
剩下的都在build.xml中，根据你的需要自己定义脚本程序就可以了<br />
很简单，这样可控制你的应用。
<img src ="http://www.blogjava.net/libin2722/aggbug/179855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 22:58 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SHTML 教程</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179853.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179853.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179853.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179853.html</trackback:ping><description><![CDATA[<div>
<h4>什么是 SHTML</h4>
<p>使用SSI（Server Side Include）的html文件扩展名，SSI（Server Side Include），通常称为&#8220;服务器端嵌入&#8221;或者叫&#8220;服务器端包含&#8221;，是一种类似于ASP的基于服务器的网页制作技术。</p>
<h4>SSI工作原理：</h4>
<p>将内容发送到浏览器之前，可以使用&#8220;服务器端包含 (SSI)&#8221;指令将文本、图形或应用程序信息包含到网页中。例如，可以使用 SSI
包含时间/日期戳、版权声明或供客户填写并返回的表单。对于在多个文件中重复出现的文本或图形，使用包含文件是一种简便的方法。将内容存入一个包含文件中
即可，而不必将内容输入所有文件。通过一个非常简单的语句即可调用包含文件，此语句指示 Web
服务器将内容插入适当网页。而且，使用包含文件时，对内容的所有更改只需在一个地方就能完成。</p>
<p>因为包含 SSI 指令的文件要求特殊处理，所以必须为所有 SSI 文件赋予 SSI 文件扩展名。默认扩展名是 .stm、.shtm 和 .shtml。</p>
<p>Web 服务器在处理网页的同时处理 SSI 指令。当 Web 服务器遇到 SSI 指令时，直接将包含文件的内容插入 HTML
网页。如果&#8220;包含文件&#8221;中包含 SSI 指令，则同时插入此文件。除了用于包含文件的基本指令之外，还可以使用 SSI
指令插入文件的相关信息（如文件的大小）或者运行应用程序或 shell 命令。</p>
<p>网站维护常常碰到的一个问题是，网站的结构已经固定，却为了更新一点内容而不得不重做一大批网页。SSI提供了一种简单、有效的方法来解决这一问
题，它将一个网站的基本结构放在几个简单的HTML文件中（模板），以后我们要做的只是将文本传到服务器，让程序按照模板自动生成网页，从而使管理大型网
站变得容易。</p>
<p>所以，利用SHTML格式的页面目的和 ASP 差不多，但是因为是 API
所以运转速度更快，效率更高，比ASP快，比HTML慢，但由于可以使用服务器端包含，因此使页面更新容易（特别是批量更新banner，版权等），想象
一下吧，你有一段 HTML，要在中间穿插一些特殊的服务端脚本，比如插入其他 HTML 段落，你选择 ASP
来完成这个任务，但是如果任务更繁重，需要更多的时间，比如 5 s，这个时候你不用 ASP 而用&nbsp; SHTML，或许处理时间就只用 4s 了。</p>
<h4>SSI有什么用？</h4>
<p>之所以要扯到 <strong>SSI</strong>，是因爲 <strong>Shtml - Server-Parsed HTML</strong>
的首字母缩略词。包含有嵌入式服务器方包含命令的 HTML 文本。在被传送给浏览器之前，服务器会对 SHTML
文档进行完全地读取、分析以及修改。shtml和asp
有一些相似，以shtml命名的文件里，使用了ssi的一些指令，就像asp中的指令，你可以在SHTML文件中写入SSI指令，当客户端访问这些
shtml文件时，服务器端会把这些SHTML文件进行读取和解释，把SHTML文件中包含的SSI指令解释出来比如：你可以在SHTML文件中用SSI
指令引用其他的html文件（＃i nclude
），服务器传送给客户端的文件，是已经解释的SHTML不会有SSI指令。它实现了HTML所没有的功能，就是可以实现了动态的SHTML，可以说是
HTML的一种进化吧。像新浪的新闻系统就是这样的，新闻内容是固定的但它上面的广告和菜单等就是用＃i nclude引用进来的。</p>
<p>目前，主要有以下几种用用途：</p>
<ol>
    <li>显示服务器端环境变量&lt;＃e cho&gt;
    </li>
    <li>将文本内容直接插入到文档中&lt;＃i nclude&gt;
    </li>
    <li>显示WEB文档相关信息&lt;＃f lastmod ＃f size&gt; (如文件制作日期/大小等)
    </li>
    <li>直接执行服务器上的各种程序&lt;＃e xec&gt;(如CGI或其他可执行程序)
    </li>
    <li>设置SSI信息显示格式&lt;＃c onfig&gt;(如文件制作日期/大小显示方式)</li>
</ol>
<p>高级SSI&lt;XSSI&gt;可设置变量使用if条件语句。</p>
<h4>使用SSI</h4>
<p>SSI是为WEB服务器提供的一套命令，这些命令只要直接嵌入到HTML文档的注释内容之中即可。如：</p>
<p>&lt;!--＃i nclude file="info.htm"--&gt;</p>
<p>就是一条SSI指令，其作用是将"info.htm"的内容拷贝到当前的页面中，当访问者来浏览时，会看到其它HTML文档一样显示
info.htm其中的内容。其它的SSI指令使用形式基本同刚才的举例差不多，可见SSI使用只是插入一点代码而已，使用形式非常简单。当然，如果
WEB服务器不支持SSI，它就会只不过将它当作注释信息，直接跳过其中的内容；浏览器也会忽略这些信息。</p>
<h4>如何在我的WEB服务器上配置SSI功能？</h4>
<p>在一些WEB服务器上（如IIS 4.0/SAMBAR 4.2），包含 ＃i nclude 指令的文件必须使用已被映射到 SSI
解释程序的扩展名；否则，Web 服务器将不会处理该SSI指令；默认情况下，扩展名 .stm、.shtm 和 .shtml
被映射到解释程序（Ssinc.dll）。<br />
Apache则是根据你的设置情况而定，修改srm.conf如：</p>
<p>AddType text/x-server-parsed-html .shtml 将只对.shtml扩展名的文件解析SSI指令<br />
AddType text/x-server-parsed-html .html 将对所有HTML文档解析SSI指令</p>
<p>Netscape WEB服务器直接使用 Administration Server(管理服务器)可打开SSI功能。<br />
Website 使用 Server Admin 程序中的 Mapping 标签，扩展名添加内容类型为：wwwserver/html-ssi<br />
Cern 服务器不支持SSI，可用SSI诈骗法，到 <a href="http://sw.cse.bris.ac.uk/WebTools/fakessi.html"><span style="color: #003399;">http://sw.cse.bris.ac.uk/WebTools/fakessi.html</span></a> 上下载一个PERL脚本，即可使你的CERN服务器使用一些SSI指令。（不支持exec指令。）</p>
<h4>SSI指令基本格式</h4>
<p>程序代码：</p>
<p>&lt;!-- 指令名称="指令参数"&gt;</p>
<p>示例：</p>
<p>&lt;!--＃i nclude file="info.htm"--&gt;</p>
<p>说明：</p>
<ol>
    <li>
    <div>&lt;!-- --&gt;是HTML语法中表示注释，当WEB服务器不支持SSI时，会忽略这些信息。</div>
    </li>
    <li>
    <div>＃i nclude 为SSI指令之一。</div>
    </li>
    <li>
    <div>file 为include的参数， info.htm为参数值，在本指令中指将要包含的文档名。</div>
    </li>
</ol>
<p>注意：</p>
<ol>
    <li>
    <div>&lt;!--与#号间无空格，只有SSI指令与参数间存在空格。</div>
    </li>
    <li>
    <div>上面的标点=""，一个也不能少。</div>
    </li>
    <li>
    <div>SSI指令是大小写敏感的，因此参数必须是小写才会起作用。</div>
    </li>
</ol>
<h4>SSI指令使用详解</h4>
<p><strong>＃e cho 示范</strong></p>
<p>作用：将环境变量插入到页面中。</p>
<p>语法：</p>
<p>&lt;!--＃e cho var="变量名称"--&gt;</p>
<p>示例：</p>
<p>&lt;!--＃e cho var="DOCUMENT_NAME"--&gt; 本文档名称<br />
&lt;!--＃e cho var="DATE_LOCAL"--&gt; 现在时间<br />
&lt;!--＃e cho var="REMOTE_ADDR"--&gt; 你的IP地址</p>
<p><strong>＃i nclude 示范</strong></p>
<p>作用：将文本文件的内容直接插入到文档页面中。</p>
<p>语法：</p>
<p>&lt;!--＃i nclude file="文件名称"--&gt;<br />
&lt;!--＃i nclude virtual="文件名称"--&gt;</p>
<p><strong>file</strong> 文件名是一个相对路径，该路径相对于使用 ＃i nclude 指令的文档所在的目录。被包含文件可以在同一级目录或其子目录中，但不能在上一级目录中。如表示当前目录下的的nav_head.htm文档，则为file="nav_head.htm"。<br />
<strong>virtual</strong> 文件名是 Web 站点上的虚拟目录的完整路径。如表示相对于服务器文档根目录下hoyi目录下的nav_head.htm文件；则为file="/hoyi/nav_head.htm"</p>
<p>参数：</p>
<p>file 指定包含文件相对于本文档的位置<br />
virtual 指定相对于服务器文档根目录的位置</p>
<p>注意：</p>
<ol>
    <li>文件名称必须带有扩展名。
    </li>
    <li>被包含的文件可以具有任何文件扩展名，我觉得直接使用htm扩展名最方便，微软公司推荐使用 .inc 扩展名（这就看你的爱好了）。</li>
</ol>
<p>示例：</p>
<p>&lt;!--＃i nclude file="nav_head.htm"--&gt; 将头文件插入到当前页面<br />
&lt;!--＃i nclude file="nav_foot.htm"--&gt; 将尾文件插入到当前页面</p>
<p><strong>＃f lastmod 和 ＃f size 示范</strong></p>
<p>作用：</p>
<p><strong>＃f lastmod</strong> 文件最近更新日期<br />
<strong>＃f size</strong> 文件的长度</p>
<p>语法：</p>
<p>&lt;!--＃f lastmod file="文件名称"--&gt;<br />
&lt;!--＃f size file="文件名称"--&gt;</p>
<p>参数：</p>
<p>file 指定包含文件相对于本文档的位置 如 info.txt 表示当前目录下的的info.txt文档<br />
virtual 指定相对于服务器文档根目录的位置 如 /hoyi/info.txt 表示</p>
<p>注意：文件名称必须带有扩展名。</p>
<p>示例：</p>
<p>&lt;!--＃f lastmod file="news.htm"--&gt; 将当前目录下news.htm文件的最近更新日期插插入到当前页面<br />
&lt;!--＃f size file="news.htm"--&gt; 将当前目录下news.htm的文件大小入到当前页面</p>
<p><strong>＃e xec 示范</strong></p>
<p>作用：将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入，这取决于使用的参数是cmd还是cgi。</p>
<p>语法：</p>
<p>&lt;!--＃e xec cmd="文件名称"--&gt;<br />
&lt;!--＃e xec cgi="文件名称"--&gt;</p>
<p>参数：</p>
<p><strong>cmd</strong> 常规应用程序<br />
<strong>cgi</strong> CGI脚本程序</p>
<p>示例：</p>
<p>&lt;!--＃e xec cmd="cat /etc/passwd"--&gt; 将会显示密码文件<br />
&lt;!--＃e xec cmd="dir /b"--&gt; 将会显示当前目录下文件列表<br />
&lt;!--＃e xec cgi="/cgi-bin/gb.cgi"--&gt; 将会执行CGI程序gb.cgi。<br />
&lt;!--＃e xec cgi="/cgi-bin/access_log.cgi"--&gt; 将会执行CGI程序access_log.cgi。</p>
<p>注意：从上面的示例可以看出，这个指令相当方便，但是也存在安全问题。</p>
<p>禁止方法：</p>
<ol>
    <li>
    <div>Apache，将access.conf中的"Options Includes ExecCGI"这行代码删除；</div>
    </li>
    <li>
    <div>在IIS中，要禁用 ＃e xec 命令，可修改 SSIExecDisable 元数据库；</div>
    </li>
</ol>
<p><strong>＃c onfig</strong></p>
<p>作用： 指定返回给客户端浏览器的错误信息、日期和文件大小的格式。</p>
<p>语法：</p>
<p>&lt;!--＃c onfig errmsg="自定义错误信息"--&gt;<br />
&lt;!--＃c onfig sizefmt="显示单位"--&gt;<br />
&lt;!--＃c onfig timefmt="显示格式"--&gt;</p>
<p>参数：</p>
<p><strong>errmsg</strong> 自定义SSI执行错误信息，可以为任何你喜欢的方式。<br />
<strong>sizefmt</strong> 文件大小显示方式，默认为字节方式("bytes")可以改为千字节方式("abbrev")<br />
<strong>timefmt</strong> 时间显示方式，最灵活的配置属性。</p>
<p>示例：显示一个不存在文件的大小</p>
<p>&lt;!--＃c onfig errmsg="服务器执行错误，请联系管理员 <span style="color: #003399;">yiho@126.com</span>，谢谢！"--&gt;<br />
&lt;!--＃f size file="不存在的文件.htm"--&gt;</p>
<p>以千字节方式显示文件大小</p>
<p>语法：</p>
<p>&lt;!--＃c onfig sizefmt="abbrev"--&gt;<br />
&lt;!--＃f sizefile="news.htm"--&gt;</p>
<p>以特定的时间格式显示时间</p>
<p>&lt;!--＃c onfig timefmt="%Y年/%m月%d日 星期%W 北京时间%H:%M:%s，%Y年已过去了%j天 今天是%Y年的第%U个星期"--&gt;<br />
&lt;!--＃e cho var="DATE_LOCAL"--&gt; 显示今天是星期几，几月，时区<br />
&lt;!--＃c onfig timefmt="今天%A， %B ，服务器时区是 %z，是"--&gt;<br />
&lt;!--＃e cho var="DATE_LOCAL"--&gt;</p>
<h4>XSSI</h4>
<p>XSSI（Extended SSI）是一组高级SSI指令，内置于Apache 1.2或更高版本的mod-include模块之中。其中可利用的的指令有：</p>
<p>#printenv<br />
#set<br />
#if</p>
<p><strong>#printenv</strong></p>
<p>作用： 显示当前存在于WEB服务器环境中的所有环境变量。</p>
<p>语法：</p>
<p>&lt;!--#printenv--&gt;</p>
<p><strong>#set</strong></p>
<p>作用：可给变量赋值，以用于后面的if语句。</p>
<p>语法：</p>
<p>&lt;!--#set var="变量名" ="变量值"--&gt;<br />
</p>
<p>示例：</p>
<p>&lt;!--#set var="color" ="红色"--&gt;<br />
</p>
<p><strong>#if</strong></p>
<p>作用：创建可以改变数据的页面，这些数据根据使用if语句时计算的要求予以显示。</p>
<p>语法：</p>
<p>&lt;!--#if expr="$变量名=""变量值A"""--&gt;<br />
&nbsp; 显示内容<br />
&lt;!--#elif expr="$变量名=""变量值B"""--&gt;<br />
&nbsp; 显示内容<br />
&lt;!--#else--&gt;<br />
&nbsp; 显示内容<br />
&lt;!--#endif"--&gt;</p>
<p>示例：</p>
<p>&lt;!--#if expr="$SERVER_NAME=""hoyi.zb169.net"""--&gt;<br />
&nbsp; 欢迎光临好易CGI工厂在淄博热线的分站 http://hoyi.zb169.net。<br />
&lt;!--#elif expr="$SERVER_NAME=""linux.cqi.com.cn""" --&gt;<br />
&nbsp; 欢迎光临好易CGI工厂在太阳城的分站 http://linux.cqi.com.cn/~hoyi。<br />
&lt;!--#else--&gt;<br />
&nbsp; 欢迎光临好易CGI工厂！<br />
&lt;!--#endif"--&gt;</p>
<p>注意：用于前面指令中的反斜杠，是用来代换内部的引号，以便它们不会被解释为结束表达式。不可省略。</p>
<p><strong>1、Config 命令</strong></p>
<p>Config 命令主要用于修改SSI的默认设置。其中：</p>
<p><strong>Errmsg</strong>：设置默认错误信息。为了能够正常的返回用户设定的错误信息，在HTML文件中Errmsg参数必须被放置在其它SSI命令的前面，否则客户端只能显示默认的错误信息，而不是由用户设定的自定义信息。</p>
<p>&lt;!--＃c onfig errmsg="Error! Please email webmaster@mydomain.com" --&gt;</p>
<p><strong>Timefmt</strong>：定义日期和时间的使用格式。Timefmt参数必须在echo命令之前使用。</p>
<p>&lt;!--＃c onfig timefmt="%A， %B %d， %Y"--&gt;<br />
&lt;!--＃e cho var="LAST_MODIFIED" --&gt;</p>
<p>显示结果为：</p>
<p>Wednesday， April 12， 2000</p>
<p>也许用户对上例中所使用的%A %B %d感到很陌生，下面我们就以表格的形式总结一下SSI中较为常用的一些日期和时间格式。</p>
<p><strong>Sizefmt</strong>：决定文件大小是以字节、千字节还是兆字节为单位表示。如果以字节为单位，参数值为"bytes"；对于千字节和兆字节可以使用缩写形式。同样，sizefmt参数必须放在fsize命令的前面才能使用。</p>
<p>&lt;!--＃c onfig sizefmt="bytes" --&gt;<br />
&lt;!--＃f size file="index.html" --&gt;</p>
<p><strong>2、Include 命令</strong></p>
<p>Include 命令可以把其它文档中的文字或图片插入到当前被解析的文档中，这是整个SSI的关键所在。通过Include命令只需要改动一个文件就可以瞬间更新整个站点！</p>
<p>Include 命令具有两个不同的参数：</p>
<p><strong>Virtual</strong>：给出到服务器端某个文档的虚拟路径。<br />
<strong>File</strong>：给出到当前目录的相对路径，其中不能使用"../"，也不能使用绝对路径。</p>
<p>&lt;!--＃i nclude virtual="/includes/header.html" --&gt;<br />
&lt;!--＃i nclude file="header.html" --&gt; 这就要求每一个目录中都包含一个header.html文件。</p>
<p><strong>3、Echo 命令</strong></p>
<p>Echo 命令可以显示以下各环境变量：</p>
<p><strong>DOCUMENT_NAME</strong>：显示当前文档的名称。<br />
<strong>DOCUMENT_URI</strong>：显示当前文档的虚拟路径。例如：</p>
<p>&lt;!--＃e cho var="DOCUMENT_NAME" --&gt;<br />
&lt;!--＃e cho var="DOCUMENT_URI" --&gt;</p>
<p>随着网站的不断发展，那些越来越长的URL地址肯定会让人头疼。如果使用SSI，一切就会迎刃而解。因为我们可以把网站的域名和SSI命令结合在一起显示完整的URL，即：</p>
<p>http://YourDomain&lt;!--＃e cho var="DOCUMENT_URI" --&gt;</p>
<p><strong>QUERY_STRING_UNESCAPED</strong>：显示未经转义处理的由客户端发送的查询字串，其中所有的特殊字符前面都有转义符"""。例如：</p>
<p>&lt;!--＃e cho var="QUERY_STRING_UNESCAPED" --&gt;</p>
<p><strong>DATE_LOCAL</strong>：显示服务器设定时区的日期和时间。用户可以结合config命令的timefmt参数，定制输出信息。例如：</p>
<p>&lt;!--＃c onfig timefmt="%A， the %d of %B， in the year %Y" --&gt;<br />
&lt;!--＃e cho var="DATE_LOCAL" --&gt;</p>
<p>显示结果为：</p>
<p>Saturday， the 15 of April， in the year 2000</p>
<p><strong>DATE_GMT</strong>：功能与DATE_LOCAL一样，只不过返回的是以格林尼治标准时间为基准的日期。例如：</p>
<p>&lt;!--＃e cho var="DATE_GMT" --&gt;</p>
<p><strong>LAST_MODIFIED</strong>：显示当前文档的最后更新时间。同样，这是SSI中非常实用的一个功能，只要在HTML文档中加入以下这行简单的文字，就可以在页面上动态的显示更新时间。</p>
<p>&lt;!--＃e cho var="LAST_MODIFIED" --&gt;</p>
<p><strong>CGI环境变量</strong></p>
<p>除了SSI环境变量之外，echo命令还可以显示以下CGI环境变量：</p>
<p>SERVER_SOFTWARE：显示服务器软件的名称和版本。例如：<br />
&lt;!--＃e cho var="SERVER_SOFTWARE" --&gt;<br />
SERVER_NAME： 显示服务器的主机名称，DNS别名或IP地址。例如：<br />
&lt;!--＃e cho var="SERVER_NAME" --&gt;<br />
SERVER_PROTOCOL：显示客户端请求所使用的协议名称和版本，如HTTP/1.0。例如：<br />
&lt;!--＃e cho var="SERVER_PROTOCOL" --&gt;<br />
SERVER_PORT：显示服务器的响应端口。例如：<br />
&lt;!--＃e cho var="SERVER_PORT" --&gt;<br />
REQUEST_METHOD：显示客户端的文档请求方法，包括GET， HEAD， 和POST。例如：<br />
&lt;!--＃e cho var="REQUEST_METHOD" --&gt;<br />
REMOTE_HOST：显示发出请求信息的客户端主机名称。<br />
&lt;!--＃e cho var="REMOTE_HOST" --&gt;<br />
REMOTE_ADDR：显示发出请求信息的客户端IP地址。<br />
&lt;!--＃e cho var="REMOTE_ADDR" --&gt;<br />
AUTH_TYPE：显示用户身份的验证方法。<br />
&lt;!--＃e cho var="AUTH_TYPE" --&gt;<br />
REMOTE_USER：显示访问受保护页面的用户所使用的帐号名称。<br />
&lt;!--＃e cho var="REMOTE_USER" --&gt;</p>
<p><strong>4、Fsize</strong>：显示指定文件的大小，可以结合config命令的sizefmt参数定制输出格式。</p>
<p>&lt;!--＃f size file="index_working.html" --&gt;</p>
<p><strong>5、Flastmod</strong>：显示指定文件的最后修改日期，可以结合config 命令的timefmt参数控制输出格式。</p>
<p>&lt;!--＃c onfig timefmt="%A， the %d of %B， in the year %Y" --&gt;<br />
&lt;!--＃f lastmod file="file.html" --&gt;</p>
<p>这里，我们可以利用flastmod参数显示出一个页面上所有链接页面的更新日期。方法如下：</p>
<p>&lt;!--＃c onfig timefmt=" %B %d， %Y" --&gt;<br />
&lt;A HREF="/directory/file.html"&gt;File&lt;/A&gt;<br />
&lt;!--＃f lastmod virtual="/directory/file.html" --&gt;<br />
&lt;A HREF="/another_directory/another_file.html"&gt;Another File&lt;/A&gt;<br />
&lt;!--＃f lastmod virtual="/another_directory/another_file.html" --&gt;</p>
<p>显示结果为：</p>
<p>File April 19， 2000<br />
Another File January 08， 2000</p>
<p><strong>6、Exec</strong></p>
<p>Exec命令可以执行CGI脚本或者shell命令。使用方法如下：</p>
<p><strong>Cmd</strong>：使用/bin/sh执行指定的字串。如果SSI使用了IncludesNOEXEC选项，则该命令将被屏蔽。<br />
<strong>Cgi</strong>：可以用来执行CGI脚本。例如，下面这个例子中使用服务端cgi-bin目录下的counter.pl脚本程序在每个页面放置一个计数器：</p>
<p>&lt;!--＃e xec cgi="/cgi-bin/counter.pl" --&gt;</p>
<h4>关于SHTML和HTML的区别</h4>
<p>让我们先来看看SHTML和HTML的区别，如果用一句话来解释就是:SHTML 不是HTML而是一种服务器 API，shtml是服务器动态产成的html.</p>
<p>虽然两者都是超文本格式，但shtml是一种用于SSI技术的文件。也就是Server Side Include--SSI
服务器端包含指令。如果Web Server有SSI功能的话，大多数（尤其是基于Unix平台）的WEB服务器，如Netscape
Enterprise Server等均支持SSI命令。</p>
</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/179853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 22:55 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 Ant 和 JUnit 进行增量开发</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179852.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179852.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179852.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179852.html</trackback:ping><description><![CDATA[<p>要使测试自动化，您需要一个测试框架。您可以自己开发或购买，也可以使用某些开放源代码工具，例如 JUnit。我选择 JUnit 出于以下几个原因： </p>
<ul>
    <li>不需要编写自己的框架。
    </li>
    <li>它是开放源代码，因此不需要购买框架。
    </li>
    <li>开放源代码社区中的其他开发者会使用它，因此可以找到许多示例。
    </li>
    <li>它可以让我将测试代码与产品代码分开。
    </li>
    <li>它易于集成到我的构建过程中。 </li>
</ul>
<p><strong>测试布局</strong> <br />
图 1 显示了使用样本 TestSuite 的 JUnit TestSuite 布局。每个测试都由若干单独的测试案例构成。每个测试案例都是一个单独的类，它扩展了 TestClass 类并包含了我的测试代码，即那些曾在 <code><span style="font-family: 新宋体;">main()</span></code> 中出现的代码。在该例中，我向 TestSuite 添加了两个测试：一个是 SkeletonTest，我将它用作所有新类和 HelloWorld 类的起点。 </p>
<br />
<a name="N10115"><strong>图 1. TestSuite 布局</strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image001.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" height="319" width="500"  alt="" /> <br />
<p><strong>测试类 HelloWorldTest.java</strong> <br />
按照约定，测试类的名称中包含我所测试的类的名称，但将 <em>Test</em> 附加到结尾。在本例中，我们的测试类是 <code><span style="font-family: 新宋体;">HelloWorldTest.java</span></code> 。我复制了 SkeletonTest 中的代码，并添加了 <code><span style="font-family: 新宋体;">testSayHello()</span></code> 来测试 <code><span style="font-family: 新宋体;">sayHello()</span></code> 。请注意 HelloWorldTest 扩展了 TestCase。JUnit 框架提供了 <code><span style="font-family: 新宋体;">assert</span></code> 和 <code><span style="font-family: 新宋体;">assertEquals</span></code> 方法，我们可以使用这些方法来进行验证。 <code><span style="font-family: 新宋体;">HelloWorldTest.java</span></code> 显示在清单 2 中。 </p>
<br />
<a name="N10145"><strong>清单 2. HelloWorldTest.java</strong></a><br />
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><span style="font-family: Lucida Console;">package test.com.company;import com.company.HelloWorld; import junit.work.TestCase;import junit.work.AssertionFailedError;/** * JUnit 3.2 testcases for HelloWorld */ public class HelloWorldTest extends TestCase { public HelloWorldTest(String name) { super(name); } public static void main(String args[]) { junit.textui.TestRunner.run(HelloWorldTest.class); } public void testSayHello() { HelloWorld world = new HelloWorld(); assert( world!=null ); assertEquals("Hello World", world.sayHello() ); }}</span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><code><span style="font-family: 新宋体;">testSayHello()</span></code> 看上去和 <code><span style="font-family: 新宋体;">HelloWorld.java</span></code> 中原来的 main 方法类似，但有一个主要的不同之处。它不是执行 <code><span style="font-family: 新宋体;">System.out.println</span></code> 并显示结果，而是添加了一个 <code><span style="font-family: 新宋体;">assertEquals()</span></code> 方法。如果两个值不同， <code><span style="font-family: 新宋体;">assertEquals</span></code> 将打印出两个输入的值。您可能已经注意到这个方法不起作用！HelloWorld 中的 <code><span style="font-family: 新宋体;">sayHello()</span></code> 方法不返回字符串。如果我先写过测试，就会捕捉到这一点。我将 "Hello World" 字符串与输出流联结起来。这样，按照清单 3 中显示的那样重写了 HelloWorld，去掉 <code><span style="font-family: 新宋体;">main()</span></code> ，并更改了 <code><span style="font-family: 新宋体;">sayHello()</span></code> 的返回类型。 </p>
<br />
<a name="N10172"><strong>清单 3. Hello world 测试案例。</strong></a><br />
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><span style="font-family: Lucida Console;">package com.company;public class HelloWorld { public String sayHello() { return "Hello World"; }}</span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如果我保留了 <code><span style="font-family: 新宋体;">main()</span></code> 并修改了联系，代码看上去如下：
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><span style="font-family: Lucida Console;">public static void main( String[] args ) { HelloWorld world = new HelloWorld(); System.out.println(world.sayHello()); }</span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>新的 <code><span style="font-family: 新宋体;">main()</span></code> 与我测试程序中的 <code><span style="font-family: 新宋体;">testSayHello()</span></code> 非常相似。是的，它看上去不象是一个现实世界中的问题（这是人为示例的问题），但它说明了问题。在单独的应用程序中编写 <code><span style="font-family: 新宋体;">main()</span></code> 可以改进您的设计，同时帮助您设计测试。现在我们已经创建了一个测试类，让我们使用 Ant 来将它集成到构建中。 </p>
<br />
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
            <img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /></td>
        </tr>
    </tbody>
</table>
<table align="right" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
            <table border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/j-ant/index.html#main"><strong><span style="color: #996699;">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10196"><span style="font-size: 14pt;">使用 Ant 将测试集成到构建中</span></a></p>
<p>Jakarta Project 将 Ant 工具说成&#8220;不带 make 缺点的 make&#8221;。Ant
正在成为开放源代码世界中实际上的标准。原因很简单：Ant 是使用 Java
语言编写的，这种语言可以让构建过程在多种平台上使用。这种特性简化了在不同 OS
平台之间的程序员的合作，而合作是开放源代码社区的一种需要。您可以在自己选择的平台上进行开发 <em>和</em>构建。Ant 的特性包括：
</p>
<ul>
    <li>类可扩展性 Java 类可用于扩展构建特性，而不必使用基于 shell 的命令。
    </li>
    <li>开放源代码 因为 Ant 是开放源代码，因此类扩展示例很充足。我发现通过示例来学习非常棒。
    </li>
    <li>XML 可配置 Ant 不仅是基于 Java 的，它还使用 XML 文件配置构建过程。假设构建实际上是分层的，那么使用 XML 描述 make 过程就是其逻辑层。另外，如果您了解 XML，要学习如何配置构建就更简单一些。 </li>
</ul>
<p>图 2 简要介绍了一个配置文件。配置文件由目标树构成。每个目标都包含了要执行的任务，其中任务就是可以执行的代码。在本例中， <em>mkdir</em>是目标 <em>compile</em>的任务。 <em>mkdir</em>是建立在 Ant 中的一个任务，用于创建目录。 Ant 带有一套健全的内置任务。您也可以通过扩展 Ant 任务类来添加自己的功能。 </p>
<p>每个目标都有唯一的名称和可选的相关性。目标相关性需要在执行目标任务列表之前执行。例如图 2 所示，在执行 compile 目标中的任务之前需要先运行 JUNIT 目标。这种类型的配置可以让您在一个配置中有多个树。</p>
<br />
<a name="N101BF"><strong>图 2. Ant XML 构建图</strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image002.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" height="198" width="500"  alt="" /> <br />
<p>与经典 make 实用程序的相似性是非常显著的。这是理所当然的，因为 make 就是 make。但也要记住有一些差异：通过 Java 实现的跨平台和可扩展性，通过 XML 实现的可配置，还有开放源代码。</p>
<p><strong>下载和安装 Ant</strong> <br />
首先下载 Ant（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/java/j-ant/index.html#resources"><span style="color: #996699;">参考资料</span></a> ）。将 Ant 解压缩到 tools 目录，再将 Ant <code><span style="font-family: 新宋体;">bin</span></code> 目录添加到路径中。（在我的机器上是 <code><span style="font-family: 新宋体;">e:"tools"ant"bin</span></code> 。）设置 ANT_HOME 环境变量。在 NT 中，这意味着进入系统属性，然后以带有值的变量形式添加 ANT_HOME。ANT_HOME 应该设置为 Ant 根目录，即包含 <code><span style="font-family: 新宋体;">bin</span></code> 和 <code><span style="font-family: 新宋体;">lib</span></code> 目录的目录。（对我来说，是 <code><span style="font-family: 新宋体;">e:"tools"ant</span></code> 。）确保 JAVA_HOME 环境变量设置为安装了 JDK 的目录。Ant 文档有关于安装的详细信息。 </p>
<p><strong>下载和安装 JUnit</strong> <br />
下载 JUnit 3.2（请参阅 <a href="http://www-128.ibm.com/developerworks/cn/java/j-ant/index.html#resources"><span style="color: #996699;">参考资料</span></a> ）。解开 <code><span style="font-family: 新宋体;">junit.zip</span></code> ，并将 <code><span style="font-family: 新宋体;">junit.jar</span></code> 添加到 CLASSPATH。如果将 <code><span style="font-family: 新宋体;">junit.zip</span></code> 解包到类路径中，可以通过运行以下命令来测试安装： <code><span style="font-family: 新宋体;">java junit.textui.TestRunner junit.samples.AllTests</span></code> </p>
<p><strong>定义目录结构</strong> <br />
在开始我们的构建和测试过程之前，需要一个项目布局。图 3 显示了我的样本项目的布局。下面描述了布局的目录结构：
</p>
<ul>
    <li><code><span style="font-family: 新宋体;">build</span></code> -- 类文件的临时构建位置。构建过程将创建这个目录。
    </li>
    <li><code><span style="font-family: 新宋体;">src</span></code> -- 源代码的位置。 <code><span style="font-family: 新宋体;">Src</span></code> 被分为 <code><span style="font-family: 新宋体;">test</span></code> 文件夹和 <code><span style="font-family: 新宋体;">main</span></code>
    文件夹，前者用于所有的测试代码，而后者包含可交付的代码。将测试代码与主要代码分离提供了几点特性。首先，使主要代码中的混乱减少。其次，它允许包对
    齐。我就热衷与将类和与其相关的包放置在一起。测试就应该和测试在一起。它还有助于分发过程，因为你不可能打算将单元测试分发给客户。 </li>
</ul>
<p>在实际中，我们有多个目录，例如 <code><span style="font-family: 新宋体;">distribution</span></code> 和 <code><span style="font-family: 新宋体;">documentation</span></code> 。我们还会在 <code><span style="font-family: 新宋体;">main</span></code> 下有多个用于包的目录，例如 <code><span style="font-family: 新宋体;">com.company.util</span></code> 。 </p>
<p>因为目录结构经常变动，所以在 <code><span style="font-family: 新宋体;">build.xml</span></code> 中有这些变动的全局字符串常数是很重要的。 </p>
<br />
<a name="N1024C"><strong>图 3. 项目布局图</strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image003.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" height="250" width="500"  alt="" /> <br />
<p><strong>Ant 构建配置文件示例</strong> <br />
下一步，我们要创建配置文件。清单 4 显示了一个 Ant 构建文件示例。构建文件中的关键就是名为 runtests 的目标。这个目标进行分支判断并运行外部程序，其中外部程序是前面已安装的 <code><span style="font-family: 新宋体;">junit.textui.TestRunner</span></code> 。我们指定要使用语句 <code><span style="font-family: 新宋体;">test.com.company.AllJUnitTests</span></code> 来运行哪个测试套件。 </p>
<br />
<a name="N10269"><strong>清单 4. 构建文件示例</strong></a><br />
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <span style="font-family: Lucida Console;">&lt;property name="app.name" ="sample" /&gt; &lt;property name="build.dir" ="build/classes" /&gt; &lt;target name="JUNIT"&gt; &lt;available property="junit.present" classname="junit.work.TestCase" /&gt; &lt;/target&gt; &lt;target name="compile" depends="JUNIT"&gt; &lt;mkdir dir="${build.dir}"/&gt; &lt;javac srcdir="src/main/" destdir="${build.dir}" &gt; &lt;include name="**/*.java"/&gt; &lt;/javac&gt; &lt;/target&gt; &lt;target name="jar" depends="compile"&gt; &lt;mkdir dir="build/lib"/&gt; &lt;jar jarfile="build/lib/${app.name}.jar" basedir="${build.dir}" includes="com/**"/&gt; &lt;/target&gt; &lt;target name="compiletests" depends="jar"&gt; &lt;mkdir dir="build/testcases"/&gt; &lt;javac srcdir="src/test" destdir="build/testcases"&gt; &lt;classpath&gt; &lt;pathelement location="build/lib/${app.name}.jar" /&gt; &lt;pathelement path="" /&gt; &lt;/classpath&gt; &lt;include name="**/*.java"/&gt; &lt;/javac&gt; &lt;/target&gt; &lt;target name="runtests" depends="compiletests" if="junit.present"&gt; &lt;java fork="yes" classname="junit.textui.TestRunner" taskname="junit" fail="true"&gt; &lt;arg ="test.com.company.AllJUnitTests"/&gt; &lt;classpath&gt; &lt;pathelement location="build/lib/${app.name}.jar" /&gt; &lt;pathelement location="build/testcases" /&gt; &lt;pathelement path="" /&gt; &lt;pathelement path="${java.class.path}" /&gt; &lt;/classpath&gt; &lt;/java&gt; &lt;/target&gt; &lt;/project&gt;</span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><strong>运行 Ant 构建示例</strong> <br />
开发过程中的下一步是运行将创建和测试 HelloWorld 类的构建。清单 5 显示了构建的结果，其中包括了各个目标部分。最酷的那部分是 runtests 输出语句：它告诉我们整个测试套件都正确运行了。 </p>
<p>我在图 4 和图 5 中显示了 JUnit GUI，其中所要做的就是将 runtest 目标从 <code><span style="font-family: 新宋体;">junit.textui.TestRunner</span></code> 改为 <code><span style="font-family: 新宋体;">junit.ui.TestRunner</span></code>
。当您使用 JUnit 的 GUI 部分时，您必须选择退出按钮来继续构建过程。如果使用 Junit GUI
构建包，那么它将更难与大型的构建过程相集成。另外，文本输出也与构建过程更一致，并可以定向输出到一个用于主构建记录的文本文件。这对于每天晚上都要进
行的构建非常合适。 </p>
<br />
<a name="N10286"><strong>清单 5. 构建输出示例</strong></a><br />
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><span style="font-family: Lucida Console;">E:"projects"sample&gt;ant runtestsSearching for build.xml ... Build E:"projects"sample"build.xmlJUNIT:compile: [mkdir] Created dir: E:"projects"sample"build"classes [javac] Compiling 1 source file to E:"projects"sample"build"classesjar: [mkdir] Created dir: E:"projects"sample"build"lib [jar] Building jar: E:"projects"sample"build"lib"sample.jarcompiletests: [mkdir] Created dir: E:"projects"sample"build"testcases [javac] Compiling 3 source files to E:"projects"sample"build"testcases runtests: [junit] .. [junit] Time: 0.031 [junit] [junit] OK (2 tests) [junit]BUILD SUCCESSFULTotal time: 1 second </span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<a name="N10292"><strong>图 4. JUnit GUI 测试成功</strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image004.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /> <br />
<br />
<a name="6"><strong>图 5. JUnit GUI 测试失败</strong></a><br />
<img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image005.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /> <br />
<br />
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
            <img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /></td>
        </tr>
    </tbody>
</table>
<table align="right" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
            <table border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)"  alt="" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/j-ant/index.html#main"><strong><span style="color: #996699;">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N102AE"><span style="font-size: 14pt;">了解测试的工作原理</span></a></p>
<p>让我们搞点破坏，然后看看会发生什么事。夜深了，我们决定把 "Hello World" 变成一个静态字符串。在更改期间，我们 <em>不小心</em>打错了字母，将 "o" 变成了 "0"，如清单 6 所示。 <br />
<a name="N102BA"><strong>清单 6. Hello world 类更改</strong></a><br />
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><span style="font-family: Lucida Console;">package com.company;public class HelloWorld { private final static String HELLO_WORLD = "Hell0 World"; public String sayHello() { return HELLO_WORLD; }}</span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>在建包时，我们看到了错误。清单 7 显示了 runtest 中的错误。它显示了失败的测试类和测试方法，并说明了为什么会失败。我们返回到代码中，改正错误后离开。</p>
<br />
<a name="N102C7"><strong>清单 7. 构建错误示例</strong></a><br />
<table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <pre><code><span style="font-family: Lucida Console;">E:"projects"sample&gt;ant runtestsSearching for build.xml ... Build E:"projects"sample"build.xmlJUNIT:compile:jar:compiletests:runtests: [junit] ..F [junit] Time: 0 [junit] [junit] FAILURES!!! [junit] Test Results: [junit] Run: 2 Failures: 1 Errors: 0 [junit] There was 1 failure: [junit] 1) testSayHello(test.com.company.HelloWorldTest) "expected:&lt;Hello World&gt; but was:&lt;Hell0 World&gt;" [junit]BUILD FAILED E:"projects"sample"build.xml:35: Java returned: -1Total time: 0 seconds</span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/libin2722/aggbug/179852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 22:54 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对google个性主页的拖拽效果的js的完整注释－1</title><link>http://www.blogjava.net/libin2722/archive/2008/02/13/179851.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 13 Feb 2008 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2008/02/13/179851.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/179851.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2008/02/13/179851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/179851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/179851.html</trackback:ping><description><![CDATA[<span style="color: #008000;">//</span> <span style="color: #008000;">工具类，使用Util的命名空间，方便管理</span> <span style="color: #008000;"><br />
</span><span style="color: #0000ff;">var</span> <span style="color: #000000;">&nbsp;Util&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #0000ff;">new</span> <span style="color: #000000;">&nbsp;Object();<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">获取http&nbsp;header里面的UserAgent，浏览器信息</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.getUserAgent&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;navigator.userAgent;<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">是否是Gecko核心的Browser，比如Mozila、Firefox</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.isGecko&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;Util.getUserAgent.indexOf(</span> <span style="color: #000000;">"</span> <span style="color: #000000;">Gecko</span> <span style="color: #000000;">"</span> <span style="color: #000000;">)&nbsp;</span> <span style="color: #000000;">!=</span> &nbsp; <span style="color: #000000;">-</span> <span style="color: #000000;">1</span> <span style="color: #000000;">;<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">是否是Opera</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.isOpera&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;Util.getUserAgent.indexOf(</span> <span style="color: #000000;">"</span> <span style="color: #000000;">Opera</span> <span style="color: #000000;">"</span> <span style="color: #000000;">)&nbsp;</span> <span style="color: #000000;">!=</span> &nbsp; <span style="color: #000000;">-</span> <span style="color: #000000;">1</span> <span style="color: #000000;">;<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">获取一个element的offset信息，其实就是相对于Body的padding以内的绝对坐标</span> <span style="color: #008000;"><br />
//</span> <span style="color: #008000;">后面一个参数如果是true则获取offsetLeft，false则是offsetTop</span> <span style="color: #008000;"><br />
//</span> <span style="color: #008000;">关于offset、style、client等坐标的定义参考dindin的这个帖子：http://www.jroller.com/page/dindin/?anchor=pro_java_12</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.getOffset&nbsp;</span> <span style="color: #000000;">=</span> &nbsp;  <span style="color: #000000;">&nbsp;(el,&nbsp;isLeft)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">var</span> <span style="color: #000000;">&nbsp;ret&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">0</span> <span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">while</span> <span style="color: #000000;">&nbsp;(el&nbsp;</span> <span style="color: #000000;">!=</span> &nbsp; <span style="color: #0000ff;">null</span> <span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span> <span style="color: #000000;">+=</span> <span style="color: #000000;">&nbsp;el[</span> <span style="color: #000000;">"</span> <span style="color: #000000;">offset</span> <span style="color: #000000;">"</span> &nbsp; <span style="color: #000000;">+</span> <span style="color: #000000;">&nbsp;(isLeft&nbsp;</span> <span style="color: #000000;">?</span> &nbsp; <span style="color: #000000;">"</span> <span style="color: #000000;">Left</span> <span style="color: #000000;">"</span> <span style="color: #000000;">&nbsp;:&nbsp;</span> <span style="color: #000000;">"</span> <span style="color: #000000;">Top</span> <span style="color: #000000;">"</span> <span style="color: #000000;">)];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;el.offsetParent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">return</span> <span style="color: #000000;">&nbsp;ret;<br />
};<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">将一个（参数中的funcName是这个fuction的名字）绑定到一个element上，并且以这个element的上下文运行，其实是一种继承，这个可以google些文章看看</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.bind&nbsp;</span> <span style="color: #000000;">=</span> &nbsp;  <span style="color: #000000;">&nbsp;(el,&nbsp;fucName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">return</span> &nbsp;  <span style="color: #000000;">&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">return</span> <span style="color: #000000;">&nbsp;el[fucName].apply(el,&nbsp;arguments);<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
};<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">重新计算所有的可以拖拽的element的坐标，对同一个column下面的可拖拽图层重新计算它们的高度而得出新的坐标，防止遮叠</span> <span style="color: #008000;"><br />
//</span> <span style="color: #008000;">计算出来的坐标记录在pagePosLeft和pagePosTop两个属性里面</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.re_calcOff&nbsp;</span> <span style="color: #000000;">=</span> &nbsp;  <span style="color: #000000;">&nbsp;(el)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">for</span> <span style="color: #000000;">&nbsp;(</span> <span style="color: #0000ff;">var</span> <span style="color: #000000;">&nbsp;i&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">0</span> <span style="color: #000000;">;&nbsp;i&nbsp;</span> <span style="color: #000000;">&lt;</span> <span style="color: #000000;">&nbsp;Util.dragArray.length;&nbsp;i</span> <span style="color: #000000;">++</span> <span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">var</span> <span style="color: #000000;">&nbsp;ele&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;Util.dragArray[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ele.elm.pagePosLeft&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;Util.getOffset(ele.elm,&nbsp;</span> <span style="color: #0000ff;">true</span> <span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ele.elm.pagePosTop&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;Util.getOffset(ele.elm,&nbsp;</span> <span style="color: #0000ff;">false</span> <span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">var</span> <span style="color: #000000;">&nbsp;nextSib&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;el.elm.nextSibling;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">while</span> <span style="color: #000000;">&nbsp;(nextSib)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextSib.pagePosTop&nbsp;</span> <span style="color: #000000;">-=</span> <span style="color: #000000;">&nbsp;el.elm.offsetHeight;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextSib&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;nextSib.nextSibling;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
};<br />
<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">隐藏Google&nbsp;Ig中间那个table，也就是拖拽的容器，配合show一般就是刷新用，解决一些浏览器的怪癖</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.hide&nbsp;</span> <span style="color: #000000;">=</span> &nbsp;  <span style="color: #000000;">&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Util.rootElement.style.display&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">"</span> <span style="color: #000000;">none</span> <span style="color: #000000;">"</span> <span style="color: #000000;">;<br />
};<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">显示Google&nbsp;Ig中间那个table，解释同上</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">Util.show&nbsp;</span> <span style="color: #000000;">=</span> &nbsp;  <span style="color: #000000;">&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Util.rootElement.style.display&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">""</span> <span style="color: #000000;">;<br />
};<br />
<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">移动时显示的占位虚线框</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">ghostElement&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #0000ff;">null</span> <span style="color: #000000;">;<br />
</span><span style="color: #008000;">//</span> <span style="color: #008000;">获取这个虚线框，通过dom动态生成</span> <span style="color: #008000;"><br />
</span><span style="color: #000000;">getGhostElement&nbsp;</span> <span style="color: #000000;">=</span> &nbsp;  <span style="color: #000000;">&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">if</span> <span style="color: #000000;">&nbsp;(</span> <span style="color: #000000;">!</span> <span style="color: #000000;">ghostElement)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ghostElement&nbsp;</span> <span style="color: #000000;">=</span> <span style="color: #000000;">&nbsp;createElement(</span> <span style="color: #000000;">"</span> <span style="color: #000000;">DIV</span> <span style="color: #000000;">"</span> <span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ghostElement.className&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">"</span> <span style="color: #000000;">modbox</span> <span style="color: #000000;">"</span> <span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ghostElement.backgroundColor&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">""</span> <span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ghostElement.style.border&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">"</span> <span style="color: #000000;">2px&nbsp;dashed&nbsp;#aaa</span> <span style="color: #000000;">"</span> <span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ghostElement.innerHTML&nbsp;</span> <span style="color: #000000;">=</span> &nbsp; <span style="color: #000000;">"</span> <span style="color: #000000;">&amp;nbsp;</span> <span style="color: #000000;">"</span> <span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff;">return</span> <span style="color: #000000;">&nbsp;ghostElement;<br />
};<br />
</span>
<p>// 初始化可以拖拽的Element的函数，与拖拽无关的我去掉了 <br />
&nbsp; draggable(el) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 公用的开始拖拽的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._dragStart&nbsp; =&nbsp; start_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 公用的正在拖拽的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._drag&nbsp; =&nbsp; when_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 公用的拖拽结束的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._dragEnd&nbsp; =&nbsp; end_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 这个函数主要用来进行拖拽结束后的dom处理 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._afterDrag&nbsp; =&nbsp; after_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 是否正在被拖动，一开始当然没有被拖动 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 将这个Element的this指针注册在elm这个变量里面，方便在自己的上下文以外调用自己的函数等，很常用的方法 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm&nbsp; =&nbsp; el;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 触发拖拽的Element，在这里就是这个div上显示标题的那个div <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .header&nbsp; =&nbsp; getElementById(el.id&nbsp; +&nbsp;&nbsp; " _h " );<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 对于有i的element拖拽不同，这里检测一下并记录 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .hasI&nbsp; =&nbsp;&nbsp; this .elm.getElementsByTagName( " I " ).length&nbsp; &gt;&nbsp;&nbsp; 0 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 如果找到了header就绑定drag相关的event <br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( this .header) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽时的叉子鼠标指针 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .header.style.cursor&nbsp; =&nbsp;&nbsp; " move " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将函数绑定到header和element的this上，参照那个函数的说明 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drag.init( this .header,&nbsp; this .elm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面三个语句将写好的三个函数绑定给这个elemnt的三个函数钩子上，也就实现了element从draggable继承可拖拽的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDragStart&nbsp; =&nbsp; Util.bind( this ,&nbsp; " _dragStart " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDrag&nbsp; =&nbsp; Util.bind( this ,&nbsp; " _drag " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDragEnd&nbsp; =&nbsp; Util.bind( this ,&nbsp; " _dragEnd " );<br />
&nbsp;&nbsp;&nbsp; }<br />
};</p>
// 下面就是draggable里面用到的那4个 <br />
// 公用的开始拖拽的函数 <br />
&nbsp; start_Drag() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 重置坐标，实现拖拽以后自己的位置马上会被填充的效果 <br />
&nbsp;&nbsp;&nbsp; Util.re_calcOff( this );<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 记录原先的邻居节点，用来对比是否被移动到新的位置 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .origNextSibling&nbsp; =&nbsp;&nbsp; this .elm.nextSibling;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取移动的时候那个灰色的虚线框 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _ghostElement&nbsp; =&nbsp; getGhostElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取正在移动的这个对象的高度 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offH&nbsp; =&nbsp;&nbsp; this .elm.offsetHeight;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isGecko) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 修正gecko引擎的怪癖吧 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offH&nbsp; -=&nbsp; parseInt(_ghostElement.style.borderTopWidth)&nbsp; *&nbsp;&nbsp; 2 ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取正在移动的这个对象的宽度 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offW&nbsp; =&nbsp;&nbsp; this .elm.offsetWidth;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取left和top的坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offLeft&nbsp; =&nbsp; Util.getOffset( this .elm,&nbsp; true );<br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offTop&nbsp; =&nbsp; Util.getOffset( this .elm,&nbsp; false );<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 防止闪烁，现隐藏 <br />
&nbsp;&nbsp;&nbsp; Util.hide();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 将自己的宽度记录在style属性里面 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.width&nbsp; =&nbsp; offW&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 将那个灰框设定得与正在拖动的对象一样高，比较形象 <br />
&nbsp;&nbsp;&nbsp; _ghostElement.style.height&nbsp; =&nbsp; offH&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 把灰框放到这个对象原先的位置上 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.parentNode.insertBefore(_ghostElement,&nbsp; this .elm.nextSibling);<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 由于要拖动必须将被拖动的对象从原先的盒子模型里面抽出来，所以设定position为absolute，这个可以参考一下css布局方面的知识 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.position&nbsp; =&nbsp;&nbsp; " absolute " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 设置zIndex，让它处在最前面一层，当然其实zIndex=100是让它很靠前，如果页面里有zIndex&gt;100的，那&#8230;&#8230; <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.zIndex&nbsp; =&nbsp;&nbsp; 100 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 由于position=absolute了，所以left和top实现绝对坐标定位，这就是先前计算坐标的作用，不让这个模型乱跑，要从开始拖动的地方开始移动 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.left&nbsp; =&nbsp; offLeft&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.top&nbsp; =&nbsp; offTop&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 坐标设定完毕，可以显示了，这样就不会闪烁了 <br />
&nbsp;&nbsp;&nbsp; Util.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 这里本来有个ig_d.G，没搞明白干什么用的，不过没有也可以用，谁知道麻烦告诉我一声，不好意思 <br />
&nbsp;&nbsp;&nbsp;&nbsp; // 还没有开始拖拽，这里做个记号 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />
};<br />
<br />
<div><span style="color: #008000;">// 初始化可以拖拽的Element的函数，与拖拽无关的我去掉了 <br />
&nbsp; draggable(el) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 公用的开始拖拽的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._dragStart&nbsp; =&nbsp; start_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 公用的正在拖拽的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._drag&nbsp; =&nbsp; when_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 公用的拖拽结束的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._dragEnd&nbsp; =&nbsp; end_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 这个函数主要用来进行拖拽结束后的dom处理 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this ._afterDrag&nbsp; =&nbsp; after_Drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 是否正在被拖动，一开始当然没有被拖动 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 将这个Element的this指针注册在elm这个变量里面，方便在自己的上下文以外调用自己的函数等，很常用的方法 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm&nbsp; =&nbsp; el;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 触发拖拽的Element，在这里就是这个div上显示标题的那个div <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .header&nbsp; =&nbsp; getElementById(el.id&nbsp; +&nbsp;&nbsp; " _h " );<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 对于有i的element拖拽不同，这里检测一下并记录 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .hasI&nbsp; =&nbsp;&nbsp; this .elm.getElementsByTagName( " I " ).length&nbsp; &gt;&nbsp;&nbsp; 0 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 如果找到了header就绑定drag相关的event <br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( this .header) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽时的叉子鼠标指针 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .header.style.cursor&nbsp; =&nbsp;&nbsp; " move " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将函数绑定到header和element的this上，参照那个函数的说明 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drag.init( this .header,&nbsp; this .elm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面三个语句将写好的三个函数绑定给这个elemnt的三个函数钩子上，也就实现了element从draggable继承可拖拽的函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDragStart&nbsp; =&nbsp; Util.bind( this ,&nbsp; " _dragStart " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDrag&nbsp; =&nbsp; Util.bind( this ,&nbsp; " _drag " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDragEnd&nbsp; =&nbsp; Util.bind( this ,&nbsp; " _dragEnd " );<br />
&nbsp;&nbsp;&nbsp; }<br />
};</span></div>
<span style="color: #008000;">// 下面就是draggable里面用到的那4个 <br />
// 公用的开始拖拽的函数 <br />
&nbsp; start_Drag() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 重置坐标，实现拖拽以后自己的位置马上会被填充的效果 <br />
&nbsp;&nbsp;&nbsp; Util.re_calcOff( this );<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 记录原先的邻居节点，用来对比是否被移动到新的位置 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .origNextSibling&nbsp; =&nbsp;&nbsp; this .elm.nextSibling;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取移动的时候那个灰色的虚线框 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _ghostElement&nbsp; =&nbsp; getGhostElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取正在移动的这个对象的高度 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offH&nbsp; =&nbsp;&nbsp; this .elm.offsetHeight;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isGecko) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 修正gecko引擎的怪癖吧 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offH&nbsp; -=&nbsp; parseInt(_ghostElement.style.borderTopWidth)&nbsp; *&nbsp;&nbsp; 2 ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取正在移动的这个对象的宽度 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offW&nbsp; =&nbsp;&nbsp; this .elm.offsetWidth;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取left和top的坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offLeft&nbsp; =&nbsp; Util.getOffset( this .elm,&nbsp; true );<br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offTop&nbsp; =&nbsp; Util.getOffset( this .elm,&nbsp; false );<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 防止闪烁，现隐藏 <br />
&nbsp;&nbsp;&nbsp; Util.hide();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 将自己的宽度记录在style属性里面 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.width&nbsp; =&nbsp; offW&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 将那个灰框设定得与正在拖动的对象一样高，比较形象 <br />
&nbsp;&nbsp;&nbsp; _ghostElement.style.height&nbsp; =&nbsp; offH&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 把灰框放到这个对象原先的位置上 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.parentNode.insertBefore(_ghostElement,&nbsp; this .elm.nextSibling);<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 由于要拖动必须将被拖动的对象从原先的盒子模型里面抽出来，所以设定position为absolute，这个可以参考一下css布局方面的知识 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.position&nbsp; =&nbsp;&nbsp; " absolute " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 设置zIndex，让它处在最前面一层，当然其实zIndex=100是让它很靠前，如果页面里有zIndex&gt;100的，那&#8230;&#8230; <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.zIndex&nbsp; =&nbsp;&nbsp; 100 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 由于position=absolute了，所以left和top实现绝对坐标定位，这就是先前计算坐标的作用，不让这个模型乱跑，要从开始拖动的地方开始移动 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.left&nbsp; =&nbsp; offLeft&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.top&nbsp; =&nbsp; offTop&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 坐标设定完毕，可以显示了，这样就不会闪烁了 <br />
&nbsp;&nbsp;&nbsp; Util.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 这里本来有个ig_d.G，没搞明白干什么用的，不过没有也可以用，谁知道麻烦告诉我一声，不好意思 <br />
&nbsp;&nbsp;&nbsp;&nbsp; // 还没有开始拖拽，这里做个记号 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />
};<br />
</span><span style="color: #000000;">// 在拖拽时的相应函数，由于绑定到鼠标的move这个event上，所以会传入鼠标的坐标clientX, clientY <br />
&nbsp; when_Drag(clientX, clientY) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 刚开始拖拽的时候将图层变透明，并标记为正在被拖拽 <br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( ! this .isDragging) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.filter&nbsp; =&nbsp;&nbsp; " alpha(opacity=70) " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.opacity&nbsp; =&nbsp;&nbsp; 0.7 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; true ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 被拖拽到的新的column（当然也可以是原来那个） <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; found&nbsp; =&nbsp;&nbsp; null ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 最大的距离，可能是防止溢出或者什么bug <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; max_distance&nbsp; =&nbsp;&nbsp; 100000000 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 遍历所有的可拖拽的element，寻找离当前鼠标坐标最近的那个可拖拽元素，以便后面插入 <br />
&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; i&nbsp; =&nbsp;&nbsp; 0 ; i&nbsp; &lt;&nbsp; Util.dragArray.length; i ++ ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; Util.dragArray[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 利用勾股定理计算鼠标到遍历到的这个元素的距离 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
var&nbsp; distance&nbsp; =&nbsp; Math.sqrt(Math.pow(clientX&nbsp; -&nbsp; ele.elm.pagePosLeft,&nbsp;
2 )&nbsp; +&nbsp; Math.pow(clientY&nbsp; -&nbsp; ele.elm.pagePosTop,&nbsp; 2 ));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 自己已经浮动了，所以不计算自己的 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (ele&nbsp; ==&nbsp;&nbsp; this ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果计算失败继续循环 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (isNaN(distance)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果更小，记录下这个距离，并将它作为found <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (distance&nbsp; &lt;&nbsp; max_distance) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max_distance&nbsp; =&nbsp; distance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found&nbsp; =&nbsp; ele;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 准备让灰框落脚 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _ghostElement&nbsp; =&nbsp; getGhostElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 如果找到了另外的落脚点 <br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (found&nbsp; !=&nbsp;&nbsp; null&nbsp;&nbsp; &amp;&amp;&nbsp; _ghostElement.nextSibling&nbsp; !=&nbsp; found.elm) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 找到落脚点就先把灰框插进去，这就是我们看到的那个灰框停靠的特效，有点像吸附的感觉，哈哈 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found.elm.parentNode.insertBefore(_ghostElement, found.elm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isOpera) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Opera的现实问题，要隐藏/显示后才能刷新出变化 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body.style.display&nbsp; =&nbsp;&nbsp; " none " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body.style.display&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
// 拖拽完毕 <br />
&nbsp; end_Drag() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽完毕后执行后面的钩子，执行after_Drag()，如果布局发生了变动了就记录到远程服务器，保存你拖拽后新的布局顺序 <br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( this ._afterDrag()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remote call to save the change <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; true ;<br />
};<br />
// 拖拽后的执行钩子 <br />
&nbsp; after_Drag() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; return&nbsp; =&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 防止闪烁 <br />
&nbsp;&nbsp;&nbsp; Util.hide();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 把拖拽时的position=absolute和相关的那些style都消除 <br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.position&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.width&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.zIndex&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.filter&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.opacity&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 获取灰框 <br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; getGhostElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 如果现在的邻居不是原来的邻居了 <br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (ele.nextSibling&nbsp; !=&nbsp;&nbsp; this .origNextSibling) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把被拖拽的这个节点插到灰框的前面 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele.parentNode.insertBefore( this .elm, ele.nextSibling);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 标明被拖拽了新的地方 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; =&nbsp;&nbsp; true ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 移除灰框，这是这个灰框的生命周期应该就结束了 <br />
&nbsp;&nbsp;&nbsp; ele.parentNode.removeChild(ele);<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 修改完毕，显示 <br />
&nbsp;&nbsp;&nbsp; Util.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isOpera) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Opera的现实问题，要隐藏/显示后才能刷新出变化 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body.style.display&nbsp; =&nbsp;&nbsp; " none " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body.style.display&nbsp; =&nbsp;&nbsp; "" ;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; return;<br />
};<br />
</span><span style="color: #000000;"><br />
<br />
</span>
<p><span style="color: #008000;">// 可拖拽Element的原形，用来将event绑定到各个钩子，这部分市比较通用的，netvibes也是基本完全相同的实现 <br />
// 这部分推荐看dindin的这个，也会帮助理解，<a href="http://www.jroller.com/page/dindin/?anchor=pro_java_12">http://www.jroller.com/page/dindin/?anchor=pro_java_12</a> <br />
var&nbsp; Drag&nbsp; =&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 对这个element的引用，一次只能拖拽一个Element <br />
&nbsp;&nbsp;&nbsp; obj: null , <br />
&nbsp;&nbsp;&nbsp;&nbsp; // element是被拖拽的对象的引用，elementHeader就是鼠标可以拖拽的区域 <br />
&nbsp;&nbsp;&nbsp; init: &nbsp; (elementHeader, element) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将start绑定到down事件，按下鼠标触发start <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elementHeader.down&nbsp; =&nbsp; Drag.start;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将element存到header的obj里面，方便header拖拽的时候引用 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elementHeader.obj&nbsp; =&nbsp; element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 初始化绝对的坐标，因为不是position=absolute所以不会起什么作用，但是防止后面onDrag的时候parse出错了 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (isNaN(parseInt(element.style.left))) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.left&nbsp; =&nbsp;&nbsp; " 0px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (isNaN(parseInt(element.style.top))) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.top&nbsp; =&nbsp;&nbsp; " 0px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 挂上空，初始化这几个成员，在Drag.init被调用后才帮定到实际的函数，可以参照draggable里面的内容 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDragStart&nbsp; =&nbsp;&nbsp; new&nbsp; ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDragEnd&nbsp; =&nbsp;&nbsp; new&nbsp; ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDrag&nbsp; =&nbsp;&nbsp; new&nbsp; ();<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 开始拖拽的绑定，绑定到鼠标的移动的event上 <br />
&nbsp;&nbsp;&nbsp; start: &nbsp; (event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; element&nbsp; =&nbsp; Drag.obj&nbsp; =&nbsp;&nbsp; this .obj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event&nbsp; =&nbsp; Drag.fixE(event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 看看是不是左键点击 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (event.which&nbsp; !=&nbsp;&nbsp; 1 ) {<br />
&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; return&nbsp;&nbsp; true ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参照这个函数的解释，挂上开始拖拽的钩子 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDragStart();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 记录鼠标坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseX&nbsp; =&nbsp; event.clientX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseY&nbsp; =&nbsp; event.clientY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将Global的event绑定到被拖动的element上面来 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up&nbsp; =&nbsp; Drag.end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move&nbsp; =&nbsp; Drag.drag;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp; }, <br />
&nbsp;&nbsp;&nbsp;&nbsp; // Element正在被拖动的函数 <br />
&nbsp;&nbsp;&nbsp; drag: &nbsp; (event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event&nbsp; =&nbsp; Drag.fixE(event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 看看是不是左键点击 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (event.which&nbsp; ==&nbsp;&nbsp; 0 ) {<br />
&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; return&nbsp; Drag.end();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 正在被拖动的Element <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; element&nbsp; =&nbsp; Drag.obj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 鼠标坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _clientX&nbsp; =&nbsp; event.clientY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _clientY&nbsp; =&nbsp; event.clientX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果鼠标没动就什么都不作 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (element.lastMouseX&nbsp; ==&nbsp; _clientY&nbsp; &amp;&amp;&nbsp; element.lastMouseY&nbsp; ==&nbsp; _clientX) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 刚才Element的坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _lastX&nbsp; =&nbsp; parseInt(element.style.top);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _lastY&nbsp; =&nbsp; parseInt(element.style.left);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 新的坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; newX, newY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 计算新的坐标：原先的坐标+鼠标移动的值差 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newX&nbsp; =&nbsp; _lastY&nbsp; +&nbsp; _clientY&nbsp; -&nbsp; element.lastMouseX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newY&nbsp; =&nbsp; _lastX&nbsp; +&nbsp; _clientX&nbsp; -&nbsp; element.lastMouseY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 修改element的显示坐标 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.left&nbsp; =&nbsp; newX&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.top&nbsp; =&nbsp; newY&nbsp; +&nbsp;&nbsp; " px " ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 记录element现在的坐标供下一次移动使用 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseX&nbsp; =&nbsp; _clientY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseY&nbsp; =&nbsp; _clientX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参照这个函数的解释，挂接上Drag时的钩子 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDrag(newX, newY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp;&nbsp; // Element正在被释放的函数，停止拖拽 <br />
&nbsp;&nbsp;&nbsp; end: &nbsp; (event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event&nbsp; =&nbsp; Drag.fixE(event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解除对Global的event的绑定 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move&nbsp; =&nbsp;&nbsp; null ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up&nbsp; =&nbsp;&nbsp; null ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 先记录下onDragEnd的钩子，好移除obj <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _onDragEndFuc&nbsp; =&nbsp; Drag.obj.onDragEnd();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽完毕，obj清空 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drag.obj&nbsp; =&nbsp;&nbsp; null ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; _onDragEndFuc;<br />
&nbsp;&nbsp;&nbsp; }, <br />
&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题 <br />
&nbsp;&nbsp;&nbsp; fixE: &nbsp; (ig_) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_&nbsp; =&nbsp; event;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_.layerX&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_.layerX&nbsp; =&nbsp; ig_.offsetX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_.layerY&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_.layerY&nbsp; =&nbsp; ig_.offsetY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_.which&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_.which&nbsp; =&nbsp; ig_.button;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; ig_;<br />
&nbsp;&nbsp;&nbsp; }<br />
};</span></p>
<p><span style="color: #008000;">// 下面是初始化的函数了，看看上面这些东西怎么被调用 <br />
var&nbsp; _IG_initDrag&nbsp; =&nbsp;&nbsp; &nbsp; (el) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // column那个容器，在google里面就是那个table布局的tbody，netvibes用的&lt;div&gt; <br />
&nbsp;&nbsp;&nbsp; Util.rootElement&nbsp; =&nbsp; el;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 这个tbody的行 <br />
&nbsp;&nbsp;&nbsp; Util._rows&nbsp; =&nbsp; Util.rootElement.tBodies[ 0 ].rows[ 0 ];<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 列，google是3列，其实也可以更多 <br />
&nbsp;&nbsp;&nbsp; Util.column&nbsp; =&nbsp; Util._rows.cells;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 用来存取可拖拽的对象 <br />
&nbsp;&nbsp;&nbsp; Util.dragArray&nbsp; =&nbsp;&nbsp; new&nbsp; Array();<br />
&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; counter&nbsp; =&nbsp;&nbsp; 0 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; i&nbsp; =&nbsp;&nbsp; 0 ; i&nbsp; &lt;&nbsp; Util.column.length; i ++ ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 搜索所有的column <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; Util.column[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; j&nbsp; =&nbsp;&nbsp; 0 ; j&nbsp; &lt;&nbsp; ele.childNodes.length; j ++ ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 搜索每一column里面的所有element <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele1&nbsp; =&nbsp; ele.childNodes[j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是div就把它初始化为一个draggable对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (ele1.tagName&nbsp; ==&nbsp;&nbsp; " DIV " ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Util.dragArray[counter]&nbsp; =&nbsp;&nbsp; new&nbsp; draggable(ele1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; counter ++ ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
};</span></p>
<p><span style="color: #008000;">// google的页面里可以拖动的部分的id是"t_1" <br />
// 挂载到，载入完毕执行。不过实际上google没有用。 <br />
// 而是写在页面最下面，异曲同工吧，也许直接写在页面是种怪癖，或者也有可能是兼容性考虑。 </span></p>
<p><span style="color: #008000;">// 请将下面两条被注释掉的代码加，到你自己下载的一个google ig页面里面，把里面的所有其余删除，挂上这个js也可以拖拽了，哈哈 <br />
// _table=getElementById("t_1"); <br />
//  = _IG_initDrag(_table); </span></p>
<span style="color: #008000;">// 其实看懂这些代码对学习java很有益，希望对大家能有帮助</span><br />
<img src ="http://www.blogjava.net/libin2722/aggbug/179851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-02-13 22:51 <a href="http://www.blogjava.net/libin2722/archive/2008/02/13/179851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调用IE内部的打印控件来实现打印功能</title><link>http://www.blogjava.net/libin2722/archive/2007/12/19/168763.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 19 Dec 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2007/12/19/168763.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/168763.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2007/12/19/168763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/168763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/168763.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">OBJECT&nbsp;</span><span style="color: #ff0000">classid</span><span style="color: #0000ff">=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2&nbsp;</span><span style="color: #ff0000">height</span><span style="color: #0000ff">=0&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">=WebBrowser&nbsp;</span><span style="color: #ff0000">width</span><span style="color: #0000ff">=0</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">OBJECT</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(1,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=打开</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(2,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=关闭所有</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(4,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=另存为</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(6,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=打印</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(6,6)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=直接打印</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(7,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=打印预览</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(8,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=页面设置</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(10,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=属性</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(17,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=全选</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(22,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=刷新</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">=Button&nbsp;</span><span style="color: #ff0000">onClick</span><span style="color: #0000ff">=document.all.WebBrowser.ExecWB(45,1)&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=关闭</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
再jsp页面中写入如下代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">object&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="WebBrowser"</span><span style="color: #ff0000">&nbsp;&nbsp;width</span><span style="color: #0000ff">=0&nbsp;&nbsp;</span><span style="color: #ff0000">height</span><span style="color: #0000ff">=0&nbsp;&nbsp;</span><span style="color: #ff0000">classid</span><span style="color: #0000ff">="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">object</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=&lt;s:text&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="message.printing"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;onclick=document.all.WebBrowser.ExecWB(6,6)&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=&lt;s:text&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="message.pagesetup"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;onclick=document.all.WebBrowser.ExecWB(8,1)&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">=button&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">=&lt;s:text&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="message.printview"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;onclick=document.all.WebBrowser.ExecWB(7,1)&gt;&nbsp;</span></div>
可以再页面上实现三个按钮，&#8220;直接打印&#8221;、&#8220;页面设置&#8221;、&#8220;打印预览&#8221;，点击三个按钮能够执行相应操作<br />
<br />
<br />
<img src ="http://www.blogjava.net/libin2722/aggbug/168763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-12-19 15:29 <a href="http://www.blogjava.net/libin2722/archive/2007/12/19/168763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中文件操作大全</title><link>http://www.blogjava.net/libin2722/archive/2007/11/08/159167.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 08 Nov 2007 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2007/11/08/159167.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/159167.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2007/11/08/159167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/159167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/159167.html</trackback:ping><description><![CDATA[<span class="bold">java中文件操作大全</span><br />
<br />
<div class="t_msgfont" id="message557657" style="font-size: 14px">一.获得控制台用户输入的信息<br />
<br />
/** *//**获得控制台用户输入的信息<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @return<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws IOException<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public String getInputMessage() throws IOException...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.out.println("请输入您的命令∶");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;byte buffer[]=new byte[1024];<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int count=System.in.read(buffer);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;char[] ch=new char[count-2];//最后两位为结束符，删去不要<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;for(int i=0;i&lt;count-2;i++)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;ch<em>=(char)buffer<em>;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String str=new String(ch);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return str;<br />
&nbsp; &nbsp; }<br />
可以返回用户输入的信息，不足之处在于不支持中文输入，有待进一步改进。<br />
<br />
二.复制文件<br />
<br />
1.以文件流的方式复制文件<br />
<br />
/** *//**以文件流的方式复制文件<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param src 文件源目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param dest 文件目的目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws IOException&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void copyFile(String src,String dest) throws IOException...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FileInputStream in=new FileInputStream(src);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File(dest);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!file.exists())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;file.createNewFile();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FileOutputStream out=new FileOutputStream(file);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int c;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;byte buffer[]=new byte[1024];<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;while((c=in.read(buffer))!=-1)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;for(int i=0;i&lt;c;i++)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.write(buffer<em>);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;in.close();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp; &nbsp; }<br />
该方法经过测试，支持中文处理，并且可以复制多种类型，比如txt，xml，jpg，doc等多种格式<br />
<br />
三.写文件<br />
<br />
1.利用PrintStream写文件<br />
<br />
/** *//**<br />
&nbsp; &nbsp;&nbsp;&nbsp;* 文件输出示例<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void PrintStreamDemo()...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try ...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;FileOutputStream out=new FileOutputStream("D:/test.txt");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;PrintStream p=new PrintStream(out);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;for(int i=0;i&lt;10;i++)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; p.println("This is "+i+" line");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (FileNotFoundException e) ...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp; }<br />
2.利用StringBuffer写文件<br />
<br />
public void StringBufferDemo() throws IOException......{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File("/root/sms.log");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!file.exists())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;file.createNewFile();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FileOutputStream out=new FileOutputStream(file,true);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;for(int i=0;i&lt;10000;i++)......{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;StringBuffer sb=new StringBuffer();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;sb.append("这是第"+i+"行:前面介绍的各种方法都不关用,为什么总是奇怪的问题 ");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;out.write(sb.toString().getBytes("utf-8"));<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp; &nbsp; }<br />
该方法可以设定使用何种编码，有效解决中文问题。<br />
<br />
四.文件重命名<br />
<br />
<br />
&nbsp; &nbsp; /** *//**文件重命名<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path 文件目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param oldname&nbsp;&nbsp;原来的文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param newname 新文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void renameFile(String path,String oldname,String newname)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!oldname.equals(newname))...{//新的文件名和以前文件名不同时,才有必要进行重命名<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;File oldfile=new File(path+"/"+oldname);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;File newfile=new File(path+"/"+newname);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同，则不允许重命名<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.println(newname+"已经存在！");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;else...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; oldfile.renameTo(newfile);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp; }五.转移文件目录 <br />
<br />
<br />
转移文件目录不等同于复制文件，复制文件是复制后两个目录都存在该文件，而转移文件目录则是转移后，只有新目录中存在该文件。 <br />
<br />
&nbsp; &nbsp; /** *//**转移文件目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param filename 文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param oldpath 旧目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param newpath 新目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param cover 若新目录下存在和转移文件具有相同文件名的文件时，是否覆盖新目录下文件，cover=true将会覆盖原文件，否则不操作<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!oldpath.equals(newpath))...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;File oldfile=new File(oldpath+"/"+filename);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;File newfile=new File(newpath+"/"+filename);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if(newfile.exists())...{//若在待转移目录下，已经存在待转移文件<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if(cover)//覆盖<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;oldfile.renameTo(newfile);<br />
&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;System.out.println("在新目录下已经存在："+filename);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;else...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; oldfile.renameTo(newfile);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp; &nbsp; <br />
&nbsp; &nbsp; }<br />
<br />
<br />
<br />
六.读文件<br />
<br />
1.利用FileInputStream读取文件<br />
<br />
<br />
&nbsp; &nbsp; /** *//**读文件<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @return<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws IOException<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public String FileInputStreamDemo(String path) throws IOException...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File(path);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!file.exists()||file.isDirectory())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;throw new FileNotFoundException();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FileInputStream fis=new FileInputStream(file);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;byte[] buf = new byte[1024];<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;StringBuffer sb=new StringBuffer();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;while((fis.read(buf))!=-1)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;sb.append(new String(buf));&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;buf=new byte[1024];//重新生成，避免和上次读取的数据重复<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return sb.toString();<br />
&nbsp; &nbsp; }<br />
<br />
<br />
2.利用BufferedReader读取<br />
<br />
在IO操作，利用BufferedReader和BufferedWriter效率会更高一点 <br />
<br />
&nbsp; &nbsp; /** *//**读文件<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @return<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws IOException<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public String BufferedReaderDemo(String path) throws IOException...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File(path);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!file.exists()||file.isDirectory())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;throw new FileNotFoundException();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;BufferedReader br=new BufferedReader(new FileReader(file));<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String temp=null;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;StringBuffer sb=new StringBuffer();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;temp=br.readLine();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;while(temp!=null)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;sb.append(temp+" ");<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;temp=br.readLine();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return sb.toString();<br />
&nbsp; &nbsp; }<br />
<br />
<br />
3.利用dom4j读取xml文件 <br />
<br />
&nbsp; &nbsp; /** *//**从目录中读取xml文件<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path 文件目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @return<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws DocumentException<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws IOException<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public Document readXml(String path) throws DocumentException, IOException...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File(path);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;BufferedReader bufferedreader = new BufferedReader(new FileReader(file));<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SAXReader saxreader = new SAXReader();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Document document = (Document)saxreader.read(bufferedreader);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;bufferedreader.close();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return document;<br />
&nbsp; &nbsp; }<br />
<br />
<br />
七.创建文件(文件夹)<br />
<br />
1.创建文件夹&nbsp;&nbsp;/** *//**创建文件夹<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path&nbsp;&nbsp;目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void createDir(String path)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File dir=new File(path);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!dir.exists())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;dir.mkdir();<br />
&nbsp; &nbsp; }<br />
2.创建新文件 /** *//**创建新文件<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path 目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param filename 文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @throws IOException<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void createFile(String path,String filename) throws IOException...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File(path+"/"+filename);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(!file.exists())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;file.createNewFile();<br />
&nbsp; &nbsp; }<br />
八.删除文件(目录)<br />
<br />
1.删除文件&nbsp; &nbsp;&nbsp;&nbsp;/** *//**删除文件<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path 目录<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param filename 文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void delFile(String path,String filename)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File file=new File(path+"/"+filename);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(file.exists()&amp;&amp;file.isFile())<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;file.delete();<br />
&nbsp; &nbsp; }<br />
2.删除目录<br />
要利用File类的delete()方法删除目录时，必须保证该目录下没有文件或者子目录，否则删除失败，因此在实际应用中，我们要删除目录，必须利用递归删除该目录下的所有子目录和文件，然后再删除该目录。&nbsp;&nbsp;/** *//**递归删除文件夹<br />
&nbsp; &nbsp;&nbsp;&nbsp;* @param path<br />
&nbsp; &nbsp;&nbsp;&nbsp;*/<br />
&nbsp; &nbsp; public void delDir(String path)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File dir=new File(path);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(dir.exists())...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;File[] tmp=dir.listFiles();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;for(int i=0;i&lt;tmp.length;i++)...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if(tmp<em>.isDirectory())...{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;delDir(path+"/"+tmp<em>.getName());<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br />
&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;tmp<em>.delete();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;dir.delete();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />
&nbsp; &nbsp; }</div>
</em></em></em></em></em></em>
<img src ="http://www.blogjava.net/libin2722/aggbug/159167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-11-08 21:04 <a href="http://www.blogjava.net/libin2722/archive/2007/11/08/159167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写你自己的单点登录（SSO）服务 </title><link>http://www.blogjava.net/libin2722/archive/2007/09/11/144175.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Tue, 11 Sep 2007 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/archive/2007/09/11/144175.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/144175.html</wfw:comment><comments>http://www.blogjava.net/libin2722/archive/2007/09/11/144175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/144175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/144175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要：单点登录（SSO）的技术被越来越广泛地运用到各个领域的软件系统当中。本文从业务的角度分析了单点登录的需求和应用领域；从技术本身的角度分析了单点登录技术的内部机制和实现手段，并且给出Web-SSO和桌面SSO的实现、源代码和详细讲解；还从安全和性能的角度对现有的实现技术进行进一步分析，指出相应的风险和需要改进的方面。本文除了从多个方面和角度给出了对单点登录（SSO）的全面分析，还并且讨论了如何...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/archive/2007/09/11/144175.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/144175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2007-09-11 10:31 <a href="http://www.blogjava.net/libin2722/archive/2007/09/11/144175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>