﻿<?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-执着的笨蛋</title><link>http://www.blogjava.net/lcs/</link><description>黑暗的SH！灰暗的人生！</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 16:41:28 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 16:41:28 GMT</pubDate><ttl>60</ttl><item><title>不行了，笑死我了！</title><link>http://www.blogjava.net/lcs/archive/2008/05/07/198934.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 07 May 2008 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/05/07/198934.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/198934.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/05/07/198934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/198934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/198934.html</trackback:ping><description><![CDATA[<strong>太阳与草的对话！</strong><br />
<br />
<br />
太阳给草打电话<br />
太阳：喂，草你吗？我日。<br />
草：我草，你谁啊？！<br />
太阳：我日啊。<br />
草：我草，你到底是谁啊！<br />
太阳：我日啊，你草吧！<br />
草：TMD，你到底是谁啊，我草！<br />
太阳：我日，我日啊！<br />
草：我草！<br />
这时，太阳的妈妈接过电话：我日他吗，你是草吧，草你吗呐？
<img src ="http://www.blogjava.net/lcs/aggbug/198934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-05-07 13:05 <a href="http://www.blogjava.net/lcs/archive/2008/05/07/198934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据表损坏的修复方法(终极完美版!!!!!)[转]</title><link>http://www.blogjava.net/lcs/archive/2008/04/25/195835.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 25 Apr 2008 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/25/195835.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/195835.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/25/195835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/195835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/195835.html</trackback:ping><description><![CDATA[原文地址：<font style="background-color: #dee0fe">http://x.discuz.net/183161/viewspace-16039.html</font><br />
<br />
<br />
<font size="3">由于 MySQL 本身的读写及锁定机制等方面的原因，与一些其他数据库软件一样，在特殊情况下的极为频繁读写时，或在服务器掉电、死机等情况下，相关的数据文件可能会发生被损坏的情况，通常可以采用以下的方式加以解决。 <br />
<span style="display: none">.l0E-UQyEO0</span><span style="display: none">SupeSite/X-Space官方站8Eh-S:Cn Nx gs(N</span><br />
一:repair.php 修复工具<br />
<span style="display: none">o^7rU V-uQ0</span>Discuz! 自带了一个使用 PHP 编写的数据表修复工具 repair.php，虚拟主机用户也可使用。该工具位于软件包的 ./utilities 目录中，使用时需要上传到服务器上论坛目录（注意不要连 ./utilities 目录一起上传，否则无法运行），<br />
<span style="display: none">Sj;btNK9u0</span><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/upload_2hBZ9agBdcXo.jpg"  alt="" /><br />
<span style="display: none">1X"|4m&amp;i?6Z v-NmV0</span>upload.jpg<span style="display: none">SupeSite/X-Space官方站]] Jj.G"^</span><br />
在浏览器运行后点击下面的链接即可<br />
<span style="display: none">Rx(m-qy0</span><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/run_ZLKvsVv6Rnk9.jpg"  alt="" /><span style="display: none">SupeSite/X-Space官方站7C3K{~ n%E)c-G"WB</span><br />
run.jpg<span style="display: none">SupeSite/X-Space官方站_N'C _b</span><br />
<span style="display: none">SupeSite/X-Space官方站q4l8l q u C%[K</span><br />
修复以后如果出现下面的画面表示修复成功!!!<span style="display: none">SupeSite/X-Space官方站G iv`*X</span><br />
<br />
<span style="display: none">aM@5A z n'\ ez*A0</span><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/result_1QHvotpMWYR5.jpg"  alt="" /><span style="display: none">SupeSite/X-Space官方站0L `C ZQF0s^-Y</span><br />
result.jpg<br />
<span style="display: none">'qb _H!Q4t)['^/e0</span>这个工具能修复大多数常见的数据库错误，尤其是错误号为 126、127 的错误，对 145 错误也可修复，同时能对数据表在修复之后进行优化。如果一次修复不成功，可以尝试多次，或将数据库重启后再试。 <br />
<span style="display: none">_~yFxm0</span><br />
<span style="display: none">3P` w:e G9S,t2m)V0</span><span style="display: none">SupeSite/X-Space官方站G)Y+N$|:p[J-|*{I&amp;c7e</span><br />
<span style="display: none">SupeSite/X-Space官方站[@N*AfS</span><br />
二 :myisamchk 修复工具<span style="display: none">SupeSite/X-Space官方站E)?E/?F5S&amp;o</span><br />
MySQL 自带了专门用户数据表检查和修复的工具——myisamchk，当 repair.php 多次修复均无法成功时，可以在服务器终端使用 myisamchk 进行修复。在 MySQL 的程序文件目录（见《数据备份与恢复》中的说明）可以找到这个工具。 <span style="display: none">SupeSite/X-Space官方站+k[n+Vq KYW</span><br />
<br />
<span style="display: none">J6g;oB%fy;gG@0</span>常用的修复命令为 myisamchk -r 数据文件目录/数据表名.MYI，如果 -r 参数不能奏效，可以先把数据文件备份（备份可使用直接文件复制的方式，详见《数据备份与恢复》中的说明）后使用 -o 参数,如果-o还不可以的话,就使用-f参数,如果还是无法修复,只有使用你的备份文件来恢复数据了!<font color="red">什么??你没有备份文件<img title="点击图片可在新窗口打开" style="cursor: pointer" src="http://www.discuz.net/images/smilies/shocked.gif" align="absMiddle" border="0"  alt="" />那你就坐到那里哭吧!!开个玩笑,但是网站及时的做备份确实是很重要的,尤其当有一定的规模以后,建议每天都做备份!!</font><span style="display: none">SupeSite/X-Space官方站'^9I J n1?8f!j&amp;w xp:}</span><br />
下面说一下具体的步骤:<span style="display: none">SupeSite/X-Space官方站)[#R"^w}</span><br />
1.<span style="display: none">SupeSite/X-Space官方站r RG'^7^-t+XuO</span><br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" src="http://www.discuz.net/attachments/month_0602/cmd_J9ALgyFrcWu8.jpg"  alt="" /><br />
<span style="display: none">gEVu7B} jK0</span>cmd.jpg<span style="display: none">SupeSite/X-Space官方站r sFS(V.?rH</span><br />
2.更改当前目录到mysql/bin下面,一般情况下只有在这个下面才能运行myisamchk命令<br />
<span style="display: none">;E-}&amp;xJ ^n-V2Q9W#T0</span><span style="display: none">SupeSite/X-Space官方站L5I&amp;ry R4y:j#}+w$[</span><br />
<img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/myisamchk_Fkge3aypKMey.jpg"  alt="" /><span style="display: none">SupeSite/X-Space官方站-er5f/?8EB'q0m`</span><br />
myisamchk.jpg<span style="display: none">SupeSite/X-Space官方站GN,}7f5C*V</span><br />
3.修复的结果,如果修复后的情况都如下图所示的话,你就可以<img title="点击图片可在新窗口打开" style="cursor: pointer" src="http://www.discuz.net/images/smilies/lol.gif" align="absMiddle" border="0"  alt="" /><img title="点击图片可在新窗口打开" style="cursor: pointer" src="http://www.discuz.net/images/smilies/lol.gif" align="absMiddle" border="0"  alt="" />了,成功了,继续开启你的网站,运行吧!!<span style="display: none">SupeSite/X-Space官方站UncL.f4f+X t</span><br />
<br />
<span style="display: none">_0O"}}&amp;uY0}0|0</span><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/theresult_BXmCwpZkj538.jpg"  alt="" /><span style="display: none">SupeSite/X-Space官方站p'EwS6@#J L</span><br />
theresult.jpg<span style="display: none">SupeSite/X-Space官方站7u'?5U ~GK+Z6rU1E(t</span><br />
4.别忘了启动你的mysql,要不你的网站还是运行不起来.<img title="点击图片可在新窗口打开" style="cursor: pointer" src="http://www.discuz.net/images/smilies/titter.gif" align="absMiddle" border="0"  alt="" /><br />
<span style="display: none">Dr3C1E}BR)e"X)G0</span><span style="display: none">SupeSite/X-Space官方站Kl.J:n4v+Ha</span><br />
<img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/startmysql_CzOGSvzciTzc.jpg"  alt="" /><span style="display: none">SupeSite/X-Space官方站x$[/Vh^</span><br />
startmysql.jpg<br />
<span style="display: none">](e1O{+B5E-s1}!f0</span>ps:下面给的一个是linux下面的修复方法,和上面的基本相同.只是linux下面关闭和启动mysql的方法和windows的不同.一般情况下linux用<br />
<span style="display: none">O3o0].S2EE S0</span><span style="display: none">SupeSite/X-Space官方站@7Dy o!R G$u Y</span><br />
<div style="font: bold 11px Arial, Tahoma; margin-left: 2em; margin-right: 2em">
<div style="float: left">CODE:</div>
<div style="float: right; text-align: right"><a style="font: 11px Arial, Tahoma" href="http://x.discuz.net/183161/viewspace-16039.html###" nclick="copycode(findobj('code14'));"  &#111;>[Copy to clipboard]</a></div>
</div>
<div id="code14" style="clear: both; border-right: #698cc3 1px solid; padding-right: 10px; border-top: #698cc3 1px solid; padding-left: 10px; background: #ffffff; padding-bottom: 10px; margin: 3px 2em 2em; border-left: #698cc3 1px solid; word-break: break-all; padding-top: 5px; border-bottom: #698cc3 1px solid">/etc/init.d/mysql stop&nbsp;&nbsp;service mysqld stop /etc/init.d/mysql start service mysqld start </div>
来关闭和启动mysql<br />
<span style="display: none">f^Zi!y3v1S0</span><br />
<span style="display: none">nB\aV&amp;N0</span><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" src="http://www.discuz.net/attachments/month_0602/linux_AMlD3NCxELqb.jpg"  alt="" /><span style="display: none">SupeSite/X-Space官方站"x!@S"CH0c:`%b:S</span><br />
linux.jpg<br />
<span style="display: none">&amp;j%r.O8~.^E w0o1R0</span><br />
<span style="display: none">{&amp;y7`'P9s"TG0</span>另外 MySQL 官方文档中还提供了针对上面操作均无法奏效时的特殊办法，如先清空重建数据表，然后再用备份的数据文件覆盖等，这种特别复杂的情况用户通常不会碰到，因此这里不再做过于深入的研究。 <span style="display: none">SupeSite/X-Space官方站kH,M:It.s3nD</span><br />
<span style="display: none">SupeSite/X-Space官方站ry O:D.x A|</span><br />
三:数据表经常性损坏的解决方法<span style="display: none">SupeSite/X-Space官方站W"Y$}y)B3O^</span><br />
<br />
<span style="display: none">#DJu*ET\ AN5N0</span>--------------------------------------------------------------------------------<span style="display: none">SupeSite/X-Space官方站 U3m]5uOD-O6kD</span><br />
<span style="display: none">SupeSite/X-Space官方站%|gj%s8G8fr6j</span><br />
首先请确认在服务器硬件不存在问题（如内存工作不稳定、散热条件不好等），且使用中的操作系统版本也没有相关的 BUG 报告或升级补丁。这种情况下，如果数据库仍出现经常性的损坏，请检查是否 MySQL 的编译方式或参数存在问题。通常情况下使用官方提供的编译好的版本是比较稳定的，可以长期使用。如果您钟爱自行编译相关程序，请确认您的语言编译器（如 gcc）和配置的相关参数没有导致不稳定的因素。同时，磁盘分区满也可能是导致数据表经常性损坏的原因。网上提供了一些问题的处理方法（英文），需要时可多参考，并针对您的具体服务器环境制定解决方案。</font> <br />
<img src ="http://www.blogjava.net/lcs/aggbug/195835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-25 09:46 <a href="http://www.blogjava.net/lcs/archive/2008/04/25/195835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何修复损坏的MySQL数据表[转]</title><link>http://www.blogjava.net/lcs/archive/2008/04/25/195829.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 25 Apr 2008 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/25/195829.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/195829.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/25/195829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/195829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/195829.html</trackback:ping><description><![CDATA[<p>原文地址：<font style="background-color: #dee0fe">http://www.3v.org.cn/article.asp?id=164</font><br />
<font size="3"><br />
由</font>于断电或非正常关机而导致MySQL数据库出现错误是非常常见的问题。有两种方法，一种方法使用mysql的check&nbsp;table和repair&nbsp;table&nbsp;的sql语句，另一种方法是使用MySQL提供的多个myisamchk,&nbsp;isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。<br />
<br />
1.&nbsp;check&nbsp;table&nbsp;和&nbsp;repair&nbsp;table<br />
登陆mysql&nbsp;终端：<br />
mysql&nbsp;-uxxxxx&nbsp;-p&nbsp;dbname<br />
&gt;&nbsp;check&nbsp;table&nbsp;tabTest;<br />
如果出现的结果说Status是OK，则不用修复，如果有Error，可以用：<br />
&gt;&nbsp;repair&nbsp;table&nbsp;tabTest;<br />
进行修复，修复之后可以在用check&nbsp;table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。<br />
<br />
2.&nbsp;myisamchk,&nbsp;isamchk<br />
其中myisamchk适用于MYISAM类型的数据表，而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同，一般新的系统都使用MYISAM作为缺省的数据表类型，这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用：<br />
<br />
myisamchk&nbsp;tablename.MYI<br />
<br />
进行检测，如果需要修复的话，可以使用：<br />
<br />
myisamchk&nbsp;-of&nbsp;tablename.MYI<br />
<br />
关于myisamchk的详细参数说明，可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表，保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。<br />
<br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />
<br />
另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前：<br />
<br />
[&nbsp;-x&nbsp;/tmp/mysql.sock&nbsp;]&nbsp;&amp;&amp;&nbsp;/pathtochk/myisamchk&nbsp;-of&nbsp;/DATA_DIR/*/*.MYI<br />
<br />
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置，对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock，对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更，而pathtochk则是myisamchk所在的位置，DATA_DIR是你的MySQL数据库存放的位置。<br />
<br />
需要注意的时，如果你打算把这条命令放在你的rc.local里面，必须确认在执行这条指令时MySQL服务器必须没有启动！&nbsp;<br />
<br />
检测修复所有数据库(表)<br />
mysqlcheck&nbsp;-A&nbsp;-o&nbsp;-r&nbsp;-p&nbsp;<br />
---------------------------------------------------------------------------------<br />
<br />
<br />
示例:<br />
mysql&gt;&nbsp;check&nbsp;table&nbsp;tabFTPAccountInstances;<br />
</p>
<img src ="http://www.blogjava.net/lcs/aggbug/195829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-25 09:42 <a href="http://www.blogjava.net/lcs/archive/2008/04/25/195829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是SOAP</title><link>http://www.blogjava.net/lcs/archive/2008/04/24/195607.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 24 Apr 2008 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/24/195607.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/195607.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/24/195607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/195607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/195607.html</trackback:ping><description><![CDATA[SOAP（Simple Object Access Protocol ）简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议，是一个基于XML的协议。<br />
<br />
它包括四个部分：<br />
SOAP封装(envelop)，封装定义了一个描述消息中的内容是什么，是谁发送的，谁应当接受并处理它以及如何处理它们的框架；<br />
SOAP编码规则（encoding rules），用于表示应用程序需要使用的数据类型的实例; <br />
SOAP RPC表示(RPC representation)，表示远程过程调用和应答的协定;<br />
SOAP绑定（binding），使用底层协议交换信息。 <br />
<br />
　　虽然这四个部分都作为SOAP的一部分，作为一个整体定义的，但他们在功能上是相交的、彼此独立的。特别的，信封和编码规则是被定义在不同的XML命名空间(namespace)中，这样使得定义更加简单。 <br />
<br />
<br />
========另一个解释==========<br />
简单对象访问协议（SOAP）是一种轻量的、简单的、基于XML的协议，它被设计成在WEB上交换结构化的和固化的信息。SOAP可以和现存的许多因特网协议和格式结合使用，包括超文本传输协议（HTTP），简单邮件传输协议（SMTP），多用途网际邮件扩充协议（MIME）。它还支持从消息 系统到远程过程调用（RPC）等大量的应用程序。&nbsp;&nbsp;&nbsp;</clk><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;SOAP &nbsp; 包括三个部分：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
SOAP &nbsp; 封装：它定义了一个框架，该框架描述了消息中的内容是什么，谁应当处理它以及它是可选的还是必须的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
SOAP &nbsp; 编码规则：它定义了一种序列化的机制，用于交换应用程序所定义的数据类型的实例。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
SOAP &nbsp; RPC &nbsp; 表示：它定义了用于表示远程过程调用和应答的协定。<br />
<br />
SOAP &nbsp; 消息基本上是从发送端到接收端的单向传输，但它们常常结合起来执行类似于请求/应答的模式。所有的SOAP消息都使用 &nbsp; XML &nbsp; 编码。一条 &nbsp; SOAP &nbsp; 消息就是一个包含有一个必需的 &nbsp; SOAP &nbsp; 的封装包，一个可选的 &nbsp; SOAP &nbsp; 标头和一个必需的 &nbsp; SOAP &nbsp; 体块的 &nbsp; XML &nbsp; 文档。 &nbsp; <br />
&nbsp; &nbsp; <br />
<clk>&nbsp; 　　把 &nbsp; SOAP &nbsp; 绑定到 &nbsp; HTTP &nbsp; <nobr oncontextmenu="return false;" onmousemove="kwM(12);" id="clickeyekey12" onmouseover="kwE(event,12, this);" style="background: url(http://control.clickeye.com.cn/images/line5.gif) repeat-x 50% bottom; padding-bottom: 2px; color: #6600ff" onclick="return kwC(event,12)" onmouseout="kwL(event,this)" target="_blank">提供</nobr>了同时利用 &nbsp; SOAP &nbsp; 的样式和分散的灵活性的特点以及 &nbsp; HTTP &nbsp; 的丰富的特征库的优点。在 &nbsp; HTTP &nbsp; 上传送 &nbsp; SOAP &nbsp; 并不是说 &nbsp; SOAP &nbsp; 会覆盖现有的 &nbsp; HTTP &nbsp; 语义，而是 &nbsp; HTTP &nbsp; 上的 &nbsp; SOAP &nbsp; 语义会自然的映射到 &nbsp; HTTP &nbsp; 语义。在使用 &nbsp; HTTP &nbsp; 作为协议绑定的<nobr oncontextmenu="return false;" onmousemove="kwM(5);" id="clickeyekey5" onmouseover="kwE(event,5, this);" style="background: url(http://control.clickeye.com.cn/images/line5.gif) repeat-x 50% bottom; padding-bottom: 2px; color: #6600ff" onclick="return kwC(event,5)" onmouseout="kwL(event,this)" target="_blank">场合</nobr>中， &nbsp; RPC &nbsp; 请求映射到 &nbsp; HTTP &nbsp; 请求上，而 &nbsp; RPC &nbsp; 应答映射到 &nbsp; HTTP &nbsp; 应答。然而，在 &nbsp; RPC &nbsp; 上使用 &nbsp; SOAP &nbsp; 并不仅限于 &nbsp; HTTP &nbsp; 协议绑定。&nbsp;&nbsp;&nbsp;&nbsp; </clk><br />
<img src ="http://www.blogjava.net/lcs/aggbug/195607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-24 15:49 <a href="http://www.blogjava.net/lcs/archive/2008/04/24/195607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp显示word、excel</title><link>http://www.blogjava.net/lcs/archive/2008/04/23/194980.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 23 Apr 2008 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/23/194980.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/194980.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/23/194980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/194980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/194980.html</trackback:ping><description><![CDATA[也许会有用！<br />
<br />
word页面只要在jsp头设置如下指令：<br />
&lt;%@page contentType="application/msword;charset=GBK" %&gt;<br />
<br />
excel如下：<br />
&lt;%@page contentType="application/vnd.ms-excel;charset=GBK" %&gt;<br />
<img src ="http://www.blogjava.net/lcs/aggbug/194980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-23 11:32 <a href="http://www.blogjava.net/lcs/archive/2008/04/23/194980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant入门教程</title><link>http://www.blogjava.net/lcs/archive/2008/04/21/194534.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 21 Apr 2008 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/21/194534.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/194534.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/21/194534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/194534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/194534.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td valign="top" width="358">
            <div style="text-indent: 21pt">本内容包含了Ant的历史简要介绍，Ant的功能以及Ant框架的介绍，并对下载安装使用Ant进行了示例介绍，同时通过一个Java程序讲解了Ant的基本使用方法。<br />
            <br />
            <br />
            </div>
            <div style="margin-left: 21pt; text-indent: -21pt"><span class="STYLE1"><strong>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>Ant简介：这里引用Ant帮助文档中对Ant</strong><strong>的介绍：</strong></span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt"><br />
            &nbsp;&nbsp;&nbsp;&nbsp; Apache Ant是一个基于Java的构建工具。从理论上讲，也是一种类似于Make的工具，只是去除了Make工具的缺点。</div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;既然已经有了make, gnumake, nmake, jam以及其他的构件工具，为什么还要Ant呢？因为Ant的早期开发者发现所有以上这些工具都或多或少的有一些局限性，使得在跨平台开发软件成为困难。类似于Make的工具都是传统的基于Shell的--首先进行依赖性检查，然后执行命令。这意味着你可以轻易的通过使用或者编写程序来扩展这些工具，以满足不同的平台。当然，这也意味着你将局限于特定的平台，至少可以说局限于特定类型的平台，例如：Unix平台。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt"></div>
            </td>
        </tr>
        <tr>
            <td colspan="2" height="20">
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;同时，Make文件也有一些先天的缺陷。好多人都会遇到恐怖的tab问题。Ant的最初开发者多次说&#8220;我的命令不能执行因为我在tab前面加了一个空格！&#8221;。一些工具如Jam一定程序上解决了这个问题，但仍有其它的格式问题。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;Ant与从基于命令的那些扩展开来的那些工具不同，Ant是由java类扩展的。不用编写shell命令，而是配置基于XML的文件，形成多个任务的目标配置树。每一个任务都是通过一个实现了一个规定接口的java类来运行的。</div>
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;ant缺少了一些直接执行shell命令的能力，如find . -name foo -exec rm {}，但它给用户提供了跨平台的能力，可以在任何地方工作。实际上，Ant也提供了命令execute用来执行shell命令,这就是它的任务，它允许执行基于操作系统的命令。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 0cm"><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp;&nbsp;</span>简单的说，Ant是一个基于Java，并且主要用于Java工程的构建工具。Ant本意是Another Neat Tool,也就是另一种整洁的工具，取首字符就是Ant。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 0cm">构建工具就是为了减少重复工作而产生的。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt"><span style="color: #0000ff"><strong><span style="font-size: 10.5pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ant的一些核心概念：</span></strong></span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">XML:</span><span style="font-size: 10.5pt">构建文件是以</span><span style="font-size: 10.5pt">XML</span><span style="font-size: 10.5pt">文件来描述的，采用</span><span style="font-size: 10.5pt">XML</span><span style="font-size: 10.5pt">格式有很多好处。这里就不一一列举。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt">陈述式语法：构建文件短小精悍，且易于理解。</div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">每个构建文件包含一个工程</span><span style="font-size: 10.5pt">(project)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">每个工程包含若干个目标</span><span style="font-size: 10.5pt">(target)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">目标可以依赖于其他的目标</span><span style="font-size: 10.5pt">(depends)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">目标包含任务</span><span style="font-size: 10.5pt">(task)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">易于使用</span><span style="font-size: 10.5pt">Java</span><span style="font-size: 10.5pt">语言增加新的任务</span><span style="font-size: 10.5pt">---</span><span style="font-size: 10.5pt">易于扩展（自定义）。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt"><span class="STYLE1"><strong><span style="font-size: 10.5pt">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="font-size: 10.5pt">Ant</span></strong><strong><span style="font-size: 10.5pt">结构：</span></strong></span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">Ant</span><span style="font-size: 10.5pt">的结构如下图所示：</span></div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm"><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/1dfd5fb0860e49caa4ac48253544cb79.png" /></div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm"><span style="font-size: 10.5pt"><br />
            构建文件的概念视图：工程包含一个目标的集合。在每个目标里是任务的声明，它们是对</span><span style="font-size: 10.5pt">Ant</span><span style="font-size: 10.5pt">用于构建该目标的行为说明。目标生成一个依赖关系图表来声明该目标的依赖关系。当执行一个目标时，必须先执行它们依赖的目标。</span></div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm">&nbsp;</div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm"><strong><span style="font-size: 10.5pt"><span class="STYLE1">例子：一个典型的构建文件</span>：</span></strong></div>
            <div>&lt;?xml version="1.0" ?&gt;</div>
            <div>&lt;project name="OurProject" default="deploy"&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="init"&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="dist" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="compile" depends="init" &gt;</div>
            <div style="text-indent: 21pt">&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="doc" depends="init" &gt;</div>
            <div style="text-indent: 21pt">&lt;javadoc destdir="build/classes" sourcepath="src" packagenames="org.*" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="deploy" depends="compile,doc" &gt;</div>
            <div style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&lt;jar destfile="dist/project.jar" basedir="build/classes"/&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ftp server="<span style="color: red">"</span> userid="<span style="color: red">"</span> password="<span style="color: red">"&gt;</span>
            <div style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="dist"/&gt;</div>
            <div style="text-indent: 21pt">&lt;/ftp&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div>&lt;/project&gt;</div>
            <div>&nbsp;</div>
            <div><strong>该构建过程如下：</strong></div>
            <div>系统初始化1、编译&nbsp;&nbsp;2、生成JAVADOC&nbsp;&nbsp;&nbsp;4、打包&nbsp;&nbsp;5、上传到FTP，其中后两步结合到一起叫部署。</div>
            <div>&nbsp;</div>
            <div>执行时输出如下：</div>
            <div>&gt; ant -propertyfile ftp.properties</div>
            <div>Buildfile: build.xml</div>
            <div>init:</div>
            <div>[mkdir] Created dir: /home/ant/Projects/OurProject/build/classes</div>
            <div>[mkdir] Created dir: /home/ant/Projects/OurProject/dist</div>
            <div>compile:</div>
            <div>[javac] Compiling 1 source file to /home/ant/Projects/OurProject/build/</div>
            <div>classes</div>
            <div>doc:</div>
            <div>[javadoc] Generating Javadoc</div>
            <div>[javadoc] Javadoc execution</div>
            <div>[javadoc] Loading source files for package org.example.antbook.lesson1...</div>
            <div>[javadoc] Constructing Javadoc information...</div>
            <div>[javadoc] Building tree for all the packages and classes...</div>
            <div>[javadoc] Building index for all the packages and classes...</div>
            <div>[javadoc] Building index for all classes...</div>
            <div>deploy:</div>
            <div>[jar] Building jar: /home/ant/Projects/OurProject/dist/project.jar</div>
            <div>[ftp] sending files</div>
            <div>[ftp] 1 files sent</div>
            <div>BUILD SUCCESSFUL</div>
            <div>Total time: 5 seconds.</div>
            <div><br />
            在执行时使用命令行参数以传入一个属性文件，属性文件中包含连接FTP服务器使用的服务器名，用户名，用户密码来给<span style="color: red">特性使用。</span></div>
            <div>这个例子很好的展示了Ant的一些基本要素：目标依赖、特性的使用、编译、文档生成、JAR打包（tar,Zip,WAR,EAR等），最后是部署。</div>
            <div>&nbsp;</div>
            <div>Ant的简单任务(&lt;mkdir&gt;)都是由Java类库来实现相应的功能。而一些复杂的任务&lt;ftp&gt;、&lt;junit&gt;还需要第三方库的支持。</div>
            <div>&nbsp;</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;Ant的一个强大之处：它总能工作。只要正确的指定构建文件，Ant就能计算出目标的依赖性，并且按照正确的顺序调用目标。目标通过任务按序执行，而任务自身处理其文件依赖性以及实际的操作来完成工作。因为每个任务通常都是在高层陈述，所以一两行XML语句经常就已经足够描述任务的内容。</div>
            <div>&nbsp;</div>
            <div style="margin-left: 21pt; text-indent: -21pt"><span class="STYLE1"><strong>4.&nbsp;&nbsp;&nbsp;</strong><strong>下载并安装</strong><strong>Ant</strong></span></div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用Ant前提条件，系统中已经安装JDK以及Ant。在文档编写之时，Ant的最新版本是Ant 1.7,但是为了稳定性，本文档使用版本为Ant 1.6.5.</div>
            <div>首先下载Ant，到apache软件网站<a href="http://www.apache.org/">http://www.apache.org/</a>。</div>
            <div>其次，解压缩文件，放到指定的系统目录中，例如C:\Ant。</div>
            <div>再次，将其添加到path，以便从命令行使用。(一些IDE，例如Eclipse可以不需要设置path,而通过IDE相关设置将Ant添加到path中。)</div>
            <div>再次，设置一些环境变量指向JDK以及ANT。</div>
            <div>最后，添加需要的可选库。</div>
            <div>&nbsp;</div>
            <div>在Windows安装过程（以笔者的安装过程为例）</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;下载apache-ant-1.6.5-bin.zip到本地硬盘，解压缩之后将文件夹命名为Ant,放在C:\Ant中。这个目录就是Ant主目录。</div>
            <div>应该将主目录中的bin目录添加到path属性中，这样就可以在命令行中调用ant命令，ANT_HOME是批处理文件所在目录的上级目录。最好明确设定。</div>
            <div><span style="color: black">现在许多工具已经集成了特定版本的</span><span style="color: black">Ant</span><span style="color: black">，一些操作系统甚至默认的已经安装了</span><span style="color: black">Ant</span><span style="color: black">。所以，你的系统中可能已经安装了</span><span style="color: black">Ant</span><span style="color: black">。</span></div>
            <div>首先可以通过运行以下命令：<br />
            <strong>ant -version</strong><br />
            和<br />
            ant -diagnostics <br />
            来确定。我们推荐您不设置CLASSPATH来运行Ant命令。如果任何版本的Ant可以从CLASSPATH加载 ，这时就会由于加载了不兼容的类而产生许多错误。</div>
            <div>&nbsp;</div>
            <div>一些其他问题请参阅Ant的FAQ设置。</div>
            <div>正常情况下，执行ant ?Cversion即可显示Ant版本，则说明安装配制成功：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/ea29812585e24474a75be50e7407e4be.png" /></div>
            <div>&nbsp;</div>
            <div style="margin-left: 21pt; text-indent: -21pt"><strong>5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>运行第一个构建文件：</strong></div>
            <div style="margin-left: 21pt">首先创建一个Java工程，名为AntProject，工程中源文件和目标文件是分开的，分别为文件夹src和bin,然后创建一个Java类文件，类名为</div>
            <div style="margin-left: 21pt">com.neusoft.test.AntTest，只是为了测试，所以类的内容很简单：</div>
            <div style="margin-left: 21pt">package com.neusoft.test;</div>
            <div style="margin-left: 21pt">/**</div>
            <div style="margin-left: 21pt">&nbsp;*This is just a test class.</div>
            <div style="margin-left: 21pt">&nbsp;*/</div>
            <div style="margin-left: 21pt">public class AntTest{</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;args.length;i++){</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(args[i]);</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
            <div style="margin-left: 21pt">}</div>
            <div style="margin-left: 21pt">&nbsp;</div>
            <div style="margin-left: 21pt"><strong>然后我们在工程的路径下面建立一个构建文件</strong><strong>build.xml</strong><strong>，内容如下：</strong></div>
            <div>&lt;?xml version="1.0" ?&gt;</div>
            <div>&lt;project name="structured" default="archive" &gt;</div>
            <div style="text-indent: 21pt">&lt;target name="init"&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="dist" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="compile" depends="init" &gt;</div>
            <div style="text-indent: 21pt">&nbsp;&nbsp;&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
            <div style="text-indent: 21pt"></div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="archive" depends="compile" &gt;</div>
            <div style="text-indent: 21pt">&lt;jar destfile="dist/project.jar"</div>
            <div style="text-indent: 21pt">basedir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="clean" depends="init"&gt;</div>
            <div style="text-indent: 21pt">&lt;delete dir="build" /&gt;</div>
            <div style="text-indent: 21pt">&lt;delete dir="dist" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div>&lt;/project&gt;<br />
            </div>
            <div>构建文件说明如下图：</div>
            <div style="text-indent: 21pt"><img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/d13b06a92da34475a024ee7923683186.png" /></div>
            <div><br />
            <br />
            关于XML的知识，请参考其他书籍，这里不做介绍。</div>
            <div>以上创建完成后，目录结构如下图：<br />
            <br />
            </div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/18957dabfc4747ea9fa861b1101371af.png" /></div>
            <div>&nbsp;<br />
            </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ant构建文件总是有一个&lt;project&gt;元素做为根元素，它有两个属性，name和default，&lt;target&gt;元素是&lt;project&gt;元素的子元素，可以有多个，它有两个属性，name和depends，&lt;target&gt;元素包含的元素就是一些任务元素。<br />
            <br />
            </div>
            <div>&lt;target&gt;可以由命令行进行显示的调用，也可以在内部使用如可以直接调用ant init、ant compile等。如果不写参数，则默认的build文件是build.xml，默认的目标是&lt;project&gt;的default属性定义的目标。目标的名称是唯一的，可以是任意字符串。</div>
            <div>&nbsp;</div>
            <div>下面我们先运行一下这个Ant构建，再讲解其他的内容，进入工程目录，执行</div>
            <div>ant</div>
            <div>这里就相当于执行默认的目标，也就是&lt;project name="structured" default="archive" &gt;中的archive目标。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/bf58caa3631043c9934e37a8c6842cd3.png" /></div>
            <div>&nbsp;</div>
            <div>这里说明了首先初始化创建两个目录，然后编译了一个JAVA文件，然后进行了打包的操作。</div>
            <div>&nbsp;</div>
            <div><strong>这里讲解一下如果构建失败了怎么办？</strong></div>
            <div>首先有可能是XML语法书写不正确(将&lt;target&gt;写成&lt;targe&gt;)，或者在任务执行过程中出现了错误(.java文件中包含编译错误)，或者任务名称书写错误(将&lt;javac&gt;写成&lt;javacc&gt;)等等，这些都不是Ant的错误，不需要填写Bug Report。写XML时一定要细心，一些IDE已经有验证功能，可以很好的防止书写的错误。</div>
            <div>&nbsp;</div>
            <div><strong>出现错误时，可以使用</strong></div>
            <div>ant ?Cverbose</div>
            <div>或者</div>
            <div>ant ?Cdebug来获取更加详细的构建信息，以解决问题。</div>
            <div>下图是使用ant ?Cverbose时的输出，使用ant ?Cdebug将获取比这更详细的信息，这里就不举例了。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/457f2ee754f04d1380a08a6bc45e55b9.png" /></div>
            <div>&nbsp;</div>
            <div>本例中直接使用了软件工程中的构建结构，使用src作为源文件目录，build/class作为中间生成文件，以dist作为可发布文件。在最后把一些可执行文件可以放在bin目录中。此时目录结构如下图所示：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/3112c28771af45a3be22d7e26e77836d.png" /></div>
            <div>&nbsp;</div>
            <div>我们需要一种办法来确定某些任务先执行，而有些任务后执行，比如必须先编译，才能执行程序或者打包。我们在声明目标的时候，就在其依赖属性中列出其依赖关系：</div>
            <div>&lt;target name="compile" depends="init" &gt;</div>
            <div>&lt;target name="archive" depends="compile" &gt;</div>
            <div>&lt;target name="clean" depends="init"&gt;</div>
            <div>如果一个目标依赖与多个其他目标，需要将它们都写到依赖属性中，例如：</div>
            <div>depents=&#8221;compile,test&#8221;。在我们的构建中，archive依赖于init和compile，但是我们不需要去写，因为compile已经依赖于init了。即：Ant的依赖关系是传递的，但不是自反的。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/ca47e0d3fd364097922f0f809a976277.png" /></div>
            <div><br />
            如果在执行过程中两个目标共享同一个目标，则先导目标只被执行一次。</div>
            <div>可以通过指定目标来运行构建：</div>
            <div>例如执行完ant后，可以执行ant clean来清理构建：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/19f835f2ad08455fa56fb807fa63c69e.png" /></div>
            <div>&nbsp;</div>
            <div>ant等价于ant archive</div>
            <div>ant init</div>
            <div>ant clean</div>
            <div>ant compile</div>
            <div>ant archive</div>
            <div>ant clean archive</div>
            <div>&nbsp;</div>
            <div><strong>当构建完成一次以后，再次执行构建会发生什么呢？</strong></div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/904f2e88b87947d09c5195ed45dbb523.png" /></div>
            <div>&nbsp;</div>
            <div>第二次执行构建时只花了2s，相比第一次的4s。并且没有任何一个目标表示做了任何工作。</div>
            <div>原因如下：所有的任务都检查了它们的依赖关系：</div>
            <div>&lt;mkdir&gt;没有创建目录因为已经存在</div>
            <div>&lt;javac&gt;比较了源文件和类文件的时间戳</div>
            <div>&lt;jar&gt;比较了要被加入文件与已经存在文件的时间</div>
            <div>只有更新的时候才进行任务执行。</div>
            <div>&nbsp;</div>
            <div><strong>Ant</strong><strong>如何处理命令行上的多个目标？</strong></div>
            <div>执行ant compile archive会怎么样？</div>
            <div>先实验一下：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/b563e0adc32748f1a08f9ba0f2fb4667.png" /></div>
            <div>&nbsp;</div>
            <div>Ant依次执行每个目标和其依赖目标，即Ant的执行顺序是init compile init compile archive，虽然这样看起来增加了额外的工作，但是通过上面的执行过程就会发现，由于其依赖性检查的阻止，第二次的init和compile并未真正的执行，执行时间与直接执行archive的时间是一样的。</div>
            <div>&nbsp;</div>
            <div><strong>运行程序：</strong></div>
            <div>普通执行该类的方法是：</div>
            <div>java ?Ccp build/class com.neusoft.test.AntTest args1 args2</div>
            <div>而我们使用Ant的任务来执行它仅仅需要增加一个任务，好处在于：</div>
            <div style="text-indent: 21pt">让用于执行的目标依赖与编译的目标，确保运行最新版本</div>
            <div style="text-indent: 21pt">易于传递复杂参数</div>
            <div style="text-indent: 21pt">设置classpath更方便</div>
            <div style="text-indent: 21pt">在Ant自身的JVM中运行，载入更快</div>
            <div style="text-indent: 21pt"></div>
            <div>增加一个新的目标：</div>
            <div>&lt;target name="execute" depends="compile"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;java classname="com.neusoft.test.AntTest"</div>
            <div style="text-indent: 10.5pt">classpath="build/classes"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg value="a"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg value="b"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg file="."/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/java&gt;</div>
            <div>&lt;/target&gt;</div>
            <div>&nbsp;</div>
            <div>最后一个参数是file=&#8221;.&#8221;，表示传入的参数是一个目录，为文件绝对路径。</div>
            <div>运行该目标，输出如下：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/8c8d4063542a498a9ef5d88fd5867661.png" /></div>
            <div>&nbsp;</div>
            <div>Ant命令行选项：</div>
            <div><img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/a1affbf572d04d559f61b9df8722fd57.png" /></div>
            <div>&nbsp;</div>
            <div>请参阅相关手册进行查询相关选项的功能。</div>
            <div>&nbsp;</div>
            <div><strong>当有多个构建文件时，可以指定构建文件：</strong></div>
            <div>ant ?Cbuildfile build.xml compile</div>
            <div>来表示执行build.xml这个构建文件中的compile目标。</div>
            <div>&nbsp;</div>
            <div>控制提供的信息量：</div>
            <div>ant ?Cquiet:安静模式，不给出任何输出。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/e93c45b2b38f465783cc7dc668e69b4f.png" /></div>
            <div>&nbsp;</div>
            <div>ant ?Cemacs:简单模式，不显示任务名称。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/96fc30525694483ea06e5d2f3764bcae.png" /></div>
            <div>&nbsp;</div>
            <div>ant ?Cprojecthelp:获取项目信息。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/52050191b8974e1e955de48d68730446.png" /></div>
            <div>&nbsp;</div>
            <div><strong>最终的构建文件，添加了</strong><strong>description</strong><strong>属性。</strong></div>
            <div>&lt;?xml version="1.0" ?&gt;</div>
            <div>&lt;project name="secondbuild" <strong>default="execute" </strong>&gt;</div>
            <div style="text-indent: 10.5pt"><strong>&lt;description&gt;Compiles and runs a simple program&lt;/description&gt;</strong></div>
            <div style="text-indent: 10.5pt">&lt;target name="init"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;mkdir dir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="dist" /&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div style="text-indent: 10.5pt">&lt;target name="compile" depends="init"</div>
            <div style="text-indent: 10.5pt"><strong>description="Compiles the source code"</strong>&gt;</div>
            <div style="text-indent: 10.5pt">&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div style="text-indent: 10.5pt">&lt;target name="archive" depends="compile"</div>
            <div style="text-indent: 10.5pt"><strong>description="Creates the JAR file"</strong>&gt;</div>
            <div style="text-indent: 10.5pt">&lt;jar destfile="dist/project.jar" basedir="build/classes"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div>&lt;target name="clean" depends="init"</div>
            <div style="text-indent: 10.5pt"><strong>description="Removes the temporary directories used"</strong>&gt;</div>
            <div style="text-indent: 10.5pt">&lt;delete dir="build" /&gt;</div>
            <div style="text-indent: 21pt">&lt;delete dir="dist" /&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div style="text-indent: 10.5pt">&lt;target name="execute" depends="compile"</div>
            <div><strong>description="Runs the program"</strong>&gt;</div>
            <div style="text-indent: 10.5pt"><strong>&lt;echo level="warning" message="running" /&gt;</strong></div>
            <div style="text-indent: 10.5pt">&lt;java classname="org.example.antbook.lesson1.Main"</div>
            <div style="text-indent: 21pt">classpath="build/classes"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg value="a"/&gt;</div>
            <div style="text-indent: 21pt">&lt;arg value="b"/&gt;</div>
            <div>&lt;arg file="."/&gt;</div>
            <div>&lt;/java&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div>
            <p>&lt;/project&gt;</p>
            <table width="673" border="0">
                <tbody>
                    <tr>
                        <td>
                        <div align="center"><script type="text/javascript"><!-- google_ad_client="pub-1832179689702023" ;
/* 728x90, 创建于 08-3-11 */ google_ad_slot="5833511817" ; google_ad_width="728;
google_ad_height" = 90;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/lcs/aggbug/194534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-21 16:19 <a href="http://www.blogjava.net/lcs/archive/2008/04/21/194534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java加密解密</title><link>http://www.blogjava.net/lcs/archive/2008/04/14/192833.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 14 Apr 2008 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/14/192833.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/192833.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/14/192833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/192833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/192833.html</trackback:ping><description><![CDATA[代码：<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">import</span><span style="color: #000000">&nbsp;java.security.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.crypto.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_66_2690_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_2690_Open_Text.style.display='none'; Codehighlighter1_66_2690_Closed_Image.style.display='inline'; Codehighlighter1_66_2690_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_66_2690_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_2690_Closed_Text.style.display='none'; Codehighlighter1_66_2690_Open_Image.style.display='inline'; Codehighlighter1_66_2690_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Crypt&nbsp;</span><span id="Codehighlighter1_66_2690_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_66_2690_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;Algorithm</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DES</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">定义&nbsp;加密算法,可用&nbsp;DES,DESede,Blowfish</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;debug&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_185_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_253_Open_Text.style.display='none'; Codehighlighter1_185_253_Closed_Image.style.display='inline'; Codehighlighter1_185_253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_185_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_185_253_Closed_Text.style.display='none'; Codehighlighter1_185_253_Open_Image.style.display='inline'; Codehighlighter1_185_253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span id="Codehighlighter1_185_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_185_253_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Security.addProvider(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;com.sun.crypto.provider.SunJCE());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">生成密钥,&nbsp;注意此步骤时间比较长</span><span style="color: #008000"><br />
<img id="Codehighlighter1_325_549_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_549_Open_Text.style.display='none'; Codehighlighter1_325_549_Closed_Image.style.display='inline'; Codehighlighter1_325_549_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_325_549_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_325_549_Closed_Text.style.display='none'; Codehighlighter1_325_549_Open_Image.style.display='inline'; Codehighlighter1_325_549_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;getKey()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_325_549_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_325_549_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;KeyGenerator&nbsp;keygen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;KeyGenerator.getInstance(Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;keygen.generateKey();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">生成密钥:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(deskey.getEncoded()));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;deskey.getEncoded();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">加密</span><span style="color: #008000"><br />
<img id="Codehighlighter1_630_1067_Open_Image" onclick="this.style.display='none'; Codehighlighter1_630_1067_Open_Text.style.display='none'; Codehighlighter1_630_1067_Closed_Image.style.display='inline'; Codehighlighter1_630_1067_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_630_1067_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_630_1067_Closed_Text.style.display='none'; Codehighlighter1_630_1067_Open_Image.style.display='inline'; Codehighlighter1_630_1067_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;encode(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;input,</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;key)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_630_1067_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_630_1067_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;javax.crypto.spec.SecretKeySpec(key,Algorithm);<br />
<img id="Codehighlighter1_721_837_Open_Image" onclick="this.style.display='none'; Codehighlighter1_721_837_Open_Text.style.display='none'; Codehighlighter1_721_837_Closed_Image.style.display='inline'; Codehighlighter1_721_837_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_721_837_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_721_837_Closed_Text.style.display='none'; Codehighlighter1_721_837_Open_Image.style.display='inline'; Codehighlighter1_721_837_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)</span><span id="Codehighlighter1_721_837_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_721_837_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">加密前的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">加密前的字符串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Cipher.getInstance(Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;c1.init(Cipher.ENCRYPT_MODE,deskey);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;cipherByte</span><span style="color: #000000">=</span><span style="color: #000000">c1.doFinal(input);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">加密后的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(cipherByte));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cipherByte;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">解密</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1148_1587_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1148_1587_Open_Text.style.display='none'; Codehighlighter1_1148_1587_Closed_Image.style.display='inline'; Codehighlighter1_1148_1587_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1148_1587_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1148_1587_Closed_Text.style.display='none'; Codehighlighter1_1148_1587_Open_Image.style.display='inline'; Codehighlighter1_1148_1587_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;decode(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;input,</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;key)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_1148_1587_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1148_1587_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;javax.crypto.spec.SecretKeySpec(key,Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">解密前的信息:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Cipher.getInstance(Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;c1.init(Cipher.DECRYPT_MODE,deskey);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;clearByte</span><span style="color: #000000">=</span><span style="color: #000000">c1.doFinal(input);<br />
<img id="Codehighlighter1_1435_1561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1435_1561_Open_Text.style.display='none'; Codehighlighter1_1435_1561_Closed_Image.style.display='inline'; Codehighlighter1_1435_1561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1435_1561_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1435_1561_Closed_Text.style.display='none'; Codehighlighter1_1435_1561_Open_Image.style.display='inline'; Codehighlighter1_1435_1561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)</span><span id="Codehighlighter1_1435_1561_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1435_1561_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">解密后的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(clearByte));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">解密后的字符串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(clearByte)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;clearByte;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">md5()信息摘要,&nbsp;不可逆</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1666_2045_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1666_2045_Open_Text.style.display='none'; Codehighlighter1_1666_2045_Closed_Image.style.display='inline'; Codehighlighter1_1666_2045_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1666_2045_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1666_2045_Closed_Text.style.display='none'; Codehighlighter1_1666_2045_Open_Image.style.display='inline'; Codehighlighter1_1666_2045_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;md5(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;input)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_1666_2045_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1666_2045_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;java.security.MessageDigest&nbsp;alg</span><span style="color: #000000">=</span><span style="color: #000000">java.security.MessageDigest.getInstance(</span><span style="color: #000000">"</span><span style="color: #000000">MD5</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">or&nbsp;"SHA-1"</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1779_1895_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1779_1895_Open_Text.style.display='none'; Codehighlighter1_1779_1895_Closed_Image.style.display='inline'; Codehighlighter1_1779_1895_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1779_1895_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1779_1895_Closed_Text.style.display='none'; Codehighlighter1_1779_1895_Open_Image.style.display='inline'; Codehighlighter1_1779_1895_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)</span><span id="Codehighlighter1_1779_1895_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1779_1895_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">摘要前的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">摘要前的字符串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;alg.update(input);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;digest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;alg.digest();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">摘要后的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(digest));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;digest;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">字节码转换成16进制字符串</span><span style="color: #008000"><br />
<img id="Codehighlighter1_2108_2439_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2108_2439_Open_Text.style.display='none'; Codehighlighter1_2108_2439_Closed_Image.style.display='inline'; Codehighlighter1_2108_2439_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2108_2439_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2108_2439_Closed_Text.style.display='none'; Codehighlighter1_2108_2439_Open_Image.style.display='inline'; Codehighlighter1_2108_2439_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;byte2hex(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;b)&nbsp;</span><span id="Codehighlighter1_2108_2439_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2108_2439_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;stmp</span><span style="color: #000000">=</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_2180_2368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2180_2368_Open_Text.style.display='none'; Codehighlighter1_2180_2368_Closed_Image.style.display='inline'; Codehighlighter1_2180_2368_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2180_2368_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2180_2368_Closed_Text.style.display='none'; Codehighlighter1_2180_2368_Open_Image.style.display='inline'; Codehighlighter1_2180_2368_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;n</span><span style="color: #000000">&lt;</span><span style="color: #000000">b.length;n</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_2180_2368_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2180_2368_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmp</span><span style="color: #000000">=</span><span style="color: #000000">(java.lang.Integer.toHexString(b[n]&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0XFF</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(stmp.length()</span><span style="color: #000000">==</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">hs</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">stmp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">hs</span><span style="color: #000000">+</span><span style="color: #000000">stmp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n</span><span style="color: #000000">&lt;</span><span style="color: #000000">b.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">hs</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("hs="+hs);</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;hs.toUpperCase();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_2499_2688_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2499_2688_Open_Text.style.display='none'; Codehighlighter1_2499_2688_Closed_Image.style.display='inline'; Codehighlighter1_2499_2688_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2499_2688_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2499_2688_Closed_Text.style.display='none'; Codehighlighter1_2499_2688_Open_Image.style.display='inline'; Codehighlighter1_2499_2688_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_2499_2688_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2499_2688_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;key&nbsp;=&nbsp;getKey();</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">好好学习</span><span style="color: #000000">"</span><span style="color: #000000">.getBytes();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;decode(encode(</span><span style="color: #000000">"</span><span style="color: #000000">测试加密</span><span style="color: #000000">"</span><span style="color: #000000">.getBytes(),key),key);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;md5("测试加密".getBytes());</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;md5(</span><span style="color: #000000">"</span><span style="color: #000000">A</span><span style="color: #000000">"</span><span style="color: #000000">.getBytes());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/192833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-14 16:14 <a href="http://www.blogjava.net/lcs/archive/2008/04/14/192833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[JS]Cookie精通之路 </title><link>http://www.blogjava.net/lcs/archive/2008/04/10/191866.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 10 Apr 2008 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/10/191866.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/191866.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/10/191866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/191866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/191866.html</trackback:ping><description><![CDATA[<table width="100%" border="0">
    <tbody>
        <tr>
            <td class="title" align="center">[JS]Cookie精通之路 </td>
        </tr>
        <tr>
            <td align="center">www.fh888.com 2006-9-17 16:25:00</td>
        </tr>
        <tr>
            <td align="center">发布：Cary<br />
            媒体：www.JustDN.org&nbsp;&nbsp;作者：Jim Park</td>
        </tr>
        <tr>
            <td align="left"><span class="mainfont" id="zoom">&lt;!—Cookies，有些人喜欢它们，有些人憎恨它们。但是，很少有人真正知道如何使用它们。现在你可以成为少数人中的成员－可以自傲的Cookie 大师。--&gt;<br />
            <br />
            如果你象作者一样记性不好，那么你可能根本记不住人们的名字。我遇到人时，多半只是点点头，问句&#8220;吃了嘛！&#8221;，而且期望问候到此为止。如果还需要表示些什么，那么我就得求助于一些狡猾的技巧，好让我能想对方是谁。比如胡扯起一些和对方有关的人，不管他们之间关系多远，只要能避免不记得对方名字的尴尬就好： &#8220;你隔壁邻居的侄子的可爱小狗迈菲斯特怎么样？&#8221;通过这个方法，我希望能让对方感到，我确实很重视他（她），甚至还记得这些琐事，虽然实际上连名字都忘记了。但是，不是我不重视，而是我的记忆力实在是糟糕，而且要记住的名字又实在太多。如果我能给每个人设置cookies，那么我就不会再犯这种记忆力问题了。<br />
            <br />
            在这篇文章里，我们要学习：<br />
            <br />
            1. 什么是 Cookies?<br />
            2. Cookie 的构成<br />
            3. 操纵 Cookies<br />
            4. Cookie 怪兽<br />
            <br />
            什么是Cookies?<br />
            <br />
            你会问，什么是cookies呢? cookie 是浏览器保存在用户计算机上的少量数据。它与特定的WEB页或WEB站点关联起来，自动地在WEB浏览器和WEB服务器之间传递。<br />
            <br />
            比如，如果你运行的是Windows操作系统，使用Internet Explorer上网，那么你会发现在你的&#8220;Windows&#8221;目录下面有一个子目录，叫做&#8220;Temporary Internet Files&#8221;。如果你有空看看这个目录，就会发现里面有一些文件，文件名称看起来就象电子邮件地址。比如在我机器上的这个目录里，就有 &#8220;jim@support.microsoft.com&#8221;这样的文件。这是一个cookie 文件，这个文件从哪来呢？猜一猜，它来自微软的支持站点。顺便说一句，这不是我的电子邮件地址，特此澄清。<br />
            <br />
            对于管理细小的、不重要的、不想保存在中央数据库里的细节信息，Cookies 是个很不错的方案。（这不是说大家的名字不重要。）比如，目前网站上不断增长的自定义服务，可以为每个用户定制他们要看的内容。如果你设计的就是这样一个站点，那么你怎么来管理这样的信息：一个用户喜欢绿色的菜单条，而另一个喜欢红色的。确实是个累人的问题。不过，这样的信息，可以很安全地记录到cookie，并保存在用户的计算机上，而你自己的数据库空间可以留给更长久更有意义的数据。<br />
            <br />
            FYI: Cookies 对于安全用途，通常很有用。我不想在此就这一问题过于深入，只是提供一个示例，可以看到如何使用在一段时间之后过期的cookies来保证站点安全：<br />
            <br />
            1. 使用用户名和口令，通过 SSL 登录。<br />
            2. 在服务器的数据库里检查用户名和口令。如果登录成功，建立一个当前时间标签的消息摘要 (比如 MD5) ，并把它保存在cookie和服务器数据库里。把用户的登录时间保存在服务器数据库里面的用户记录里。<br />
            3. 在进行每个安全事务时（用户处于登录状态的任何事务），把cookie的消息摘要和保存在服务器数据库里的摘要进行比较，如果比较失败，就把用户引导到登录界面。<br />
            4. 如果第3步检查通过，那么检查当前时间和登录时间之音经过的时间是否超过允许的时间长度。如果用户已经超时，那么就把用户引到登录界面。<br />
            5. 如果第3步和第4步都通过了，那么把登录时间重新设置成当前时间，允许事务发生。那些需要你登录的安全站点，可能多数使用的都是和这里介绍的类似的方法。<br />
            Cookie的构成<br />
            <br />
            Cookies最初设计时，是为了CGI编程。但是，我们也可以使用Javascript脚本来操纵cookies。在本文里，我们将演示如何使用Javascript脚本来操纵cookies。(如果有需求，我可能会在以后的文章里介绍如何使用Perl进行cookie管理。但是如果实在等不得，那么我现在就教你一手：仔细看看CGI.pm。在这个CGI包里有一个cookie()函数，可以用它建立cookie。但是，还是让我们先来介绍cookies的本质。<br />
            <br />
            在Javascript脚本里，一个cookie 实际就是一个字符串属性。当你读取cookie的值时，就得到一个字符串，里面当前WEB页使用的所有cookies的名称和值。每个cookie除了name名称和value值这两个属性以外，还有四个属性。这些属性是： expires过期时间、 path路径、 domain域、以及 secure安全。<br />
            <br />
            Expires &#8211; 过期时间。指定cookie的生命期。具体是值是过期日期。如果想让cookie的存在期限超过当前浏览器会话时间，就必须使用这个属性。当过了到期日期时，浏览器就可以删除cookie文件，没有任何影响。<br />
            <br />
            Path &#8211; 路径。指定与cookie关联的WEB页。值可以是一个目录，或者是一个路径。如果http://www.zdnet.com/devhead/index.html 建立了一个cookie，那么在http://www.zdnet.com/devhead/目录里的所有页面，以及该目录下面任何子目录里的页面都可以访问这个cookie。这就是说，在http://www.zdnet.com/devhead/stories/articles 里的任何页面都可以访问http://www.zdnet.com/devhead/index.html建立的cookie。但是，如果http://www.zdnet.com/zdnn/ 需要访问http://www.zdnet.com/devhead/index.html设置的cookes，该怎么办？这时，我们要把cookies 的path属性设置成&#8220;/&#8221;。在指定路径的时候，凡是来自同一服务器，URL里有相同路径的所有WEB页面都可以共享cookies。现在看另一个例子：如果想让 http://www.zdnet.com/devhead/filters/ 和http://www.zdnet.com/devhead/stories/共享cookies，就要把path设成&#8220;/devhead&#8221;。<br />
            <br />
            Domain &#8211; 域。指定关联的WEB服务器或域。值是域名，比如zdnet.com。这是对path路径属性的一个延伸。如果我们想让 catalog.mycompany.com 能够访问shoppingcart.mycompany.com设置的cookies，该怎么办? 我们可以把domain属性设置成&#8220;mycompany.com&#8221;，并把path属性设置成&#8220;/&#8221;。FYI：不能把cookies域属性设置成与设置它的服务器的所在域不同的值。<br />
            <br />
            Secure &#8211; 安全。指定cookie的值通过网络如何在用户和WEB服务器之间传递。这个属性的值或者是&#8220;secure&#8221;，或者为空。缺省情况下，该属性为空，也就是使用不安全的HTTP连接传递数据。如果一个 cookie 标记为secure，那么，它与WEB服务器之间就通过HTTPS或者其它安全协议传递数据。不过，设置了secure属性不代表其他人不能看到你机器本地保存的cookie。换句话说，把cookie设置为secure，只保证cookie与WEB服务器之间的数据传输过程加密，而保存在本地的cookie文件并不加密。如果想让本地cookie也加密，得自己加密数据。<br />
            <br />
            <br />
            <br />
            <br />
            操纵Cookies<br />
            <br />
            请记住，cookie就是文档的一个字符串属性。要保存cookie，只要建立一个字符串，格式是name=&lt;value&gt;（名称＝值），然后把文档的 document.cookie 设置成与它相等即可。比如，假设想保存表单接收到的用户名，那么代码看起来就象这样：<br />
            <br />
            document.cookie = "username" + escape(form.username.value);<br />
            <br />
            在这里，使用 escape() 函数非常重要，因为cookie值里可能包含分号、逗号或者空格。这就是说，在读取cookie值时，必须使用对应的unescape()函数给值解码。<br />
            <br />
            我们当然还得介绍cookie的四个属性。这些属性用下面的格式加到字符串值后面：<br />
            <br />
            name=&lt;value&gt;[; expires=&lt;date&gt;][; domain=&lt;domain&gt;][; path=&lt;path&gt;][; secure]<br />
            <br />
            名称=&lt;值&gt;[; expires=&lt;日期&gt;][; domain=&lt;域&gt;][; path=&lt;路径&gt;][; 安全]<br />
            <br />
            &lt;value&gt;, &lt;date&gt;, &lt;domain&gt; 和 &lt;path&gt; 应当用对应的值替换。&lt;date&gt; 应当使用GMT格式，可以使用Javascript脚本语言的日期类Date的.toGMTString() 方法得到这一GMT格式的日期值。方括号代表这项是可选的。比如在 [; secure]两边的方括号代表要想把cookie设置成安全的，就需要把"; secure" 加到cookie字符串值的后面。如果"; secure" 没有加到cookie字符串后面，那么这个cookie就是不安全的。不要把尖括号&lt;&gt; 和方括号[] 加到cookie里（除非它们是某些值的内容）。设置属性时，不限属性，可以用任何顺序设置。<br />
            <br />
            下面是一个例子，在这个例子里，cookie "username" 被设置成在15分钟之后过期，可以被服务器上的所有目录访问，可以被"mydomain.com"域里的所有服务器访问，安全状态为安全。<br />
            <br />
            // Date() 的构造器设置以毫秒为单位<br />
            // .getTime() 方法返回时间，单位为毫秒<br />
            // 所以要设置15分钟到期，要用60000毫秒乘15分钟<br />
            var expiration = new Date((new Date()).getTime() + 15 * 60000);<br />
            document.cookie = "username=" + escape(form.username.value)+ "; expires ="<br />
            + expiration.toGMTString() + "; path=" + "/" + "; _<br />
            domain=" + "mydomain.com" + "; secure";<br />
            <br />
            读取cookies值有点象个小把戏，因为你一次就得到了属于当前文档的所有cookies。<br />
            <br />
            // 下面这个语句读取了属于当前文档的所有cookies<br />
            var allcookies = document.cookie;<br />
            <br />
            现在，我们得解析allcookies变量里的不同cookies，找到感兴趣的指定cookie。这个工作很简单，因为我们可以利用Javascript语言提供的扩展字符串支持。<br />
            <br />
            如果我们对前面分配的cookie "username" 感兴趣，可以用下面的脚本来读取它的值。<br />
            <br />
            // 我们定义一个函数，用来读取特定的cookie值。<br />
            function getCookie(cookie_name)<br />
            ｛<br />
            var allcookies = document.cookie;<br />
            var cookie_pos = allcookies.indexOf(cookie_name);<br />
            <br />
            // 如果找到了索引，就代表cookie存在，<br />
            // 反之，就说明不存在。<br />
            if (cookie_pos != -1)<br />
            ｛<br />
            // 把cookie_pos放在值的开始，只要给值加1即可。<br />
            cookie_pos += cookie_name.length + 1;<br />
            var cookie_end = allcookies.indexOf(";", cookie_pos);<br />
            <br />
            if (cookie_end == -1)<br />
            ｛<br />
            cookie_end = allcookies.length;<br />
            ｝<br />
            <br />
            var value = unescape(allcookies.substring(cookie_pos, cookie_end));<br />
            ｝<br />
            <br />
            return value;<br />
            ｝<br />
            <br />
            // 调用函数<br />
            var cookie_val = getCookie("username");<br />
            <br />
            上面例程里的 cookie_val 变量可以用来生成动态内容，或者发送给服务器端CGI脚本进行处理。现在你知道了使用Javascript脚本操纵cookies的基本方法。但是，如果你跟我一样，那么我们要做的第一件事，就是建立一些接口函数，把cookies处理上的麻烦隐藏起来。不过，在你开始编程之前，稍候片刻。这些工作，早就有人替你做好了。你要做的，只是到哪去找这些接口函数而已。<br />
            <br />
            比如，在David Flangan的Javascript: The Definitive Guide 3rd Ed.这本书里，可以找到很好的cookie应用类。你也可以在Oreilly的WEB站点上找到这本书里的例子。本文最后的链接列表里，有一些访问这些cookie示例的直接链接。<br />
            <br />
            <br />
            <br />
            Cookies 怪兽<br />
            <br />
            因为某些原因Cookies 的名声很不好。许多人利用cookies做一些卑鄙的事情，比如流量分析、点击跟踪。Cookies 也不是非常安全，特别是没有secure属性的cookies。不过，即使你用了安全的cookies，如果你和别人共用计算机，比如在网吧，那么别人就可以窥探计算机硬盘上未加密保存的cookie文件，也就有可能窃取你的敏感信息。所以，如果你是一个WEB开发人员，那么你要认真考虑这些问题。不要滥用cookies。不要把用户可能认为是敏感的数据保存在cookies里。如果把用户的社会保险号、信用卡号等保存在cookie里，等于把这些敏感信息放在窗户纸下，无异于把用户投到极大危险之中。一个好的原则是，如果你不想陌生人了解你的这些信息，那就不要把它们保存在cookies里。<br />
            <br />
            另外，cookies还有一些实际的限制。Cookies保留在计算机上，不跟着用户走。如果用户想换计算机，那么新计算机无法得到原来的cookie。甚至用户在同一台计算机上使用不同浏览器，也得不到原来的cookie：Netscape 不能读取Internet Explorer 的cookies。<br />
            <br />
            还有，用户也不愿意接受cookies。所以不要以为所有的浏览器都能接受你发出的cookies。如果浏览器不接受cookies，你要保证自己的WEB站点不致因此而崩溃或中断。<br />
            <br />
            另外WEB 浏览器能保留的cookies不一定能超过300个。也没有标准规定浏览器什么时候、怎么样作废cookies。所以达到限制时，浏览器能够有效地随机删除cookies。浏览器保留的来自一个WEB服务器上的cookies，不超过20个，每个cookie的数据（包括名称和值），不超过4K字节。(不过，本文里的cookie尺寸没问题，它只占了12 K字节，保存在3个3 cookies里。)<br />
            <br />
            简而言之，注意保持cookie简单。不要依赖cookies的存在，不要在每个cookie里保存太多信息。不要保存太多的cookes。但是，抛除这些限制，在技巧高超的WEB管理员手里，cookie的概念是一个有用的工具。<br />
            <br />
            外部链接<br />
            每个 Javascript 程序员都应当有一份Javascript： David Flanagan 的The Definitive Guide。 这本书里找到cookie 类例程可以帮助你把不止一个变量编码到单一的cookie，克服掉&#8220;每个WEB服务器20 个cookies的限制&#8221;。请点击这个链接下载该例程，ftp://ftp.oreilly.com/pub/examples/nutshell/javascript/。<br />
            </span></td>
        </tr>
    </tbody>
</table>
转自：<font style="background-color: #dee0fe"><a href="http://www.fh888.com/showfile.html?projectid=5&amp;username=cary&amp;articleid=8C17CE3AA29B4479805CB416B9ADF89F">http://www.fh888.com/showfile.html?projectid=5&amp;username=cary&amp;articleid=8C17CE3AA29B4479805CB416B9ADF89F</a></font>
<img src ="http://www.blogjava.net/lcs/aggbug/191866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-10 15:03 <a href="http://www.blogjava.net/lcs/archive/2008/04/10/191866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中&lt; E &gt;&lt; T &gt;&lt; ? &gt;&lt; A &gt;&lt; U &gt;这都是什么意思?</title><link>http://www.blogjava.net/lcs/archive/2008/04/08/191523.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 08 Apr 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/08/191523.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/191523.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/08/191523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/191523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/191523.html</trackback:ping><description><![CDATA[<p><font style="background-color: #dee0fe">从JDK5.0开始出现的泛型（Generics）功能。泛型提供编译时期的检查，不会将对象置于某个容器而失去其类型。 </font></p>
<p><font style="background-color: #dee0fe">http://www.onjava.com/pub/a/onjava/excerpt/javaian5_chap04/index.html<br />
<br />
这个是JDK&nbsp;&nbsp; 1.5&nbsp;&nbsp; 的新特性。<br />
举个例子。&nbsp;&nbsp;<br />
一个列表中加入3个数字，然后从列表中取出作合计的操作。 </font></p>
<p><font style="background-color: #dee0fe">JDK&nbsp;&nbsp; 1.4&nbsp;&nbsp; 的时候 <br />
List&nbsp;&nbsp; testList&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; ArrayList(); <br />
testList.add(new&nbsp;&nbsp; Integer(100)); <br />
testList.add(new&nbsp;&nbsp; Integer(200)); <br />
testList.add(new&nbsp;&nbsp; Integer(300)); <br />
int&nbsp;&nbsp; result&nbsp;&nbsp; =&nbsp;&nbsp; 0; <br />
for(int&nbsp;&nbsp; i&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; i&nbsp;&nbsp; &lt;&nbsp;&nbsp; testList.size();&nbsp;&nbsp; i&nbsp;&nbsp; ++)&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 这里从列表中取数据时，需要强制转换。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result&nbsp;&nbsp; +=&nbsp;&nbsp; (Integer)testList.get(i).intValue(); <br />
} <br />
System.out.println(result); </font></p>
<p><font style="background-color: #dee0fe"><br />
JDK&nbsp;&nbsp; 1.5&nbsp;&nbsp; 的时候 <br />
List &lt;Integer&gt;&nbsp;&nbsp; testList&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; ArrayList &lt;Integer&gt; (); <br />
//&nbsp;&nbsp; 注意，JDK1.5的&nbsp;&nbsp; int&nbsp;&nbsp; 的&nbsp;&nbsp; 100，能够自动的转换成&nbsp;&nbsp; Integer&nbsp;&nbsp; 类型。不强制要求&nbsp;&nbsp; new&nbsp;&nbsp; Integer(100) <br />
testList.add(100); <br />
testList.add(200); <br />
testList.add(300); <br />
int&nbsp;&nbsp; result&nbsp;&nbsp; =&nbsp;&nbsp; 0; <br />
for(int&nbsp;&nbsp; i&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; i&nbsp;&nbsp; &lt;&nbsp;&nbsp; testList.size();&nbsp;&nbsp; i&nbsp;&nbsp; ++)&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 这里从列表中取数据时，不需要强制转换。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result&nbsp;&nbsp; +=&nbsp;&nbsp; testList.get(i).intValue(); <br />
} <br />
System.out.println(result); </font></p>
 <img src ="http://www.blogjava.net/lcs/aggbug/191523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-08 16:07 <a href="http://www.blogjava.net/lcs/archive/2008/04/08/191523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit最佳实践</title><link>http://www.blogjava.net/lcs/archive/2008/03/31/189806.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 31 Mar 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/31/189806.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/189806.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/31/189806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/189806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/189806.html</trackback:ping><description><![CDATA[<p><font style="background-color: #dee0fe">JUnit是什么？ </font></p>
<p><font style="background-color: #dee0fe">cherami</font></p>
<font style="background-color: #dee0fe">
<p><br />
JUnit是一个开发源代码的Java测试框架，用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例（用于java语言）。它包括以下特性：<br />
1、用于测试期望结果的断言（Assertion）<br />
2、用于共享共同测试数据的测试工具<br />
3、用于方便的组织和运行测试的测试套件<br />
4、图形和文本的测试运行器</p>
<p>JUnit最初是由Erich Gamma（GoF之一）和Kent Beck（xp和refactor的先驱之一）编写的. </p>
<p>需要说明的是junit一般是用来进行单元测试的，因此需要了解被测试代码的内部结构（即所谓的白盒测试），另外junit是在xp编程和重构（refactor）中被极力推荐使用的工具，因为在实现自动单元测试的情况下可以大大的提高开发的效率，但是实际上编写测试代码也是需要耗费很多的时间和精力的，那么使用这个东东好处到底在哪里呢？笔者认为是这样的：<br />
1、对于xp编程而言，要求在编写代码之前先写测试，这样可以强制你在写代码之前好好的思考代码（方法）的功能和逻辑，否则编写的代码很不稳定，那么你需要同时维护测试代码和实际代码，这个工作量就会大大增加。因此在xp编程中，基本过程是这样的：构思－》编写测试代码－》编写代码－》测试，而且编写测试和编写代码都是增量式的，写一点测一点，在编写以后的代码中如果发现问题可以较块的追踪到问题的原因，减小回归错误的纠错难度<br />
2、对于重构而言，其好处和xp编程中是类似的，因为重构也是要求改一点测一点，减少回归错误造成的时间消耗。<br />
3、对于非以上两种情况，我们在开发的时候使用junit写一些适当的测试也是有必要的，因为一般我们也是需要编写测试的代码的，可能原来不是使用的junit，如果使用junit，而且针对接口（方法）编写测试代码会减少以后的维护工作，例如以后对方法内部的修改（这个就是相当于重构的工作了）。另外就是因为junit有断言功能，如果测试结果不通过会告诉我们那个测试不通过，为什么，而如果是想以前的一般做法是写一些测试代码看其输出结果，然后再由自己来判断结果使用正确，使用junit的好处就是这个结果是否正确的判断是它来完成的，我们只需要看看它告诉我们结果是否正确就可以了，在一般情况下会大大提高效率。</p>
<p><br />
JUnit入门 </p>
<p>cherami 整理 </p>
<p><br />
安装JUnit</p>
<p>安装很简单，先到以下地址下载一个最新的zip包：<br />
http://download.sourceforge.net/junit/<br />
下载完以后解压缩到你喜欢的目录下，假设是JUNIT_HOME，然后将JUNIT_HOME下的junit.jar包加到你的系统的CLASSPATH环境变量中，对于IDE环境，对于需要用到的junit的项目增加到lib中，其设置不同的IDE有不同的设置，这里不多讲。</p>
<p><br />
如何使用JUnit写测试？</p>
<p>最简单的范例如下：<br />
1、创建一个TestCase的子类: <br />
package junitfaq;</p>
<p>import java.util.*;<br />
import junit.framework.*;</p>
<p>public class SimpleTest extends TestCase {</p>
<p>public SimpleTest(String name) {<br />
super(name);<br />
}</p>
<p><br />
2、写一个测试方法断言期望的结果：<br />
public void testEmptyCollection() {<br />
Collection collection = new ArrayList();<br />
assertTrue(collection.isEmpty());<br />
}<br />
注意：JUnit推荐的做法是以test作为待测试的方法的开头，这样这些方法可以被自动找到并被测试。</p>
<p>3、写一个suite()方法，它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件：<br />
public static Test suite() {<br />
return new TestSuite(SimpleTest.class);<br />
}</p>
<p>4、写一个main()方法以文本运行器的方式方便的运行测试：<br />
public static void main(String args[]) {<br />
junit.textui.TestRunner.run(suite());<br />
}<br />
}</p>
<p>5、运行测试：<br />
以文本方式运行：<br />
java junitfaq.SimpleTest </p>
<p>通过的测试结果是：</p>
<p>.<br />
Time: 0</p>
<p>OK (1 tests)</p>
<p>Time上的小点表示测试个数，如果测试通过则显示OK。否则在小点的后边标上F，表示该测试失败。<br />
每次的测试结果都应该是OK的，这样才能说明测试是成功的，如果不成功就要马上根据提示信息进行修正了。<br />
如果JUnit报告了测试没有成功，它会区分失败（failures）和错误（errors）。失败是你的代码中的assert方法失败引起的；而错误则是代码异常引起的，例如ArrayIndexOutOfBoundsException。 </p>
<p><br />
以图形方式运行：</p>
<p>java junit.swingui.TestRunner junitfaq.SimpleTest </p>
<p>通过的测试结果在图形界面的绿色条部分。</p>
<p>&nbsp;</p>
<p>以上是最简单的测试样例，在实际的测试中我们测试某个类的功能是常常需要执行一些共同的操作，完成以后需要销毁所占用的资源（例如网络连接、数据库连接，关闭打开的文件等），TestCase类给我们提供了setUp方法和tearDown方法，setUp方法的内容在测试你编写的TestCase子类的每个testXxxx方法之前都会运行，而tearDown方法的内容在每个testXxxx方法结束以后都会执行。这个既共享了初始化代码，又消除了各个测试代码之间可能产生的相互影响。 </p>
<p>JUnit最佳实践 </p>
<p>&nbsp;</p>
<p>Martin Fowler说过：&#8220;当你试图打印输出一些信息或调试一个表达式时，写一些测试代码来替代那些传统的方法。&#8221;一开始，你会发现你总是要创建一些新的Fixture，而且测试似乎使你的编程速度慢了下来。然而不久之后，你会发现你重复使用相同的Fixture，而且新的测试通常只涉及添加一个新的测试方法。&nbsp; </p>
<p>你可能会写许多测试代码，但你很快就会发现你设想出的测试只有一小部分是真正有用的。你所需要的测试是那些会失败的测试，即那些你认为不会失败的测试，或你认为应该失败却成功的测试。 </p>
<p>我们前面提到过测试是一个不会中断的过程。一旦你有了一个测试，你就要一直确保其正常工作，以检验你所加入的新的工作代码。不要每隔几天或最后才运行测试，每天你都应该运行一下测试代码。这种投资很小，但可以确保你得到可以信赖的工作代码。你的返工率降低了，你会有更多的时间编写工作代码。 </p>
<p>不要认为压力大，就不写测试代码。相反编写测试代码会使你的压力逐渐减轻，应为通过编写测试代码，你对类的行为有了确切的认识。你会更快地编写出有效率地工作代码。</p>
<p>下面是一些具体的编写测试代码的技巧或较好的实践方法： </p>
<p>1. 不要用TestCase的构造函数初始化Fixture，而要用setUp()和tearDown()方法。 </p>
<p>2. 不要依赖或假定测试运行的顺序，因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。 </p>
<p>3. 避免编写有副作用的TestCase。例如：如果随后的测试依赖于某些特定的交易数据，就不要提交交易数据。简单的会滚就可以了。 </p>
<p>4. 当继承一个测试类时，记得调用父类的setUp()和tearDown()方法。 </p>
<p>5. 将测试代码和工作代码放在一起，一边同步编译和更新。（使用Ant中有支持junit的task.） </p>
<p>6. 测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。 </p>
<p>7. 确保测试与时间无关，不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。 </p>
<p>8. 如果你编写的软件面向国际市场，编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。 </p>
<p>9. 尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法，可以使代码更为简洁。<br />
&nbsp;<br />
10.测试要尽可能地小，执行速度快。</p>
<p><br />
JUnit和ant结合 </p>
<p>cherami 转贴</p>
<p><br />
ant 提供了两个 target ： junit 和 junitreport <br />
运行所有 测试用例 ，并生成 html 格式的报表 <br />
具体操作如下： </p>
<p>1.将 junit.jar 放在 ANT_HOME\lib 目录下 <br />
2.修改 build.xml ，加入如下 内容： </p>
<p><br />
&lt;property name="report" value="report" /&gt; &lt;target name="junitreport" depends="clean, compile"&gt; &lt;junit printsummary="on" fork="true" haltonfailure="false" failureproperty="tests.failed" showoutput="true"&gt; &lt;classpath refid="myclasspath"/&gt; &lt;formatter type="xml"/&gt; &lt;batchtest todir="${report}"&gt; &lt;fileset dir="${build}"&gt; &lt;include name="**/*Test.*"/&gt; &lt;/fileset&gt; &lt;/batchtest&gt; &lt;/junit&gt; &lt;junitreport todir="${report}"&gt; &lt;fileset dir="${report}"&gt; &lt;include name="TEST-*.xml"/&gt; &lt;/fileset&gt; &lt;report format="frames" todir="${report}"/&gt; &lt;/junitreport&gt; &lt;fail if="tests.failed"&gt; --------------------------------------------------------- One or more tests failed, check the report for detail... --------------------------------------------------------- &lt;/fail&gt; &lt;/target&gt; </p>
<p>运行 这个 target ，ant 会运行每个 TestCase <br />
在 report 目录下就有了 很多 TEST*.xml 和 一些网页 <br />
打开 report 目录下的 index.html 就可以看到很直观的测试运行报告，一目了然。 </p>
<p><br />
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考：http://www.zxbc.cn/html/rjgc/1414044315681.htm</font></p>
<img src ="http://www.blogjava.net/lcs/aggbug/189806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-31 16:38 <a href="http://www.blogjava.net/lcs/archive/2008/03/31/189806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>