<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>五四陈科学院-坚信科学，分享技术</title>
	
	<link>http://www.54chen.com</link>
	<description>PHP、JAVA、缓存、架构、经验、分享</description>
	<lastBuildDate>Thu, 24 May 2012 02:34:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/-aboutJavaAndPhp" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="-aboutjavaandphp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>rose手册第三章五节：controller层：统一的参数验证办法</title>
		<link>http://www.54chen.com/java-ee/rose-3-5.html</link>
		<comments>http://www.54chen.com/java-ee/rose-3-5.html#comments</comments>
		<pubDate>Thu, 24 May 2012 02:25:35 +0000</pubDate>
		<dc:creator>54chen</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[rose]]></category>

		<guid isPermaLink="false">http://www.54chen.com/java-ee/rose-3-5.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>3.5.1 用来做什么 ---------------- * 我们把的参数验证办法叫ParamValidator * 一般来说，像比如说验证http传来的参数是不是为空呀啥的（发挥你的想象力）。 * 好处在于不用再重复地写if else 3.5.2 怎么用 ------------ * 来看一个例子，验证用户的参数不可为空(灰常灰常的实用)： public&#160;class&#160;NotBlankParamValidator&#160;implements&#160;ParamValidator&#160;{&#160;&#160; &#160;&#160; &#160;&#160;&#160;&#160;@Override&#160;&#160; &#160;&#160;&#160;&#160;public&#160;boolean&#160;supports(ParamMetaData&#160;metaData)&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;metaData.getAnnotation(NotBlank.class)&#160;!=&#160;null;&#160;&#160; &#160;&#160;&#160;&#160;}&#160;&#160; &#160;&#160; &#160;&#160;&#160;&#160;@Override&#160;&#160; &#160;&#160;&#160;&#160;public&#160;Object&#160;validate(ParamMetaData&#160;metaData,&#160;Invocation&#160;inv,&#160;Object&#160;target,&#160;Errors&#160;errors)&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;paramName&#160;=&#160;metaData.getParamName();&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;value&#160;=&#160;inv.getParameter(paramName);&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(StringUtils.isBlank(value))&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;"@参数不能为空";&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;null;&#160;&#160; &#160;&#160;&#160;&#160;}&#160;&#160; }&#160;&#160; 解读： * 放到controllers下 * 实现ParamValidator * 实现supports方法，这个方法用来做判断是否要验证当前得到的http参数，一般都用个注解来判断比较文艺 * &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p><img src="http://img03.taobaocdn.com/bao/uploaded/i3/T1_9ahXlFfXXbwx8Z8_101515.jpg_210x210.jpg" alt="rose" /><br />
<strong><br />
3.5.1 用来做什么</strong><br />
----------------<br />
* 我们把的参数验证办法叫ParamValidator<br />
* 一般来说，像比如说验证http传来的参数是不是为空呀啥的（发挥你的想象力）。<br />
* 好处在于不用再重复地写if else</p>
<p><strong>3.5.2 怎么用</strong><br />
------------<br />
* 来看一个例子，验证用户的参数不可为空(灰常灰常的实用)：</p>
<div class="chen-hl">
<div class="bar"></div>
<ol class="dp-j" start="1">
<li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;NotBlankParamValidator&nbsp;</span><span class="keyword">implements</span><span>&nbsp;ParamValidator&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;supports(ParamMetaData&nbsp;metaData)&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;metaData.getAnnotation(NotBlank.</span><span class="keyword">class</span><span>)&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Object&nbsp;validate(ParamMetaData&nbsp;metaData,&nbsp;Invocation&nbsp;inv,&nbsp;Object&nbsp;target,&nbsp;Errors&nbsp;errors)&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;paramName&nbsp;=&nbsp;metaData.getParamName();&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;inv.getParameter(paramName);&nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(StringUtils.isBlank(value))&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"@参数不能为空"</span><span>;&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong>解读：</strong></p>
<p>* 放到controllers下<br />
* 实现ParamValidator<br />
* 实现supports方法，这个方法用来做判断是否要验证当前得到的http参数，一般都用个注解来判断比较文艺<br />
* 实现validate方法，这里是主要逻辑<br />
 * metaData里放的是参数的原型<br />
 * inv是rose的基础调用<br />
 * target是这个参数的最后解析结果，参看上一节里提到的东西<br />
 * errors是这个参数解析时出来的错误<br />
* NotBlank是一个自己定义的annotation</p>
<p><strong>3.5.3 使用时action长什么样？</strong><br />
----------------------<br />
* 下面的代码是action中使用时长的样子:</p>
<div class="chen-hl">
<div class="bar"></div>
<ol class="dp-j" start="1">
<li class="alt"><span><span class="annotation">@Get</span><span>(</span><span class="string">"/notBlank"</span><span>)&nbsp;&nbsp;</span></span></li>
<li class=""><span><span class="keyword">public</span><span>&nbsp;String&nbsp;notBlank(</span><span class="annotation">@NotBlank</span><span>&nbsp;</span><span class="annotation">@Param</span><span>(</span><span class="string">"messages"</span><span>)&nbsp;String&nbsp;messages)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"@hello&nbsp;world"</span><span>;&nbsp;&nbsp;</span></span></li>
<li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong>解读：</strong><br />
* 当遇到NotBlank注解的参数时，会自动执行参数判断<br />
* 如果messages为空，则会得到“参数不能为空”的返回</p>
<p>文中所提及代码均在 <a href="https://github.com/XiaoMi/rose/tree/master/rose-example">https://github.com/XiaoMi/rose/tree/master/rose-example</a> 提供。<br />
文档持续修改版本在 <a href="https://github.com/XiaoMi/rose/tree/master/chapter_3_5">https://github.com/XiaoMi/rose/tree/master/chapter_3_5</a>。</p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/oU30DoEsgoIbDaQt4xAW0rJ5sCY/0/da"><img src="http://feedads.g.doubleclick.net/~a/oU30DoEsgoIbDaQt4xAW0rJ5sCY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/oU30DoEsgoIbDaQt4xAW0rJ5sCY/1/da"><img src="http://feedads.g.doubleclick.net/~a/oU30DoEsgoIbDaQt4xAW0rJ5sCY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/CsFWsHTp8LE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/java-ee/rose-3-5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>54chen Twitter memo 2012-05-20</title>
		<link>http://www.54chen.com/life/54chen-twitter-memo-2012-05-20.html</link>
		<comments>http://www.54chen.com/life/54chen-twitter-memo-2012-05-20.html#comments</comments>
		<pubDate>Sat, 19 May 2012 17:09:00 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[生活备份]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.54chen.com/life/54chen-twitter-memo-2012-05-20.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>rose手册第三章四节：controller层：自定义http参数支持 http://t.co/IVbj5RB2 # https://t.co/jJ2osdy4 收到了不少rose用户的反馈，要继续完善写下去，写文档是个快乐的活。 # rose手册第三章三节：controller层：ErrorHandler支持 http://t.co/xsjKNL9s # 还是有人用rose的，继续准备rose文档 https://t.co/jJ2osdy4 # 54chen Twitter memo 2012-05-13 http://t.co/2YPpChAl #<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><ul class="aktt_tweet_digest">
rose手册第三章四节：controller层：自定义http参数支持 <a href="http://t.co/IVbj5RB2" rel="nofollow">http://t.co/IVbj5RB2</a> <a href="http://twitter.com/54chen/statuses/203746198555860992" class="aktt_tweet_time">#</a><br />
<a href="https://t.co/jJ2osdy4" rel="nofollow">https://t.co/jJ2osdy4</a> 收到了不少rose用户的反馈，要继续完善写下去，写文档是个快乐的活。 <a href="http://twitter.com/54chen/statuses/203714002847666176" class="aktt_tweet_time">#</a><br />
rose手册第三章三节：controller层：ErrorHandler支持 <a href="http://t.co/xsjKNL9s" rel="nofollow">http://t.co/xsjKNL9s</a> <a href="http://twitter.com/54chen/statuses/202754613735206912" class="aktt_tweet_time">#</a><br />
还是有人用rose的，继续准备rose文档 <a href="https://t.co/jJ2osdy4" rel="nofollow">https://t.co/jJ2osdy4</a> <a href="http://twitter.com/54chen/statuses/202726676369645569" class="aktt_tweet_time">#</a><br />
54chen Twitter memo 2012-05-13 <a href="http://t.co/2YPpChAl" rel="nofollow">http://t.co/2YPpChAl</a> <a href="http://twitter.com/54chen/statuses/201487956568055809" class="aktt_tweet_time">#</a>
</ul>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/OmNhRAK8kXEbNV_jJFi1Ajak8h8/0/da"><img src="http://feedads.g.doubleclick.net/~a/OmNhRAK8kXEbNV_jJFi1Ajak8h8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OmNhRAK8kXEbNV_jJFi1Ajak8h8/1/da"><img src="http://feedads.g.doubleclick.net/~a/OmNhRAK8kXEbNV_jJFi1Ajak8h8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/oXG3ZTD4HWI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/life/54chen-twitter-memo-2012-05-20.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rose手册第三章四节：controller层：自定义http参数支持</title>
		<link>http://www.54chen.com/java-ee/rose-3-4.html</link>
		<comments>http://www.54chen.com/java-ee/rose-3-4.html#comments</comments>
		<pubDate>Sat, 19 May 2012 07:23:31 +0000</pubDate>
		<dc:creator>54chen</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[rose]]></category>

		<guid isPermaLink="false">http://www.54chen.com/java-ee/rose-3-4.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>3.4.1 http参数支持的一些前言 ----------------------------------------- * 我们把一个controller的类里的一个方法叫做action，它实际对应用户看到的一个url。 * 在action里可以接收各种各样的参数，也可以自己定义需要的参数。 * rose自己定义了一些常见的类型，基本上很有机会会用到自己定义，但是在某些情况下，也是个不错的选择： * 用来对指定的参数类型的值进行固定的修改和赋值。 3.4.2 看一个例子 -------------------------- ChenBeanResolver.java放在controllers目录下： public&#160;class&#160;ChenBeanResolver&#160;implements&#160;ParamResolver&#160;{&#160;&#160; &#160;&#160; &#160;&#160;&#160;&#160;@Override&#160;&#160; &#160;&#160;&#160;&#160;public&#160;Object&#160;resolve(Invocation&#160;inv,&#160;ParamMetaData&#160;metaData)&#160;throws&#160;Exception&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;(String&#160;paramName&#160;:&#160;metaData.getParamNames())&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(paramName&#160;!=&#160;null)&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Chen&#160;chen&#160;=&#160;new&#160;Chen();&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;value1&#160;=&#160;inv.getParameter("chen1");&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;value2&#160;=&#160;inv.getParameter("chen2");&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chen.setChen1(value1);&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chen.setChen2(value2);&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;chen;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;null;&#160;&#160; &#160;&#160; &#160;&#160;&#160;&#160;}&#160;&#160; &#160;&#160; &#160;&#160;&#160;&#160;@Override&#160;&#160; &#160;&#160;&#160;&#160;public&#160;boolean&#160;supports(ParamMetaData&#160;metaData)&#160;{&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;Chen.class&#160;==&#160;metaData.getParamType();&#160;&#160; &#160;&#160;&#160;&#160;}&#160;&#160; &#160;&#160; }&#160;&#160; * &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p><img src="http://img03.taobaocdn.com/bao/uploaded/i3/T1_9ahXlFfXXbwx8Z8_101515.jpg_210x210.jpg" alt="rose" /><br />
<strong>3.4.1 http参数支持的一些前言</strong><br />
-----------------------------------------<br />
* 我们把一个controller的类里的一个方法叫做action，它实际对应用户看到的一个url。<br />
* 在action里可以接收各种各样的参数，也可以自己定义需要的参数。<br />
* rose自己定义了一些常见的类型，基本上很有机会会用到自己定义，但是在某些情况下，也是个不错的选择：<br />
 * 用来对指定的参数类型的值进行固定的修改和赋值。</p>
<p><strong>3.4.2 看一个例子</strong><br />
--------------------------</p>
<p>ChenBeanResolver.java放在controllers目录下：</p>
<div class="chen-hl">
<div class="bar"></div>
<ol class="dp-j" start="1">
<li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ChenBeanResolver&nbsp;</span><span class="keyword">implements</span><span>&nbsp;ParamResolver&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Object&nbsp;resolve(Invocation&nbsp;inv,&nbsp;ParamMetaData&nbsp;metaData)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(String&nbsp;paramName&nbsp;:&nbsp;metaData.getParamNames())&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(paramName&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chen&nbsp;chen&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Chen();&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value1&nbsp;=&nbsp;inv.getParameter(<span class="string">"chen1"</span><span>);&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value2&nbsp;=&nbsp;inv.getParameter(<span class="string">"chen2"</span><span>);&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chen.setChen1(value1);&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chen.setChen2(value2);&nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;chen;&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class=""><span>&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;supports(ParamMetaData&nbsp;metaData)&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;Chen.</span><span class="keyword">class</span><span>&nbsp;==&nbsp;metaData.getParamType();&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
<li class="alt"><span>&nbsp;&nbsp;</span></li>
<li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>* 上述代码的意思：<br />
 * 如果在action里一个参数的类型是Chen(com.chen.model.Chen)，就会走这个resolver，这里对两个参数进行了组装。<br />
 * 用户如果访问的参数里传入了chen1和chen2的值，则会直接组装出来一个Chen对象。</p>
<p>* 配合上述resolver的action代码为：</p>
<div class="chen-hl">
<div class="bar"></div>
<ol class="dp-j" start="1">
<li class="alt"><span><span class="annotation">@Get</span><span>(</span><span class="string">"/param"</span><span>)&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;param(Chen&nbsp;chen)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"@hello&nbsp;world:"</span><span>&nbsp;+&nbsp;chen.getChen1()&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;chen.getChen2();&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>* 用户访问：http://127.0.0.1/param?chen1=1&#038;chen2=2 将会返回：<br />
** hello world:1:2</p>
<p><strong>3.4.2 rose内置的参数支持</strong><br />
------------------------------<br />
除了上述的自定义resolver外，rose还内置了丰富的resolver，都是大家的经验总结，使用起来会非常方便，它们是：<br />
* 所有的基础java类型，都可以直接使用，rose进行自动转换，比如在action中的类型为long id，则id可以转为数字，不再需要从string转为long。<br />
* array/map/bean同样可用，它们的接收参数规则为：<br />
 * ?id=1,2,3,4 或者 ?id=1&#038;id=2&#038;id=3  对应 @Param("id") int[] idArray<br />
 * ?map:1=paoding&#038;map:2=rose 对应 @Param("map") Map<Integer, String> map<br />
 * POST http://127.0.0.1/user?id=1&#038;name=rose&#038;level.id=3 对应接收代码：</p>
<div class="chen-hl">
<div class="bar"></div>
<ol class="dp-j" start="1">
<li class="alt"><span><span class="annotation">@Post</span><span>&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;post(User&nbsp;user)&nbsp;{&nbsp;&nbsp;</span></span></li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"@"</span><span>&nbsp;+&nbsp;user.getId()&nbsp;+&nbsp;</span><span class="string">";&nbsp;level.id="</span><span>&nbsp;+&nbsp;user.getLevel().getId();&nbsp;&nbsp;</span></span></li>
<li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>  * 代码中User是一个自定义的bean，有属性id,name,level等。</p>
<p>文中所提及代码均在 <a href="https://github.com/XiaoMi/rose/tree/master/rose-example">https://github.com/XiaoMi/rose/tree/master/rose-example</a> 提供。<br />
文档持续修改版本在 <a href="https://github.com/XiaoMi/rose/tree/master/chapter_3_4">https://github.com/XiaoMi/rose/tree/master/chapter_3_4</a>。</p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/ns-545o_UKVhnaeURtJNy4czpaE/0/da"><img src="http://feedads.g.doubleclick.net/~a/ns-545o_UKVhnaeURtJNy4czpaE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ns-545o_UKVhnaeURtJNy4czpaE/1/da"><img src="http://feedads.g.doubleclick.net/~a/ns-545o_UKVhnaeURtJNy4czpaE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/j1s3IY63Afk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/java-ee/rose-3-4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rose手册第三章三节：controller层：ErrorHandler支持</title>
		<link>http://www.54chen.com/java-ee/rose-3-3.html</link>
		<comments>http://www.54chen.com/java-ee/rose-3-3.html#comments</comments>
		<pubDate>Wed, 16 May 2012 13:42:54 +0000</pubDate>
		<dc:creator>54chen</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[rose]]></category>

		<guid isPermaLink="false">http://www.54chen.com/java-ee/rose-3-3.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>3.3.1 ErrorHandler的作用 一般来说传统的编程都会到处去try，特别是java里，try来try去的（如果你用erlang一定就知道，已经知道的可能性，怎么能叫异常？都try了还是让它崩了算了。。。）。 如果打开你的项目，每个java文件中的代码都有一堆的try，那这时候就是ErrorHandle上阵的时候了。 ErrorHanle致力于：统一捕捉和处理各种异常，可区分对待和返回；统一的出错体验。 非常类似做web开发时的500统一出错页面这样的东东。 3.3.2 示例 /** * @author chenzhen@xiaomi.com * 2010-12-1 */ package com.chen.controllers; import net.paoding.rose.web.ControllerErrorHandler; import net.paoding.rose.web.Invocation; public class ErrorHandler implements ControllerErrorHandler { public Object onError(Invocation inv, Throwable ex) throws Throwable { // TODO logger.error("handle err:", &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p><img src="http://img03.taobaocdn.com/bao/uploaded/i3/T1_9ahXlFfXXbwx8Z8_101515.jpg_210x210.jpg" alt="rose" /><br />
<strong><br />
3.3.1 ErrorHandler的作用</strong><br />
一般来说传统的编程都会到处去try，特别是java里，try来try去的（如果你用erlang一定就知道，已经知道的可能性，怎么能叫异常？都try了还是让它崩了算了。。。）。<br />
如果打开你的项目，每个java文件中的代码都有一堆的try，那这时候就是ErrorHandle上阵的时候了。<br />
ErrorHanle致力于：统一捕捉和处理各种异常，可区分对待和返回；统一的出错体验。<br />
非常类似做web开发时的500统一出错页面这样的东东。<br />
<strong>3.3.2 示例</strong></p>
<blockquote><p>/**<br />
 * @author chenzhen@xiaomi.com<br />
 * 2010-12-1<br />
 */</p>
<p>package com.chen.controllers;</p>
<p>import net.paoding.rose.web.ControllerErrorHandler;<br />
import net.paoding.rose.web.Invocation;</p>
<p>public class ErrorHandler implements ControllerErrorHandler {</p>
<p>    public Object onError(Invocation inv, Throwable ex) throws Throwable {</p>
<p>        // TODO logger.error("handle err:", ex);</p>
<p>        return "@error";<br />
    }<br />
}</p></blockquote>
<p>这是这么简单，不用怀疑！</p>
<p><strong>3.3.3 放在哪里才能生效？</strong><br />
放在controllers目录下，和controller们在一起（幸福快乐地生活）。<br />
一般来讲，ErrorHandler都是用在web项目里，在最快层起作用。<br />
所有的方法都可以尽情地向处throws Exception了。<br />
不需要再try了。</p>
<blockquote><p>@Path("")<br />
public class HelloController {<br />
    @Get("")<br />
    public String index2() throws Exception {<br />
        return "@hello world";<br />
    }<br />
}</p></blockquote>
<p><strong><br />
3.3.3 有用的例子: 不同的异常类型做不用的事情</strong></p>
<blockquote><p>/**<br />
 * @author chenzhen@xiaomi.com<br />
 * 2010-12-1<br />
 */</p>
<p>package com.chen.controllers;</p>
<p>import net.paoding.rose.web.ControllerErrorHandler;<br />
import net.paoding.rose.web.Invocation;</p>
<p>public class ErrorHandler implements ControllerErrorHandler {</p>
<p>    public Object onError(Invocation inv, Throwable ex) throws Throwable {</p>
<p>        // TODO logger.error("handle err:", ex);<br />
        if (ex instanceof RuntimeException) {<br />
            return "@runtime";<br />
        }<br />
        return "@error";<br />
    }<br />
}</p></blockquote>
<p>文中所提及代码均在 <a href="https://github.com/XiaoMi/rose/tree/master/rose-example">https://github.com/XiaoMi/rose/tree/master/rose-example</a> 提供。<br />
文档持续修改版本在 <a href="https://github.com/XiaoMi/rose/tree/master/chapter_3_3">https://github.com/XiaoMi/rose/tree/master/chapter_3_3</a>。</p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/-n9kaBLSPsAQ5h0enNNgO9oqrck/0/da"><img src="http://feedads.g.doubleclick.net/~a/-n9kaBLSPsAQ5h0enNNgO9oqrck/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-n9kaBLSPsAQ5h0enNNgO9oqrck/1/da"><img src="http://feedads.g.doubleclick.net/~a/-n9kaBLSPsAQ5h0enNNgO9oqrck/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/IJCzlC_koO0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/java-ee/rose-3-3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>54chen Twitter memo 2012-05-13</title>
		<link>http://www.54chen.com/life/54chen-twitter-memo-2012-05-13.html</link>
		<comments>http://www.54chen.com/life/54chen-twitter-memo-2012-05-13.html#comments</comments>
		<pubDate>Sat, 12 May 2012 17:09:00 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[生活备份]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.54chen.com/life/54chen-twitter-memo-2012-05-13.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>开这些年互联网开发最怕的事情：设立一个专门的QA团队，让研发团队通过不断的开关bug帮助QA团队理解产品需求和架构设计。 # 54chen Twitter memo 2012-05-06 http://t.co/5RcTU0GG #<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><ul class="aktt_tweet_digest">
开这些年互联网开发最怕的事情：设立一个专门的QA团队，让研发团队通过不断的开关bug帮助QA团队理解产品需求和架构设计。 <a href="http://twitter.com/54chen/statuses/200061631839993856" class="aktt_tweet_time">#</a><br />
54chen Twitter memo 2012-05-06 <a href="http://t.co/5RcTU0GG" rel="nofollow">http://t.co/5RcTU0GG</a> <a href="http://twitter.com/54chen/statuses/198949168809648128" class="aktt_tweet_time">#</a>
</ul>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/sRZnmQD1-hRmwwLti-S5Ws0NbvE/0/da"><img src="http://feedads.g.doubleclick.net/~a/sRZnmQD1-hRmwwLti-S5Ws0NbvE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/sRZnmQD1-hRmwwLti-S5Ws0NbvE/1/da"><img src="http://feedads.g.doubleclick.net/~a/sRZnmQD1-hRmwwLti-S5Ws0NbvE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/rAy6gBvT5s8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/life/54chen-twitter-memo-2012-05-13.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>54chen Twitter memo 2012-05-06</title>
		<link>http://www.54chen.com/life/54chen-twitter-memo-2012-05-06.html</link>
		<comments>http://www.54chen.com/life/54chen-twitter-memo-2012-05-06.html#comments</comments>
		<pubDate>Sat, 05 May 2012 17:09:00 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[生活备份]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.54chen.com/life/54chen-twitter-memo-2012-05-06.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>在小米面试技术，基础一定要好，数据结构算法啥的，最关键的，一定要有一技之长，或者叫做闪光点。没有闪光点的哥们，来了也会很郁闷，我们也会很郁闷。面试不通过的哥们，不是你技术太差，是被上一家公司磨洋工磨得太平。 # rose手册第三章二节：controller层：拦截器支持 http://t.co/qX4gW9qG # 今天五四，丢出来一份青春时期的代码，802.1x在gtk下的实现，大学校园局域网拔号你用过吧，https://t.co/OU6LpNPM 一晃已经过去七八年了，当时还没有git啊(readme写的时间大概是08年左右)，为了不侵犯人家公司权利，代码仅供学习呀作毕业设计呀啥的使用。 # NIH综合症是叫“不花钱自己搞癖好”好呢，还是叫“参考开源自己搞癖好”好呢？ # 今天是五四青年节，http://t.co/WPe8C5Cn ，五四陈科学院祝十四岁以上的青年们节日快乐！同时不要忘记下个月的今天。 # scala会越来越流行。 # 保持松散结构团队持续战斗力的秘密：每一个成员明确自己的目标，分清主次，日常解决重要不紧急的事情，形成良好的时间管理习惯，还有scrum。 # 快要败给这个官方读法了 http://t.co/wogMYjAg #<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><ul class="aktt_tweet_digest">
在小米面试技术，基础一定要好，数据结构算法啥的，最关键的，一定要有一技之长，或者叫做闪光点。没有闪光点的哥们，来了也会很郁闷，我们也会很郁闷。面试不通过的哥们，不是你技术太差，是被上一家公司磨洋工磨得太平。 <a href="http://twitter.com/54chen/statuses/198713933601841152" class="aktt_tweet_time">#</a><br />
rose手册第三章二节：controller层：拦截器支持 <a href="http://t.co/qX4gW9qG" rel="nofollow">http://t.co/qX4gW9qG</a> <a href="http://twitter.com/54chen/statuses/198423938366316545" class="aktt_tweet_time">#</a><br />
今天五四，丢出来一份青春时期的代码，802.1x在gtk下的实现，大学校园局域网拔号你用过吧，https://t.co/OU6LpNPM 一晃已经过去七八年了，当时还没有git啊(readme写的时间大概是08年左右)，为了不侵犯人家公司权利，代码仅供学习呀作毕业设计呀啥的使用。 <a href="http://twitter.com/54chen/statuses/198417402285920257" class="aktt_tweet_time">#</a><br />
NIH综合症是叫“不花钱自己搞癖好”好呢，还是叫“参考开源自己搞癖好”好呢？ <a href="http://twitter.com/54chen/statuses/198278507468570624" class="aktt_tweet_time">#</a><br />
今天是五四青年节，http://t.co/WPe8C5Cn ，五四陈科学院祝十四岁以上的青年们节日快乐！同时不要忘记下个月的今天。 <a href="http://twitter.com/54chen/statuses/198244810568634368" class="aktt_tweet_time">#</a><br />
scala会越来越流行。 <a href="http://twitter.com/54chen/statuses/197970381619998720" class="aktt_tweet_time">#</a><br />
保持松散结构团队持续战斗力的秘密：每一个成员明确自己的目标，分清主次，日常解决重要不紧急的事情，形成良好的时间管理习惯，还有scrum。 <a href="http://twitter.com/54chen/statuses/197566703687839744" class="aktt_tweet_time">#</a><br />
快要败给这个官方读法了 <a href="http://t.co/wogMYjAg" rel="nofollow">http://t.co/wogMYjAg</a> <a href="http://twitter.com/54chen/statuses/197548342207713280" class="aktt_tweet_time">#</a>
</ul>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/BXDbRyeh4WlR1olzvggiWUdAsXk/0/da"><img src="http://feedads.g.doubleclick.net/~a/BXDbRyeh4WlR1olzvggiWUdAsXk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/BXDbRyeh4WlR1olzvggiWUdAsXk/1/da"><img src="http://feedads.g.doubleclick.net/~a/BXDbRyeh4WlR1olzvggiWUdAsXk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/bpm5tmadDF0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/life/54chen-twitter-memo-2012-05-06.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rose手册第三章二节：controller层：拦截器支持</title>
		<link>http://www.54chen.com/java-ee/rose-3-2.html</link>
		<comments>http://www.54chen.com/java-ee/rose-3-2.html#comments</comments>
		<pubDate>Fri, 04 May 2012 14:10:36 +0000</pubDate>
		<dc:creator>54chen</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[rose]]></category>

		<guid isPermaLink="false">http://www.54chen.com/java-ee/rose-3-2.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>3.2.1 拦截器作用 面向切面编程（AOP）方法可以让一个项目更加关注核心逻辑，常见的一些最佳实践包括 权限 缓存 错误处理 延时加载 调试 持久化 资源池 等等。。。 而此处的拦截器目标是在controller层提供各种在controller执行前、执行后的代码切入，以达到各种可AOP的目标。 简单地说，拦截器能干的事情就是当你的项目写了一半时发现缺少啥全局要做的事情（比如需要验证权限），不用担心，搞一个拦截器就是了。 3.2.2 拦截器例子 public class AccessTrackInterceptor extends ControllerInterceptorAdapter { public AccessTrackInterceptor() { setPriority(29600); } @Override public Class<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p><img src="http://img03.taobaocdn.com/bao/uploaded/i3/T1_9ahXlFfXXbwx8Z8_101515.jpg_210x210.jpg" alt="rose" /><br />
<strong>3.2.1 拦截器作用</strong></p>
<p>    面向切面编程（AOP）方法可以让一个项目更加关注核心逻辑，常见的一些最佳实践包括<br />
        权限<br />
        缓存<br />
        错误处理<br />
        延时加载<br />
        调试<br />
        持久化<br />
        资源池<br />
        等等。。。<br />
    而此处的拦截器目标是在controller层提供各种在controller执行前、执行后的代码切入，以达到各种可AOP的目标。<br />
    简单地说，拦截器能干的事情就是当你的项目写了一半时发现缺少啥全局要做的事情（比如需要验证权限），不用担心，搞一个拦截器就是了。</p>
<p><strong>3.2.2 拦截器例子</strong></p>
<blockquote><p>public class AccessTrackInterceptor extends ControllerInterceptorAdapter {<br />
    public AccessTrackInterceptor() {<br />
    setPriority(29600);<br />
    }<br />
    @Override<br />
    public Class<? extends Annotation> getRequiredAnnotationClass() {<br />
        return PriCheckRequired.class; // 这是一个注解，只有标过的controller才会接受这个拦截器的洗礼。<br />
    }<br />
    @Override<br />
    public Object before(Invocation inv) throws Exception {<br />
        // TODO ....<br />
    return super.before(inv);<br />
    }</p>
<p>    @Override<br />
    public void afterCompletion(final Invocation inv, Throwable ex) throws Exception {<br />
    // TODO ....<br />
    }<br />
}
</p></blockquote>
<p><strong>需要注意几点：</strong></p>
<p>    拦截器要放在controllers下(高级用法:打在rose-jar包里，参见5.1)<br />
    继承net.paoding.rose.web.ControllerInterceptorAdapter<br />
    按照实现的方法名，在controller执行前、中、后执行：<br />
        before：在controller执行前执行。<br />
        after：在controller执行中（后）执行，如果一个返回抛出了异常，则不会进来。<br />
        afterCompletion：在controller执行后执行，不论是否异常，都会进来。<br />
        isForAction：定义满足某条件的才会被拦截。</p>
<p><strong>3.2.3 拦截器可动的位置细节</strong></p>
<p>    上面都讲得差不多了，实际上还有不少地方可以拦截的：<br />
        isForDispatcher：根据响应的情况判断是否拦截，比如说是正常请求、内部forward、还是include （但是没用过）<br />
        setPriority：设置一个数字表示拦截优先级，当有多个拦截器时，要精准控制，数字小的内层，大的在外层，在最外层的before方法最先执行，大家都执行完后它的after才最后执行。<br />
        round：这才是真正的controller执行中执行，不过用得很少。<br />
        getRequiredAnnotationClass：返回一个Annotation class name，表示这个拦截器只对此Annotation标过的controller才生效。常用。</p>
<p><strong>3.2.4 实际应用场景</strong></p>
<p>    全站是否登录判断相关的逻辑，写在一个拦截器里，一次完成后，其他地方不再关心这个代码，在需要登录才能做的controller上注解一下，表示需要被执行拦截。<br />
    日志收集的逻辑，在一个拦截器里进行当前的access log记录。<br />
    权限体系的逻辑，写在一个拦截器里，在对应的操作上作注解，拦截器中进行细节的判断，新加的api也只是需要一次注解就得到了权限的判断。</p>
<p>[文中所提代码均在 <a href="https://github.com/XiaoMi/rose/tree/master/rose-example">https://github.com/XiaoMi/rose/tree/master/rose-example</a>]<br />
常期更新版本在：<a href="https://github.com/XiaoMi/rose/tree/master/chapter_3_2">https://github.com/XiaoMi/rose/tree/master/chapter_3_2</a></p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/hMI2y_aJZ_OTlCstm3knSWQD8lU/0/da"><img src="http://feedads.g.doubleclick.net/~a/hMI2y_aJZ_OTlCstm3knSWQD8lU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hMI2y_aJZ_OTlCstm3knSWQD8lU/1/da"><img src="http://feedads.g.doubleclick.net/~a/hMI2y_aJZ_OTlCstm3knSWQD8lU/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/yGFHc6OmgGY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/java-ee/rose-3-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>54chen Twitter memo 2012-04-29</title>
		<link>http://www.54chen.com/life/54chen-twitter-memo-2012-04-29.html</link>
		<comments>http://www.54chen.com/life/54chen-twitter-memo-2012-04-29.html#comments</comments>
		<pubDate>Sat, 28 Apr 2012 17:09:00 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[生活备份]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.54chen.com/life/54chen-twitter-memo-2012-04-29.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>nginx准备支持spdy，不错哦，http://t.co/ylumpRSn # @sosofaraway 去哪了哥 # @shenzhenyu 要使用0.5.0的thrift包。 # @roadli 这个是假的活动 # @PiouseLeo 哈哈，还没，不过只差最后这道工序了 # @Fenng 哪尼？ # IT从业人员京城摇号买车攻略，哈哈，有空写一写。 # rose手册第三章一节：controller层：url对照规则与返回结果规则 http://t.co/OZmQzv5w # roser 第3.1节，https://t.co/jMa5Xa7h，由团队的@vaporz 完成此节，是不是和之前的风格有点不一样，很细很有爱。 #<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><ul class="aktt_tweet_digest">
nginx准备支持spdy，不错哦，http://t.co/ylumpRSn <a href="http://twitter.com/54chen/statuses/196062378117439488" class="aktt_tweet_time">#</a><br />
@<a href="http://twitter.com/sosofaraway" class="aktt_username">sosofaraway</a> 去哪了哥 <a href="http://twitter.com/54chen/statuses/195788513738891264" class="aktt_tweet_time">#</a><br />
@<a href="http://twitter.com/shenzhenyu" class="aktt_username">shenzhenyu</a> 要使用0.5.0的thrift包。 <a href="http://twitter.com/54chen/statuses/195780272950755328" class="aktt_tweet_time">#</a><br />
@<a href="http://twitter.com/roadli" class="aktt_username">roadli</a> 这个是假的活动 <a href="http://twitter.com/54chen/statuses/195780184803262464" class="aktt_tweet_time">#</a><br />
@<a href="http://twitter.com/PiouseLeo" class="aktt_username">PiouseLeo</a> 哈哈，还没，不过只差最后这道工序了 <a href="http://twitter.com/54chen/statuses/195779752198545408" class="aktt_tweet_time">#</a><br />
@<a href="http://twitter.com/Fenng" class="aktt_username">Fenng</a> 哪尼？ <a href="http://twitter.com/54chen/statuses/195777743995158528" class="aktt_tweet_time">#</a><br />
IT从业人员京城摇号买车攻略，哈哈，有空写一写。 <a href="http://twitter.com/54chen/statuses/195746592198901763" class="aktt_tweet_time">#</a><br />
rose手册第三章一节：controller层：url对照规则与返回结果规则 <a href="http://t.co/OZmQzv5w" rel="nofollow">http://t.co/OZmQzv5w</a> <a href="http://twitter.com/54chen/statuses/194647060354576384" class="aktt_tweet_time">#</a><br />
roser 第3.1节，https://t.co/jMa5Xa7h，由团队的@vaporz 完成此节，是不是和之前的风格有点不一样，很细很有爱。 <a href="http://twitter.com/54chen/statuses/194642782604902400" class="aktt_tweet_time">#</a>
</ul>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/j79PhvWtKCmHLuInALVWOWi_4MU/0/da"><img src="http://feedads.g.doubleclick.net/~a/j79PhvWtKCmHLuInALVWOWi_4MU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/j79PhvWtKCmHLuInALVWOWi_4MU/1/da"><img src="http://feedads.g.doubleclick.net/~a/j79PhvWtKCmHLuInALVWOWi_4MU/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/EvvgyQg_9dI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/life/54chen-twitter-memo-2012-04-29.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rose手册第三章一节：controller层：url对照规则与返回结果规则</title>
		<link>http://www.54chen.com/java-ee/rose-3-1.html</link>
		<comments>http://www.54chen.com/java-ee/rose-3-1.html#comments</comments>
		<pubDate>Tue, 24 Apr 2012 04:44:54 +0000</pubDate>
		<dc:creator>54chen</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[rose]]></category>

		<guid isPermaLink="false">http://www.54chen.com/java-ee/rose-3-1.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>3.1.1) url对照规则——最简单的例子 先看看怎样把url和某个方法对应起来。为了方便说明，现在我们来一起完成一个极简版的贴吧。 1)贴吧需要什么功能？ 贴吧中当然会有很多“主帖”（topic），“主帖”下会有很多“跟帖”（comment）。 一般，贴吧中最基本的，会有下面这几个功能需要我们完成： 显示主帖列表 显示单个主帖和它的跟贴 显示单个跟贴 创建一个主帖 创建一个跟贴 2)设计 web API 然后让我们来规划一个REST风格的 web API :（“GET”和“POST”是指HTTP1.1中的请求方法） 显示主帖列表 GET http://github.com/myforum/topic 显示单个主帖和它的跟贴 GET http://github.com/myforum/topic/123 显示单个跟贴 GET http://github.com/myforum/topic/123/comment/456 创建一个主帖 POST http://github.com/myforum/topic 创建一个跟贴 POST http://github.com/myforum/topic/123/comment 可以发现一个共同点，所有API中，URI部分的第一级都是“/myforum”（但这并不是规定，仅仅为了演示）。 3)实现 web API 首先新建一个类，这个类的类名必须以“Controller”结尾： @Path("myforum") public &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p><img src="http://img03.taobaocdn.com/bao/uploaded/i3/T1_9ahXlFfXXbwx8Z8_101515.jpg_210x210.jpg" alt="rose框架" /></p>
<p><strong>3.1.1) url对照规则——最简单的例子</strong></p>
<p>先看看怎样把url和某个方法对应起来。为了方便说明，现在我们来一起完成一个极简版的贴吧。<br />
1)贴吧需要什么功能？</p>
<p>贴吧中当然会有很多“主帖”（topic），“主帖”下会有很多“跟帖”（comment）。<br />
一般，贴吧中最基本的，会有下面这几个功能需要我们完成：</p>
<p>    显示主帖列表<br />
    显示单个主帖和它的跟贴<br />
    显示单个跟贴<br />
    创建一个主帖<br />
    创建一个跟贴</p>
<p>2)设计 web API</p>
<p>然后让我们来规划一个REST风格的 web API :（“GET”和“POST”是指HTTP1.1中的请求方法）</p>
<p>    显示主帖列表<br />
        GET http://github.com/myforum/topic<br />
    显示单个主帖和它的跟贴<br />
        GET http://github.com/myforum/topic/123<br />
    显示单个跟贴<br />
        GET http://github.com/myforum/topic/123/comment/456<br />
    创建一个主帖<br />
        POST http://github.com/myforum/topic<br />
    创建一个跟贴<br />
        POST http://github.com/myforum/topic/123/comment</p>
<p>可以发现一个共同点，所有API中，URI部分的第一级都是“/myforum”（但这并不是规定，仅仅为了演示）。<br />
3)实现 web API</p>
<p>首先新建一个类，这个类的类名必须以“Controller”结尾：</p>
<p>@Path("myforum")<br />
public class ForumController {<br />
}</p>
<p>注意标注在类(class)上的注解“@Path("myforum")”，这意味着，这个类中定义的所有API的URI，都必须以“myforum”开头，比如“/myforum/xxx”和“/myforum/yyy”等（但“myforum”不一定是整个URI的第一级，比如“/aaa/myforum/bbb”）。</p>
<p>接着，实现第一个API——“GET http://github.com/myforum/topic”：</p>
<p>@Path("myforum")<br />
public class ForumController {<br />
    @Get("topic")<br />
    public String getTopics() {<br />
        //显示主帖列表<br />
        return "topiclist";<br />
    }<br />
}</p>
<p>因为是“GET”方法，所以在该方法上标注“@Get("")”，URI“/myforum/topic”中的“myforum”已经在“@Path("myforum")”中定义过了，所以只剩下“topic”，于是写“@Get("topic")”。</p>
<p>再看第二个API——“GET http://github.com/myforum/topic/123”。<br />
跟前一个的唯一区别是，后面多了个“/123”，表示主帖id，而这个id当然不是固定的，只有用户点击链接发来请求时才能知道，肿么办？<br />
没关系，rose支持正则表达式！可以这么写：</p>
<p>@Get("topic/{topicId:[0-9]+}")<br />
public String showTopic(@Param("topicId") int topicId) {<br />
    //显示单个主帖和它的跟贴<br />
    return "topic";<br />
}</p>
<p>与前一个API相比，多了段“/{topicId:[0-9]+}”。正则表达式被大括号"{}"包围，格式为“{ paramName : regularExpression }”，只有请求的URI能被正则表达式匹配时，才会执行这个方法，而被匹配的值将被保存在名为“topicId”的参数中。</p>
<p>同理，实现第三个API，稍微复杂一点：</p>
<p>@Get("topic/{topicId:[0-9]+}/comment/{commentId:[0-9]+}")<br />
public String showComment(@Param("topicId") int topicId, @Param("commentId") int commentId) {<br />
    //显示单个跟贴<br />
    return "comment";<br />
}</p>
<p>最后两个API使用POST方法，其他与前面相同：</p>
<p>@Post("topic")<br />
public String createTopic(){<br />
    //创建一个主帖<br />
    return "topic";<br />
}<br />
@Post("topic/{topicId:[0-9]+}/comment")<br />
public String createComment(@Param("topicId") int topicId){<br />
    //创建一个跟贴<br />
    return "comment";<br />
}</p>
<p>完整的代码如下（省略了import语句）：</p>
<p>@Path("myforum")<br />
public class ForumController {</p>
<p>    @Get("topic")<br />
    public String getTopics() {<br />
        //显示主帖列表<br />
        return "topiclist";<br />
    }</p>
<p>    @Get("topic/{topicId:[0-9]+}")<br />
    public String showTopic(@Param("topicId") int topicId) {<br />
        //显示单个主帖和它的跟贴<br />
        return "topic";<br />
    }</p>
<p>    @Get("topic/{topicId:[0-9]+}/comment/{commentId:[0-9]+}")<br />
    public String showComment(@Param("topicId") int topicId, @Param("commentId") int commentId) {<br />
        //显示单个跟贴<br />
        return "comment";<br />
    }</p>
<p>    @Post("topic")<br />
    public String createTopic(){<br />
        //创建一个主帖<br />
        return "topic";<br />
    }</p>
<p>    @Post("topic/{topicId:[0-9]+}/comment")<br />
    public String createComment(@Param("topicId") int topicId){<br />
        //创建一个跟贴<br />
        return "comment";<br />
    }<br />
}</p>
<p>至此，一个贴吧功能的Controller就编写完成了。<br />
4) 更多细节</p>
<p>除了上面例子中的做法（@Path("")，@Get("")和@Post("")），还可以通过包路径来规划URI。</p>
<p>比如前面例子中的Controller，在API不变的前提下，还可以这么做：</p>
<p>1.在controllers路径下新建一个叫做“myforum”的文件夹。<br />
2.将ForumController从“xxx.controllers”移动到“xxx.controllers.myforum”<br />
并改成下面这样：</p>
<p>@Path("")<br />
public class ForumController {<br />
    @Get("topic")<br />
    public String getTopics() {<br />
        //显示主帖列表<br />
        return "topiclist";<br />
    }<br />
    ... ...<br />
}</p>
<p>只是将“@Path("myforum")”改成了“@Path("")”。这样做的好处是可以让项目中的代码组织清晰。<br />
3.1.2) 返回结果规则<br />
___NOT EOF___</p>
<p>author:vaporz </p>
<p>完整和长期修改版本在：<a href="https://github.com/XiaoMi/rose/tree/master/chapter_3_1">https://github.com/XiaoMi/rose/tree/master/chapter_3_1</a><br />
关于rose手册计划：<a href="https://github.com/XiaoMi/rose">https://github.com/XiaoMi/rose</a></p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/Ej8Yh7F0aywAozCkAo2F-S2khaU/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ej8Yh7F0aywAozCkAo2F-S2khaU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ej8Yh7F0aywAozCkAo2F-S2khaU/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ej8Yh7F0aywAozCkAo2F-S2khaU/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/w1cy05U4y3A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/java-ee/rose-3-1.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>54chen Twitter memo 2012-04-22</title>
		<link>http://www.54chen.com/life/54chen-twitter-memo-2012-04-22.html</link>
		<comments>http://www.54chen.com/life/54chen-twitter-memo-2012-04-22.html#comments</comments>
		<pubDate>Sat, 21 Apr 2012 17:09:00 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[生活备份]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.54chen.com/life/54chen-twitter-memo-2012-04-22.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>收集最佳实践：在SOA框架（非msgQ）固定的情况下，messageQueue的位置应该是同SOA框架还是应该在各个service内部？ # 54chen Twitter memo 2012-04-15 http://t.co/BwRRIR44 #<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><ul class="aktt_tweet_digest">
收集最佳实践：在SOA框架（非msgQ）固定的情况下，messageQueue的位置应该是同SOA框架还是应该在各个service内部？ <a href="http://twitter.com/54chen/statuses/192954708309188609" class="aktt_tweet_time">#</a><br />
54chen Twitter memo 2012-04-15 <a href="http://t.co/BwRRIR44" rel="nofollow">http://t.co/BwRRIR44</a> <a href="http://twitter.com/54chen/statuses/191339414893502464" class="aktt_tweet_time">#</a>
</ul>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>
<p><a href="http://feedads.g.doubleclick.net/~a/DVjfuJ-7z4Xvqcd2kOTn5Ge8P7I/0/da"><img src="http://feedads.g.doubleclick.net/~a/DVjfuJ-7z4Xvqcd2kOTn5Ge8P7I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/DVjfuJ-7z4Xvqcd2kOTn5Ge8P7I/1/da"><img src="http://feedads.g.doubleclick.net/~a/DVjfuJ-7z4Xvqcd2kOTn5Ge8P7I/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/-aboutJavaAndPhp/~4/mduaiLWv-Js" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/life/54chen-twitter-memo-2012-04-22.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 0.209 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-05-26 04:46:27 -->

