﻿<?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-积少成多-随笔分类-WEB</title><link>http://www.blogjava.net/ilovebabyfat/category/48767.html</link><description>垃圾堆</description><language>zh-cn</language><lastBuildDate>Fri, 06 Apr 2012 08:41:45 GMT</lastBuildDate><pubDate>Fri, 06 Apr 2012 08:41:45 GMT</pubDate><ttl>60</ttl><item><title>JQGrid</title><link>http://www.blogjava.net/ilovebabyfat/archive/2012/04/06/373456.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Fri, 06 Apr 2012 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2012/04/06/373456.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/373456.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2012/04/06/373456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/373456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/373456.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JQGrid是一个在jquery基础上做的一个表格控件，以ajax的方式和服务器端通信。JQGrid Demo 是一个在线的演示项目。在这里，可以知道jqgrid可以做什么事情。下面是转自其他人blog的一个学习资料，与其说是学习资料，说成查询帮助文档更加合适。  jqGrid学习之 ------------- 安装  jqGrid安装很简单，只需把相应的css、js文件加入到页面中即可。  按照...&nbsp;&nbsp;<a href='http://www.blogjava.net/ilovebabyfat/archive/2012/04/06/373456.html'>阅读全文</a><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/373456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2012-04-06 12:57 <a href="http://www.blogjava.net/ilovebabyfat/archive/2012/04/06/373456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE长时间等待服务器响应，显示页面无法显示的问题</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Sun, 07 Aug 2011 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/355967.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/355967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/355967.html</trackback:ping><description><![CDATA[项目通过JASPER跑报表，有几个报表牵涉的数据量比较大，导致响应时间超过1个小时，此时页面会提示&#8220;页面无法显示&#8221;。<br />开始以为是session的超时，于是在页面中添加了ajax去定期发送请求给服务器的代码来维持session， 问题无法解决。<br />然后以为是页面缓存的问题，在请求中加了随机的数字，查看每次请求回来的响应头状态都是200的，问题仍旧无法解决。<br />继续百度，继续谷歌。<br />搜索到microsoft的一篇文章，如下<br /><div><a href="http://support.microsoft.com/kb/181050">http://support.microsoft.com/kb/181050</a>&nbsp;<div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff; "><h1 class="title" style="box-sizing: border-box; font-size: 19px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">Internet Explorer error "connection timed out" when server does not respond<br /><span class="Apple-style-span" style="font-weight: normal; font-size: 12pt; ">问题得到解决。<br />其实可以说问题无法得到解决。我怎么可能让每个用户去修改他们的注册表么。<br /><br />看来只能采取异步的请求方式了。</span></h1></span></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/355967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-08-07 22:12 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Actuate使用总结</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Wed, 29 Jun 2011 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/353346.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/353346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/353346.html</trackback:ping><description><![CDATA[<div>  <p>Actuate <span style="font-family: SimSun;">简单报表的建立过程</span></p>  <p style="text-indent: -0.25in;"><span>1． </span><span style="font-family: SimSun;">1. 打开</span> e.report <span style="font-family: SimSun;">选择</span>new report</p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_1.JPG" alt="" width="294" border="0" height="114" /><br /></p>  <p style="text-indent: -0.25in;"><span>2． </span><span style="font-family: SimSun;">2.选择空白报表</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_2.JPG" alt="" width="295" border="0" height="114" /><br /></p>  <p style="text-indent: -0.25in;"><span>3． </span><span style="font-family: SimSun;">3. 建立数据库连接。</span>Tools<span style="font-family: Wingdings;">&#224;</span> Database Connection</p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_3.JPG" alt="" width="296" border="0" height="119" /><br /></p>  <p style="text-indent: -0.25in;"><span>4． </span><span style="font-family: SimSun;">4. 填写参数</span> </p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_4.JPG" alt="" width="296" border="0" height="119" /><br /></p>  <p style="text-indent: -0.25in;"><span>5． </span><span style="font-family: SimSun;">5. 双击</span>datasource , <span style="font-family: SimSun;">填写查询参数</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_5.JPG" alt="" width="296" border="0" height="136" /><br /></p>  <p style="text-indent: -0.25in;"><span>6． </span><span style="font-family: SimSun;">6. 选中</span>Content, Tool--〉<span style="font-family: Wingdings;"></span> Grouping, <span style="font-family: SimSun;">设置整个报表的</span>group<span style="font-family: SimSun;">，</span>1<span style="font-family: SimSun;">层</span>or n<span style="font-family: SimSun;">层。</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_6.JPG" alt="" width="280" border="0" height="166" /><br /></p>  <p style="text-indent: -0.25in;"><span>7． </span><span style="font-family: SimSun;">7. 单击</span>grouping option,<span style="font-family: SimSun;">设置</span>group<span style="font-family: SimSun;">的显示，是否需要</span>befer,after<span style="font-family: SimSun;">等，每个</span>group<span style="font-family: SimSun;">需要单独设置。</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_7.JPG" alt="" width="211" border="0" height="109" /><br /></p>  <p style="text-indent: -0.25in;"><span>8．&nbsp; </span><span style="font-family: SimSun;">8. 设置各种页面的控件</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_8.JPG" alt="" width="291" border="0" height="221" /><br /></p>  <p style="text-indent: -0.25in;"><span>9． </span><span style="font-family: SimSun;">9. 设置参数，这些参数可以用在报表控制上或是查询的参数</span>Tools <span style="font-family: Wingdings;">--</span> Parameters</p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/t_9.JPG" alt="" width="120" border="0" height="102" /><br /></p>  <p style="text-indent: -0.25in;"><span><span><span style="font: 7pt &quot;Times New Roman&quot;;"></span></span></span><span style="font-family: SimSun;">修改后的查询字段</span></p>  <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;fund_id,fund_name,fund_abbreviation,fund_mode,rule_id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;te_fund&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;fund_mode</span><span style="color: #808080;">=</span><span style="color: #000000;">:fundmode</span></div>  <p style="text-indent: -0.25in;"><span><span></span></span><span style="font-family: SimSun;">参数10. 用来控制页面显示</span></p>  <p><span style="font-family: SimSun;">已</span>label<span style="font-family: SimSun;">为例子，重写</span>OnRow<span style="font-family: SimSun;">方法</span></p>  <p style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;&nbsp;&nbsp; <br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">Sub</span><span style="color: #000000;">&nbsp;OnRow(&nbsp;row&nbsp;</span><span style="color: #0000ff;">As</span><span style="color: #000000;">&nbsp;AcDataRow&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;Super::OnRow(&nbsp;row&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;fundmode</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">M</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Manual&nbsp;Fund&nbsp;Name</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Auto&nbsp;Fund&nbsp;Name</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">End&nbsp;Sub</span></div><p style="margin-bottom: 0.0001pt; line-height: normal;"></p><p style="text-indent: -0.25in;"><span><span>11. </span></span><span style="font-family: SimSun;">用</span>datasource<span style="font-family: SimSun;">中的数据控制页面</span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">Sub</span><span style="color: #000000;">&nbsp;OnRow(&nbsp;row&nbsp;</span><span style="color: #0000ff;">As</span><span style="color: #000000;">&nbsp;AcDataRow&nbsp;)<br />&nbsp;Super::OnRow(&nbsp;row&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">If</span><span style="color: #000000;">&nbsp;row.GetValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">DR_SHORT_FLAG</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">BUY&nbsp;BACK</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ElseIf</span><span style="color: #000000;">&nbsp;row.GetValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">DR_SHORT_FLAG</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Sell&nbsp;to&nbsp;Open</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">End</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">End&nbsp;Sub</span></div><p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/353346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-29 13:28 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex Builder 3 下载与注册</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353301.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Tue, 28 Jun 2011 14:46:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353301.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/353301.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/353301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/353301.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: verdana,'ms song',宋体,Arial,微软雅黑,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"><span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;<span class="hilite2" style="margin: 0px; padding: 0px; line-height: 1.5;">Builder</span>&nbsp;3 正式版，发布于中国时间 2008 年 2 月 25 日；<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />下载地址一：<br style="margin: 0px; padding: 0px;" /></font></span><a href="http://download.macromedia.com/pub/flex/flex_builder/FB3_win.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" color="#108ac6" size="2">http://download.macromedia.com/pub/<span class="t_tag" style="margin: 0px; padding: 0px; line-height: 1.5;"><span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">flex</span></span>/<span class="t_tag" style="margin: 0px; padding: 0px; line-height: 1.5;"><span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">flex</span></span>_builder/FB3_win.exe</font></span></a><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">大小： 424 MB ；未进行压缩的&nbsp;<span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;<span class="hilite2" style="margin: 0px; padding: 0px; line-height: 1.5;">Builder</span>&nbsp;3 安装文件<br style="margin: 0px; padding: 0px;" />不用注册登录，可以直接下载。<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /></font></span><a href="http://trials.adobe.com/Applications/Flex/FlexBuilder/3/FB3_WWEJ.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #800080; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">下载地址二：</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"></font></span></p><h2 style="margin: 15px auto 2px; padding: 0px; font-size: 18px; font-weight: bold;"><a href="http://trials.adobe.com/Applications/.../FB3_WWEJ.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" color="#108ac6" size="2">http://t<span class="t_tag" style="margin: 0px; padding: 0px; line-height: 1.5;">ria</span>ls.adobe.com/Applications/.../FB3_WWEJ.exe</font></span></a><a href="http://trials.adobe.com/Applications/Flex/FlexBuilder/3/FB3_WWEJ.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" color="#108ac6" size="2">大小：　385.84 MB　；　已经压缩的&nbsp;<span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;<span class="hilite2" style="margin: 0px; padding: 0px; line-height: 1.5;">Builder</span>&nbsp;3 安装文件<br style="margin: 0px; padding: 0px;" />需要注册登录，才可下载。</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"></font></span></h2><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"><span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;<span class="hilite2" style="margin: 0px; padding: 0px; line-height: 1.5;">builder</span>&nbsp;3.0注册码（已经试过的，可用的）：</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">1377-4168-2018-0771-2432-1495</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">1377-4760-3354-0772-2773-8996</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">1377-4165-2080-7265-7813-8901</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">1377-4964-5021-8182-2399-8235</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"><span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;<span class="hilite2" style="margin: 0px; padding: 0px; line-height: 1.5;">builder</span>&nbsp;中要进行调试，就必须安装含debug的flash player版本。下载链接地址：</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 0px;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Adobe Flash Player 9 &#8212; Debugger Versions (aka debug players or content debuggers) for&nbsp;<span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;and Flash Developers</font></span></strong></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"><strong style="margin: 0px; padding: 0px;">12/3/2007</strong>&nbsp;Updated debugger versions of Flash Player 9 (aka debug players or content debuggers) are available for&nbsp;<span class="hilite1" style="margin: 0px; padding: 0px; line-height: 1.5;">Flex</span>&nbsp;<span class="hilite2" style="margin: 0px; padding: 0px; line-height: 1.5;">Builder</span>&nbsp;2 users and Flash CS3 Professional users. These new players are version 9.0.r115.</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_ax_debug.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Windows Flash Player 9 ActiveX control content debugger (for IE)</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">&nbsp;(EXE, 1.59 MB)</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_plugin_debug.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Windows Flash Player 9 Plugin content debugger (for Netscape-compatible browsers)</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">&nbsp;(EXE, 1.56 MB)</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/sa_flashplayer_9_debug.exe" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Windows Flash Player 9 Projector content debugger</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">&nbsp;(EXE, 3.69 MB)</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_plugin_debug_ub.dmg" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Macintosh Flash Player 9 Plugin content debugger (Intel-based Macs)</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">&nbsp;(DMG, 5.35 MB)</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flashplayer_9_plugin_debug.dmg" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Macintosh Flash Player 9 Plugin content debugger (PowerPC-based Macs)</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">&nbsp;(DMG, 2.41 MB)</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/sa_flashplayer_9_debug.app.zip" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Macintosh Flash Player 9 Projector content debugger</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">&nbsp;(ZIP, 4.81 MB)</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2"><strong style="margin: 0px; padding: 0px;">12/3/2007</strong>&nbsp;Updated Linux debugger versions (aka debug players or content debuggers) of Flash Player 9 are now available. Additionally, the Linux standalone player (projector) is available for developers who wish to publish projectors on Linux operating systems.</font></span></p><p style="margin: 5px auto; padding: 0px; text-indent: 2em;"><a href="http://download.macromedia.com/pub/flashplayer/updaters/9/flash_player_9_linux_dev.tar.gz" target="_blank" style="margin: 0px; padding: 0px; color: black; text-decoration: underline;"><span style="margin: 0px; padding: 0px; line-height: 1.5; color: #1b8cba; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">Download the Linux debugger and standalone players&nbsp;</font></span></a><span style="margin: 0px; padding: 0px; line-height: 1.5; font-size: small;"><font style="margin: 0px; padding: 0px;" size="2">(TAR.GZ, 9.29 MB)</font></span></p></span><span class="Apple-style-span" style="font-family: verdana,'ms song',宋体,Arial,微软雅黑,Helvetica,sans-serif; font-size: 12px; line-height: normal;"><h1 class="postTitle" style="margin: 0px; padding: 0px 0px 0px 5px; font-size: 16px; font-weight: bold; border-width: 0px 0px 1px; border-bottom: 1px dashed #cccccc; line-height: 1.5em; width: 1018px; clear: both;"><a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/xuling/archive/2010/02/15/1668580.html"></a></h1></span><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/353301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-28 22:46 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的session 超时提新</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353272.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Tue, 28 Jun 2011 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353272.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/353272.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/353272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/353272.html</trackback:ping><description><![CDATA[项目中，浏览器和服务器之间长时间没有交互，会被超时，但是用户只有在下次尝试连接的时候才会知道已经超时了。总结了一下当前这个项目针对这个问题是怎么做的。 <br />在即将超时的时候，提醒用户，之后通过ajax 发送空消息给服务器以防止服务器将session无效。<br />下面是核心的代码：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;previousSmSession&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;times&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;timer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;setInterval(</span><span style="color: #000000;">"</span><span style="color: #000000;">checkSmSession()</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">60</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3000</span><span style="color: #000000;">);<br /></span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;maxTimes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">;<br /><br /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;checkSmSession()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;currentSmSession&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getCurrSmSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(currentSmSession&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;previousSmSession)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previousSmSession&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;currentSmSession;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(maxTimes&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;times)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.focus();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;currentCheckingTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentCheckingTime.setTime(currentCheckingTime.getTime()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">60</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3000</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;sessionWarningMsg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Due&nbsp;to&nbsp;inactivity&nbsp;you&nbsp;will&nbsp;be&nbsp;logged&nbsp;out&nbsp;of&nbsp;the&nbsp;system&nbsp;at&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;currentCheckingTime.toLocaleString().replace(</span><span style="color: #000000;">/^</span><span style="color: #000000;">.</span><span style="color: #000000;">*?</span><span style="color: #000000;">\d{</span><span style="color: #000000;">4</span><span style="color: #000000;">}&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">,</span><span style="color: #000000;">""</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.&nbsp;To&nbsp;extend&nbsp;your&nbsp;session&nbsp;click&nbsp;OK.</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;confirm(sessionWarningMsg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(val)&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;times&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #000000;">refreshSessions();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;self.location&nbsp;=&nbsp;"/wps/logout.jsp";&nbsp;</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&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;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;getCurrSmSession()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;allCookies&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.cookie.split(</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;aCookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;aCookieName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;aCookieValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">allCookies.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aCookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;allCookies[i].split(</span><span style="color: #000000;">"</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aCookieName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;aCookie[</span><span style="color: #000000;">0</span><span style="color: #000000;">].replace(</span><span style="color: #000000;">/^</span><span style="color: #000000;">\s</span><span style="color: #000000;">+|</span><span style="color: #000000;">\s</span><span style="color: #000000;">+</span><span style="color: #000000;">$</span><span style="color: #000000;">/</span><span style="color: #000000;">g,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(smSessionName&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;aCookieName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(aCookie.length&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aCookieValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;unescape(aCookie[</span><span style="color: #000000;">1</span><span style="color: #000000;">].replace(</span><span style="color: #000000;">/^</span><span style="color: #000000;">\s</span><span style="color: #000000;">+|</span><span style="color: #000000;">\s</span><span style="color: #000000;">+</span><span style="color: #000000;">$</span><span style="color: #000000;">/</span><span style="color: #000000;">g,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;allCookies.length)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aCookieValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;aCookieValue;<br />}<br /><br /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;refreshSessions&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;dummyUrls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/FlexKeepAlive.jsp</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/cfi/FlexKeepAlive.jsp</span><span style="color: #000000;">"</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">dummyUrls.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;aXmlHttp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getXMLHttpObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;aXmlHttp)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">AJAX&nbsp;does&nbsp;not&nbsp;work!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aXmlHttp.open(</span><span style="color: #000000;">"</span><span style="color: #000000;">GET</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;dummyUrls[i]</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">?sid=</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">Math.random(),&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aXmlHttp.send(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;getXMLHttpObject&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;xmlHttpObj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHttpObj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XMLHttpRequest();</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Firefox&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHttpObj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActiveXObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">Msxml2.XMLHTTP</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">IE</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHttpObj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActiveXObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">Microsoft.XMLHTTP</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;xmlHttpObj;<br />}</span></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/353272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-28 16:22 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/28/353272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)J2EE项目异常处理</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Mon, 27 Jun 2011 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/353073.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/353073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/353073.html</trackback:ping><description><![CDATA[<div>http://www.iteye.com/topic/72170</div><br />关于j2ee项目中异常的管理和设计。之前一直困惑于异常的处理，为什么异常分为checked和uncheck，应该遵循怎样的规则自定义异常。在j2ee项目中，处理异常需要注意什么地方。<br />[原文]<br /><div>为什么要在J2EE项目中谈异常处理呢？可能许多java初学者都想说：&#8220;异常处理不就是try&#8230;.catch&#8230;finally吗？这谁都会 啊！&#8221;。笔者在初学java时也是这样认为的。如何在一个多层的j2ee项目中定义相应的异常类？在项目中的每一层如何进行异常处理？异常何时被抛出？异 常何时被记录？异常该怎么记录？何时需要把checked Exception转化成unchecked Exception  ，何时需要把unChecked Exception转化成checked  Exception?异常是否应该呈现到前端页面？如何设计一个异常框架？本文将就这些问题进行探讨。 <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">1．&nbsp;JAVA异常处理</div> <div style="margin: 0cm 0cm 0pt 18pt;">在面向过程式的编程语言中，我们可以通过返回值来确定方法是否正常执行。比如在一个c语言编写的程序中，如果方法正确的执行则返回1.错误则返回0。在vb或delphi开发的应用程序中，出现错误时，我们就弹出一个消息框给用户。</div> <div style="margin: 0cm 0cm 0pt 18pt;">通过方法的返回值我们并不能获得错误的详细信息。可能因为方法由不同的程序员编写，当同一类错误在不同的方法出现时，返回的结果和错误信息并不一致。</div> <div style="margin: 0cm 0cm 0pt 18pt;">所以java语言采取了一个统一的异常处理机制。</div> <div style="margin: 0cm 0cm 0pt 18pt;">什么是异常？运行时发生的可被捕获和处理的错误。</div> <div style="margin: 0cm 0cm 0pt 18pt;">在java语言中，Exception是所有异常的父类。任何异常都扩 展于Exception类。Exception就相当于一个错误类型。如果要定义一个新的错误类型就扩展一个新的Exception子类。采用异常的好处 还在于可以精确的定位到导致程序出错的源代码位置,并获得详细的错误信息。</div> <div style="margin: 0cm 0cm 0pt 18pt;">Java异常处理通过五个关键字来实 现，try,catch,throw ,throws,  finally。具体的异常处理结构由try&#8230;.catch&#8230;.finally块来实现。try块存放可能出现异常的java语句，catch用来捕获发 生的异常，并对异常进行处理。Finally块用来清除程序中未释放的资源。不管理try块的代码如何返回，finally块都总是被执行。</div> <div style="margin: 0cm 0cm 0pt 18pt;">一个典型的异常处理代码</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;</span> </li><li>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;DataAccessException{ &nbsp;&nbsp; </li><li>String&nbsp;sql&nbsp;=&nbsp;&#8220;select&nbsp;password&nbsp;from&nbsp;userinfo&nbsp;where&nbsp;userid=&#8217;&#8221;+userId&nbsp;+&#8221;&#8217;&#8221;; &nbsp;&nbsp; </li><li>String&nbsp;password&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>Connection&nbsp;con&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>Statement&nbsp;s&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>ResultSet&nbsp;rs&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>try{ &nbsp;&nbsp; </li><li>&nbsp;con&nbsp;=&nbsp;getConnection();//获得数据连接 &nbsp;&nbsp; </li><li>&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;rs&nbsp;=&nbsp;s.executeQuery(sql); &nbsp;&nbsp; </li><li>&nbsp;while(rs.next()){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;=&nbsp;rs.getString(1); &nbsp;&nbsp; </li><li>&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;rs.close(); &nbsp;&nbsp; </li><li>&nbsp;s.close(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>Catch(SqlException&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;throw&nbsp;new&nbsp;DataAccessException(ex); &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>finally{ &nbsp;&nbsp; </li><li>&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(con&nbsp;!=&nbsp;null){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DataAccessException(&#8220;关闭连接失败!&#8221;,sqlEx); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>return&nbsp;password; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">可以看出Java的异常处理机制具有的优势：</div> <div style="margin: 0cm 0cm 0pt 18pt;">给错误进行了统一的分类，通过扩展Exception类或其子类来实现。从而避免了相同的错误可能在不同的方法中具有不同的错误信息。在不同的方法中出现相同的错误时，只需要throw 相同的异常对象即可。</div> <div style="margin: 0cm 0cm 0pt 18pt;">获得更为详细的错误信息。通过异常类，可以给异常更为详细，对用户更为有用的错误信息。以便于用户进行跟踪和调试程序。</div> <div style="margin: 0cm 0cm 0pt 18pt;">把正确的返回结果与错误信息分离。降低了程序的复杂度。调用者无需要对返回结果进行更多的了解。</div> <div style="margin: 0cm 0cm 0pt 18pt;">强制调用者进行异常处理，提高程序的质量。当一个方法声明需要抛出一个异常时，那么调用者必须使用try&#8230;.catch块对异常进行处理。当然调用者也可以让异常继续往上一层抛出。</div> <div>&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">2．&nbsp;Checked 异常 还是 unChecked 异常？</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">Java异常分为两大类:checked 异常和unChecked 异常。所有继承java.lang.Exception 的异常都属于checked异常。所有继承java.lang.RuntimeException的异常都属于unChecked异常。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">当一个方法去调用一个可能抛出checked异常的方法，必须通过try&#8230;catch块对异常进行捕获进行处理或者重新抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;">我们看看Connection接口的createStatement()方法的声明。</div> <div style="margin: 0cm 0cm 0pt 18pt;">public Statement createStatement() throws SQLException;</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div> <div>&nbsp;&nbsp; SQLException是checked异常。当调用createStatement方法时，java强制调用者必须对SQLException进行捕获处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getPassword(String&nbsp;userId){ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&#8230;&#8230; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> 或者</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;SQLException{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>}&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">(当然，像Connection,Satement这些资源是需要及时关闭的，这里仅是为了说明checked 异常必须强制调用者进行捕获或继续抛出)</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">unChecked异常也称为运行时异常，通常 RuntimeException都表示用户无法恢复的异常，如无法获得数据库连接，不能打开文件等。虽然用户也可以像处理checked异常一样捕获 unChecked异常。但是如果调用者并没有去捕获unChecked异常时，编译器并不会强制你那么做。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">比如一个把字符转换为整型数值的代码如下：</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>String&nbsp;str&nbsp;=&nbsp;&#8220;123&#8221;; &nbsp;&nbsp;</span> </li><li>int&nbsp;value&nbsp;=&nbsp;Integer.parseInt(str);&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">parseInt的方法签名为：</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;static&nbsp;int&nbsp;parseInt(String&nbsp;s)&nbsp;throws&nbsp;NumberFormatException&nbsp;&nbsp;</span> </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">当传入的参数不能转换成相应的整数时，将会抛出NumberFormatException。因为NumberFormatException扩展于RuntimeException，是unChecked异常。所以调用parseInt方法时无需要try&#8230;catch</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><span style="color: red;">因为java不强制调用者对unChecked异常进行捕获或往上抛 出。所以程序员总是喜欢抛出unChecked异常。或者当需要一个新的异常类时，总是习惯的从RuntimeException扩展。当你去调用它些方 法时，如果没有相应的catch块，编译器也总是让你通过,同时你也根本无需要去了解这个方法倒底会抛出什么异常。看起来这似乎倒是一个很好的办法，但是 </span>这样做却是远离了java异常处理的真实意图。并且对调用你这个类的程序员带来误导，因为调用者根本不知道需要在什么情况下处理异常。而checked异 常可以明确的告诉调用者，调用这个类需要处理什么异常。如果调用者不去处理，编译器都会提示并且是无法编译通过的。当然怎么处理是由调用者自己去决定的。</div> <div>&nbsp;</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以Java推荐人们在应用代码中应该使用checked异常。就像我们在上节提到运用异常的好外在于可以强制调用者必须对将会产生的异常进行处理。包括在《java Tutorial》等java官方文档中都把checked异常作为标准用法。</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用checked异常，应意味着有许多的try&#8230;catch在你的代码中。当在编写和处理越来越多的try&#8230;catch块之后，许多人终于开始怀疑checked异常倒底是否应该作为标准用法了。</div> <div>甚至连大名鼎鼎的《thinking in java》的作者Bruce&nbsp;Eckel也改变了他曾经的想法。Bruce  Eckel甚至主张把unChecked异常作为标准用法。并发表文章，以试验checked异常是否应该从java中去掉。Bruce  Eckel语：&#8220;当少量代码时，checked异常无疑是十分优雅的构思，并有助于避免了许多潜在的错误。但是经验表明，对大量代码来说结果正好相反&#8221;</div> <div>关于checked异常和unChecked异常的详细讨论可以参考</div> <div style="text-indent: 15.75pt;">Alan Griffiths&nbsp;<a href="http://www.octopull.demon.co.uk/java/ExceptionalJava.html">http://www.octopull.demon.co.uk/java/ExceptionalJava.html</a> </div> <div>&nbsp;&nbsp; Bruce Eckel&nbsp;<a href="http://www.mindview.net/Etc/Disscussions/CheckedExceptions">http://www.mindView.net/Etc/Disscussions/CheckedExceptions</a></div> <div>&nbsp;&nbsp; 《java Tutorial》 <a href="http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html">http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html</a></div> <div>&nbsp;</div> <div>使用checked异常会带来许多的问题。</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checked异常导致了太多的try&#8230;catch 代码</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能有很多checked异常对开发人员来说是无法合理地进行处理的，比如 SQLException。而开发人员却不得不去进行try&#8230;catch。当开发人员对一个checked异常无法正确的处理时，通常是简单的把异常打印 出来或者是干脆什么也不干。特别是对于新手来说，过多的checked异常让他感到无所适从。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlEx.PrintStackTrace(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;或者 &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//什么也不干 &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">checked异常导致了许多难以理解的代码产生</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当开发人员必须去捕获一个自己无法正确处理的checked异常，通常的是重新封装成一个新的异常后再抛出。这样做并没有为程序带来任何好处。反而使代码晚难以理解。</div> <div style="margin: 0cm 0cm 0pt 18pt;">就像我们使用JDBC代码那样，需要处理非常多的try&#8230;catch.，真正有用的代码被包含在try&#8230;catch之内。使得理解这个方法变理困难起来</div> <div style="margin: 0cm 0cm 0pt 18pt;">checked异常导致异常被不断的封装成另一个类异常后再抛出</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodA()throws&nbsp;ExceptionA{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;void&nbsp;methodB()throws&nbsp;ExceptionB{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodA(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;}catch(ExceptionA&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionB(ex); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Public&nbsp;void&nbsp;methodC()throws&nbsp;ExceptinC{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodB(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(ExceptionB&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionC(ex); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li></ol></div> 我们看到异常就这样一层层无休止的被封装和重新抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">checked异常导致破坏接口方法</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;&nbsp; 一个接口上的一个方法已被多个类使用，当为这个方法额外添加一个checked异常时，那么所有调用此方法的代码都需要修改。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">可见上面这些问题都是因为调用者无法正确的处理checked异常时而被迫去捕获和处理，被迫封装后再重新抛出。这样十分不方便，并不能带来任何好处。在这种情况下通常使用unChecked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">chekced异常并不是无一是处，checked异常比传统编程的错误返回值要好用得多。通过编译器来确保正确的处理异常比通过返回值判断要好得多。</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">如果一个异常是致命的，不可恢复的。或者调用者去捕获它没有任何益处，使用unChecked</strong><strong>异常。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">如果一个异常是可以恢复的，可以被调用者正确处理的，使用checked</strong><strong>异常</strong>。</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">在使用unChecked</strong><strong style="color: red;">异常时，必须在在方法声明中详细的说明该方法可能会抛出的unChekced</strong><strong style="color: red;">异常。由调用者自己去决定是否捕获unChecked</strong><strong style="color: red;">异常</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">倒底什么时候使用checked异常，什么时候使用unChecked异常？并没有一个绝对的标准。但是笔者可以给出一些建议</div> <div style="margin: 0cm 0cm 0pt 18pt;">当所有调用者必须处理这个异常，可以让调用者进行重试操作；或者该异常相当于该方法的第二个返回值。使用checked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">这个异常仅是少数比较高级的调用者才能处理，一般的调用者不能正确的处理。使用unchecked异常。有能力处理的调用者可以进行高级处理，一般调用者干脆就不处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;">这个异常是一个非常严重的错误，如数据库连接错误，文件无法打开等。或者这些异常是与外部环境相关的。不是重试可以解决的。使用unchecked异常。因为这种异常一旦出现，调用者根本无法处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果不能确定时，使用unchecked异常。并详细描述可能会抛出的异常,以让调用者决定是否进行处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">3．<span style="font-family: 'Times New Roman';">&nbsp;</span>设计一个新的异常类</div> <div style="margin: 0cm 0cm 0pt 18pt;">在设计一个新的异常类时，首先看看是否真正的需要这个异常类。一般情况下尽量不要去设计新的异常类，而是尽量使用java中已经存在的异常类。</div> <pre>如<div>java 代码</div><div><ol><li><span>IllegalArgumentException,&nbsp;UnsupportedOperationException&nbsp;&nbsp;</span></li></ol></div></pre> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">不管是新的异常是chekced异常还是unChecked异常。我们都必须考虑异常的嵌套问题。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;void&nbsp;methodA()throws&nbsp;ExceptionA{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">方法methodA声明会抛出ExceptionA.</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">public void methodB()throws ExceptionB</div> <div style="margin: 0cm 0cm 0pt 18pt;">methodB声明会抛出ExceptionB,当在methodB方 法中调用methodA时，ExceptionA是无法处理的,所以ExceptionA应该继续往上抛出。一个办法是把methodB声明会抛出 ExceptionA.但这样已经改变了MethodB的方法签名。一旦改变，则所有调用methodB的方法都要进行改变。</div> <div style="margin: 0cm 0cm 0pt 18pt;">另一个办法是把ExceptionA封装成ExceptionB，然后再抛出。如果我们不把ExceptionA封装在ExceptionB中，就丢失了根异常信息，使得无法跟踪异常的原始出处。</div> <div style="text-indent: 15.75pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;void&nbsp;methodB()throws&nbsp;ExceptionB{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodA(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;}catch(ExceptionA&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionB(ex); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>}&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div>&nbsp;&nbsp; 如上面的代码中，ExceptionB嵌套一个ExceptionA.我们暂且把ExceptionA称为&#8220;起因异常&#8221;,因为ExceptionA导致了ExceptionB的产生。这样才不使异常信息丢失。</div> <div>所以我们在定义一个新的异常类时，必须提供这样一个可以包含嵌套异常的构造函数。并有一个私有成员来保存这个&#8220;起因异常&#8221;。</div> <div> <div>java 代码</div> <div><ol><li><span>public&nbsp;Class&nbsp;ExceptionB&nbsp;extends&nbsp;Exception{ &nbsp;&nbsp;</span> </li><li>private&nbsp;Throwable&nbsp;cause; &nbsp;&nbsp; </li><li>&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;ExceptionB(String&nbsp;msg,&nbsp;Throwable&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;super(msg); &nbsp;&nbsp; </li><li>&nbsp;this.cause&nbsp;=&nbsp;ex; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;ExceptionB(String&nbsp;msg){ &nbsp;&nbsp; </li><li>&nbsp;super(msg); &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;ExceptionB(Throwable&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;this.cause&nbsp;=&nbsp;ex; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> 当然，我们在调用printStackTrace方法时，需要把所有的&#8220;起因异常&#8221;的信息也同时打印出来。所以我们需要覆写printStackTrace方法来显示全部的异常栈跟踪。包括嵌套异常的栈跟踪。</div> <div> <div>java 代码</div> <div><ol><li><span style="color: red;">public&nbsp;void&nbsp;printStackTrace(PrintStrean&nbsp;ps){ &nbsp;&nbsp;</span></li><li><span style="color: red;">if(cause&nbsp;==&nbsp;null){ &nbsp;&nbsp;</span></li><li><span style="color: red;">&nbsp;super.printStackTrace(ps); &nbsp;&nbsp;</span></li><li><span style="color: red;">}else{ &nbsp;&nbsp;</span></li><li><span style="color: red;">&nbsp;ps.println(this); &nbsp;&nbsp;</span></li><li><span style="color: red;">&nbsp;cause.printStackTrace(ps); &nbsp;&nbsp;</span></li><li><span style="color: red;">} &nbsp;&nbsp;</span></li><li><span style="color: red;">} &nbsp;&nbsp;</span></li></ol></div> &nbsp;</div> <div>一个完整的支持嵌套的checked异常类源码如下。我们在这里暂且把它叫做NestedException</div> <div>&nbsp;</div> <div> <div>java 代码</div> <div><ol><li><span>public&nbsp;NestedException&nbsp;extends&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>private&nbsp;Throwable&nbsp;cause; &nbsp;&nbsp;</li><li>public&nbsp;NestedException&nbsp;(String&nbsp;msg){ &nbsp;&nbsp;</li><li>&nbsp;super(msg); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;NestedException(String&nbsp;msg,&nbsp;Throwable&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;super(msg); &nbsp;&nbsp;</li><li>&nbsp;This.cause&nbsp;=&nbsp;ex; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;Throwable&nbsp;getCause(){ &nbsp;&nbsp;</li><li>&nbsp;return&nbsp;(this.cause&nbsp;==&nbsp;null&nbsp;?&nbsp;this&nbsp;:this.cause); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;getMessage(){ &nbsp;&nbsp;</li><li>&nbsp;String&nbsp;message&nbsp;=&nbsp;super.getMessage(); &nbsp;&nbsp;</li><li>&nbsp;Throwable&nbsp;cause&nbsp;=&nbsp;getCause(); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;if(cause&nbsp;!=&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;message&nbsp;+&nbsp;&#8220;;nested&nbsp;Exception&nbsp;is&nbsp;&#8221;&nbsp;+&nbsp;cause; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>&nbsp;return&nbsp;message; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;printStackTrace(PrintStream&nbsp;ps){ &nbsp;&nbsp;</li><li>&nbsp;if(getCause&nbsp;==&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;super.printStackTrace(ps); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li><li>&nbsp;}else{ &nbsp;&nbsp;</li><li>&nbsp;ps.println(this); &nbsp;&nbsp;</li><li>&nbsp;getCause().printStackTrace(ps); &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;printStackTrace(PrintWrite&nbsp;pw){ &nbsp;&nbsp;</li><li>&nbsp;if(getCause()&nbsp;==&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;super.printStackTrace(pw); &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>&nbsp;else{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;pw.println(this); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;getCause().printStackTrace(pw); &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;printStackTrace(){ &nbsp;&nbsp;</li><li>&nbsp;printStackTrace(System.error); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li></ol></div> 同样要设计一个unChecked异常类也与上面一样。只是需要继承RuntimeException。</div> <div>&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">4．<span style="font-family: 'Times New Roman';">&nbsp;</span>如何记录异常</div> <div style="margin: 0cm 0cm 0pt 18pt;">作为一个大型的应用系统都需要用日志文件来记录系统的运行，以便于跟踪和记录系统的运行情况。系统发生的异常理所当然的需要记录在日志系统中。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;NoSuchUserException{ &nbsp;&nbsp;</span></li><li>UserInfo&nbsp;user&nbsp;=&nbsp;userDao.queryUserById(userId); &nbsp;&nbsp;</li><li>If(user&nbsp;==&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;Logger.info(&#8220;找不到该用户信息,userId=&#8221;+userId); &nbsp;&nbsp;</li><li>&nbsp;throw&nbsp;new&nbsp;NoSuchUserException(&#8220;找不到该用户信息,userId=&#8221;+userId); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>else{ &nbsp;&nbsp;</li><li>&nbsp;return&nbsp;user.getPassword(); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;sendUserPassword(String&nbsp;userId)throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</li><li>UserInfo&nbsp;user&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;user&nbsp;=&nbsp;getPassword(userId); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;//&#8230;&#8230;.. &nbsp;&nbsp;</li><li>&nbsp;sendMail(); &nbsp;&nbsp;</li><li>&nbsp;// &nbsp;&nbsp;</li><li>}catch(NoSuchUserException&nbsp;ex)( &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;logger.error(&#8220;找不到该用户信息:&#8221;+userId+ex); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception(ex); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">我们注意到，一个错误被记录了两次.在错误的起源位置我们仅是以info级别进行记录。而在sendUserPassword方法中，我们还把整个异常信息都记录了。</div> <div style="margin: 0cm 0cm 0pt 18pt;">笔者曾看到很多项目是这样记录异常的，不管三七二一，只有遇到异常就把整个异常全部记录下。如果一个异常被不断的封装抛出多次，那么就被记录了多次。那么异常倒底该在什么地方被记录？</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>异常应该在最初产生的位置记录</strong>！</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果必须捕获一个无法正确处理的异常，仅仅是把它封装成另外一种异常往上抛出。不必再次把已经被记录过的异常再次记录。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>如果捕获到一个异常，但是这个异常是可以处理的。则无需要记录异常</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;Date&nbsp;getDate(String&nbsp;str){ &nbsp;&nbsp;</span></li><li>&nbsp;Date&nbsp;applyDate&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat(&#8220;MM/dd/yyyy&#8221;); &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>&nbsp;applyDate&nbsp;=&nbsp;format.parse(applyDateStr); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>catch(ParseException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;//乎略，当格式错误时，返回null &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>return&nbsp;applyDate; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>捕获到一个未记录过的异常或外部系统异常时，应该记录异常的详细信息</strong></div> <div><span> <div>java 代码</div> <div><ol><li><span>try{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql=&#8221;select&nbsp;*&nbsp;from&nbsp;userinfo&#8221;; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.error(&#8220;sql执行错误&#8221;+sql+sqlEx); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div> <div>&nbsp;&nbsp; 究竟在哪里记录异常信息，及怎么记录异常信息，可能是见仁见智的问题了。甚至有些系统让异常类一记录异常。当产生一个新异常对象时，异常信息就被自动记录。</div> <div style="text-indent: 10.5pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;public&nbsp;class&nbsp;BusinessException&nbsp;extends&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;logTrace()&nbsp;{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer=new&nbsp;StringBuffer(); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append("Business&nbsp;Error&nbsp;in&nbsp;Class:&nbsp;"); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(getClassName()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(",method:&nbsp;"); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(getMethodName()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(",messsage:&nbsp;"); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(this.getMessage()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(buffer.toString()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;BusinessException(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(s); &nbsp;&nbsp;</li><li>race(); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> 这似乎看起来是十分美妙的，其实必然导致了异常被重复记录。同时违反了&#8220;类的职责分配原则&#8221;，是一种不好的设计。记录异常不属于异常类的行为，记录异常应 该由专门的日志系统去做。并且异常的记录信息是不断变化的。我们在记录异常同应该给更丰富些的信息。以利于我们能够根据异常信息找到问题的根源，以解决问 题。</div> <div style="text-indent: 10.5pt;">虽然我们对记录异常讨论了很多，过多的强调这些反而使开发人员更为疑惑，一种好的方式是为系统提供一个异常处理框架。由框架来决定是否记录异常和怎么记录异常。而不是由普通程序员去决定。但是了解些还是有益的。</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><strong>5．&nbsp;J2EE项目中的异常处理</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">目前,J2ee项目一般都会从逻辑上分为多层。比较经典的分为三层：表示层，业务层，集成层(包括数据库访问和外部系统的访问)。</div> <div style="margin: 0cm 0cm 0pt 18pt;">J2ee项目有着其复杂性，J2ee项目的异常处理需要特别注意几个问题。</div> <div style="margin: 0cm 0cm 0pt 18pt;">在分布式应用时，我们会遇到许多checked异常。所有RMI调用 （包括EJB远程接口调用）都会抛出java.rmi.RemoteException;同时RemoteException是checked异常，当我 们在业务系统中进行远程调用时，我们都需要编写大量的代码来处理这些checked异常。而一旦发生RemoteException这些checked异 常对系统是非常严重的，几乎没有任何进行重试的可能。也就是说，当出现RemoteException这些可怕的checked异常，我们没有任何重试的 必要性，却必须要编写大量的try&#8230;catch代码去处理它。一般我们都是在最底层进行RMI调用，只要有一个RMI调用，所有上层的接口都会要求抛出 RemoteException异常。因为我们处理RemoteException的方式就是把它继续往上抛。这样一来就破坏了我们业务接口。 RemoteException这些J2EE系统级的异常严重的影响了我们的业务接口。我们对系统进行分层的目的就是减少系统之间的依赖，每一层的技术改 变不至于影响到其它层。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>// &nbsp;&nbsp;</span></li><li>public&nbsp;class&nbsp;UserSoaImpl&nbsp;implements&nbsp;UserSoa{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;public&nbsp;UserInfo&nbsp;getUserInfo(String&nbsp;userId)throws&nbsp;RemoteException{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&#8230;&#8230; &nbsp;&nbsp;</li><li>远程方法调用. &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;interface&nbsp;UserManager{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;public&nbsp;UserInfo&nbsp;getUserInfo(Stirng&nbsp;userId)throws&nbsp;RemoteException; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">同样JDBC访问都会抛出SQLException的checked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">为了避免系统级的checked异常对业务系统的深度侵入，我们可以为 业务方法定义一个业务系统自己的异常。针对像SQLException,RemoteException这些非常严重的异常，我们可以新定义一个 unChecked的异常，然后把SQLException，RemoteException封装成unChecked异常后抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果这个系统级的异常是要交由上一级调用者处理的，可以新定义一个checked的业务异常，然后把系统级的异常封存装成业务级的异常后再抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">一般地，我们需要定义一个unChecked</strong><strong style="color: red;">异常，让集成层接口的所有方法都声明抛出这unChecked</strong><strong style="color: red;">异常</strong><span style="color: red;">。</span></div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;DataAccessException&nbsp;extends&nbsp;RuntimeException{ &nbsp;&nbsp;</span></li><li>&nbsp;&#8230;&#8230; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;interface&nbsp;UserDao{ &nbsp;&nbsp;</li><li>&nbsp;public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;DataAccessException; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;class&nbsp;UserDaoImpl&nbsp;implements&nbsp;UserDAO{ &nbsp;&nbsp;</li><li>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;DataAccessException{ &nbsp;&nbsp;</li><li>&nbsp;String&nbsp;sql&nbsp;=&nbsp;&#8220;select&nbsp;password&nbsp;from&nbsp;userInfo&nbsp;where&nbsp;userId=&nbsp;&#8216;&#8221;+userId+&#8221;&#8217;&#8221;; &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//JDBC调用 &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.executeQuery(sql); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;}catch(SQLException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DataAccessException(&#8220;数据库查询失败&#8221;+sql,ex); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">定义一个checked</strong><strong style="color: red;">的业务异常，让业务层的接口的所有方法都声明抛出Checked</strong><strong style="color: red;">异常</strong><span style="color: red;">.</span></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;class&nbsp;BusinessException&nbsp;extends&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>&nbsp;&#8230;.. &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;interface&nbsp;UserManager{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;public&nbsp;Userinfo&nbsp;copyUserInfo(Userinfo&nbsp;user)throws&nbsp;BusinessException{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Userinfo&nbsp;newUser&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newUser&nbsp;=&nbsp;(Userinfo)user.clone(); &nbsp;&nbsp;</li><li>}catch(CloneNotSupportedException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;throw&nbsp;new&nbsp;BusinessException(&#8220;不支持clone方法:&#8221;+Userinfo.class.getName(),ex); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">J2ee表示层应该是一个很薄的层，主要的功能为：获得页面请求，把页 面的参数组装成POJO对象，调用相应的业务方法，然后进行页面转发，把相应的业务数据呈现给页面。表示层需要注意一个问题，表示层需要对数据的合法性进 行校验，比如某些录入域不能为空，字符长度校验等。</div> <div style="margin: 0cm 0cm 0pt 18pt;">J2ee从页面所有传给后台的参数都是字符型的，如果要求输入数值或日期类型的参数时，必须把字符值转换为相应的数值或日期值。</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果表示层代码校验参数不合法时，应该返回到原始页面，让用户重新录入数据，并提示相关的错误信息。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">通常把一个从页面传来的参数转换为数值，我们可以看到这样的代码</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>ModeAndView&nbsp;handleRequest(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)throws&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;String&nbsp;ageStr&nbsp;=&nbsp;request.getParameter(&#8220;age&#8221;); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;int&nbsp;age&nbsp;=&nbsp;Integer.parse(ageStr); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>&nbsp;String&nbsp;birthDayStr&nbsp;=&nbsp;request.getParameter(&#8220;birthDay&#8221;); &nbsp;&nbsp;</li><li>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat(&#8220;MM/dd/yyyy&#8221;); &nbsp;&nbsp;</li><li>Date&nbsp;birthDay&nbsp;=&nbsp;format.parse(birthDayStr); &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">上面的代码应该经常见到，但是当用户从页面录入一个不能转换为整型的字符或一个错误的日期值。</div> <div style="margin: 0cm 0cm 0pt 18pt;">Integer.parse()方法被抛出一个 NumberFormatException的unChecked异常。但是这个异常绝对不是一个致命的异常,一般当用户在页面的录入域录入的值不合法 时，我们应该提示用户进行重新录入。但是一旦抛出unchecked异常，就没有重试的机会了。像这样的代码造成大量的异常信息显示到页面。使我们的系统 看起来非常的脆弱。</div> <div style="margin: 0cm 0cm 0pt 18pt;">同样，SimpleDateFormat.parse()方法也会抛出ParseException的unChecked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">这种情况我们都应该捕获这些unChecked异常，并给提示用户重新录入。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>ModeAndView&nbsp;handleRequest(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)throws&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;String&nbsp;ageStr&nbsp;=&nbsp;request.getParameter(&#8220;age&#8221;); &nbsp;&nbsp;</li><li>String&nbsp;birthDayStr&nbsp;=&nbsp;request.getParameter(&#8220;birthDay&#8221;); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;int&nbsp;age&nbsp;=&nbsp;0; &nbsp;&nbsp;</li><li>&nbsp;Date&nbsp;birthDay&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>age=Integer.parse(ageStr); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;}catch(NumberFormatException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error.reject(&#8220;age&#8221;,&#8221;不是合法的整数值&#8221;); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>&nbsp;try{ &nbsp;&nbsp;</li><li>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat(&#8220;MM/dd/yyyy&#8221;); &nbsp;&nbsp;</li><li>&nbsp;birthDay&nbsp;=&nbsp;format.parse(birthDayStr); &nbsp;&nbsp;</li><li>}catch(ParseException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;error.reject(&#8220;birthDay&#8221;,&#8221;不是合法的日期，请录入&#8217;MM/dd/yyy&#8217;格式的日期&#8221;); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>在表示层一定要弄清楚调用方法的是否会抛出unChecked</strong><strong>异常，什么情况下会抛出这些异常，并作出正确的处理。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>在表示层调用系统的业务方法，一般情况下是无需要捕获异常的。如果调用的业务方法抛出的异常相当于第二个返回值时，在这种情况下是需要捕获</strong></div></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/353073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-27 16:02 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;瞬间之美-web界面设计如何让用户心动&gt;读后感</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/09/351973.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Thu, 09 Jun 2011 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/09/351973.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/351973.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/09/351973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/351973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/351973.html</trackback:ping><description><![CDATA[做了这么多年前台的东西，还是第一次捧起前台相关的书来看。<br />这次看得是Robert Hoekman的第二本书，总体感觉看下来，比较受用，重点讲了下面几个词汇。<br />简单，清楚，预期，反馈。<br />简单：界面要足够的简单，不要多，更不要无必要的&#8220;多&#8220;，要把&#8220;多&#8220;的东西隐藏起来，多指不常用的，比较&#8220;高级&#8220;的功能。<br />清楚：突出什么要清楚，突出什么可以通过颜色，视觉习惯等方法。<br />预期：用户要知道自己操作的进度，比如填写多页表单。<br />反馈：让用户知道自己操作的结果的提示，操作完页面需要做出反馈以提示用户操作的结果。<br /><br />该书从设计用户登陆开始，中间穿插了一些网站小模块的设计，到最终用户退出系统的设计。比较完整的用31个瞬间讲述了一个用户浏览网站的过程。<br /><br />给自己最大的提示，老生常谈，站在使用者的角度，方便使用者的目的，并尽可能依靠使用者的&#8220;抱怨&#8221;，改进系统的设计，提高使用者的效率。<img src ="http://www.blogjava.net/ilovebabyfat/aggbug/351973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-09 13:30 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/09/351973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.ClassCastException: oracle.sql.CLOB</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/07/351847.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Tue, 07 Jun 2011 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/07/351847.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/351847.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/07/351847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/351847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/351847.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">转自<div><a href="http://spring3000.iteye.com/blog/372482">http://spring3000.iteye.com/blog/372482</a><br /></div>&nbsp;&nbsp;&nbsp; oracle.sql.CLOB&nbsp;clob&nbsp;</span><span style="color: #808080;">=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;stmt&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;conn.createStatement();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;stmt.executeQuery(sql);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(rs.</span><span style="color: #0000ff;">next</span><span style="color: #000000;">())&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(rs.getClob(</span><span style="color: #0000ff;">column</span><span style="color: #000000;">).getClass());&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clob&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(oracle.sql.CLOB)&nbsp;rs.getClob(</span><span style="color: #0000ff;">column</span><span style="color: #000000;">);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;new&nbsp;BufferedWriter(clob.getCharacterOutputStream());&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;new&nbsp;BufferedReader(new&nbsp;StringReader(data));&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><div>这个代码很奇怪，看试没有一点问题，但是，项目跑起来后，代码&nbsp;<br />clob&nbsp;= (<span style="background-color: #00ffff;">oracle</span>.sql.CLOB) rs.getClob(column);&nbsp;<br />都会抛出<span style="background-color: #ffff00;">java</span>.<span style="background-color: #55ff55;">lang</span>.ClassCastException:&nbsp;<span style="background-color: #00ffff;">oracle</span>.sql.CLOB异常（WEB容器使用的是TOMCAT5.5）,先以为是类型转换的问题，&nbsp;<br />System.out.println(rs.getClob(column).getClass());&nbsp;<br />但打印出来的是<span style="background-color: #00ffff;">oracle</span>.sql.clob&nbsp;<br />后又以为是驱动的问题，把classes12.jar换成了ojdbc14.jar&nbsp;<br />可问题还没有解决&nbsp;<br /><br />解决的方法：&nbsp;<br /><br />在网上狂找，终于找到一位高人写的一篇高水平的文章（主要是把我的问题给解决了，哈）&nbsp;<br /><br />是因为驱动包重复了，我理解为类重名，我使用的是tomcat数据源，哪么，$TOMCAT_HOME$\comm\lib目录下需要<span style="background-color: #00ffff;">oracle</span>驱动包，是给tomcat创建jndi数据源时用的，而项目中也要有<span style="background-color: #00ffff;">oracle</span>驱动包，是给程序编译用的，最后使用eclilpse的<span style="background-color: #ffff00;">java</span>&nbsp;build path进行外部引用，使用应用程序编译通过，但也不会把ojdbc14.jar的驱动包引入到发布目录，再试，果然解决了问题。</div><br /></span></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/351847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-07 13:38 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/07/351847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JQuery</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/05/31/351441.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Tue, 31 May 2011 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/05/31/351441.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/351441.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/05/31/351441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/351441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/351441.html</trackback:ping><description><![CDATA[<strong style="font-size: 18pt;">Selectors</strong><br style="font-size: 18pt;" /><br /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th align="left">Selector</th> <th align="left">Example</th> <th align="left">Selects</th> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_all.asp">*</a></td> <td>$("*")</td> <td>All elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_id.asp">#<em>id</em></a></td> <td>$("#lastname")</td> <td>The element with id=lastname</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_class.asp">.<em>class</em></a></td> <td>$(".intro")</td> <td>All elements with class="intro"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_element.asp"><em>element</em></a></td> <td>$("p")</td> <td>All p elements</td> </tr> <tr> <td>.<em>class</em>.<em>class</em></td> <td>$(".intro.demo")</td> <td>All elements with the classes "intro" and "demo"</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_first.asp">:first</a></td> <td>$("p:first")</td> <td>The first p element</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_last.asp">:last</a></td> <td>$("p:last")</td> <td>The last p element</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_even.asp">:even</a></td> <td>$("tr:even")</td> <td>All even tr elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_odd.asp">:odd</a></td> <td>$("tr:odd")</td> <td>All odd tr elements</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_eq.asp">:eq(<em>index</em>)</a></td> <td>$("ul li:eq(3)")</td> <td>The fourth element in a list (index starts at 0)</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_gt.asp">:gt(<em>no</em>)</a></td> <td>$("ul li:gt(3)")</td> <td>List elements with an index greater than 3</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_lt.asp">:lt(<em>no</em>)</a></td> <td>$("ul li:lt(3)")</td> <td>List elements with an index less than 3</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_not.asp">:not(<em>selector</em>)</a></td> <td>$("input:not(:empty)")</td> <td>All input elements that are not empty</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_header.asp">:header</a></td> <td>$(":header")</td> <td>All header elements h1, h2 ...</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_animated.asp">:animated</a></td> <td>$(":animated")</td> <td>All animated elements</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_contains.asp">:contains(<em>text</em>)</a></td> <td>$(":contains('W3Schools')")</td> <td>All elements which contains the text</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_empty.asp">:empty</a></td> <td>$(":empty")</td> <td>All elements with no child (elements) nodes</td> </tr> <tr> <td>:hidden</td> <td>$("p:hidden")</td> <td>All hidden p elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_visible.asp">:visible</a></td> <td>$("table:visible")</td> <td>All visible tables</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><em>s1</em>,<em>s2</em>,<em>s3</em></td> <td>$("th,td,.intro")</td> <td>All elements with matching selectors</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_attribute.asp">[<em>attribute</em>]</a></td> <td>$("[href]")</td> <td>All elements with a href attribute</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_attribute_equal_value.asp">[<em>attribute</em>=<em>value</em>]</a></td> <td>$("[href='default.htm']")</td> <td>All elements with a href attribute value equal to "default.htm"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_attribute_notequal_value.asp">[<em>attribute</em>!=<em>value</em>]</a></td> <td>$("[href!='default.htm']")</td> <td>All elements with a href attribute value not equal to "default.htm"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_attribute_end_value.asp">[<em>attribute</em>$=<em>value</em>]</a></td> <td>$("[href$='.jpg']")</td> <td>All elements with a href attribute value ending with ".jpg"</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input.asp">:input</a></td> <td>$(":input")</td> <td>All input elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_text.asp">:text</a></td> <td>$(":text")</td> <td>All input elements with type="text"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_password.asp">:password</a></td> <td>$(":password")</td> <td>All input elements with type="password"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_radio.asp">:radio</a></td> <td>$(":radio")</td> <td>All input elements with type="radio"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_checkbox.asp">:checkbox</a></td> <td>$(":checkbox")</td> <td>All input elements with type="checkbox"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_submit.asp">:submit</a></td> <td>$(":submit")</td> <td>All input elements with type="submit"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_reset.asp">:reset</a></td> <td>$(":reset")</td> <td>All input elements with type="reset"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_button.asp">:button</a></td> <td>$(":button")</td> <td>All input elements with type="button"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_image.asp">:image</a></td> <td>$(":image")</td> <td>All input elements with type="image"</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_file.asp">:file</a></td> <td>$(":file")</td> <td>All input elements with type="file"</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_enabled.asp">:enabled</a></td> <td>$(":enabled")</td> <td>All enabled input elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_disabled.asp">:disabled</a></td> <td>$(":disabled")</td> <td>All disabled input elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_selected.asp">:selected</a></td> <td>$(":selected")</td> <td>All selected input elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/sel_input_checked.asp">:checked</a></td> <td>$(":checked")</td> <td>All checked input elements</td></tr></tbody></table></div><br /><br /><strong style="font-size: 18pt;">Events</strong><br style="font-size: 18pt;" /><br /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th width="43%" align="left">Method</th> <th width="57%" align="left">Description</th> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_bind.asp">bind()</a></td> <td>Add one or more event handlers to matching elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_blur.asp">blur()</a></td> <td>Triggers, or binds a function to the blur event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_change.asp">change()</a></td> <td>Triggers, or binds a function to the change event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_click.asp">click()</a></td> <td>Triggers, or binds a function to the click event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_dblclick.asp">dblclick()</a></td> <td>Triggers, or binds a function to the dblclick event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_delegate.asp">delegate()</a></td> <td>Add one or more event handlers to current, or future, specified child  elements of the matching elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_die.asp">die()</a></td> <td>Remove all event handlers added with the live() function</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_error.asp">error()</a></td> <td>Triggers, or binds a function to the error event of selected elements</td> </tr> <tr> <td>event.currentTarget</td> <td>The current DOM element within the event bubbling phase</td> </tr> <tr> <td>event.data</td> <td>Contains the optional data passed to jQuery.fn.bind when the current  executing handler was bound</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_isdefaultprevented.asp">event.isDefaultPrevented()</a></td> <td>Returns whether event.preventDefault() was called for the event object</td> </tr> <tr> <td>event.isImmediatePropagationStopped()</td> <td>Returns whether event.stopImmediatePropagation() was called for the event object</td> </tr> <tr> <td>event.isPropagationStopped()</td> <td>Returns whether event.stopPropagation() was called for the event object</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_pagex.asp">event.pageX</a></td> <td>The mouse position relative to the left edge of the document</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_pagey.asp">event.pageY</a></td> <td>The mouse position relative to the top edge of the document</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_preventdefault.asp">event.preventDefault()</a></td> <td>Prevents the default action of the event</td> </tr> <tr> <td>event.relatedTarget</td> <td>The other DOM element involved in the event, if any</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_result.asp">event.result</a></td> <td>This attribute contains the last value returned by an event handler that was  triggered by this event, unless the value was undefined</td> </tr> <tr> <td>event.stopImmediatePropagation()</td> <td>Prevents other event handlers from being called</td> </tr> <tr> <td>event.stopPropagation()</td> <td>Prevents the event from bubbling up the DOM tree, preventing any parent  handlers from being notified of the event</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_target.asp">event.target</a></td> <td>The DOM element that initiated the event</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_timestamp.asp">event.timeStamp</a></td> <td>This attribute returns the number of milliseconds since January 1, 1970,  when the event is triggered</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_type.asp">event.type</a></td> <td>Describes the nature of the event</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_which.asp">event.which</a></td> <td>Which key or button was pressed for a key or button event</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_focus.asp">focus()</a></td> <td>Triggers, or binds a function to the focus event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_focusin.asp">focusin()</a></td> <td>Binds a function to the focusin event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_focusout.asp">focusout()</a></td> <td>Binds a function to the focusout event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_hover.asp">hover()</a></td> <td>Binds one or two functions to the hover event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_keydown.asp">keydown()</a></td> <td>Triggers, or binds a function to the keydown event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_keypress.asp">keypress()</a></td> <td>Triggers, or binds a function to the keypress event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_keyup.asp">keyup()</a></td> <td>Triggers, or binds a function to the keyup event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_live.asp">live()</a></td> <td>Add one or more event handlers to current, or future, matching elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_load.asp">load()</a></td> <td>Triggers, or binds a function to the load event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mousedown.asp">mousedown()</a></td> <td>Triggers, or binds a function to the mouse down event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mouseenter.asp">mouseenter()</a></td> <td>Triggers, or binds a function to the mouse enter event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mouseleave.asp">mouseleave()</a></td> <td>Triggers, or binds a function to the mouse leave event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mousemove.asp">mousemove()</a></td> <td>Triggers, or binds a function to the mouse move event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mouseout.asp">mouseout()</a></td> <td>Triggers, or binds a function to the mouse out event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mouseover.asp">mouseover()</a></td> <td>Triggers, or binds a function to the mouse over event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_mouseup.asp">mouseup()</a></td> <td>Triggers, or binds a function to the mouse up event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_one.asp">one()</a></td> <td>Add one or more event handlers to matching elements. This handler can only be  triggered once per element</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_ready.asp">ready()</a></td> <td>Binds a function to the ready event of a document<br /> (when an HTML document is ready to use)</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_resize.asp">resize()</a></td> <td>Triggers, or binds a function to the resize event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_scroll.asp">scroll()</a></td> <td>Triggers, or binds a function to the scroll event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_select.asp">select()</a></td> <td>Triggers, or binds a function to the select event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_submit.asp">submit()</a></td> <td>Triggers, or binds a function to the submit event of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_toggle.asp">toggle()</a></td> <td>Binds two or more functions to the toggle between for the click event for selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_trigger.asp">trigger()</a></td> <td>Triggers all events bound to the selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_triggerhandler.asp">triggerHandler()</a></td> <td>Triggers all functions bound to a specified event for the selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_unbind.asp">unbind()</a></td> <td>Remove an added event handler from selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_undelegate.asp">undelegate()</a></td> <td>Remove an event handler to selected elements, now or in the future</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/event_unload.asp">unload()</a></td> <td>Triggers, or binds a function to the unload event of selected elements</td></tr></tbody></table></div><br /><strong style="font-size: 18pt;">Effect</strong><br style="font-size: 18pt;" /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th width="20%" align="left">Method</th> <th width="80%" align="left">Description</th> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_animate.asp">animate()</a></td> <td>Performs a custom animation (of a set of CSS properties) for selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_clearqueue.asp">clearQueue()</a></td> <td>Removes all queued functions for the selected element</td> 	</tr> 	<tr> <td>delay()</td> <td>Sets a delay for all queued functions for the selected element</td> 	</tr> 	<tr> <td>dequeue()</td> <td>Runs the next queued functions for the selected element</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_fadein.asp">fadeIn()</a></td> <td>Gradually changes the opacity, for selected elements, from hidden to visible</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_fadeout.asp">fadeOut()</a></td> <td>Gradually changes the opacity, for selected elements, from visible to hidden</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_fadeto.asp">fadeTo()</a></td> <td>Gradually changes the opacity, for selected elements, to a specified opacity </td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_hide.asp">hide()</a></td> <td>Hides selected elements</td> 	</tr> 	<tr> <td>queue()</td> <td>Shows the queued functions for the selected element</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/eff_show.asp">show()</a></td> <td>Shows hidden selected elements</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_slidedown.asp">slideDown()</a></td> <td>Gradually changes the height, for selected elements, from hidden to visible</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_slidetoggle.asp">slideToggle()</a></td> <td>Toggles between slideUp() and slideDown() for selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_slideup.asp">slideUp()</a></td> <td>Gradually changes the height, for selected elements, from visible to hidden</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/eff_stop.asp">stop()</a></td> <td>Stops a running animation on selected elements</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/eff_toggle.asp">toggle()</a></td> <td>Toggles between hide() and show(), or custom functions, for selected elements</td></tr></tbody></table></div><br /><strong style="font-size: 18pt;">HTML</strong><br /><br /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th width="20%" align="left">Method</th> <th width="80%" align="left">Description</th> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_addclass.asp">addClass()</a></td> <td>Adds one or more classes (for CSS) to selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_after.asp">after()</a></td> <td>Inserts content after selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_append.asp">append()</a></td> <td>Inserts content at the end of (but still inside) selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_appendto.asp">appendTo()</a></td> <td>Inserts content at the end of (but still inside) selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_attr.asp">attr()</a></td> <td>Sets or returns an attribute and value of selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_before.asp">before()</a></td> <td>Inserts content before selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_clone.asp">clone()</a></td> <td>Makes a copy of selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_detach.asp">detach()</a></td> <td>Removes (but keeps a copy of) selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_empty.asp">empty()</a></td> <td>Removes all child elements and content from selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_hasclass.asp">hasClass()</a></td> <td>Checks if any of the selected elements have a specified class (for CSS)</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/html_html.asp">html()</a></td> <td>Sets or returns the content of selected elements</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_insertafter.asp">insertAfter()</a></td> <td>Inserts HTML markup or elements after selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_insertbefore.asp">insertBefore()</a></td> <td>Inserts HTML markup or elements before selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_prepend.asp">prepend()</a></td> <td>Inserts content at the beginning of (but still inside) selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_prependto.asp">prependTo()</a></td> <td>Inserts content at the beginning of (but still inside) selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_remove.asp">remove()</a></td> <td>Removes selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_removeattr.asp">removeAttr()</a></td> <td>Removes an attribute from selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_removeclass.asp">removeClass()</a></td> <td>Removes one or more classes (for CSS) from selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_replaceall.asp">replaceAll()</a></td> <td>Replaces selected elements with new content</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_replacewith.asp">replaceWith()</a></td> <td>Replaces selected elements with new content</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/html_text.asp">text()</a></td> <td>Sets or returns the text content of selected elements</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_toggleclass.asp">toggleClass()</a></td> <td>Toggles between adding/removing one or more classes (for CSS) from selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/html_unwrap.asp">unwrap()</a></td> <td>Removes the parent element of the selected elements</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/html_val.asp">val()</a></td> <td>Sets or returns the value attribute of the selected elements (form  elements)</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/html_wrap.asp">wrap()</a></td> <td>Wraps specified HTML element(s) around each selected element</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/html_wrapall.asp">wrapAll()</a></td> <td>Wraps specified HTML element(s) around all selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/html_wrapinner.asp">wrapInner()</a></td> <td>Wraps specified HTML element(s) around the content of each selected element</td></tr></tbody></table></div><br /><strong style="font-size: 18pt;">CSS</strong><br style="font-size: 18pt;" /><br /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th width="20%" align="left">Method</th> <th width="80%" align="left">Description</th> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_addclass.asp">addClass()</a></td> <td>Adds one or more classes to selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_css.asp">css()</a></td> <td>Sets or returns one or more style properties for selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_hasclass.asp">hasClass()</a></td> <td>Checks if any of the selected elements have a specified class</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_height.asp">height()</a></td> <td>Sets or returns the height of selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_offset.asp">offset()</a></td> <td>Sets or returns the position (relative to the document) for selected  elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_offsetparent.asp">offsetParent()</a></td> <td>Returns the first parent element that is positioned</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_position.asp">position()</a></td> <td>Returns the position (relative to the parent  element) of the first selected element</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/css_removeclass.asp">removeClass()</a></td> <td>Removes one or more classes from selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/css_scrollleft.asp">scrollLeft()</a></td> <td>Sets or returns the horizontal position of the scrollbar for the selected elements</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/css_scrolltop.asp">scrollTop()</a></td> <td>Sets or returns the vertical position of the scrollbar for the selected elements</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/css_toggleclass.asp">toggleClass()</a></td> <td>Toggles between adding/removing one or more classes from selected elements</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/css_width.asp">width()</a></td> <td>Sets or returns the width of selected elements</td> 	</tr> </tbody></table> </div><br /><strong style="font-size: 18pt;">AJAX</strong><br style="font-size: 18pt;" /><br style="font-size: 18pt;" /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th width="20%" align="left">Method</th> <th width="80%" align="left">Description</th> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajax.asp">$.ajax()</a></td> <td>Performs an AJAX request</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxcomplete.asp">ajaxComplete()</a></td> <td>Specifies a function to run when the AJAX request completes</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxerror.asp">ajaxError()</a></td> <td>Specifies a function to run when the AJAX request completes with an error</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxsend.asp">ajaxSend()</a></td> <td>Specifies a function to run before the AJAX request is sent</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxsetup.asp">$.ajaxSetup()</a></td> <td>Sets the default values for future AJAX requests</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxstart.asp">ajaxStart()</a></td> <td>Specifies a function to run when the first AJAX request begins</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxstop.asp">ajaxStop()</a></td> <td>Specifies a function to run when all AJAX requests have completed</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_ajaxsuccess.asp">ajaxSuccess()</a></td> <td>Specifies a function to run an AJAX request completes successfully</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_get.asp">$.get()</a></td> <td>Loads data from a server using an AJAX HTTP GET request</td> 	</tr> <tr> <td><a href="http://www.w3schools.com/jquery/ajax_getjson.asp">$.getJSON()</a></td> <td>Loads JSON-encoded data from a server using a HTTP GET request</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_getscript.asp">$.getScript()</a></td> <td>Loads (and executes) a JavaScript from the a server using an AJAX HTTP GET  request</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_load.asp">load()</a></td> <td>Loads data from a server and puts the returned HTML into the selected element</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_param.asp">$.param()</a></td> <td>Creates a serialized representation of an array or object (can be used as URL query string  for AJAX requests)</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_post.asp">$.post()</a></td> <td>Loads data from a server using an AJAX HTTP POST request</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_serialize.asp">serialize()</a></td> <td>Encodes a set of form elements as a string for submission</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/ajax_serializearray.asp">serializeArray()</a></td> <td>Encodes a set of form elements as an array of names and values</td></tr></tbody></table></div><br /><strong style="font-size: 18pt;">MISC</strong><br /><br /><div><table width="100%" border="1" cellspacing="0"><tbody><tr><th width="20%" align="left">Method</th> <th width="80%" align="left">Description</th> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_data.asp">data()</a></td> <td>Attaches data to, or gets data from, selected elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_each.asp">each()</a></td> <td>Run a function for each element matched by the jQuery selector</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_get.asp">get()</a></td> <td>Get the DOM elements matched by the selector</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_index.asp">index()</a></td> <td>Search for a given element from among the matched elements</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_noconflict.asp">$.noConflict()</a></td> <td>Release jQuery's control of the $ variable</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_param.asp">$.param()</a></td> <td>Creates a serialized representation of an array or object (can be used as URL query string  for AJAX requests)</td> </tr> <tr> <td><a href="http://www.w3schools.com/jquery/misc_removedata.asp">removeData()</a></td> <td>Removes a previously-stored piece of data</td> </tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/misc_size.asp">size()</a></td> <td>Return the number of DOM elements matched by the jQuery selector</td> 	</tr> 	<tr> <td><a href="http://www.w3schools.com/jquery/misc_toarray.asp">toArray()</a></td> <td>Retrieve all the DOM elements contained in the jQuery set, as an array</td></tr></tbody></table></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/351441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-05-31 16:19 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/05/31/351441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>