﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-一杯清茶</title><link>http://www.blogjava.net/huyi0616/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 16:51:19 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 16:51:19 GMT</pubDate><ttl>60</ttl><item><title>前后端分离架构的实践感悟</title><link>http://www.blogjava.net/huyi0616/archive/2016/05/11/430436.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Wed, 11 May 2016 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2016/05/11/430436.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/430436.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2016/05/11/430436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/430436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/430436.html</trackback:ping><description><![CDATA[前后端架构分离后，前台采用node.js，后端采用API方式请求，在实践中发现了以下几个问题：<br /><ol><li>对前端开发人员的能力和数量要求急剧增大，以前一个开发人员搞定前端、后端，现在前端采用node.js，这个后台开发人员介入不了只能前台去做</li><li>后台开发人员只负责接口开发，注意&#8220;只&#8221;这个字，接口开发人员这时就有了局限性，你前端要什么我是不清楚的，你要什么我就给你开发什么，造成接口数量多，不规范</li><li>接着问题2，前台开发人员需要什么就向后台要，造成原先后台一个接口就可以搞定的事情，前端细分到4-5个接口去做，开发效率低，页面不断请求，性能较差，接口承载的压力也是骤增；</li></ol><p>解决方案：</p><ol><li>现在前端的压力还是比较大，急需增加前端的人员招聘，后端人员也需要转入前端开发，有一定的学习瓶颈和过渡时期；</li><li>需要架构师从统管角度一致协调，避免接口滥用；</li><li>减少接口请求次数，压缩页面接口数，对能够缓存的一些基础数据，在前端增加缓存</li></ol><p>结果：</p><ol><li>现在页面响应速度在600个高并发时，平均值从20s减少到3s，基本较少服务器压力，还有优化空间</li><li>其他人是否有更好办法？<br /></li></ol><img src ="http://www.blogjava.net/huyi0616/aggbug/430436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2016-05-11 11:54 <a href="http://www.blogjava.net/huyi0616/archive/2016/05/11/430436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使IE浏览器默认使用最新的版本显示页面，去掉兼容模式</title><link>http://www.blogjava.net/huyi0616/archive/2016/04/07/430004.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Thu, 07 Apr 2016 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2016/04/07/430004.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/430004.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2016/04/07/430004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/430004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/430004.html</trackback:ping><description><![CDATA[<span style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;">昨天看淘宝页面源代码&lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=7, IE=9&#8243;&gt;加了个。&nbsp;</span><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;">不过现在已经改成了&nbsp;</span><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;">&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" &gt;&nbsp;</span><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;">不知用意，请教高人好多都不清楚。&nbsp;</span><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;">查阅资料发现，那个是英文的，基础差。&nbsp;</span><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><br style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;" /><span style="font-family: tahoma, arial, 宋体; line-height: 25.2000007629395px; background-color: #ffffff;">大致翻译是如果你有一个使用X-UA-Compatible Meta 标签或者http header 让网页在IE7标准模式解释的旧网站，那么这里有一个综合示例能够让ie8用ie7的标准模式呈现页面，ie9使用ie9的标准模式呈现页面。用自己的话就是使用上面&lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=7, IE=9&#8243;&gt;，使IE7 IE8浏览器使用IE7模式渲染。IE9就用自己的IE9模式渲染。互不影响</span><img src ="http://www.blogjava.net/huyi0616/aggbug/430004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2016-04-07 10:16 <a href="http://www.blogjava.net/huyi0616/archive/2016/04/07/430004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn</title><link>http://www.blogjava.net/huyi0616/archive/2013/05/02/398686.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Thu, 02 May 2013 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2013/05/02/398686.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/398686.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2013/05/02/398686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/398686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/398686.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MyEclipse下SVN主干与分支的合并操作一、分支的应用环境1.&nbsp;什么是分支？分支是项目开发过程中，从项目中的某一版本独立出来的一个单独模块，它可以&nbsp;包含项目的全部组成成分，也可以仅仅包含其中某一个部分。2.&nbsp;分支的应用a.&nbsp;多个版本项目的维护当一个项目存在多个不同的版本时，有可能项目的各个版本主体代码都相同，只有一些少量的部...&nbsp;&nbsp;<a href='http://www.blogjava.net/huyi0616/archive/2013/05/02/398686.html'>阅读全文</a><img src ="http://www.blogjava.net/huyi0616/aggbug/398686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2013-05-02 17:21 <a href="http://www.blogjava.net/huyi0616/archive/2013/05/02/398686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改SQL数据库中表字段类型时，报“一个或多个对象访问此列”错误的解决方法 </title><link>http://www.blogjava.net/huyi0616/archive/2011/06/13/352187.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Mon, 13 Jun 2011 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2011/06/13/352187.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/352187.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2011/06/13/352187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/352187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/352187.html</trackback:ping><description><![CDATA[<p>转自:<br /><a href="http://www.cnblogs.com/coloeme/archive/2010/03/09/1681201.html">http://www.cnblogs.com/coloeme/archive/2010/03/09/1681201.html</a><br /><br />在SQL数据库中使用SQL语句（格式：alter table [tablename] alter column [colname] [newDataType]）修改某表的字段类型时，报一下错误:</p>
<p>&#8220;**********************************</p>
<p>对象'DF__******' 依赖于 列'column1'。 <br />***********************************<br /><strong>由于一个或多个对象访问此列</strong>，ALTER TABLE&nbsp;********&nbsp;失败。&#8221; </p>
<p>　　根据上述提示在网上搜索结果，得知发生该错误的原因在于要修改的字段存在Default约束，解决方法：</p>
<p>1.查找出表中该字段的约束名称（或根据已有的提示及对象'DF__******'）</p>
<p><span style="font-family: Verdana"><span style="font-family: Verdana">declare @name varchar(50)<br />select&nbsp; @name =b.name from sysobjects b join syscolumns a on b.id = a.cdefault <br />where a.id = object_id('TableName') <br />and a.name ='ColumName'</span></span></p>
<p>2. 删除存在的约束</p>
<p><span style="font-family: Verdana">exec('alter table TableName drop constraint ' + @name)</span></p>
<p>3. 再执行修改字段类型的脚本即可</p>
<p>　　综合查阅资料发现：将表中的字段设置为NOT NULL（不为空）、给字段增加Default值（默认值）这样的操作都会给该字段添加约束，增加了这些约束后，在用SQL脚本修改字段类型、删除字段的时候均会发生类似错误，需要查找该字段上已存在的约束，并删除存在的约束，再次执行修改/删除脚本即可。</p>
<p>　　资料引用：</p>
<p>　　1. <a href="http://topic.csdn.net/t/20041119/10/3567693.html" target="_blank">修改字段类型时出现的 依赖于 列Classinfo_ShowType,因为有一个或多个对象访问此列（邹建请进）</a></p>
<p>　　2. <a href="http://www.510769.com/article/Asp_MsSQL/1289.htm" target="_blank">由于一个或多个对象访问此列错误的解决办法</a></p>
<p>　　3. <a href="http://www.cnblogs.com/leowhb/archive/2009/03/07/1405403.html" target="_blank">SQL Server】sql语句删除表的有默认值的列</a> </p>
<p>　　4. <a href="http://www.liehuo.net/a/200912/1211487.html" target="_blank">Alter Table修改表结构的错误及解决方法</a></p><img src ="http://www.blogjava.net/huyi0616/aggbug/352187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2011-06-13 14:52 <a href="http://www.blogjava.net/huyi0616/archive/2011/06/13/352187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jquery.validate.js表单验证</title><link>http://www.blogjava.net/huyi0616/archive/2010/08/10/328368.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Tue, 10 Aug 2010 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/08/10/328368.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/328368.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/08/10/328368.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/328368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/328368.html</trackback:ping><description><![CDATA[转自：http://hi.baidu.com/greenandcoffee/blog/item/5ebe5850e2cfbb551138c24d.html<br />
<br />
<p>&nbsp;</p>
<div class="blog_content">
<p>一、用前必备<br />
官方网站：<a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/"><span style="color: #108ac6">http://bassistance.de/jquery-plugins/jquery-plugin-validation/</span></a><br />
API: <a href="http://jquery.bassistance.de/api-browser/plugins.html"><span style="color: #108ac6">http://jquery.bassistance.de/api-browser/plugins.html</span></a><br />
当前版本：1.5.5<br />
需要JQuery版本：1.2.6+, 兼容 1.3.2<br />
&lt;script src="../js/jquery.js" type="text/javascript"&gt;&lt;/script&gt;<br />
&lt;script src="../js/jquery.validate.js" type="text/javascript"&gt;&lt;/script&gt;</p>
<p>二、默认校验规则<br />
(1)required:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必输字段<br />
(2)remote:"check.php"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用ajax方法调用check.php验证输入值<br />
(3)email:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入正确格式的电子邮件<br />
(4)url:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入正确格式的网址<br />
(5)date:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入正确格式的日期<br />
(6)dateISO:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入正确格式的日期(ISO)，例如：2009-06-23，1998/01/22 只验证格式，不验证有效性<br />
(7)number:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入合法的数字(负数，小数)<br />
(8)digits:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入整数<br />
(9)creditcard:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须输入合法的信用卡号<br />
(10)equalTo:"#field"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入值必须和#field相同<br />
(11)accept:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入拥有合法后缀名的字符串（上传文件的后缀）<br />
(12)maxlength:5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入长度最多是5的字符串(汉字算一个字符)<br />
(13)minlength:10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入长度最小是10的字符串(汉字算一个字符)<br />
(14)rangelength:[5,10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入长度必须介于 5 和 10 之间的字符串")(汉字算一个字符)<br />
(15)range:[5,10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入值必须介于 5 和 10 之间<br />
(16)max:5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入值不能大于5<br />
(17)min:10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入值不能小于10</p>
<p>三、默认的提示<br />
messages: {<br />
&nbsp;&nbsp;&nbsp; required: "This field is required.",<br />
&nbsp;&nbsp;&nbsp; remote: "Please fix this field.",<br />
&nbsp;&nbsp;&nbsp; email: "Please enter a valid email address.",<br />
&nbsp;&nbsp;&nbsp; url: "Please enter a valid URL.",<br />
&nbsp;&nbsp;&nbsp; date: "Please enter a valid date.",<br />
&nbsp;&nbsp;&nbsp; dateISO: "Please enter a valid date (ISO).",<br />
&nbsp;&nbsp;&nbsp; dateDE: "Bitte geben Sie ein g眉ltiges Datum ein.",<br />
&nbsp;&nbsp;&nbsp; number: "Please enter a valid number.",<br />
&nbsp;&nbsp;&nbsp; numberDE: "Bitte geben Sie eine Nummer ein.",<br />
&nbsp;&nbsp;&nbsp; digits: "Please enter only digits",<br />
&nbsp;&nbsp;&nbsp; creditcard: "Please enter a valid credit card number.",<br />
&nbsp;&nbsp;&nbsp; equalTo: "Please enter the same value again.",<br />
&nbsp;&nbsp;&nbsp; accept: "Please enter a value with a valid extension.",<br />
&nbsp;&nbsp;&nbsp; maxlength: $.validator.format("Please enter no more than {0} characters."),<br />
&nbsp;&nbsp;&nbsp; minlength: $.validator.format("Please enter at least {0} characters."),<br />
&nbsp;&nbsp;&nbsp; rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),<br />
&nbsp;&nbsp;&nbsp; range: $.validator.format("Please enter a value between {0} and {1}."),<br />
&nbsp;&nbsp;&nbsp; max: $.validator.format("Please enter a value less than or equal to {0}."),<br />
&nbsp;&nbsp;&nbsp; min: $.validator.format("Please enter a value greater than or equal to {0}.")<br />
},<br />
如需要修改，可在js代码中加入：<br />
jQuery.extend(jQuery.validator.messages, {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; required: "必选字段",<br />
remote: "请修正该字段",<br />
email: "请输入正确格式的电子邮件",<br />
url: "请输入合法的网址",<br />
date: "请输入合法的日期",<br />
dateISO: "请输入合法的日期 (ISO).",<br />
number: "请输入合法的数字",<br />
digits: "只能输入整数",<br />
creditcard: "请输入合法的信用卡号",<br />
equalTo: "请再次输入相同的值",<br />
accept: "请输入拥有合法后缀名的字符串",<br />
maxlength: jQuery.validator.format("请输入一个长度最多是 {0} 的字符串"),<br />
minlength: jQuery.validator.format("请输入一个长度最少是 {0} 的字符串"),<br />
rangelength: jQuery.validator.format("请输入一个长度介于 {0} 和 {1} 之间的字符串"),<br />
range: jQuery.validator.format("请输入一个介于 {0} 和 {1} 之间的值"),<br />
max: jQuery.validator.format("请输入一个最大为 {0} 的值"),<br />
min: jQuery.validator.format("请输入一个最小为 {0} 的值")<br />
});<br />
推荐做法，将此文件放入messages_cn.js中，在页面中引入<br />
&lt;script src="../js/messages_cn.js" type="text/javascript"&gt;&lt;/script&gt;</p>
<p>四、使用方式<br />
1.将校验规则写到控件中<br />
&lt;script src="../js/jquery.js" type="text/javascript"&gt;&lt;/script&gt;<br />
&lt;script src="../js/jquery.validate.js" type="text/javascript"&gt;&lt;/script&gt;<br />
&lt;script src="./js/jquery.metadata.js" type="text/javascript"&gt;&lt;/script&gt;<br />
$().ready(function() {<br />
$("#signupForm").validate();<br />
});</p>
<p>&lt;form id="signupForm" method="get" action=""&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label for="firstname"&gt;Firstname&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input id="firstname" name="firstname" class="required" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br />
&lt;p&gt;<br />
&lt;label for="email"&gt;E-Mail&lt;/label&gt;<br />
&lt;input id="email" name="email" class="required email" /&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
&lt;label for="password"&gt;Password&lt;/label&gt;<br />
&lt;input id="password" name="password" type="password" class="{required:true,minlength:5}" /&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
&lt;label for="confirm_password"&gt;确认密码&lt;/label&gt;<br />
&lt;input id="confirm_password" name="confirm_password" type="password" class="{required:true,minlength:5,equalTo:'#password'}" /&gt;<br />
&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input class="submit" type="submit" value="Submit"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br />
&lt;/form&gt;<br />
使用class="{}"的方式，必须引入包：jquery.metadata.js<br />
可以使用如下的方法，修改提示内容：<br />
class="{required:true,minlength:5,messages:{required:'请输入内容'}}"<br />
在使用equalTo关键字时，后面的内容必须加上引号，如下代码：<br />
class="{required:true,minlength:5,equalTo:'#password'}"<br />
另外一个方式，使用关键字：meta（为了元数据使用其他插件你要包装 你的验证规则 在他们自己的项目中可以用这个特殊的选项）<br />
Tell the validation plugin to look inside a validate-property in metadata for validation rules.<br />
例如：<br />
meta: "validate"<br />
&lt;input id="password" name="password" type="password" class="{validate:{required:true,minlength:5}}" /&gt;</p>
<p>再有一种方式：<br />
$.metadata.setType("attr", "validate");<br />
这样可以使用validate="{required:true}"的方式，或者class="required"，但class="{required:true,minlength:5}"将不起作用<br />
<br />
2.将校验规则写到代码中</p>
<p>$().ready(function() {<br />
$("#signupForm").validate({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rules: {<br />
&nbsp;&nbsp; firstname: "required",<br />
&nbsp;&nbsp; email: {<br />
&nbsp;&nbsp;&nbsp; required: true,<br />
&nbsp;&nbsp;&nbsp; email: true<br />
&nbsp;&nbsp; },<br />
&nbsp;&nbsp; password: {<br />
&nbsp;&nbsp;&nbsp; required: true,<br />
&nbsp;&nbsp;&nbsp; minlength: 5<br />
&nbsp;&nbsp; },<br />
&nbsp;&nbsp; confirm_password: {<br />
&nbsp;&nbsp;&nbsp; required: true,<br />
&nbsp;&nbsp;&nbsp; minlength: 5,<br />
&nbsp;&nbsp;&nbsp; equalTo: "#password"<br />
&nbsp;&nbsp; }<br />
},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messages: {<br />
&nbsp;&nbsp; firstname: "请输入姓名",<br />
&nbsp;&nbsp; email: {<br />
&nbsp;&nbsp;&nbsp; required: "请输入Email地址",<br />
&nbsp;&nbsp;&nbsp; email: "请输入正确的email地址"<br />
&nbsp;&nbsp; },<br />
&nbsp;&nbsp; password: {<br />
&nbsp;&nbsp;&nbsp; required: "请输入密码",<br />
&nbsp;&nbsp;&nbsp; minlength: jQuery.format("密码不能小于{0}个字符")<br />
&nbsp;&nbsp; },<br />
&nbsp;&nbsp; confirm_password: {<br />
&nbsp;&nbsp;&nbsp; required: "请输入确认密码",<br />
&nbsp;&nbsp;&nbsp; minlength: "确认密码不能小于5个字符",<br />
&nbsp;&nbsp;&nbsp; equalTo: "两次输入密码不一致不一致"<br />
&nbsp;&nbsp; }<br />
}<br />
&nbsp;&nbsp;&nbsp; });<br />
});<br />
//messages处，如果某个控件没有message，将调用默认的信息</p>
<p>&lt;form id="signupForm" method="get" action=""&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label for="firstname"&gt;Firstname&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input id="firstname" name="firstname" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br />
&lt;p&gt;<br />
&lt;label for="email"&gt;E-Mail&lt;/label&gt;<br />
&lt;input id="email" name="email" /&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
&lt;label for="password"&gt;Password&lt;/label&gt;<br />
&lt;input id="password" name="password" type="password" /&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
&lt;label for="confirm_password"&gt;确认密码&lt;/label&gt;<br />
&lt;input id="confirm_password" name="confirm_password" type="password" /&gt;<br />
&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input class="submit" type="submit" value="Submit"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br />
&lt;/form&gt;<br />
required:true 必须有值<br />
required:"#aa:checked"表达式的值为真，则需要验证<br />
required:function(){}返回为真，表时需要验证<br />
后边两种常用于，表单中需要同时填或不填的元素<br />
<br />
五、常用方法及注意问题<br />
1.用其他方式替代默认的SUBMIT<br />
$().ready(function() {<br />
$("#signupForm").validate({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; submitHandler:function(form){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("submitted");&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form.submit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; });<br />
});<br />
可以设置validate的默认值，写法如下：<br />
$.validator.setDefaults({<br />
submitHandler: function(form) { alert("submitted!");form.submit(); }<br />
});<br />
如果想提交表单, 需要使用form.submit()而不要使用$(form).submit()</p>
<p>2.debug，如果这个参数为true，那么表单不会提交，只进行检查，调试时十分方便<br />
$().ready(function() {<br />
$("#signupForm").validate({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug:true<br />
&nbsp;&nbsp;&nbsp; });<br />
});<br />
如果一个页面中有多个表单，用<br />
$.validator.setDefaults({<br />
&nbsp;&nbsp; debug: true<br />
})</p>
<p>3.ignore：忽略某些元素不验证<br />
ignore: ".ignore"</p>
<p>4.errorPlacement：Callback Default: 把错误信息放在验证的元素后面 <br />
指明错误放置的位置，默认情况是：error.appendTo(element.parent());即把错误信息放在验证的元素后面 <br />
errorPlacement: function(error, element) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; error.appendTo(element.parent());&nbsp;&nbsp; <br />
}<br />
//示例：<br />
&lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td class="label"&gt;&lt;label id="lfirstname" for="firstname"&gt;First Name&lt;/label&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td class="field"&gt;&lt;input id="firstname" name="firstname" type="text" value="" maxlength="100" /&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td class="status"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td style="padding-right: 5px;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input id="dateformat_eu" name="dateformat" type="radio" value="0" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label id="ldateformat_eu" for="dateformat_eu"&gt;14/02/07&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td style="padding-left: 5px;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input id="dateformat_am" name="dateformat" type="radio" value="1" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label id="ldateformat_am" for="dateformat_am"&gt;02/14/07&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td class="label"&gt;&amp;nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td class="field" colspan="2"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="termswrap"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input id="terms" type="checkbox" name="terms" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label id="lterms" for="terms"&gt;I have read and accept the Terms of Use.&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&lt;/tr&gt;<br />
errorPlacement: function(error, element) {<br />
&nbsp;&nbsp;&nbsp; if ( element.is(":radio") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error.appendTo( element.parent().next().next() );<br />
&nbsp;&nbsp;&nbsp; else if ( element.is(":checkbox") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error.appendTo ( element.next() );<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error.appendTo( element.parent().next() );<br />
}<br />
代码的作用是：一般情况下把错误信息显示在&lt;td class="status"&gt;&lt;/td&gt;中，如果是radio显示在&lt;td&gt;&lt;/td&gt;中，如果是checkbox显示在内容的后面<br />
errorClass：String Default: "error" <br />
指定错误提示的css类名，可以自定义错误提示的样式<br />
errorElement：String Default: "label" <br />
用什么标签标记错误，默认的是label你可以改成em<br />
errorContainer：Selector <br />
显示或者隐藏验证信息，可以自动实现有错误信息出现时把容器属性变为显示，无错误时隐藏，用处不大<br />
errorContainer: "#messageBox1, #messageBox2"<br />
errorLabelContainer：Selector <br />
把错误信息统一放在一个容器里面。<br />
wrapper：String<br />
用什么标签再把上边的errorELement包起来<br />
一般这三个属性同时使用，实现在一个容器内显示所有错误提示的功能，并且没有信息时自动隐藏<br />
errorContainer: "div.error",<br />
errorLabelContainer: $("#signupForm div.error"),<br />
wrapper: "li"<br />
<br />
设置错误提示的样式，可以增加图标显示<br />
input.error { border: 1px solid red; }<br />
label.error {<br />
background:url("./demo/images/unchecked.gif") no-repeat 0px 0px;<br />
padding-left: 16px;<br />
padding-bottom: 2px;<br />
font-weight: bold;<br />
color: #EA5200;<br />
}<br />
label.checked {<br />
background:url("./demo/images/checked.gif") no-repeat 0px 0px;<br />
}<br />
success：String,Callback <br />
要验证的元素通过验证后的动作，如果跟一个字符串，会当做一个css类，也可跟一个函数<br />
success: function(label) {<br />
&nbsp;&nbsp;&nbsp; // set &amp;nbsp; as text for IE<br />
&nbsp;&nbsp;&nbsp; label.html("&amp;nbsp;").addClass("checked");<br />
&nbsp;&nbsp;&nbsp; //label.addClass("valid").text("Ok!")<br />
}<br />
添加"valid" 到验证元素, 在CSS中定义的样式&lt;style&gt;label.valid {}&lt;/style&gt;<br />
success: "valid"<br />
<br />
<br />
nsubmit： Boolean Default: true <br />
提交时验证. 设置唯false就用其他方法去验证<br />
onfocusout：Boolean Default: true <br />
失去焦点是验证(不包括checkboxes/radio buttons) <br />
onkeyup：Boolean Default: true <br />
在keyup时验证.<br />
onclick：Boolean Default: true <br />
在checkboxes 和 radio 点击时验证<br />
focusInvalid：Boolean Default: true <br />
提交表单后，未通过验证的表单(第一个或提交之前获得焦点的未通过验证的表单)会获得焦点<br />
focusCleanup：Boolean Default: false <br />
如果是true那么当未通过验证的元素获得焦点时，移除错误提示。避免和 focusInvalid 一起用<br />
<br />
// 重置表单<br />
$().ready(function() {<br />
var validator = $("#signupForm").validate({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; submitHandler:function(form){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("submitted");&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form.submit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; $("#reset").click(function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validator.resetForm();<br />
&nbsp;&nbsp;&nbsp; });<br />
});<br />
<br />
remote：URL<br />
使用ajax方式进行验证，默认会提交当前验证的值到远程地址，如果需要提交其他的值，可以使用data选项<br />
remote: "check-email.php"<br />
remote: {<br />
&nbsp;&nbsp;&nbsp; url: "check-email.php",&nbsp;&nbsp;&nbsp;&nbsp; //后台处理程序<br />
&nbsp;&nbsp;&nbsp; type: "post",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //数据发送方式<br />
&nbsp;&nbsp;&nbsp; dataType: "json",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //接受数据格式&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; data: {&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; username: function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $("#username").val();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>远程地址只能输出 "true" 或 "false"，不能有其它输出<br />
<br />
<br />
addMethod：name, method, message<br />
自定义验证方法</p>
<p>// 中文字两个字节<br />
jQuery.validator.addMethod("byteRangeLength", function(value, element, param) {<br />
&nbsp;&nbsp;&nbsp; var length = value.length;<br />
&nbsp;&nbsp;&nbsp; for(var i = 0; i &lt; value.length; i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(value.charCodeAt(i) &gt; 127){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; length++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
return this.optional(element) || ( length &gt;= param[0] &amp;&amp; length &lt;= param[1] );&nbsp;&nbsp;&nbsp; <br />
}, $.validator.format("请确保输入的值在{0}-{1}个字节之间(一个中文字算2个字节)"));</p>
<p>// 邮政编码验证&nbsp;&nbsp;&nbsp; <br />
jQuery.validator.addMethod("isZipCode", function(value, element) {&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; var tel = /^[0-9]{6}$/;<br />
&nbsp;&nbsp;&nbsp; return this.optional(element) || (tel.test(value));<br />
}, "请正确填写您的邮政编码");</p>
<p>radio和checkbox、select的验证<br />
radio的required表示必须选中一个<br />
&lt;input type="radio" id="gender_male" value="m" name="gender" class="{required:true}" /&gt;<br />
&lt;input type="radio" id="gender_female" value="f" name="gender"/&gt;<br />
checkbox的required表示必须选中<br />
&lt;input type="checkbox" class="checkbox" id="agree" name="agree" class="{required:true}" /&gt;<br />
checkbox的minlength表示必须选中的最小个数,maxlength表示最大的选中个数,rangelength:[2,3]表示选中个数区间<br />
&lt;input type="checkbox" class="checkbox" id="spam_email" value="email" name="spam[]" class="{required:true, minlength:2}" /&gt;<br />
&lt;input type="checkbox" class="checkbox" id="spam_phone" value="phone" name="spam[]" /&gt;<br />
&lt;input type="checkbox" class="checkbox" id="spam_mail" value="mail" name="spam[]" /&gt;</p>
<p>select的required表示选中的value不能为空<br />
&lt;select id="jungle" name="jungle" title="Please select something!" class="{required:true}"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value=""&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="1"&gt;Buga&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="2"&gt;Baga&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="3"&gt;Oi&lt;/option&gt;<br />
&lt;/select&gt;<br />
select的minlength表示选中的最小个数（可多选的select）,maxlength表示最大的选中个数,rangelength:[2,3]表示选中个数区间<br />
&lt;select id="fruit" name="fruit" title="Please select at least two fruits" class="{required:true, minlength:2}" multiple="multiple"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="b"&gt;Banana&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="a"&gt;Apple&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="p"&gt;Peach&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;option value="t"&gt;Turtle&lt;/option&gt;<br />
&lt;/select&gt;</p>
</div>
<img src ="http://www.blogjava.net/huyi0616/aggbug/328368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-08-10 09:38 <a href="http://www.blogjava.net/huyi0616/archive/2010/08/10/328368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA String.format 方法使用介绍</title><link>http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Wed, 07 Jul 2010 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/325456.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/325456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/325456.html</trackback:ping><description><![CDATA[转载自：http://blog.csdn.net/andycpp/archive/2007/08/18/1749700.aspx<br />
<br />
&nbsp;&nbsp;&nbsp; 在JDK1.5中，String类增加了一个非常有用的静态函数format(String&nbsp; format, Objece...&nbsp; argues)，可以将各类数据格式化为字符串并输出。其中format参数指定了输出的格式，是最复杂也是最难掌握的一点，而argues则是一系列等待被格式化的对象。该函数对c语言中printf函数的用法进行了一定的模仿，因此有c语言基础的人学起来会轻松许多。下面我们着重讨论一下format 参数的格式及含义。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format参数中可以包含不需要转化的字符串，这些字符串是你写什么，最终就输出什么。同时还包含一些特殊格式的内容，来指定将哪个对象来转换，以及转换成什么形式。这种特殊的格式通通以%index$开头，index从1开始取值，表示将第index个参数拿进来进行格式化。这一点比c语言要强一点， c语言只能按照参数的顺序依次格式化，而java可以选择第n个参数来格式化。由于该函数可以对任意一个对象进行格式化，不同的对象适用的参数也不同，因此我们下面分类来讨论。<br />
<br />
<span style="font-size: medium; font-family: "><span style="color: #ff0000">1.<span style="color: #000000">对<span style="color: #ff0000">整数</span>进行格式化</span>：<span style="color: #339966">%[index$]</span>[标识]<span style="color: #339966">[最小宽度]</span>转换方式<br style="color: #ff0000" />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以看到，格式化字符串由4部分组成，其中<span style="color: #ff0000"><span style="color: #339966">%[index$]<span style="color: #000000">的含义</span></span></span>我们上面已经讲过，<span style="color: #ff0000"><span style="color: #339966">[最小宽度]</span></span>的含义也很好理解，就是最终该整数转化的字符串最少包含多少位数字。我们来看看剩下2个部分的含义吧：<br />
</span>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><span style="font-size: medium; font-family: "><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><span style="font-size: medium; font-family: "><span style="color: #ff0000">标识</span>：&nbsp;<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></span><span style="color: #339966"><span style="font-size: medium; font-family: ">'-'&nbsp;&nbsp;&nbsp;&nbsp;在最小宽度内左对齐，不可以与&#8220;用0填充&#8221;同时使用<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'#'&nbsp;&nbsp;&nbsp;&nbsp;只适用于8进制和16进制，8进制时在结果前面增加一个0，16进制时在结果前面增加0x<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'+'&nbsp;&nbsp;&nbsp;&nbsp;结果总是包括一个符号（一般情况下只适用于10进制，若对象为BigInteger才可以用于8进制和16进制）<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;正值前加空格，负值前加负号（一般情况下只适用于10进制，若对象为BigInteger才可以用于8进制和16进制）<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'0'&nbsp;&nbsp;&nbsp;&nbsp;结果将用零来填充<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />','&nbsp;&nbsp;&nbsp;&nbsp;只适用于10进制，每3位数字之间用&#8220;，&#8221;分隔<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'('&nbsp;&nbsp;&nbsp;&nbsp;若参数是负数，则结果中不添加负号而是用圆括号把数字括起来（同&#8216;+</span></span><span style="font-size: medium; font-family: "><span style="color: #000000"><span style="color: #339966">&#8217;具有同样的限制）</span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #ff0000">转换方式</span>：<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #339966">d</span></span><span style="color: #339966">-十进制&nbsp;&nbsp;&nbsp;o-八进制&nbsp;&nbsp;&nbsp;x或X-十六进制</span></span></div>
</div>
<p><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的说明过于枯燥，我们来看几个具体的例子。需要特别注意的两点是：<br />
<span style="color: #ff0000">1.大部分标识字符可以同时使用.<br />
2.String.format()方法定义如下:<br />
<span style="color: #000000">public static String format(String format, Object ... args)<br />
format()第二个参数类型是java 1.5引入的新特性,可支持传无限个参数进来.<br />
因此1$代表args的第一个参数,2$代表args的第二个参数,以次类推. </span></span></span></p>
<p><span style="font-size: medium; font-family: "><span style="color: #ff0000"><span style="color: #000000"></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><span style="color: #339966"><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$,09d -&gt; %2$+5d", -3123,123));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$9d", -31));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$-9d", -31));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$(9d", -31));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(String.format("%1$#9x", 5689));</span></span></div>
<div><span style="color: #339966"><span style="font-size: medium; font-family: ">//结果为：<br />
//-0003,123 -&gt;&nbsp; +123<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -31<br />
//-31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp;&nbsp; (31)<br />
//&nbsp;&nbsp; 0x1639</span></span></div>
</div>
</span></span></span><span style="color: #ff0000"><span style="font-size: medium; font-family: ">2.<span style="color: #000000">对<span style="color: #ff0000">浮点数</span>进行格式化</span>：</span><span style="color: #339966"><span style="font-size: medium; font-family: ">%[index$]<span style="color: #ff0000">[标识]</span>[最少宽度]<span style="color: #ff0000">[.精度]</span>转换方式<br />
</span><span style="color: #000000"><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以看到，浮点数的转换多了一个&#8220;精度&#8221;选项，可以控制小数点后面的位数。 </span></span></span></span>
<p>&nbsp;</p>
<p>
<p><span style="color: #ff0000"><span style="color: #339966"><span style="color: #000000"><span style="font-size: medium; font-family: "></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><span style="font-size: medium; font-family: "><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><span style="font-size: medium; font-family: "><span style="color: #ff0000">标识</span>：&nbsp;<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></span><span style="color: #339966"><span style="font-size: medium; font-family: ">'-'&nbsp;&nbsp;&nbsp;&nbsp;在最小宽度内左对齐，不可以与&#8220;用0填充&#8221;同时使用<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'+'&nbsp;&nbsp;&nbsp;&nbsp;结果总是包括一个符号<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;正值前加空格，负值前加负号<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'0'&nbsp;&nbsp;&nbsp;&nbsp;结果将用零来填充<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />','&nbsp;&nbsp;&nbsp;&nbsp;每3位数字之间用&#8220;，&#8221;分隔（只适用于fgG的转换）<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'('</span></span><span style="color: #000000"><span style="font-size: medium; font-family: "><span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;若参数是负数，则结果中不添加负号而是用圆括号把数字括起来（只适用于eEfgG的转换）</span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #ff0000">转换方式</span>：<br />
<img style="color: #339966" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></span><span style="color: #339966"><span style="font-size: medium; font-family: ">'e',&nbsp;'E'&nbsp;&nbsp;--&nbsp;&nbsp;结果被格式化为用计算机科学记数法表示的十进制数<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'f'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;结果被格式化为十进制普通表示方式<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'g',&nbsp;'G'&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;根据具体情况，自动选择用普通表示方式还是科学计数法方式<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />'a',&nbsp;'A'&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;结果被格式化为带有效位数和指数的十六进制浮点数</span></span></div>
</div>
<p><span style="font-size: medium; font-family: ">3.<span style="color: #000000">对<span style="color: #ff0000">字符</span>进行格式化</span>：<br />
</span><span style="color: #000000"><span style="font-size: medium; font-family: ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对字符进行格式化是非常简单的，c表示字符，标识中'-'表示左对齐，其他就没什么了。</span></span></p>
<span style="color: #ff0000"><span style="font-size: medium; font-family: ">4.<span style="color: #000000">对<span style="color: #ff0000">百分比符号</span>进行格式化</span>：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000"><span style="font-size: medium; font-family: ">看了上面的说明，大家会发现百分比符号&#8220;%&#8221;是特殊格式的一个前缀。那么我们要输入一个百分比符号该怎么办呢？肯定是需要转义字符的,但是要注意的是，在这里转义字符不是&#8220;\&#8221;，而是&#8220;%&#8221;。换句话说，下面这条语句可以输出一个&#8220;12%&#8221;：<br />
<span style="color: #008080">System.out.println(String.format("%1$d%%", 12));</span><br />
<br />
</span></span></span><span style="color: #ff0000"><span style="font-size: medium; font-family: ">5.<span style="color: #000000">取得<span style="color: #ff0000">平台独立的行分隔符</span></span>：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008080">System.getProperty("line.separator")<span style="color: #000000">可以取得平台独立的行分隔符，但是用在format中间未免显得过于烦琐了。于是format函数自带了一个平台独立的行分隔符那就是</span></span></span></span><span style="color: #ff0000"><span style="color: #000000"><span style="color: #008080"><span style="font-size: medium; font-family: ">String.format("%n")。<br />
<br />
</span></span></span></span><span style="color: #ff0000"><span style="font-size: medium; font-family: ">6.<span style="color: #000000">对<span style="color: #ff0000">日期类型</span>进行格式化</span>：<br />
</span><span style="font-size: medium; font-family: "><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下日期和时间转换的后缀字符是为 't' 和 'T' 转换定义的。这些类型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的类型。提供其他转换类型是为了访问特定于 Java 的功能（如将 'L' 用作秒中的毫秒）。<br />
<br />
<span style="color: #ff0000">以下转换字符用来格式化时间：</span></span><br style="color: #000000" />
<span style="color: #000000">'H' &nbsp;&nbsp;&nbsp; 24 小时制的小时，被格式化为必要时带前导零的两位数，即 00 - 23。</span><br style="color: #000000" />
<span style="color: #000000">'I' &nbsp;&nbsp;&nbsp; 12 小时制的小时，被格式化为必要时带前导零的两位数，即 01 - 12。</span><br style="color: #000000" />
<span style="color: #000000">'k' &nbsp;&nbsp;&nbsp; 24 小时制的小时，即 0 - 23。</span><br style="color: #000000" />
<span style="color: #000000">'l' &nbsp;&nbsp;&nbsp; 12 小时制的小时，即 1 - 12。</span><br style="color: #000000" />
<span style="color: #000000">'M' &nbsp;&nbsp;&nbsp; 小时中的分钟，被格式化为必要时带前导零的两位数，即 00 - 59。</span><br style="color: #000000" />
<span style="color: #000000">'S' &nbsp;&nbsp;&nbsp; 分钟中的秒，被格式化为必要时带前导零的两位数，即 00 - 60 （"60" 是支持闰秒所需的一个特殊值）。</span><br style="color: #000000" />
<span style="color: #000000">'L' &nbsp;&nbsp;&nbsp; 秒中的毫秒，被格式化为必要时带前导零的三位数，即 000 - 999。</span><br style="color: #000000" />
<span style="color: #000000">'N' &nbsp;&nbsp;&nbsp; 秒中的毫微秒，被格式化为必要时带前导零的九位数，即 000000000 - 999999999。</span><br style="color: #000000" />
<span style="color: #000000">'p' &nbsp;&nbsp;&nbsp; 特定于语言环境的 上午或下午 标记以小写形式表示，例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。</span><br style="color: #000000" />
<span style="color: #000000">'z' &nbsp;&nbsp;&nbsp; 相对于 GMT 的 RFC 822 格式的数字时区偏移量，例如 -0800。</span><br style="color: #000000" />
<span style="color: #000000">'Z' &nbsp;&nbsp;&nbsp; 表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境（如果有）。</span><br />
<span style="color: #000000">'s' &nbsp;&nbsp;&nbsp; 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数，即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。</span><br style="color: #000000" />
<span style="color: #000000">'Q' &nbsp;&nbsp;&nbsp; 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数，即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值。</span><br style="color: #000000" />
<br style="color: #000000" />
<span style="color: #ff0000">以下转换字符用来格式化日期：</span><br style="color: #000000" />
<span style="color: #000000">'B' &nbsp;&nbsp;&nbsp; 特定于语言环境的月份全称，例如 "January" 和 "February"。</span><br style="color: #000000" />
<span style="color: #000000">'b' &nbsp;&nbsp;&nbsp; 特定于语言环境的月份简称，例如 "Jan" 和 "Feb"。</span><br style="color: #000000" />
<span style="color: #000000">'h' &nbsp;&nbsp;&nbsp; 与 'b' 相同。</span><br style="color: #000000" />
<span style="color: #000000">'A' &nbsp;&nbsp;&nbsp; 特定于语言环境的星期几全称，例如 "Sunday" 和 "Monday"</span><br style="color: #000000" />
<span style="color: #000000">'a' &nbsp;&nbsp;&nbsp; 特定于语言环境的星期几简称，例如 "Sun" 和 "Mon"</span><br style="color: #000000" />
<span style="color: #000000">'C' &nbsp;&nbsp;&nbsp; 除以 100 的四位数表示的年份，被格式化为必要时带前导零的两位数，即 00 - 99</span><br style="color: #000000" />
<span style="color: #000000">'Y' &nbsp;&nbsp;&nbsp; 年份，被格式化为必要时带前导零的四位数（至少），例如，0092 等于格里高利历的 92 CE。</span><br style="color: #000000" />
<span style="color: #000000">'y' &nbsp;&nbsp;&nbsp; 年份的最后两位数，被格式化为必要时带前导零的两位数，即 00 - 99。</span><br style="color: #000000" />
<span style="color: #000000">'j' &nbsp;&nbsp;&nbsp; 一年中的天数，被格式化为必要时带前导零的三位数，例如，对于格里高利历是 001 - 366。</span><br style="color: #000000" />
<span style="color: #000000">'m' &nbsp;&nbsp;&nbsp; 月份，被格式化为必要时带前导零的两位数，即 01 - 13。</span><br style="color: #000000" />
<span style="color: #000000">'d' &nbsp;&nbsp;&nbsp; 一个月中的天数，被格式化为必要时带前导零两位数，即 01 - 31</span><br style="color: #000000" />
<span style="color: #000000">'e' &nbsp;&nbsp;&nbsp; 一个月中的天数，被格式化为两位数，即 1 - 31。</span><br style="color: #000000" />
<br style="color: #000000" />
<span style="color: #ff0000">以下转换字符用于格式化常见的日期/时间组合。</span><br style="color: #000000" />
<span style="color: #000000">'R' &nbsp;&nbsp;&nbsp; 24 小时制的时间，被格式化为 "%tH:%tM"</span><br style="color: #000000" />
<span style="color: #000000">'T' &nbsp;&nbsp;&nbsp; 24 小时制的时间，被格式化为 "%tH:%tM:%tS"。</span><br style="color: #000000" />
<span style="color: #000000">'r' &nbsp;&nbsp;&nbsp; 12 小时制的时间，被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与语言环境有关。</span><br style="color: #000000" />
<span style="color: #000000">'D' &nbsp;&nbsp;&nbsp; 日期，被格式化为 "%tm/%td/%ty"。</span><br style="color: #000000" />
<span style="color: #000000">'F' &nbsp;&nbsp;&nbsp; ISO 8601 格式的完整日期，被格式化为 "%tY-%tm-%td"。</span><br style="color: #000000" />
<span style="color: #000000">'c' &nbsp;&nbsp;&nbsp; 日期和时间，被格式化为 "%ta %tb %td %tT %tZ %tY"，例如 "Sun Jul 20 16:17:00 EDT 1969"。</span></span></span></span></span></span></span>
<img src ="http://www.blogjava.net/huyi0616/aggbug/325456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-07-07 15:32 <a href="http://www.blogjava.net/huyi0616/archive/2010/07/07/325456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 学习笔记—第五章 事务管理</title><link>http://www.blogjava.net/huyi0616/archive/2010/04/27/319479.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Tue, 27 Apr 2010 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/04/27/319479.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/319479.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/04/27/319479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/319479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/319479.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://www.blogjava.net/msmary/articles/155398.html本章是第四章的延续，作者向读者展示了如何使用Spring事务管理来保证数据一致性。Spring对事务的管理有丰富的支持，程序控制的和声明式的都有。在本章中，我们会学习到如何把应用程序的代码放置在事务中，以确保在一切顺利时，所有的成果都被固定下来；一旦其中有一步出错，那么整个事情就像没有发...&nbsp;&nbsp;<a href='http://www.blogjava.net/huyi0616/archive/2010/04/27/319479.html'>阅读全文</a><img src ="http://www.blogjava.net/huyi0616/aggbug/319479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-04-27 14:24 <a href="http://www.blogjava.net/huyi0616/archive/2010/04/27/319479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring事务配置的五种方式</title><link>http://www.blogjava.net/huyi0616/archive/2010/04/27/319478.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Tue, 27 Apr 2010 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/04/27/319478.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/319478.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/04/27/319478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/319478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/319478.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://www.blogjava.net/robbie/archive/2009/04/05/264003.html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前段时间对Spring的事务配置做了比较深入的研究，在此之间对Spring的事务配置虽说也配置过，但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只...&nbsp;&nbsp;<a href='http://www.blogjava.net/huyi0616/archive/2010/04/27/319478.html'>阅读全文</a><img src ="http://www.blogjava.net/huyi0616/aggbug/319478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-04-27 14:19 <a href="http://www.blogjava.net/huyi0616/archive/2010/04/27/319478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZZ-大型网站架构演变和知识体系 </title><link>http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Wed, 14 Apr 2010 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/318225.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/318225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/318225.html</trackback:ping><description><![CDATA[<p><br />
&nbsp;</p>
<div class="postbody">
<p style="text-indent: 2em">转自：http://www.blogjava.net/sterning/archive/2009/11/06/301468.html<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之前也有一些介绍大型网站架构演变的文章，例如LiveJournal的、ebay的，都是非常值得参考的，不过感觉他们讲的更多的是每次演变的结果，而没有很详细的讲为什么需要做这样的演变，再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术，于是有了写这篇文章的想法，在这篇文章中 将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系，希望能给想从事互联网行业的同学一点初步的概念，:)，文中的不对之处也请各位多给点建议，让本文真正起到抛砖引玉的效果。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第一步：物理分离webserver和数据库</p>
<p style="text-indent: 2em">最开始，由于某些想法，于是在互联网上搭建了一个网站，这个时候甚至有可能主机都是租借的，但由于这篇文章我们只关注架构的演变历程，因此就假设这个时候 已经是托管了一台主机，并且有一定的带宽了，这个时候由于网站具备了一定的特色，吸引了部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段：将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更高的流量，并且不会因为数据库和应用形成互相的影响。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">这一步架构演变对技术上的知识体系基本没有要求。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第二步：增加页面缓存</p>
<p style="text-indent: 2em">好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连 接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用squid 等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够 很好的减少对webserver的压力以及减少数据库连接资源的竞争，OK，于是开始采用squid来做相对静态的页面的缓存。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">前端页面缓存技术，例如squid，如想用好的话还得深入掌握下squid的实现方式以及缓存的失效算法等。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第三步：增加页面片段缓存</p>
<p style="text-indent: 2em">增加了squid做缓存后，整体系统的速度确实是提升了，webserver的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝 到了squid之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似ESI之类的页面片段缓存策略，OK，于是开始采用ESI来做动态页面中相对静态的片段部分的缓存。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">页面片段缓存技术，例如ESI等，想用好的话同样需要掌握ESI的实现方式等；</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第四步：数据缓存</p>
<p style="text-indent: 2em">在采用ESI之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系 统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em"><img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" border="0" /></p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">缓存技术，包括像Map数据结构、缓存算法、所选用的框架本身的实现机制等。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第五步： 增加webserver</p>
<p style="text-indent: 2em">好景不长，发现随着系统访问量的再度增加，webserver机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台webserver，这也是为了同时解决可用性的问题，避免单台的webserver down机的话就没法使用了，在做了这些考虑后，决定增加一台webserver，增加一台webserver时，会碰到一些问题，典型的有：</p>
<p style="text-indent: 2em">1、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是Apache自带的负载均衡方案，或LVS这类的软件负载均衡方案；</p>
<p style="text-indent: 2em">2、如何保持状态信息的同步，例如用户session等，这个时候会考虑的方案有写入数据库、写入存储、cookie或同步session信息等机制等；</p>
<p style="text-indent: 2em">3、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；</p>
<p style="text-indent: 2em">4、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；</p>
<p style="text-indent: 2em">在解决了这些问题后，终于是把webserver增加为了两台，系统终于是又恢复到了以往的速度。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">负载均衡技术（包括但不限于硬件负载均衡、软件负载均衡、负载算法、linux转发协议、所选用的技术的实现细节等）、主备技术（包括但不限于ARP欺骗、linux heart-beat等）、状态信息或缓存同步技术（包括但不限于Cookie技术、UDP协议、状态信息广播、所选用的缓存同步技术的实现细节等）、共享文件技术（包括但不限于NFS等）、存储技术（包括但不限于存储设备等）。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第六步：分库</p>
<p style="text-indent: 2em">享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的 资源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到了，系统恢复甚至速度比以前还快了。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">这一步更多的是需要从业务上做合理的划分，以实现分库，具体技术细节上没有其他的要求；</p>
<p style="text-indent: 2em">但同时随着数据量的增大和分库的进行，在数据库的设计、调优以及维护上需要做的更好，因此对这些方面的技术还是提出了很高的要求的。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第七步：分表、DAL和分布式缓存</p>
<p style="text-indent: 2em">随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的工作，当然，这不可避免的会需要对程序 进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在ebay的架构中对应的就是DAL，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可 能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">分表更多的同样是业务上的划分，技术上涉及到的会有动态hash算法、consistent hash算法等；</p>
<p style="text-indent: 2em">DAL涉及到比较多的复杂技术，例如数据库连接的管理（超时、异常）、数据库操作的控制（超时、异常）、分库分表规则的封装等；</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第八步：增加更多的webserver</p>
<p style="text-indent: 2em">在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福生活了，突然有一天，发现系统的访问又开始有变慢的趋势 了，这个时候首先查看数据库，压力一切正常，之后查看webserver，发现apache阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来 是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些webserver服务器，在这个添加 webserver服务器的过程，有可能会出现几种挑战：</p>
<p style="text-indent: 2em">1、Apache的软负载或LVS软负载等无法承担巨大的web访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购 买硬件负载，例如F5、Netsclar、Athelon之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；</p>
<p style="text-indent: 2em">2、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；</p>
<p style="text-indent: 2em">在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加webserver。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" border="0" /></p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">到了这一步，随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高，这个时候要求对所采用的技术都要有更为深入的理解，并需要根据网站的需求来做更加定制性质的产品。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第九步：数据读写分离和廉价存储方案</p>
<p style="text-indent: 2em">突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的webserver太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不 容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如BigTable这种。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" border="0" /></p>
<p style="text-indent: 2em">&lt;!--[endif]--&gt;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">数据读写分离要求对数据库的复制、standby等策略有深入的掌握和理解，同时会要求具备自行实现的技术；</p>
<p style="text-indent: 2em">廉价存储方案要求对OS的文件存储有深入的掌握和理解，同时要求对采用的语言在文件这块的实现有深入的掌握。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">架构演变第十步：进入大型分布式应用时代和廉价服务器群梦想时代</p>
<p style="text-indent: 2em">经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加webserver就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋 庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在webserver上的那个web应用已经非常庞大 了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦， 因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的bug就导 致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将 系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：</p>
<p style="text-indent: 2em">1、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；</p>
<p style="text-indent: 2em">2、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；</p>
<p style="text-indent: 2em">3、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。</p>
<p style="text-indent: 2em">经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。</p>
<p style="text-indent: 2em">看看这一步完成后系统的图示：</p>
<p style="text-indent: 2em">&lt;!--[if !vml]--&gt;<img title="大型网站架构演变和知识体系  - 怪狗 - 怪狗" alt="大型网站架构演变和知识体系  - 怪狗 - 怪狗" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" border="0" /></p>
<p style="text-indent: 2em">&lt;!--[endif]--&gt;</p>
<p style="text-indent: 2em">这一步涉及到了这些知识体系：</p>
<p style="text-indent: 2em">这一步涉及的知识体系非常的多，要求对通信、远程调用、消息机制等有深入的理解和掌握，要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。</p>
<p style="text-indent: 2em">运维这块涉及的知识体系也非常的多，多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。</p>
<p style="text-indent: 2em">说起来确实不怎么费力，整个网站架构的经典演变过程都和上面比较的类似，当然，每步采取的方案，演变的步骤有可能有不同，另外，由于网站的业务不同，会有不同的专业技术的需求，这篇blog更多的是从架构的角度来讲解演变的过程，当然，其中还有很多的技术也未在此提及，像数据库集群、数据挖掘、搜索等，但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、CDN镜像等来支撑更大的流量，因此在真实的发展过程中还会有很多的不同，另外一个大型网站要做到的远远不仅仅上面这些，还有像安全、运维、运营、服务、存储等，要做好一个大型的网站真的很不容易，写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍，:)。</p>
<p style="text-indent: 2em">ps:最后附上几篇LiveJournal架构演变的文章：</p>
<p style="text-indent: 2em">从LiveJournal后台发展看大规模网站性能优化方法</p>
<p style="text-indent: 2em">http://blog.zhangjianfeng.com/article/743&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 2em">另外从这里：http://www.danga.com/words/大家可以找到更多关于现在LiveJournal网站架构的介绍。</p>
</div>
<p style="text-indent: 2em">&nbsp;</p>
<img src ="http://www.blogjava.net/huyi0616/aggbug/318225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-04-14 09:55 <a href="http://www.blogjava.net/huyi0616/archive/2010/04/14/318225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS精确计算</title><link>http://www.blogjava.net/huyi0616/archive/2010/03/29/316794.html</link><dc:creator>一杯清茶</dc:creator><author>一杯清茶</author><pubDate>Mon, 29 Mar 2010 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/huyi0616/archive/2010/03/29/316794.html</guid><wfw:comment>http://www.blogjava.net/huyi0616/comments/316794.html</wfw:comment><comments>http://www.blogjava.net/huyi0616/archive/2010/03/29/316794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huyi0616/comments/commentRss/316794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huyi0616/services/trackbacks/316794.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_26_231_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_231_Open_Text.style.display='none'; Codehighlighter1_26_231_Closed_Image.style.display='inline'; Codehighlighter1_26_231_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_26_231_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_26_231_Closed_Text.style.display='none'; Codehighlighter1_26_231_Open_Image.style.display='inline'; Codehighlighter1_26_231_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;accAdd(arg1,arg2)</span><span id="Codehighlighter1_26_231_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_26_231_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;r1,r2,m;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_50_90_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_90_Open_Text.style.display='none'; Codehighlighter1_50_90_Closed_Image.style.display='inline'; Codehighlighter1_50_90_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_50_90_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_90_Closed_Text.style.display='none'; Codehighlighter1_50_90_Open_Image.style.display='inline'; Codehighlighter1_50_90_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_50_90_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_50_90_Open_Text"><span style="color: #000000">{r1</span><span style="color: #000000">=</span><span style="color: #000000">arg1.toString().split(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">)[</span><span style="color: #000000">1</span><span style="color: #000000">].length}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(e)</span><span id="Codehighlighter1_99_104_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_99_104_Open_Text"><span style="color: #000000">{r1</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_112_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_152_Open_Text.style.display='none'; Codehighlighter1_112_152_Closed_Image.style.display='inline'; Codehighlighter1_112_152_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_112_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_152_Closed_Text.style.display='none'; Codehighlighter1_112_152_Open_Image.style.display='inline'; Codehighlighter1_112_152_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_112_152_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_112_152_Open_Text"><span style="color: #000000">{r2</span><span style="color: #000000">=</span><span style="color: #000000">arg2.toString().split(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">)[</span><span style="color: #000000">1</span><span style="color: #000000">].length}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(e)</span><span id="Codehighlighter1_161_166_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_161_166_Open_Text"><span style="color: #000000">{r2</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m</span><span style="color: #000000">=</span><span style="color: #000000">Math.pow(</span><span style="color: #000000">10</span><span style="color: #000000">,Math.max(r1,r2))&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(arg1</span><span style="color: #000000">*</span><span style="color: #000000">m</span><span style="color: #000000">+</span><span style="color: #000000">arg2</span><span style="color: #000000">*</span><span style="color: #000000">m)</span><span style="color: #000000">/</span><span style="color: #000000">m&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_260_465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_260_465_Open_Text.style.display='none'; Codehighlighter1_260_465_Closed_Image.style.display='inline'; Codehighlighter1_260_465_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_260_465_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_260_465_Closed_Text.style.display='none'; Codehighlighter1_260_465_Open_Image.style.display='inline'; Codehighlighter1_260_465_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;accSub(arg1,arg2)</span><span id="Codehighlighter1_260_465_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_260_465_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;r1,r2,m;&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_284_324_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_324_Open_Text.style.display='none'; Codehighlighter1_284_324_Closed_Image.style.display='inline'; Codehighlighter1_284_324_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_284_324_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_324_Closed_Text.style.display='none'; Codehighlighter1_284_324_Open_Image.style.display='inline'; Codehighlighter1_284_324_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_284_324_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_324_Open_Text"><span style="color: #000000">{r1</span><span style="color: #000000">=</span><span style="color: #000000">arg1.toString().split(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">)[</span><span style="color: #000000">1</span><span style="color: #000000">].length}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(e)</span><span id="Codehighlighter1_333_338_Open_Text"><span style="color: #000000">{r1</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_346_386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_346_386_Open_Text.style.display='none'; Codehighlighter1_346_386_Closed_Image.style.display='inline'; Codehighlighter1_346_386_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_346_386_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_346_386_Closed_Text.style.display='none'; Codehighlighter1_346_386_Open_Image.style.display='inline'; Codehighlighter1_346_386_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_346_386_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_346_386_Open_Text"><span style="color: #000000">{r2</span><span style="color: #000000">=</span><span style="color: #000000">arg2.toString().split(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">)[</span><span style="color: #000000">1</span><span style="color: #000000">].length}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(e)</span><span id="Codehighlighter1_395_400_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_395_400_Open_Text"><span style="color: #000000">{r2</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m</span><span style="color: #000000">=</span><span style="color: #000000">Math.pow(</span><span style="color: #000000">10</span><span style="color: #000000">,Math.max(r1,r2))&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(arg1</span><span style="color: #000000">*</span><span style="color: #000000">m</span><span style="color: #000000">-</span><span style="color: #000000">arg2</span><span style="color: #000000">*</span><span style="color: #000000">m)</span><span style="color: #000000">/</span><span style="color: #000000">m&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img id="Codehighlighter1_493_784_Open_Image" onclick="this.style.display='none'; Codehighlighter1_493_784_Open_Text.style.display='none'; Codehighlighter1_493_784_Closed_Image.style.display='inline'; Codehighlighter1_493_784_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_493_784_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_493_784_Closed_Text.style.display='none'; Codehighlighter1_493_784_Open_Image.style.display='inline'; Codehighlighter1_493_784_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;accDiv(arg1,arg2)</span><span id="Codehighlighter1_493_784_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;t1</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,t2</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,r1,r2;&nbsp;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img id="Codehighlighter1_523_563_Open_Image" onclick="this.style.display='none'; Codehighlighter1_523_563_Open_Text.style.display='none'; Codehighlighter1_523_563_Closed_Image.style.display='inline'; Codehighlighter1_523_563_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_523_563_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_523_563_Closed_Text.style.display='none'; Codehighlighter1_523_563_Open_Image.style.display='inline'; Codehighlighter1_523_563_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_523_563_Open_Text"><span style="color: #000000">{t1</span><span style="color: #000000">=</span><span style="color: #000000">arg1.toString().split(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">)[</span><span style="color: #000000">1</span><span style="color: #000000">].length}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(e)</span><span id="Codehighlighter1_572_573_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_580_620_Open_Image" onclick="this.style.display='none'; Codehighlighter1_580_620_Open_Text.style.display='none'; Codehighlighter1_580_620_Closed_Image.style.display='inline'; Codehighlighter1_580_620_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_580_620_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_580_620_Closed_Text.style.display='none'; Codehighlighter1_580_620_Open_Image.style.display='inline'; Codehighlighter1_580_620_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_580_620_Open_Text"><span style="color: #000000">{t2</span><span style="color: #000000">=</span><span style="color: #000000">arg2.toString().split(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">)[</span><span style="color: #000000">1</span><span style="color: #000000">].length}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(e)</span><span id="Codehighlighter1_629_630_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img id="Codehighlighter1_644_781_Open_Image" onclick="this.style.display='none'; Codehighlighter1_644_781_Open_Text.style.display='none'; Codehighlighter1_644_781_Closed_Image.style.display='inline'; Codehighlighter1_644_781_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_644_781_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_644_781_Closed_Text.style.display='none'; Codehighlighter1_644_781_Open_Image.style.display='inline'; Codehighlighter1_644_781_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">with</span><span style="color: #000000">(Math)</span><span id="Codehighlighter1_644_781_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Number(arg1.toString().replace(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">""</span><span style="color: #000000">))&nbsp;<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Number(arg2.toString().replace(</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">""</span><span style="color: #000000">))&nbsp;<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(r1</span><span style="color: #000000">/</span><span style="color: #000000">r2)</span><span style="color: #000000">*</span><span style="color: #000000">pow(</span><span style="color: #000000">10</span><span style="color: #000000">,t2</span><span style="color: #000000">-</span><span style="color: #000000">t1);&nbsp;<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<img src ="http://www.blogjava.net/huyi0616/aggbug/316794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huyi0616/" target="_blank">一杯清茶</a> 2010-03-29 11:05 <a href="http://www.blogjava.net/huyi0616/archive/2010/03/29/316794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>