﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-内蒙古java团队-文章分类-J2EE技术专区</title><link>http://www.blogjava.net/gdws/category/16069.html</link><description>j2se,j2ee开发组</description><language>zh-cn</language><lastBuildDate>Wed, 24 Nov 2010 16:50:25 GMT</lastBuildDate><pubDate>Wed, 24 Nov 2010 16:50:25 GMT</pubDate><ttl>60</ttl><item><title>OpenLayers Map理解</title><link>http://www.blogjava.net/gdws/articles/338888.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 24 Nov 2010 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/338888.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/338888.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/338888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/338888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/338888.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1，视口坐标的原点在左上角，水平向右为x轴正向，垂直向下为y 轴正向；2，地图坐标原点为初始图层的中心点，水平向右为x轴正向，垂直向上为y轴正向；3，视口中心点永远与地图中心点重合，不一定与瓦片中心点重合；4，拖动图层的逻辑描述：地图是不动的，视口移动从而展示不同的地图区域；  Resolution：解析度 = 地图尺寸/视口尺寸好比摄像机，镜头拉得越近解析度越小，地图看得越清晰。  map.ca...&nbsp;&nbsp;<a href='http://www.blogjava.net/gdws/articles/338888.html'>阅读全文</a><img src ="http://www.blogjava.net/gdws/aggbug/338888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-11-24 10:03 <a href="http://www.blogjava.net/gdws/articles/338888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fusion 是如何启动的</title><link>http://www.blogjava.net/gdws/articles/337863.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 11 Nov 2010 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/337863.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/337863.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/337863.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/337863.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/337863.html</trackback:ping><description><![CDATA[
		<p>网页模板文件在加载完毕时，通过调用“ Fusion.initialize(); ”来启动 Fusion 框架的初始化过程。但是，在执行这行代码执行之前， Fusion 就已经执行了一些启动代码（ bootstrap ）。这些代码主要涉及确定浏览器语言、加载其余 Fusion 脚本代码和加载商业地图脚本等等。这些工作的代码位于“ &lt;FusionRoot&gt;\lib\fusion.js ”文件中，从 1064 行至文件尾。当网页加载到 fusion.js 时候，这些代码就会被执行。 </p>
		<p>让我们先看看加载其余 Fusion 脚本代码做了什么。前文我们提到了，三种加载 Fusion 框架方式是等效的。其中独立压缩方式和独立文件方式是等效的是很容易理解的，这是因为独立压缩方式仅仅是去掉了无用的空格、换行符号和注释。那么，分散加载方式加载的 fusion.js 仅仅是独立文件方式加载的 fusionSF.js 里面代码的一部分，它们两者之间又是如何保证等效的呢？原来，当 Fusion 中有一个要加载脚本文件的列表（ fusion.js 的 1080-1091 行），这个列表的文件和 fusion.js 放在一起，跟 fusionSF.js 文件是完全等效的。在启动代码中， Fusion 如果发现当前采用的是分散加载方式（ Fusion._singleFile 值为 false ），那么就会通过向网页中添加 script 标签的形式来增加新文件。 </p>
		<p>除了加载其余 Fusion 脚本代码之外，启动代码所做的一个不得不提的工作就是加载商业地图脚本。这个是 2.1.0 新增的一个功能。如果用户需要在地图中加入雅虎、谷歌或者必应地图，那么在启动代码中， Fusion 会检查网页布局文件中是否有 GoogleScript 、 YahooScript 或者 VitualEarthScript 标签，并访问标签里面包含的脚本地址来加载对应的脚本。 </p>
		<p>当浏览器调用 Fusion.initialize() 脚本的时候， Fusion 便开始了加载的过程。 Fusion 加载的过程分为两步。第一步是将服务器端的网页布局文件变成一个浏览器中包含的信息对象；第二步是根据这个信息对象逐步初始化各个部分。 </p>
		<p>下面，我们将分别介绍这两个步骤。 </p>
		<p>
				<font color="#ff0000" size="4">从服务器到浏览器——加载应用程序定义 <br /></font>在 Fusion 框架中，网页布局文件又称为应用程序定义（ ApplicationDefinition ）文件。在本章其余部分，这两个词可能会交替使用，但两者意思完全相同。 </p>
		<p>Fusion 是通过地图代理（ MapAgent ）来获取应用程序定义的。但在此之前， Fusion 先需要知道地图代理的位置。虽然在默认状态下， FusionRoot 是直接放置于“ &lt;WebRoot&gt;\fusion ”文件夹中。但 Fusion 本身相对独立一些，支持将 Fusion 放置在其他文件夹中。这时就需要有一个地方能够告诉 Fusion 地图代理的位置，这个地方就位于 Fusion 的 configuration 属性中， Fusion 通过 Fusion.configuration.mapguide.webTierUrl 属性值找到 MapGuide 的位置（该属性值的形式应当类似“ <a href="http://localhost/mapguide">http://localhost/mapguide</a> ”）。如果您使用的是独立文件加载方式或独立压缩加载方式的话，这个属性是已经被设置好了的 (fusionSF.js 的 63201-62346 行 ) 。而对于分散加载方式，这个属性在初始状态下是为定义的，这时 Fusion 会去访问并加载服务器的“ &lt;FusionRoot&gt;\config.json ”做为 Fusion.configuration 的值。也就是说，如果您采用的是分散加载的方式，而且 Fusion 并没有采用默认的文件夹部署，那么，您可以修改这个文件来指示 Fusion 去哪儿寻找地图代理。 </p>
		<p>找到地图代理的位置后， Fusion 就会初始化一个 Fusion.Lib.ApplicationDefinition 对象（ fusion.js 的 482 行，这个对象的定义位于 “ &lt;FusionRoot&gt;\lib\ApplicationDefinition.js ”中）。该对象会在初始化的过程中，通过地图代理请求应用程序定义的内容，并把该定义转化成一个浏览器可以处理的 Javascript 对象。 </p>
		<p>为了获得一个浏览器可以处理的 Javascript 对象，需要先把应用程序定义文件转成一个 Javascript 对象。这个工作是“ &lt;FusionRoot&gt;\common\php\Xml2JSON.php ”页面完成的。 Fusion 把获得的应用程序定义 XML 发送到该页面，该页面就会返回转换后的 JSON 对象。但是这个转换过程仅仅是一个形式上的转换，要想让这个 JSON 对象最终可以被 Fusion 框架处理，还需要进一步把它的各个部分解析成 Fusion 库中相应的实例，这个过程由 ApplicationDefinition 的 parseAppDef 函数来完成。 </p>
		<p>我们知道，应用程序定义中各个部分是采用了一个层次化的结构最终放置在一个 ApplicationDefinition 根节点下。同样地，转换后的 Javascript 对象也是采用类似的结构放置在一个 Fusion.Lib.ApplicationDefinition 对象中。 XML 标签与浏览器对象的转换关系如表 3-1 所示（限于空间，这里应用程序定义的浏览器对象类别省略掉前缀“ Fusion.Lib ”，其余的浏览器对象省略掉前缀“ Fusion.Lib.ApplicationDefinition ”）。 </p>
		<p>要注意的是，这个过程仅仅是一个把 XML 标签转化成对应的浏览器对象，并没有开始对这些对象的初始化。还有一个有意思的地方是，当构造 Widget 对象的时候，构造代码会通过检查是否定义了类“ Fusion.Widget.&lt; 小工具类型 &gt; ”来检查浏览器中是否已经加载了相应的小工具脚本。如果没有，构造代码会调用 Fusion.require 函数来将脚本代码放置到 Fusion 的一个待加载脚本列表中。这个列表将在下一步进行加载。 </p>
		<p>当 parseAppDef 将整个应用程序定义文件转换成浏览器对象后， Fusion 就会调用 loadQueuedScripts 函数来加载上一步中发现的没有加载的小工具脚本代码。当所有代码加载完毕之后， Fusion 就会开始整个小工具的初始化工作。 </p>
		<p>
				<font color="#ff0000" size="4">小工具的初始化 <br /></font>当所有代码加载完毕之后， Fusion 会调用 ApplicationDefinition 对象的 create 函数，该函数最终会调用 WidgetSet 的 create 函数，这时，小工具便一个接一个的开始初始化了。 </p>
		<p>小工具的初始化工作无外乎两个方面：构造一个小工具对象、将其放置到界面中。构造小工具对象的过程相对简单，只要调用“ Fusion.Widget.&lt; 小工具类型 &gt; ”类的构造函数即可。而将小工具放置在界面中的过程，则相对复杂一些。 </p>
		<p>小工具界面的初始化，有点像一个“填空”过程。 </p>
		<p>首先， create 函数会检查小工具的 uiClass 属性，并用该属性值作为类名初始化一个界面类。比如，“关于”小工具的 uiClass 属性的值是 Jx.Button ，那么， create 函数会初始化一个 Jx.Button 对象，做为“关于”的界面。在这个初始化过程中，小工具信息中的 label 、 imageUrl 、 imageClass 、 isExclusive 等属性会被作为参数传递到初始化过程中，用来提供初始化的信息。 </p>
		<p>初始化界面元素之后， create 函数会调用小工具脚本代码的 setUiObject 函数，来允许小工具执行一些定制化的内容。 Fusion.Widget 已经为我们实现了一些常用的代码，比如设置提示、将按钮的按下和弹起事件与小工具的 activate 和 deactivate 函数进行关联等等。如果您需要对于小工具界面提供的空间进行“填空”，一般也会在这个函数内完成。 </p>
		<p>当 setUiObject 函数执行完毕后，小工具的界面就初始化完毕了。接下来，需要将小工具的界面添加到页面中。这时候有以下两种情况： </p>
		<p>1.       如果小工具不属于任何容器，那么 Fusion 框架就会认为这个小工具的界面是一个独立的页面元素。因此， Fusion 框架去寻找页面中以小工具名称作为标识的 div ，并把小工具的界面“填空”到这个 div 中。举个例子，概览地图（ OverviewMap ）小工具的名称（ name ）为 OverviewMap 。那么， Fusion 框架就会通过去寻找网页中标识为 OverviewMap 的 div ，并将小工具的界面利用其 addTo 函数添加到这个 div 中。 </p>
		<p>2.       如果小工具属于某一容器，那么 Fusion 框架会先寻找相应的容器界面（此前 Fusion 会像添加小工具界面到页面中那样，把容器界面“填空”到相应的 div 中），然后将小工具通过 addTo 函数添加到这个 div 中。 </p>
		<p>这里我们可以看出，其实在小工具初始化之前，其位于网页中的位置就已经在网页模板中，根据其对应的名称或者容器名称决定下来了。如果您想修改小工具在网页中的位置，您完全不需要改变应用程序定义的内容，而只需要改变网页模板就可以了。 </p>
		<p>当小工具的界面都被初始化完毕之后，界面就完全加载完毕了。用户就可以通过与界面的交互来使用小工具提供的功能了。 </p>
		<p>有一点要说明的是，虽然地图小工具也称为小工具，也放置在 Fusion.Widget 命名空间中。但是， Fusion 对于地图小工具的处理是完全不同于其他小工具的。地图小工具在应用程序定义中使用其专用的 MapWidget 标签。 WidgetSet 类也有一个专门的位置来放置地图小工具（ mapWidget 属性）。 Fusion.Widget.Map 也并不是继承自 Fusion.Widget 的，甚至其 create 函数的参数列表也不同于普通的小工具。地图小工具与其他小工具的唯一一点相似是，在“填空”的时候，地图小工具也会添加到以其名称为标识的 div 中。 </p>
		<p>从中我们不难看出，地图小工具的地位是其他小工具无法比拟的。这是因为，地图是网页地理信息系统最核心的部分。大部分用户交互都是通过地图完成的。所以，我们有必要了解一下地图小工具。 </p>
		<p> </p>
<img src ="http://www.blogjava.net/gdws/aggbug/337863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-11-12 00:06 <a href="http://www.blogjava.net/gdws/articles/337863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide for java WebGIS的开发</title><link>http://www.blogjava.net/gdws/articles/328292.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Mon, 09 Aug 2010 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/328292.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/328292.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/328292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/328292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/328292.html</trackback:ping><description><![CDATA[
		<p>首先说说环境的安装：<br /><br />1. 下载 MapGuide Server 和 MapGuide Web Server Extensions. 到下载页面下载并安装 MgServerSetup-2.0.x.exe 和 MgWebServerExtensionsSetup-2.0.x.exe （<a href="https://mapguide.osgeo.org/download/releases/2.0.0"><font color="#108ac6">https://mapguide.osgeo.org/download/releases/2.0.0</font></a> ）<br /><br />2. 下载 java viewersample-2.0.zip. 解压到 C:\Program Files\MapGuideOpenSource2.0\WebServerExtensions\www.<br /><br />    注意，解压后，www文件夹下，要有个名叫javav iewersample 的文件夹。改文件夹下，有个readme.Txt，请按上面的说明，进行配置。<br /><br />    在Apach的目录下面找到conf/httped的文件打开后在文件后面添加：<br /><br />    JkMount /mapguide/javaviewersample/* worker1<br /><br />安装数据发布工具Meastro开源的工具。<br /><br /><br />3. 下载示例数据<br /><br />到下载页面，下载 Sheboygan.mgp （注意，下载后，后缀可能是zip，将其改成mgp） 拷贝该文件到 C:\ProgramFiles\MapGuideOpenSource2.0\Server\Packages. 目录下。<br /><br />4. 打开一个浏览器，输入 <a href="http://localhost:8008/mapguide/mapadmin/login.php"><font color="#108ac6">http://localhost:8008/mapguide/mapadmin/login.php</font></a>  .使用站点管理程序 ，装载示例数据，登陆用户名是 "Administrator" ，密码是 "admin". 管理页面出来后，在左侧的导航条，选择 "Load Packages" . 然后选中靠近 Sheboygan.Mgp 的单选按钮，点击 "Load Package".<br /><br />5. 启动示例程序<br /><br />在浏览器中输入 <a href="http://localhost:8008/mapguide/javaviewersample/ajaxtiledviewersample.jsp"><font color="#108ac6">http://localhost:8008/mapguide/javaviewersample/ajaxtiledviewersample.jsp</font></a> , 将会看到运行效果，到此， MapGuide Open Source 就被运行起来了。<br /><br />注：默认的方式是apache+tomcat通过jk的方式配合，其实是可以直接访问tomcat的8080端口。主要需要了解 C:\Program Files\MapGuideOpenSource2.0\WebServerExtensions?\www\WEB-INF\lib下的MapGuideApi.jar。然后看看javaviewersample下的示例程序。<br /><br /><font color="#ff0033">注意：<br /><br />如果这样配置的话，在访问页面的时候会报错：MapGuideJavaApi.dll等路径找不到等等的错误，还有ace失败等错误。<br /><br />这个时候需要把bin目录下面的ace，xenroll.dll文件拷贝到系统的system32下面，先把以前的文件重命名或备份下以免发生错误。<br /><br />然后重启动服务即可，可以看到你的地图了</font>。<br /><br /><br />下篇继续maestro的发布工具介绍......</p>
<img src ="http://www.blogjava.net/gdws/aggbug/328292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-08-09 10:55 <a href="http://www.blogjava.net/gdws/articles/328292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java数组排序Arrays.sort，以及Comparator接口的用法</title><link>http://www.blogjava.net/gdws/articles/321391.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 19 May 2010 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/321391.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/321391.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/321391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/321391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/321391.html</trackback:ping><description><![CDATA[
		<p>有的时候需要对数组里的element进行排序。当然可以自己编写合适的排序方法，但既然java包里有自带的Arrays.sort排序方法，在数组元素比较少的时候为何不用？</p>
		<p>　　Sorting an Array 1. 数字排序  int[] intArray = new int[] { 4, 1, 3, -23 };</p>
		<p>　　Arrays.sort(intArray);</p>
		<p>　　输出： [-23, 1, 3, 4]</p>
		<p>　　2. 字符串排序，先大写后小写 String[] strArray = new String[] { "z", "a", "C" };</p>
		<p>　　Arrays.sort(strArray);</p>
		<p>　　输出： [C, a, z]</p>
		<p>　　3. 严格按字母表顺序排序，也就是忽略大小写排序 Case-insensitive sort</p>
		<p>　　Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);</p>
		<p>　　输出： [a, C, z]</p>
		<p>　　4. 反向排序， Reverse-order sort</p>
		<p>　　Arrays.sort(strArray, Collections.reverseOrder());</p>
		<p>　　输出：[z, a, C]</p>
		<p>　　5. 忽略大小写反向排序 Case-insensitive reverse-order sort</p>
		<p>　　Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);</p>
		<p>　　Collections.reverse(Arrays.asList(strArray));</p>
		<p>　　输出： [z, C, a]</p>
		<p>　　java初学者最常见的错误思想，就是试图去写一些方法来完成数组的排序功能，其实，数组排序功能，在java的api里面早已实现，我们没有必要去重复制造轮子。</p>
		<p>　　Arrays类有一个静态方法sort,利用这个方法我们可以传入我们要排序的数组进去排序，因为我们传入的是一个数组的引用，所以排序完成的结果也通过这个引用的来更改数组.对于整数、字符串排序，jdk提供了默认的实现，如果要对一个对象数组排序，则要自己实现java.util.Comparator接口。</p>
		<p>　　package demo1.client;</p>
		<p>　　import java.util.Arrays;</p>
		<p>　　import java.util.Comparator;</p>
		<p>　　public class ArraySortDemo {</p>
		<p>　　public void sortIntArray() {</p>
		<p>　　int[] arrayToSort = new int[] { 48, 5, 89, 80, 81, 23, 45, 16, 2 };</p>
		<p>　　System.out.println("排序前");</p>
		<p>　　for (int i = 0; i &lt; arrayToSort.length; i++)</p>
		<p>　　System.out.println(arrayToSort[i]);</p>
		<p>　　// 调用数组的静态排序方法sort</p>
		<p>　　Arrays.sort(arrayToSort);</p>
		<p>　　System.out.println("排序后");</p>
		<p>　　for (int i = 0; i &lt; arrayToSort.length; i++)</p>
		<p>　　System.out.println(arrayToSort[i]);</p>
		<p>　　}</p>
		<p>　　public void sortStringArray() {</p>
		<p>　　String[] arrayToSort = new String[] { "Oscar", "Charlie", "Ryan",</p>
		<p>　　"Adam", "David" };</p>
		<p>　　System.out.println("排序前");</p>
		<p>　　for (int i = 0; i &lt; arrayToSort.length; i++)</p>
		<p>　　System.out.println(arrayToSort[i]);</p>
		<p>　　System.out.println("排序后");</p>
		<p>　　//调用数组的静态排序方法sort</p>
		<p>　　Arrays.sort(arrayToSort);</p>
		<p>　　for (int i = 0; i &lt; arrayToSort.length; i++)</p>
		<p>　　System.out.println(arrayToSort[i]);</p>
		<p>　　}</p>
		<p>　　public void sortObjectArray() {</p>
		<p>　　Dog o1 = new Dog("dog1", 1);</p>
		<p>　　Dog o2 = new Dog("dog2", 4);</p>
		<p>　　Dog o3 = new Dog("dog3", 5);</p>
		<p>　　Dog o4 = new Dog("dog4", 2);</p>
		<p>　　Dog o5 = new Dog("dog5", 3);</p>
		<p>　　Dog[] dogs = new Dog[] { o1, o2, o3, o4, o5 };</p>
		<p>　　System.out.println("排序前");</p>
		<p>　　for (int i = 0; i &lt; dogs.length; i++) {</p>
		<p>　　Dog dog = dogs[i];</p>
		<p>　　System.out.println(dog.getName());</p>
		<p>　　}</p>
		<p>　　Arrays.sort(dogs, new ByWeightComparator());</p>
		<p>　　System.out.println("排序后：");</p>
		<p>　　for (int i = 0; i &lt; dogs.length; i++) {</p>
		<p>　　Dog dog = dogs[i];</p>
		<p>　　System.out.println(dog.getName());</p>
		<p>　　}</p>
		<p>　　}</p>
		<p>　　public static void main(String[] args) {</p>
		<p>　　ArraySortDemo t = new ArraySortDemo();</p>
		<p>　　t.sortIntArray();</p>
		<p>　　t.sortStringArray();</p>
		<p>　　t.sortObjectArray();</p>
		<p>　　}</p>
		<p>　　}</p>
		<p>　　class Dog {</p>
		<p>　　private String name;</p>
		<p>　　private int weight;</p>
		<p>　　public Dog(String name, int weight) {</p>
		<p>　　this.setName(name);</p>
		<p>　　this.weight = weight;</p>
		<p>　　}</p>
		<p>　　public int getWeight() {</p>
		<p>　　return weight;</p>
		<p>　　}</p>
		<p>　　public void setWeight(int weight) {</p>
		<p>　　this.weight = weight;</p>
		<p>　　}</p>
		<p>　　public void setName(String name) {</p>
		<p>　　this.name = name;</p>
		<p>　　}</p>
		<p>　　public String getName() {</p>
		<p>　　return name;</p>
		<p>　　}</p>
		<p>　　}</p>
		<p>　　class ByWeightComparator implements Comparator {</p>
		<p>　　public final int compare(Object pFirst, Object pSecond) {</p>
		<p>　　int aFirstWeight = ((Dog) pFirst).getWeight();</p>
		<p>　　int aSecondWeight = ((Dog) pSecond).getWeight();</p>
		<p>　　int diff = aFirstWeight - aSecondWeight;</p>
		<p>　　if (diff &gt; 0)</p>
		<p>　　return 1;</p>
		<p>　　if (diff &lt; 0)</p>
		<p>　　return -1;</p>
		<p>　　else</p>
		<p>　　return 0;</p>
		<p>　　}</p>
		<p>　　}</p>
<img src ="http://www.blogjava.net/gdws/aggbug/321391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-05-19 17:17 <a href="http://www.blogjava.net/gdws/articles/321391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet和JSP经验总结</title><link>http://www.blogjava.net/gdws/articles/321390.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 19 May 2010 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/321390.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/321390.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/321390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/321390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/321390.html</trackback:ping><description><![CDATA[在servlet的init()方法中缓存数据
<p>　　当应用服务器初始化Servlet和JSP实例之后，为客户端请求提供服务之前，它会调用这个servlet的init()方法。在一个servlet的生命周期中，init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作，就可大大地提高系统性能。</p><p>　　例如，通过在init()方法中建立一个JDBC连接池是一个最佳例子，假设我们是用jdbc2.0的DataSource接口来取得数据库连接，在通常的情况下，我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中，如果每次SQL请求都要执行一次JNDI查询的话，那系统性能将会急剧下降。解决方法是如下代码，它通过缓存DataSource，使得下一次SQL调用时仍然可以继续利用它</p><p>　　1.publicclassControllerServletextendsHttpServlet{</p><p>　　2.privatejavax.sql.DataSourcetestDS=null;</p><p>　　3.publicvoidinit(ServletConfigconfig)throwsServletException{</p><p>　　4.super.init(config);</p><p>　　5.Contextctx=null;</p><p>　　6.try{ctx=newInitialContext();</p><p>　　7.testDS=(javax.sql.DataSource)ctx.lookup("jdbc/testDS");</p><p>　　8.}</p><p>　　9.catch(NamingExceptionne){</p><p>　　10.ne.printStackTrace();</p><p>　　11.}</p><p>　　12.catch(Exceptione){</p><p>　　13.e.printStackTrace();</p><p>　　14.}</p><p>　　15.}</p><p>　　16.publicjavax.sql.DataSourcegetTestDS(){</p><p>　　17.returntestDS;</p><p>　　18.}</p><p>　　19.......</p><p>　　20.}</p><p>　　禁止Servlet和JSP自动重载(auto-reloading)</p><p>　　Servlet和JSP提供了一个实用的技术，即自动重载技术，它为开发人员提供了一个好的开发环境，当你改变servlet和JSP页面后而不必重启应用服务器。然而，这种技术在产品运行阶段对系统的资源是一个极大的损耗，因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。</p><p>　　不要滥用HttpSession</p><p>　　在很多应用中，我们的程序需要保持客户端的状态，以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性，从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中，是通过HttpSession对像来实现session的功能的，但在方便的同时，它也给系统带来了不小的负担。因为每当你获得或更新session时，系统者要对它进行费时的序列化操作。你可以通过对 HttpSession的以下几种处理方式来提升系统的性能：</p><p>　　如果没有必要，就应该关闭JSP页面中对HttpSession的缺省设置：如果你没有明确指定的话，每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话，那可以通过如下的JSP页面指示符来禁止它：</p><p>　　21.＜%@ page session="false"%＞</p><p>　　不要在HttpSession中存放大的数据对像：如果你在HttpSession中存放大的数据对像的话，每当对它进行读写时，应用服务器都将对其进行序列化，从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大，那系统的性能就下降得越快。</p><p>　　当你不需要HttpSession时，尽快地释放它：当你不再需要session时，你可以通过调用HttpSession.invalidate()方法来释放它。</p><p>　　尽量将session的超时时间设得短一点：在JSP应用服务器中，有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话，系统会将相关的session自动从内存中释放。超时时间设得越大，系统的性能就会越低，因此最好的方法就是尽量使得它的值保持在一个较低的水平。<br /><br /><br />      将页面输出进行压缩</p><p>　　压缩是解决数据冗余的一个好的方法，特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩，这种方法可以戏剧性地减少HTML文件的<a class="channel_keylink" href="http://download.chinaitlab.com/" target="_blank">下载</a>时间。因此，如果你将servlet或JSP页面生成的HTML页面进行压缩的话，那用户就会觉得页面浏览速度会非常快。但不幸的是，不是所有的浏览器都支持gzip压缩，但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段：</p><p>　　22.publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)</p><p>　　throwsIOException,ServletException{</p><p>　　23.OutputStreamout=null</p><p>　　24.Stringencoding=request.getHeader("Accept-Encoding");</p><p>　　25.if(encoding!=null&amp;&amp;encoding.indexOf("gzip")!=-1){</p><p>　　26.request.setHeader("Content-Encoding","gzip");</p><p>　　27.out=newGZIPOutputStream(request.getOutputStream());</p><p>　　28.}</p><p>　　29.elseif(encoding!=null&amp;&amp;encoding.indexOf("compress")!=-1){</p><p>　　30.request.setHeader("Content-Encoding","compress");</p><p>　　31.out=newZIPOutputStream(request.getOutputStream());</p><p>　　32.}</p><p>　　33.else{</p><p>　　34.out=request.getOutputStream();</p><p>　　35.}</p><p>　　36.......</p><p>　　37.}</p><p>　　使用线程池</p><p>　　应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理，并为它们分派service()方法，当service()方法调用完成后，与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源，这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。另外，我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时，它会创建数量等于最小线程数的一个线程池，当客户有请求时，相应地从池从取出一个线程来进行处理，当处理完成后，再将线程重新放入到池中。如果池中的线程不够地话，系统会自动地增加池中线程的数量，但总量不能超过最大线程数。通过使用线程池，当客户端请求急剧增加时，系统的负载就会呈现的平滑的上升曲线，从而提高的系统的可伸缩性。</p><p>　　选择正确的页面包含机制</p><p>　　在JSP中有两种方法可以用来包含另一个页面1、使用include指示符(＜ %@ includee file=”test.jsp” %＞)。2、使用jsp指示符(＜ jsp:includee page=”test.jsp” flush=”true”/＞)。在实际中我发现，如果使用第一种方法的话，可以使得系统性能更高。</p><p>　　正确地确定javabean的生命周期</p><p>　　Servlet和JSP一个强大的地方就是对javabean的支持。通过在JSP页面中使用＜jsp:useBean＞标签，可以将javabean直接插入到一个JSP页面中。它的使用方法如下：</p><p>　　38.＜jsp:useBean id="name" scope="page|request|session|application"</p><p>　　class= "package.className" type="typeName"＞</p><p>　　39.＜/jsp:useBean＞</p><p>　　其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话，它将影响系统的性能。</p><p>　　举例来说，如果你只想在一次请求中使用某个bean，但你却将这个bean的生命周期设置成了session，那当这次请求结束后，这个bean将仍然保留在内存中，除非session超时或用户关闭浏览器。这样会耗费一定的内存，并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期，并在bean的使命结束后尽快地清理它们，会使用系统性能有一个提高。</p><p>　　需要注意：</p><p>　　1.在字符串连接操作中尽量不使用“＋”操作符：在java编程中，我们常常使用“＋”操作符来将几个字符串连接起来，但你或许从来没有想到过它居然会对系统性能造成影响吧？由于字符串是常量，因此JVM会产生一些临时的对像。你使用的“＋”越多，生成的临时对像就越多，这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“＋”操作符。</p><p>　　2.避免使用System.out.println()方法：由于System.out.println()是一种同步调用，即在调用它时，磁盘I/O操作必须等待它的完成，因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具，为了解决这个矛盾，我建议你最好使用Log4j工具，它既可以方便调试，而不会产生System.out.println()这样的方法。</p><p>　　3.ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销，因为它将所有的原始输出都转换为字符流来输出，因此如果使用它来作为页面输出的话，系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题，但它是以二进制进行输出的。</p><img src ="http://www.blogjava.net/gdws/aggbug/321390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-05-19 17:00 <a href="http://www.blogjava.net/gdws/articles/321390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP验证码大全之Servlet实现(二) </title><link>http://www.blogjava.net/gdws/articles/319573.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 28 Apr 2010 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/319573.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/319573.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/319573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/319573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/319573.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">
				<strong>Servlet中实现数字英文混合验证码<br /></strong>   以下为在Servlet中产生数字跟英文混合验证码的代码分析。</font>
		<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"><font color="#000080"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">package org.improviser.validateCode;<br />import javax.imageio.ImageIO; <br />import javax.servlet.http.HttpServlet; <br /><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">import java.awt.Color; <br />import java.awt.Font; <br />import java.awt.Graphics2D; <br />import java.awt.image.BufferedImage; <br />import java.util.Random; <br /></font></span>import javax.servlet.ServletException; <br />import javax.servlet.ServletOutputStream; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br />import javax.servlet.http.HttpSession;</font><br /></span></font><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080"><br />public class ValidateCodeServlet extends HttpServlet <br />{<br /></font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080"><br />private int x=0; <br />//设置验证码图片中显示的</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">字体高度</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">private int fontHeight; <br />private int codeY; <br /><br />//在这里定义了<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">验证码图片的宽度</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">private int width=60; <br />//定义</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">验证码图片的高度。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">private int height=20; <br />//定义</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">验证码字符个数，此处设置为5位</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">private int codeNum=5; </font></span><br /><br />char[] codes = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ,'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',<br />'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',<br />'X', 'Y', 'Z',}; <br /><br />/**<br />* 对</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">验证图片属性进行<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">初始化</font></span></font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">*/<br />public void init() throws ServletException<br />{<br />//从部署文件web.xml中获取程序初始化信息，图片宽度跟高度，字符个数信息</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080"><br />//获取初始化</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">字符个数</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">String strCodeNums=this.getInitParameter("codeNum"); <br />//获取验证码图片<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">宽度参数</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">String strW=this.getInitParameter("w"); <br />//获取验证码图片高<span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">度参数</font></span></font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">String strH=this.getInitParameter("h"); </font></span><br /><br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">将配置的字符串信息转换成数值类型数字</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">try<br />{<br />if(strH!=null &amp;&amp; strH.length()!=0)<br />{<br />height=Integer.parseInt(strH); <br />}<br />if(strW!=null &amp;&amp; strW.length()!=0)<br />{<br />width=Integer.parseInt(strW); <br />}<br />if(strCodeNums!=null &amp;&amp; strCodeNums.length()!=0)<br />{<br />codeNum=Integer.parseInt(strCodeNums); <br />}<br />}<br />catch(NumberFormatException e)<br />{}<br /><br />x=width/(codeNum+1); <br />fontHeight=height-2; <br />codeY=height-4; <br /><br />}<br /><br />protected void service(HttpServletRequest req, HttpServletResponse resp)<br />throws ServletException, java.io.IOException<br />{<br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">定义验证码图像的缓冲流</font></span><font color="#000080"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">BufferedImage buffImg = new BufferedImage(<br />width, height,BufferedImage.TYPE_INT_RGB); <br />//产生图形上下文<br />Graphics2D g = buffImg.createGraphics(); <br /></font></span></font><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">//创建随机数产生函数</font><br /><font color="#000080">Random random = new Random(); <br /><br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">将验证码图像背景填充为白色</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">g.setColor(Color.WHITE); <br />g.fillRect(0, 0, width, height); <br /><br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">创建字体格式，字体的大小则根据验证码图片的高度来设定。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); <br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">设置字体。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">g.setFont(font); <br /><br />//为验证码图片</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">画边框，为一个像素。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">g.setColor(Color.BLACK); <br />g.drawRect(0, 0, width - 1, height - 1); <br /><br />//随机生产222跳图片干扰线条，使验证码图片中的字符不被轻易识别</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">g.setColor(Color.BLACK); <br />for(int i = 0; i </font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">＜</font></span><font color="#000080"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">222;<font color="#000080"> i++) <br />{<br />int x = random.nextInt(width); <br />int y = random.nextInt(height); <br />int xl = random.nextInt(12); <br />int yl = random.nextInt(12); <br />g.drawLine(x, y, x + xl, y + yl); <br />}</font><br /><br /><font color="#000080">//randomCode保存随机产生的验证码</font></span></font><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">StringBuffer randomCode = new StringBuffer(); <br /><br />//定义颜色三素<br />int red = 0, green = 0, blue = 0; <br /><br />//随机生产codeNum个数字验证码</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">for (int i = 0; i </font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">＜</font></span><font color="#000080"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> codeNum; i++) {<br /><font color="#000080">//得到随机产生的验证码<br /></font></span></font><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">String strRand = String.valueOf(codeSequence[random.nextInt(82)]); <br />//使用随机函数</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">产生随机的颜色分量来构造颜色值，这样输出的每位数字的颜色值都将不同。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">red = random.nextInt(255); <br />green = random.nextInt(255); <br />blue = random.nextInt(255); <br /><br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">用随机产生的颜色将验证码绘制到图像中。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">g.setColor(new Color(red, green, blue)); <br />g.drawString(strRand, (i + 1) * x, codeY); <br /><br />//</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">将产生的四个随机数组合在一起。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">randomCode.append(strRand); <br />}<br />// 将生产的验证码保存到Session中</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">HttpSession session = req.getSession(); <br />session.setAttribute("validate", randomCode.toString()); <br /><br />// 设置</font></span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000080">图像缓存为no-cache。</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">resp.setHeader("Pragma", "no-cache"); <br />resp.setHeader("Cache-Control", "no-cache"); <br />resp.setDateHeader("Expires", 0); <br /><br />resp.setContentType("image/jpeg"); <br /><br />//将最终生产的验证码图片输出到Servlet的输出流中</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br /><font color="#000080">ServletOutputStream sos = resp.getOutputStream(); <br />ImageIO.write(buffImg, "jpeg", sos); <br />sos.close(); <br />}<br /><br />} </font></span></div> <font color="#0000ff">  以上即是在Servlet中产生英文数字混合验证码的过程，以下介绍下在web.xml中对图片进行部署。<br /><br /><strong>   七、Servlet验证码的部署</strong><br />    在web.xml中声明servlet。</font><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" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">ValidateCodeServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.improviser.<font face="Verdana" color="#000080" size="2">validateCode</font>.ValidateCodeServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">width</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">160</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">height</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">68</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">codeCount</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">5</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">ValidateCodeServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/validateCodeServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /></span></div><img src ="http://www.blogjava.net/gdws/aggbug/319573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-04-28 10:00 <a href="http://www.blogjava.net/gdws/articles/319573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP验证码大全之Servlet实现(一)</title><link>http://www.blogjava.net/gdws/articles/319572.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 28 Apr 2010 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/319572.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/319572.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/319572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/319572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/319572.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">         </font>
		<font color="#000000">本文将介绍另一种J2EE中验证码的产生跟使用，即在Servlet中定义验证码的产生并使用，通过将验证码的生成封装到JAVA类中，更好的达到代码跟页面分离的效果，因此提倡使用该方法。<br /><strong>  Servlet中实现四位数字验证码</strong><br />   以下为在Servlet中实现四位数字验证码的源码分析。</font>  
<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"><p><font color="#000080">import java.awt.image.*;<br />import com.sun.image.codec.jpeg.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.io.*;<br />import java.util.*;<br />import java.awt.*;<br />/*<br /> * 功能：调用AuthCodeServlet可以生成一个4位数字的验证码图片,验证码的图片宽度和高度可以通过配置文件进行定义<br /> * 验证码调用格式为: /servlet/AuthCodeServlet?w=78&amp;h=32<br /> * 或者使用默认长宽/servlet/AuthCodeServlet<br /> */<br />   public class AuthCodeServlet extends HttpServlet {<br />   // 处理post<br />    public void doPost(HttpServletRequest req,HttpServletResponse res)<br />    throws ServletException,IOException {<br />    doGet(req,res);<br /> }</font></p><p><font color="#000080">   //设置字体<br />   private Font mFont=new Font("Times New Roman", Font.PLAIN,16); </font></p><p><font color="#000080">   public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {</font></p><p><font color="#000080">     HttpSession session=request.getSession();<br />     response.setContentType("image/gif");<br />     response.setHeader("Pragma","No-cache");<br />     response.setHeader("Cache-Control","no-cache");<br />     response.setDateHeader("Expires", 0);<br />     int width=70; //验证码默认长度<br />     int height=24; //验证码默认宽度<br />     if(request.getParameter("w")!=null &amp;&amp; !request.getParameter("w").equals(""))<br />      width = Integer.parseInt(request.getParameter("w"));<br />     if(request.getParameter("h")!=null &amp;&amp; !request.getParameter("h").equals(""))<br />      height = Integer.parseInt(request.getParameter("h"));<br />                 <br />     ServletOutputStream out=response.getOutputStream(); //获取输出流<br />     BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //新建验证图片，并设置验证码图片的大小<br />     Graphics gra=image.getGraphics(); //获取图形上下文<br />     Random random=new Random();<br />     gra.setColor(getRandColor(260,210));    //设置验证码的图片背景色<br />     gra.fillRect(0,0,width,height);<br />     gra.setColor(Color.BLUE); //设置字体色为蓝色<br />     gra.setFont(mFont); //设置定义的字体格式<br /></font><br /><font color="#000080">     // 随机产生254条干扰直线，使图象中的验证码不易被解析程序分析到<br />     gra.setColor(getRandColor(110,240));<br />     for (int i=0;i&lt;254;i++)<br />     {<br />      int x = random.nextInt(width);<br />      int y = random.nextInt(height);<br />             int xl = random.nextInt(63);<br />             int yl = random.nextInt(64);<br />      gra.drawLine(x,y,x+xl,y+yl);<br />     }</font></p><p><font color="#000080">     // 取随机产生的验证码(4位数字)<br />     String sRand="";<br />     for (int i=0;i&lt;4;i++){<br />     String rand=String.valueOf(random.nextInt(353));<br />     sRand+=rand;<br />     // 将认证码显示到图象中<br />      gra.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />     //调用随机函数构建随机颜色三素<br />         gra.drawString(rand,13*i+6,16);<br />     }<br />         session.setAttribute("authCode",sRand);<br />         JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);<br />         encoder.encode(image);</font><br /><font color="#000080"> }</font></p><p><font color="#000080">   static Color getRandColor(int ff,int cc){<br />          //给定范围获得随机颜色<br />          Random random = new Random();<br />          if(fc&gt;255) ff=255;<br />          if(bc&gt;255) cc=255;<br />          int r=ff+random.nextInt(cc-ff);<br />          int g=ff+random.nextInt(cc-ff);<br />          int b=ff+random.nextInt(cc-ff);<br />          return new Color(r,g,b);<br />   }<br />   <br />   static public String getAuthCode(HttpSession session){<br />    //返回验证码<br />    return (String)session.getAttribute("AuthCode");<br />   }<br />}<br /></font></p></div><img src ="http://www.blogjava.net/gdws/aggbug/319572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-04-28 09:59 <a href="http://www.blogjava.net/gdws/articles/319572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP验证码大全之验证码使用与乱码解决[转]</title><link>http://www.blogjava.net/gdws/articles/319571.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 28 Apr 2010 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/319571.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/319571.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/319571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/319571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/319571.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">对验证码的使用分为两个部分，分别为验证码的调用和验证过程，以下分别做说明介绍。<br />   <strong>三、在JSP中调用验证码</strong><br />           使用验证码直接在图片处调用产生验证码的JSP文件即可，同时在刷新验证码按钮处的js代码中使用JSP验证码文件，页面源码如下。</font>
		<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" />
				<span style="COLOR: #000000">
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">form </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">id</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"dForm" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">method</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">post </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">action</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"val.jsp"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
										<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">ul </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">class</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"sFrm"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">li</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">b</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">b</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">img </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">id</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"code" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">border</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">0 </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">src</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"Num.jsp"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">/&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">input </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">type</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"button" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">value</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"</span>
								<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Courier New'; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">看不清，换一张</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">onClick</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"document.getElementById('code').src='ColorChinese.jsp'"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">div </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">class</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"clear0"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">div</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">li</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">li</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">b</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Courier New'; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">验证码</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">b</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">input </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">type</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"text" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">name</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"input" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">maxlength</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">8 </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">value</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">""<span style="mso-spacerun: yes">  </span></span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">styleClass</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"sIpt itemFm"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">div </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">class</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"clear0"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">div</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">li</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">li </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">class</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"bar"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">b</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">b</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">input </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">type</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"submit" </span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">value</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"</span>
								<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Courier New'; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">验证测试</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"<span style="mso-spacerun: yes">  </span></span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">styleClass</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"logbtn3"</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">li</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
										<o:p>
										</o:p>
								</span>
						</p>
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">ul</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;<br /></span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;/</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">form</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span>
								<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
										<span style="mso-spacerun: yes">  </span>
										<o:p>
										</o:p>
								</span>
						</p>
				</span>
				<span style="COLOR: #000000">
						<span style="COLOR: #000000">
						</span>
				</span>
		</div>
		<br />
		<font color="#0000ff">   <strong>四、在JSP中验证码的验证过程以及中文乱码处理</strong><br />            获取用户输入的验证码并与Session中的验证码比较，相同即通过，否则拒绝，对于JSP中中文验证码的处理注意要在页面中定义JSP页面编码跟获取Session的字符编码一致，此处使用的是统一的GB2312编码，否则将出现验证码无法成功验证的情况。</font>
		<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"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">val.jsp<br />&lt;%@ </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">page </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">language</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"java" </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">pageEncoding</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"GB2312" %</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&gt;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;%</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">   </span>request.setCharacterEncoding(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"gb2312"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">); <br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">    //获取Session会话中缓存的验证码<br /> </span><span style="mso-tab-count: 1">   </span>String rand = (String)session.getAttribute(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"rand"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">    //获取用户输入的验证码<br />    String input = request.getParameter(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"input"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">if</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(rand==</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">null</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">||input==</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">null</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">)</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span>{<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">       //无输入验证码处理代码<br /> </span><span style="mso-tab-count: 1">   </span>}</span><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">  </span><span style="mso-tab-count: 1">  </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">if</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> (rand.equals(input)) {</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">  </span><span style="mso-tab-count: 1">     //验证码对比成功</span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span>}</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">else</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span>{<br />       //验证码失败处理代码<br /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">   </span>}<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">%&gt;</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">  </span><o:p></o:p></span></p></div><img src ="http://www.blogjava.net/gdws/aggbug/319571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-04-28 09:57 <a href="http://www.blogjava.net/gdws/articles/319571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP验证码大全之中文验证码[转]</title><link>http://www.blogjava.net/gdws/articles/319570.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 28 Apr 2010 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/319570.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/319570.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/319570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/319570.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/319570.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 中文验证码在JSP中的实现，使用中文验证码的好处是能提高验证的有效性，提高验证的安全度，因为中文相对于英文或数字笔画结构相对比较复杂，从而增加了分析程序解析验证码图片并读取验证信息的难度。在文中并分析中文验证的实现过程。   二、JSP中实现中文验证码源码如下：																				ChineseVal.jsp																				&...&nbsp;&nbsp;<a href='http://www.blogjava.net/gdws/articles/319570.html'>阅读全文</a><img src ="http://www.blogjava.net/gdws/aggbug/319570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-04-28 09:56 <a href="http://www.blogjava.net/gdws/articles/319570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP验证码大全之数字验证码[转]</title><link>http://www.blogjava.net/gdws/articles/319569.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 28 Apr 2010 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/319569.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/319569.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/319569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/319569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/319569.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">     </font>
		<font color="#000000">  验证码应用在各种场合中，十分广泛，在多种多样的系统或软件中的新用户帐户注册、用户登录、网站统一登陆或者用户在网站发布信息模块发布文章或内容都添加的随机码功能，对用户操作过程进行一种验证，使用验证码的目的就是为了避免网络中的自动注册程序或者自动发布程序的滥用。 验证码的原理其实就是随机选择一些字符码以将字符码以图片的形式展现在软件验证界面或验证页面上，当用户在进行提交操作的同时需要将图片上的验证码输入并同时提交，如果提交的字符验证码与服务器session保存的字符码相同，则认为提交信息有效，否则拒绝提交。在使用验证码过程中，为了避免自动分析程序解析图片并获得验证信息，通常需要在图片上随机生成一些干扰线或者将复杂的字符对图片进行扭曲模糊，从而增加了自动识别程序分析验证图片的难度。<br />   JSP验证码源码大全将分别用几个篇幅的内容来介绍在JSP中几种验证码的实现源码以及使用。<br />   <strong>一、JSP中产生数字验证码源码</strong>   <br />   数字验证码是一种最常用的验证字符码形式，以下为数字实现的JSP源码：</font>    
<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: 97.25%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 1162px; BACKGROUND-COLOR: #eeeeee"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Num.jsp<br />&lt;%@ </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f7f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">page </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">contentType</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"image/jpeg" </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f007f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">import</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">=</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">%&gt;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;%!</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>Color getRandColor(</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> cc,</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> bb)</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>{</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span>Random random = </span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Random();</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">if</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(fc&gt;255) cc=255;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">if</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(bc&gt;255) bb=255;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> r=cc+random.nextInt(bb-cc);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> g=cc+random.nextInt(bb-cc);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> b=cc+random.nextInt(bb-cc);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">        </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">return</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Color(r,g,b);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>} <font color="#800080">//获取随机颜色<br /></font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">%&gt;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">&lt;%</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>response.setHeader(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"Pragma"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">,</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"No-cache"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>response.setHeader(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"Cache-Control"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">,</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"no-cache"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>response.setDateHeader(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"Expires"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">, 0);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> width=80; <font color="#800080">//定义验证码图片的长度</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> height=30; <font color="#800080">//定义验证码图片的宽度</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>BufferedImage image = </span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>Graphics g = image.getGraphics();</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>Random random = </span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Random();</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>g.setColor(getRandColor(200,250));</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>g.fillRect(0, 0, width, height);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>g.setFont(</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Font(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"Times New Roman"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">,Font.PLAIN,18));<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p>    <font color="#800080">//定义字体形式</font><br /> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>g.setColor(getRandColor(160,200));</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> (</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> i=0;i&lt;155;i++)</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>{</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> i_x = random.nextInt(width);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> i_y = random.nextInt(height);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> i_xl = random.nextInt(12);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> i_yl = random.nextInt(12);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span>g.drawLine(i_x,i_y,i_x+i_xl,i_y+i_yl);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>}<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p>    <font color="#800080">//用线条画背景<br /></font> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>String s_Rand=</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">""</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span></span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> (</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> i=0;i&lt;4;i++)</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>{</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span>String rand=String.valueOf(random.nextInt(10));</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span>s_Rand+=rand;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span>g.setColor(</span><b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 2">       </span>g.drawString(rand,13*i+6,16);</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>}<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p>    <font color="#800080">//产生4位随机码</font> <br /> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>session.setAttribute(</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"rand"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">,s_Rand);<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p>    <font color="#800080">//将验证码存入Session中</font><br /> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>g.dispose();</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>ImageIO.write(image, </span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"JPEG"</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">, response.getOutputStream());<br /></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    <font color="#800080">//输出验证图片</font><br />    </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>out.clear();</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span>out = pageContext.pushBody();</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #bf5f3f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">%&gt;</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p></div><img src ="http://www.blogjava.net/gdws/aggbug/319569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-04-28 09:54 <a href="http://www.blogjava.net/gdws/articles/319569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JSP页面中的应用JavaBean [转]</title><link>http://www.blogjava.net/gdws/articles/318458.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 15 Apr 2010 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/318458.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/318458.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/318458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/318458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/318458.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JavaBean 				是一种基于 Java的软件组件。JSP 对于在 Web 应用中集成 JavaBean 组件提供了完善的支持。这种支持不仅能缩短开发时间（可以直接利用经测试和可信任的已有组件，避免了重复开发），也为 JSP 应用带来了更多的可伸缩性。								JavaBean 				组件可以用来执行复杂的计算任务，或负责与数据库的交互以及数据提取等。如果我们有三...&nbsp;&nbsp;<a href='http://www.blogjava.net/gdws/articles/318458.html'>阅读全文</a><img src ="http://www.blogjava.net/gdws/aggbug/318458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-04-15 23:04 <a href="http://www.blogjava.net/gdws/articles/318458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实现汉字转换为拼音 [转]</title><link>http://www.blogjava.net/gdws/articles/311702.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Tue, 02 Feb 2010 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/311702.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/311702.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/311702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/311702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/311702.html</trackback:ping><description><![CDATA[代码说明：
<p>　　<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a>实现汉字转换为拼音的GUI版本。</p><p>　　GUI代码部分：</p><p>　　/**</p><p>　　* @(#)CnToSpellGUI.java</p><p>　　* kindani</p><p>　　* 2004-10-25??</p><p>　　* */</p><p>　　import java.awt.*;</p><p>　　import java.awt.event.*;</p><p>　　import javax.swing.*;</p><p>　　import javax.swing.event.*;</p><p>　　/**</p><p>　　*</p><p>　　*</p><p>　　JDK版本</p><p>　　1.4</p><p>　　* @author KIN</p><p>　　* @version 1.0</p><p>　　* @see</p><p>　　* @since 1.0</p><p>　　*/</p><p>　　public class CnToSpell2GUI extends JFrame {</p><p>　　private CnToSpell2GUI c = null;</p><p>　　public CnToSpell2GUI () {</p><p>　　super("Cn to Spell");</p><p>　　setSize(800,100);</p><p>　　getContentPane().setLayout(new FlowLayout());</p><p>　　// component layout</p><p>　　JTextArea from = new JTextArea(5,20);</p><p>　　JTextArea to = new JTextArea(5,20);</p><p>　　JButton b = new JButton("cn to pinyin");</p><p>　　getContentPane().add(new JLabel("From:"));</p><p>　　getContentPane().add(from);</p><p>　　getContentPane().add(b);</p><p>　　getContentPane().add(new JLabel("To:"));</p><p>　　getContentPane().add(to);</p><p>　　// action handle</p><p>　　b.addActionListener(new Cn2PinyinActionListener(from,to));</p><p>　　setVisible(true);</p><p>　　// set this for pack</p><p>　　c = this;</p><p>　　}<br />/**button action listener to convert text to pinyin from one textbox to another textbox*/</p><p>　　class Cn2PinyinActionListener implements ActionListener{</p><p>　　private JTextArea from = null;</p><p>　　private JTextArea to = null;</p><p>　　public Cn2PinyinActionListener(JTextArea from, JTextArea to) {</p><p>　　this.from = from;</p><p>　　this.to = to;</p><p>　　}</p><p>　　public void actionPerformed(ActionEvent e) {</p><p>　　if (from.getText().length() == 0) {</p><p>　　JOptionPane.showMessageDialog(from,"From text is empty!","Warning",JOptionPane.WARNING_MESSAGE);</p><p>　　}</p><p>　　String text = from.getText();</p><p>　　to.setText(CnToSpell.getFullSpell(text));</p><p>　　c.pack();</p><p>　　}</p><p>　　}</p><p>　　public static void main(String [] args) {</p><p>　　CnToSpell2GUI g = new CnToSpell2GUI();</p><p>　　}</p><p>　　}</p><p>　　　/**</p><p>　　* @(#)CnToSpell.java</p><p>　　* 版权声明 Easydozer 版权所有 违者必究</p><p>　　*</p><p>　　* 修订记录:</p><p>　　* 1)更改者：Easydozer</p><p>　　* 时　间：2004-10-20</p><p>　　* 描　述：创建</p><p>　　*/</p><p>　　package com.easydozer.commons.util;</p><p>　　import java.util.Iterator;</p><p>　　import java.util.LinkedHashMap;</p><p>　　import java.util.Set;</p><p>　　/**</p><p>　　*</p><p>　　汉字转化为全拼</p><p>　　*</p><p>　　JDK版本:</p><p>　　1.4</p><p>　　* @author 谢计生</p><p>　　* @version 1.0</p><p>　　* @see</p><p>　　* @since 1.0</p><p>　　*/</p><p>　　public class CnToSpell</p><p>　　{</p><p>　　private static LinkedHashMap spellMap = null;</p><p>　　static</p><p>　　{</p><p>　　if(spellMap == null){</p><p>　　spellMap = new LinkedHashMap(400);</p><p>　　}</p><p>　　initialize();</p><p>　　System.out.println("Chinese transfer Spell Done.");</p><p>　　}<br />private CnToSpell()</p><p>　　{</p><p>　　}</p><p>　　private static void spellPut(String spell,int ascii)</p><p>　　{</p><p>　　spellMap.put(spell,new Integer(ascii));</p><p>　　}</p><p>　　private static void initialize()</p><p>　　{</p><p>　　spellPut("a", -20319);</p><p>　　spellPut("ai", -20317);</p><p>　　spellPut("an", -20304);</p><p>　　spellPut("ang", -20295);</p><p>　　spellPut("ao", -20292);</p><p>　　spellPut("ba", -20283);</p><p>　　spellPut("bai", -20265);</p><p>　　spellPut("ban", -20257);</p><p>　　spellPut("bang", -20242);</p><p>　　spellPut("bao", -20230);</p><p>　　spellPut("bei", -20051);</p><p>　　spellPut("ben", -20036);</p><p>　　spellPut("beng", -20032);</p><p>　　spellPut("bi", -20026);</p><p>　　spellPut("bian", -20002);</p><p>　　spellPut("biao", -19990);</p><p>　　spellPut("bie", -19986);</p><p>　　spellPut("bin", -19982);</p><p>　　spellPut("bing", -19976);</p><p>　　spellPut("bo", -19805);</p><p>　　spellPut("bu", -19784);</p><p>　　spellPut("ca", -19775);</p><p>　　spellPut("cai", -19774);</p><p>　　spellPut("can", -19763);</p><p>　　spellPut("cang", -19756);</p><p>　　spellPut("cao", -19751);</p><p>　　spellPut("ce", -19746);</p><p>　　spellPut("ceng", -19741);</p><p>　　spellPut("cha", -19739);</p><p>　　spellPut("chai", -19728);</p><p>　　spellPut("chan", -19725);</p><p>　　spellPut("chang", -19715);</p><p>　　spellPut("chao", -19540);</p><p>　　spellPut("che", -19531);</p><p>　　spellPut("chen", -19525);</p><p>　　spellPut("cheng", -19515);</p><p>　　spellPut("chi", -19500);</p><p>　　spellPut("chong", -19484);</p><p>　　spellPut("chou", -19479);</p><p>　　spellPut("chu", -19467);</p><p>　　spellPut("chuai", -19289);</p><p>　　spellPut("chuan", -19288);</p><p>　　spellPut("chuang", -19281);</p><p>　　spellPut("chui", -19275);</p><p>　　spellPut("chun", -19270);</p><p>　　spellPut("chuo", -19263);</p><p>　　spellPut("ci", -19261);</p><p>　　spellPut("cong", -19249);</p><p>　　spellPut("cou", -19243);</p><p>　　spellPut("cu", -19242);</p><p>　　spellPut("cuan", -19238);</p><p>　　spellPut("cui", -19235);</p><p>　　spellPut("cun", -19227);</p><p>　　spellPut("cuo", -19224);</p><p>　　spellPut("da", -19218);</p><p>　　spellPut("dai", -19212);</p><p>　　spellPut("dan", -19038);<br />spellPut("dang", -19023);</p><p>　　spellPut("dao", -19018);</p><p>　　spellPut("de", -19006);</p><p>　　spellPut("deng", -19003);</p><p>　　spellPut("di", -18996);</p><p>　　spellPut("dian", -18977);</p><p>　　spellPut("diao", -18961);</p><p>　　spellPut("die", -18952);</p><p>　　spellPut("ding", -18783);</p><p>　　spellPut("diu", -18774);</p><p>　　spellPut("dong", -18773);</p><p>　　spellPut("dou", -18763);</p><p>　　spellPut("du", -18756);</p><p>　　spellPut("duan", -18741);</p><p>　　spellPut("dui", -18735);</p><p>　　spellPut("dun", -18731);</p><p>　　spellPut("duo", -18722);</p><p>　　spellPut("e", -18710);</p><p>　　spellPut("en", -18697);</p><p>　　spellPut("er", -18696);</p><p>　　spellPut("fa", -18526);</p><p>　　spellPut("fan", -18518);</p><p>　　spellPut("fang", -18501);</p><p>　　spellPut("fei", -18490);</p><p>　　spellPut("fen", -18478);</p><p>　　spellPut("feng", -18463);</p><p>　　spellPut("fo", -18448);</p><p>　　spellPut("fou", -18447);</p><p>　　spellPut("fu", -18446);</p><p>　　spellPut("ga", -18239);</p><p>　　spellPut("gai", -18237);</p><p>　　spellPut("gan", -18231);</p><p>　　spellPut("gang", -18220);</p><p>　　spellPut("gao", -18211);</p><p>　　spellPut("ge", -18201);</p><p>　　spellPut("gei", -18184);</p><p>　　spellPut("gen", -18183);</p><p>　　spellPut("geng", -18181);</p><p>　　spellPut("gong", -18012);</p><p>　　spellPut("gou", -17997);</p><p>　　spellPut("gu", -17988);</p><p>　　spellPut("gua", -17970);</p><p>　　spellPut("guai", -17964);</p><p>　　spellPut("guan", -17961);</p><p>　　spellPut("guang", -17950);</p><p>　　spellPut("gui", -17947);</p><p>　　spellPut("gun", -17931);</p><p>　　spellPut("guo", -17928);</p><p>　　spellPut("ha", -17922);</p><p>　　spellPut("hai", -17759);</p><p>　　spellPut("han", -17752);</p><p>　　spellPut("hang", -17733);</p><p>　　spellPut("hao", -17730);</p><p>　　spellPut("he", -17721);</p><p>　　spellPut("hei", -17703);</p><p>　　spellPut("hen", -17701);</p><p>　　spellPut("heng", -17697);</p><p>　　spellPut("hong", -17692);</p><p>　　spellPut("hou", -17683);</p><p>　　spellPut("hu", -17676);</p><p>　　spellPut("hua", -17496);</p><p>　　spellPut("huai", -17487);</p><p>　　spellPut("huan", -17482);</p><p>　　spellPut("huang", -17468);</p><p>　　spellPut("hui", -17454);</p><p>　　spellPut("hun", -17433);</p><p>　　spellPut("huo", -17427);</p><p>　　spellPut("ji", -17417);</p><p>　　spellPut("jia", -17202);</p><p>　　spellPut("jian", -17185);</p><p>　　spellPut("jiang", -16983);</p><p>　　spellPut("jiao", -16970);</p><p>　　spellPut("jie", -16942);</p><p>　　spellPut("jin", -16915);</p><p>　　spellPut("jing", -16733);</p><p>　　spellPut("jiong", -16708);</p><p>　　spellPut("jiu", -16706);</p><p>　　spellPut("ju", -16689);</p><p>　　spellPut("juan", -16664);</p><p>　　spellPut("jue", -16657);</p><p>　　spellPut("jun", -16647);</p><p>　　spellPut("ka", -16474);</p><p>　　spellPut("kai", -16470);</p><p>　　spellPut("kan", -16465);</p><p>　　spellPut("kang", -16459);</p><p>　　spellPut("kao", -16452);</p><p>　　spellPut("ke", -16448);</p><p>　　spellPut("ken", -16433);</p><p>　　spellPut("keng", -16429);</p><p>　　spellPut("kong", -16427);</p><p>　　spellPut("kou", -16423);</p><p>　　spellPut("ku", -16419);</p><p>　　spellPut("kua", -16412);</p><p>　　spellPut("kuai", -16407);</p><p>　　spellPut("kuan", -16403);</p><p>　　spellPut("kuang", -16401);</p><p>　　spellPut("kui", -16393);</p><p>　　spellPut("kun", -16220);<br />spellPut("kuo", -16216);</p><p>　　spellPut("la", -16212);</p><p>　　spellPut("lai", -16205);</p><p>　　spellPut("lan", -16202);</p><p>　　spellPut("lang", -16187);</p><p>　　spellPut("lao", -16180);</p><p>　　spellPut("le", -16171);</p><p>　　spellPut("lei", -16169);</p><p>　　spellPut("leng", -16158);</p><p>　　spellPut("li", -16155);</p><p>　　spellPut("lia", -15959);</p><p>　　spellPut("lian", -15958);</p><p>　　spellPut("liang", -15944);</p><p>　　spellPut("liao", -15933);</p><p>　　spellPut("lie", -15920);</p><p>　　spellPut("lin", -15915);</p><p>　　spellPut("ling", -15903);</p><p>　　spellPut("liu", -15889);</p><p>　　spellPut("long", -15878);</p><p>　　spellPut("lou", -15707);</p><p>　　spellPut("lu", -15701);</p><p>　　spellPut("lv", -15681);</p><p>　　spellPut("luan", -15667);</p><p>　　spellPut("lue", -15661);</p><p>　　spellPut("lun", -15659);</p><p>　　spellPut("luo", -15652);</p><p>　　spellPut("ma", -15640);</p><p>　　spellPut("mai", -15631);</p><p>　　spellPut("man", -15625);</p><p>　　spellPut("mang", -15454);</p><p>　　spellPut("mao", -15448);</p><p>　　spellPut("me", -15436);</p><p>　　spellPut("mei", -15435);</p><p>　　spellPut("men", -15419);</p><p>　　spellPut("meng", -15416);</p><p>　　spellPut("mi", -15408);</p><p>　　spellPut("mian", -15394);</p><p>　　spellPut("miao", -15385);</p><p>　　spellPut("mie", -15377);</p><p>　　spellPut("min", -15375);</p><p>　　spellPut("ming", -15369);</p><p>　　spellPut("miu", -15363);</p><p>　　spellPut("mo", -15362);</p><p>　　spellPut("mou", -15183);</p><p>　　spellPut("mu", -15180);</p><p>　　spellPut("na", -15165);</p><p>　　spellPut("nai", -15158);</p><p>　　spellPut("nan", -15153);</p><p>　　spellPut("nang", -15150);</p><p>　　spellPut("nao", -15149);</p><p>　　spellPut("ne", -15144);</p><p>　　spellPut("nei", -15143);</p><p>　　spellPut("nen", -15141);</p><p>　　spellPut("neng", -15140);</p><p>　　spellPut("ni", -15139);</p><p>　　spellPut("nian", -15128);</p><p>　　spellPut("niang", -15121);</p><p>　　spellPut("niao", -15119);</p><p>　　spellPut("nie", -15117);</p><p>　　spellPut("nin", -15110);</p><p>　　spellPut("ning", -15109);</p><p>　　spellPut("niu", -14941);</p><p>　　spellPut("nong", -14937);</p><p>　　spellPut("nu", -14933);</p><p>　　spellPut("nv", -14930);</p><p>　　spellPut("nuan", -14929);</p><p>　　spellPut("nue", -14928);</p><p>　　spellPut("nuo", -14926);</p><p>　　spellPut("o", -14922);</p><p>　　spellPut("ou", -14921);</p><p>　　spellPut("pa", -14914);</p><p>　　spellPut("pai", -14908);</p><p>　　spellPut("pan", -14902);</p><p>　　spellPut("pang", -14894);</p><p>　　spellPut("pao", -14889);</p><p>　　spellPut("pei", -14882);</p><p>　　spellPut("pen", -14873);</p><p>　　spellPut("peng", -14871);</p><p>　　spellPut("pi", -14857);</p><p>　　spellPut("pian", -14678);</p><p>　　spellPut("piao", -14674);</p><p>　　spellPut("pie", -14670);</p><p>　　spellPut("pin", -14668);</p><p>　　spellPut("ping", -14663);</p><p>　　spellPut("po", -14654);</p><p>　　spellPut("pu", -14645);</p><p>　　spellPut("qi", -14630);</p><p>　　spellPut("qia", -14594);</p><p>　　spellPut("qian", -14429);</p><p>　　spellPut("qiang", -14407);</p><p>　　spellPut("qiao", -14399);</p><p>　　spellPut("qie", -14384);</p><p>　　spellPut("qin", -14379);</p><p>　　spellPut("qing", -14368);</p><p>　　spellPut("qiong", -14355);</p><p>　　spellPut("qiu", -14353);</p><p>　　spellPut("qu", -14345);</p><p>　　spellPut("quan", -14170);</p><p>　　spellPut("que", -14159);</p><p>　　spellPut("qun", -14151);</p><p>　　spellPut("ran", -14149);</p><p>　　spellPut("rang", -14145);</p><p>　　spellPut("rao", -14140);</p><p>　　spellPut("re", -14137);</p><p>　　spellPut("ren", -14135);</p><p>　　spellPut("reng", -14125);</p><p>　　spellPut("ri", -14123);</p><p>　　spellPut("rong", -14122);</p><p>　　spellPut("rou", -14112);</p><p>　　spellPut("ru", -14109);</p><p>　　spellPut("ruan", -14099);</p><p>　　spellPut("rui", -14097);</p><p>　　spellPut("run", -14094);</p><p>　　spellPut("ruo", -14092);</p><p>　　spellPut("sa", -14090);</p><p>　　spellPut("sai", -14087);</p><p>　　spellPut("san", -14083);</p><p>　　spellPut("sang", -13917);</p><p>　　spellPut("sao", -13914);<br />spellPut("se", -13910);</p><p>　　spellPut("sen", -13907);</p><p>　　spellPut("seng", -13906);</p><p>　　spellPut("sha", -13905);</p><p>　　spellPut("shai", -13896);</p><p>　　spellPut("shan", -13894);</p><p>　　spellPut("shang", -13878);</p><p>　　spellPut("shao", -13870);</p><p>　　spellPut("she", -13859);</p><p>　　spellPut("shen", -13847);</p><p>　　spellPut("sheng", -13831);</p><p>　　spellPut("shi", -13658);</p><p>　　spellPut("shou", -13611);</p><p>　　spellPut("shu", -13601);</p><p>　　spellPut("shua", -13406);</p><p>　　spellPut("shuai", -13404);</p><p>　　spellPut("shuan", -13400);</p><p>　　spellPut("shuang", -13398);</p><p>　　spellPut("shui", -13395);</p><p>　　spellPut("shun", -13391);</p><p>　　spellPut("shuo", -13387);</p><p>　　spellPut("si", -13383);</p><p>　　spellPut("song", -13367);</p><p>　　spellPut("sou", -13359);</p><p>　　spellPut("su", -13356);</p><p>　　spellPut("suan", -13343);</p><p>　　spellPut("sui", -13340);</p><p>　　spellPut("sun", -13329);</p><p>　　spellPut("suo", -13326);</p><p>　　spellPut("ta", -13318);</p><p>　　spellPut("tai", -13147);</p><p>　　spellPut("tan", -13138);</p><p>　　spellPut("tang", -13120);</p><p>　　spellPut("tao", -13107);</p><p>　　spellPut("te", -13096);</p><p>　　spellPut("teng", -13095);</p><p>　　spellPut("ti", -13091);</p><p>　　spellPut("tian", -13076);</p><p>　　spellPut("tiao", -13068);</p><p>　　spellPut("tie", -13063);</p><p>　　spellPut("ting", -13060);</p><p>　　spellPut("tong", -12888);</p><p>　　spellPut("tou", -12875);</p><p>　　spellPut("tu", -12871);</p><p>　　spellPut("tuan", -12860);</p><p>　　spellPut("tui", -12858);</p><p>　　spellPut("tun", -12852);</p><p>　　spellPut("tuo", -12849);</p><p>　　spellPut("wa", -12838);</p><p>　　spellPut("wai", -12831);</p><p>　　spellPut("wan", -12829);</p><p>　　spellPut("wang", -12812);</p><p>　　spellPut("wei", -12802);</p><p>　　spellPut("wen", -12607);</p><p>　　spellPut("weng", -12597);</p><p>　　spellPut("wo", -12594);</p><p>　　spellPut("wu", -12585);</p><p>　　spellPut("xi", -12556);</p><p>　　spellPut("xia", -12359);</p><p>　　spellPut("xian", -12346);</p><p>　　spellPut("xiang", -12320);</p><p>　　spellPut("xiao", -12300);</p><p>　　spellPut("xie", -12120);</p><p>　　spellPut("xin", -12099);</p><p>　　spellPut("xing", -12089);</p><p>　　spellPut("xiong", -12074);</p><p>　　spellPut("xiu", -12067);</p><p>　　spellPut("xu", -12058);</p><p>　　spellPut("xuan", -12039);</p><p>　　spellPut("xue", -11867);</p><p>　　spellPut("xun", -11861);</p><p>　　spellPut("ya", -11847);</p><p>　　spellPut("yan", -11831);</p><p>　　spellPut("yang", -11798);</p><p>　　spellPut("yao", -11781);</p><p>　　spellPut("ye", -11604);</p><p>　　spellPut("yi", -11589);</p><p>　　spellPut("yin", -11536);</p><p>　　spellPut("ying", -11358);</p><p>　　spellPut("yo", -11340);</p><p>　　spellPut("yong", -11339);</p><p>　　spellPut("you", -11324);</p><p>　　spellPut("yu", -11303);</p><p>　　spellPut("yuan", -11097);</p><p>　　spellPut("yue", -11077);</p><p>　　spellPut("yun", -11067);</p><p>　　spellPut("za", -11055);</p><p>　　spellPut("zai", -11052);</p><p>　　spellPut("zan", -11045);</p><p>　　spellPut("zang", -11041);</p><p>　　spellPut("zao", -11038);</p><p>　　spellPut("ze", -11024);</p><p>　　spellPut("zei", -11020);</p><p>　　spellPut("zen", -11019);</p><p>　　spellPut("zeng", -11018);</p><p>　　spellPut("zha", -11014);<br />spellPut("zhai", -10838);</p><p>　　spellPut("zhan", -10832);</p><p>　　spellPut("zhang", -10815);</p><p>　　spellPut("zhao", -10800);</p><p>　　spellPut("zhe", -10790);</p><p>　　spellPut("zhen", -10780);</p><p>　　spellPut("zheng", -10764);</p><p>　　spellPut("zhi", -10587);</p><p>　　spellPut("zhong", -10544);</p><p>　　spellPut("zhou", -10533);</p><p>　　spellPut("zhu", -10519);</p><p>　　spellPut("zhua", -10331);</p><p>　　spellPut("zhuai", -10329);</p><p>　　spellPut("zhuan", -10328);</p><p>　　spellPut("zhuang", -10322);</p><p>　　spellPut("zhui", -10315);</p><p>　　spellPut("zhun", -10309);</p><p>　　spellPut("zhuo", -10307);</p><p>　　spellPut("zi", -10296);</p><p>　　spellPut("zong", -10281);</p><p>　　spellPut("zou", -10274);</p><p>　　spellPut("zu", -10270);</p><p>　　spellPut("zuan", -10262);</p><p>　　spellPut("zui", -10260);</p><p>　　spellPut("zun", -10256);</p><p>　　spellPut("zuo", -10254);</p><p>　　}</p><p>　　/**</p><p>　　* 获得单个汉字的Ascii.</p><p>　　* @param cn char</p><p>　　* 汉字字符</p><p>　　* @return int</p><p>　　* 错误返回 0,否则返回ascii</p><p>　　*/</p><p>　　public static int getCnAscii(char cn)</p><p>　　{</p><p>　　byte[] bytes = (String.valueOf(cn)).getBytes();</p><p>　　if(bytes == null || bytes.length &gt; 2 || bytes.length &lt;= 0){ //错误</p><p>　　return 0;</p><p>　　}</p><p>　　if(bytes.length == 1){ //英文字符</p><p>　　return bytes[0];</p><p>　　}</p><p>　　if(bytes.length == 2){ //中文字符</p><p>　　int hightByte = 256 + bytes[0];</p><p>　　int lowByte = 256 + bytes[1];</p><p>　　int ascii = (256 * hightByte + lowByte) - 256 * 256;</p><p>　　//System.out.println("ASCII=" + ascii);</p><p>　　return ascii;</p><p>　　}</p><p>　　return 0; //错误</p><p>　　}</p><p>　　/**</p><p>　　* 根据ASCII码到SpellMap中查找对应的拼音</p><p>　　* @param ascii int</p><p>　　* 字符对应的ASCII</p><p>　　* @return String</p><p>　　* 拼音,首先判断ASCII是否&gt;0&amp;&lt;160,如果是返回对应的字符,</p><p>　　*</p><p>　　否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.</p><p>　　*/</p><p>　　public static String getSpellByAscii(int ascii)</p><p>　　{</p><p>　　if(ascii &gt; 0 &amp;&amp; ascii &lt; 160){ //单字符</p><p>　　return String.valueOf((char)ascii);</p><p>　　}</p><p>　　if(ascii &lt; -20319 || ascii &gt; -10247){ //不知道的字符</p><p>　　return null;</p><p>　　}</p><p>　　Set keySet = spellMap.keySet();</p><p>　　Iterator it = keySet.iterator();</p><p>　　String spell0 = null;;</p><p>　　String spell = null;</p><p>　　int asciiRang0 = -20319;</p><p>　　int asciiRang;</p><p>　　while(it.hasNext()){</p><p>　　spell = (String)it.next();</p><p>　　Object valObj = spellMap.get(spell);</p><p>　　if(valObj instanceof Integer){</p><p>　　asciiRang = ((Integer)valObj).intValue();</p><p>　　if(ascii &gt;= asciiRang0 &amp;&amp; ascii &lt; asciiRang){ //区间找到</p><p>　　return(spell0 == null) ? spell : spell0;</p><p>　　}</p><p>　　else{</p><p>　　spell0 = spell;</p><p>　　asciiRang0 = asciiRang;</p><p>　　}</p><p>　　}</p><p>　　}</p><p>　　return null;</p><p>　　}<br />/**</p><p>　　* 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换</p><p>　　* @param cnStr String</p><p>　　* 字符串</p><p>　　* @return String</p><p>　　* 转换成全拼后的字符串</p><p>　　*/</p><p>　　public static String getFullSpell(String cnStr)</p><p>　　{</p><p>　　if(null == cnStr || "".equals(cnStr.trim())){</p><p>　　return cnStr;</p><p>　　}</p><p>　　char[] chars = cnStr.toCharArray();</p><p>　　StringBuffer retuBuf = new StringBuffer();</p><p>　　for(int i = 0,Len = chars.length;i &lt; Len;i++){</p><p>　　int ascii = getCnAscii(chars);</p><p>　　if(ascii == 0){ //取ascii时出错</p><p>　　retuBuf.append(chars);</p><p>　　}</p><p>　　else{</p><p>　　String spell = getSpellByAscii(ascii);</p><p>　　if(spell == null){</p><p>　　retuBuf.append(chars);</p><p>　　}</p><p>　　else{</p><p>　　retuBuf.append(spell);</p><p>　　} // end of if spell == null</p><p>　　} // end of if ascii &lt;= -20400</p><p>　　} // end of for</p><p>　　return retuBuf.toString();</p><p>　　}</p><p>　　public static String getFirstSpell(String cnStr)</p><p>　　{</p><p>　　return null;</p><p>　　}</p><p>　　public static void main(String[] args)</p><p>　　{</p><p>　　String str = null;</p><p>　　str = "谢海101普降喜雨";</p><p>　　System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p><p>　　str = "张牙舞爪》。，";</p><p>　　System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p><p>　　str = "□□□□，可耻下场。";</p><p>　　System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p><p>　　str = "猪油，猪八戒。";</p><p>　　System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p><p>　　}</p><p>　　}</p><img src ="http://www.blogjava.net/gdws/aggbug/311702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2010-02-02 17:12 <a href="http://www.blogjava.net/gdws/articles/311702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何应用Java的可变参数</title><link>http://www.blogjava.net/gdws/articles/282795.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 17 Jun 2009 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/282795.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/282795.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/282795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/282795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/282795.html</trackback:ping><description><![CDATA[
		<span style="FONT-FAMILY: 黑体">可变参数</span>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a>
				</span>
				<span style="FONT-FAMILY: 宋体">语言在</span>
				<span lang="EN-US">JDK1.5</span>
				<span style="FONT-FAMILY: 宋体">中首次推出可变参数，</span>
				<span lang="EN-US">variable arguments</span>
				<span style="FONT-FAMILY: 宋体">，或简称</span>
				<span lang="EN-US">varargs</span>
				<span style="FONT-FAMILY: 宋体">。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。但可变参数的应用并不像想象的那么简单，使用时有其特殊要求和局限性。</span>
		</div>
		<h3>
				<font size="2">
						<span lang="EN-US">12.7.1 <span> </span></span>
						<span style="LINE-HEIGHT: 300%; FONT-FAMILY: 宋体">重载的最好例子</span>
				</font>
		</h3>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">读者朋友可能有这样的编程经历：在编写一个方法时，其参数随着程序运行的条件而变化，在编译期间无法确定。具体地讲，例如编写一个打印参加聚会</span>
				<span lang="EN-US">party</span>
				<span style="FONT-FAMILY: 宋体">的程序，其中方法</span>
				<span lang="EN-US">printInvitation()</span>
				<span style="FONT-FAMILY: 宋体">将根据作为参数的参加人姓名，打印邀请卡。但这个参数的数量事先并不确定。当然可以编写许多重载的方法来解决这个问题，如：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<?XML:NAMESPACE PREFIX = O /?>
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void printInvitation(String name);</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void printInvitation(String name1, String name2);</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void printInvitation(String name1, String name2, String name3);</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">...</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">问题是编写多少个重载的方法才可以解决给所有参加者打印邀请卡？也许需要改变您的程序设计，而使用数组或者链接表了。</span>
		</div>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">应用可变参数可以方便、灵活地解决这类问题。例如：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
				</span> </div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void printInvitation(String...names) {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>for (String name : names) {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>        </span>makeCard(name);<span>             </span>//</span>
				<span style="FONT-FAMILY: 宋体">调用方法按照姓名打印邀请卡</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>        </span>System.out.println("Recording info: invitation card has been <span></span>printed for " + name);</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>}</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">}</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">这里，</span>
				<span lang="EN-US">(String...names)</span>
				<span style="FONT-FAMILY: 宋体">便是可变参数。它包括从</span>
				<span lang="EN-US">0</span>
				<span style="FONT-FAMILY: 宋体">到任意个相同类型的参数。在编译期间，这个可变参数将被转换为字符串数组形式，即：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void printInvitation(String[] names)</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">如下是调用这个方法的例子：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">printInvitation("</span>
				<span style="FONT-FAMILY: 宋体">李刚</span>
				<span lang="EN-US">", "David Smith");</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">printInvitation("Greg Wu", "Paul Nguyen", "Liu Wei", "</span>
				<span style="FONT-FAMILY: 宋体">张新</span>
				<span lang="EN-US">")</span>
				<span style="FONT-FAMILY: 宋体">；</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">printInvitation();<span>          </span>//</span>
				<span style="FONT-FAMILY: 宋体">无参数</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">当在无参数情况下调用这个方法时，将不执行任何这个方法中的代码。</span>
		</div>
		<div class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">如下是运行结果：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">Recording info: invitation card has been printed for </span>
				<span style="FONT-FAMILY: 宋体">李刚</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">Recording info: invitation card has been printed for David Smith</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">Recording info: invitation card has been printed for Greg Wu</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">Recording info: invitation card has been printed for Paul Nguyen</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">Recording info: invitation card has been printed for Liu Wei</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">Recording info: invitation card has been printed for </span>
				<span style="FONT-FAMILY: 宋体">张新</span>
		</div>
		<h3>
				<span lang="EN-US">12.7.2 <span> </span></span>
				<span style="FONT-FAMILY: 宋体">怎样工作</span>
		</h3>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">可变参数也不神秘。实际上，</span>
				<span lang="EN-US">JVM</span>
				<span style="FONT-FAMILY: 宋体">将根据程序中调用这个方法时提供的参数数量，来装载和运行它。</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">可变参数的简单语法格式为：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">methodName([argumentList], dataType...argumentName);</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">其中：</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>argumentList</span>
				<span style="FONT-FAMILY: 宋体">——普通参数，可选项。</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>dataType</span>
				<span style="FONT-FAMILY: 宋体">——数据类型或者类。自动转换成</span>
				<span lang="EN-US">dataType</span>
				<span style="FONT-FAMILY: 宋体">代表的数组。</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>...</span>
				<span style="FONT-FAMILY: 宋体">——</span>
				<span lang="EN-US">
						<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a>
				</span>
				<span style="FONT-FAMILY: 宋体">的操作符。表示</span>
				<span lang="EN-US">0</span>
				<span style="FONT-FAMILY: 宋体">到多个。必须是</span>
				<span lang="EN-US">3</span>
				<span style="FONT-FAMILY: 宋体">个点。</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>argumentName</span>
				<span style="FONT-FAMILY: 宋体">——参数名。</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">注意，可变参数必须在最后。</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">下面是应用可变参数的更多例子：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
				</span> </div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">public static int sumInts(int...numbers) {<span>  </span>//</span>
				<span style="FONT-FAMILY: 宋体">可变整数数组类型参数</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>int sum = 0;</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>for (int num : numbers)</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>        </span>sum +=num;</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>return sum;</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">}<span>       </span></span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">再如：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">public void totalTax(String name, double rate, double...amount) {<span>  </span><br /><span>                                            </span>//</span>
				<span style="FONT-FAMILY: 宋体">普通参数在前、可变参数在后</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>double total = 0.0,</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>
						<span>       </span>tax = 0.0;</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>for (double amount : amounts)</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>        </span>total += amount;</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>tax = total </span>
				<span lang="EN-US" style="FONT-FAMILY: 'Times New Roman','serif'; POSITION: relative; TOP: 1.5pt">*</span>
				<span lang="EN-US">
						<span> </span>rate;</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>System.out.println("Name: " + name + "\nTotal: " + total + "\ntax: " + <span></span>tax);</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">}</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">可变参数也可应用在构造器中。例如：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">public class Supper {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>public Supper(char...characters) {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>...</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>}</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">在子类中，可以覆盖这个构造器，如：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">class SubClass extends Supper {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>public SubClass(char...characters) {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>        </span>...</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>}</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">}</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">但无法在子类中调用超类的这个构造器。</span>
		</div>
		<div class="a">
				<?XML:NAMESPACE PREFIX = V /?>
				<v:rect id="_x0000_s1026" style="MARGIN-TOP: 1.5pt; Z-INDEX: -1; LEFT: 0px; MARGIN-LEFT: 0px; WIDTH: 405.9pt; POSITION: absolute; HEIGHT: 20pt; TEXT-ALIGN: left">
						<v:shadow on="t" offset="4pt,4pt" offset2="-4pt,-4pt">
						</v:shadow>
						<?XML:NAMESPACE PREFIX = W /?>
						<w:anchorlock>
						</w:anchorlock>
				</v:rect>
				<span style="FONT-FAMILY: 黑体">      更多信息</span>
				<span>
						<span> </span>
				</span>
				<span style="FONT-FAMILY: 黑体">可变参数可以用在构造器中，并可以覆盖。</span>
		</div>
		<h3>
				<span lang="EN-US">12.7.3 <span> </span></span>
				<span style="FONT-FAMILY: 宋体">可变参数方法重载</span>
		</h3>
		<div class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">可以对具有可变参数的方法重载。如下例子：</span>
		</div>
		<div class="a1">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void someMethod(int count, double...prices) {</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>//</span>
				<span style="FONT-FAMILY: 宋体">语句体</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>...</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>}</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">void someMethod(double...prices) {<span>              </span>//</span>
				<span style="FONT-FAMILY: 宋体">重载</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>//</span>
				<span style="FONT-FAMILY: 宋体">语句体</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>...</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>}</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">double someMethod(String...names) { <span>            </span>//</span>
				<span style="FONT-FAMILY: 宋体">重载</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>//</span>
				<span style="FONT-FAMILY: 宋体">语句体</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">
						<span>    </span>...</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">}</span>
		</div>
		<div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">
				<span lang="EN-US">...<br /><br />  <span style="FONT-FAMILY: 宋体">对方法</span><span lang="EN-US">someMethod()</span><span style="FONT-FAMILY: 宋体">实行重载。对具有可变参数的方法重载遵循一般方法重载原则。</span><br /><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">enum ColorType {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>WHITE {String getDescription(){</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span><span>        </span>return "</span><span style="FONT-FAMILY: 宋体">有浅白、暗白、和亮白可选</span><span lang="EN-US">";</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>            </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>},</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>SILVER {String getDescription() {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>                </span>return "</span><span style="FONT-FAMILY: 宋体">有银白、银灰、纯银色可选</span><span lang="EN-US">";</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>            </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>},</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>BLACK {String getDescription() {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>                </span>return "</span><span style="FONT-FAMILY: 宋体">有深黑和浅黑可选</span><span lang="EN-US">";</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>            </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>};</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>abstract String getDescription();</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">enum PaymentType {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>CASH("</span><span style="FONT-FAMILY: 宋体">有</span><span lang="EN-US">10%</span><span style="FONT-FAMILY: 宋体">特别优惠</span><span lang="EN-US">"),</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>CREDIT("</span><span style="FONT-FAMILY: 宋体">接受所有信用卡</span><span lang="EN-US">"),</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>LOAN("</span><span style="FONT-FAMILY: 宋体">贷款利息为</span><span lang="EN-US">.56%");</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>final private String payment;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>private PaymentType(String payment) {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span>this. payment = payment;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>public String getPayment() {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span>return payment;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">}</span></div><div class="a1"><span lang="EN-US"><o:p> </o:p></span></div><div class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">另外，在</span><span lang="EN-US">SportCar</span><span style="FONT-FAMILY: 宋体">中，根据用户的选择，加入了对跑车类型、颜色，以及付款方式的处理方法，并且利用可变参数。例如：</span></div><div class="a1"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">class SportCar {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>SportCarType type;<span>                      </span>//</span><span style="FONT-FAMILY: 宋体">创建</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>ColorType color;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>PaymentType payment;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>public SportCar (String...choices) {<span>    </span>//</span><span style="FONT-FAMILY: 宋体">可变参数</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span>type = null;<span>                        </span>//</span><span style="FONT-FAMILY: 宋体">初始化</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>    </span>color = null;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>    </span>payment = null;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span>processInfo(choices);<span>               </span>//</span><span style="FONT-FAMILY: 宋体">调用处理信息方法</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>   </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>   </span>private void processInfo(String[] choices) {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>   </span>if (choices.length == 1) {<span>           </span>//</span><span style="FONT-FAMILY: 宋体">处理跑车类型</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>      </span>processType(choices[0]);</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>    </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>   </span>else if (choices.length == 2) {<span>      </span>//</span><span style="FONT-FAMILY: 宋体">处理跑车类型和颜色</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>     </span>processType(choices[0]);</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>     </span>processColor(choices[1]);</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>   </span><span>     </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>   </span>else if (choices.length == 3) {<span>      </span>//</span><span style="FONT-FAMILY: 宋体">处理跑车类型、颜色和付款方式</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span><span> </span>processType(choices[0]);</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>        </span><span> </span>processColor(choices[1]);</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>     </span>processPayment(choices[2]);</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span>   </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span> </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span> </span>private void processType(String type) {<span>    </span>//</span><span style="FONT-FAMILY: 宋体">处理类型</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span><span>   </span>if (type.equals("P"))</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span><span>       </span>this.type = SportCarType.PORSCHE;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span><span>   </span>else if (type.equals("F"))</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span><span>   </span><span>   </span>this.type = SportCarType.FERRARI;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span><span>   </span>else if(type.equals("J"))</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span><span>       </span>this.type = SportCarType.JAGUAR;</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">...</span></div><div class="a1"><span lang="EN-US"><o:p> </o:p></span></div><div class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">这个类的驱动程序如下：</span></div><div class="a1"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">public class VarargsApp {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>   </span>public static void main( String args[] ) {</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span>SportCar yourCar = new SportCar("P");<span>          </span>//</span><span style="FONT-FAMILY: 宋体">创建一个参数的对象</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span>System.out.println("</span><span style="FONT-FAMILY: 宋体">你要的跑车信息：</span><span lang="EN-US">\n" + yourCar + "\n");</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span>SportCar myCar = new SportCar("J", "S");<span>       </span>//</span><span style="FONT-FAMILY: 宋体">创建两个参数的对象</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span>System.out.println("</span><span style="FONT-FAMILY: 宋体">我要的跑车信息：</span><span lang="EN-US">\n" + myCar + "\n");</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span>SportCar herCar = new SportCar("F", "B", "C");//</span><span style="FONT-FAMILY: 宋体">创建三个参数的对象</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span><span> </span>System.out.println("</span><span style="FONT-FAMILY: 宋体">她要的跑车信息：</span><span lang="EN-US">\n" + herCar + "\n");</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><span>    </span>}</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US">}</span></div><div class="a1"><span lang="EN-US"><o:p> </o:p></span></div><div class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">运行结果如下：</span></div><div class="a1"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">你要的跑车信息：</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">制造国：德国</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">价格：</span><span lang="EN-US">$120,000.00</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">我要的跑车信息：</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">制造国：英国</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">价格：</span><span lang="EN-US">$110,000.00</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">有银白、银灰、纯银色可选</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span lang="EN-US"><o:p> </o:p></span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">她要的跑车信息：</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">制造国</span><span lang="EN-US">: </span><span style="FONT-FAMILY: 宋体">意大利</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">价格：</span><span lang="EN-US">$150,000.00</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">有深黑和浅黑可选</span></div><div class="a0" style="BACKGROUND: rgb(217,217,217); LINE-HEIGHT: 13pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="FONT-FAMILY: 宋体">有</span><span lang="EN-US">10%</span><span style="FONT-FAMILY: 宋体">特别优惠</span></div></span>
		</div>
<img src ="http://www.blogjava.net/gdws/aggbug/282795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2009-06-17 11:18 <a href="http://www.blogjava.net/gdws/articles/282795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAVA实现文件分隔功能[转]</title><link>http://www.blogjava.net/gdws/articles/282038.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Sat, 13 Jun 2009 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/282038.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/282038.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/282038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/282038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/282038.html</trackback:ping><description><![CDATA[以下是我写的几个用JAVA实现将.txt文件分隔成小文件的程序，供大家参考下<br />程序一：<br />/**<br /> * 文件分隔<br /> */<br />package com.basic.io;<br /><br />import java.io.BufferedReader;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.FileReader;<br />import java.io.FileWriter;<br />import java.io.IOException;<br />import java.io.InputStreamReader;<br /><br />/**<br /> * @author Administrator<br /> *<br /> */<br />public class FileSeparator {<br /><br />    /**<br />     * 按字节分隔<br />     * @param sourceFileUrl 源文件路径如：c:/a.txt<br />     * @param targetFileUrl 目标文件路径文件夹(最好在盘符下，我没有创建文件夹)： c:/<br />     */<br />    public void separateFileByByte(String sourceFileUrl, String targetFileUrl) {<br />        File sourceFile = new File(sourceFileUrl);<br />        String sourceFileName = sourceFile.getName().split(".txt")[0]; //获得源文件名称<br />        try {<br />            FileInputStream fis = new FileInputStream(sourceFile); //源文件文件流<br />            int temp;<br />            FileOutputStream fos = null; //目标文件文件流<br />            int size = 0; //记录文件大小<br />            int countFile = 1; //子文件数目<br />            File targetFile = null;<br />            do {<br />               <br />                if (size % 100 == 0) {<br />                    String targetFileName = targetFileUrl + sourceFileName + countFile + ".txt"; //目标文件名称，以源文件名称加数据命名<br />                    targetFile = new File(targetFileName);<br />                    if (fos != null) {<br />                        fos.flush(); //刷新该流的缓冲<br />                        fos.close(); //关闭流<br />                    }<br />                    fos = new FileOutputStream(targetFile);<br />                    countFile++;<br />                }<br />               <br />                temp = fis.read(); //读文件<br />                size++;<br />                fos.write(temp); //写文件<br />               <br />            } while (fis.available()&gt;0);    //判断源文件是否还有流，即有没有读完<br />           <br />            fis.close();<br />            fos.flush();<br />            fos.close();<br />            System.out.println("File separate End!" );<br />        } catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />    }<br />   <br />    /**<br />     * 按字符分隔<br />     * @param sourceFileUrl<br />     * @param targetFileUrl<br />     */<br />    public void separateFileByChar(String sourceFileUrl, String targetFileUrl) {<br />        File sourceFile = new File(sourceFileUrl);<br />        String sourceFileName = sourceFile.getName().split(".txt")[0]; //获得源文件名称<br />        try {<br />            FileReader fr = new FileReader(sourceFile); //源文件文件流<br />            System.out.println("encoding:" + fr.getEncoding());<br />            int temp;<br />            FileWriter fw = null; //目标文件文件流<br />            int size = 0; //记录文件大小<br />            int countFile = 1; //子文件数目<br />            File targetFile = null;<br />            do {<br />               <br />                if (size % 100 == 0) {<br />                    String targetFileName = targetFileUrl + sourceFileName + countFile + ".txt"; //目标文件名称，以源文件名称加数据命名<br />                    targetFile = new File(targetFileName);<br />                    if (fw != null) {<br />                        fw.flush(); //刷新该流的缓冲<br />                        fw.close();//关闭流<br />                    }<br />                    fw = new FileWriter(targetFile);<br />                    countFile++;<br />                }<br />       <br />                temp = fr.read();//读文件<br />                size++;<br />                fw.write(temp);//写文件<br />               <br />            } while (temp != -1);//判断源文件是否还有流，即有没有读完<br />           <br />            fr.close();<br />            fw.flush();<br />            fw.close();<br />            System.out.println("File separate End!" );<br />        } catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />    }<br />   <br />    /**<br />     * @param args<br />     */<br />    public static void main(String[] args) {<br />       <br />        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));<br />        String sourceFileUrl = null;<br />        String targetFileUrl = null;<br />        //输入源文件路径<br />        System.out.println("Source File Url: \t");<br />        try {<br />            sourceFileUrl = br.readLine();<br />        } catch (IOException e) {           <br />            e.printStackTrace();<br />        }<br />        //输入目标文件路径<br />        System.out.println("\nTarget File Url: \t");<br />        try {<br />            targetFileUrl = br.readLine();<br />        } catch (IOException e) {<br />            e.printStackTrace();<br />        }<br />       <br />        System.out.println("Source File: " + sourceFileUrl + "\nTarget File: " + targetFileUrl);<br />        FileSeparator fs = new FileSeparator();<br />        fs.separateFileByByte(sourceFileUrl, targetFileUrl);<br />    }<br /><br />}<br />程序二：<br />/**<br /> * 用缓冲流实现文件分隔<br /> */<br />package com.basic.io;<br /><br />import java.io.*;<br />public class TestBufferStream {<br />  public static void main(String[] args) {<br />    try {<br />      BufferedReader br = new BufferedReader(new FileReader("c:/Java编码规范.txt"));<br />      BufferedWriter bw = null;<br />      String s = null; //单行内容<br />      int countLine = 0; //总行数<br />      int countFile = 1; //子文件数<br />      while((s=br.readLine())!=null){<br />        if (countLine % 50 == 0) { <br />            if (bw != null) {<br />                bw.flush();<br />                bw.close();<br />            }<br />            bw = new BufferedWriter(new FileWriter("c:/Java编码规范" + countFile + ".txt"));<br />            countFile++;           <br />        }<br />        bw.write(s);<br />        bw.newLine();<br />        System.out.println(s);<br />        countLine++;<br />      }<br />      System.out.println("countLine:" + countLine);<br />     <br />      bw.close();<br />      if(countLine != 0){<br />          bw.flush();<br />          bw.close();<br />                <br />      }<br /><br />    } catch (IOException e) { e.printStackTrace();}<br />  }<br />}<br />程序三：<br />/**<br /> * 用字符流实现文件分隔　<br /> */<br />package com.basic.io;<br /><br />import java.io.FileReader;<br />import java.io.FileWriter;<br />import java.io.IOException;<br /><br />/**<br /> * @author Administrator<br /> *<br /> */<br />public class TestFileReader {<br />    public static final int charSize = 1024;<br />    /**<br />     * @param args<br />     */<br />    public static void main(String[] args) {<br />        // TODO Auto-generated method stub<br />        try {<br />            FileReader fr = new FileReader("c:/Java编码规范.txt");<br />            FileWriter fw = null;<br />            char[] bfc = new char[charSize];<br />            int temp; //单个字符<br />            int countWord = 0; //字符数<br />            int countFile = 1; //子文件数<br />            while((temp=fr.read())!=-1){<br />              if (countWord % charSize == 0) {           <br />                  fw = new FileWriter("c:/Java编码规范" + countFile + ".txt");           <br />                  countFile++;<br />              }<br />              bfc[countWord] = (char)temp;<br />             <br />              if (countWord == charSize -1) {<br />                  fw.write(bfc);<br />                  fw.flush();<br />                  fw.close();<br />                  countWord = 0;<br />              }    else {<br />                  countWord++;<br />              }<br /><br />            }<br />            fr.close();<br />            if (countWord &gt; 0) {<br />                fw.write(bfc);<br />                fw.flush();<br />                fw.close();<br />            }<br /><br />          } catch (IOException e) {<br />              e.printStackTrace();<br />          }<br />    }<br /><br />} <br /><img src ="http://www.blogjava.net/gdws/aggbug/282038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2009-06-13 15:31 <a href="http://www.blogjava.net/gdws/articles/282038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web应用程序增加入侵检测功能</title><link>http://www.blogjava.net/gdws/articles/263292.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 01 Apr 2009 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/263292.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/263292.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/263292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/263292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/263292.html</trackback:ping><description><![CDATA[
		<strong>一、简介</strong>
		<p>    在<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a> Web应用程中，特别是网站开发中，我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能，防止非法用户不断的往Web应用中重复发送数据。当然，入侵检测可以用很多方法实现，包括软件、硬件<a class="channel_keylink" href="http://security.chinaitlab.com/List_1291.html" target="_blank">防火墙</a>，入侵检测的策略也很多。在这里我们主要介绍的是<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a> Web应用程序中通过软件的方式实现简单的入侵检测及防御。</p>
		<p>    该方法的实现原理很简单，就是用户访问Web系统时记录每个用户的信息，然后进行对照，并根据设定的策略（比如：1秒钟刷新页面10次）判断用户是否属于恶意刷新。</p>
		<p>    我们的入侵检测程序应该放到所有Java Web程序的执行前，也即若发现用户是恶意刷新就不再继续执行Java Web中的其它部分内容，否则就会失去了意义。这就需要以插件的方式把入侵检测的程序置入Java Web应用中，使得每次用户访问Java Web，都先要到这个入侵检测程序中报一次到，符合规则才能放行。</p>
		<p>    Java Web应用大致分为两种，一种纯JSP（+Java Bean）方式，一种是基于框架（如Struts、EasyJWeb等）的。第一种方式的Java Web可以通过Java Servlet中的Filter接口实现，也即实现一个Filter接口，在其doFilter方法中插入入侵检测程序，然后再web.xml中作简单的配置即可。在基于框架的Web应用中，由于所有应用都有一个入口，因此可以把入侵检测的程序直接插入框架入口引擎中，使框架本身支持入侵检测功能。当然，也可以通过实现Filter接口来实现。</p>
		<p>    在Web框架中，已经置入了简单入侵检测的程序，因此，这里我们以Web框架为例，介绍具体的实现方法及源码，完整的代码可以在Web源码中找到。</p>
		<p>    在基于EasyJWeb的Java Web应用中，默认情况下你只要连续刷新页面次数过多，即会弹出如下的错误：</p>
		<p>
		</p>
		<p>    <em>Web框架友情提示!:-):</em></p>
		<p>    <em>您对页面的刷新太快,请等待60秒后再刷新页面!</em></p>
		<p>    <strong>二、用户访问信息记录UserConnect.java类</strong></p>
		<p>    这个类是一个简单的Java Bean，主要代表用户的信息，包括用户名、IP、第一次访问时间、最后登录时间、登录次数、用户状态等。全部</p>
		<p>    代码如下：<br /></p>
		<p align="left">package com.web;</p>
		<p align="left">import java.util.Date;<br />public class UserConnect {<br />private String userName;<br />private String ip;<br />private Date firstFailureTime;<br />private Date lastLoginTime;<br />private int failureTimes;//用户登录失败次数<br />private int status=0;//用户状态0表示正常,-1表示锁定<br />public int getFailureTimes() {<br />return failureTimes; <br />}<br />public void setFailureTimes(int failureTimes) {<br />this.failureTimes = failureTimes; <br />}<br />public Date getFirstFailureTime() {<br />return firstFailureTime; <br />} 
</p>
		<p align="left">
		</p>
		<p align="left">public void setFirstFailureTime(Date firstFailureTime) {<br />this.firstFailureTime = firstFailureTime;<br />}</p>
		<p align="left">public String getIp() {<br />return ip;<br />}</p>
		<p align="left">public void setIp(String ip) {<br />this.ip = ip;<br />}</p>
		<p align="left">public Date getLastLoginTime() {<br />return lastLoginTime;<br />}</p>
		<p align="left">public void setLastLoginTime(Date lastLoginTime) {<br />this.lastLoginTime = lastLoginTime;<br />}</p>
		<p align="left">public String getUserName() {<br />return userName;<br />}</p>
		<p align="left">public void setUserName(String userName) {<br />this.userName = userName;<br />}</p>
		<p align="left">public int getStatus() {<br />return status;<br />}</p>
		<p align="left">public void setStatus(int status) {<br />this.status = status;<br />}</p>
		<p align="left">}<br />  <strong>三、监控线程UserConnectManage.java类</strong></p>
		<p>    这是入侵检测的核心部分，主要实现具体的入侵检测、记录、判断用户信息、在线用户的刷新等功能，并提供其它应用程序使用本组件的调用接口。<br /></p>
		<p align="left">package com.web;</p>
		<p align="left">import java.util.Date;<br />import java.util.HashMap;<br />import java.util.HashSet;<br />import java.util.Iterator;<br />import java.util.Map;<br />import java.util.Set;</p>
		<p align="left">import org.apache.log4j.Logger;<br />/**<br />*<br />* 
</p>
		<p align="left">Title:用户入侵检测信息</p>
		<div align="left">
				<br />* </div>
		<p align="left">Description:用于判断用户刷新情况检查，默认为10秒钟之内连续连接10次为超时</p>
		<div align="left">*/<br />public class UserConnectManage {<br />private static final Logger logger = (Logger) Logger.getLogger(UserConnectManage.class.getName());<br />private static int maxFailureTimes=10;//最大登录失败次数<br />private static long maxFailureInterval=10000;//毫秒，达到最大登录次数且在这个时间范围内<br />private static long waitInterval=60000;//失败后接受连接的等待时间，默认1分钟<br />private static int maxOnlineUser=200;//同时在线的最大数<br />private final static Map users=new HashMap();//使用ip+userName为key存放用户登录信息UserLoginAuth<br />private static Thread checkThread=null;<br />private static class CheckTimeOut implements Runnable{ <br />private Thread parentThread;<br />public  CheckTimeOut(Thread parentThread) <br />{ <br />this.parentThread=parentThread;  <br />synchronized(this){ <br />if(checkThread==null){    <br />checkThread= new Thread(this); <br />//System.out.println( "创建一个新线程！");<br />checkThread.start();    <br />} <br />} <br />}  <br />public void run() {   <br />while(true) <br />{ <br />if(parentThread.isAlive()){ <br />try{ <br />Thread.sleep(2000); <br />int i=0; <br />if(users.size() &gt;maxOnlineUser)//当达到最大用户数时清除<br />{ <br />synchronized(users){//执行删除操作 <br />Iterator it=users.keySet().iterator(); <br />Set set=new HashSet(); <br />Date now=new Date(); <br />while(it.hasNext()) <br />{ <br />Object key=it.next(); <br />UserConnect user=(UserConnect)users.get(key); <br />if(now.getTime()-user.getFirstFailureTime().getTime() &gt;maxFailureInterval)//删除超时的用户<br />{       <br />set.add(key); <br />logger.info( "删除了一个超时的连接"+i);<br />i++; <br />} <br />} <br />if(i &lt;5)//如果删除少于5个，则强行删除1/2在线记录，牺牲性能的情况下保证内存<br />{ <br />int num=maxOnlineUser/2; <br />it=users.keySet().iterator(); <br />while(it.hasNext() &amp;&amp; i<num)><br />{       <br />set.add(it.next()); <br />logger.info( "删除了一个多余的连接"+i);<br />i++; <br />} <br />} <br />users.keySet().removeAll(set); <br />} <br />} <br />} <br />catch(Exception e) <br />{ <br />e.printStackTrace(); <br />} <br />} <br />else <br />{    <br />break; <br />} <br />} <br />logger.info( "监视程序运行结束！"); <br />} <br />}<br />//通过checkLoginValidate判断是否合法的登录连接，如果合法则继续，非法则执行<br />public static boolean checkLoginValidate(String ip,String userName)//只检查认证失败次数<br />{<br />boolean ret=true; <br />Date now=new Date();  <br />String key=ip+ ":"+userName;<br />UserConnect auth=(UserConnect)users.get(key); <br />if(auth==null)//把用户当前的访问信息加入到users容器中 <br />{ <br />auth=new UserConnect(); <br />auth.setIp(ip); <br />auth.setUserName(userName); <br />auth.setFailureTimes(0); <br />auth.setFirstFailureTime(now); <br />users.put(key,auth);   <br />if(checkThread==null)new CheckTimeOut(Thread.currentThread()); <br />}  <br />else <br />{ <br />if(auth.getFailureTimes() &gt;maxFailureTimes)<br />{ <br />//如果在限定的时间间隔内，则返回拒绝用户连接的信息 <br />if((now.getTime()-auth.getFirstFailureTime().getTime()) <maxfailureinterval)><br />{ <br />ret=false; <br />auth.setStatus(-1); <br />} <br />else  if(auth.getStatus()==-1 &amp;&amp; (now.getTime()-auth.getFirstFailureTime().getTime()&lt;(maxFailureInterval+waitInterval)))//重置计数器<br />{ <br />ret=false; <br />} <br />else     <br />{     <br />auth.setFailureTimes(0); <br />auth.setFirstFailureTime(now); <br />auth.setStatus(0); <br />} <br />} <br />//登录次数加1 <br />auth.setFailureTimes(auth.getFailureTimes()+1); <br />} <br />//System.out.println(key+ ":"+auth.getFailureTimes()+":"+ret+":"+(now.getTime()-auth.getFirstFailureTime().getTime()));<br />return ret; <br />} </maxfailureinterval)></num)></div>
		<p align="left">
		</p>
		<p align="left">public static void reset(String ip,String userName)//重置用户信息<br />{ <br />Date now=new Date();  <br />String key=ip+ ":"+userName;<br />UserConnect auth=(UserConnect)users.get(key); <br />if(auth==null)//把用户当前的访问信息加入到users容器中 <br />{ <br />auth=new UserConnect(); <br />auth.setIp(ip); <br />auth.setUserName(userName); <br />auth.setFailureTimes(0); <br />auth.setFirstFailureTime(now); <br />users.put(key,auth); <br />}  <br />else <br />{ <br />auth.setFailureTimes(0); <br />auth.setFirstFailureTime(now); <br />} <br />}<br />public static void remove(String ip,String userName)//删除用户在容器中的记录<br />{<br />String key=ip+ ":"+userName;<br />users.remove(key); <br />}<br />public static void clear()//清空容器中内容<br />{<br />if(!users.isEmpty())users.clear(); <br />}<br />public static long getMaxFailureInterval() {<br />return maxFailureInterval; <br />}</p>
		<p align="left">public static void setMaxFailureInterval(long maxFailureInterval) {<br />UserConnectManage.maxFailureInterval = maxFailureInterval;<br />}</p>
		<p align="left">public static int getMaxFailureTimes() {<br />return maxFailureTimes;<br />}</p>
		<p align="left">public static void setMaxFailureTimes(int maxFailureTimes) {<br />UserConnectManage.maxFailureTimes = maxFailureTimes;<br />}</p>
		<p align="left">public static int getMaxOnlineUser() {<br />return maxOnlineUser;<br />}</p>
		<p align="left">public static void setMaxOnlineUser(int maxOnlineUser) {<br />UserConnectManage.maxOnlineUser = maxOnlineUser;<br />}</p>
		<p align="left">public static long getWaitInterval() {<br />return waitInterval;<br />}</p>
		<p align="left">public static void setWaitInterval(long waitInterval) {<br />UserConnectManage.waitInterval = waitInterval;<br />}<br /><strong>四、调用接口</strong></p>
		<p>    在需要进入侵检测判断的地方，直接使用UserConnectManage类中的checkLoginValidate方法即可。如Web的核心 Servletcom.web.ActionServlet 中调用UserConnectManage的代码：<br /> if(!UserConnectManage.checkLoginValidate(request.getRemoteAddr(),"guest"))<br />{            <br />info(request,response,new Exception("您对页面的刷新太快,请等待"+UserConnectManage.getWaitInterval()/1000+"秒后再刷新页面！"));<br />return;<br />}  <br /><strong>五、总结</strong></p>
		<p>    当然，这里提供的方法只是一个简单的实现示例，由于上面的用户信息是直接保存在内存中，若并发用户很大的时候的代码的占用，可以考虑引入数据库来记录用户的访问信息，当然相应的执行效率肯定用降低。上面介绍的实现中，入侵检测判断的策略也只有用户访问次数及时间间隔两个元素，您还可以根据你的实现情况增加其它的检测元素<br /></p>
<img src ="http://www.blogjava.net/gdws/aggbug/263292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2009-04-01 10:36 <a href="http://www.blogjava.net/gdws/articles/263292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用log4j记录日志</title><link>http://www.blogjava.net/gdws/articles/263160.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Tue, 31 Mar 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/263160.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/263160.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/263160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/263160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/263160.html</trackback:ping><description><![CDATA[
		<p>如何使用log4j记录日志<br />第一步：在工程中加入log4j所使用的jar文件<br />1:项目 &gt; <wbr> 属性 ：弹出项目的属性窗口<br />2:Java构建路径&gt;?库&gt;?添加外部JAR：弹出选择JAR的窗口<br />3:通过选择JAR的窗口，找到log4j-1.2.x.jar，并确认<br />4:回到项目的属性窗口，点击确定<br />第二步：创建log4j.properties文件<br />1:选择欲使用log4j的项目&gt;?右键点击src &gt;?新建&gt;?其他 ：弹出选择向导窗口<br />2:在选择向导窗口中，选择常规?&gt; 文件?&gt; 下一步：弹出新建文件的窗口<br />3:在新建文件窗口中，输入文件名log4j.properties ? 完成：创建工作结束<br />第三步：使用log4j记录日志信息</wbr></p>
		<p>import org.apache.log4j.Logger;</p>
		<p>public class Log4j {<br /> <wbr> <wbr> <wbr> public static void main(String[] args) {<br /> <wbr> <wbr> Logger logger = Logger.getLogger(AccpTeacherLog4j.class.getName());//获取日志记录器，这个记录器将负责控制日志信息<br /> <wbr> <wbr>try {<br /> <wbr> <wbr>logger.debug("设置教员的编号。");//使用Logger对象的debug、info方法输出日志信息<br /> <wbr> <wbr>} catch (IllegalArgumentException<wbr> ex) {<br /> <wbr> <wbr>logger.info(ex.getMessage());//使用Logger对象的debug、info方法输出日志信息<br /> <wbr> <wbr> }<br /> <wbr> <wbr>  <wbr> }<br />}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></p>
		<p>第四步：编写log4j.properties文件，配置日志信息</p>
		<p>### 把日志信息输出到控制台 ###<br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender//日志信息将写到控制台<br />log4j.appender.stdout.Target=System.out//信息打印到System.out上 <wbr><br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} <wbr> %m%n//指定输出格式：显示日期和log信息 <wbr></wbr></wbr></wbr></p>
		<p>### 把日志信息输出到文件：accp.log ###<br />log4j.appender.file=org.apache.log4j.FileAppender//日志信息将写到文件中 <wbr><br />log4j.appender.file.File=accp.log//指定日志输出的文件名 <wbr><br />log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} <wbr> %l <wbr> %m%n//指定输出格式：显示日期，日志发生位置和日志信息</wbr></wbr></wbr></wbr></p>
		<p>### 设置优先级别、以及输出源 ###<br />log4j.rootLogger=debug, stdout, file//设置优先级别为debug、<br />日志被输出到多个输出源</p>
		<p>注：优先级从高到低分别是ERROR、WARN、INFO、DEBUG<br />在此处，如果优先级别设为info，那么使用debug方法打印的日志信息将不被输出</p>
<img src ="http://www.blogjava.net/gdws/aggbug/263160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2009-03-31 16:24 <a href="http://www.blogjava.net/gdws/articles/263160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat上创建和发布Web应用</title><link>http://www.blogjava.net/gdws/articles/263153.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Tue, 31 Mar 2009 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/263153.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/263153.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/263153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/263153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/263153.html</trackback:ping><description><![CDATA[
		<p>          本文详细介绍TOMCAT服务器上的应用，介绍如何在Tomcat上创建和发布Web应用。这里首先讲解Tomcat的目录结构以及Web应用的目录结构，接着介绍如何将HTML、Servlet、JSP和Tag Library部署到Web应用中，然后介绍把整个Web应用打包并发布的方法，最后介绍如何在Tomcat上配置虚拟主机。<br /><br />本章侧重于讨论Web应用的结构和发布方法，所以没有对本章的Servlet和JSP的例子进行详细解释，关于Servlet和JSP的技术可以分别参考其它章节的内容。<br /><br />2.1 Tomcat的目录结构<br /><br />在Tomcat上发布Web应用之前，首先要了解Tomcat的目录结构。Tomcat的目录结构参见表2-1，这些目录都是的子目录。<br /><br />表2-1 Tomcat的目录结构</p>
		<center>
				<table border="1">
						<tbody>
								<tr>
										<td>目 录</td>
										<td>描 述</td>
								</tr>
								<tr>
										<td>/bin</td>
										<td>存放在Windows平台 以及Linux平台上启动 和关闭Tomcat的脚本文件</td>
								</tr>
								<tr>
										<td>/conf</td>
										<td>存放Tomcat服务器的各种配置文件， 其中最重要的配置文件是server.xml</td>
								</tr>
								<tr>
										<td>/server</td>
										<td>包含3个子目录: classes、lib和webapps</td>
								</tr>
								<tr>
										<td>/server/lib</td>
										<td>存放Tomcat服务器所需的各种JAR文件</td>
								</tr>
								<tr>
										<td>/server/webapps</td>
										<td>存放Tomcat自带的两个Web应用: admin应用和manager应用</td>
								</tr>
								<tr>
										<td>/common/lib</td>
										<td>存放Tomcat服务器以及所有 Web应用都可以访问的JAR文件</td>
								</tr>
								<tr>
										<td>/shared/lib</td>
										<td>存放所有Web应用都可以访问的JAR文件</td>
								</tr>
								<tr>
										<td>/logs</td>
										<td>存放Tomcat的日志文件</td>
								</tr>
								<tr>
										<td>/webapps</td>
										<td>当发布Web应用时， 默认情况下把Web应用 文件放于此目录下</td>
								</tr>
								<tr>
										<td>/work</td>
										<td>Tomcat把由JSP生成的 Servlet放于此目录下</td>
								</tr>
						</tbody>
				</table>
		</center>
		<br />
		<br />从表2-1可以看出，在/server/lib目录、/common/lib和/shared/lib目录下都可以放JAR文件，它们的区别在于：<br /><br />在/server/lib目录下的JAR文件只可被Tomcat服务器访问<br /><br />在/shared/lib目录下的JAR文件可以被所有的Web应用访问，但不能被Tomcat服务器访问<br /><br />在/common/lib目录下的JAR文件可以被Tomcat服务器和所有Web应用访问<br /><br />此外，对于下面将要介绍的Java Web应用，在它的WEB-INF目录下，也可以建立lib子目录，在lib子目录下可以放各种JAR文件，这些JAR文件只能被当前Web应用访问。<br /><br />在以上提到的lib目录下都只接受JAR文件，如果类压缩文件为ZIP文件，应该将它展开，重新打包为JAR文件再拷贝到lib目录中。如果直接将ZIP文件拷贝到lib目录，则会发现Tomcat服务器仍然找不到相关的类。打包命令参见2.2.8节。<br /><br />2.2 创建和发布Web应用<br /><br />Java Web应用由一组静态HTML页、Servlet、JSP和其他相关的class组成。每种组件在Web应用中都有固定的存放目录。Web应用的配置信息存放在web.xml文件中。在发布某些组件（如Servlet）时，必须在web.xml文件中添加相应的配置信息。<br /><br />2.2.1 Web应用的目录结构<br /><br />Web应用具有固定的目录结构，这里假定开发一个名为helloapp的Web应用。首先，应该在/webapps目录下创建这个Web应用的目录结构，参见表2-2。<br /><br />表2-2 Web应用的目录结构<br /><br /><center><table border="1"><tbody><tr><td>目 录</td><td>描 述</td></tr><tr><td>/helloapp</td><td>Web应用的根目录， 所有的JSP和HTML文件 都存放于此目录下</td></tr><tr><td>/helloapp/WEB-INF</td><td>存放Web应用的发布描述文件web.xml</td></tr><tr><td>/helloapp/WEB-INF/classes</td><td>存放各种class文件， Servlet类文件也放于此目录下</td></tr><tr><td>/helloapp/WEB-INF/lib</td><td>存放Web应用所需的各种JAR文件</td></tr></tbody></table></center><br /><br />例如，在这个目录下，可以存放JDBC驱动程序的JAR文件<br /><br />从表2-2中，我们看到在classes以及lib子目录下，都可以存放Java类文件。在运行过程中，Tomcat的类装载器先装载classes目录下的类，再装载lib目录下的类。因此，如果两个目录下存在同名的类，classes目录下的类具有优先权。<br /><br />本章介绍的helloapp应用的目录结构如图2-1所示，helloapp应用在Windows资源管理器中的展开如图2-2所示。<br /><br />在helloapp应用中创建了如下组件：<br /><br />HTML组件：index.htm<br /><br />JSP组件：login.jsp和hello.jsp<br /><br />Servlet组件：DispatcherServlet<br /><br />这些组件之间的链接关系为：<br /><br />index.htm→login.jsp→DispatcherServlet→hello.jsp<br /><br /><br /><br />2.2.2 web.xml文件<br /><br />Java Web应用通过一个基于XML的发布描述符文件来配置其发布信息，这个文件名为web.xml，它存放于WEB-INF子目录下。在附录B中将详细介绍web.xml的配置方法，在附录C中将介绍XML的基本知识。在web.xml文件中可包含如下配置信息：<br /><br />Servlet的定义<br /><br />Servlet的初始化参数<br /><br />Servlet以及JSP的映射<br /><br />安全域配置参数<br /><br />welcome文件清单<br /><br />资源引用<br /><br />环境变量的定义<br /><br />现在，创建一个默认的web.xml文件，并把这个文件放到WEB-INF目录中。<br /><br /><center><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3 //EN' 'http://java.sun.com/ j2ee/dtds/web-app_2_3.dtd'&gt;<br />&lt;web-app&gt;&lt;/web-app&gt;</pre></td></tr></tbody></table></center><br /><br />以上web.xml文件的第一行指定了XML的版本和字符编码，第二行DOCTYPE指定文档类型，接下来声明了一个元素，所有关于Web应用的配置元素都将加入到这个元素中。<br /><br />2.2.3 在server.xml中加入元素<br /><br />元素是/conf/server.xml中使用最频繁的元素，它代表了运行在上的单个Web应用。一个中可以有多个元素。每个Web应用必须有惟一的URL路径，这个URL路径在元素的path属性中设定。例如，在名为"localhost"的元素中加入如下元素：<br /><br /><center><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre>&lt;!-- Define the default virtual host --&gt;<br />&lt;Host name="localhost" debug="0" appBase="webapps"unpackWARs="true" autoDeploy="true"&gt;<br />…………<br />&lt;Context path="/helloapp"docBase="helloapp" debug="0"reloadable="true"/&gt;<br />&lt;/Host&gt;</pre></td></tr></tbody></table></center><br /><br />Context元素的各个属性的说明参见表2-3。<br /><br />表2-3 Context元素的属性<br /><br /><center><table border="1"><tbody><tr><td>属 性</td><td>描 述</td></tr><tr><td>path</td><td>指定访问该Web应用的URL入口</td></tr><tr><td>docBase</td><td>指定Web应用的文件路径，可以给定绝对路径，也可以给定相对于Host的appBase属性的相对路径（关于Host的appBase属性参见2.3节）。如果Web应用采用开放目录结构，则指定Web应用的根目录；如果Web应用是个WAR文件，则指定WAR文件的路径</td></tr><tr><td>reloadable</td><td>如果这个属性设为true， Tomcat服务器在运行状态下会监视在WEB-INF/classes 和WEB-INF/lib目录下class文件的改动。如果监测到有class文件被更新，服务器会自动重新加载Web应用</td></tr></tbody></table></center><br /><br />在开发阶段，将reloadable属性设为true，有助于调试Servlet和其他的class文件。但是由于这一功能会加重服务器的运行负荷，因此建议在Web应用的产品发布阶段，将这个属性设为false。<img src ="http://www.blogjava.net/gdws/aggbug/263153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2009-03-31 16:15 <a href="http://www.blogjava.net/gdws/articles/263153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse快捷键指南</title><link>http://www.blogjava.net/gdws/articles/253483.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 06 Feb 2009 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/253483.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/253483.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/253483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/253483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/253483.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">作用域 功能 快捷键 <br />全局 查找并替换 Ctrl+F <br />文本编辑器 查找上一个 Ctrl+Shift+K <br />文本编辑器 查找下一个 Ctrl+K <br />全局 撤销 Ctrl+Z <br />全局 复制 Ctrl+C <br />全局 恢复上一个选择 Alt+Shift+↓ <br />全局 剪切 Ctrl+X <br />全局 快速修正 Ctrl1+1 <br />全局 内容辅助 Alt+/ <br />全局 全部选中 Ctrl+A <br />全局 删除 Delete <br />全局 上下文信息 Alt+？<br />Alt+Shift+?<br />Ctrl+Shift+Space <br />Java编辑器 显示工具提示描述 F2 <br />Java编辑器 选择封装元素 Alt+Shift+↑ <br />Java编辑器 选择上一个元素 Alt+Shift+← <br />Java编辑器 选择下一个元素 Alt+Shift+→ <br />文本编辑器 增量查找 Ctrl+J <br />文本编辑器 增量逆向查找 Ctrl+Shift+J <br />全局 粘贴 Ctrl+V <br />全局 重做 Ctrl+Y <br /><br /> <br />查看<br />作用域 功能 快捷键 <br />全局 放大 Ctrl+= <br />全局 缩小 Ctrl+- <br /><br /> <br />窗口<br />作用域 功能 快捷键 <br />全局 激活编辑器 F12 <br />全局 切换编辑器 Ctrl+Shift+W <br />全局 上一个编辑器 Ctrl+Shift+F6 <br />全局 上一个视图 Ctrl+Shift+F7 <br />全局 上一个透视图 Ctrl+Shift+F8 <br />全局 下一个编辑器 Ctrl+F6 <br />全局 下一个视图 Ctrl+F7 <br />全局 下一个透视图 Ctrl+F8 <br />文本编辑器 显示标尺上下文菜单 Ctrl+W <br />全局 显示视图菜单 Ctrl+F10 <br />全局 显示系统菜单 Alt+- <br /><br /> <br />导航<br />作用域 功能 快捷键 <br />Java编辑器 打开结构 Ctrl+F3 <br />全局 打开类型 Ctrl+Shift+T <br />全局 打开类型层次结构 F4 <br />全局 打开声明 F3 <br />全局 打开外部javadoc Shift+F2 <br />全局 打开资源 Ctrl+Shift+R <br />全局 后退历史记录 Alt+← <br />全局 前进历史记录 Alt+→ <br />全局 上一个 Ctrl+, <br />全局 下一个 Ctrl+. <br />Java编辑器 显示大纲 Ctrl+O <br />全局 在层次结构中打开类型 Ctrl+Shift+H <br />全局 转至匹配的括号 Ctrl+Shift+P <br />全局 转至上一个编辑位置 Ctrl+Q <br />Java编辑器 转至上一个成员 Ctrl+Shift+↑ <br />Java编辑器 转至下一个成员 Ctrl+Shift+↓ <br />文本编辑器 转至行 Ctrl+L <br /><br /> <br />搜索<br />作用域 功能 快捷键 <br />全局 出现在文件中 Ctrl+Shift+U <br />全局 打开搜索对话框 Ctrl+H <br />全局 工作区中的声明 Ctrl+G <br />全局 工作区中的引用 Ctrl+Shift+G <br /><br /> <br />文本编辑<br />作用域 功能 快捷键 <br />文本编辑器 改写切换 Insert <br />文本编辑器 上滚行 Ctrl+↑ <br />文本编辑器 下滚行 Ctrl+↓ <br /><br /> <br />文件<br />作用域 功能 快捷键 <br />全局 保存 Ctrl+X <br />Ctrl+S <br />全局 打印 Ctrl+P <br />全局 关闭 Ctrl+F4 <br />全局 全部保存 Ctrl+Shift+S <br />全局 全部关闭 Ctrl+Shift+F4 <br />全局 属性 Alt+Enter <br />全局 新建 Ctrl+N <br /><br /> <br />项目<br />作用域 功能 快捷键 <br />全局 全部构建 Ctrl+B <br /><br /> <br />源代码<br />作用域 功能 快捷键 <br />Java编辑器 格式化 Ctrl+Shift+F <br />Java编辑器 取消注释 Ctrl+\ <br />Java编辑器 注释 Ctrl+/ <br />Java编辑器 添加导入 Ctrl+Shift+M <br />Java编辑器 组织导入 Ctrl+Shift+O <br />Java编辑器 使用try/catch块来包围 未设置，太常用了，所以在这里列出,建议自己设置。<br />也可以使用Ctrl+1自动修正。 <br /><br /> <br />运行<br />作用域 功能 快捷键 <br />全局 单步返回 F7 <br />全局 单步跳过 F6 <br />全局 单步跳入 F5 <br />全局 单步跳入选择 Ctrl+F5 <br />全局 调试上次启动 F11 <br />全局 继续 F8 <br />全局 使用过滤器单步执行 Shift+F5 <br />全局 添加/去除断点 Ctrl+Shift+B <br />全局 显示 Ctrl+D <br />全局 运行上次启动 Ctrl+F11 <br />全局 运行至行 Ctrl+R <br />全局 执行 Ctrl+U <br /><br /> <br />重构<br />作用域 功能 快捷键 <br />全局 撤销重构 Alt+Shift+Z <br />全局 抽取方法 Alt+Shift+M <br />全局 抽取局部变量 Alt+Shift+L <br />全局 内联 Alt+Shift+I <br />全局 移动 Alt+Shift+V <br />全局 重命名 Alt+Shift+R <br />全局 重做 Alt+Shift+Y <br /></font>
<img src ="http://www.blogjava.net/gdws/aggbug/253483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2009-02-06 08:51 <a href="http://www.blogjava.net/gdws/articles/253483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(七)</title><link>http://www.blogjava.net/gdws/articles/219380.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219380.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219380.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219380.html</trackback:ping><description><![CDATA[61.你们的每个人都了解项目的商业意义么？<br />      <br />      要。这是Vision的意思。别把项目只当成工作。有时候要想着自己是在为中国某某行业的信息化作先驱者，或者时不时的告诉team member，这个项目能够为某某某国家部门每年节省多少多少百万的纳税人的钱，这样就有动力了。平凡的事情也是可以有个崇高的目标的。<br />      <br />      62.产品各部分的界面和操作习惯一致么？<br />      <br />      要这样。要让用户觉得整个程序好像是一个人写出来的那样。<br />      <br />      63.有可以作为宣传亮点的Cool Feature么？<br />      <br />      要。这是增强团队凝聚力、信心的。而且，“一俊遮百丑”，有亮点就可以掩盖一些问题。这样，对于客户来说，会感觉产品从质量角度来说还是acceptable的。或者说，cool feature或者说亮点可以作为质量问题的一个事后弥补措施。<br />      <br />      64.尽可能缩短产品的启动时间要这样。<br />      <br />      软件启动时间（Start-Up time）是客户对性能好坏的第一印象。<br />      <br />      65.不要过于注重内在品质而忽视了第一眼的外在印象。<br />      <br />      程序员容易犯这个错误：太看重性能、稳定性、存储效率，但忽视了外在感受。而高层经理、客户正相反。这两方面要兼顾，协调这些是PM的工作。<br />      <br />      66.你们根据详细产品功能说明书做开发么？<br />      <br />      要这样。要有设计才能开发，这是必须的。设计文档，应该说清楚这个产品会怎么运行，应该采取一些讲故事的方法。设计的时候千万别钻细节，别钻到数据库、代码等具体实现里面去，那些是后面的事情，一步步来不能着急。<br />      <br />      67.开始开发和测试之前每个人都仔细审阅功能设计么？<br />      <br />      要做。Function Spec review是用来统一思想的。而且，review过以后形成了一致意见，将来再也没有人可以说“你看，当初我就是反对这么设计的，现在吃苦头了吧！”<br />      <br />      68.所有人都始终想着The Whole Image么？<br />      <br />      要这样。项目里面每个人虽然都只是在制造一片叶子，但每个人都应该知道自己在制造的那片叶子所在的树是怎么样子的。我反对软件蓝领，反对过分的把软件制造看成流水线、车间。参见第61条。<br />      <br />      69.Dev工作的划分是单纯纵向或横向的么？<br />      <br />      不能单纯的根据功能模块分，或者单纯根据表现层、中间层、数据库层分。我推荐这么做：首先根据功能模块分，然后每个“层”都有一个Owner来Review所有人的设计和代码，保证consistency。<br />      <br />      70.你们的程序员写程序设计说明文档么？<br />      <br />      要。不过我听说微软的程序员1999年以前也不写。所以说，写不写也不是绝对的，偷懒有时候也是可以的。参见第56条。<br />      <br />      71.你在招人面试时让他写一段程序么？<br />      <br />      要的。我最喜欢让人做字符串和链表一类的题目。这种题目有很多循环、判断、指针、递归等，既不偏向过于考算法，也不偏向过于考特定的API。<br /><br />           <br />    72.你们有没有技术交流讲座？<br />    <br />    要的。每一两个礼拜搞一次内部的Tech Talk或者Chalk Talk吧。让组员之间分享技术心得，这笔花钱送到外面去培训划算。<br />    <br />    73.你们的程序员都能专注于一件事情么？<br />    <br />    要让程序员专注一件事。例如说，一个部门有两个项目和10个人，一种方法是让10个人同时参加两个项目，每个项目上每个人都花50%时间；另一种方法是5个人去项目A，5个人去项目B，每个人都100%在某一个项目上。我一定选后面一种。这个道理很多人都懂，但很多领导实践起来就把属下当成可以任意拆分的资源了。<br />    <br />    74.你们的程序员会夸大完成某项工作所需要的时间么？<br />    <br />    会的，这是常见的，尤其会在项目后期夸大做某个change所需要的时间，以次来抵制change。解决的方法是坐下来慢慢磨，磨掉程序员的逆反心理，一起分析，并把估算时间的颗粒度变小。<br />    <br />    75.尽量不要用Virtual Heads最好不要用Virtual Heads。<br />    <br />    Virtual heads意味着resource is not secure，shared resource会降低resource的工作效率，容易增加出错的机会，会让一心二用的人没有太多时间去review spec、review design。一个dedicated的人，要强过两个只能投入50%时间和精力的人。我是吃过亏的：7个part time的tester，发现的Bug和干的活，加起来还不如两个full-time的。参见第73条。73条是针对程序员的，75条是针对Resource Manager的。 <br /><img src ="http://www.blogjava.net/gdws/aggbug/219380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:09 <a href="http://www.blogjava.net/gdws/articles/219380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(六)</title><link>http://www.blogjava.net/gdws/articles/219379.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219379.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219379.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219379.html</trackback:ping><description><![CDATA[51.你们是否随便抓一些人来做易用性测试？<br />      <br />      要这么做。自己看自己写的程序界面，怎么看都是顺眼的。这叫做审美疲劳——臭的看久了也就不臭了，不方便的永久了也就习惯了。<br />      <br />      52.你对自动测试的期望正确么？<br />      <br />      别期望太高。依我看，除了性能测试以外，还是暂时先忘掉“自动测试”吧，忘掉WinRunner和LoadRunner吧。对于国内的软件测试的现状来说，只能“矫枉必须过正”了。<br />      <br />      53.你们的性能测试是等所有功能都开发完才做的么？<br />      <br />      不能这样。性能测试不能被归到所谓的“系统测试”阶段。早测早改正，早死早升天。<br />      <br />      54.你注意到测试中的杀虫剂效应了么？<br />      <br />      虫子有抗药性，Bug也有。发现的新Bug越来越少是正常的。这时候，最好大家交换一下测试的area，或者用用看其他工具和手法，就又会发现一些新bug了。<br />      <br />      55.你们项目组中有人能说出产品的当前整体质量情况么？<br />      <br />      要有。当老板问起这个产品目前质量如何，Test Lead/Manager应该负责回答。<br />      <br />      56.你们有单元测试么？<br />      <br />      单元测试要有的。不过没有单元测试也不是不可以，我做过没有单元测试的项目，也做成功了——可能是侥幸，可能是大家都是熟手的关系。还是那句话，软件工程是非常实践、非常工程、非常灵活的一套方法，某些方法在某些情况下会比另一些方法好，反之亦然。<br />      <br />      57.你们的程序员是写完代码就扔过墙的么？<br />      <br />      大忌。写好一块程序以后，即便不做单元测试，也应该自己先跑一跑。虽然有了专门的测试人员，做开发的人也不可以一点测试都不做。微软还有Test Release Document的说法，程序太烂的话，测试有权踢回去。<br />      <br />      58.你们的程序中所有的函数都有输入检查么？<br />      <br />      不要。虽然说做输入检查是write secure code的要点，但不要做太多的输入检查，有些内部函数之间的参数传递就不必检查输入了，省点功夫。同样的道理，未必要给所有的函数都写注释。写一部分主要的就够了。<br />      <br />      59.产品有统一的错误处理机制和报错界面么？<br />      <br />      要有。最好能有统一的error message，然后每个error message都带一个error number。<br />      <br />      这样，用户可以自己根据error number到user manual里面去看看错误的具体描述和可能原因，就像SQL Server的错误那样。同样，ASP.NET也要有统一的Exception处理。可以参考有关的Application Block。<br />      <br />      60.你们有统一的代码书写规范么？<br />      <br />      要有。Code Convention很多，搞一份来发给大家就可以了。当然，要是有FxCop这种工具来检查代码就更好了。<img src ="http://www.blogjava.net/gdws/aggbug/219379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:08 <a href="http://www.blogjava.net/gdws/articles/219379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(五)</title><link>http://www.blogjava.net/gdws/articles/219378.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219378.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219378.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219378.html</trackback:ping><description><![CDATA[41.通过Email进行所有正式沟通<br />       <br />       Email的好处是免得抵赖。但也要避免矫枉过正，最好的方法是先用电话和当面说，然后Email来确认。<br />       <br />       42.为项目组建立多个Mailing Group <br />       <br />       如果在AD+Exchange里面，就建Distribution List。比如，我会建ABC Project Core Team，ABC Project Dev Team，ABC Project All Testers，ABC Project Extended Team等等。这样发起Email来方便，而且能让该收到email的人都收到、不该收到不被骚扰。 <br />       <br />       43.每个人都知道哪里可以找到全部的文档么？<br />       <br />       应该每个人都知道。这叫做知识管理（Knowledge Management）。最方便的就是把文档放在一个集中的File Share，更好的方法是用Sharepoint。 <br />       <br />       44.你做决定、做变化时，告诉大家原因了么？<br />       <br />       要告诉大家原因。Empower team member的手段之一是提供足够的information，这是MSF一开篇的几个原则之一。的确如此，tell me why是人之常情，tell me why了才能有understanding。中国人做事喜欢搞限制，限制信息，似乎能够看到某一份文件的人就是有身份的人。大错特错。权威、权力，不在于是不是能access information/data，而在于是不是掌握资源。<br />       <br />       45.Stay agile and expect change要这样。<br />       <br />       需求一定会变的，已经写好的代码一定会被要求修改的。做好心理准备，对change不要抗拒，而是expect change。
<p>      46.你们有没有专职的软件测试人员？<br />      <br />      要有专职测试。如果人手不够，可以peer test，交换了测试。千万别自己测试自己的。<br />      <br />      47.你们的测试有一份总的计划来规定做什么和怎么做么？<br />      <br />      这就是Test Plan。要不要做性能测试？要不要做Usability测试？什么时候开始测试性能？测试通过的标准是什么？用什么手段，自动的还是手动的？这些问题需要用TestPlan来回答。<br />      <br />      48.你是先写Test Case然后再测试的么？<br />      <br />      应该如此。应该先设计再编程、先test case再测试。当然，事情是灵活的。我有时候在做第一遍测试的同时补上test case。至于先test case再开发，我不喜欢，因为不习惯，太麻烦，至于别人推荐，那试试看也无妨。<br />      <br />      49.你是否会为各种输入组合创建测试用例？<br />      <br />      不要，不要搞边界条件组合。当心组合爆炸。有很多test case工具能够自动生成各种边界条件的组合——但要想清楚，你是否有时间去运行那么多test case。<br />      <br />      50.你们的程序员能看到测试用例么？<br />      <br />      要。让Dev看到Test Case吧。我们都是为了同一个目的走到一起来的：提高质量。</p><img src ="http://www.blogjava.net/gdws/aggbug/219378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:07 <a href="http://www.blogjava.net/gdws/articles/219378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(四)</title><link>http://www.blogjava.net/gdws/articles/219377.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219377.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219377.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219377.html</trackback:ping><description><![CDATA[31.你们的项目组做每日编译么？<br />       <br />       当然要做。有三样东西是软件项目/产品开发必备的：1.bug management;2.source control;3.daily build。 <br />       <br />       32.你们公司有没有积累一个项目风险列表？<br />       <br />       要。Risk Inventory。否则，下个项目开始的时候，又只能拍脑袋分析Risk了。<br />       <br />       33.设计越简单越好。<br />       <br />       设计时候多一句话，将来可能就带来无穷无尽的烦恼。应该从一开始就勇敢的砍。这叫scope management。<br />       <br />       34.尽量利用现有的产品、技术、代码千万别什么东西都自己Coding。<br />       <br />       BizTalk和Sharepoint就是最好的例子，有这两个作为基础，可以把起点提高很多。或者可以尽量多用现成的Control之类的。或者尽量用XML，而不是自己去Parse一个文本文件；尽量用RegExp，而不是自己从头操作字符串，等等等等。这就是“软件复用”的体现。<br />       <br />       35.你们会隔一段时间就停下来夯实代码么？<br />       <br />       要。最好一个月左右一次。传言去年年初Windows组在Stevb的命令下停过一个月增强安全。Btw，“夯”这个字念“hang”，第一声。<br />       <br />       36.你们的项目组每个人都写Daily Report么？<br />       <br />       要写。五分钟就够了，写10句话左右，告诉自己小组的人今天我干了什么。一则为了沟通，二则鞭策自己（要是游手好闲一天，自己都会不好意思写的）。<br />       <br />       37.你们的项目经理会发出Weekly Report么？<br />       <br />       要。也是为了沟通。内容包括目前进度，可能的风险，质量状况，各种工作的进展等。<br />       <br />       38.你们项目组是否至少每周全体开会一次？<br />       <br />       要。一定要开会。程序员讨厌开会，但每个礼拜开会时间加起来至少应该有4小时。包括team meeting, spec review meeting, bug triage meeting。千万别大家闷头写code。<br />       <br />       39.你们项目组的会议、讨论都有记录么？<br />       <br />       会前发meeting request和agenda，会中有人负责主持和记录，会后有人负责发meeting minutes，这都是effective meeting的要点。而且，每个会议都要形成agreements和action items。<br />       <br />       40.其他部门知道你们项目组在干什么么？<br />       <br />       要发一些Newsflash给整个大组织。Show your team’s value。否则，当你坐在电梯里面，其他部门的人问：“你们在干嘛”，你回答“ABC项目”的时候，别人全然不知，那种感觉不太好。<img src ="http://www.blogjava.net/gdws/aggbug/219377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:07 <a href="http://www.blogjava.net/gdws/articles/219377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(三)</title><link>http://www.blogjava.net/gdws/articles/219375.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219375.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219375.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219375.html</trackback:ping><description><![CDATA[21.你们的程序员厌恶修改老的代码么？<br />       <br />       厌恶是正常的。解决方法是组织Code Review，单独留出时间来。XP也是一个方法。<br />       <br />       22.你们项目组有Team Morale Activity么？<br />       <br />       每个月都要搞一次，吃饭、唱歌、Outing、打球、开卡丁车等等，一定要有。不要省这些钱。<br />       <br />       23.你们项目组有自己的Logo么？<br />       <br />       要有自己的Logo。至少应该有自己的Codename。<br />   <br />       24.你们的员工有印有公司Logo的T-Shirt么？<br />       <br />       要有。能增强归属感。当然，T-Shirt要做的好看一些，最好用80支的棉来做。别没穿几次就破破烂烂的。<br />       <br />       25.总经理至少每月参加次项目组会议要的。<br />       <br />       要让team member觉得高层关注这个项目。<br />       <br />       26.你们是给每个Dev开一个分支么？<br />       <br />       反对。Branch的管理以及Merge的工作量太大，而且容易出错。<br />       <br />       27.有人长期不Check-In代码么？<br />       <br />       不可以。对大部分项目来说，最多两三天就应该Check-In。<br />       <br />       28.在Check-In代码时都填写注释了么？<br />       <br />       要写的，至少一两句话，比如“解决了Bug No.225”。如果往高处拔，这也算做“配置审计”的一部分。<br />       <br />       29.有没有设定每天Check-In的最后期限？<br />       <br />       要的，要明确Check-In Deadline。否则会Build Break。<br />       <br />       30.你们能把所有源码一下子编译成安装文件吗？
<p>      要的。这是每日编译（Daily Build）的基础。而且必须要能够做成自动的。<br /></p><img src ="http://www.blogjava.net/gdws/aggbug/219375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:05 <a href="http://www.blogjava.net/gdws/articles/219375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(二)</title><link>http://www.blogjava.net/gdws/articles/219374.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219374.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219374.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219374.html</trackback:ping><description><![CDATA[11.你们的进度表是否反映最新开发进展情况？<br />       <br />       应该反映。但是，应该用Baseline的方法来管理进度表：维护一份稳定的Schedule，再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。<br />       <br />       12.你们的工作量是先由每个人自己估算的么？<br />       <br />       应该让每个人自己估算。要从下而上估算工作量，而不是从上往下分派。除非有其他原因，比如政治任务工期固定等。<br />       <br />       13.你们的开发人员从项目一开始就加班么？<br />       <br />       不要这样。不要一开始就搞疲劳战。从项目一开始就加班，只能说明项目进度不合理。当然，一些对日软件外包必须天天加班，那属于剥削的范畴。<br />       <br />       14.你们的项目计划中Buffer Time是加在每个小任务后面的么？<br />       <br />       不要。Buffer Time加在每个小任务后面，很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。<br />       <br />       15.值得再多花一些时间，从95%做到100%好值得，非常值得。<br />       <br />       尤其当项目后期人困马乏的时候，要坚持。这会给产品带来质的区别。<br />       <br />       16.登记新缺陷时，是否写清了重现步骤？<br />       <br />       要。这属于Dev和Test之间的沟通手段。面对面沟通需要，详细填写Repro Steps也需要。 <br />       <br />       17.写新代码前会把已知缺陷解决么？<br />       <br />       要。每个人的缺陷不能超过10个或15个，否则必须先解决老的bug才能继续写新代码。<br />       <br />       18.你们对缺陷的轻重缓急有事先的约定么？<br />       <br />       必须有定义。Severity要分1、2、3，约定好：蓝屏和Data Lost算Sev 1，Function Error算Sev 2，界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。<br />       <br />       19.你们对意见不一的缺陷有三国会议么？<br />       <br />       必须要有。要有一个明确的决策过程。这类似于CCB(Change Control Board)的概念。 <br />       <br />       20.所有的缺陷都是由登记的人最后关闭的么？<br />       <br />       Bug应该由Opener关闭。Dev不能私自关闭Bug。<img src ="http://www.blogjava.net/gdws/aggbug/219374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:05 <a href="http://www.blogjava.net/gdws/articles/219374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(-)</title><link>http://www.blogjava.net/gdws/articles/219373.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219373.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/219373.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/219373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/219373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/219373.html</trackback:ping><description><![CDATA[本文给出了有效编写软件的75条建议，内容包括工具的使用、协调部门人员间配合、编程过程中的注意事项等。供大家参考！ <br />       <br />       1.你们的项目组使用源代码管理工具了么？<br />       <br />       应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。<br />       <br />       2.你们的项目组使用缺陷管理系统了么？<br />       <br />       应该用。ClearQuest太复杂，我的推荐是BugZilla。<br />       <br />       3.你们的测试组还在用Word写测试用例么？<br />       <br />       不要用Word写测试用例（Test Case）。应该用一个专门的系统，可以是Test Manager，也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。<br />       <br />       4.你们的项目组有没有建立一个门户网站？<br />       <br />       要有一个门户网站，用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现，15分钟就搞定。买不起SPS 2003可以用WSS(Windows Sharepoint Service)。 <br />       <br />       5.你们的项目组用了你能买到最好的工具么？<br />       <br />       应该用尽量好的工具来工作。比如，应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费，所以说是“你能买到最好的”。<br />       <br />       6.你们的程序员工作在安静的环境里么？<br />       <br />       需要安静环境。这点极端重要，而且要保证每个人的空间大于一定面积。<br />       <br />       7.你们的员工每个人都有一部电话么？<br />       <br />       需要每人一部电话。而且电话最好是带留言功能的。当然，上这么一套带留言电话系统开销不小。不过至少每人一部电话要有，千万别搞得经常有人站起来喊：“某某某电话”。《人件》里面就强烈谴责这种做法。<br />       <br />       8.你们每个人都知道出了问题应该找谁么？<br />       <br />       应该知道。任何一个Feature至少都应该有一个Owner，当然，Owner可以继续Dispatch给其他人。<br />       <br />       9.你遇到过有人说“我以为…”么？<br />       <br />       要消灭“我以为”。Never assume anything。 <br />       <br />       10.你们的项目组中所有的人都坐在一起么？<br />       <br />       需要。我反对Virtual Team，也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起，好处多得不得了。<img src ="http://www.blogjava.net/gdws/aggbug/219373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:04 <a href="http://www.blogjava.net/gdws/articles/219373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>排序链树搜索算法在GIS POI关键字搜索中的应用</title><link>http://www.blogjava.net/gdws/articles/218953.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 31 Jul 2008 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/218953.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/218953.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/218953.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/218953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/218953.html</trackback:ping><description><![CDATA[
		<h3>标签</h3>排序 链树 GIS POI 关键字 搜索算法<br /><h3>概念阐述</h3><h4>链树及其相关概念</h4>本来，数据结构教科书中，不存在一种叫做“链树”的数据结构，用Goolge也搜索不到。这种数据结构，是为了在GIS系统中进行POI关键字高速搜索，在n叉树的基础上，改进的一种数据结构，为了论述方便，姑且称之为链树。<br />链树，就是在n叉树的基础上，给每个树节点(包括树根和叶子)，都挂接上一个链表而形成的数据结构。<br />下图就表示一棵典型的链树<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls1-full.jpeg" /><br />图1<br /><br />链树的2个显著特点是：<br />   1. 某树节点所挂接的链表元素，为该树节点的所有子孙节点(如果有)所挂接的链表元素之集合(无重复节点)。<br />   2. 链树的根结点，可以是一个虚拟节点，代表系统中所有实体节点的祖先。这样，就不必要形成链树森林了。图1的根结点就是一个虚拟节点，其余节点都为实体节点。 <br /><h4>排序链树搜索算法</h4>该算法是指，根据关键字序列，从链树根结点出发，在链树中路由，最终找到一个链树路径和关键字序列最大匹配的树节点，然后取其挂接链表的算法。<br />以图1所示之排序链树为例，假定每个树节点的关键字即为其上的标签字符，假如我们需要搜索的关键字序列为“ACI”,那么该算法的执行顺序为：<br />1.从根结点出发，查找关键字为‘A’的树节点。<br />根节点Root下有2个孩子，分别为‘A’和‘X’，因为排序链树节点的所有孩子都按一定规则排序，所以这一步可以使用二分查找来进行，假定Root有n个孩子，那么这一步所花时间为lgn.<br />2.在‘A’的所有孩子中查找关键字为‘C’的孩子。<br />同样用二分查找，假定‘A’有m个孩子，那么这一步所花时间为lgm。<br />3.在‘C’的所有孩子中查找关键字为‘I’的孩子。<br />同样使用二分查找，假定‘C’有p个孩子，那么这一步所花时间为lgp<br />综上，关键字序列为“ACI”的搜索时间为lgn+lgm+lgp。<br />根据链树的特点，有n&gt;=k&gt;=p，所以搜索长度为3的关键字序列的时间复杂度为O(3lgn)，推而广之，我们得到更一般的排序链树搜索算法复杂度:<br />假如关键字序列长度为k，系统中总的实体节点个数为n,那么在排序链树搜索算法的时间复杂度为O(klgn)。<br /><h3>关于POI</h3>在GIS系统中，对于地图上的一个具有详细信息的点，我们称之为POI（Point Of Interest）。比如名称为“北京西单图书大厦”的POI,就包含了该地点的一系列详细信息，这些信息通常有:<br />   1.该POI的名称，这里是“西单图书大厦”<br />   2.该POI的经纬度<br />   3.该POI的地址<br />   4.该POI的类型<br />   5.该POI的描述信息<br />   6.该POI的电话号码<br />   7.该POI的网址<br />   8.该POI的照片<br />   9.该POI的音频，视频<br />   …...<br />通常，一个城市中，就存在千百万个这样的POI。其数据量是相当的巨大。<br /><h4>关于POI的关键字搜索</h4>在GIS相关应用中，都会提供一种最基本的功能，就是根据用户输入的关键字，搜索到和该关键字相关的一系列POI，按照和用户输入字串匹配度由高到底的顺序，把这些POI呈现给用户。因为用户输入的关键字，可能和该POI的名称相关，也可能和该POI的地址，类型名称，描述信息，网址等字段相关。理论上，只要POI的某个字段，或者某几个字段的组合，和用户输入的关键字有关系，那么，这个POI就应该出现在搜索结果列表的合适位置上。<br />比如用户输入的关键字为“北大”，那么搜索出来的POI可能有:<br />  北大荒(名字中包含’北’，‘大’，且这2个字连在一起)<br />  北京大学(名字中包含’北’，‘大’，这2个关键字被隔开了，称之为跳字)<br />  北京邮电大学(名字中包含’北’，‘大’，跳字)<br />  大北窑(名字中包含‘北’,‘大’，但这2个关键字被颠倒了，称之为逆字)<br />  未名湖(地址中含有‘北‘，‘大’二字)<br />  ……<br />当然按照我们一般的思路，北京大学应该排在第一位，因为一般来说，北大指的就是它。所以GIS系统要求在本次搜索中，北京大学应该排在第一位。<br />为了简化问题，本文只限于对POI的名称这一字段进行关键字搜索。也就是说，只把名称字段和用户输入字串有关联的POI搜索出来。<br /><h3>如何在POI关键字搜索中应用链树搜索算法</h3>如何在POI关键字搜索应用链树呢，我们举例来说。假定某城市中存在5个POI,其名称分别是:<br />  北京大学<br />  北京邮电大学<br />  大北窑<br />  未名湖<br />  北大荒<br />那么我们首先要做的工作就是建立排序链树，然后再依据排序链树，进行关键字搜索。<br /><h4>建立排序链树</h4>建立排序链树的工作分成以下几步来做。<br />  1.分别给每个POI编号,指定其ID，如下<br />       北京大学(1)<br />       北京邮电大学(2)<br />       大北窑(3)<br />       未名湖(4)<br />       北大荒(5)<br />每个POI的详细信息，可以存在一个二进制文件(raw data)中，然后再建立一个索引文件，该文件包括5个索引条目，每个条目为一个POI在raw data文件中的偏移量(offset)与长度(size),该POI的索引条目序号(index)，即为该POI的ID，这样，根据该POI的ID,查询索引文件，可以得到其在raw data中的offset和size,进而获取其详细信息。<br />  2.建立一个虚拟节点Root,作为排序链树之根，把所有POI的ID链表挂接在Root上，这些ID按以空字符为关键字进行POI查询的呈现结果为序。<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls2-full.jpeg" /><br />图2<br /><br />可以看到，如果以空字符进行POI关键字查询，输出结果顺序为<br />      北大荒<br />      北京大学<br />      北京邮电大学<br />      大北窑<br />      未名湖<br />很明显，这是按拼音排序的。<br />  3.找出该城市所有POI名称中涉及到的字符集合。<br />在我们的例子中，这个集合包括为:{‘北’，‘大’，‘荒’，‘京’，‘学’，‘邮’，‘电’，‘窑’，‘未’，‘名’，‘湖’},共11个汉字。把该集合中的元素按字符的UNICODE编码大小排序，我们姑且假定排序后的顺序不变。<br />  4.把字符集合中的每一个字符都作为一个树节点之关键字，并且让该树节点成为Root之子。如下图<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls3-full.jpeg" /><br />图3<br /><br />接下来，我们要以每个孩子为根，建立一颗子链树，为了论述方便，本文只讲述以‘北’字为树根的这棵子链树，其他子链树，可以依此类推。<br />  5.对于图3中每个子节点，挂接上一个ID链表，这些ID所代表的POI的名称中，都包含了该树节点所对应的字符。而且这些ID按照以该字符为关键字进行POI查询的呈现结果顺序为序。例如‘北’字形成的链表如下:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls4-full.jpeg" /><br />图4<br /><br />之所以挂接链表是5，1，2，3，是因为我们在以‘北’字进行POI关键字查询时，GIS系统要求我们的输出POI的列表顺序必须是:北大荒，北京大学，北京邮电大学，大北窑这个顺序。<br /><br />  6.对于每一个根节点，构建其子节点列表。构建规则为<br />   a.子节点所代表字符，能和其父节点所代表字符，出现在同一个POI的名称中。<br />   b.子节点列表，按其所代表字符的UNICODE大小排序。<br />比如‘北’字，其子节点列表为:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls5-full.jpeg" /><br />图5<br /><br />在这里，我们假定这几个字的UNICODE排序结果如上图所示。 <br />大家可以看到，11个字符中，基本上所有字符都能和‘北’字组合，除了‘未’，‘名’，‘湖’这3个字符和‘北’字本身，当然，如果有个POI叫“北北 ”，那么‘北’字也会成为其本身的子节点。但是有一点是，父子节点的关键字可以相同，但是兄弟节点的关键字绝对不相同，他们是互斥的.<br />  7.结合父节点和每个子节点，形成每个子节点所挂接的ID链表。构建规则为：<br />  该ID链表所代表的POI列表，即为用户以链树路径作为关键字，查询出来的POI结果列表。<br />比如对于根为‘北’字的链树，到这一步的结果为:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls6-full.jpeg" /><br />图6<br /><br />大家可以看到，对于路径“北大”，所挂接的ID链表为1，5，2，3，也就是<br />        北京大学<br />        北大荒<br />        北京邮电大学<br />        大北窑<br />这个顺序，也就是GIS系统所要求的输出顺序。<br />  8.按照以上规律，继续为第二层节点添加子节点。形成的高度为3的链树如下图所示<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls7-full.jpeg" /><br />图7<br /><br />从上图可以看到，颜色为红色的链树节点已经到达叶子，无法再向下伸展了。 <br />  9.依此类推，还可以继续向下扩展链树。最终的链树深度为6,对应着名称最长的POI节点，也就是“北京邮电大学”，由于篇幅所限，就不再给出图示了。<br />至此，我们的排序链树已经建好了。关于链树的建立，还有几个地方要说明一下:<br />    a.关于ID链表的排序<br />ID链表的顺序，需要我们的POI数据处理程序按照一定的规则来实现，除了通用的一些规则外，还有些特定的简称数据要处理，比如“北大”所对应的POI列表，第一条通常应该是“北京大学”，而不是“北大荒”。  <br />    b.关于排序链树的存储<br />为了加快搜索速度，排序链树森林中的冗余数据很多，所以实现者应该认真考虑文件存储格式，以便节约存储空间。 <br /><h4>根据排序链树，按关键字搜索POI</h4>建立了排序链树之后，我们就可以按排序链树搜索算法，来进行POI关键字查询了。例如用户如果输入的关键字为“北大”2字，先从Root根节点出发，根据关键字序列，逐级向下路由，得到查询结果1,5,2,3。然后根据这些POI ID,从raw data文件中检索出详细信息即可。因为采用了排序链树搜索算法，对于长度为k的关键字，在POI总量为n的情况下，POI关键字查询的时间复杂度为:<br />        T = O(klgn)<br />比一般的时间复杂度为O(kn)的GIS POI关键字搜索算法，搜索速度有了较大的提升。<br /><h3>算法优劣分析</h3>综上分析可知，采用排序链树搜索算法进行POI关键字查询，其优势在于：<br />    * 搜索时间少，时间复杂度为O(klgn)<br />    * 可以让用户边输入，边路由，边搜索，实现实时搜索的功能，对于采用ajax效果的Web GIS来说，犹为合适。<br />    * 此算法对通配符支持友好，比如用户输入的关键字串为“北大*”或者“北?荒”，此算法都能够比较容易的适应。<br />其主要劣势在于其ID链表的数据冗余度较大，而且建树过程比较复杂，对POI数据处理程序的要求比较高。但是因为这些工作都在Server端完成，在目前多核，巨量内存，集群的server端硬件条件下，应该都不是大问题。<br /><h3>作者信息</h3>Jagie,软件开发爱好者,可以通过chen_cwf@163.com与他联系。本文来自于Jagie的google page:http://chencwf.googlepages.com/linktree <br /><img src ="http://www.blogjava.net/gdws/aggbug/218953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-07-31 12:04 <a href="http://www.blogjava.net/gdws/articles/218953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP使用POI读写Excel文件</title><link>http://www.blogjava.net/gdws/articles/170248.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Tue, 25 Dec 2007 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/170248.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/170248.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/170248.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/170248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/170248.html</trackback:ping><description><![CDATA[步骤详解<br />1、在Tomcat安装目录下的webapps目录下新建POI目录，在该目录中建立WEB-INF、并在WEB-INF中建立lib目录。<br />2、从<a href="http://jakarta.apache.org/poi/">http://jakarta.apache.org/poi/</a> 下载POI组件包，将其解压缩到硬盘，找到其中的poi-2.5.1-final-20040804.jar拷贝到应用程序的WEB-INF/lib目录下。<br />3、打开记事本软件，编写生成Excel文件的页面writeexcel.jsp，其代码如下：<br />&lt;%@ page language="java"  contentType ="text/html;charset=gb2312" %&gt; <br /> &lt;%@ page import= "java.util.*,org.apache.poi.hssf.usermodel.HSSFWorkbook,org.apache.poi.hssf.usermodel.HSSFSheet,org.apache.poi.hssf.usermodel.HSSFRow,org.apache.poi.hssf.usermodel.HSSFCell,java.io.* " %&gt; <br /> &lt;% <br />    HSSFWorkbook wb  =   new  HSSFWorkbook();<br />    HSSFSheet sheet  =  wb.createSheet( " sheet1 " );<br />     HSSFRow row  =  sheet.createRow(( short )0);<br />    HSSFCell cell1  =  row.createCell(( short )0);<br />    HSSFCell cell2  =  row.createCell(( short )1);<br />    HSSFCell cell3  =  row.createCell(( short )2);<br />    cell1.setEncoding(( short )1);<br />    cell1.setCellType( 1 );<br />    cell2.setEncoding(( short )1);<br />    cell2.setCellType( 1 );<br />    cell3.setEncoding(( short )1);<br />    cell3.setCellType( 1 );<br />    cell1.setCellValue( " 测试 " );<br />    cell2.setCellValue( " 测试2 " );<br />    cell3.setCellValue( " 测试3 " );<br />     for  ( int i = 0 ; i &lt; 4 ; i ++ )   {<br />         row  =  sheet.createRow(( short ) i  + 1 );<br />        cell1  =  row.createCell(( short )  0 );<br />        cell2  =  row.createCell(( short )  1 );<br />        cell3  =  row.createCell(( short )  2 );<br />        cell1.setEncoding(( short )1);<br />        cell1.setCellType( 1 );<br />        cell2.setEncoding(( short )1);<br />        cell2.setCellType( 1 );<br />        cell3.setEncoding(( short )1);<br />        cell3.setCellType( 1 );<br />        cell1.setCellValue( " ggg " );<br />        cell2.setCellValue( " 00000 " );<br />        cell3.setCellValue( " sun " );<br />    } <br />    String filename=application.getRealPath("/")+"test.xls";<br />    FileOutputStream fo=new FileOutputStream(filename);<br />    wb.write(fo);<br />    out.println("excel 文件生成，存放在"+filename);<br />   <br /> %&gt;<br />4、按下键盘上的【Ctrl】/【S】键,保存该文件，保存在“webapps\POI”目录下。<br />5、双击桌面上的IE浏览器图标 ，然后在浏览器的地址栏中输入<a href="http://127.0.0.1:8080/POI/writeexcel.jsp">http://127.0.0.1:8080/POI/writeexcel.jsp</a>，按键盘上的“回车键 <br />使用POI生成Excel文件<br />6、到该目录下打开生成的Excel文件<br />制作要点<br />在JSP页面中将数据转换成Excel格式是经常使用的一个功能。POI是Apache Jakarta组织的子项目，使用简单方便，功能强大，可以操作Excel、Word等文件。<br />POI组件包中提供了几个类来方便的操作Excel文档：<br />HSSFWorkbook类表示Excel文档中的Book；<br />HSSFSheet类表示Excel文档中的Sheet;<br />HSSFRow类表示Excel文档中的行；<br />HSSFCell类表示Excel文档中的单元格。<br />用POI生成一个新的Excel文件基本步骤如下：<br />1、创建新的Excel工作簿<br />HSSFWorkbook workbook = new HSSFWorkbook();<br />2、创建工作表<br />HSSFSheet sheet = workbook.createSheet();<br />3、在索引0的位置创建行（最顶端的行）<br />HSSFRow row = sheet.createRow((short)0);<br />4、在索引0的位置创建单元格（左上端）<br />HSSFCell cell = row.createCell((short) 0);<br />　　 5、定义单元格类型<br />cell.setCellType(HSSFCell.CELL_TYPE_STRING);<br />6、在单元格中输入一些内容<br />cell.setCellValue("增加值");<br />7、新建一输出文件流并把相应的Excel 工作簿存盘<br />FileOutputStream fOut = new FileOutputStream(outputFile);<br />workbook.write(fOut);<br />fOut.flush();<br />程序关键代码解释<br />生成Excel文件的页面writeexcel.jsp片断代码：<br />&lt;% <br />    //创建新的Excel工作簿<br />    HSSFWorkbook wb  =   new  HSSFWorkbook();<br />    //创建名称为sheet1的工作表<br />    HSSFSheet sheet  =  wb.createSheet( " sheet1 " );<br />    //在索引0的位置创建行<br />    HSSFRow row  =  sheet.createRow(( short )0);<br />    //在索引0的位置创建单元格<br />    HSSFCell cell1  =  row.createCell(( short )0);<br />    HSSFCell cell2  =  row.createCell(( short )1);<br />    HSSFCell cell3  =  row.createCell(( short )2);<br />    //设置每列的属性名<br />    cell1.setEncoding(( short )1);<br />    cell1.setCellType( 1 );<br />    cell2.setEncoding(( short )1);<br />    cell2.setCellType( 1 );<br />    cell3.setEncoding(( short )1);<br />    cell3.setCellType( 1 );<br />    cell1.setCellValue( " 测试 " );<br />    cell2.setCellValue( " 测试2 " );<br />    cell3.setCellValue( " 测试3 " );<br />    //循环生成每行中单元格中的值<br />     for  ( int i = 0 ; i &lt; 4 ; i ++ )   {<br />         row  =  sheet.createRow(( short ) i  + 1 );<br />        cell1  =  row.createCell(( short )  0 );<br />        cell2  =  row.createCell(( short )  1 );<br />        cell3  =  row.createCell(( short )  2 );<br />        cell1.setEncoding(( short )1);<br />        cell1.setCellType( 1 );<br />        cell2.setEncoding(( short )1);<br />        cell2.setCellType( 1 );<br />        cell3.setEncoding(( short )1);<br />        cell3.setCellType( 1 );<br />        cell1.setCellValue( " ggg " );<br />        cell2.setCellValue( " 00000 " );<br />        cell3.setCellValue( " sun " );<br />    } <br />    //将生成的Excle表格保存<br />    String filename=application.getRealPath("/")+"test.xls";<br />    FileOutputStream fo=new FileOutputStream(filename);<br />    wb.write(fo);<br />    out.println("excel 文件生成，存放在"+filename);<br />   <br /> %&gt;<br /><br /><img src ="http://www.blogjava.net/gdws/aggbug/170248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2007-12-25 10:43 <a href="http://www.blogjava.net/gdws/articles/170248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事务处理</title><link>http://www.blogjava.net/gdws/articles/168974.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 20 Dec 2007 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/168974.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/168974.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/168974.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/168974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/168974.html</trackback:ping><description><![CDATA[事务处理是企业应用需要解决的最主要的问题之一。J2EE通过JTA提供了完整的事务管理能力，包括多个事务性资源的管理能力。但是大部分应用都是运行在单一的事务性资源之上（一个数据库），他们并不需要全局性的事务服务。本地事务服务已然足够(比如JDBC事务管理）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;本文并不讨论应该采用何种事务处理方式，主要目的是讨论如何更为优雅地设计事务服务。仅以JDBC事务处理为例。涉及到的DAO，Factory,Proxy,Decorator等模式概念，请阅读相关资料。<br />
&nbsp;&nbsp;&nbsp;&nbsp;也许你听说过，事务处理应该做在service层，也许你也正这样做，但是否知道为什么这样做？为什么不放在DAO层做事务处理。显而易见的原因是业务层接口的每一个方法有时候都是一个业务用例（User&nbsp;Case），它需要调用不同的DAO对象来完成一个业务方法。比如简单地以网上书店购书最后的确定定单为例，业务方法首先是调用BookDAO对象（一般是通过DAO工厂产生），BookDAO判断是否还有库存余量，取得该书的价格信息等，然后调用CustomerDAO从帐户扣除相应的费用以及记录信息，然后是其他服务（通知管理员等）。简化业务流程大概如此:<br />
&nbsp;&nbsp;&nbsp;&nbsp;注意,我们的例子忽略了连接的处理，只要保证同一个线程内取的是相同的连接即可（可用ThreadLocal实现）：&nbsp;<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先是业务接口，针对接口，而不是针对类编程：<br />
<br />
<br />
public&nbsp;interface&nbsp;BookStoreManager{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;buyBook(String&nbsp;bookId,int&nbsp;quantity)throws&nbsp;SystemException;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....其他业务方法&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;接下来就是业务接口的实现类??业务对象：<br />
<br />
<br />
public&nbsp;class&nbsp;BookStoreManagerImpl&nbsp;implements&nbsp;BookStoreManager{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;buyBook(String&nbsp;bookId)throws&nbsp;SystemException{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn=ConnectionManager.getConnection();//获取数据库连接&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;b=false;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setAutoCommit(false);&nbsp;&nbsp;//取消自动提交&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookDAO&nbsp;bookDAO=DAOFactory.getBookDAO();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerDAO&nbsp;customerDAO=DAOFactory.getCustomerDAO();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//尝试从库存中取书&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(BookDAO.reduceInventory(conn,bookId,quantity)){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;price=BookDAO.getPrice(bookId);&nbsp;&nbsp;//取价格&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从客户帐户中扣除price*quantity的费用&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerDAO.reduceAccount(conn,price.multiply(new&nbsp;BigDecimal(quantity));&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;<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;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.commit();&nbsp;&nbsp;&nbsp;//提交事务&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setAutoCommit(true);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(SQLException&nbsp;e){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.rollback();&nbsp;&nbsp;&nbsp;//出现异常，回滚事务&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(true);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;new&nbsp;SystemException(e);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;b;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;然后是业务代表工厂：&nbsp;&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;public&nbsp;final&nbsp;class&nbsp;ManagerFactory&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;BookStoreManager&nbsp;getBookStoreManager()&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BookStoreManagerImpl();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;这样的设计非常适合于DAO中的简单活动，我们项目中的一个小系统也是采用这样的设计方案，但是它不适合于更大规模的应用。首先，你有没有闻到代码重复的&nbsp;bad&nbsp;smell？每次都要设置AutoCommit为false,然后提交，出现异常回滚，包装异常抛到上层，写多了不烦才怪，那能不能消除呢？其次，业务代表对象现在知道它内部事务管理的所有的细节，这与我们设计业务代表对象的初衷不符。对于业务代表对象来说，了解一个与事务有关的业务约束是相当恰当的，但是让它负责来实现它们就不太恰当了。再次，你是否想过嵌套业务对象的场景？业务代表对象之间的互相调用，层层嵌套，此时你又如何处理呢？你要知道按我们现在的方式，每个业务方法都处于各自独立的事务上下文当中(Transaction&nbsp;Context），互相调用形成了嵌套事务，此时你又该如何处理？也许办法就是重新写一遍，把不同的业务方法集中成一个巨无霸包装在一个事务上下文中。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;我们有更为优雅的设计来解决这类问题，如果我们把Transaction&nbsp;Context的控制交给一个被业务代表对象、DAO和其他Component所共知的外部对象。当业务代表对象的某个方法需要事务管理时，它提示此外部对象它希望开始一个事务，外部对象获取一个连接并且开始数据库事务。也就是将事务控制从service层抽离，当web层调用service层的某个业务代表对象时，返回的是一个经过Transaction&nbsp;Context外部对象包装（或者说代理）的业务对象。此代理对象将请求发送给原始业务代表对象，但是对其中的业务方法进行事务控制。那么，我们如何实现此效果呢？答案是JDK1.3引进的动态代理技术。动态代理技术只能代理接口，这也是为什么我们需要业务接口BookStoreManager的原因。<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先，我们引入这个Transaction&nbsp;Context外部对象，它的代码其实很简单，如果不了解动态代理技术的请先阅读其他资料。&nbsp;<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
import&nbsp;java.lang.reflect.InvocationHandler;&nbsp;<br />
import&nbsp;java.lang.reflect.Method;&nbsp;<br />
import&nbsp;java.lang.reflect.Proxy;&nbsp;<br />
<br />
import&nbsp;java.sql.Connection;&nbsp;<br />
<br />
import&nbsp;com.strutslet.demo.service.SystemException;&nbsp;<br />
<br />
public&nbsp;final&nbsp;class&nbsp;TransactionWrapper&nbsp;{&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;装饰原始的业务代表对象，返回一个与业务代表对象有相同接口的代理对象&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Object&nbsp;decorate(Object&nbsp;delegate)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Proxy.newProxyInstance(delegate.getClass().getClassLoader(),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delegate.getClass().getInterfaces(),&nbsp;new&nbsp;XAWrapperHandler(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delegate));&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//动态代理技术&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;final&nbsp;class&nbsp;XAWrapperHandler&nbsp;implements&nbsp;InvocationHandler&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Object&nbsp;delegate;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XAWrapperHandler(Object&nbsp;delegate)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.delegate&nbsp;=&nbsp;delegate;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//简单起见，包装业务代表对象所有的业务方法&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;Throwable&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;null;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;ConnectionManager.getConnection();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始一个事务&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(false);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调用原始业务对象的业务方法&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;method.invoke(delegate,&nbsp;args);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.commit();&nbsp;&nbsp;&nbsp;//提交事务&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(true);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Throwable&nbsp;t)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//回滚&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.rollback();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(true);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;SystemException(t);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;正如我们所见，此对象只不过把业务对象需要事务控制的业务方法中的事务控制部分抽取出来而已。请注意，业务代表对象内部调用自身的方法将不会开始新的事务，因为这些调用不会传给代理对象。如此，我们去除了代表重复的味道。此时，我们的业务代表对象修改成：<br />
<br />
<br />
public&nbsp;class&nbsp;BookStoreManagerImpl&nbsp;implements&nbsp;BookStoreManager&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;buyBook(String&nbsp;bookId)throws&nbsp;SystemException{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn=ConnectionManager.getConnection();//&nbsp;获取数据库连接&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;b=false;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookDAO&nbsp;bookDAO=DAOFactory.getBookDAO();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerDAO&nbsp;customerDAO=DAOFactory.getCustomerDAO();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;尝试从库存中取书&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(BookDAO.reduceInventory(conn,bookId,quantity)){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;price=BookDAO.getPrice(bookId);&nbsp;&nbsp;//&nbsp;取价格&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;从客户帐户中扣除price*quantity的费用&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerDAO.reduceAccount(conn,price.multiply(new&nbsp;BigDecimal(quantity));&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他业务方法，如通知管理员，生成定单等.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(SQLException&nbsp;e){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;new&nbsp;SystemException(e);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;b;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;<br />
}&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;可以看到，此时的业务代表对象专注于实现业务逻辑，它不再关心事务控制细节，把它们全部委托给了外部对象。业务代表工厂也修改一下，让它返回两种类型的业务代表对象：<br />
<br />
<br />
<br />
public&nbsp;final&nbsp;class&nbsp;ManagerFactory&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回一个被包装的对象，有事务控制能力&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;BookStoreManager&nbsp;getBookStoreManagerTrans()&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(BookStoreManager)&nbsp;TransactionWrapper&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.decorate(new&nbsp;BookStoreManagerImpl());&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//原始版本&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;BookStoreManager&nbsp;getBookStoreManager()&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BookStoreManagerImpl();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......&nbsp;<br />
&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;我们在业务代表工厂上提供了两种不同的对象生成方法：一个用于创建被包装的对象，它会为每次方法调用创建一个新的事务；另外一个用于创建未被包装的版本，它用于加入到已有的事务(比如其他业务代表对象的业务方法)，解决了嵌套业务代表对象的问题。<br />
&nbsp;&nbsp;&nbsp;我们的设计还不够优雅，比如我们默认所有的业务代表对象的方法调用都将被包装在一个Transaction&nbsp;Context。可事实是很多方法也许并不需要与数据库打交道，如果我们能配置哪些方法需要事务声明，哪些不需要事务管理就更完美了。解决办法也很简单，一个XML配置文件来配置这些，调用时判断即可。说到这里，了解spring的大概都会意识到这不正是声明式事务控制吗？正是如此，事务控制就是AOP的一种服务，spring的声明式事务管理是通过AOP实现的。AOP的实现方式包括：动态代理技术，字节码生成技术（如CGLIB库），java代码生成（早期EJB采用），修改类装载器以及源代码级别的代码混合织入（aspectj)等。我们这里就是利用了动态代理技术，只能对接口代理；对类的动态代理可以使用cglib库。<br />
<img src ="http://www.blogjava.net/gdws/aggbug/168974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2007-12-20 11:42 <a href="http://www.blogjava.net/gdws/articles/168974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高byte的效率</title><link>http://www.blogjava.net/gdws/articles/168972.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 20 Dec 2007 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/168972.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/168972.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/168972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/168972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/168972.html</trackback:ping><description><![CDATA[在网络编程中,我们经常要组建自己的网络协议,通常我们把数据按照协议组成byte数组,通过byte数组实现客户端与服务器端的通信,我们可能通过两种方法来组这个byte数组:<br />
1、是通过ByteArrayOutputStream：<br />
ByteArrayOutputStream&nbsp;baos=new&nbsp;ByteArrayOutputStream();<br />
baos.write(data.getBytes());<br />
byte&nbsp;[]&nbsp;ret&nbsp;=&nbsp;baos.toByteArray();<br />
2、是通过ByteBuffer：<br />
在使用ByteBuffer时，我们要使用一个小技巧：因为我们发送的数据长度是不固定的，所以我们不能给ByteBuffer分配固定的容量，如果分配固定的容易，一方面可能造成内存的浪费，另外一方面有可能我们写的数据会超出ByteBuffer的容量。所以我们在申请ByteBuffer空间时，先计算其数据长度：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果是byte,short,int,long等类型的数据我们都好计算；<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果是String的话,我们先获取其getBytes()，然后计算其长度。<br />
例子:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;[]&nbsp;bs=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;len&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bs="直播员".getBytes("GBK");<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;len&nbsp;=&nbsp;(byte)&nbsp;bs.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(UnsupportedEncodingException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<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;return&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;datalen=(short)&nbsp;(2+4+4+1+bs.length+4+4+4+1+1);//后续数据长度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;w_buff&nbsp;=&nbsp;ByteBuffer.allocate(datalen+2);//申请ByteBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接下来往ByteBuffer填充数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putShort(Short.reverseBytes(datalen));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;c=0X0416;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putShort(Short.reverseBytes(c));//登录命令号<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putInt(Integer.reverseBytes(111));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putInt(Integer.reverseBytes(2222));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.put(len);//昵称的长度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.put(bs);//昵称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putInt(Integer.reverseBytes(1));//等级<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putInt(Integer.reverseBytes(1));//用户权限<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.putInt(Integer.reverseBytes(1));//用户头像<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;sex=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.put(sex);//用户性别<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;age=20;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_buff.put(age);//用户年龄<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;[]&nbsp;ret=w_buff.array();<br />
<br />
我个人比较喜欢用第二种方法，因为它的效率比第一种要高出一到两倍呢。<br />
而且第二种方法可以不用自己去把short,int,long等类型的数据转换成byte数组（这可是以麻烦的过程呀）。 
<img src ="http://www.blogjava.net/gdws/aggbug/168972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2007-12-20 11:40 <a href="http://www.blogjava.net/gdws/articles/168972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全面解析JDBC &lt;三&gt;</title><link>http://www.blogjava.net/gdws/articles/162179.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 21 Nov 2007 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/162179.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/162179.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/162179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/162179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/162179.html</trackback:ping><description><![CDATA[2.&nbsp;数据库表结构<br />
<br />
　　本实例中主要出现了三个数据库表，表名和字段分别如下所示：<br />
<br />
<br />
　　计划采购表：jhcg_table<br />
<br />
<br />
字段名称&nbsp;中文名称&nbsp;类型&nbsp;长度&nbsp;<br />
Goods_no&nbsp;物品编号&nbsp;vchar&nbsp;10&nbsp;<br />
Goods_name&nbsp;物品名称&nbsp;Vchar&nbsp;50&nbsp;<br />
Amount&nbsp;采购数量&nbsp;Int&nbsp;&nbsp;&nbsp;&nbsp;<br />
Price&nbsp;采购单价&nbsp;float&nbsp;&nbsp;&nbsp;&nbsp;<br />
Gold&nbsp;币种&nbsp;Vchar&nbsp;15&nbsp;<br />
Units&nbsp;单位&nbsp;Vchar&nbsp;10&nbsp;<br />
Date&nbsp;时间&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;<br />
Remark&nbsp;备注&nbsp;vchar&nbsp;100&nbsp;<br />
<br />
　　库存统计表：kctj_table<br />
<br />
<br />
字段名称&nbsp;中文名称&nbsp;类型&nbsp;长度&nbsp;<br />
Goods_no&nbsp;物品编号&nbsp;Vchar&nbsp;10&nbsp;<br />
Goods_name&nbsp;物品名称&nbsp;Vchar&nbsp;50&nbsp;<br />
amount&nbsp;库存数量&nbsp;Int&nbsp;&nbsp;&nbsp;<br />
Date&nbsp;时间&nbsp;Date&nbsp;&nbsp;&nbsp;<br />
<br />
remark&nbsp;备注&nbsp;Vchar&nbsp;100&nbsp;<br />
<br />
　　实际采购表：sjcg_table<br />
<br />
<br />
<br />
字段名称&nbsp;中文名称&nbsp;类型&nbsp;长度&nbsp;<br />
Goods_no&nbsp;物品编号&nbsp;Vchar&nbsp;10&nbsp;<br />
Goods_name&nbsp;&nbsp;物品名称&nbsp;&nbsp;Vchar&nbsp;&nbsp;50&nbsp;<br />
Amount&nbsp;采购数量&nbsp;Int&nbsp;&nbsp;&nbsp;&nbsp;<br />
Price&nbsp;&nbsp;Price&nbsp;采购单价&nbsp;&nbsp;Float&nbsp;&nbsp;&nbsp;<br />
Gold&nbsp;币种&nbsp;Vchar&nbsp;15&nbsp;<br />
Units&nbsp;采购单位&nbsp;Vchar&nbsp;10&nbsp;<br />
Date&nbsp;时间&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;<br />
Remark&nbsp;备注&nbsp;vchar&nbsp;100&nbsp;<br />
<br />
　　其中业务逻辑非常简单，即根据计划采购表和库存统计表生成实际采购表。同时，对各表完成数据库的增、删、改、查等通用操作。<br />
<br />
　　3.&nbsp;JSP设计<br />
<br />
　　①&nbsp;插入操作<br />
<br />
　　完成对数据库表的记录插入功能，其中计划采购表的插入主页面（insert_jhcg.htm）为：<br />
<br />
<br />
<br />
图1&nbsp;计划采购表插入主页面<br />
<br />
　　insert_jhcg.htm将用户输入传送给demo_insert_jhcg.jsp，完成插入操作。改jsp文件的功能代码为：<br />
<br />
<br />
＜html＞<br />
＜body＞<br />
＜jsp：useBean&nbsp;id="DBConn"&nbsp;class="dbaccess.DBConnBean"&nbsp;scope="page"/＞<br />
＜jsp：useBean&nbsp;id="DBBean"&nbsp;class="dbaccess.DBQueryBean"&nbsp;scope="page"/＞<br />
＜hr＞<br />
＜!--test&nbsp;JavaBean--＞<br />
＜%<br />
if&nbsp;（DBConn&nbsp;==&nbsp;null||DBBean&nbsp;==&nbsp;null）{<br />
out.println（"JavaBean&nbsp;not&nbsp;found!"）；<br />
return；<br />
}<br />
%＞<br />
<br />
＜!--try&nbsp;db_demo&nbsp;connection--＞<br />
＜%<br />
try{<br />
DBConn.Connect（）；<br />
}catch（Exception&nbsp;e）{<br />
out.println（e.getMessage（））；<br />
}<br />
%＞<br />
<br />
＜!--execute&nbsp;sql&nbsp;statement--＞<br />
＜%<br />
String&nbsp;insGoodno&nbsp;=&nbsp;request.getParameter（"ed_jhcg_no"）；<br />
String&nbsp;insGoodname&nbsp;=&nbsp;request.getParameter（"ed_jhcg_name"）；<br />
int&nbsp;insAmount&nbsp;=&nbsp;（Integer.valueOf（request.getParameter（"ed_jhcg_amount"）））.intValue（）；<br />
float&nbsp;insPrice&nbsp;=&nbsp;（Float.valueOf（request.getParameter（"ed_jhcg_price"）））.floatValue（）；<br />
String&nbsp;insGold&nbsp;=&nbsp;request.getParameter（"ed_jhcg_gold"）；<br />
String&nbsp;insUnit&nbsp;=&nbsp;request.getParameter（"ed_jhcg_unit"）；<br />
String&nbsp;insRemark&nbsp;=&nbsp;request.getParameter（"ed_jhcg_remark"）；<br />
String&nbsp;sqlStatement&nbsp;=&nbsp;"insert&nbsp;into&nbsp;jhcg_table（good_no，good_name，amount，<br />
price，gold，unit，remark）&nbsp;values（"+"'"+insGoodno+"'"+"，"+"'"+insGoodname+"'"+"，<br />
"+insAmount+"，"+insPrice+"，"+"'"+insGold+"'"+"，"+"'"+insUnit+"'"+"，"+"'"+<br />
insRemark+"'"+"）"；<br />
try{<br />
DBBean.query（sqlStatement）；<br />
}catch（Exception&nbsp;e）{<br />
out.println（e.getMessage（））；<br />
}<br />
%＞<br />
＜a&nbsp;href="demo_main.htm"＞Records&nbsp;inserted...Click&nbsp;here&nbsp;to&nbsp;return＜/a＞＜/p＞&nbsp;<br />
＜/body＞<br />
＜/html＞<br />
&nbsp;<br />
<br />
　　②&nbsp;查询操作<br />
<br />
　　该查询主页面主要提供对三个数据库表的条件查询功能，如下图所示：<br />
<br />
<br />
<br />
图2&nbsp;查询主页面<br />
<br />
　　query.htm将用户选择查询的数据库表和查询条件发送给demo_query.jsp，由jsp文件完成数据库查询操作和查询结果集的返回及显示，其功能代码如下：<br />
<br />
<br />
＜html＞<br />
＜body＞<br />
＜%&nbsp;<br />
String&nbsp;sqlStatement；<br />
String&nbsp;sqlField&nbsp;=&nbsp;""；<br />
String&nbsp;whichTable&nbsp;=&nbsp;""；<br />
String&nbsp;whereClause&nbsp;=&nbsp;""；<br />
String&nbsp;queryNo&nbsp;=&nbsp;""；<br />
String&nbsp;queryName&nbsp;=&nbsp;""；<br />
%＞<br />
＜jsp：useBean&nbsp;id="DBConn"&nbsp;class="dbaccess.DBConnBean"&nbsp;scope="page"/＞<br />
＜jsp：useBean&nbsp;id="DBBean"&nbsp;class="dbaccess.DBQueryBean"&nbsp;scope="page"/＞<br />
＜hr＞<br />
＜!--test&nbsp;JavaBean--＞<br />
＜%<br />
if&nbsp;（DBConn&nbsp;==&nbsp;null||DBBean&nbsp;==&nbsp;null）{<br />
out.println（"JavaBean&nbsp;not&nbsp;found!"）；<br />
return；<br />
}<br />
%＞<br />
<br />
＜!--try&nbsp;db_demo&nbsp;connection--＞<br />
＜%<br />
try{<br />
DBConn.Connect（）；<br />
}catch（Exception&nbsp;e）{<br />
out.println（e.getMessage（））；<br />
}<br />
%＞<br />
<br />
＜!--prepare&nbsp;sql&nbsp;statement--＞<br />
＜%&nbsp;<br />
String&nbsp;queryRequest&nbsp;=&nbsp;request.getParameter（"rb_request"）；<br />
//out.println（"queryRequest："+queryRequest）；<br />
String&nbsp;whichCB&nbsp;=&nbsp;""；<br />
if&nbsp;（queryRequest.equals（"1"））{<br />
whichCB&nbsp;=&nbsp;"ck_jhcg"；<br />
whichTable&nbsp;=&nbsp;"jhcg_table"；<br />
queryNo&nbsp;=&nbsp;request.getParameter（"ed_jhcg_no"）；<br />
queryName&nbsp;=&nbsp;request.getParameter（"ed_jhcg_name"）；<br />
if&nbsp;（!queryNo.equals（""））<br />
whereClause&nbsp;=&nbsp;"&nbsp;where&nbsp;good_no="+"'"+queryNo+"'"；<br />
if&nbsp;（!queryName.equals（""））{<br />
if&nbsp;（!queryNo.equals（""））<br />
whereClause&nbsp;+=&nbsp;"&nbsp;and&nbsp;good_name="+"'"+queryName+"'"；<br />
else&nbsp;whereClause&nbsp;=&nbsp;"&nbsp;where&nbsp;good_name="+"'"+queryName+"'"；<br />
}&nbsp;<br />
}<br />
if&nbsp;（queryRequest.equals（"2"））{<br />
whichCB&nbsp;=&nbsp;"ck_kctj"；<br />
whichTable&nbsp;=&nbsp;"kctj_table"；<br />
queryNo&nbsp;=&nbsp;request.getParameter（"ed_kctj_no"）；<br />
queryName&nbsp;=&nbsp;request.getParameter（"ed_kctj_name"）；<br />
if&nbsp;（!queryNo.equals（""））<br />
whereClause&nbsp;=&nbsp;"&nbsp;where&nbsp;good_no="+"'"+queryNo+"'"；<br />
if&nbsp;（!queryName.equals（""））{<br />
if&nbsp;（!queryNo.equals（""））<br />
whereClause&nbsp;+=&nbsp;"&nbsp;and&nbsp;good_name="+"'"+queryName+"'"；<br />
else&nbsp;whereClause&nbsp;=&nbsp;"&nbsp;where&nbsp;good_name="+"'"+queryName+"'"；<br />
}<br />
<br />
}<br />
if&nbsp;（queryRequest.equals（"3"））{<br />
whichCB&nbsp;=&nbsp;"ck_sjcg"；<br />
whichTable&nbsp;=&nbsp;"sjcg_table"；<br />
queryNo&nbsp;=&nbsp;request.getParameter（"ed_sjcg_no"）；<br />
queryName&nbsp;=&nbsp;request.getParameter（"ed_sjcg_name"）；<br />
if&nbsp;（!queryNo.equals（""））<br />
whereClause&nbsp;=&nbsp;"&nbsp;where&nbsp;good_no="+"'"+queryNo+"'"；<br />
if&nbsp;（!queryName.equals（""））{<br />
if&nbsp;（!queryNo.equals（""））<br />
whereClause&nbsp;+=&nbsp;"&nbsp;and&nbsp;good_name="+"'"+queryName+"'"；<br />
else&nbsp;whereClause&nbsp;=&nbsp;"&nbsp;where&nbsp;good_name="+"'"+queryName+"'"；<br />
}<br />
<br />
}<br />
String[]&nbsp;printTitle&nbsp;=&nbsp;request.getParameterValues（whichCB）；&nbsp;<br />
<br />
%＞<br />
＜!--create&nbsp;query&nbsp;sql&nbsp;statement--＞<br />
＜%<br />
sqlStatement&nbsp;=&nbsp;"select&nbsp;"；<br />
for（int&nbsp;i&nbsp;=&nbsp;0；i＜printTitle.length；i++）{<br />
sqlField&nbsp;+=&nbsp;printTitle[i]+"，"；<br />
}<br />
sqlStatement&nbsp;+=&nbsp;sqlField.substring（0，sqlField.length（）-1）+"&nbsp;from&nbsp;"+whichTable；<br />
if&nbsp;（!whereClause.equals（""））<br />
sqlStatement&nbsp;+=&nbsp;whereClause；<br />
%＞<br />
＜!--show&nbsp;query&nbsp;response--＞<br />
＜%<br />
try{<br />
DBBean.query（sqlStatement）；<br />
}catch（Exception&nbsp;e）{<br />
out.println（"Database&nbsp;Error!"）；<br />
}<br />
int&nbsp;rows&nbsp;=&nbsp;DBBean.getRowcount（）；<br />
int&nbsp;cols&nbsp;=&nbsp;DBBean.getColumncount（）；<br />
%＞<br />
＜Table&nbsp;align="center"&nbsp;width="80%"&nbsp;border=1＞<br />
＜tr&nbsp;align=center＞&nbsp;<br />
＜%<br />
for（int&nbsp;i&nbsp;=&nbsp;0；i&nbsp;＜&nbsp;printTitle.length；i++）{<br />
out.println（"＜td＞＜b＞"）；<br />
out.println（printTitle[i]）；<br />
out.println（"＜/b＞＜/td＞"）；<br />
}<br />
%＞<br />
＜/tr＞&nbsp;<br />
＜%<br />
for&nbsp;（int&nbsp;i&nbsp;=&nbsp;0；i&nbsp;＜&nbsp;rows；i++）{<br />
out.println（"＜tr＞"）；<br />
for&nbsp;（int&nbsp;j&nbsp;=&nbsp;0；j&nbsp;＜&nbsp;cols；j++）<br />
out.println（"＜td＞"+DBBean.get（i，j）+"＜/td＞"）；<br />
out.println（"＜/tr＞"）；&nbsp;<br />
}<br />
%＞<br />
＜/Table＞<br />
＜br＞<br />
＜hr＞<br />
＜a&nbsp;href="demo_main.htm"＞Click&nbsp;here&nbsp;to&nbsp;return＜/a＞＜/p＞&nbsp;<br />
＜/body＞<br />
＜/html＞<br />
&nbsp;<br />
<br />
　　③&nbsp;生成实际采购表<br />
<br />
　　生成数据库表是一个隐式操作，程序根据计划采购表和库存统计表的相应字段生成实际采购表，不需要用户的任何输入，其功能代码如下（demo_create.jsp）：<br />
<br />
<br />
＜%@page&nbsp;import="Java.util.*"%＞<br />
＜html＞<br />
＜body＞<br />
＜jsp：useBean&nbsp;id="DBConn"&nbsp;class="dbaccess.DBConnBean"&nbsp;scope="page"/＞<br />
＜jsp：useBean&nbsp;id="DBBean"&nbsp;class="dbaccess.DBQueryBean"&nbsp;scope="page"/＞<br />
＜hr＞<br />
＜!--test&nbsp;JavaBean--＞<br />
＜%<br />
if&nbsp;（DBConn&nbsp;==&nbsp;null||DBBean&nbsp;==&nbsp;null）{<br />
out.println（"JavaBean&nbsp;not&nbsp;found!"）；<br />
return；<br />
}<br />
%＞<br />
<br />
＜!--try&nbsp;db_demo&nbsp;connection--＞<br />
＜%<br />
try{<br />
DBConn.Connect（）；<br />
}catch（Exception&nbsp;e）{<br />
out.println（e.getMessage（））；<br />
}<br />
%＞<br />
<br />
＜!--prepare&nbsp;sql&nbsp;statement--＞<br />
＜%&nbsp;<br />
int&nbsp;amount_jhcg，amount_kctj；<br />
Vector&nbsp;updateRs&nbsp;=&nbsp;new&nbsp;Vector（）；<br />
DBBean.query（"delete&nbsp;*&nbsp;from&nbsp;sjcg_table"）；&nbsp;//delete&nbsp;all&nbsp;old&nbsp;records&nbsp;in&nbsp;sjcg_table<br />
DBBean.query（"select&nbsp;jhcg_table.good_no，jhcg_table.good_name，jhcg_table.amount，kctj_table.amount，jhcg_table.unit&nbsp;from&nbsp;jhcg_table&nbsp;left&nbsp;join&nbsp;kctj_table&nbsp;on&nbsp;kctj_table.good_no=jhcg_table.good_no"）；<br />
int&nbsp;rows&nbsp;=&nbsp;DBBean.getRowcount（）；<br />
int&nbsp;cols&nbsp;=&nbsp;DBBean.getColumncount（）；<br />
for&nbsp;（int&nbsp;i&nbsp;=&nbsp;0；i&nbsp;＜&nbsp;rows；i++）{<br />
String&nbsp;record[]&nbsp;=&nbsp;new&nbsp;String[4]；<br />
record[0]&nbsp;=&nbsp;DBBean.get（i，0）；<br />
record[1]&nbsp;=&nbsp;DBBean.get（i，1）；<br />
amount_jhcg&nbsp;=&nbsp;（Integer.valueOf（DBBean.get（i，2）））.intValue（）；<br />
if&nbsp;（DBBean.get（i，3）&nbsp;==&nbsp;null）&nbsp;amount_kctj&nbsp;=&nbsp;0；<br />
else&nbsp;amount_kctj&nbsp;=&nbsp;（Integer.valueOf（DBBean.get（i，3）））.intValue（）；&nbsp;<br />
record[2]&nbsp;=&nbsp;Integer.toString（amount_jhcg&nbsp;-&nbsp;amount_kctj）；<br />
record[3]&nbsp;=&nbsp;DBBean.get（i，4）；<br />
updateRs.addElement（record）；&nbsp;<br />
}<br />
for&nbsp;（int&nbsp;i&nbsp;=&nbsp;0；i&nbsp;＜&nbsp;rows；i++）{<br />
String&nbsp;insRecord[]&nbsp;=&nbsp;（String&nbsp;[]）updateRs.elementAt（i）；<br />
String&nbsp;insGoodno，insGoodname，insUnit，insAmount；<br />
insGoodno&nbsp;=&nbsp;insRecord[0]；<br />
insGoodname&nbsp;=&nbsp;insRecord[1]；<br />
insAmount&nbsp;=&nbsp;insRecord[2]；<br />
insUnit&nbsp;=&nbsp;insRecord[3]；<br />
String&nbsp;sqlStatement&nbsp;=&nbsp;"insert&nbsp;into&nbsp;sjcg_table（good_no，good_name，amount，unit）&nbsp;values?quot;+"'"+insGoodno+"'"+"，"+"'"+insGoodname+"'"+"，"+insAmount+"，"+"'"+insUnit+"'"+"）"；<br />
DBBean.query（sqlStatement）；<br />
DBBean.query（"delete&nbsp;*&nbsp;from&nbsp;sjcg_table&nbsp;where&nbsp;amount＜=0"）；<br />
}&nbsp;<br />
%＞<br />
＜a&nbsp;href="demo_main.htm"＞Database&nbsp;created...Click&nbsp;here&nbsp;to&nbsp;return＜/a＞＜/p＞&nbsp;<br />
＜/body＞<br />
＜/html＞<br />
&nbsp;<br />
<br />
　　上述的开发工具综合应用介绍了基于Java开发电子商务应用系统的全过程，包括应用开发平台搭建、业务流程分析、JavaBean封装和JSP开发等内容，其中JSP开发中涉及到了通用SQL（查询和插入数据库表）和游标操作（生成实际采购表），基本可以完成任何网络数据库应用的需求。本实例基本上可以将前面介绍的基于Java的电子商务开发技术串接起来，指导读者进行电子商务应用开发。<br />
<br />
<br />
如何在JSP中实现分页显示？<br />
<br />
　　分页显示是Web数据库应用中经常需要遇到的问题，当用户的数据库查询结果远远超过了计算机屏幕的显示能力的时候，我们该如何合理的将数据呈现给用户呢？答案就是数据库分页显示，可以完美的解决上述问题。下面是一个数据库分页操作的通用实例，对任何数据库平台上的分页功能都有很好的借鉴意义。<br />
<br />
<br />
＜%@&nbsp;page&nbsp;contentType="text/html;charset=8859_1"&nbsp;%＞<br />
＜%<br />
//变量声明<br />
Java.sql.Connection&nbsp;sqlCon;&nbsp;//数据库连接对象<br />
Java.sql.Statement&nbsp;sqlStmt;&nbsp;//SQL语句对象<br />
Java.sql.ResultSet&nbsp;sqlRst;&nbsp;//结果集对象<br />
<br />
Java.lang.String&nbsp;strCon;&nbsp;//数据库连接字符串<br />
Java.lang.String&nbsp;strSQL;&nbsp;//SQL语句<br />
<br />
int&nbsp;intPageSize;&nbsp;//一页显示的记录数<br />
int&nbsp;intRowCount;&nbsp;//记录总数<br />
int&nbsp;intPageCount;&nbsp;//总页数<br />
int&nbsp;intPage;&nbsp;//待显示页码<br />
Java.lang.String&nbsp;strPage;<br />
<br />
int&nbsp;i;<br />
<br />
//设置一页显示的记录数<br />
intPageSize&nbsp;=&nbsp;2;<br />
<br />
//取得待显示页码<br />
strPage&nbsp;=&nbsp;request.getParameter("page");<br />
if(strPage==null){//表明在QueryString中没有page这一个参数，此时显示第一页数据<br />
intPage&nbsp;=&nbsp;1;<br />
}<br />
else{//将字符串转换成整型<br />
intPage&nbsp;=&nbsp;Java.lang.Integer.parseInt(strPage);<br />
if(intPage＜1)&nbsp;intPage&nbsp;=&nbsp;1;<br />
}<br />
<br />
//装载JDBC驱动程序<br />
Java.sql.DriverManager.registerDriver(new&nbsp;oracle.jdbc.driver.OracleDriver());<br />
<br />
//设置数据库连接字符串<br />
strCon&nbsp;=&nbsp;"jdbc:oracle:thin:@linux:1521:ora4cweb";<br />
<br />
//连接数据库<br />
sqlCon&nbsp;=&nbsp;Java.sql.DriverManager.getConnection(strCon,"hzq","hzq");<br />
<br />
//创建一个可以滚动的只读的SQL语句对象<br />
sqlStmt&nbsp;=&nbsp;sqlCon.createStatement(Java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,Java.sql.ResultSet.CONCUR_READ_ONLY);<br />
<br />
//准备SQL语句<br />
strSQL&nbsp;=&nbsp;"select&nbsp;name,age&nbsp;from&nbsp;test";<br />
<br />
//执行SQL语句并获取结果集<br />
sqlRst&nbsp;=&nbsp;sqlStmt.executeQuery(strSQL);<br />
<br />
//获取记录总数<br />
sqlRst.last();<br />
intRowCount&nbsp;=&nbsp;sqlRst.getRow();<br />
<br />
//记算总页数<br />
intPageCount&nbsp;=&nbsp;(intRowCount+intPageSize-1)&nbsp;/&nbsp;intPageSize;<br />
<br />
//调整待显示的页码<br />
if(intPage＞intPageCount)&nbsp;intPage&nbsp;=&nbsp;intPageCount;<br />
%＞<br />
<br />
＜html＞<br />
＜head＞<br />
＜meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=gb2312"＞<br />
＜title＞JSP数据库操作例程&nbsp;-&nbsp;数据分页显示&nbsp;-&nbsp;JDBC&nbsp;2.0&nbsp;-&nbsp;Oracle＜/title＞<br />
＜/head＞<br />
<br />
＜body＞<br />
<br />
＜table&nbsp;border="1"&nbsp;cellspacing="0"&nbsp;cellpadding="0"＞<br />
＜tr＞<br />
＜th＞姓名＜/th＞<br />
＜th＞年龄＜/th＞<br />
＜/tr＞<br />
<br />
＜%<br />
if(intPageCount＞0){<br />
//将记录指针定位到待显示页的第一条记录上<br />
sqlRst.absolute((intPage-1)&nbsp;*&nbsp;intPageSize&nbsp;+&nbsp;1);<br />
<br />
//显示数据<br />
i&nbsp;=&nbsp;0;<br />
while(i＜intPageSize&nbsp;&amp;&amp;&nbsp;!sqlRst.isAfterLast()){<br />
%＞<br />
＜tr＞<br />
＜td＞＜%=sqlRst.getString(1)%＞＜/td＞<br />
＜td＞＜%=sqlRst.getString(2)%＞＜/td＞<br />
＜/tr＞<br />
＜%<br />
sqlRst.next();<br />
i++;<br />
}<br />
}<br />
%＞<br />
<br />
＜/table＞<br />
<br />
第＜%=intPage%＞页&nbsp;&nbsp;共＜%=intPageCount%＞页<br />
&nbsp;&nbsp;＜%if(intPage＜intPageCount){%＞＜a&nbsp;href="jdbc20-oracle.jsp?page=＜%=intPage+1%＞"＞下一页<br />
＜/a＞＜%}%＞&nbsp;&nbsp;＜%if(intPage＞1){%＞＜a&nbsp;href="jdbc20-oracle.jsp?page=＜%=intPage-1%＞"＞上一页＜/a＞＜%}%＞<br />
<br />
＜/body＞<br />
＜/html＞<br />
<br />
＜%<br />
//关闭结果集<br />
sqlRst.close();<br />
<br />
//关闭SQL语句对象<br />
sqlStmt.close();<br />
<br />
//关闭数据库<br />
sqlCon.close();<br />
%＞<br />
&nbsp;<br />
<br />
附录：JDBC&nbsp;TM技术解析<br />
<br />
　　1.&nbsp;JDBCTM的定义<br />
<br />
　　JDBCTM&nbsp;是一种用于执行&nbsp;SQL&nbsp;语句的&nbsp;JavaTM&nbsp;API，它由一组用&nbsp;Java&nbsp;编程语言编写的类和接口组成。JDBC&nbsp;为工具/数据库开发人员提供了一个标准的API，使他们能够用纯&nbsp;Java&nbsp;API&nbsp;来编写数据库应用程序。<br />
<br />
　　有了&nbsp;JDBC，向各种关系数据库发送&nbsp;SQL&nbsp;语句就是一件很容易的事。换言之，有了&nbsp;JDBC&nbsp;API，就不必为访问&nbsp;Sybase&nbsp;数据库专门写一个程序，为访问&nbsp;Oracle&nbsp;数据库又专门写一个程序，为访问&nbsp;Informix&nbsp;数据库又写另一个程序，等等。您只需用&nbsp;JDBC&nbsp;API&nbsp;写一个程序就够了它可向相应数据库发送&nbsp;SQL&nbsp;语句。而且，使用&nbsp;Java&nbsp;编程语言编写的应用程序，就无须去忧虑要为不同的平台编写不同的应用程序。将Java&nbsp;和&nbsp;JDBC&nbsp;结合起来将使程序员只须写一遍程序就可让它在任何平台上运行。<br />
<br />
　　Java&nbsp;具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性，是编写数据库应用程序的杰出语言。所需要的只是&nbsp;Java应用程序与各种不同数据库之间进行对话的方法。而&nbsp;JDBC&nbsp;正是作为此种用途的机制。<br />
<br />
　　JDBC&nbsp;扩展了&nbsp;Java&nbsp;的功能。例如，用&nbsp;Java&nbsp;和&nbsp;JDBC&nbsp;API&nbsp;可以发布含有&nbsp;applet&nbsp;的网页，而该&nbsp;applet&nbsp;使用的信息可能来自远程数据库企业也可以用&nbsp;JDBC&nbsp;通过&nbsp;Intranet&nbsp;将所有职员连到一个或多个内部数据库中（即使这些职员所用的计算机有&nbsp;Windows、&nbsp;Macintosh&nbsp;和UNIX&nbsp;等各种不同的操作系统）。随着越来越多的程序员开始使用Java&nbsp;编程语言，对从&nbsp;Java&nbsp;中便捷地访问数据库的要求也在日益增加。<br />
<br />
　　MIS&nbsp;管理员们都喜欢&nbsp;Java&nbsp;和&nbsp;JDBC&nbsp;的结合，因为它使信息传播变得容易和经济。企业可继续使用它们安装好的数据库，并能便捷地存取信息，即使这些信息是储存在不同数据库管理系统上。新程序的开发期很短。安装和版本控制将大为简化。程序员可只编写一遍应用程序或只更新一次，然后将它放到服务器上，随后任何人就都可得到最新版本的应用程序。对于商务上的销售信息服务，&nbsp;Java&nbsp;和JDBC&nbsp;可为外部客户提供获取信息更新的更好方法。&nbsp;<br />
<br />
　　2.&nbsp;JDBC&nbsp;的用途<br />
<br />
　　简单地说，JDBC&nbsp;可做三件事：与数据库建立连接、发送&nbsp;SQL&nbsp;语句并处理结果。下列代码段给出了以上三步的基本示例：<br />
<br />
<br />
Connection&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection（"jdbc：odbc：wombat"，"login"，<br />
"password"）；<br />
Statement&nbsp;stmt&nbsp;=&nbsp;con.createStatement（）；<br />
ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery（"SELECT&nbsp;a，&nbsp;b，&nbsp;c&nbsp;FROM&nbsp;Table1"）；<br />
while&nbsp;（rs.next（））&nbsp;{<br />
int&nbsp;x&nbsp;=&nbsp;rs.getInt（"a"）；<br />
String&nbsp;s&nbsp;=&nbsp;rs.getString（"b"）；<br />
float&nbsp;f&nbsp;=&nbsp;rs.getFloat（"c"）；<br />
}&nbsp;<br />
<br />
　　上述代码对基于JDBC的数据库访问做了经典的总结，当然，在本小节的后续部分会对它做详尽的分析讲解。<br />
<br />
　　3.&nbsp;JDBC&nbsp;API<br />
<br />
　　JDBC&nbsp;是个"低级"接口，也就是说，它用于直接调用&nbsp;SQL&nbsp;命令。在这方面它的功能极佳，并比其它的数据库连接&nbsp;API&nbsp;易于使用，但它同时也被设计为一种基础接口，在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口，它使用的是一种更易理解和更为方便的&nbsp;API，这种API在幕后被转换为诸如&nbsp;JDBC&nbsp;这样的低级接口。<br />
<br />
　　在关系数据库的"对象/关系"映射中，表中的每行对应于类的一个实例，而每列的值对应于该实例的一个属性。于是，程序员可直接对&nbsp;Java&nbsp;对象进行操作；存取数据所需的&nbsp;SQL&nbsp;调用将在"掩盖下"自动生成。此外还可提供更复杂的映射，例如将多个表中的行结合进一个&nbsp;Java&nbsp;类中。<br />
<br />
　　随着人们对&nbsp;JDBC&nbsp;的兴趣日益增涨，越来越多的开发人员一直在使用基于&nbsp;JDBC&nbsp;的工具，以使程序的编写更加容易。程序员也一直在编写力图使最终用户对数据库的访问变得更为简单的应用程序。例如应用程序可提供一个选择数据库任务的菜单。任务被选定后，应用程序将给出提示及空白供填写执行选定任务所需的信息。所需信息输入应用程序将自动调用所需的&nbsp;SQL&nbsp;命令。在这样一种程序的协助下，即使用户根本不懂&nbsp;SQL&nbsp;的语法，也可以执行数据库任务。&nbsp;<br />
<br />
　　4.&nbsp;JDBC与ODBC和其它API的比较<br />
<br />
　　目前，Microsoft&nbsp;的&nbsp;ODBC&nbsp;API&nbsp;可能是使用最广的、用于访问关系数据库的编程接口。它能在几乎所有平台上连接几乎所有的数据库。为什么&nbsp;Java&nbsp;不使用&nbsp;ODBC？对这个问题的回答是：Java&nbsp;可以使用&nbsp;ODBC，但最好是在&nbsp;JDBC&nbsp;的帮助下以&nbsp;JDBC-ODBC&nbsp;桥的形式使用，这一点我们稍后再说。现在的问题已变成："为什么需要&nbsp;JDBC"？答案是显然的：ODBC&nbsp;不适合直接在&nbsp;Java&nbsp;中使用，因为它使用&nbsp;C&nbsp;语言接口。从Java&nbsp;调用本地&nbsp;C&nbsp;代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。从&nbsp;ODBC&nbsp;C&nbsp;API&nbsp;到&nbsp;Java&nbsp;API&nbsp;的字面翻译是不可取的。例如，Java&nbsp;没有指针，而&nbsp;ODBC&nbsp;却对指针用得很广泛（包括很容易出错的指针"void&nbsp;*"）。您可以将&nbsp;JDBC&nbsp;想象成被转换为面向对象接口的&nbsp;ODBC，而面向对象的接口对&nbsp;Java&nbsp;程序员来说较易于接收。<br />
<br />
　　ODBC&nbsp;很难学。它把简单和高级功能混在一起，而且即使对于简单的查询，其选项也极为复杂。相反，JDBC&nbsp;尽量保证简单功能的简便性，而同时在必要时允许使用高级功能。启用"纯&nbsp;Java&nbsp;"机制需要象&nbsp;JDBC&nbsp;这样的&nbsp;Java&nbsp;API。如果使用ODBC，就必须手动地将&nbsp;ODBC&nbsp;驱动程序管理器和驱动程序安装在每台客户机上。如果完全用&nbsp;Java&nbsp;编写&nbsp;JDBC&nbsp;驱动程序则&nbsp;JDBC&nbsp;代码在所有&nbsp;Java&nbsp;平台上（从网络计算机到大型机）都可以自&nbsp;动安装、移植并保证安全性。<br />
<br />
　　总之，JDBC&nbsp;API&nbsp;对于基本的&nbsp;SQL&nbsp;抽象和概念是一种自然的&nbsp;Java&nbsp;接口。它建立在&nbsp;ODBC&nbsp;上而不是从零开始。因此，熟悉&nbsp;ODBC&nbsp;的程序员将发现&nbsp;JDBC&nbsp;很容易使用。JDBC&nbsp;保留了&nbsp;ODBC&nbsp;的基本设计特征；事实上，两种接口都基于&nbsp;X/Open&nbsp;SQL&nbsp;CLI（调用级接口）。它们之间最大的区别在于：JDBC&nbsp;以&nbsp;Java&nbsp;风格与优点为基础并进行优化，因此更加易于使用。<br />
<br />
　　目前，Microsoft&nbsp;又引进了&nbsp;ODBC&nbsp;之外的新&nbsp;API：&nbsp;RDO、&nbsp;ADO&nbsp;和OLE&nbsp;DB。这些设计在许多方面与&nbsp;JDBC&nbsp;是相同的，即它们都是面向对象的数据库接口且基于可在&nbsp;ODBC&nbsp;上实现的类。但在这些接口中，我们未看见有特别的功能使我们要转而选择它们来替代&nbsp;ODBC，尤其是在&nbsp;ODBC&nbsp;驱动程序已建立起较为完善的市场的情况下。它们最多也就是在&nbsp;ODBC&nbsp;上加了一种装饰而已。<br />
<br />
　　5.&nbsp;JDBC对B/S和C/S模式的支持<br />
<br />
　　JDBC&nbsp;API&nbsp;既支持数据库访问的两层模型（C/S），同时也支持三层模型（B/S）。在两层模型中，Java&nbsp;applet或应用程序将直接与数据库进行对话。这将需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行&nbsp;通讯。用户的SQL语句被送往数据库中，而其结果将被送回给用户。数据库可以位于另一台计算机上，用户通过网络连接到上面。这就叫做客户机/服务器配置，其中用户的计算机为客户机，提供数据库的计算机为服务器。网络可以是&nbsp;Intranet（它可将公司职员连接起来），也可以是&nbsp;Internet。<br />
<br />
　　在三层模型中，命令先是被发送到服务的"中间层"，然后由它将SQL&nbsp;语句发送给数据库。数据库对&nbsp;SQL&nbsp;语句进行处理并将结果送回到中间层，中间层再将结果送回给用户。MIS&nbsp;主管们都发现三层模型很吸引人，因为可用中间层来控制对公司数据的访问和可作的的更新的种类。中间层的另一个好处是，用户可以利用易于使用的高级API，而中间层将把它转换为相应的低级调用。最后，许多情况下三层结构可提供一些性能上的好处。<br />
<br />
　　到目前为止，中间层通常都用&nbsp;C&nbsp;或&nbsp;C++&nbsp;这类语言来编写，这些语言执行速度较快。然而，随着最优化编译器（它把&nbsp;Java&nbsp;字节代码转换为高效的特定于机器的代码）的引入，用&nbsp;Java&nbsp;来实现中间层将变得越来越实际。这将是一个很大的进步，它使人们可以充分利用&nbsp;Java&nbsp;的诸多优点（如坚固、多线程和安全等特征）。JDBC&nbsp;对于从Java的中间层来访问数据库非常重要。<br />
<br />
　　6.&nbsp;SQL&nbsp;的一致性<br />
<br />
　　结构化查询语言&nbsp;（SQL）&nbsp;是访问关系数据库的标准语言。困难之处在于：虽然大多数的&nbsp;DBMS&nbsp;（数据库管理系统）对其基本功能都使用了标准形式的&nbsp;SQL，但它们却不符合最近为更高级的功能定义的标准&nbsp;SQL&nbsp;语法或语义。例如，并非所有的数据库都支持储存程序或外部连接，那些支持这一功能的数据库又相互不一致。人们希望&nbsp;SQL&nbsp;中真正标准的那部份能够进行扩展以包括越来越多的功能。但同时&nbsp;JDBC&nbsp;API&nbsp;又必须支持现有的&nbsp;SQL。<br />
<br />
　　JDBC&nbsp;API&nbsp;解决这个问题的一种方法是允许将任何查询字符串一直传到所涉及的&nbsp;DBMS&nbsp;驱动程序上。这意味着应用程序可以使用任意多的&nbsp;SQL&nbsp;功能，但它必须冒这样的风险：有可能在某些&nbsp;DBMS&nbsp;上出错。事实上，应用程序查询甚至不一定要是&nbsp;SQL，或者说它可以是个为特定的&nbsp;DBMS&nbsp;设计的&nbsp;SQL&nbsp;的专用派生物（例如，文档或图象查询）。<br />
<br />
　　JDBC&nbsp;处理&nbsp;SQL&nbsp;一致性问题的第二种方法是提供&nbsp;ODBC&nbsp;风格的转义子句，这将在后续部分中讨论。转义语法为几个常见的&nbsp;SQL&nbsp;分歧提供了一种标准的&nbsp;JDBC&nbsp;语法。例如，对日期文字和已储存过程的调用都有转义语法。<br />
<br />
　　对于复杂的应用程序，JDBC&nbsp;用第三种方法来处理&nbsp;SQL&nbsp;的一致性问题它利用&nbsp;DatabaseMetaData&nbsp;接口来提供关于&nbsp;DBMS&nbsp;的描述性信息，从而使应用程序能适应每个&nbsp;DBMS&nbsp;的要求和功能。<br />
<br />
　　由于&nbsp;JDBC&nbsp;API&nbsp;将用作开发高级数据库访问工具和&nbsp;API&nbsp;的基础&nbsp;API，因此它还必须注意其所有上层建筑的一致性。"符合JDBC标准TM"&nbsp;代表用户可依赖的&nbsp;JDBC&nbsp;功能的标准级别。要使用这一说明，驱动程序至少必须支持&nbsp;ANSI&nbsp;SQL-2&nbsp;Entry&nbsp;Level（ANSI&nbsp;SQL-2&nbsp;代表美国国家标准局&nbsp;1992&nbsp;年所采用的标准。Entry&nbsp;Level代表SQL功能的特定清单）。驱动程序开发人员可用&nbsp;JDBC&nbsp;API&nbsp;所带的测试工具包来确定他们的驱动程序是否符合这些标准。<br />
<br />
　　"符合&nbsp;JDBC&nbsp;标准TM"&nbsp;表示提供者的&nbsp;JDBC&nbsp;实现已经通过了JavaSoft&nbsp;提供的一致性测试。这些一致性测试将检查&nbsp;JDBC&nbsp;API中定义的所有类和方法是否都存在，并尽可能地检查程序是否具有SQL&nbsp;Entry&nbsp;Level&nbsp;功能。当然，这些测试并不完全，而且&nbsp;JavaSoft&nbsp;目前也无意对各提供者的实现进行标级。但这种一致性定义的确可对JDBC实现提供一定的可信度。随着越来越多的数据库提供者、连接提供者、Internet&nbsp;提供者和应用程序编程员对&nbsp;JDBC&nbsp;API&nbsp;的接受，JDBC&nbsp;也正迅速成为&nbsp;Java&nbsp;数据库访问的标准。<br />
<br />
<img src ="http://www.blogjava.net/gdws/aggbug/162179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2007-11-21 18:23 <a href="http://www.blogjava.net/gdws/articles/162179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>