﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-流传的储藏罐</title><link>http://www.blogjava.net/liuxiaosan/</link><description>操蛋的人生处处充满美妙</description><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 13:59:22 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 13:59:22 GMT</pubDate><ttl>60</ttl><item><title>SpringMVC中Velocity的配置</title><link>http://www.blogjava.net/liuxiaosan/archive/2011/11/24/364737.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Thu, 24 Nov 2011 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/archive/2011/11/24/364737.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/364737.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/archive/2011/11/24/364737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/364737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/364737.html</trackback:ping><description><![CDATA[在应用的 dispatcher-servlet.xml 中添加如下配置：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #000000; ">bean&nbsp;id</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">velocityConfigurer</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.springframework.web.servlet.view.velocity.VelocityConfigurer</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">resourceLoaderPath</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;&lt;!--</span><span style="color: #000000; ">&nbsp;页面文件的路径,相对于webapp&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">value</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><code>templates</code></span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">value</span><span style="color: #000000; ">&gt;</span><br /><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">property</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;Velocity属性配置&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">velocityProperties</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">props</span><span style="color: #000000; ">&gt;</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: #000000; ">&lt;</span><span style="color: #000000; ">prop&nbsp;key</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input.encoding</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">UTF</span><span style="color: #000000; ">-</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">prop</span><span style="color: #000000; ">&gt;&lt;!--</span><span style="color: #000000; ">&nbsp;指定模板引擎进行模板处理的编码&nbsp;</span><span style="color: #000000; ">--&gt;</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: #000000; ">&lt;</span><span style="color: #000000; ">prop&nbsp;key</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">output.encoding</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">UTF</span><span style="color: #000000; ">-</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">prop</span><span style="color: #000000; ">&gt;&lt;!--</span><span style="color: #000000; ">&nbsp;指定输出流的编码&nbsp;</span><span style="color: #000000; ">--&gt;</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: #000000; ">&lt;</span><span style="color: #000000; ">prop&nbsp;key</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">contentType</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">text</span><span style="color: #000000; ">/</span><span style="color: #000000; ">html;charset</span><span style="color: #000000; ">=</span><span style="color: #000000; ">UTF</span><span style="color: #000000; ">-</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">prop</span><span style="color: #000000; ">&gt;&lt;!--</span><span style="color: #000000; ">&nbsp;contentType&nbsp;</span><span style="color: #000000; ">--&gt;</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: #000000; ">&lt;</span><span style="color: #000000; ">prop&nbsp;key</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">velocimacro.library</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">macro</span><span style="color: #000000; ">/</span><span style="color: #000000; ">macros.vm</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">prop</span><span style="color: #000000; ">&gt;&lt;!--</span><span style="color: #000000; ">&nbsp;Velocimacro&nbsp;模板库的列表&nbsp;</span><span style="color: #000000; ">--&gt;</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: #000000; ">&lt;</span><span style="color: #000000; ">prop&nbsp;key</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">eventhandler.referenceinsertion.class</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">com.sde.common.web.escape.reference.NoEscapeHtmlReference</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">prop</span><span style="color: #000000; ">&gt;</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: #000000; ">&lt;</span><span style="color: #000000; ">prop&nbsp;key</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">eventhandler.noescape.html.match</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;/</span><span style="color: #000000; ">(</span><span style="color: #000000; ">?</span><span style="color: #000000; ">:screen_content)</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(</span><span style="color: #000000; ">?</span><span style="color: #000000; ">:noescape_.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">/&lt;/</span><span style="color: #000000; ">prop</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">props</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">property</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">bean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bean&nbsp;id</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">viewResolver</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">cache</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">false</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;&lt;!--</span><span style="color: #000000; ">是否缓存模板</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">prefix</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">""</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">suffix</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.vm</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">toolboxConfigLocation</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/WEB-INF/toolbox.xml</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">&lt;!--toolbox配置文件路径--&gt;<br /><div><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span>dateToolAttribute<span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">date</span><span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">&lt;!--日期函数名称--&gt;<br /></span></div><div><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span>numberToolAttribute<span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">number</span><span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><span style="color: #000000; ">&lt;!--数字函数名称--&gt;</span></span><span style="color: #000000; "></span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">contentType</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text/html;charset=UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">exposeSpringMacroHelpers</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">true</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;&lt;!--是否使用spring对宏定义的支持--&gt;</span><em></em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">exposeRequestAttributes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">true</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; ">&lt;!--是否开放request属性--&gt;<br />&nbsp;</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">requestContextAttribute</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">rc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/&gt;&lt;!--request属性引用名称--&gt;</span><span style="color: #000000; "></span><span style="color: #000000; "><br /><div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="layoutUrl" value="templates/layout/default.vm"/&lt;!--指定layout文件--&gt;	</code></div></span><span style="color: #000000; "></span><span style="color: #000000; ">&nbsp;&nbsp; </span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">bean</span><span style="color: #000000; ">&gt;</span></div><img src ="http://www.blogjava.net/liuxiaosan/aggbug/364737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-11-24 15:57 <a href="http://www.blogjava.net/liuxiaosan/archive/2011/11/24/364737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于注解的SpringMVC</title><link>http://www.blogjava.net/liuxiaosan/articles/357092.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Mon, 05 Sep 2011 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/357092.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/357092.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/357092.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/357092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/357092.html</trackback:ping><description><![CDATA[<h2>一、概述</h2>SpringMVC在2.5版本后新增了注解功能，2.5版本以前的基本通过继承Controller体系来开发业务控制器，2.5版本后Controller体系中<br /><div>BaseCommandController及其子类AbstractCommandController、AbstractFormController、AbstractWizardFormController、<div><div><div><div>SimpleFormController、CancellableFormController等都已经被标示为@Deprecated，建议不再使用。</div></div></div></div><br />相比传统的继承Controller体系中某些类的方式，SpringMVC的注解具有以下优点：<br />1、Controller不再需要继承某个特定类，只是简单的POJO。<br />2、请求映射的配置非常方便灵活。<br />3、参数绑定机制非常方便丰富。<br />4、可以根据不同的http方法或者参数，细粒度处理不同的http请求<br /><br /><h2>二、示例</h2>下面通过对SpringMVC注解的详细介绍来看一下上述优点。<br /><br />首先需要在应用的dispatcher-servlet.xml 启动注解机制<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">context:annotation</span><span style="color: #000000; ">-</span><span style="color: #000000; ">config&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;设置注解驱动&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mvc:annotation</span><span style="color: #000000; ">-</span><span style="color: #000000; ">driven&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;设置扫描的包&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">context:component</span><span style="color: #000000; ">-</span><span style="color: #000000; ">scan&nbsp;base</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">com.demo.web.controller</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bean&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bean&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;<br /></span></div><br />注：虽然我们的Controller不需要再继承任何类，但出于规范，我们仍然命名为***Controller.java，并统一放在<span style="color: #000000;">com.demo.web.controller包中。<br /></span><h4><span style="color: #000000;">1、@Controller注解</span></h4><h3><span style="color: #000000;"></span></h3><span style="color: #000000;">简单示例<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.demo.controller;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.stereotype.Controller;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.web.bind.annotation.RequestMapping;<br /><br />@Controller<br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;IndexController&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;index()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">index</span><span style="color: #000000; ">"</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><div><span style="color: #000000;"></span><span style="color: #000000;">在一个POJO上面使用 @Controller 就可以标注该POJO是一个Controller，就这么简单。 @Controller注解定义在org.springframework.steretype包中。<br />使用方式： @Controller 或者 @Controller("indexController)。 org.springframework.steretype包中还包含 @Componenet @Service @Respository<br />三个注解。@Component是通用标注，@Controller标注web控制器，@Service标注Servicec层的服务，@Respository标注DAO层的数据访问。<br /><br /></span><h4><span style="color: #000000;">2、使用@RequestMapping注解处理请求映射</span></h4><h4><span style="color: #000000;"></span></h4>&nbsp;&nbsp;&nbsp; SpringMVC中注解基本都包含在 org.springframework.web.bind.annotation 包中。先看一下<span style="color: #000000;">@RequestMapping</span> 注解的源码。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@Target(&nbsp;{&nbsp;ElementType.METHOD,&nbsp;ElementType.TYPE&nbsp;})<br />@Retention(RetentionPolicy.RUNTIME)<br />@Documented<br />@Mapping<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;RequestMapping&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定映射的URL.可以在类层次和方法层次使用。方式如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping("/add_")或&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/add")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;支持Ant风格的URL映射,如&nbsp;@RequestMapping("/myPath/*.htm")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在类层次指定了映射后,可以在方法层次再指定相对路径<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;value()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定HttpRequest的方法,&nbsp;如：GET,&nbsp;POST,&nbsp;HEAD,&nbsp;OPTIONS,&nbsp;PUT,&nbsp;DELETE,&nbsp;TRACE.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用举例：&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/add_activity",&nbsp;method&nbsp;=&nbsp;RequestMethod.GET)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;RequestMethod[]&nbsp;method()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定HttpRequest中包含的参数,使用方式如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",params="myParam")&nbsp;请求包含myParam参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",params="myParam=myValue")请求包含myParam参数，并且该参数值为myValue<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",params="!myParam")&nbsp;请求不包含myParam参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;params()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定HttpRequest中包含的头部信息,使用方式如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",&nbsp;headers="content-type")请求包含该头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",&nbsp;headers="content-type=text/*")请求包含特定值的头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",&nbsp;headers="!content-type")请求不包含该头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;headers()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />}<br /></span></div>注：如果在类层次指定了映射，则方法层次上都将继承类层次的映射<br /><br /><h4>3、获取HttpRequest中得参数</h4><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>@RequestMapping("active")<br />public @ResponseBody boolean active(Long accountId) {<br />&nbsp;&nbsp;&nbsp; return accountService.activeAccount(accountId);<br />}<br /><br /><div><span style="color: #000000; ">@RequestMapping("active")<br />public @ResponseBody boolean active(Account account) {<br />&nbsp;&nbsp;&nbsp; return accountService.activeAccount(accountId);<br />}</span></div></div>@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">inactive</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@ResponseBody&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;inactive(@RequestParam(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accountId</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;Long&nbsp;accountId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@RequestHeader(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">User-Agent</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;String&nbsp;userAgent,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@CookieValue(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">loginId</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;String&nbsp;loginId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;accountService.inactiveAccount(accountId);<br />}<br /><br />@RequestMapping(value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">list/{pageNo}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;RequestMethod.GET)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String list(@PathVariable&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pageNo)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/account/list</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />}<br /><br /><div>@RequestMapping(value = "add", method = RequestMethod.GET)<br />public String add(@RequestBody String body) {<br />&nbsp;&nbsp;&nbsp;&nbsp; return "/account/add";<br />}</div><br /></span></div><span style="color: #000000;"><br /><div><span style="color: #000000; ">active方法的入参 accountId，如果请求中有名为 accountId的参数，则会进行默认绑定，不仅基本类型，javabean的属性也可以默认进行绑定；<br />如果需要明确绑定，使用@RequestParam。 一般建议进行明确指定。<br /><br /></span></div>3.1 @RequestParam 绑定httpRequest中参数，@RequestParam("accountId") 完整形式为&nbsp; @RequestParam(value="accountId",required=true，defaultValue=null)<br />3.2 @RequestHeader 绑定httpRequest头部信息，@RequestHeader("User-Agent") 完整形式为 @RequestHeader(value="User-Agebt",required=true, defaultValue=null)<br />3.3 @CookieValue 绑定一个Cookie值，@CookieValue("loginId") 完整形式为 @CookieValue(value="loginId",required=true,defaultValue=null)<br />3.4 @RequestBody 将httpRequest的body绑定到方法参数上<br />3.5 @ModelAttribute 有两种使用方式: 1)在方法级别，指定方法的返回值绑定到model中； 2）方法参数级别，指定model中的值绑定到方法的入参上 示例如下：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@ModelAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">countryList</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;getCountries()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />@RequestMapping(value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">search</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;RequestMethod.POST)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;searchAccount(@ModelAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accountId</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;Long&nbsp;accountId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/search</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><span style="color: #000000;"></span><h4><span style="color: #000000;">4、使用@ResponseBody 生成response</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 适用于webservice的数据交换，或ajax异步请求，text、json或者xml格式的数据交换。<br />&nbsp;&nbsp;&nbsp; 例如访问： http://localhost:8080/accounts/info.htm<br />&nbsp; </span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@RequestMapping(value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">info</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@ResponseBody&nbsp;Account&nbsp;getAccount()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Account&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Account();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.setId(</span><span style="color: #000000; ">123L</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">zhangsan</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000;">&nbsp;a;<br />&nbsp;}</span></div><span style="color: #000000;"><br />返回数据如下： <div>{"name":"zhangsan","id":123}</div>从上面例子可以看出，使用@ResponseBody后，返回的javabean默认被序列化成json格式的数据并被写入到response body中。<br /><br />@Request 和 @ReponseBody 使用了HttpMessageConverter机制。下面是HttpMessageConverter的继承体系。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/liuxiaosan/HttpMessageConverter.png" alt="" border="0" height="314" width="666" /><br />常用的有如下几个：<br /><div>StringHttpMessageConverter ---字符串<br /><div>MappingJacksonHttpMessageConverter ----json<br /><div>ByteArrayHttpMessageConverter ----字节数组<br /><div>MarshallingHttpMessageConverter -----xml</div></div></div></div></span><h4><span style="color: #000000;">5、使用模板技术生成response</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 适用于一般页面请求。可以使用velocity freemarker等模板技术，在dispatcher-servlet.xml中需要设置viewResolver。<br />&nbsp;&nbsp;&nbsp; </span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;index(ModelMap&nbsp;modelMap)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modelMap.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">liucs</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />}<br /><br />@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;index2(Model&nbsp;model)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.addAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">liucs</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />}<br /><br /><div>@RequestMapping("/index")<br />public ModelAndView index3() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ModelAndView mav = new ModelAndView("index");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mav.addObject("name", "liucs");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mav;<br />}</div><br /></span></div><span style="color: #000000;">如上面代码index1和index2所示，不使用@ResponseBody注解。 返回一个String类型，这个String是viewname, 如果是重定向，return "redirect:/index.htm".<br />入参可以包含ModelMap或者Model，其实这两者是一个东西，作用一样。也可以采用index3式的传统写法，返回一个ModelAndView对象。<br /></span><h4><span style="color: #000000;">6、数据验证</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;">@InitBinder标注<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@InitBinder<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;myInitBinder(WebDataBinder&nbsp;binder){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binder.setDisallowedFields(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;String[]{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">id</span><span style="color: #000000; ">"</span><span style="color: #000000;">});<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>通过在方法中声明一个BindingResult参数来启动绑定和验证<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">update</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;update(@ModelAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">account</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;Account&nbsp;account,BindingResult&nbsp;bindResult)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bindResult.hasErrors()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&#8230;&#8230;</span><span style="color: #008000; "><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>需要注意以下限制：<br />1、BindingResult参数必须跟在一个JavaBean参数后面<br />2、错误会被自动的绑定到model中，便于渲染模板时使用<br />3、不支持@RequestBody等类型的参数形式<br /><h4><span style="color: #000000;">7、异常处理</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;"></span>@ExceptionHandler<br /><h4><span style="color: #000000;"></span></h4><span style="color: #000000;"><br /></span></div></div><img src ="http://www.blogjava.net/liuxiaosan/aggbug/357092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-09-05 16:42 <a href="http://www.blogjava.net/liuxiaosan/articles/357092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Annotation 注解</title><link>http://www.blogjava.net/liuxiaosan/articles/347691.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Mon, 22 Aug 2011 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347691.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347691.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347691.html</trackback:ping><description><![CDATA[<h2>Annotation（注解）是什么？</h2>
附加在代码中的一些元信息，用于一些工具在编译、运行时进行解析和使用，起到说明、配置的功能。<br />注解不会也不能影响代码的实际逻辑，仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。<br />
<br /><h2>
1、Annotation的定义</h2>
首先看一下如何定义我们自己的注解，下面是SpringMvc中RequestParam注解的定义。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">@Retention(RetentionPolicy.RUNTIME) // <span style="color: #008000; ">注解的保留策略</span><br />
@Target(ElementType.PARAMETER)&nbsp; // <span style="color: #008000; ">注解的作用目标</span><br />
@Documented<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;RequestParam&nbsp;{&nbsp; //<span style="color: #008000; "> 使用@interface定义注解</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">;&nbsp; // <span style="color: #008000; ">类似方法的属性</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;required()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;&nbsp; // <span style="color: #008000; ">使用default指定属性的默认值</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;defaultValue()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;ValueConstants.DEFAULT_NONE;<br />
}</span></div>
<br />
使用方式如下：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;deleteUser(@RequestParam(value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">id</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,required</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">)&nbsp;Long&nbsp;id)&nbsp;&nbsp;{&nbsp;}</span></div>
<br /><h2>2、元注解</h2>元注解是指注解的注解。包括&nbsp; @Retention @Target @Document @Inherited四种。<br /><h4>
2.1、@Retention: 定义注解的保留策略</h4>
<div>@Retention(RetentionPolicy.<span style="color: #000000; ">SOURCE</span>)&nbsp;&nbsp; <span style="color: #008000; ">注解仅存在于源码中，在class字节码文件中不包含</span></div>
<div>@Retention(RetentionPolicy.<span style="color: #000000; ">CLASS</span>)<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的保留策略，</span><span style="color: #008000; ">注解会在class字节码文件中存在，但运行时无法获得，</span></div>
<div>@Retention(RetentionPolicy.RUNTIME)&nbsp;&nbsp; <span style="color: #008000;">注解会在class字节码文件中存在，在运行时可以通过反射获取到</span><br /><h4>
2.2、@Target：定义注解的作用目标</h4>
<div>@Target(ElementType.TYPE)&nbsp;&nbsp;   <span style="color: #008000;">接口、类、枚举、注解</span></div>
<div>@Target(ElementType.FIELD)&nbsp; <span style="color: #008000;">字段、枚举的常量</span></div>
<div>@Target(ElementType.METHOD)&nbsp; <span style="color: #008000;">方法</span></div>
<div>@Target(ElementType.PARAMETER) <span style="color: #008000;">方法参数</span></div>
<div>@Target(ElementType.CONSTRUCTOR)&nbsp; <span style="color: #008000;">构造函数</span></div>
<div>@Target(ElementType.LOCAL_VARIABLE) <span style="color: #008000;">局部变量</span></div>
<div>@Target(ElementType.ANNOTATION_TYPE) <span style="color: #008000;">注解</span></div>
<div>@Target(ElementType.PACKAGE)&nbsp; <span style="color: #008000;">包</span>&nbsp;&nbsp;&nbsp; <br /><h4>2.3、@Document：说明该注解将被包含在javadoc中</h4><h4>2.4、@Inherited：说明子类可以继承父类中的该注解</h4><h2>3、通过反射读取注解</h2><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;java.lang.reflect;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.lang.annotation.Annotation;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;AnnotatedElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">判断该元素中某个注解类型是否存在</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;isAnnotationPresent(Class</span><span style="color: #000000; ">&lt;?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Annotation</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;annotationClass);<br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">获得该元素中某个注解类型的注解</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Annotation</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;T&nbsp;getAnnotation(Class</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;annotationClass);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">获得该元素中所有可见的注解，包含继承得到的注解</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;getAnnotations();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">获得该元素自身什么的注解，不包含继承得到的注解</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;getDeclaredAnnotations();<br />}<br /></span></div><br />java.lang.Package<br />java.lang.Class<br />java.lang.reflect.Construtor<br />java.lang.reflect.Field<br />java.lang.reflect.Method<br />均实现了该接口，所以我们可以通过反射获取到 Class、Construtor、Field、Mehtod等，然后再通过上述接口方法，获得作用在这些元素上的注解。<br />下面是RequestParam注解的使用，为便于演示，略作修改，见org.springframework.web.bind.annotation.support.HandlerMethodInvoker源码<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Method&nbsp;handlerMethod&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*****</span><span style="color: #000000; ">;<br />Annotation[]&nbsp;paramAnns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;handlerMethod.getParameterAnnotations();<br /><br />String&nbsp;paramName&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; ">boolean</span><span style="color: #000000; ">&nbsp;required&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />String&nbsp;defaultValue&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Annotation&nbsp;paramAnn&nbsp;:&nbsp;paramAnns)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(RequestParam.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">.isInstance(paramAnn))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestParam&nbsp;requestParam&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(RequestParam)&nbsp;paramAnn;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramName&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;requestParam.value();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;requestParam.required();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultValue&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;parseDefaultValueAttribute(requestParam.defaultValue());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;annotationsFound</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;*******其他处理*******************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}<br /><br /></span></div><br /><h2>4、常见注解的说明及使用</h2>@Override :@Target(ElementType.METHOD)&nbsp;&nbsp; @Retention(RetentionPolicy.SOURCE)&nbsp; 说明方法是对父类方法的覆盖，用于编译器编译时进行检查<br />@Deprecated: @Documented&nbsp; @Retention(RetentionPolicy.RUNTIME)&nbsp;&nbsp; 用于建议不要使用某元素<br />@SuppressWarnings：@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE)&nbsp; <br />&nbsp;&nbsp;&nbsp; 说明对被批注的代码元 素内部的某些警告保持静默</div>
</div><img src ="http://www.blogjava.net/liuxiaosan/aggbug/347691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-08-22 18:33 <a href="http://www.blogjava.net/liuxiaosan/articles/347691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript之函数式编程和闭包</title><link>http://www.blogjava.net/liuxiaosan/articles/356518.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Mon, 15 Aug 2011 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/356518.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/356518.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/356518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/356518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/356518.html</trackback:ping><description><![CDATA[<div><div>摘录 http://www.infoq.com/cn/articles/why-recommend-nodejs 部分内容</div><br />JavaScript是一种函数式编程语言，函数编程语言最重要的数学基础是&#955;演算(lambda calculus) -- 即函数对象可以作为其他函数对象的输入(参数)和输出(返回值)。</div><div>函数运行时需要访问函数定义时的上下文数据。并且javascript支持匿名函数。<br /></div><div>JavaScript中一个函数也是一个对象。一个函数实例fn除了函数体的定义之外，我们仍然可以在这个函数对象实例之本身扩展其他属性，如fn.a=1;</div><div>在每个JavaScript函数运行时，都有一个运行时内部对象称为Execution Context，它包含如下Variable Object(VO,变量对象)， Scope Chain(作用域链)和"this" Value三部分。如图:</div><img src="http://www.blogjava.net/images/blogjava_net/liuxiaosan/image1.jpg" alt="" border="0" height="249" width="340" /><br /><br /><div>只要能明确的区分函数定义和函数运行两个时机，那么闭包就是让函数在运行时能够访问到函数定义时的所处作用域内的所有变量，或者说函数定义时能访问到什么变量，那么在函数运行时通过相同的变量名一样能访问到。</div><img src ="http://www.blogjava.net/liuxiaosan/aggbug/356518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-08-15 09:44 <a href="http://www.blogjava.net/liuxiaosan/articles/356518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Volatile变量</title><link>http://www.blogjava.net/liuxiaosan/articles/347878.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Fri, 08 Apr 2011 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347878.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347878.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347878.html</trackback:ping><description><![CDATA[&nbsp;<strong><span style="color: red;">http://www.ibm.com/developerworks/cn/java/j-jtp06197.html</span></strong>&nbsp; 一文笔记<br />
<br />
在java中，为了提高性能，线程一般把变量从内存中备份一个副本到寄存器。volatile 关键字意思是易失性，明确表示<br />
一个变量是会被多线程访问的，每个线程在每次读取都要从内存读取原始副本的值，而不是缓存在寄存器中的值。每次修改<br />
都是把值写回到内存中。<br />
<br />
Java语言包含两种内在的同步机制：同步块（或方法）和 volatile 变量。<br />
<br />
synchronized锁提供了两种主要特性：<em>互斥（mutual exclusion）</em> 和<em>可见性（visibility）</em>。互斥即一次只允许一个线程持有某个特定的锁，因此可使用该特性实现对共享数据的协调访问协议，这样，一次就只有一个线程能够使用该共享数据。可见性必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。 否则，线程看到的共享变量可能是修改前的值或不一致的值，引发严重问题。
<br />
<br />
volatile能够实现上述可见性，因为线程每次都是读取原始版本的值，前一个线程的修改对后续线程来说是可见的。但volatile不能确保互斥。<br />
<br />
volatile适用的原则：<br />
<ul>
    <li>对变量的写操作不依赖于当前值。</li>
    <li>该变量没有包含在具有其他变量的不变式中。</li>
</ul>
所以volatile不能用作计数器，因为计数器的自增是一个读-增-写的过程，不是原子操作，在volatile不确保互斥的情况下，结果不准确。<br />
不变式的意思是一个需要不变的规律，如起始要小于等于结束。上述2点简单来说：即变量真正独立于其他变量和自己以前的值 ， 在这些<br />
情况下可以使用 <code>volatile</code> 代替 <code>synchronized</code> 来简化代码。<br />
<br />
volatile由于不阻塞线程，在性能一般比synchronized表现更好。<br />
<br />
适用volatile的几个场景：<br />
1、状态标志&nbsp; 比如标示服务启动或停止。<br />
2、独立观察&nbsp; 定期 &#8220;发布&#8221; 观察结果供程序内部使用，<br />
3、<a name="listing6">结合使用 volatile 和 synchronized 实现 &#8220;开销较低的读－写锁&#8221;</a><br />
<pre class="displaycode">@ThreadSafe<br />
public class CheesyCounter {<br />
private <strong>volatile</strong> int value;<br />
// 使用volatile实现可见性，开销低<br />
public int getValue() { return value; }<br />
// 使用synchronized实现互斥<br />
public <strong>synchronized</strong> int increment() {<br />
return value++;<br />
}<br />
}<br />
</pre>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-04-08 16:28 <a href="http://www.blogjava.net/liuxiaosan/articles/347878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能网站建设指南笔记</title><link>http://www.blogjava.net/liuxiaosan/articles/347722.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Fri, 08 Apr 2011 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347722.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347722.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347722.html</trackback:ping><description><![CDATA[<a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html">
</a>本文是阅读《高性能网站建设指南》一书的笔记。该书作者是Yahoo!的<strong>Steve Souders</strong> ，总结了yahoo!在web前端优化的最佳实践。<br />
<br />
Web前端性能黄金法则：只有10%-20%的最终用户响应时间花在下载html文档上。其余时间花在了下载页面中所有的组件上。<br />
页面组件包括：图片，javascript，css,flash等内容<br />
<br />
Http请求响应<br />
GET /home/**.js<br />
HTTP 1.1<br />
Host: www.taobao.com<br />
User-Agent: Mozilla/**<br />
Accept-Encoding:gzip,deflate&nbsp; ----》支持压缩<br />
If-Modified-since:web,22 Feb**&nbsp;&nbsp; -----》判断是否采用浏览器缓存<br />
Expires:web****&nbsp; -----》明确声明失效时间，避免If-Modified-since条件请求的至少一次与服务器的交互<br />
Connection: keep-alive ----》使用长连接<br />
--------------------------------------------------------------------------------------------------------------------<br />
HTTP 1.1 304 Not Modified ----》没修改<br />
Content-Type: application/x-javascript<br />
Last-Modified : web,22**<br />
Content-Encoding:gzip<br />
<br />
更详细的见http规范： http://www.w3.org/Protocols/rfc2616/rfc2616.html<br />
<br />
<strong>1、<span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">减少HTTP请求<br />
</span></strong>
<ul>
    <li>使用图片地图 一个图片上面关联多个URL,由点击的位置决定目标URL，目的在于建设图片数量</li>
    <li>CSS Sprites 讲多个图片合并成一幅图片，图片地图中的图片要连续，Css Sprites不需要<br />
    </li>
    <li>内联图片</li>
    <li>合并脚本和样式表 网站首页平均应该使用6、7个脚本和1、2个样式表<br />
    </li>
</ul>
<strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">2、使用外部JavaScript和CSS<br />
</span></strong><strong></strong>
<p>&nbsp;&nbsp; 单纯来说，内联比外联更快一些。</p>
<p>&nbsp;&nbsp; 对于用户访问很少的页面，比如注册等，建议内联。</p>
<p>&nbsp;&nbsp; 对于用户访问较多的页面，比如list或者商品详情页面等，建议外联，浏览器可以使用缓存的组件。</p>
<p>&nbsp;&nbsp; 对于重用性较高的组件，使用外联<br />
</p>
<strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">3、使用内容发布网络<br />
&nbsp;&nbsp;
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">CDN（Content Delivery Network）内容分发网络，让用户就近访问页面静态组件</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
4、减少DNS查找<br />
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">&nbsp;&nbsp;&nbsp;
通常浏览器查询一个给定的主机名的ip需要花费20-120毫秒。建议将页面组件放在至少2个，但不超过4个的主机名下。</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
5、添加Expires或者Cache-Control头　<br />
&nbsp;&nbsp;
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">Expires和</span><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">Cache-Control</span><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">头都用于浏览器可以使用本地缓存直至制定的时间，web服务器如apache,lighttpd,nginx等都有相应模块可配置</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
6、精简JavaScript<br />
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">&nbsp; 精简代码，将所有不必要的注释和空白换行等移除。可以使用 JSMin（http://crockford.com/javascript/jsmin）进行精简。</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
</span></strong><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">7、压缩组件　<br />
&nbsp;&nbsp;
</span></strong>Accept-Encoding头，一般只压缩脚本和样式表，图片不需要，因为图片通常都是压缩过的。Apache 2.x使用mod_deflate模块gzip压缩<strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
8、避免重定向<br />
&nbsp;&nbsp;
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">重定向使得html文档到达前，页面不会呈现任何内容。所以要减少重定向</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
9、将样式表放在顶部 <br />
&nbsp;&nbsp; </span></strong><strong></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">样式表放在底部，</span><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">浏览器为了在样式表变化时不需要重绘页面</span><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">会阻止内容自顶向下逐步呈现。将CSS放在顶部，有利于浏览器从上向下显示页面</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">。<br />
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">&nbsp;&nbsp; 推荐使用&lt;link rel="stylesheet" href="common.css"&gt;方式，而不是import方式，因为import方式会导致组件下载的无序性，破坏了放在顶部的初衷。</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
10、移除重复脚本<br />
&nbsp;&nbsp;
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">由于团队成员的长期维护，会遗留一定的重复脚本，需要定期清理</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
11、将脚本放在底部    　<br />
&nbsp;
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">浏览器遵从http规范并行的从每个主机名并行下载两个组件。这样可以有效提高下载的效率。但浏览器在下载脚本时时禁用并行下载的，因为脚本有可能修改页面内容。浏览器会阻塞确保页面恰当的布局。</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
12、配置ETag<br />
13、避免CSS表达式    　<br />
&nbsp;&nbsp;
</span></strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;">CSS表达式是实现的效果可以通过其他手段实现，并且风险更小。</span><strong><span id="LabelEditDesc" class="bottom" style="text-indent: 1.8em; line-height: 1.8em;"><br />
14、使Ajax可缓存</span></strong><br />
&nbsp;&nbsp; Ajax只是实现了异步，避免页面的重新加载，但是不意味着即时。所有一个用户在操作后仍然要等待才能看到结果。一些缓存的原则也可以适用于ajax.<br />
<span class="byline">&nbsp;&nbsp; Ajax的POST要两步，而GET只需要一步。所以尽量采用get方式。</span>GET 方式可以更快响应，但是可能会有被浏览器缓存的问题，一般都需要加个随机数来避免，POST 方式则不会。<br />
<br />
<strong>15、Cookie</strong><br />
<span class="byline">&nbsp; </span>减少cookie中的信息，避免不重要的信息放在cookie中；对于图片或者静态服务器，使用cookie无关的域名，避免cookie的传输。<br />
<a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_content.html">
</a>
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-04-08 10:59 <a href="http://www.blogjava.net/liuxiaosan/articles/347722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java动态代理</title><link>http://www.blogjava.net/liuxiaosan/articles/347552.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Wed, 06 Apr 2011 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347552.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347552.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347552.html</trackback:ping><description><![CDATA[java dynamic proxy<br />
<br />
核心java.lang.reflect.Proxy类<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: #008000;">//</span><span style="color: #008000;">&nbsp;根据给定接口和ClassLoader获取Class对象</span><span style="color: #008000;"><br />
// 使用Class.forName动态加载Class<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;getProxyClass(ClassLoader&nbsp;loader, Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" />&nbsp;interfaces)；<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建代理对象</span><span style="color: #008000;"><br />
// 通过反射的Constructor创建代理对象<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Object&nbsp;newProxyInstance(ClassLoader&nbsp;loader, Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">[]&nbsp;interfaces, InvocationHandler&nbsp;h)；<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;判断是否是代理Class</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isProxyClass(Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;cl)；<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获得代理对象的InvocationHandler</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;InvocationHandler&nbsp;getInvocationHandler(Object&nbsp;proxy)</span></div>
<br />
java.lang.reflect.InvocationHandler接口<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: #008000;">//</span><span style="color: #008000;">&nbsp;反射调用代理类方法</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable;</span></div>
<br />
org.springframework.aop.framework.JdkDynamicAopProxy<br />
springframeworkAOP特性实现的基础之一，通过动态代理实现<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: #008080;">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.springframework.aop.framework;<br />
</span><span style="color: #008080;">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;JdkDynamicAopProxy&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;AopProxy,&nbsp;InvocationHandler,&nbsp;Serializable&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;代理的配置信息&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;AdvisedSupport&nbsp;advised;<br />
</span><span style="color: #008080;">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;JdkDynamicAopProxy(AdvisedSupport&nbsp;config)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;AopConfigException&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(config,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">AdvisedSupport&nbsp;must&nbsp;not&nbsp;be&nbsp;null</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(config.getAdvisors().length&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;config.getTargetSource()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;AdvisedSupport.EMPTY_TARGET_SOURCE)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;AopConfigException(</span><span style="color: #000000;">"</span><span style="color: #000000;">No&nbsp;advisors&nbsp;and&nbsp;no&nbsp;TargetSource&nbsp;specified</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config;<br />
</span><span style="color: #008080;">&nbsp;14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;15</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;16</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getProxy()&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;getProxy(ClassUtils.getDefaultClassLoader());<br />
</span><span style="color: #008080;">&nbsp;19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;getProxy(ClassLoader&nbsp;classLoader)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(logger.isDebugEnabled())&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">Creating&nbsp;JDK&nbsp;dynamic&nbsp;proxy:&nbsp;target&nbsp;source&nbsp;is&nbsp;</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: #0000ff;">this</span><span style="color: #000000;">.advised.getTargetSource());<br />
</span><span style="color: #008080;">&nbsp;25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;proxiedInterfaces&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AopProxyUtils.completeProxiedInterfaces(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised);<br />
</span><span style="color: #008080;">&nbsp;27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);<br />
</span><span style="color: #008080;">&nbsp;28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用了Proxy动态代理创建代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Proxy.newProxyInstance(classLoader,&nbsp;proxiedInterfaces,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;31</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;32</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;回调代理对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInvocation&nbsp;invocation;<br />
</span><span style="color: #008080;">&nbsp;36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;oldProxy&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: #008080;">&nbsp;37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;setProxyContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;38</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TargetSource&nbsp;targetSource&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.targetSource;<br />
</span><span style="color: #008080;">&nbsp;40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;targetClass&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: #008080;">&nbsp;41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;target&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: #008080;">&nbsp;42</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.equalsDefined&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;AopUtils.isEqualsMethod(method))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;45</span>&nbsp;<span style="color: #000000;">&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;The&nbsp;target&nbsp;does&nbsp;not&nbsp;implement&nbsp;the&nbsp;equals(Object)&nbsp;method&nbsp;itself.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;equals(args[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br />
</span><span style="color: #008080;">&nbsp;47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.hashCodeDefined&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;AopUtils.isHashCodeMethod(method))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;49</span>&nbsp;<span style="color: #000000;">&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;The&nbsp;target&nbsp;does&nbsp;not&nbsp;implement&nbsp;the&nbsp;hashCode()&nbsp;method&nbsp;itself.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;hashCode();<br />
</span><span style="color: #008080;">&nbsp;51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.opaque&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;method.getDeclaringClass().isInterface()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.getDeclaringClass().isAssignableFrom(Advised.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;54</span>&nbsp;<span style="color: #000000;">&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;Service&nbsp;invocations&nbsp;on&nbsp;ProxyConfig&nbsp;with&nbsp;the&nbsp;proxy&nbsp;config<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;AopUtils.invokeJoinpointUsingReflection(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised,&nbsp;method,&nbsp;args);<br />
</span><span style="color: #008080;">&nbsp;56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;57</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;retVal;<br />
</span><span style="color: #008080;">&nbsp;59</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&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;">this</span><span style="color: #000000;">.advised.exposeProxy)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;61</span>&nbsp;<span style="color: #000000;">&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;Make&nbsp;invocation&nbsp;available&nbsp;if&nbsp;necessary.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldProxy&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AopContext.setCurrentProxy(proxy);<br />
</span><span style="color: #008080;">&nbsp;63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setProxyContext&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;65</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;May&nbsp;be&nbsp;null.&nbsp;Get&nbsp;as&nbsp;late&nbsp;as&nbsp;possible&nbsp;to&nbsp;minimize&nbsp;the&nbsp;time&nbsp;we&nbsp;"own"&nbsp;the&nbsp;target,<br />
</span><span style="color: #008080;">&nbsp;67</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;in&nbsp;case&nbsp;it&nbsp;comes&nbsp;from&nbsp;a&nbsp;pool.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;targetSource.getTarget();<br />
</span><span style="color: #008080;">&nbsp;69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(target&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetClass&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;target.getClass();<br />
</span><span style="color: #008080;">&nbsp;71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;72</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Get&nbsp;the&nbsp;interception&nbsp;chain&nbsp;for&nbsp;this&nbsp;method.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;chain&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.advised.getInterceptorsAndDynamicInterceptionAdvice(method,&nbsp;targetClass);<br />
</span><span style="color: #008080;">&nbsp;75</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;76</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(chain.isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;77</span>&nbsp;<span style="color: #000000;">&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;如果拦截链是空的，直接通过反射调用target对象的方法<br />
</span><span style="color: #008080;">&nbsp;78</span>&nbsp;<span style="color: #008000;">&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;method.invoke(target,&nbsp;args);</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;79</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AopUtils.invokeJoinpointUsingReflection(target,&nbsp;method,&nbsp;args);<br />
</span><span style="color: #008080;">&nbsp;80</span>&nbsp;<span style="color: #000000;">&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 />
</span><span style="color: #008080;">&nbsp;81</span>&nbsp;<span style="color: #000000;">&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;如果拦截链不为空，包装一个反射方法调用<br />
</span><span style="color: #008080;">&nbsp;82</span>&nbsp;<span style="color: #008000;">&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;先调用织入的拦截器，最后仍然是反射调用target对象的方法</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;83</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invocation&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ReflectiveMethodInvocation(proxy,&nbsp;target,&nbsp;method,&nbsp;args,&nbsp;targetClass,&nbsp;chain);<br />
</span><span style="color: #008080;">&nbsp;84</span>&nbsp;<span style="color: #000000;">&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;Proceed&nbsp;to&nbsp;the&nbsp;joinpoint&nbsp;through&nbsp;the&nbsp;interceptor&nbsp;chain.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;85</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invocation.proceed();<br />
</span><span style="color: #008080;">&nbsp;86</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;87</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;88</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Massage&nbsp;return&nbsp;value&nbsp;if&nbsp;necessary.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;89</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(retVal&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;retVal&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;target&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;method.getReturnType().isInstance(proxy)&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;90</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">RawTargetAccess.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.isAssignableFrom(method.getDeclaringClass()))&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;91</span>&nbsp;<span style="color: #000000;">&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;Special&nbsp;case:&nbsp;it&nbsp;returned&nbsp;"this"&nbsp;and&nbsp;the&nbsp;return&nbsp;type&nbsp;of&nbsp;the&nbsp;method<br />
</span><span style="color: #008080;">&nbsp;92</span>&nbsp;<span style="color: #008000;">&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;is&nbsp;type-compatible.&nbsp;Note&nbsp;that&nbsp;we&nbsp;can't&nbsp;help&nbsp;if&nbsp;the&nbsp;target&nbsp;sets<br />
</span><span style="color: #008080;">&nbsp;93</span>&nbsp;<span style="color: #008000;">&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;a&nbsp;reference&nbsp;to&nbsp;itself&nbsp;in&nbsp;another&nbsp;returned&nbsp;object.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;94</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;proxy;<br />
</span><span style="color: #008080;">&nbsp;95</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;96</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;retVal;<br />
</span><span style="color: #008080;">&nbsp;97</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;98</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;99</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(target&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">targetSource.isStatic())&nbsp;{<br />
</span><span style="color: #008080;">100</span>&nbsp;<span style="color: #000000;">&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;Must&nbsp;have&nbsp;come&nbsp;from&nbsp;TargetSource.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">101</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetSource.releaseTarget(target);<br />
</span><span style="color: #008080;">102</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">103</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(setProxyContext)&nbsp;{<br />
</span><span style="color: #008080;">104</span>&nbsp;<span style="color: #000000;">&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;Restore&nbsp;old&nbsp;proxy.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">105</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AopContext.setCurrentProxy(oldProxy);<br />
</span><span style="color: #008080;">106</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">107</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">108</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">109</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">110</span>&nbsp;</div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-04-06 10:58 <a href="http://www.blogjava.net/liuxiaosan/articles/347552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOP设计原则</title><link>http://www.blogjava.net/liuxiaosan/articles/347388.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Thu, 31 Mar 2011 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347388.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347388.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347388.html</trackback:ping><description><![CDATA[<strong>低耦合、高内聚 <br />
</strong>
<br />
OOP设计原则主要提供了一个方向，使得我们的程序设计得更加合理，从而获得更好的可扩展性、可维护性。主要包括以下几个原则： <br />
<br />
1、<strong>OCP（Open-Closed Principle） 开放封闭原则。 </strong><br />
对扩展开放，对修改关闭。即在不修改原有程序源码的情况下对其进行扩展。实现开闭原则的关键就在于&#8220;抽象&#8221;。
&#8220;作为系统设计的抽象层，要预见所有可能的扩展，从而使得在任何扩展情况下，系统的抽象底层不需修改；同时，由于可以从抽象底层导出一个或多个新的具体实
现，可以改变系统的行为，因此系统设计对扩展是开放的。 &#8221; 这个原则是OOP的基石，其他原则主要来实现本原则。 <br />
<br />
2、<strong>SRP （Simple Responsibility Pinciple）单一职责原则。 </strong><br />
一个类一般应该设计成只有一个职责，如果设计成具备很多职责，那么任何一个职责的改变都会引起这个类的修改，相关引用该类的代码也可能受到影响。不同的职责或功能应该由不同的类来实现，这样可以很好的控制变化带来的影响粒度。 <br />
<br />
3、<strong>DIP （Dependence Inversion Principle）依赖倒转原则。  </strong><br />
抽象不应该依赖于实现细节，实现细节应该依赖于抽象；高层不应该依赖于底层，都应该依赖于抽象。针对接口编程： 应该用接口或者抽象类声明变量、方法参数、方法返回类型等。 <br />
<br />
4、<strong>LSP （Liskov Substitution Principle）里氏代换原则。 </strong><br />
子类型完全可以替换父类型，而不需要任何修改，并且获得期望的结果。 <br />
<br />
5、<strong>ISP （Interface Segregation Principle）接口隔离原则。 </strong><br />
客户端不应该可以访问不需要的方法，这些不需要的方法是一种有害的耦合性。 <br />
所以应该设计多个专门接口而不是单个复杂的接口，客户端仅依赖最小的接口类型。 <br />
<br />
6、<strong>LoD （Law of Demeter）迪米特法则。 </strong><br />
即最少知识原则。一个对象应当对其他对象有尽可能少的了解。只和最直接的类交互，对第三方可以通过转达交互，从而减少对象间的耦合性。 <br />
<br />
7、<strong>CARP （Composite/Aggregate Reuse Principle）合成/聚合复用原则。 </strong><br />
多聚合、少继承，实现复用性。聚合的复用是一种封闭性的复用，被复用者对复用者隐藏了自身细节，而继承是一种开放性的复用，子类可以获取父类型相关的细节，破坏了封闭性。
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-03-31 14:07 <a href="http://www.blogjava.net/liuxiaosan/articles/347388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 反射</title><link>http://www.blogjava.net/liuxiaosan/articles/347387.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Thu, 31 Mar 2011 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347387.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347387.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347387.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347387.html</trackback:ping><description><![CDATA[Java Reflection 是一种<strong>内省</strong>机制，帮助程序在<strong>运行时</strong>对自身及软件环境进行检查，并根据检查得到的程序结构，改变自身的部分行为。 <br />
<br />
核心类为 <strong>java.lang.Class</strong> 类，抽象了程序的元数据，每一个类的元数据就是一个Class对象实例。这个Class实例是一个静态实例，对应类的每一个实例都会关联这个静态实例。通过Class类可以查询该类的方法、字段、接口、构造器等一系列信息。详见下面。 <br />
<br />
对象回去自身对应的Class实例是通过继承自Object类的getClass()方法； <br />
对于基本类型，每一种也有一个名为class的静态实例，如int.class double.class boolean.class； <br />
对于数组类型，也有Object[].class,   注意 int[][].class==int[].class <br />
<br />
<br />
判断对象类型的接口： <br />
String getName() 获得类全名 <br />
Class getComponentType() 如果对象是数组，返回数据中元素的类类型 <br />
boolean isArray() <br />
boolean isInterface() <br />
boolean isPrimitive() <br />
boolean isAnnotation() <br />
<br />
########################################################################################################### <br />
接口 <br />
java.lang.Class中定义的检查接口的接口： <br />
Class[] getInterfaces() <br />
Class getSuperClass() 直系父类 ，对于Object、接口、void关键字、基本类型，返回null <br />
boolean isAssignableFrom(Class cls) 该类是参数的类型或参数的父类型 <br />
boolean isInstance(Object obj) 该类是参数的实例或者参数的子类实例 <br />
<br />
Class类和Object类存在比较纠结的关系 <br />
Class.class.isIntance(Class.class) == true    Class类的class实例是Class本身的实例 <br />
Class.class.isInstance(Object.class) == true   <br />
Object.class.isAssignableFrom(Class.class) == true <br />
Object.class.isIntance(Class.class) == true <br />
<br />
########################################################################################################### <br />
java.lang.reflect部分类图 <br />
<br />
<a href="http://liucs.blog.chinajavaworld.com/servlet/AttachmentServlet/download/289475-51576-5108/reflect.JPG" target="_blank"><img style="cursor: pointer;" alt="" title="在新窗口打开图片" src="http://liucs.blog.chinajavaworld.com/servlet/AttachmentServlet/download/289475-51576-5108/reflect.JPG" border="0" /></a> <br />
########################################################################################################### <br />
<br />
java.lang.reflect.Constructor <br />
java.lang.Class中相关方法 <br />
<br />
Constructor getConstructor(Class[] parameterTypes) <br />
Constructor getDeclaredConstructor（Class[]parameterTypes) <br />
Constructor[] getConstructors() <br />
Constructor[] getDeclaredConstructors() <br />
<br />
java.lang.reflect.Constructor <br />
Class getDeclaredClass() <br />
Class[] getExceptionTypes() <br />
int getModifiers() <br />
String getName() <br />
Class[] getParameterTypes() <br />
Object newInstance(Object[] initArgs)  创建实例 <br />
<br />
对于数组，使用 java.lang.reflect.Array.newInstance(String.class,5)形式创建实例 <br />
<br />
########################################################################################################### <br />
<br />
java.lang.reflect.Method <br />
<br />
java.lang.Class类中定义了如下接口查询一个类所具有的方法。 <br />
Method getMethod(String name,Class[]parameterTypes) <br />
Method[] getMethods() <br />
上述2个接口查询继承获得和自身声明的方法 <br />
Method getDeclaredMethod(String name,Class[]parameterTypes)  <br />
Method[] getDeclaredMethods() <br />
上述2个接口查询自身声明的方法 <br />
<br />
java.lang.reflect.Method类定义的方法  <br />
Class getDeclaringClass()  声明该方法的类实例 <br />
Class[] getExceptionTypes()  方法的异常类型 <br />
int getModifiers() 方法的可见性 <br />
String getName() 方法名 <br />
Class[] getParameterTypes() 方法参数类型 <br />
Class getReturnType() 方法返回类型 <br />
Object invoke(Object obj,Object[]args) 反射调用一个对象上面的该方法 <br />
<br />
########################################################################################################### <br />
<br />
java.lang.reflect.Field <br />
<br />
java.lang.Class类中关于Field的相关方法： <br />
Field getField(String name) <br />
Field[]  getFields() <br />
Field getDeclaredField(String name) <br />
Field[] getDeclaredFields() <br />
<br />
java.lang.relect.Field中主要方法 <br />
Class  getType() 返回字段的Class <br />
Class getDeclaringClass()  返回什么该字段的Class <br />
String getName() <br />
int getModifiers() <br />
Object get(Object obj) 返回obj该字段的值 <br />
boolean getBoolean(Object obj) <br />
void set(Object obj,Object value) 设置obj该字段的值 <br />
void setBoolean(Object obj,boolean value) <br />
<br />
########################################################################################################### <br />
<br />
java.lang.reflect.Modifier 字段或者方法的访问性 <br />
static boolean isPublic(int mod) <br />
static boolean isPrivate(int mod) <br />
<br />
共包括以下：  <br />
public static native volatile protected transient  <br />
abstract synchronized strictfp  private final <br />
<br />
<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: #000000;">Class&nbsp;cls&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(String&nbsp;className);<br />
Object&nbsp;obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cls.newInstance();</span></div>
<br />
动态加载机制使得可以避开编译器类范围的限制，常见场景是jdbc驱动。动态加载机制也是通过ClassLoader实现。<br />
通过动态加载机制的类名并不是一般意义的类名，而是：<br />
1、基本类型，首字母大写，如 int -&gt; I<br />
2、引用类型，L+全类名，如 Ljava.lang.String<br />
3、数组类型，[+***， 如[I, &nbsp; [Ljava.lang.String&nbsp; ,&nbsp; [[I,&nbsp; [[Ljava.lang.String<br />
<br />
注意：基本类型，不能通过Class.forName（）加载,会抛出异常<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-03-31 14:06 <a href="http://www.blogjava.net/liuxiaosan/articles/347387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 参数传递</title><link>http://www.blogjava.net/liuxiaosan/articles/347384.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Thu, 31 Mar 2011 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/347384.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/347384.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/347384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/347384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/347384.html</trackback:ping><description><![CDATA[Java在方法参数传递时：<br />
<br />
1、对于基本类型，传递值<br />
2、对于对象类型，传递对象引用<br />
需要注意的是：对于上述两种传递类型，在传递时都是拷贝传递，即值传递时拷贝出一个新值，引用<br />
传递时拷贝出一个新的拷贝。<br />
<br />
有时候也说Java只有值传递，意思是对于引用类型，传递引用的值。一个概念，不用纠缠。<br />
<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;值传递</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addInt1(i);<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出1</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addInt2(i);<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出1<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用传递实例1</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifyStr1(str);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出123<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用传递实例2</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;stringBuilder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuilder(</span><span style="color: #000000;">"</span><span style="color: #000000;">123</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifyStringBuilder(stringBuilder);<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stringBuilder.toString());</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;输出123456</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;拷贝了新的值，原值不变</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addInt1(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;拷贝了新的值，原值不变</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addInt2(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;新的拷贝引用指向了一块新数据区，原拷贝仍然指向原数据区</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;modifyStr1(String&nbsp;str)&nbsp;{<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">456</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;新的拷贝引用仍然指向原数据区，但修改了原数据区的内容</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;modifyStringBuilder(StringBuilder&nbsp;str)&nbsp;{<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.append(</span><span style="color: #000000;">"</span><span style="color: #000000;">456</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<img src ="http://www.blogjava.net/liuxiaosan/aggbug/347384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-03-31 14:05 <a href="http://www.blogjava.net/liuxiaosan/articles/347384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>