﻿<?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/fisher/category/18300.html</link><description>天行健，君子以自强不息。地势坤，君子以厚德载物。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:37:59 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:37:59 GMT</pubDate><ttl>60</ttl><item><title>Subversion(SVN)安装使用指南 (转)</title><link>http://www.blogjava.net/fisher/articles/98232.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Tue, 06 Feb 2007 04:13:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/98232.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/98232.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/98232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/98232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/98232.html</trackback:ping><description><![CDATA[
		<div class="entry" id="post-32">
				<!--DOCUMENT_FRAGMENT-->
				<h3 class="entry-header">
						<a title="Permanent Link to &quot;Subversion(SVN)安装使用指南&quot;" href="http://cube316.net/blog/archives/200512/32" rel="bookmark">Subversion(SVN)安装使用指南 </a>
				</h3>
				<p>
						<font color="blue">※简述※</font>
				</p>
				<p>
						<a href="http://subversion.tigris.org/" target="_top">Subversion</a>是近期在开源社区中非常流行的一款版本控制软件，它是CVS的替代产物。</p>
				<p>它的主要特征有：</p>
				<ul>
						<li>CVS大部分的功能。 
</li>
						<li>支持“目录”级别的版本管理，并且解决了CVS中迟迟未能解决的文件重命名和移动等问题。甚至对文件或文件夹的属性都提供了版本管理。 
</li>
						<li>“提交（commit）”实现了真正意义上的原子操作。也就是类似数据库中的事务的功能。 
</li>
						<li>版本号依据每次提交而改变，不再针对每个文件。日志信息也是针对每次提交而设置。所以看到版本号是几百或者几千也不用太惊讶，表示方式不一样罢了。 
</li>
						<li>通过WebDAV/DeltaV协议，可以与Apache的网络服务无缝衔接（通过Apache来运行）。这样就能提供一些额外的功能，例如：认证，压缩传输，以及数据仓库（Repository，见下）的浏览等。 
</li>
						<li>也可以作为独立服务器运行，但这样的话提供的功能较为简单薄弱。 
</li>
						<li>两种运行模式都支持SSH（当然需要各自的支持和配置） 
</li>
						<li>降低了分支（Branch）和标签（tag）上的时间消耗。底层设计理念和实现上的不同，不细说了。 
</li>
						<li>时间消耗依据的是文件改变部分的大小，而不是数据总量。 
</li>
						<li>创建数据仓库时，用户可以指定是使用内嵌的 BerkeleyDB 数据库，还是特定格式的文件系统。 </li>
				</ul>
				<p>其他还有些零星的小功能，具体可以参阅： <a href="http://subversion.tigris.org/roadmap.html" target="_top">http://subversion.tigris.org/roadmap.html</a></p>
				<p>这里解释一下 <font color="#006600">数据仓库</font> 的概念：<br />一个数据仓库对应的可以是一个项目，也可以是多个项目。SVN是基于数据仓库进行管理的。<br />按照用户习惯，可以只在每个数据仓库内仅放置一个项目的内容。</p>
				<p>
						<a id="more-32">
						</a>
				</p>
				<h2>
						<font color="blue">※下载※</font>
				</h2>
				<p>Subversion 1.2.3:<br /><a href="http://subversion.tigris.org/project_packages.html" target="_top">http://subversion.tigris.org/project_packages.html</a><br />（SVN的Server端，分不同操作系统的版本，这里我下载的是for windows及for linux的）</p>
				<p>TortoiseSVN:<br /><a href="http://tortoisesvn.tigris.org/download.html" target="_top">http://tortoisesvn.tigris.org/download.html</a><br />（windows下的SVN客户端，以shell方式集成在系统右键菜单中）</p>
				<p>Apache 2.0.55:<br /><a href="http://httpd.apache.org/download.cgi" target="_top">http://httpd.apache.org/download.cgi</a><br />（视操作系统而下）</p>
				<h2>
						<font color="blue">※安装使用※</font>
				</h2>
				<p>下面说一下安装，分两种平台（windows，linux）及两种模式（与Apache绑定 vs. Stand-alone）<br />具体在Apache上的配置倒是大同小异。</p>
				<p>另外，SVN是支持SSL的，但是这个配置牵涉到其他太多东西，本文就不过多涉及了。真的有需要可以参考SVN的手册（英文）。</p>
				<p>方便起见，用几个变量代表具体的值，请自行加以调整：</p>
				<p>
						<font color="#006600">%SystemRoot%</font> — windows的系统所在目录，一般类似这样：C:\WINNT<br /><font color="#006600">%SVN_HOME%</font> — SVN的安装目录<br /><font color="#006600">%SVN_REPO_PARENT%</font> — SVN所有数据仓库的根目录（就是存放全部版本文件的总目录）<br /><font color="#006600">%PROJECT_NAME%</font> — 项目名，严格的来说它对应的是一个数据仓库，但是这里遵从用户习惯，以项目名称方式来命名。<br /><font color="#006600">%SERVER_NAME_OR_IP%</font> — 服务器名或IP地址<br /><font color="#006600">%APACHE_HOME%</font> — Apache2的安装路径</p>
				<p>另外，安装过程默认使用文件系统做后台数据库，文中不再加以说明。如需使用BerkeleyDB，请自行参考SVN文档。</p>
				<p>
						<font color="#990000" size="4">
								<strong>Windows上的服务器端安装</strong>
						</font>
						<br />____________________________________________</p>
				<p>1.双击下载得来的”svn-1.2.3-setup.exe”并安装到”%SVN_HOME%”</p>
				<p>2.安装完毕后，”%SVN_HOME%\bin”应该已经自动加入到系统路径（%PATH%）中。如果没有，请手工添加。</p>
				<p>3.用命令行来测试安装结果是否正确：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">cmd</span>
								</li>
								<li>
										<span style="COLOR: blue">svnadmin</span>
								</li>
						</ol>
				</div>
				<p>如果返回这样的错误信息：”svnadmin.exe - Unable To Locate DLL”，那就需要尝试一下步骤的中的一种或几种：<br />安装VC++ 6.0（主要是安装VC的运行库）<br />或者直接从别的机器上拷贝一个”msvcp60.dll”文件到本机的”%SystemRoot%\system32″下</p>
				<p>4.使用以下命令创建一个数据仓库，用来存放项目的源代码和其他文件：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">cmd</span>
								</li>
								<li>
										<span style="COLOR: blue">svnadmin</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">create</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(0,0,139)">%SVN_REPO_PARENT</span>
										<span style="COLOR: gray">%\</span>
										<span style="COLOR: rgb(0,0,139)">%PROJECT_NAME</span>
										<span style="COLOR: gray">%</span>
								</li>
						</ol>
				</div>
				<p>5.其中%SVN_REPO_PARENT%是包含所有数据仓库的目录，%PROJECT_NAME%是所创建的数据仓库对应的项目名。</p>
				<p>
						<font color="#ff00cc">
								<br />*************************<br />* 以 Stand-alone 模式运行 *<br />*************************<br /></font>
				</p>
				<p>6.从命令行启动SVN Server：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">cmd</span>
								</li>
								<li>
										<span style="COLOR: blue">svnserve</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">d</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">r</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: rgb(0,0,139)">%SVN_REPO_PARENT</span>
										<span style="COLOR: gray">%</span>
								</li>
						</ol>
				</div>
				<p>注意里面的参数 r 限定了浏览全部数据仓库的根目录</p>
				<p>当然如果觉得每次这样启动太麻烦的话，也有SVN Serveice的包装程序（<a href="http://dark.clansoft.dk/~mbn/svnservice/" target="_top">http://dark.clansoft.dk/~mbn/svnservice/</a>）。通过它能够以windows service的方式运行SVN Server（其本质还是Stand-alone），运行起来相对比较方便。</p>
				<p>7.创建用户数据库（其实就是一个txt文本，就叫它”users.conf”吧，你也可以改名），保存到<br />%SVN_REPO_PARENT%\%PROJECT_NAME%\conf<br />目录（那个conf子文件夹在创建数据仓库时已被自动创建好），然后在这个文件内添加需要的用户名和密码。基本的样例如下：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: olive">[</span>
										<span style="COLOR: blue">users</span>
										<span style="COLOR: olive">]</span>
								</li>
								<li>
										<span style="COLOR: blue">your_username</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">your_password</span>
								</li>
						</ol>
				</div>
				<p>注意这里密码是明文存放的，所以也是这种方式的不足之处。</p>
				<p>8.在”%SVN_REPO_PARENT%\%PROJECT_NAME%\conf”目录下找到这个”svnserve.conf”文件，用任何文本编辑器打开，为刚才创建的那些用户添加读写权限：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: olive">[</span>
										<span style="COLOR: blue">general</span>
										<span style="COLOR: olive">]</span>
								</li>
								<li>
										<span style="COLOR: blue">anon</span>
										<span style="COLOR: gray">-</span>
										<span style="COLOR: blue">access</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">none</span>
										<span style="COLOR: gray">              </span>
										<span style="COLOR: rgb(255,165,0)"># 匿名访问权限</span>
								</li>
								<li>
										<span style="COLOR: blue">auth</span>
										<span style="COLOR: gray">-</span>
										<span style="COLOR: blue">access</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: green">write</span>
										<span style="COLOR: gray">             </span>
										<span style="COLOR: rgb(255,165,0)"># 认证用户的权限</span>
								</li>
								<li>
										<span style="COLOR: blue">password</span>
										<span style="COLOR: gray">-</span>
										<span style="COLOR: blue">db</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">users</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">conf</span>
										<span style="COLOR: gray">        </span>
										<span style="COLOR: rgb(255,165,0)"># 认证用户数据库</span>
								</li>
								<li>
										<span style="COLOR: blue">realm</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">Anything</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">you</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">want</span>
										<span style="COLOR: gray">, </span>
										<span style="COLOR: blue">but</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">generally</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">we</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: navy">use </span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">%PROJECT_NAME%</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: gray">   </span>
										<span style="COLOR: rgb(255,165,0)"># 在用户认证界面上出现的提示语句</span>
								</li>
						</ol>
				</div>
				<p>里面的”users.conf”就是刚才在第7步创建的用户文件。</p>
				<p>9.最后，重启SVN Server（什么？你不知道怎么重启？关掉窗口再重新用命令行启动啦；包装成Service的话么就更加简单了）</p>
				<p>现在已经可以使用客户端来连接SVN Server，进行import等操作了。<br />连接Server的URL应该是类似这样的：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray">://</span>
										<span style="COLOR: rgb(0,0,139)">%SERVER_NAME_OR_IP</span>
										<span style="COLOR: gray">%/</span>
										<span style="COLOR: rgb(0,0,139)">%PROJECT_NAME</span>
										<span style="COLOR: gray">%</span>
								</li>
						</ol>
				</div>
				<p>具体步骤，请参阅第20步。</p>
				<p>
						<font color="#ff00cc">
								<br />************************<br />* 以Apache的模块方式运行 *<br />************************<br /></font>
				</p>
				<p>10.首先要了解的是SVN设计的时候只考虑了兼容Apache2.x，所以在Apache1.x下是不能正常工作的。</p>
				<p>11.安装Apache2<br />如果事先启动了IIS之类的其他webserver，请先停止那些服务（端口被占用会导致Apache安装失败）。<br />其他问题可以参考Apache的安装手册。<br />这里假设安装目录为：%APACHE_HOME%</p>
				<p>12.检查Apache2的安装是否成功<br />打开浏览器，访问： http://localhost/<br />如果出现的是默认的欢迎页面，那就没有问题了。否则请仔细检查，重新安装。</p>
				<p>13.打开Apache的配置文件： “%APACHE_HOME%\conf\httpd.conf”<br />查找”LoadModule”这个关键字，找到导入模块的区块（section）<br />反注释掉下面这样，从而加载Subversion所需要的DAV模块：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: rgb(255,165,0)"># LoadModule dav_module modules/mod_dav.so</span>
								</li>
						</ol>
				</div>
				<p>完成之后看起来应该是这样：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">LoadModule</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">dav_module</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">modules</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">mod_dav</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">so</span>
								</li>
						</ol>
				</div>
				<p>另外在这行下面再添加两行（请注意把路径中的”\”替换成”/”）：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">LoadModule</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">dav_svn_module</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(0,0,139)">%SVN_HOME</span>
										<span style="COLOR: gray">%/</span>
										<span style="COLOR: blue">bin</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">mod_dav_svn</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">so</span>
								</li>
								<li>
										<span style="COLOR: blue">LoadModule</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">authz_svn_module</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(0,0,139)">%SVN_HOME</span>
										<span style="COLOR: gray">%/</span>
										<span style="COLOR: blue">bin</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">mod_authz_svn</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">so</span>
								</li>
						</ol>
				</div>
				<p>特别需要注意的是：<font color="red">由于模块依赖关系，这三行的出现顺序千万不能颠倒</font>。</p>
				<p>14.再来配置一下”httpd.conf”的其他部分，告诉Apache2 SVN的数据仓库所在。<br />（为避免不必要的麻烦，所有路径中的”\”都请替换成”/”）<br />注意：</p>
				<ul>
						<li>按照下述配置，所有数据仓库将共享密码文件及权限文件 
</li>
						<li>如果需要为每个数据仓库创建独立的设置，请查阅SVN的文档（”Authorization Option”章节） </li>
				</ul>
				<p>添加下述内容：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: gray">&lt;</span>
										<span style="COLOR: blue">Location</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">svn&gt;</span>
								</li>
								<li>
										<span style="COLOR: red">
										</span>
								</li>
								<li>
										<span style="COLOR: red">  DAV svn</span>
								</li>
								<li>
										<span style="COLOR: red">  SVNParentPath %SVN_REPO_PARENT%</span>
								</li>
								<li>
										<span style="COLOR: red">
										</span>
								</li>
								<li>
										<span style="COLOR: red">  #设置通过浏览器访问Repository时的XML格式文件，可以省略</span>
								</li>
								<li>
										<span style="COLOR: red">  SVNIndexXSLT "</span>
										<span style="COLOR: rgb(139,0,0)">/s</span>
										<span style="COLOR: blue">vnindex</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">xsl</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
								</li>
								<li>
										<span style="COLOR: red">
										</span>
								</li>
								<li>
										<span style="COLOR: red">  # 存取权限控制文件所在地</span>
								</li>
								<li>
										<span style="COLOR: red">  AuthzSVNAccessFile %SVN_REPO_PARENT%/AccessFile</span>
								</li>
								<li>
										<span style="COLOR: red">    </span>
								</li>
								<li>
										<span style="COLOR: red">  # 先尝试匿名操作，如有必要再转向用户认证</span>
								</li>
								<li>
										<span style="COLOR: red">  Satisfy Any</span>
								</li>
								<li>
										<span style="COLOR: red">  Require valid-user</span>
								</li>
								<li>
										<span style="COLOR: red">    </span>
								</li>
								<li>
										<span style="COLOR: red">  # 如何验证用户</span>
								</li>
								<li>
										<span style="COLOR: red">  AuthType Basic</span>
								</li>
								<li>
										<span style="COLOR: red">  AuthName </span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: blue">Anything</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">you</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">want</span>
										<span style="COLOR: gray">, </span>
										<span style="COLOR: blue">but</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">generally</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">we</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: navy">use </span>
										<span style="COLOR: rgb(0,0,139)">%PROJECT_NAME</span>
										<span style="COLOR: gray">%</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
								</li>
								<li>
										<span style="COLOR: red">  AuthUserFile %SVN_REPO_PARENT%/passwd</span>
								</li>
								<li>
										<span style="COLOR: red">
										</span>
								</li>
								<li>
										<span style="COLOR: red">  #输出时调用Apache的Deflate模块，必须有启用此模块才能这样配，否则删除此行</span>
								</li>
								<li>
										<span style="COLOR: red">  SetOutputFilter DEFLATE</span>
								</li>
								<li>
										<span style="COLOR: red">
										</span>
								</li>
								<li>
										<span style="COLOR: red">&lt;/Location&gt;</span>
								</li>
						</ol>
				</div>
				<p>这里涉及到两个文件: “%SVN_REPO_PARENT%/AccessFile” 及 “%SVN_REPO_PARENT%/passwd”.<br />并不一定非要放到”%SVN_REPO_PARENT%”目录下，我图方便而已。觉得不安全可以移到另外地方。<br />这两个文件里面具体内容的设置请参考第16和17步。</p>
				<p>15.保存”httpd.conf”并退出，这里Apache2的配置告一段落。</p>
				<p>16.”%SVN_REPO_PARENT%/AccessFile”文件的内容</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: olive">[</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: olive">]</span>
								</li>
								<li>
										<span style="COLOR: gray">* = </span>
										<span style="COLOR: blue">r</span>
								</li>
								<li>
										<span style="COLOR: blue">user1</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">rw</span>
								</li>
								<li>
										<span style="COLOR: blue">user2</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">r</span>
								</li>
								<li>
										<span style="COLOR: blue">admin</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">rw</span>
								</li>
								<li>
										<span style="COLOR: gray">
										</span>
								</li>
								<li>
										<span style="COLOR: olive">[</span>
										<span style="COLOR: rgb(0,0,139)">%PROJECT_NAME</span>
										<span style="COLOR: gray">%:/</span>
										<span style="COLOR: blue">src</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">test</span>
										<span style="COLOR: olive">]</span>
								</li>
								<li>
										<span style="COLOR: blue">user2</span>
										<span style="COLOR: gray"> = </span>
										<span style="COLOR: blue">rw</span>
								</li>
						</ol>
				</div>
				<p>其中：</p>
				<ul>
						<li>[/] 指代所有数据仓库的根目录，匿名用户默认的权限为只读。 
</li>
						<li>对于”user1″和”admin”，他们对所有数据仓库都有读写权限。 
</li>
						<li>对于”user2″，它对所有数据仓库仅有只读权限。但是下方又额外指定了他对”%PROJECT_NAME%:/src/test”目录具有读写权限。 
</li>
						<li>综上，他对’test’目录及其子目录（自动继承，除非特别指定） 具有读写权限，其他则均为只读权限。 </li>
				</ul>
				<p>你可以根据需要来设定不同的权限，更详细的说明还需要参考SVN文档中的权限设置章节。</p>
				<p>17.”%SVN_REPO_PARENT%/passwd”文件的内容<br />这个文件是通过”%APACHE_HOME%\bin\htpasswd.exe”自动生成的：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">cmd</span>
								</li>
								<li>
										<span style="COLOR: blue">cd</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">D %APACHE_HOME%\bin</span>
								</li>
								<li>
										<span style="COLOR: red"># 参数c仅在第一次运行时使用，用来创建一个新文件</span>
								</li>
								<li>
										<span style="COLOR: red">htpasswd –cm %SVN_REPO_PARENT%\passwd user1</span>
								</li>
								<li>
										<span style="COLOR: red"># 以后添加用户可用此命令，参数m表明需要加密</span>
								</li>
								<li>
										<span style="COLOR: red">htpasswd –m %SVN_REPO_PARENT%\passwd user2</span>
								</li>
						</ol>
				</div>
				<p>此时用文本编辑器打开”%SVN_REPO_PARENT%/passwd”，可以看到里面内容是类似这样的：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">admin</span>
										<span style="COLOR: gray">:</span>
										<span style="COLOR: rgb(0,0,139)">$apr1$HLWV7</span>
										<span style="COLOR: gray">/..</span>
										<span style="COLOR: rgb(0,0,139)">$upZwVGvge</span>
										<span style="COLOR: maroon">0</span>
										<span style="COLOR: blue">sc28fEp7mGM0</span>
								</li>
								<li>
										<span style="COLOR: blue">user1</span>
										<span style="COLOR: gray">:</span>
										<span style="COLOR: rgb(0,0,139)">$apr1$8</span>
										<span style="COLOR: blue">sbRo</span>
										<span style="COLOR: gray">...</span>
										<span style="COLOR: rgb(0,0,139)">$hNMdkTvO4t8POVmOkV3Vg</span>
										<span style="COLOR: gray">.</span>
								</li>
								<li>
										<span style="COLOR: blue">user2</span>
										<span style="COLOR: gray">:</span>
										<span style="COLOR: rgb(0,0,139)">$apr1$ZXzcE</span>
										<span style="COLOR: gray">/..</span>
										<span style="COLOR: rgb(0,0,139)">$5</span>
										<span style="COLOR: blue">Ir0V8VQQtNYTNnnOp</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">EU1</span>
								</li>
						</ol>
				</div>
				<p>18.把SVN自带的XSLT文件拷贝到网站根目录，<br />然后设置合理权限（windows平台则不必考虑）</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: rgb(255,165,0)">#这里假设你的网站根目录是  /var/www/html</span>
								</li>
								<li>
										<span style="COLOR: blue">mv</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">tmp</span>
										<span style="COLOR: rgb(139,0,0)">/s</span>
										<span style="COLOR: blue">ubversion</span>
										<span style="COLOR: gray">-</span>
										<span style="COLOR: maroon">1.2.3</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">tools</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">xslt</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">svnindex</span>
										<span style="COLOR: gray">*</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">var</span>
										<span style="COLOR: rgb(139,0,0)">/</span>
										<span style="COLOR: blue">www</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">html</span>
								</li>
								<li>
										<span style="COLOR: green">chown</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">apache</span>
										<span style="COLOR: gray">:</span>
										<span style="COLOR: blue">apache</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">var</span>
										<span style="COLOR: rgb(139,0,0)">/</span>
										<span style="COLOR: blue">www</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">html</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">svnindex</span>
										<span style="COLOR: gray">*</span>
								</li>
								<li>
										<span style="COLOR: green">chmod</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: maroon">644</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">var</span>
										<span style="COLOR: rgb(139,0,0)">/</span>
										<span style="COLOR: blue">www</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">html</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">svnindex</span>
										<span style="COLOR: gray">*</span>
								</li>
								<li>
										<span style="COLOR: gray">
										</span>
								</li>
								<li>
										<span style="COLOR: rgb(255,165,0)">#设置所有者和权限(将权限赋给apache运行的用户身份)</span>
								</li>
								<li>
										<span style="COLOR: green">chown</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">R</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">apache</span>
										<span style="COLOR: gray">:</span>
										<span style="COLOR: blue">apache</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(0,0,139)">%SVN_REPO_PARENT</span>
										<span style="COLOR: gray">%</span>
								</li>
								<li>
										<span style="COLOR: green">chmod</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">R</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: maroon">766</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(0,0,139)">%SVN_REPO_PARENT</span>
										<span style="COLOR: gray">%</span>
								</li>
						</ol>
				</div>
				<p>19. 重启Apache2服务：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">cmd</span>
								</li>
								<li>
										<span style="COLOR: blue">net</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">stop</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">Apache2</span>
								</li>
								<li>
										<span style="COLOR: blue">net</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">start</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">Apache2</span>
								</li>
						</ol>
				</div>
				<p>20.打开浏览器，访问：http://%SERVER_NAME_OR_IP%/svn/<br />如果返回的页面是”403 Forbidden”，可能是由于Apache2默认没有打开目录的浏览权限（Option Indexes，参阅Apache2文档），但这并不影响使用。<br />现在已经可以用客户端导入项目并开始使用了。<br />具体步骤，请参阅第20步。</p>
				<p>
						<font color="#ff00cc">
								<br />***********************************************<br />* 注意：以下步骤/命令需要在装有SVN客户端的机器上执行 *<br />* Windows下安装服务器端的时候已经同时安装了客户端 *<br />* Linux下尚待查证。 *<br />***********************************************<br /></font>
				</p>
				<p>21.和CVS一样，SVN在最初的时候需要将已有项目导入到数据库中。<br />从命令行执行以下命令（Stand-alone）：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: green">import</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">c</span>
										<span style="COLOR: gray">:\</span>
										<span style="COLOR: blue">temp</span>
										<span style="COLOR: gray">\</span>
										<span style="COLOR: blue">myproject</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray">://</span>
										<span style="COLOR: rgb(0,0,139)">%SERVER_NAME_OR_IP</span>
										<span style="COLOR: gray">%/</span>
										<span style="COLOR: rgb(0,0,139)">%PROJECT_NAME</span>
										<span style="COLOR: gray">% -</span>
										<span style="COLOR: blue">m</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">initial import</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: gray"> --</span>
										<span style="COLOR: blue">username</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">your_username</span>
										<span style="COLOR: gray"> --</span>
										<span style="COLOR: blue">password</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">your_password</span>
								</li>
						</ol>
				</div>
				<p>或者（Apache2 module）：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: green">import</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">c</span>
										<span style="COLOR: gray">:\</span>
										<span style="COLOR: blue">temp</span>
										<span style="COLOR: gray">\</span>
										<span style="COLOR: blue">myproject</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">http</span>
										<span style="COLOR: gray">://</span>
										<span style="COLOR: rgb(0,0,139)">%SERVER_NAME_OR_IP</span>
										<span style="COLOR: gray">%/</span>
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: rgb(0,0,139)">%PROJECT_NAME</span>
										<span style="COLOR: gray">% -</span>
										<span style="COLOR: blue">m</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">initial import</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: gray"> --</span>
										<span style="COLOR: blue">username</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">your_username</span>
										<span style="COLOR: gray"> --</span>
										<span style="COLOR: blue">password</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">your_password</span>
								</li>
						</ol>
				</div>
				<p>其中：<br />A) c:\temp\myproject里面包含了你所要导入的项目文件的内容<br />B) %SERVER_NAME_OR_IP%是SVN Server的名字或者IP地址，上面存有第5步中创建的数据仓库<br />C) %PROJECT_NAME%是要导入到的数据仓库名称，这里选择跟项目名一致<br />D) 参数 m 表明此次导入操作的注释，SVN的注释是按每次提交来定义的，导入也是提交的一种。<br />E) your_username和your_password是第7和17步创建的用户及密码，注意该用户必须对上面的%PROJECT_NAME%数据仓库有写权限才能成功。</p>
				<p>22.然后，需要从Server端再次checkout到本地：<br />（这点感觉不是太方便，为啥不做成import的时候有个选项，本地目录可以自动生成版本信息呢？）</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">cmd</span>
								</li>
								<li>
										<span style="COLOR: blue">cd</span>
										<span style="COLOR: rgb(139,0,0)"> /</span>
										<span style="COLOR: red">D anywhere_you_want_to_put_your_versioned_project_files</span>
								</li>
								<li>
										<span style="COLOR: red">svn co svn:</span>
										<span style="COLOR: rgb(139,0,0)">/</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">myserver</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">myproject</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">trunk</span>
										<span style="COLOR: gray"> . --</span>
										<span style="COLOR: blue">username</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">your_username</span>
										<span style="COLOR: gray"> --</span>
										<span style="COLOR: blue">password</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">your_password</span>
								</li>
						</ol>
				</div>
				<p>注意：<br />“co”是”checkout”的一个别名<br />那个点[.]代表当前目录，checkout出来的文件会自动放到这个目录下。也可以改为某个绝对路径。</p>
				<p>23.对于向SVN Serer增加，移动，删除，或者修改后提交某些文件，参考使用以下命令：</p>
				<div class="hl-surround">
						<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
								<li class="hl-firstline">
										<span style="COLOR: blue">Add</span>
										<span style="COLOR: gray">:    </span>
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">add</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">src</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">myfile</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">java</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">m</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">adding a file</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
								</li>
								<li>
										<span style="COLOR: blue">Move</span>
										<span style="COLOR: gray">:    </span>
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">move</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">src</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">myfile</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">java</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">src</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">mynewfile</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">java</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">m</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">moved myfile.java to mynewfile.java</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
								</li>
								<li>
										<span style="COLOR: blue">Delete</span>
										<span style="COLOR: gray">:    </span>
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: green">delete</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">src</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">myfile</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">java</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">m</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">removing a file</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
								</li>
								<li>
										<span style="COLOR: blue">Commit</span>
										<span style="COLOR: gray">:    </span>
										<span style="COLOR: blue">svn</span>
										<span style="COLOR: gray"> </span>
										<span style="COLOR: blue">commit</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: blue">src</span>
										<span style="COLOR: gray">/</span>
										<span style="COLOR: blue">myfile</span>
										<span style="COLOR: gray">.</span>
										<span style="COLOR: blue">java</span>
										<span style="COLOR: gray"> -</span>
										<span style="COLOR: blue">m</span>
										<span style="COLOR: gray">
										</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
										<span style="COLOR: red">the message</span>
										<span style="COLOR: rgb(139,0,0)">"</span>
								</li>
						</ol>
				</div>
				<p>对于上面的客户端操作，如果安装了TortoiseSVN，一切就变得简单多了。<br />不过这个就要抓图来说明了。等有空的时候再放上来。</p>
				<h2>
						<font color="blue">※总结※</font>
				</h2>
				<p>使用Eclipse的朋友还可以参考这里： http://subclipse.tigris.org/<br />它以插件的形式向Eclipse提供了SVN的支持。</p>
				<p>另外，具体的设置，参数说明等还是需要自己去查阅SVN的文档（在安装server端的时候已经附带）</p>
				<p>参考文献及资料：<br />_________________________________________</p>
				<p>
						<a href="http://subversion.tigris.org/" target="_top">http://subversion.tigris.org/</a>
						<br />
						<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/" target="_top">http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/</a>
						<br />
						<a href="http://www.javayou.com/showlog.jspe?log_id=972" target="_top">http://www.javayou.com/showlog.jspe?log_id=972</a>
				</p>
				<!--/DOCUMENT_FRAGMENT-->
		</div>
<img src ="http://www.blogjava.net/fisher/aggbug/98232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-02-06 12:13 <a href="http://www.blogjava.net/fisher/articles/98232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>破解图片验证码限制的一般思路</title><link>http://www.blogjava.net/fisher/articles/93619.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Sat, 13 Jan 2007 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/93619.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/93619.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/93619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/93619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/93619.html</trackback:ping><description><![CDATA[　相信大家都有在论坛灌水的经历吧？但是如果你连续发表统一内容的东西在论坛中，不久论坛的整个板块就全是你发表的信息了，其他信息全被挤在了后面。假设你发表的信息够多，版主都删不完时，那么这个论坛基本就报废了！其他的商业论坛也意识到了防止恶意灌水的重要性，纷纷使用了一些防止恶意灌水的措施，有发贴间隔时间的限制、同一IP地址的发贴数限制、内容不能重复等，但是这些都不是今天的重点，由于论坛使用的是一个公用发贴表单，需要突破唯一的难点是验证码。（为了防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试或是防止不断提交某网络信息而采用的一种网络通行方式。随机生成字符信息放入图片中，防止计算机直接识别。比如招商银行的网上个人银行，腾讯的QQ社区等等）
<p>　　验证码分为如下几类：数字型、字符型、符号型、综合型。</p><p>　　一般验证码属于数字型的，不过有的图片中生成了不少彩色和黑白的噪音点（指验证图片上的斑点）。那么我们应该怎么去识别呢？传统的验证码识别方式很简单，由于数字的位置是固定的，所以我们只需要提取每一幅数字的图片（没有噪音点的）然后把每一个特殊数字独有的象素位置记录下来，然后在网络上提取需要破解的特征码，祛除噪音点，对其位置和记录位置进行比对，那就是么就能确定相应的数字了。</p><p>　　总结一下传统的就是：</p><p>　　1.先分析验证码,前景颜色是否不定</p><p>　　2.然后把验证码的宽度/验证码文字个数,比如一验证码下载后宽度为60,有4个数字,那么就60/4=15,然后保存每个字,如果只有数字保存0-9数字到位图文件,如果英文那更麻烦点,0-9,A-Z都要保存到位图,位图的前景色都不变,保持一种颜色,背景随便你改不改</p><p>　　3.如果前景要变则将文字统一为同种颜色,每个数字0-9的点阵都有个公共点,取该公共点颜色然后把前景全部统一成一种颜色,比如白色{255,255,255},位图的结构是BGR,而不是RGB</p><p>　　4.然后进行比较,如果验证码的一点为白色,第2步保存的位图同一点也是白色,那么频率增加1</p><p>　　5.最后频率最高的就是验证码了!</p><p>　　接下来要做的就是做个post程序了，这个太简单了，代码你就自己写吧！不过也要做到如下细节：做成多线程程序进行发贴，不然程序会失去响应的。最好是可以导入大量的代理IP的，然后就是发贴的内容最后加上几个随机字符，这样可以防止重复贴的过滤！最重要的，只是做测试，发贴量不要太多、不要乱发广告贴！</p><p>　　其实上述方法已经不是只是对验证码进行识别了，完全可以用到现实生活中去，比如说手写体识别、车牌识别等等，但是现实生活中我们还要进行更多的加工，比如说圆形检测，多边形检测等等。所以说从网络安全技术中，也有很多东西能造福社会，还等待我们继续创造！<br /></p><img src ="http://www.blogjava.net/fisher/aggbug/93619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-13 16:59 <a href="http://www.blogjava.net/fisher/articles/93619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP彩色验证码</title><link>http://www.blogjava.net/fisher/articles/93590.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Sat, 13 Jan 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/93590.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/93590.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/93590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/93590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/93590.html</trackback:ping><description><![CDATA[生成有4个随机数字和杂乱背景的图片，数字和背景颜色会改变，服务器端刷新（用history.go(-1)也会变）<br />原型参考ALIBABA  <a href="http://china.alibaba.com/member/showimage" target="_blank">http://china.alibaba.com/member/showimage</a><br /><br />------------产生验证码图片的文件-----image.jsp-------------------------------------------<br /><br />&lt;%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %&gt;<br />&lt;%!<br />Color getRandColor(int fc,int bc){//给定范围获得随机颜色<br />        Random random = new Random();<br />        if(fc&gt;255) fc=255;<br />        if(bc&gt;255) bc=255;<br />        int r=fc+random.nextInt(bc-fc);<br />        int g=fc+random.nextInt(bc-fc);<br />        int b=fc+random.nextInt(bc-fc);<br />        return new Color(r,g,b);<br />        }<br />%&gt;<br />&lt;%<br />//设置页面不缓存<br />response.setHeader("Pragma","No-cache");<br />response.setHeader("Cache-Control","no-cache");<br />response.setDateHeader("Expires", 0);<br /><br />// 在内存中创建图象<br />int width=60, height=20;<br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<br /><br />// 获取图形上下文<br />Graphics g = image.getGraphics();<br /><br />//生成随机类<br />Random random = new Random();<br /><br />// 设定背景色<br />g.setColor(getRandColor(200,250));<br />g.fillRect(0, 0, width, height);<br /><br />//设定字体<br />g.setFont(new Font("Times New Roman",Font.PLAIN,18));<br /><br />//画边框<br />//g.setColor(new Color());<br />//g.drawRect(0,0,width-1,height-1);<br /><br /><br />// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到<br />g.setColor(getRandColor(160,200));<br />for (int i=0;i&lt;155;i++)<br />{<br />        int x = random.nextInt(width);<br />        int y = random.nextInt(height);<br />        int xl = random.nextInt(12);<br />        int yl = random.nextInt(12);<br />        g.drawLine(x,y,x+xl,y+yl);<br />}<br /><br />// 取随机产生的认证码(4位数字)<br />String sRand="";<br />for (int i=0;i&lt;4;i++){<br />    String rand=String.valueOf(random.nextInt(10));<br />    sRand+=rand;<br />    // 将认证码显示到图象中<br />    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成<br />    g.drawString(rand,13*i+6,16);<br />}<br /><br />// 将认证码存入SESSION<br />session.setAttribute("rand",sRand);<br /><br /><br />// 图象生效<br />g.dispose();<br /><br />// 输出图象到页面<br />ImageIO.write(image, "JPEG", response.getOutputStream());<br /><br /><br />%&gt; <br /><br />---------------使用验证码图片的文件---------a.jsp------------------------------------<br /><br />&lt;%@ page contentType="text/html;charset=gb2312" %&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;认证码输入页面&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;form method=post action="check.jsp"&gt;<br />&lt;table&gt;<br />&lt;tr&gt;<br />&lt;td align=left&gt;系统产生的认证码：&lt;/td&gt;<br />&lt;td&gt;&lt;img border=0 src="image.jsp"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td align=left&gt;输入上面的认证码：&lt;/td&gt;<br />&lt;td&gt;&lt;input type=text name=rand maxlength=4 value=""&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td colspan=2 align=center&gt;&lt;input type=submit value="提交检测"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br />-----------------验证的页面----------check.jsp<br /><br />&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;认证码验证页面&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />&lt;/head&gt;<br /><br />&lt;body&gt;<br />&lt;% <br />String rand = (String)session.getAttribute("rand");<br />String input = request.getParameter("rand");<br />%&gt;<br />系统产生的认证码为： &lt;%= rand %&gt;&lt;br&gt;<br />您输入的认证码为： &lt;%= input %&gt;&lt;br&gt;<br />&lt;br&gt;<br />&lt;%<br />  if (rand.equals(input)) {<br />%&gt;<br />&lt;font color=green&gt;输入相同，认证成功！&lt;/font&gt;<br />&lt;%<br />  } else {<br />%&gt;<br />&lt;font color=red&gt;输入不同，认证失败！&lt;/font&gt;<br />&lt;%<br />  }<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<img src ="http://www.blogjava.net/fisher/aggbug/93590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-13 13:04 <a href="http://www.blogjava.net/fisher/articles/93590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EHCache 初步使用指南    </title><link>http://www.blogjava.net/fisher/articles/93225.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Thu, 11 Jan 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/93225.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/93225.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/93225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/93225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/93225.html</trackback:ping><description><![CDATA[
		<table class="fullbox" cellspacing="0" cellpadding="3" width="100%" border="0">
				<tbody>
						<tr>
								<td class="featureheader" align="left">
										<b>EHCache 初步使用指南</b>
								</td>
								<td class="featureheader" align="right">  </td>
						</tr>
				</tbody>
		</table>
		<br />
		<table class="fullbox" cellspacing="0" cellpadding="5" width="100%" border="0">
				<tbody>
						<tr>
								<td class="content" colspan="2">
										<a href="http://www.cybercorlin.net/index.php?topic=General">
												<img title="Cc.Net BLoG" alt="Cc.Net BLoG" src="http://www.cybercorlin.net/images/icons/blog.gif" align="right" border="0" />
										</a>写的比较初级,后续将加入对配置文件,内存/磁盘存储,优化,虚拟机宕机,日志等的说明<br />1. EHCache 的特点，系统要求及安装<br />是一个纯Java ,过程中（也可以理解成插入式）缓存实现<br />Hibernate2.1,Spring支持EHcache嵌入,自我感觉Hibernate2.1 + EHCache 很过瘾。。（测试结果比Hibernate+JCS 好多了）<br />支持多CPU服务器<br />其版本发布前进行了产品级测试<br />支持：运行环境jdk1.2到5版本（源代码编译需1.4或1.5 版本）<br />jdk1.4和1.5 版本,需加入apache 的 commons-logging类库 http://jakarta.apache.org/commons/logging.html<br />jdk1.2和1.3 版本,需加入commons-collections 2.1 版本 http://jakarta.apache.org/commons/collections.html<br />和 xerces (xml-apis.jar and xercesImpl.jar), 2.5 版本 http://xml.apache.org/xerces2-j/<br /><br />如果运行环境为IBM JDK1.4版本上的IBM Websphere 5.1,也需加入 commons-collections 类库(如需要)<br /><br />单独安装Ehcache ，需把ehcache-X.X.jar 和相关类库方到classpath中。<br />如项目已安装了Hibernate2.1 ,则不需要做什么。。直接可以使用Ehcache<br /><br />Cache 存储方式 ：内存或磁盘<br /><br />2. 单独使用 EHCache<br /><br />使用CacheManager 创建并管理Cache<br />使用默认配置文件创建<br />CacheManager manager = CacheManager.create();<br />使用指定配置文件创建 <br />CacheManager manager = CacheManager.create("src/config/ehcache.xml");<br />从classpathq找寻配置文件并创建 <br />URL url = getClass().getResource("/anothername.xml");<br />CacheManager manager = CacheManager.create(url);<br />通过输入流创建<br />InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());<br />try {<br />manager = CacheManager.create(fis);<br />} finally {<br />fis.close();<br />}<br /><br />卸载CacheManager ,关闭Cache<br /><br />manager.shutdown();<br /><br />使用Caches<br /><br />取得配置文件中预先 定义的sampleCache1设置,生成一个Cache<br />Cache cache = manager.getCache("sampleCache1");<br /><br /><br />设置一个名为test 的新cache,test属性为默认<br />CacheManager manager = CacheManager.create();<br />manager.addCache("test");<br /><br />设置一个名为test 的新cache,并定义其属性 <br />CacheManager manager = CacheManager.create();<br />Cache cache = new Cache("test", 1, true, false, 5, 2);<br />manager.addCache(cache);<br /><br /><br />往cache中加入元素<br />Element element = new Element("key1", "value1");<br />cache.put(new Element(element);<br /><br /><br />从cache中取得元素<br />Element element = cache.get("key1"); <br /><br /><br /><br />3. 在 Hibernate 中运用EHCache<br /><br />hibernate.cfg.xml中需设置如下：<br />2.1版本加入<br />&lt;property name="hibernate.cache.provider_class"&gt;net.sf.ehcache.hibernate.Provider&lt;/property&gt;<br />2.1以下版本加入<br />&lt;property name="hibernate.cache.provider_class"&gt;net.sf.hibernate.cache.EhCache&lt;/property&gt;<br /><br />在 Hibernate 映射文件的每个需要Cache的Domain中<br />&lt;hibernate-mapping&gt;<br />&lt;class<br />name="com.somecompany.someproject.domain.Country"<br />table="ut_Countries"<br />dynamic-update="false"<br />dynamic-insert="false"<br />&gt; <br />...<br /><br />&lt;/hibernate-mapping&gt; <br />加入类似如下格式信息：<br />&lt;cache usage="read-write|nonstrict-read-write|read-only" /&gt; <br />比如：<br />&lt;cache usage="read-write" /&gt; <br /><br />然后在ehcache.xml中加入<br />&lt;ehcache&gt;<br />&lt;cache name="com.somecompany.someproject.domain.Country"<br />maxElementsInMemory="10000"<br />eternal="false"<br />timeToIdleSeconds="300"<br />timeToLiveSeconds="600"<br />overflowToDisk="false"<br />/&gt; <br />&lt;/ehcache&gt;</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/fisher/aggbug/93225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-11 17:46 <a href="http://www.blogjava.net/fisher/articles/93225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中一些关于日期、日期格式、日期的解析和日期的计算[转贴]</title><link>http://www.blogjava.net/fisher/articles/91765.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Thu, 04 Jan 2007 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/91765.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/91765.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/91765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/91765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/91765.html</trackback:ping><description><![CDATA[
		<div id="msgcns!3C3DD8BEC2AFC122!123">
				<div>
						<p>Java中一些关于日期、日期格式、日期的解析和日期的计算 <br /></p>
						<p>
								<font size="2">Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. 我们写了两篇文章, 这是第一篇, 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算. </font>
						</p>
						<p>
								<font size="2">我们将讨论下面的类: </font>
						</p>
						<p>
								<font size="2">1、具体类(和抽象类相对)java.util.Date <br />2、抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat <br />3、抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar </font>
						</p>
						<p>
								<font size="2">具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类. </font>
						</p>
						<p>
								<font size="2">Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数. </font>
						</p>
						<p>
								<font size="2">一、创建一个日期对象 </font>
						</p>
						<p>
								<font size="2">让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间. <br />//------------------------------------------------------<br />import java.util.Date; </font>
						</p>
						<p>
								<font size="2">public class DateExample1 <br />{ <br />public static void main(String[] args)<br />{ <br />// Get the system date/time <br />Date date = new Date(); </font>
						</p>
						<p>
								<font size="2">System.out.println(date.getTime()); <br />} <br />} <br />//------------------------------------------------------</font>
						</p>
						<p>
								<font size="2">在星期六, 2001年9月29日, 下午大约是6:50的样子, 上面的例子在系统输出设备上显示的结果是 1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创建一个日期对象, 这个构造函数没有接受任何参数. 而这个构造函数在内部使用了System.currentTimeMillis() 方法来从系统获取日期. </font>
						</p>
						<p>
								<font size="2">那么, 现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了. 我们如何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了. </font>
						</p>
						<p>
								<font size="2">二、日期数据的定制格式 </font>
						</p>
						<p>
								<font size="2">假如我们希望定制日期数据的格式, 比方星期六-9月-29日-2001年. 下面的例子展示了如何完成这个工作: </font>
						</p>
						<p>
								<font size="2">//------------------------------------------------------<br />import java.text.SimpleDateFormat; <br />import java.util.Date; </font>
						</p>
						<p>
								<font size="2">public class DateExample2 <br />{ </font>
						</p>
						<p>
								<font size="2">public static void main(String[] args) <br />{ </font>
						</p>
						<p>
								<font size="2">SimpleDateFormat bartDateFormat = <br />new SimpleDateFormat("EEEE-MMMM-dd-yyyy"); </font>
						</p>
						<p>
								<font size="2">Date date = new Date(); </font>
						</p>
						<p>
								<font size="2">System.out.println(bartDateFormat.format(date)); <br />} <br />} <br />//------------------------------------------------------</font>
						</p>
						<p>
								<font size="2">只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.</font>
						</p>
						<p>
								<font size="2">三、将文本数据解析成日期对象 </font>
						</p>
						<p>
								<font size="2">假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据. 我们的例子, 显示在下面, 将解析文本字符串"9-29-2001"并创建一个值为001736000000 的日期对象. </font>
						</p>
						<p>
								<font size="2">//------------------------------------------------------<br />import java.text.SimpleDateFormat; <br />import java.util.Date; </font>
						</p>
						<p>
								<font size="2">public class DateExample3 <br />{ </font>
						</p>
						<p>
								<font size="2">public static void main(String[] args) <br />{ <br />// Create a date formatter that can parse dates of <br />// the form MM-dd-yyyy. <br />SimpleDateFormat bartDateFormat = <br />new SimpleDateFormat("MM-dd-yyyy"); </font>
						</p>
						<p>
								<font size="2">// Create a string containing a text date to be parsed. <br />String dateStringToParse = "9-29-2001"; </font>
						</p>
						<p>
								<font size="2">try { <br />// Parse the text version of the date. <br />// We have to perform the parse method in a <br />// try-catch construct in case dateStringToParse <br />// does not contain a date in the format we are expecting. <br />Date date = bartDateFormat.parse(dateStringToParse); </font>
						</p>
						<p>
								<font size="2">// Now send the parsed date as a long value <br />// to the system output. <br />System.out.println(date.getTime()); <br />} <br />catch (Exception ex) { <br />System.out.println(ex.getMessage()); <br />} <br />} <br />} <br />//------------------------------------------------------</font>
						</p>
						<p>
								<font size="2">四、使用标准的日期格式化过程 </font>
						</p>
						<p>
								<font size="2">既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式. </font>
						</p>
						<p>
								<font size="2">//------------------------------------------------------<br />import java.text.DateFormat; <br />import java.util.Date; </font>
						</p>
						<p>
								<font size="2">public class DateExample4 <br />{ </font>
						</p>
						<p>
								<font size="2">public static void main(String[] args) <br />{ <br />Date date = new Date(); </font>
						</p>
						<p>
								<font size="2">DateFormat shortDateFormat = <br />DateFormat.getDateTimeInstance( <br />DateFormat.SHORT, <br />DateFormat.SHORT); </font>
						</p>
						<p>
								<font size="2">DateFormat mediumDateFormat = <br />DateFormat.getDateTimeInstance( <br />DateFormat.MEDIUM, <br />DateFormat.MEDIUM); </font>
						</p>
						<p>
								<font size="2">DateFormat longDateFormat = <br />DateFormat.getDateTimeInstance( <br />DateFormat.LONG, <br />DateFormat.LONG); </font>
						</p>
						<p>
								<font size="2">DateFormat fullDateFormat = <br />DateFormat.getDateTimeInstance( <br />DateFormat.FULL, <br />DateFormat.FULL); </font>
						</p>
						<p>
								<font size="2">System.out.println(shortDateFormat.format(date)); <br />System.out.println(mediumDateFormat.format(date)); <br />System.out.println(longDateFormat.format(date)); <br />System.out.println(fullDateFormat.format(date)); <br />} <br />} <br />//------------------------------------------------------</font>
						</p>
						<p>
								<font size="2">注意我们在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL. 要知道获取时间和日期格式化过程的更多的方法和选项, 请看Sun 公司Web 站点上的解释. </font>
						</p>
						<p>
								<font size="2">运行我们的例子程序的时候, 它将向标准输出设备输出下面的内容: <br />9/29/01 8:44 PM <br />Sep 29, 2001 8:44:45 PM <br />September 29, 2001 8:44:45 PM EDT <br />Saturday, September 29, 2001 8:44:45 PM EDT</font>
						</p>
						<p>
								<font size="2">五、Calendar 类 </font>
						</p>
						<p>
								<font size="2">我们现在已经能够格式化并创建一个日期对象了, 但是我们如何才能设置和获取日期数据的特定部分呢, 比如说小时, 日, 或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类. 就如我们前面提到的那样, Calendar 类中的方法替代了Date 类中被人唾骂的方法. </font>
						</p>
						<p>
								<font size="2">假设你想要设置, 获取, 和操纵一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一天. 为了演示这个过程, 我们将使用具体的子类 java.util.GregorianCalendar. 考虑下面的例子, 它计算得到下面的第十个星期五是13号. </font>
						</p>
						<p>
								<font size="2">//------------------------------------------------------<br />import java.util.GregorianCalendar; <br />import java.util.Date; <br />import java.text.DateFormat; </font>
						</p>
						<p>
								<font size="2">public class DateExample5 <br />{ </font>
						</p>
						<p>
								<font size="2">public static void main(String[] args) <br />{ <br />DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL); </font>
						</p>
						<p>
								<font size="2">// Create our Gregorian Calendar. <br />GregorianCalendar cal = new GregorianCalendar(); <br /><br />// Set the date and time of our calendar <br />// to the system&amp;s date and time <br />cal.setTime(new Date()); </font>
						</p>
						<p>
								<font size="2">System.out.println("System Date: " + <br />dateFormat.format(cal.getTime())); </font>
						</p>
						<p>
								<font size="2">// Set the day of week to FRIDAY <br />cal.set(GregorianCalendar.DAY_OF_WEEK, <br />GregorianCalendar.FRIDAY); <br />System.out.println("After Setting Day of Week to Friday: " + <br />dateFormat.format(cal.getTime())); </font>
						</p>
						<p>
								<font size="2">int friday13Counter = 0; <br /><br />while (friday13Counter &lt;= 10) <br />{ </font>
						</p>
						<p>
								<font size="2">// Go to the next Friday by adding 7 days. <br />cal.add(GregorianCalendar.DAY_OF_MONTH, 7); </font>
						</p>
						<p>
								<font size="2">// If the day of month is 13 we have <br />// another Friday the 13th. <br />if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) <br />{ <br />friday13Counter++; <br />System.out.println(dateFormat.format(cal.getTime())); <br />} <br />} <br />} <br />} <br />//------------------------------------------------------</font>
						</p>
						<p>
								<font size="2">在这个例子中我们作了有趣的函数调用: <br />cal.set(GregorianCalendar.DAY_OF_WEEK, <br />GregorianCalendar.FRIDAY); </font>
						</p>
						<p>
								<font size="2">和: <br />cal.add(GregorianCalendar.DAY_OF_MONTH, 7); </font>
						</p>
						<p>
								<font size="2">set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五. 注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性. add 方法让我们能够在日期上加上数值. 润年的所有复杂的计算都由这个方法自动处理. </font>
						</p>
						<p>
								<font size="2">我们这个例子的输出结果是: <br />System Date: Saturday, September 29, 2001 <br />当我们将它设置成星期五以后就成了: Friday, September 28, 2001 <br />Friday, September 13, 2002 <br />Friday, December 13, 2002 <br />Friday, June 13, 2003 <br />Friday, February 13, 2004 <br />Friday, August 13, 2004 <br />Friday, May 13, 2005 <br />Friday, January 13, 2006 <br />Friday, October 13, 2006 <br />Friday, April 13, 2007 <br />Friday, July 13, 2007 <br />Friday, June 13, 2008 </font>
						</p>
						<p>
								<font size="2">六、时间掌握在你的手里 </font>
						</p>
				</div>
		</div>
<img src ="http://www.blogjava.net/fisher/aggbug/91765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-04 15:30 <a href="http://www.blogjava.net/fisher/articles/91765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算Java日期</title><link>http://www.blogjava.net/fisher/articles/91763.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Thu, 04 Jan 2007 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/91763.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/91763.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/91763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/91763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/91763.html</trackback:ping><description><![CDATA[
		<p align="left">
				<strong>
						<font face="宋体" size="5">计算Java日期</font>
				</strong>
				<br />学习怎样创建和使用日期 <br /><strong>概要</strong><br />    不管你是处理财务交易还是计划着下一步的行动，你都要知道怎样在Java中建立，使用和显示日期。这需要你简单的查阅一下相应类的API参考：一个日期可以创建3个相关类的对象。这篇文章告诉你你想要知道的内容。（3,000字）<br /><strong>作者：</strong>Robert Nielsen <br /><strong>翻译：</strong>Cocia Lin</p>
		<p>    Java统计从1970年1月1日起的毫秒的数量表示日期。也就是说，例如，1970年1月2日，是在1月1日后的86，400，000毫秒。同样的，1969年12月31日是在1970年1月1日前86，400，000毫秒。Java的Date类使用long类型纪录这些毫秒值.因为long是有符号整数，所以日期可以在1970年1月1日之前，也可以在这之后。Long类型表示的最大正值和最大负值可以轻松的表示290，000，000年的时间，这适合大多数人的时间要求。<br /><strong>Date 类<br />   </strong>Date类可以在java.util包中找到，用一个long类型的值表示一个指定的时刻。它的一个有用的构造函数是Date(),它创建一个表示创建时刻的对象。getTime()方法返回Date对象的long值。在下面的程序中，我使用Date()构造函数创建一个表示程序运行时刻的对象，并且利用getTime()方法找到这个日期代表的毫秒数量：</p>
		<p>import java.util.*;</p>
		<p>
				<br />public class Now {<br />   public static void main(String[] args) {<br />      Date now = new Date();<br />      long nowLong = now.getTime();<br />      System.out.println("Value is " + nowLong);<br />   }<br />}<br /><br />当我运行这个程序后，我得到972,568,255,150.快速确认一下这个数字，起码在一个合理的范围：它不到31年，这个数值相对1970年1月1日到我写这篇文章的时间来说，是合理的。计算机是这个毫秒值表示时间，人们可不愿意说" 我将在996,321,998,34见到你。"幸运的是，Java提供了一个转换Date对象到字符串的途径，表示成传统的形式。我们在下一节讨论DateFormat类，它直观的建立日期字符串。 <br />DateFormat类<br /> DateFormat类的一个目标是建立一个人们能够识别的字符串。然而，因为语言的差别，不是所有的人希望看到严格的相同格式的日期。法国人更喜欢看到"25 decembre 2000,",但是美国人习惯看到"December 25,2000."所以一个DateFormat的实例创建以后，这个对象包含了日期的显示格式的信息。如果使用用户电脑区域设置缺省的格式，你可以象下面那样，创建DateFormat对象，使用getDateInstance()方法：</p>
		<p>DateFormat df = DateFormat.getDateInstance();   <br /><br />DateFormat类在java.text包中可以找到。<br /><strong>转换成字符串<br /></strong>你可以使用format()方法转换Date对象为一个字符串。下面的示例程序说明了这个问题：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class NowString {<br />   public static void main(String[] args) {<br />      Date now = new Date();<br />      DateFormat df = DateFormat.getDateInstance();<br />      String s = df.format(now);<br />      System.out.println("Today is " + s);<br />   }<br />}  <br /><br />在上面的代码中，展示了没有参数，使用缺省格式的getDateInstance()方法。Java还提供了几个选择日期格式，你可以通过使用重载的getDateInstance(int style)获得。出于方便的原因，DateFormat提供了几种预置的常量，你可以使用这些常量参数。下面是几个SHORT, MEDIUM, LONG, 和FULL类型的示例：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class StyleDemo {<br />   public static void main(String[] args) {<br />      Date now = new Date();</p>
		<p>      DateFormat df =  DateFormat.getDateInstance();<br />      DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);<br />      DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);<br />      DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);<br />      DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL); <br />      String s =  df.format(now);<br />      String s1 = df1.format(now);<br />      String s2 = df2.format(now);<br />      String s3 = df3.format(now);<br />      String s4 = df4.format(now);</p>
		<p>      System.out.println("(Default) Today is " + s);<br />      System.out.println("(SHORT)   Today is " + s1);<br />      System.out.println("(MEDIUM)  Today is " + s2);<br />      System.out.println("(LONG)    Today is " + s3);<br />      System.out.println("(FULL)    Today is " + s4);<br />   }<br />}<br /><br />程序输出如下：</p>
		<p>(Default) Today is Nov 8, 2000<br />(SHORT)   Today is 11/8/00<br />(MEDIUM)  Today is Nov 8, 2000<br />(LONG)    Today is November 8, 2000<br />(FULL)    Today is Wednesday, November 8, 2000<br /><br />同样的程序，在我的电脑上使用缺省设置运行后，改变区域设置为瑞典，输出如下：</p>
		<p>(Default) Today is 2000-nov-08<br />(SHORT)   Today is 2000-11-08<br />(MEDIUM)  Today is 2000-nov-08<br />(LONG)    Today is den 8 november 2000<br />(FULL)    Today is den 8 november 2000     <br />  <br />从这里，你能看到，瑞典的月份不是大写的（虽然November还是november）.还有，LONG和FULL版本在瑞典语中是一样的，但是美国英语却不同。另外，有趣的是，瑞典语单词的星期三,onsdag，没有包含在FULL日期里，英语却包括。 <br />注意你能够使用getDateInstance()方法改变DateFormat实例的语种；但是，在上面的例子中，是通过改变Windows98的控制面板的区域设置做到的。不同的地方的区域设置不同，结果就不同，这样有好处，也有不足，Java程序员应该了解这些。一个好处是Java程序员可以只写一行代码就可以显示日期，而且世界不同地区的电脑运行同样的程序会有不用的日期格式。 但是这也是一个缺点，当程序员希望显示同一种格式的时--这也有可取之处，举例来说，在程序中混合输出文本和日期，如果文本是英文，我们就不希望日期格式是其他的格式，象德文或是西班牙文。如果程序员依靠日期格式编程，日期格式将根据运行程序所在电脑的区域设置不用而不同。 <br /><font size="4"><strong>解析字符串</strong></font><br /> 通过parse()方法，DateFormat能够以一个字符串创立一个Date对象。这个方法能抛出ParseException异常，所以你必须使用适当的异常处理技术。下面的例子程序通过字符串创建Date对象：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class ParseExample {<br />   public static void main(String[] args) {<br />      String ds = "November 1, 2000";<br />      DateFormat df = DateFormat.getDateInstance();<br />      try {<br />         Date d = df.parse(ds);<br />      }<br />      catch(ParseException e) {<br />         System.out.println("Unable to parse " + ds);<br />      }<br />   }<br />}<br /><br />在创建一个任意的日期时parse()方法很有用。我将通过另一种方法创建一个任意得日期。同时，你将看到怎样进行基本日期计算，例如计算90天后的另一天。你可以使用GregorianCalendar类来完成这个任务。 <br /><strong>GregorianCalendar类</strong><br /> 创建一个代表任意日期的一个途径使用GregorianCalendar类的构造函数，它包含在java.util包中：</p>
		<p>GregorianCalendar(int year, int month, int date) <br /><br />注意月份的表示，一月是0，二月是1，以此类推，是12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份，这样程序也许更易读，父类Calendar使用常量来表示月份：JANUARY, FEBRUARY,等等。所以，创建Wilbur 和 Orville制造第一架动力飞机的日期（December 17, 1903），你可以使用：</p>
		<p>GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);  <br />出于清楚的考虑，你应该使用前面的形式。但是，你也应该学习怎样阅读下面的短格式。下面的例子同样表示December 17,1903（记住，在短格式中，11表示December）</p>
		<p>GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17);   <br /><br />在上一节中，你学习了转换Date对象到字符串。这里，你可以做同样的事情；但是首先，你需要将GregorianCalendar对象转换到Date。要做到这一点，你可以使用getTime()方法，从它得父类Calendar继承而来。GetTime()方法返回GregorianCalendar相应的Date对象。你能够创建GregorianCalendar对象，转换到Date对象，得到和输出相应的字符串这样一个过程。下面是例子： </p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class Flight {</p>
		<p>   public static void main(String[] args) {<br />      GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);    <br />      Date d = firstFlight.getTime();<br />      DateFormat df = DateFormat.getDateInstance();<br />      String s = df.format(d);<br />      System.out.println("First flight was " + s);<br />   }<br />}<br /><br />有时候创建一个代表当前时刻的GregorianCalendar类的实例是很有用的。你可以简单的使用没有参数的GregorianCalendar构造函数，象这样：</p>
		<p>GregorianCalendar thisday = new GregorianCalendar();<br /><br />一个输出今天日期的例子程序，使用GregorianCalendar对象：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>class Today {<br />   public static void main(String[] args) {<br />      GregorianCalendar thisday = new GregorianCalendar(); <br />      Date d = thisday.getTime();<br />      DateFormat df = DateFormat.getDateInstance();<br />      String s = df.format(d);<br />      System.out.println("Today is " + s);<br />   }<br />}<br /><br />注意到，Date()构造函数和GregorianCalendar()构造函数很类似：都创建一个对象，条件简单，代表今天。<br /><strong>日期处理<br /></strong>GregorianCalendar类提供处理日期的方法。一个有用的方法是add().使用add()方法，你能够增加象年，月数，天数到日期对象中。要使用add()方法，你必须提供要增加的字段，要增加的数量。一些有用的字段是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR。下面的程序使用add()方法计算未来80天的一个日期。在Jules的&lt;环球80天&gt;是一个重要的数字，使用这个程序可以计算Phileas Fogg从出发的那一天1872年10月2日后80天的日期：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class World {<br />   public static void main(String[] args) {<br />      GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);<br />      worldTour.add(GregorianCalendar.DATE, 80);<br />      Date d = worldTour.getTime();<br />      DateFormat df = DateFormat.getDateInstance();<br />      String s = df.format(d);<br />      System.out.println("80 day trip will end " + s);<br />   }<br />}<br /><br />这个例子是想象的，但在一个日期上增加天数是一个普遍的操作：影碟可以租3天，图书馆可以借书21天，商店经常需要将购买的物品在30天内卖出。下面的程序演示了使用年计算：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class Mortgage {<br />   public static void main(String[] args) {<br />      GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18);<br />      mortgage.add(Calendar.YEAR, 15);<br />      Date d = mortgage.getTime();<br />      DateFormat df = DateFormat.getDateInstance();<br />      String s = df.format(d);<br />      System.out.println("15 year mortgage amortized on " + s);    }<br />}<br /><br />    add()一个重要的副作用是它改变的原来的日期。有时候，拥有原始日期和修改后的日期很重要。不幸的是，你不能简单的创建一个GregorianCalendar对象，设置它和原来的相等（equal）。原因是两个变量指向同一个Date()对象地址。如果Date对象改变，两个变量就指向改变后的日期对象。代替这种做法，应该创建一个新对象。下面的程序示范了这种做法：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class ThreeDates {<br />   public static void main(String[] args) {<br />      GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1);<br />      GregorianCalendar gc2 = gc1;<br />      GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1);<br />      //Three dates all equal to January 1, 2000</p>
		<p>      gc1.add(Calendar.YEAR, 1);<br />      <a><u><font color="#0000ff">file://gc1</font></u></a> and gc2 are changed</p>
		<p>      DateFormat df = DateFormat.getDateInstance();</p>
		<p>      Date d1 = gc1.getTime();<br />      Date d2 = gc2.getTime();<br />      Date d3 = gc3.getTime();</p>
		<p>      String s1 = df.format(d1);<br />      String s2 = df.format(d2);<br />      String s3 = df.format(d3);</p>
		<p>      System.out.println("gc1 is " + s1);<br />      System.out.println("gc2 is " + s2);<br />      System.out.println("gc3 is " + s3);<br />   }<br />}<br /><br />    程序运行后，gc1和gc2被变成2001年（因为两个对象指向同一个Date，而Date已经被改变了）。对象gc3指向一个单独的Date，它没有被改变。<br />计算复习日期<br />在这节，你将看到一个依据现实世界的例子。这个详细的程序计算过去一个具体的日期。例如，你阅读这篇文章，你想要记住一个印象深刻的知识点。如果你没有照片一样的记忆力，你就要定期的复习这些新资料，这将帮助你记住它。关于复习系统，Kurt Hanks 和 Gerreld L. Pulsipher在他们的&lt; Five Secrets to Personal Productivity个人能力的5个秘密&gt;中有讨论，建议看过第一眼后马上回顾一下，然后是1天后，1个星期后，1个月后，3个月后，1年后。我的这篇文章，你要马上回顾一下，从现在算起，再就是明天，然后是1个星期，1个月，3个月，1年后。我们的程序将计算这些日期。<br />这个程序非常有用的，它将是PIM(Personal Information Manager个人信息管理器)的一个组成部分，并将确定复习时间。在下面的程序中，getDates()方法对一个返回日期数组（复习日期）的电子软件很有用。另外，你可以返回单独的一个日期，使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().当时间范围超出这个PIM的ReviewDates的计算范围时ReviewDates类演示了怎样计算时间段。现在，你可以容易的修改它用来处理你需要的时间段，象图书馆借书，录影带租赁和抵押计算。首先，ReviewDates类显示在下面：</p>
		<p>import java.util.*;<br />import java.text.*;</p>
		<p>public class ReviewDates {<br />   private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear;<br />   final int dateArraySize = 6;</p>
		<p>   ReviewDates(GregorianCalendar gcDate) {<br />      int year = gcDate.get(GregorianCalendar.YEAR);<br />      int month = gcDate.get(GregorianCalendar.MONTH);<br />      int date = gcDate.get(GregorianCalendar.DATE);</p>
		<p>      firstDay = new GregorianCalendar(year, month, date);<br />      oneDay = new GregorianCalendar(year, month, date);<br />      oneWeek = new GregorianCalendar(year, month, date);<br />      oneMonth = new GregorianCalendar(year, month, date);<br />      oneQuarter = new GregorianCalendar(year, month, date);<br />      oneYear = new GregorianCalendar(year, month, date);</p>
		<p>      oneDay.add(GregorianCalendar.DATE, 1);<br />      oneWeek.add(GregorianCalendar.DATE, 7);<br />      oneMonth.add(GregorianCalendar.MONTH, 1);<br />      oneQuarter.add(GregorianCalendar.MONTH, 3);<br />      oneYear.add(GregorianCalendar.YEAR, 1);<br />   }</p>
		<p>   ReviewDates() {<br />      this(new GregorianCalendar());<br />   }</p>
		<p>   public void listDates() {<br />      DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); <br />      Date startDate = firstDay.getTime();<br />      Date date1 = oneDay.getTime();<br />      Date date2 = oneWeek.getTime();<br />      Date date3 = oneMonth.getTime();<br />      Date date4 = oneQuarter.getTime();<br />      Date date5 = oneYear.getTime();</p>
		<p>      String ss =  df.format(startDate);<br />      String ss1 = df.format(date1);<br />      String ss2 = df.format(date2);<br />      String ss3 = df.format(date3);<br />      String ss4 = df.format(date4);<br />      String ss5 = df.format(date5);</p>
		<p>      System.out.println("Start date is " + ss);<br />      System.out.println("Following review dates are:");<br />      System.out.println(ss1);<br />      System.out.println(ss2);<br />      System.out.println(ss3);<br />      System.out.println(ss4);<br />      System.out.println(ss5);<br />      System.out.println();<br />   }</p>
		<p>   public GregorianCalendar[] getDates() {<br />      GregorianCalendar[] memoryDates = new GregorianCalendar[dateArraySize];<br />      memoryDates[0] = firstDay;<br />      memoryDates[1] = oneDay;<br />      memoryDates[2] = oneWeek;<br />      memoryDates[3] = oneMonth;<br />      memoryDates[4] = oneQuarter;<br />      memoryDates[5] = oneYear;<br />      return memoryDates;<br />   }</p>
		<p>   public GregorianCalendar getFirstDay() {<br />      return this.firstDay;<br />   }</p>
		<p>   public GregorianCalendar getOneDay() {<br />      return this.oneDay;<br />   }</p>
		<p>   public GregorianCalendar getOneWeek() {<br />      return this.oneWeek;<br />   }</p>
		<p>   public GregorianCalendar getOneMonth() {<br />      return this.oneMonth;<br />   }</p>
		<p>   public GregorianCalendar getOneQuarter() {<br />      return this.oneQuarter;<br />   }</p>
		<p>   public GregorianCalendar getOneYear() {<br />      return this.oneYear;<br />   }<br />} <br /><br />下面是使用ReviewDates类列出复习日期的例子程序：</p>
		<p>import java.util.*;</p>
		<p>public class ShowDates {<br />   public static void main(String[] args) {<br />      ReviewDates rd = new ReviewDates();<br />      rd.listDates();</p>
		<p>      GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15);<br />      ReviewDates jan15 = new ReviewDates(gc);<br />      jan15.listDates();<br />   }<br />}<br /><br /><strong>总结</strong><br /> 这篇文章介绍了关于日期处理的3个重要的类：Date,DateFormat,GregorianCalendar.这些类让你创建日期，转换成字符串，和计算日期基本元素。处理Java中的日期问题，这篇文章只是冰山一角。可是，我在这里介绍的类和方法不仅仅是你学习高级技术的跳板，这些类和方法本身就可以处理很多通常的日期相关的任务<br /></p>
<img src ="http://www.blogjava.net/fisher/aggbug/91763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-04 15:27 <a href="http://www.blogjava.net/fisher/articles/91763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于java模拟ie 访问web网站的解决方法</title><link>http://www.blogjava.net/fisher/articles/86926.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Mon, 11 Dec 2006 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/86926.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/86926.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/86926.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/86926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/86926.html</trackback:ping><description><![CDATA[
		<p>在用Java的HttpURLConnection 来下载网页，发现访问google的网站时，会被google拒绝掉。<br /><br />       try<br />        {<br />            url = new URL(urlStr);<br />            httpConn = (HttpURLConnection) url.openConnection();<br />            HttpURLConnection.setFollowRedirects(true);</p>
		<p>            // logger.info(httpConn.getResponseMessage());<br />            in = httpConn.getInputStream();<br />            out = new FileOutputStream(new File(outPath));</p>
		<p>            chByte = in.read();<br />            while (chByte != -1)<br />            {<br />                out.write(chByte);<br />                chByte = in.read();<br />            }<br />        }<br />        catch (MalformedURLException e)<br />        {<br />         }<br />        }<br /><br /><br /><br />经过一段时间的研究和查找资料，发现是由于上面的代码缺少了一些必要的信息导致，增加更加详细的属性<br /><br />            httpConn.setRequestMethod("GET"); <br />            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); <br /><br />完整代码如下：<br />   public static void DownLoadPages(String urlStr, String outPath)<br />    {<br />        int chByte = 0;<br />        URL url = null;<br />        HttpURLConnection httpConn = null;<br />        InputStream in = null;<br />        FileOutputStream out = null;</p>
		<p>        try<br />        {<br />            url = new URL(urlStr);<br />            httpConn = (HttpURLConnection) url.openConnection();<br />            HttpURLConnection.setFollowRedirects(true);<br />            httpConn.setRequestMethod("GET"); <br />            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); <br />            <br />            // logger.info(httpConn.getResponseMessage());<br />            in = httpConn.getInputStream();<br />            out = new FileOutputStream(new File(outPath));</p>
		<p>            chByte = in.read();<br />            while (chByte != -1)<br />            {<br />                out.write(chByte);<br />                chByte = in.read();<br />            }<br />        }<br />        catch (MalformedURLException e)<br />        {<br />            e.printStackTrace();<br />        }<br />        catch (IOException e)<br />        {<br />            e.printStackTrace();<br />        }<br />        finally<br />        {<br />            try<br />            {<br />                out.close();<br />                in.close();<br />                httpConn.disconnect();<br />            }<br />            catch (Exception ex)<br />            {<br />                ex.printStackTrace();<br />            }<br />        }<br />    }<br /><br />此外，还有第二种方法可以访问Google的网站，就是用apache的一个工具HttpClient 模仿一个浏览器来访问Google<br /><br />        Document document = null;<br />        HttpClient httpClient = new HttpClient();<br />        <br />        GetMethod getMethod = new GetMethod(url);<br />        getMethod.setFollowRedirects(true);<br />        int statusCode = httpClient.executeMethod(getMethod);<br />        <br />        if (statusCode == HttpStatus.SC_OK)<br />        {<br />            InputStream in = getMethod.getResponseBodyAsStream();<br />            InputSource is = new InputSource(in);</p>
		<p>            DOMParser domParser = new DOMParser();   //nekoHtml 将取得的网页转换成dom<br />            domParser.parse(is);<br />            document = domParser.getDocument();<br />            <br />            System.out.println(getMethod.getURI());<br />            <br />        }<br />        return document;<br /><br />推荐使用第一种方式，使用HttpConnection 比较轻量级，速度也比第二种HttpClient 的快。</p>
<img src ="http://www.blogjava.net/fisher/aggbug/86926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2006-12-11 15:55 <a href="http://www.blogjava.net/fisher/articles/86926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>