<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Your embarrassing, our passion!</title>
	<atom:link href="http://oyanglulu.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://oyanglulu.wordpress.com</link>
	<description>Confusing People</description>
	<lastBuildDate>Fri, 23 Apr 2010 15:20:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='oyanglulu.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/8f707d098346d7b101cac88296c9a226?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Your embarrassing, our passion!</title>
		<link>http://oyanglulu.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://oyanglulu.wordpress.com/osd.xml" title="Your embarrassing, our passion!" />
	<atom:link rel='hub' href='http://oyanglulu.wordpress.com/?pushpress=hub'/>
		<item>
		<title>oyanglulu的新blog suibian.sitemix.jp</title>
		<link>http://oyanglulu.wordpress.com/2010/04/23/oyanglulu%e7%9a%84%e6%96%b0blog-suibian-sitemix-jp/</link>
		<comments>http://oyanglulu.wordpress.com/2010/04/23/oyanglulu%e7%9a%84%e6%96%b0blog-suibian-sitemix-jp/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 14:57:41 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=59</guid>
		<description><![CDATA[因为被墙了 your embarrassing, our passion!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=59&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>因为被墙了</p>
<p><a title="Visit Site" href="http://suibian.sitemix.jp">your embarrassing, our passion!</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/59/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=59&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2010/04/23/oyanglulu%e7%9a%84%e6%96%b0blog-suibian-sitemix-jp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>辞职</title>
		<link>http://oyanglulu.wordpress.com/2009/05/02/%e8%be%9e%e8%81%8c/</link>
		<comments>http://oyanglulu.wordpress.com/2009/05/02/%e8%be%9e%e8%81%8c/#comments</comments>
		<pubDate>Sat, 02 May 2009 12:05:12 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[what am I doing]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=56</guid>
		<description><![CDATA[first time quited my job. so 爽! 其实没什么, 对于这一个无聊的工作一点也不可惜. 没意思&#8230;. 快两年了, 只会用一些肤浅的东西, 只能听懂简单的日语, 留着何用 考研, 没有退路, 只能考上了&#8230;..每天15个小时, 8个月, 4门课&#8230; 再考不上足以证明我是白痴<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=56&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>first time quited my job. so 爽!</p>
<p>其实没什么, 对于这一个无聊的工作一点也不可惜. 没意思&#8230;.</p>
<p>快两年了, 只会用一些肤浅的东西, 只能听懂简单的日语, 留着何用</p>
<p>考研, 没有退路, 只能考上了&#8230;..每天15个小时, 8个月, 4门课&#8230;</p>
<p>再考不上足以证明我是白痴</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/56/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=56&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/05/02/%e8%be%9e%e8%81%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>居然又好了</title>
		<link>http://oyanglulu.wordpress.com/2009/05/02/%e5%b1%85%e7%84%b6%e5%8f%88%e5%a5%bd%e4%ba%86/</link>
		<comments>http://oyanglulu.wordpress.com/2009/05/02/%e5%b1%85%e7%84%b6%e5%8f%88%e5%a5%bd%e4%ba%86/#comments</comments>
		<pubDate>Sat, 02 May 2009 11:54:36 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[what am I doing]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=53</guid>
		<description><![CDATA[xxx.wordpress.com被墙了几个星期, 今天上来试试居然又好了&#8230;.真不知道该说啥&#8230;..<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=53&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>xxx.wordpress.com被墙了几个星期, 今天上来试试居然又好了&#8230;.真不知道该说啥&#8230;..</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=53&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/05/02/%e5%b1%85%e7%84%b6%e5%8f%88%e5%a5%bd%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>JSF session的用法</title>
		<link>http://oyanglulu.wordpress.com/2009/04/21/jsf-session%e7%9a%84%e7%94%a8%e6%b3%95/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/21/jsf-session%e7%9a%84%e7%94%a8%e6%b3%95/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:54:31 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[JSF]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=50</guid>
		<description><![CDATA[1.写入session Object sessionName = &#8220;name&#8221;; Object sessionValue = &#8220;value&#8221;; HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true); session.setAttribute(sessionName,sessionValue); 2.获取session值 String getName = session.getAttribute(&#8220;name&#8221;).toString(); 3.清除session session.invalidate();<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=50&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>1.写入session<br />
Object sessionName = &#8220;name&#8221;;<br />
Object sessionValue = &#8220;value&#8221;;</p>
<p>HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);</p>
<p>session.setAttribute(sessionName,sessionValue);</p>
<p>2.获取session值</p>
<p>String getName = session.getAttribute(&#8220;name&#8221;).toString();</p>
<p>3.清除session</p>
<p>session.invalidate();</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=50&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/21/jsf-session%e7%9a%84%e7%94%a8%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>JSF获得表单提交值的方法</title>
		<link>http://oyanglulu.wordpress.com/2009/04/21/jsf%e8%8e%b7%e5%be%97%e8%a1%a8%e5%8d%95%e6%8f%90%e4%ba%a4%e5%80%bc%e7%9a%84%e6%96%b9%e6%b3%95/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/21/jsf%e8%8e%b7%e5%be%97%e8%a1%a8%e5%8d%95%e6%8f%90%e4%ba%a4%e5%80%bc%e7%9a%84%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:23:42 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[JSF form]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/2009/04/21/jsf%e8%8e%b7%e5%be%97%e8%a1%a8%e5%8d%95%e6%8f%90%e4%ba%a4%e5%80%bc%e7%9a%84%e6%96%b9%e6%b3%95/</guid>
		<description><![CDATA[第一种： 1.如在你的页面中有 注意要写在form中,并且要用name而不是id. FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( &#8220;classid &#8220;)可以得到。 2. FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( &#8220;f:classid &#8220;)可以得到。 3.使用JSF自带的控件，则和2是一样的访问方法 以上方法就可以了，写id的时候，jsf会把form的id加进去 变成 formId:componentId 的格式 第二种： 就是通过findComponent方法获得控件实例，然后通过getValue方法获得值 HtmlInputText text = (HtmlInputText) this.findComponent(this.FORM + &#8220;:&#8221;+ ENERGY_COMSUPTION_PREFIX + id); String value = text.getValue().toString(); public UIComponent findComponent(String name) { // 不能使用静态变量view保持当前的viewroot，因为每次操作之后的viewroot都是不一样的 ViewRoot view = FacesContext.getCurrentInstance().getViewRoot(); return view.findComponent(name); } 需要注意的是 不能使用静态变量view保持当前的viewroot，因为每次操作之后的viewroot都是不一样的。 对比以上两种方法，第一种简单方便，但只适合于取值操作。第二种可操控的范围和能力更大，不仅可以取值还可以设置和获得所有属性。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=49&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>第一种：</p>
<p>1.如在你的页面中有<br />
注意要写在form中,并且要用name而不是id.<br />
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( &#8220;classid &#8220;)可以得到。   </p>
<p>2.</p>
<p>FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( &#8220;f:classid &#8220;)可以得到。</p>
<p>3.使用JSF自带的控件，则和2是一样的访问方法</p>
<p>以上方法就可以了，写id的时候，jsf会把form的id加进去 变成 formId:componentId 的格式</p>
<p>第二种：</p>
<p>就是通过findComponent方法获得控件实例，然后通过getValue方法获得值<br />
HtmlInputText    text = (HtmlInputText) this.findComponent(this.FORM + &#8220;:&#8221;+ ENERGY_COMSUPTION_PREFIX + id);<br />
String value = text.getValue().toString();</p>
<p> public UIComponent findComponent(String name) {</p>
<p>  // 不能使用静态变量view保持当前的viewroot，因为每次操作之后的viewroot都是不一样的<br />
  ViewRoot view = FacesContext.getCurrentInstance().getViewRoot();</p>
<p>  return view.findComponent(name);<br />
 }</p>
<p>需要注意的是 不能使用静态变量view保持当前的viewroot，因为每次操作之后的viewroot都是不一样的。</p>
<p>对比以上两种方法，第一种简单方便，但只适合于取值操作。第二种可操控的范围和能力更大，不仅可以取值还可以设置和获得所有属性。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=49&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/21/jsf%e8%8e%b7%e5%be%97%e8%a1%a8%e5%8d%95%e6%8f%90%e4%ba%a4%e5%80%bc%e7%9a%84%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>Struts 2 + Spring 2 + JPA + AJAX</title>
		<link>http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 07:32:55 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Struts]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=27</guid>
		<description><![CDATA[搭建 Struts2 + Spring2 + JPA + Ajax 框架 这里用 hibernate 作为 JPA(java persistent API), dojo的 Ajax 标签. Prerequisites 首先得先下个IDE 和 Application Server 和 database Eclipse Ganymede for JEE Tomcat6 MySQL Server 开发环境准备好以后我们来建工程 MySql 先建数据库和表&#8230;&#8230;.. Code 源代码到 GoogleCode 的 这里 目录下的 /struts2_spring_hibernate/quickStart 下到, 可以先下下来看看, 或者直接按下面的自己从头做 Just Do It 用eclipse 建立工程 选择 动态web 选tomcat 6 , [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=27&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>搭建 Struts2 + Spring2 + JPA + Ajax 框架</p>
<p>这里用 hibernate 作为 JPA(java persistent API), dojo的 Ajax 标签.</p>
<h2>Prerequisites</h2>
<p>首先得先下个IDE 和 Application Server 和 database</p>
<ul>
<li><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR2/eclipse-jee-ganymede-SR2-win32.zip">Eclipse Ganymede for JEE</a></li>
<li><a href="http://tomcat.apache.org/download-60.cgi">Tomcat6</a></li>
<li><a rel="nofollow" href="http://dev.mysql.com/downloads/mysql/5.0.html">MySQL Server</a><img src="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-6.png" alt="" /><img src="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-4.png" alt="" /><img src="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-5.png" alt="" /></li>
</ul>
<p>开发环境准备好以后我们来建工程</p>
<h2>MySql</h2>
<p>先建<img src="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-1.png" alt="" />数据库和表&#8230;&#8230;..</p>
<p><a rel="attachment wp-att-28" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/mysql/"><img class="alignnone size-full wp-image-28" title="mysql" src="http://oyanglulu.files.wordpress.com/2009/04/mysql.jpg?w=615&#038;h=462" alt="mysql" width="615" height="462" /></a></p>
<h2>Code</h2>
<p>源代码到 GoogleCode 的 <a href="http://code.google.com/p/dotnetregularexpression/source/checkout">这里</a> 目录下的 /struts2_spring_hibernate/quickStart 下到, 可以先下下来看看, 或者直接按下面的自己从头做</p>
<h2>Just Do It</h2>
<p>用eclipse 建立工程</p>
<p><a rel="attachment wp-att-30" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0000/"><img class="alignnone size-full wp-image-30" title="snag-0000" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0000.jpg?w=450&#038;h=450" alt="snag-0000" width="450" height="450" /></a></p>
<p>选择 动态web</p>
<p><a rel="attachment wp-att-31" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0001/"><img class="alignnone size-full wp-image-31" title="snag-0001" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0001.jpg?w=450&#038;h=507" alt="snag-0001" width="450" height="507" /></a></p>
<p>选tomcat 6 , project 命名 为 quickstart</p>
<p><a rel="attachment wp-att-34" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0003/"><img class="alignnone size-full wp-image-34" title="snag-0003" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0003.jpg?w=326&#038;h=384" alt="snag-0003" width="326" height="384" /></a></p>
<p>于是得到上图目录, 在 lib里加上所有需要的 jar 包</p>
<p>这些 jar 包然人的很&#8230;.动不动缺这动不动缺那, 如果出现莫名奇妙的错误说那个 class not found 的话,</p>
<p>可以把找不到的 class 贴到 <a title="find jar" href="http://www.findjar.com/">这里</a> 找缺少的是哪个包.</p>
<ul>
<li>到 <a title="Visit page outside Confluence" rel="nofollow" href="http://struts.apache.org/">Struts 2</a> 下 2.1.6 版本</li>
<li>到 <a title="Visit page outside Confluence" rel="nofollow" href="http://www.mysql.com/products/connector/">MySql JDBC Driver</a> 下 mysql 的 驱动</li>
<li>到 <a title="Visit page outside Confluence" rel="nofollow" href="http://springframework.org/">Spring 2 </a>下 spring2.5.6</li>
<li>到 <a title="Visit page outside Confluence" rel="nofollow" href="http://hibernate.org/">Hibernate</a> 下 Hibernate Core, Hibernate Annotations, Hibernate Entity Manager</li>
<li>下 <a href="http://logging.apache.org/log4j/">log4j</a></li>
</ul>
<p>把这些下下来的 jar 包都考到上图的 lib 目录下</p>
<p>起码我的 lib 里面 有这些文件</p>
<blockquote><p>antlr-2.7.6.jar<br />
commons-collections-3.1.jar<br />
commons-fileupload-1.2.1.jar<br />
commons-io-1.3.2.jar<br />
commons-logging-1.1.jar<br />
dom4j-1.6.1.jar<br />
ehcache-1.2.3.jar<br />
ejb3-persistence.jar<br />
freemarker-2.3.13.jar<br />
hibernate3.jar<br />
hibernate-annotations.jar<br />
hibernate-cglib-repack-2.1_3.jar<br />
hibernate-commons-annotations.jar<br />
hibernate-entitymanager.jar<br />
javassist-3.4.GA.jar<br />
json-lib-2.1.jar<br />
jta-1.1.jar<br />
junit-3.8.1.jar<br />
log4j-1.2.15.jar<br />
mysql-connector-java-5.0.8-bin.jar<br />
ognl-2.6.11.jar<br />
slf4j-api-1.5.6.jar<br />
slf4j-log4j12-1.5.6.jar<br />
slf4j-simple-1.5.6.jar<br />
spring.jar<br />
spring-aop.jar<br />
spring-beans.jar<br />
spring-context.jar<br />
spring-context-support.jar<br />
spring-core.jar<br />
spring-jdbc.jar<br />
spring-jms.jar<br />
spring-orm.jar<br />
spring-test.jar<br />
spring-test-2.5.6.jar<br />
spring-tx.jar<br />
spring-web.jar<br />
spring-webmvc.jar<br />
spring-webmvc-portlet.jar<br />
spring-webmvc-struts.jar<br />
struts2-core-2.1.6.jar<br />
<span style="color:#ff0000;">struts2-dojo-plugin-2.1.6.jar</span><br />
struts2-spring-plugin-2.1.6.jar<br />
xwork-2.1.2.jar</p></blockquote>
<p>注意 <span style="color:#ff0000;">struts2-dojo-plugin-2.1.6.jar <span style="color:#000000;">一定要考进来,  Struts 2.1 把 <a href="http://www.dojotoolkit.org/">dojo</a> 标签给剔除了, 我配的时候可玩死我了. Struts 2.0 是整合的.</span></span></p>
<p><span style="color:#ff0000;"><span style="color:#000000;">具体 看 <a href="http://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html">这里</a> struts2.0 到 struts2.1 的变化</span></span></p>
<h2>Model</h2>
<p>model 很简单, 就单单一个 bean, 一个表</p>
<blockquote>
<pre class="code-java"><span style="color:#0000ff;">package</span><span style="color:#000000;"> quickstart.model;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> javax.persistence.Entity;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> javax.persistence.GeneratedValue;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> javax.persistence.Id;

@Entity
</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> Person {
    @Id
    @GeneratedValue
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> Integer id;
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> String lastName;
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> String firstName;

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> String getFirstName() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> firstName;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setFirstName(String firstName) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.firstName </span><span style="color:#000000;">=</span><span style="color:#000000;"> firstName;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> String getLastName() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> lastName;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setLastName(String lastName) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.lastName </span><span style="color:#000000;">=</span><span style="color:#000000;"> lastName;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Integer getId() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> id;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setId(Integer id) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.id </span><span style="color:#000000;">=</span><span style="color:#000000;"> id;
    }
}</span></pre>
</blockquote>
<p>一个Person表, 属性有 id, lastName, firstName 其中 id 为 key</p>
<p>我们用到了 @Entity , 用这个 annotations 声明了这个class可以被持久化(persisted)</p>
<p>@Id 声明 id 是key</p>
<p>@GeneratedValue : hibernate 会生成属性 Value</p>
<h2>DAO</h2>
<p>一个 Dao 的接口</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">package</span><span style="color:#000000;"> quickstart.service;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> java.util.List;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> quickstart.model.Person;

</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">interface</span><span style="color:#000000;"> PersonService {
    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Person</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> findAll();

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> save(Person person);

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> remove(</span><span style="color:#0000ff;">int</span><span style="color:#000000;"> id);

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Person find(</span><span style="color:#0000ff;">int</span><span style="color:#000000;"> id);
}</span></pre>
</blockquote>
<p>实现</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">package</span><span style="color:#000000;"> quickstart.service;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> java.util.List;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> javax.persistence.EntityManager;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> javax.persistence.PersistenceContext;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> javax.persistence.Query;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.springframework.transaction.annotation.Transactional;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> quickstart.model.Person;

@Transactional
</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> PersonServiceImpl </span><span style="color:#0000ff;">implements</span><span style="color:#000000;"> PersonService {
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> EntityManager em;

    @PersistenceContext
    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setEntityManager(EntityManager em) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.em </span><span style="color:#000000;">=</span><span style="color:#000000;"> em;
    }

    @SuppressWarnings(</span><span style="color:#000000;">"</span><span style="color:#000000;">unchecked</span><span style="color:#000000;">"</span><span style="color:#000000;">)
    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Person</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> findAll() {
        Query query </span><span style="color:#000000;">=</span><span style="color:#000000;"> getEntityManager().createQuery(</span><span style="color:#000000;">"</span><span style="color:#000000;">select p FROM Person p</span><span style="color:#000000;">"</span><span style="color:#000000;">);
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> query.getResultList();
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> save(Person person) {
        </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (person.getId() </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000ff;">null</span><span style="color:#000000;">) {
            </span><span style="color:#008000;">//</span><span style="color:#008000;"> new</span><span style="color:#008000;">
</span><span style="color:#000000;">            em.persist(person);
        } </span><span style="color:#0000ff;">else</span><span style="color:#000000;"> {
            </span><span style="color:#008000;">//</span><span style="color:#008000;"> update</span><span style="color:#008000;">
</span><span style="color:#000000;">            em.merge(person);
        }
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> remove(</span><span style="color:#0000ff;">int</span><span style="color:#000000;"> id) {
        Person person </span><span style="color:#000000;">=</span><span style="color:#000000;"> find(id);
        </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (person </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000ff;">null</span><span style="color:#000000;">) {
            em.remove(person);
        }
    }

    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> EntityManager getEntityManager() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> em;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Person find(</span><span style="color:#0000ff;">int</span><span style="color:#000000;"> id) {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> em.find(Person.</span><span style="color:#0000ff;">class</span><span style="color:#000000;">, id);
    }

}</span></pre>
</blockquote>
<p>Spring 见到 @PersistenceContex 的注释会 注入 EntityManager 到这个实例.</p>
<p>而 @Transactional 的声明, Spring 会让这些方法都运行在一个 transaction 中.</p>
<p>配置 web.xml</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">&lt;?</span><span style="color:#ff00ff;">xml version="1.0" encoding="UTF-8"</span><span style="color:#0000ff;">?&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">web-app </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="person"</span><span style="color:#ff0000;"> version</span><span style="color:#0000ff;">="2.4"</span><span style="color:#ff0000;"> xmlns</span><span style="color:#0000ff;">="http://java.sun.com/xml/ns/j2ee"</span><span style="color:#ff0000;">
    xmlns:xsi</span><span style="color:#0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color:#ff0000;">
    xsi:schemaLocation</span><span style="color:#0000ff;">="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">display-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">person</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">display-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#008000;">&lt;!--</span><span style="color:#008000;"> Include this if you are using Hibernate </span><span style="color:#008000;">--&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Spring OpenEntityManagerInViewFilter</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-class</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-class</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-mapping</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Spring OpenEntityManagerInViewFilter</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">url-pattern</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">/*</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">url-pattern</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-mapping</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">struts2</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-class</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            org.apache.struts2.dispatcher.FilterDispatcher
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-class</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-mapping</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">struts2</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-name</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">url-pattern</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">/*</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">url-pattern</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">filter-mapping</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">welcome-file-list</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">welcome-file</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">index.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">welcome-file</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">welcome-file-list</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">listener</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">listener-class</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            org.springframework.web.context.ContextLoaderListener
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">listener-class</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">listener</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">web-app</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span></pre>
</blockquote>
<p>所有 requests 将被 redirect 到 Struts 的 &#8220;FilterDispatcher&#8221; class, Spring&#8217;s &#8220;ContextLoaderListener&#8221; 监听</p>
<p>配置 Spring</p>
<p>在WEB-INF 地下 建立 applicationContext.xml 来配置 Sping</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">&lt;?</span><span style="color:#ff00ff;">xml version="1.0" encoding="UTF-8"</span><span style="color:#0000ff;">?&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">beans </span><span style="color:#ff0000;">xmlns</span><span style="color:#0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color:#ff0000;">
    xmlns:xsi</span><span style="color:#0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color:#ff0000;">
    xmlns:aop</span><span style="color:#0000ff;">="http://www.springframework.org/schema/aop"</span><span style="color:#ff0000;">
    xmlns:tx</span><span style="color:#0000ff;">="http://www.springframework.org/schema/tx"</span><span style="color:#ff0000;">
    xsi:schemaLocation</span><span style="color:#0000ff;">="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean
        </span><span style="color:#ff0000;">class</span><span style="color:#0000ff;">="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="personService"</span><span style="color:#ff0000;"> class</span><span style="color:#0000ff;">="quickstart.service.PersonServiceImpl"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="entityManagerFactory"</span><span style="color:#ff0000;">
        class</span><span style="color:#0000ff;">="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="dataSource"</span><span style="color:#ff0000;"> ref</span><span style="color:#0000ff;">="dataSource"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="jpaVendorAdapter"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean
                </span><span style="color:#ff0000;">class</span><span style="color:#0000ff;">="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="database"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="MYSQL"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="showSql"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="true"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">property</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="dataSource"</span><span style="color:#ff0000;">
        class</span><span style="color:#0000ff;">="org.springframework.jdbc.datasource.DriverManagerDataSource"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="driverClassName"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="com.mysql.jdbc.Driver"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="url"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="jdbc:mysql://localhost/quickstart"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="username"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="root"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="password"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="root"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="transactionManager"</span><span style="color:#ff0000;">
        class</span><span style="color:#0000ff;">="org.springframework.orm.jpa.JpaTransactionManager"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="entityManagerFactory"</span><span style="color:#ff0000;"> ref</span><span style="color:#0000ff;">="entityManagerFactory"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tx:annotation-driven </span><span style="color:#ff0000;">transaction-manager</span><span style="color:#0000ff;">="transactionManager"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="personAction"</span><span style="color:#ff0000;"> scope</span><span style="color:#0000ff;">="prototype"</span><span style="color:#ff0000;">
        class</span><span style="color:#0000ff;">="quickstart.action.PersonAction"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">constructor-arg </span><span style="color:#ff0000;">ref</span><span style="color:#0000ff;">="personService"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">beans</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span></pre>
</blockquote>
<p>注意 Spring 的依赖注入(Dependency Inject, 以后简称 DI), &#8220;personAction&#8221; bean 构造函数的参数设置为  &#8220;personService&#8221; bean, 为什么这样传我们后面介绍</p>
<p>而 scope 属性是 Spring2 新加的,  设成 &#8220;prototype&#8221; 表示每次请求实例化一个新的 Action.</p>
<p>&#8220;dataSource&#8221; bean 连接数据库</p>
<p>配置 Struts</p>
<p>首先新建一个 Action, Struts2 已经把 ActionBean和 Action 整合到了一起.</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">package</span><span style="color:#000000;"> quickstart.action;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> java.util.List;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> quickstart.model.Person;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> quickstart.service.PersonService;

</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> com.opensymphony.xwork2.Action;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> com.opensymphony.xwork2.Preparable;

</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> PersonAction </span><span style="color:#0000ff;">implements</span><span style="color:#000000;"> Preparable {
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> PersonService service;
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Person</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> persons;
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> Person person;
    </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> Integer id;

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> PersonAction(PersonService service) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.service </span><span style="color:#000000;">=</span><span style="color:#000000;"> service;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> String execute() {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.persons </span><span style="color:#000000;">=</span><span style="color:#000000;"> service.findAll();
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> Action.SUCCESS;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> String save() {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.service.save(person);
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.person </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000ff;">new</span><span style="color:#000000;"> Person();
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> execute();
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> String remove() {
        service.remove(id);
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> execute();
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Person</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> getPersons() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> persons;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Integer getId() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> id;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setId(Integer id) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.id </span><span style="color:#000000;">=</span><span style="color:#000000;"> id;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> prepare() </span><span style="color:#0000ff;">throws</span><span style="color:#000000;"> Exception {
        </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (id </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000ff;">null</span><span style="color:#000000;">)
            person </span><span style="color:#000000;">=</span><span style="color:#000000;"> service.find(id);
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Person getPerson() {
        </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> person;
    }

    </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setPerson(Person person) {
        </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.person </span><span style="color:#000000;">=</span><span style="color:#000000;"> person;
    }
}</span></pre>
</blockquote>
<p>这就是一个简单的 <a title="pojo" href="http://en.wikipedia.org/wiki/Plain">POJO</a> (Plain Old Java Object) 了, 也就是一个简单的bean, 没有Entity.</p>
<p>构造函数的参数 service 就是由 Spring 配过来的了.</p>
<p>然后来配置跳转, 这里 struts-config.xml 应该是扔到 src 目录下, 与 Struts1不一样.</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">&lt;?</span><span style="color:#ff00ff;">xml version="1.0" encoding="UTF-8" </span><span style="color:#0000ff;">?&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;!</span><span style="color:#ff00ff;">DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">struts</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">constant </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="struts.objectFactory"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="spring"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">package </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="person"</span><span style="color:#ff0000;"> extends</span><span style="color:#0000ff;">="struts-default"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">action </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="list"</span><span style="color:#ff0000;"> method</span><span style="color:#0000ff;">="execute"</span><span style="color:#ff0000;"> class</span><span style="color:#0000ff;">="personAction"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">pages/list.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">result </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="input"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">pages/list.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">action</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">action </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="remove"</span><span style="color:#ff0000;"> class</span><span style="color:#0000ff;">="personAction"</span><span style="color:#ff0000;"> method</span><span style="color:#0000ff;">="remove"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">pages/list.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">result </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="input"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">pages/list.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">action</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">action </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="save"</span><span style="color:#ff0000;"> class</span><span style="color:#0000ff;">="personAction"</span><span style="color:#ff0000;"> method</span><span style="color:#0000ff;">="save"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">pages/list.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">result </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="input"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">pages/list.jsp</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">result</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">action</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">package</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">struts</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span></pre>
</blockquote>
<p>其中 &#8220;struts.objectFactory&#8221; 的配置很重要, 他让 Spring 来为他构造 Object, 这里面的 class=的 就是刚刚 Spring 配好的 bean 了.</p>
<h2>Pages</h2>
<p>下面该做页面了, 首先是一个 输出 页面</p>
<p>注意, Struts2.1 没有整合 dojo 的标签, 所以这里还必须另外用 dojo 的标签. 另外, Struts2.0 是整合 dojo 标签的, 具体看 <a href="http://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html">这里</a></p>
<blockquote>
<pre style="background-color:white;"><span style="background-color:#ffff00;color:#000000;">&lt;%</span><span style="background-color:#f5f5f5;color:#000000;">@ taglib prefix</span><span style="background-color:#f5f5f5;color:#000000;">=</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#f5f5f5;color:#800000;">s</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#f5f5f5;color:#000000;"> uri</span><span style="background-color:#f5f5f5;color:#000000;">=</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#f5f5f5;color:#800000;">/struts-tags</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#ffff00;color:#000000;">%&gt;</span><span style="color:#000000;">
</span><span style="background-color:#ffff00;color:#000000;">&lt;%</span><span style="background-color:#f5f5f5;color:#000000;">@ taglib prefix</span><span style="background-color:#f5f5f5;color:#000000;">=</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#f5f5f5;color:#800000;">s</span><span style="background-color:#f5f5f5;color:#800000;">x"</span><span style="background-color:#f5f5f5;color:#000000;"> uri</span><span style="background-color:#f5f5f5;color:#000000;">=</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#f5f5f5;color:#800000;">/struts-dojo-tags</span><span style="background-color:#f5f5f5;color:#800000;">"</span><span style="background-color:#ffff00;color:#000000;">%&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">p</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Persons</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">p</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:if </span><span style="color:#ff0000;">test</span><span style="color:#0000ff;">="persons.size &gt; 0"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">table</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:iterator </span><span style="color:#ff0000;">value</span><span style="color:#0000ff;">="persons"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="row_&lt;s:property value="</span><span style="color:#ff0000;">id"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">"&gt;
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:property </span><span style="color:#ff0000;">value</span><span style="color:#0000ff;">="firstName"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:property </span><span style="color:#ff0000;">value</span><span style="color:#0000ff;">="lastName"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:url </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="removeUrl"</span><span style="color:#ff0000;"> action</span><span style="color:#0000ff;">="remove"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:param </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="id"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="id"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">s:url</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sx:a </span><span style="color:#ff0000;">href</span><span style="color:#0000ff;">="%{#removeUrl}"</span><span style="color:#ff0000;">targets</span><span style="color:#0000ff;">="persons"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Remove</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">sx:a</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sx:a </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="a_%{#id}"</span><span style="color:#ff0000;"> </span><span style="color:#ff0000;">notifyTopics</span><span style="color:#0000ff;">="/edit"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Edit</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">sx:a</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">s:iterator</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">table</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">s:if</span><span style="color:#0000ff;">&gt;
</span></pre>
</blockquote>
<p>每行数据 一个姓一个名, 一个 remove 链接, 一个 Edit 链接</p>
<pre style="background-color:white;"><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">%@ taglib </span><span style="color:#ff0000;">prefix</span><span style="color:#0000ff;">="s"</span><span style="color:#ff0000;"> uri</span><span style="color:#0000ff;">="/struts-tags"</span><span style="color:#ff0000;">%</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">%@ taglib </span><span style="color:#ff0000;">prefix</span><span style="color:#0000ff;">="sx"</span><span style="color:#ff0000;"> uri</span><span style="color:#0000ff;">="/struts-dojo-tags"</span><span style="color:#ff0000;"> %</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">html</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">head</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sx:head </span><span style="color:#ff0000;">parseContent</span><span style="color:#0000ff;">="true"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">script </span><span style="color:#ff0000;">type</span><span style="color:#0000ff;">="text/javascript"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            dojo.event.topic.subscribe("/save", function(data, type, request) {
                if(type == "load") {
                    dojo.byId("id").value = "";
                    dojo.byId("firstName").value = "";
                    dojo.byId("lastName").value = "";
                }
            });

            dojo.event.topic.subscribe("/edit", function(data, type, request) {
                if(type == "before") {
                    var id = data.split("_")[1];

                    var tr = dojo.byId("row_"+id);
                    var tds = tr.getElementsByTagName("td");

                    dojo.byId("id").value = id;
                    dojo.byId("firstName").value = dojo.string.trim(dojo.dom.textContent(tds[0]));
                    dojo.byId("lastName").value = dojo.string.trim(dojo.dom.textContent(tds[1]));
                }
            });
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">script</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">head</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">body</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:url </span><span style="color:#ff0000;">action</span><span style="color:#0000ff;">="list"</span><span style="color:#ff0000;"> id</span><span style="color:#0000ff;">="descrsUrl"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div </span><span style="color:#ff0000;">style</span><span style="color:#0000ff;">="width: 300px;border-style: solid"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div </span><span style="color:#ff0000;">style</span><span style="color:#0000ff;">="text-align: right;"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sx:a </span><span style="color:#ff0000;">notifyTopics</span><span style="color:#0000ff;">="/refresh"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Refresh</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">sx:a</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sx:div </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="persons"</span><span style="color:#ff0000;">  href</span><span style="color:#0000ff;">="%{#descrsUrl}"</span><span style="color:#ff0000;"> loadingText</span><span style="color:#0000ff;">="Loading..."</span><span style="color:#ff0000;"> listenTopics</span><span style="color:#0000ff;">="/refresh"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">br</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div </span><span style="color:#ff0000;">style</span><span style="color:#0000ff;">="width: 300px;border-style: solid"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">p</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Person Data</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">p</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:form </span><span style="color:#ff0000;">action</span><span style="color:#0000ff;">="save"</span><span style="color:#ff0000;"> validate</span><span style="color:#0000ff;">="true"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:textfield </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="id"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="person.id"</span><span style="color:#ff0000;"> cssStyle</span><span style="color:#0000ff;">="display:none"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:textfield </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="firstName"</span><span style="color:#ff0000;"> label</span><span style="color:#0000ff;">="Fisrt Name"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="person.firstName"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">s:textfield </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="lastName"</span><span style="color:#ff0000;"> label</span><span style="color:#0000ff;">="Last Name"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="person.lastName"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sx:submit </span><span style="color:#ff0000;">targets</span><span style="color:#0000ff;">="persons"</span><span style="color:#ff0000;"> notifyTopics</span><span style="color:#0000ff;">="/save"</span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">s:form</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">body</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">html</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span></pre>
<p>这是 index.jsp 填入 firstName 和 lastName 点 submit 保存</p>
<h2>Run</h2>
<p>现在我们来跑一下程序</p>
<p>把application server 配好</p>
<p><a rel="attachment wp-att-40" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0005/"><img class="alignnone size-full wp-image-40" title="snag-0005" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0005.jpg?w=858&#038;h=618" alt="snag-0005" width="858" height="618" /></a></p>
<p><a rel="attachment wp-att-41" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0007/"><img class="alignnone size-full wp-image-41" title="snag-0007" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0007.jpg?w=450&#038;h=500" alt="snag-0007" width="450" height="500" /></a></p>
<p>这里用的是tomcat6, 如果你用的服务器这里没有, 可以点 右上角的 &#8220;Download additional server adapter&#8221;</p>
<p>比如说 glassfish, 或者websphere communication edition</p>
<p><a rel="attachment wp-att-42" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0010/"><img class="alignnone size-full wp-image-42" title="snag-0010" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0010.jpg?w=438&#038;h=497" alt="snag-0010" width="438" height="497" /></a></p>
<p>发布工程</p>
<p><a rel="attachment wp-att-43" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0011/"><img class="alignnone size-full wp-image-43" title="snag-0011" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0011.jpg?w=450&#038;h=389" alt="snag-0011" width="450" height="389" /></a></p>
<p><a rel="attachment wp-att-44" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0013/"><img class="alignnone size-full wp-image-44" title="snag-0013" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0013.jpg?w=450&#038;h=445" alt="snag-0013" width="450" height="445" /></a></p>
<p>底下的勾勾勾上, 可以及时发布.</p>
<p>启动服务器, 有 debug 和 run 模式</p>
<p><a rel="attachment wp-att-45" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0014/"><img class="alignnone size-full wp-image-45" title="snag-0014" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0014.jpg?w=560&#038;h=107" alt="snag-0014" width="560" height="107" /></a></p>
<p>访问 http://localhost:8080/quickstart/</p>
<p>就可以看见页面了</p>
<p><a rel="attachment wp-att-46" href="http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/snag-0015/"><img class="alignnone size-full wp-image-46" title="snag-0015" src="http://oyanglulu.files.wordpress.com/2009/04/snag-0015.jpg?w=337&#038;h=354" alt="snag-0015" width="337" height="354" /></a></p>
<h2>Reference</h2>
<p><a href="http://struts.apache.org/2.1.2/docs/struts-2-spring-2-jpa-ajax.html">Struts 2 + Spring 2 + JPA + AJAX</a></p>
<p><a href="http://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html">Troubleshooting guide migrating from Struts 2.0.x to 2.1.x</a></p>
<p><img src="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot.png" alt="" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=27&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/10/struts-2-spring-2-jpa-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>

		<media:content url="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-6.png" medium="image" />

		<media:content url="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-4.png" medium="image" />

		<media:content url="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-5.png" medium="image" />

		<media:content url="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot-1.png" medium="image" />

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/mysql.jpg" medium="image">
			<media:title type="html">mysql</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0000.jpg" medium="image">
			<media:title type="html">snag-0000</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0001.jpg" medium="image">
			<media:title type="html">snag-0001</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0003.jpg" medium="image">
			<media:title type="html">snag-0003</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0005.jpg" medium="image">
			<media:title type="html">snag-0005</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0007.jpg" medium="image">
			<media:title type="html">snag-0007</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0010.jpg" medium="image">
			<media:title type="html">snag-0010</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0011.jpg" medium="image">
			<media:title type="html">snag-0011</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0013.jpg" medium="image">
			<media:title type="html">snag-0013</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0014.jpg" medium="image">
			<media:title type="html">snag-0014</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/snag-0015.jpg" medium="image">
			<media:title type="html">snag-0015</media:title>
		</media:content>

		<media:content url="/DOCUME%7E1/oyjc/LOCALS%7E1/Temp/moz-screenshot.png" medium="image" />
	</item>
		<item>
		<title>Spring Framework QuickStart 1(Spring 快速入门)</title>
		<link>http://oyanglulu.wordpress.com/2009/04/09/spring-framework-quickstart-1spring-%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/09/spring-framework-quickstart-1spring-%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 16:16:27 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[dependency inject]]></category>
		<category><![CDATA[DI]]></category>
		<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=17</guid>
		<description><![CDATA[1 Hello Word Spring 当然要从他最出名的 依赖注入(Dependency injection) 讲起了, 但是现在先举个 Hello World 的例子 public interface GreetingService { void sayGreeting(); } 先建一个bean的接口 public class GreetingServiceImpl implements GreetingService { private String greeting; public GreetingServiceImpl() {} public GreetingServiceImpl(String greeting) { this.greeting = greeting; } public void sayGreeting() { System.out.println(greeting); } public void setGreeting(String greeting) { this.greeting = greeting; } [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=17&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>1 Hello Word</h2>
<p>Spring 当然要从他最出名的 依赖注入(<a href="http://en.wikipedia.org/wiki/Dependency_Injection">Dependency injection</a>) 讲起了, 但是现在先举个 Hello World 的例子</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">interface</span><span style="color:#000000;"> GreetingService {
</span><span style="color:#0000ff;">void</span><span style="color:#000000;"> sayGreeting();
}</span></pre>
</blockquote>
<p style="text-align:left;">先建一个bean的接口</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> GreetingServiceImpl </span><span style="color:#0000ff;">implements</span><span style="color:#000000;"> GreetingService {
  </span><span style="color:#0000ff;">private</span><span style="color:#000000;"> String greeting;
  </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> GreetingServiceImpl() {}
  </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> GreetingServiceImpl(String greeting) {
    </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.greeting </span><span style="color:#000000;">=</span><span style="color:#000000;"> greeting;
  }
  </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> sayGreeting() {
    System.out.println(greeting);
  }
  </span><span style="color:#0000ff;">public</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> setGreeting(String greeting) {
    </span><span style="color:#0000ff;">this</span><span style="color:#000000;">.greeting </span><span style="color:#000000;">=</span><span style="color:#000000;"> greeting;
  }
}
</span></pre>
</blockquote>
<p>实现他.</p>
<p>可以看得出来, 构造函数和 set 方法都可以给属性 greeting 赋值</p>
<p>现在, 配置 spring 容器来给这个bean 的 greeting 属性赋值</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">&lt;?</span><span style="color:#ff00ff;">xml version="1.0" encoding="UTF-8"</span><span style="color:#0000ff;">?&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">beans </span><span style="color:#ff0000;">xmlns</span><span style="color:#0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color:#ff0000;">
   xmlns:xsi</span><span style="color:#0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color:#ff0000;">
   xsi:schemaLocation</span><span style="color:#0000ff;">="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
  </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="greetingService"</span><span style="color:#ff0000;">
      class</span><span style="color:#0000ff;">="com.springinaction.chapter01.hello.GreetingServiceImpl"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">property </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="greeting"</span><span style="color:#ff0000;"> value</span><span style="color:#0000ff;">="Buenos Dias!"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
  </span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">beans</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;"> </span></pre>
</blockquote>
<p>让我们来看这个 xml, 简单的结果, 告诉 spring 容器给 beans 底下的名叫 greetingService 的 Bean 的 greeting 属性 的value 设成 &#8220;Buenos Dias&#8221;<br />
容器会自动实例出 GreetingServiceImpl并调用其 set 方法&#8230;<br />
此段xml 将会被容器翻译成</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#000000;">GreetingServiceImpl greetingService </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000ff;">new</span><span style="color:#000000;"> GreetingServiceImpl();
greetingService.setGreeting(</span><span style="color:#000000;">"</span><span style="color:#000000;">Buenos Dias!</span><span style="color:#000000;">"</span><span style="color:#000000;">); </span></pre>
</blockquote>
<p>我们还可以直接用构造函数 给属性赋值</p>
<blockquote>
<pre style="background-color:white;"><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">bean </span><span style="color:#ff0000;">id</span><span style="color:#0000ff;">="greetingService"</span><span style="color:#ff0000;">
    class</span><span style="color:#0000ff;">="com.springinaction.chapter01.hello.GreetingServiceImpl"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">
  </span><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">constructor-arg </span><span style="color:#ff0000;">value</span><span style="color:#0000ff;">="Buenos Dias!"</span><span style="color:#ff0000;"> </span><span style="color:#0000ff;">/&gt;</span><span style="color:#000000;">
</span><span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">bean</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;"> </span><span style="color:#000000;">
</span></pre>
</blockquote>
<p>下面来看 注入 进去的属性怎么取</p>
<blockquote>
<pre style="background:#ffffff none repeat scroll 0 0;color:#000000;"><span style="color:#800000;font-weight:bold;">import</span><span style="color:#004a43;"> org</span><span style="color:#808030;">.</span><span style="color:#004a43;">springframework</span><span style="color:#808030;">.</span><span style="color:#004a43;">beans</span><span style="color:#808030;">.</span><span style="color:#004a43;">factory</span><span style="color:#808030;">.</span><span style="color:#004a43;">BeanFactory</span><span style="color:#800080;">;</span>
<span style="color:#800000;font-weight:bold;">import</span><span style="color:#004a43;"> org</span><span style="color:#808030;">.</span><span style="color:#004a43;">springframework</span><span style="color:#808030;">.</span><span style="color:#004a43;">beans</span><span style="color:#808030;">.</span><span style="color:#004a43;">factory</span><span style="color:#808030;">.</span><span style="color:#004a43;">xml</span><span style="color:#808030;">.</span><span style="color:#004a43;">XmlBeanFactory</span><span style="color:#800080;">;</span>
<span style="color:#800000;font-weight:bold;">import</span><span style="color:#004a43;"> org</span><span style="color:#808030;">.</span><span style="color:#004a43;">springframework</span><span style="color:#808030;">.</span><span style="color:#004a43;">core</span><span style="color:#808030;">.</span><span style="color:#004a43;">io</span><span style="color:#808030;">.</span><span style="color:#004a43;">FileSystemResource</span><span style="color:#800080;">;</span>
<span style="color:#800000;font-weight:bold;">public</span> <span style="color:#800000;font-weight:bold;">class</span> HelloApp <span style="color:#800080;">{</span>
  <span style="color:#800000;font-weight:bold;">public</span> <span style="color:#800000;font-weight:bold;">static</span> <span style="color:#bb7977;">void</span> main<span style="color:#808030;">(</span><span style="color:#bb7977;font-weight:bold;">String</span><span style="color:#808030;">[</span><span style="color:#808030;">]</span> args<span style="color:#808030;">)</span> <span style="color:#800000;font-weight:bold;">throws</span> <span style="color:#bb7977;font-weight:bold;">Exception</span> <span style="color:#800080;">{</span>
    BeanFactory factory <span style="color:#808030;">=</span>
        <span style="color:#800000;font-weight:bold;">new</span> XmlBeanFactory<span style="color:#808030;">(</span><span style="color:#800000;font-weight:bold;">new</span> FileSystemResource<span style="color:#808030;">(</span><span style="color:#0000e6;">"hello.xml"</span><span style="color:#808030;">)</span><span style="color:#808030;">)</span><span style="color:#800080;">;</span>
    GreetingService greetingService <span style="color:#808030;">=</span>
        <span style="color:#808030;">(</span>GreetingService<span style="color:#808030;">)</span> factory<span style="color:#808030;">.</span>getBean<span style="color:#808030;">(</span><span style="color:#0000e6;">"greetingService"</span><span style="color:#808030;">)</span><span style="color:#800080;">;</span>
    greetingService<span style="color:#808030;">.</span>sayGreeting<span style="color:#808030;">(</span><span style="color:#808030;">)</span><span style="color:#800080;">;</span>
  <span style="color:#800080;">}</span>
<span style="color:#800080;">}</span></pre>
</blockquote>
<p>不直接实例化 bean 而从容器中取&#8230;&#8230;</p>
<p>到这里已经可以很好的理解 spring 容器的 注入(inject), 那 依赖(dependency)呢?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=17&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/09/spring-framework-quickstart-1spring-%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>Ajax in Action first steps:Four Main Components</title>
		<link>http://oyanglulu.wordpress.com/2009/04/07/ajax-in-action-first-stepsfour-main-components/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/07/ajax-in-action-first-stepsfour-main-components/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 07:52:05 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/2009/04/07/ajax-in-action-first-stepsfour-main-components/</guid>
		<description><![CDATA[Preface Ajax in Action, 好厚一本书, 大学写论文的时候当参考资料翻译看了一点, 现在继续, 笔记一下, less i forget 1 JavaScript: The central player An Ajax application downloads a complete client into memory, combining data and presentation and program logic, and JavaScript is the tool used to implement that logic. Loosely typed: 不指定类型 Interpreted: 中间语言 General purpose: 适用算法和编程 2 CSS(Cascading Style Sheets) 级联样式单 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=10&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2><strong><span style="font-size:medium;">Preface</span></strong></h2>
<p><span style="font-size:medium;">Ajax in Action, 好厚一本书, 大学写论文的时候当参考资料翻译看了一点, 现在继续, 笔记一下, less i forget</span><strong><span style="font-size:medium;"><br />
</span></strong></p>
<h2><span style="font-size:medium;">1 JavaScript: The central player</span></h2>
<p style="padding-left:30px;">An Ajax application downloads a complete client into memory, combining data and presentation<br />
and program logic, and JavaScript is the tool used to implement that logic.</p>
<ul>
<li><span style="font-size:small;">Loosely typed: 不指定类型</span></li>
<li><span style="font-size:small;">Interpreted: 中间语言</span></li>
<li><span style="font-size:small;">General purpose: 适用算法和编程</span></li>
</ul>
<h2><span style="font-size:small;"><span style="font-size:medium;">2 CSS(Cascading Style Sheets) 级联样式单</span></span></h2>
<h3><span style="font-size:small;">2.1 CSS selectors</span></h3>
<h4><span style="font-size:small;">2.1.1 element-based selectors</span></h4>
<p style="padding-left:30px;">选择html tag 应用CSS</p>
<blockquote><p>div h1 { color: red; }</p></blockquote>
<p style="padding-left:30px;">将对&lt;div&gt;中所有&lt;H1&gt;适用</p>
<h4>2.1.2 additional style class</h4>
<blockquote><p>.callout { border: solid blue 1px; background-color: cyan }</p></blockquote>
<p style="padding-left:30px;">需要在 tag 中指定</p>
<blockquote>
<p style="padding-left:30px;">&lt;div&gt;I&#8217;ll appear as a normal bit of text&lt;/div&gt;<br />
&lt;div class=&#8217;callout&#8217;&gt;And I&#8217;ll appear as a callout!&lt;/div&gt;</p></blockquote>
<p style="padding-left:30px;">而且还可以在 tag 中加多个 style class</p>
<blockquote>
<p style="padding-left:30px;">&lt;div class=&#8217;callout loud&#8217;&gt;<br />
And I&#8217;ll appear as an unappealing mixture of both!<br />
&lt;/div&gt;</p></blockquote>
<h4>2.1.3 combine classes with element-based rules</h4>
<p style="padding-left:30px;">还可以绑定style class 到指定标签</p>
<blockquote>
<p style="padding-left:30px;">span.highlight { background-color: yellow }</p>
</blockquote>
<p style="padding-left:30px;">只有声明 highlight 的 span 标签才适用这个样式</p>
<p style="padding-left:30px;">再复杂点</p>
<blockquote>
<p style="padding-left:30px;">div.prose span.highlight { background-color: yellow }</p>
</blockquote>
<p style="padding-left:30px;">只选择</p>
<blockquote>
<p style="padding-left:30px;">&lt;div class=&#8221;prose &#8220;&gt;<br />
&lt;span class=&#8221;highlight&#8221; &#8230;&#8230;&#8230;/&gt;<br />
&lt;/div class=&#8221;prose &#8220;&gt;</p></blockquote>
<p style="padding-left:30px;">中span中的内容适用式样</p>
<h4>2.1.4 apply only to an element with a given unique ID</h4>
<p style="padding-left:30px;">按 ID 选择</p>
<blockquote>
<p style="padding-left:30px;">#close { color: red }</p>
</blockquote>
<p style="padding-left:30px;">只选择 id=&#8221;close&#8221; 的 tag</p>
<h4>2.1.5 pseudo-selectors</h4>
<p style="padding-left:30px;">浏览器定义了一些 pseudo-selectors<br />
如</p>
<blockquote>
<p style="padding-left:30px;">*:first-letter {<br />
font-size: 500%;<br />
color: red;<br />
float: left;<br />
}</p></blockquote>
<p style="padding-left:30px;">会把所有 element 的头字母 弄成更大而且是红色</p>
<p style="padding-left:30px;">而CSS可以基于这个 pseudo-selectors 自定义样式单</p>
<blockquote>
<p style="padding-left:30px;">p.illuminated:first-letter {<br />
font-size: 500%;<br />
color: red;<br />
float: left;<br />
}</p></blockquote>
<p style="padding-left:30px;">现在这个样式会只适用到 声明过class=&#8221;illuminated&#8221; 的 &lt;p&gt; 标签</p>
<p style="padding-left:30px;">其他还有一些有用的 pseudo-selectors,如first-line, hover<br />
hove 会作用于鼠标下超链接</p>
<blockquote>
<p style="padding-left:30px;">a:hover{ color:yellow; }</p>
</blockquote>
<p style="padding-left:30px;">就会使所鼠标下的 &lt;a&gt; 标签变黄</p>
<h3>2.2 CSS style properties</h3>
<p style="padding-left:30px;">属性, 每个 tag 上都可以适用很多属性, 先来看这几个</p>
<blockquote>
<p style="padding-left:30px;">.robotic{<br />
font-size: 14pt;<br />
font-family: courier new, courier, monospace;<br />
font-weight: bold;<br />
color: gray;<br />
}</p></blockquote>
<p style="padding-left:30px;">指定字体 font 和 color, 可以写的更简单点</p>
<blockquote>
<p style="padding-left:30px;">.robotic{<br />
font: bold 14pt courier new, courier, monospace;<br />
color: gray;<br />
}</p></blockquote>
<p style="padding-left:30px;">我们来举个例子看怎样使用 CSS.</p>
<h3>2.3 A simple CSS example</h3>
<p style="padding-left:30px;">首先来看一下用完 CSS 的效果, 使用 CSS 完成类似 windows explorer 的效果的widget.</p>
<p style="padding-left:30px;"><a rel="attachment wp-att-14" href="http://oyanglulu.wordpress.com/2009/04/07/ajax-in-action-first-stepsfour-main-components/ajax-in-actionpdf-adobe-reader/"><img class="alignnone size-full wp-image-14" title="ajax-in-actionpdf-adobe-reader" src="http://oyanglulu.files.wordpress.com/2009/04/ajax-in-actionpdf-adobe-reader.jpg?w=541&#038;h=180" alt="ajax-in-actionpdf-adobe-reader" width="541" height="180" /></a></p>
<p style="padding-left:30px;">现在开始分析, 从哪下手</p>
<h4 style="padding-left:30px;">Using CSS for layout</h4>
<p style="padding-left:30px;">当然一眼过去可以分成2个部分, window, items</p>
<blockquote>
<p style="padding-left:30px;">div.window{<br />
position: absolute;<br />
overflow: auto;<br />
margin: 8px;<br />
padding: 0px;<br />
width: 420px;<br />
height: 280px;<br />
}</p>
<p style="padding-left:30px;">div.item{<br />
position: relative;<br />
height: 64px;<br />
width: 56px;<br />
float: left;<br />
padding: 0px;<br />
margin: 8px;<br />
}</p></blockquote>
<p style="padding-left:30px;">然后, 每个items都还有个items名</p>
<blockquote>
<p style="padding-left:30px;">div.item div.itemName{<br />
margin-top: 48px;<br />
font: 10px verdana, arial, helvetica;<br />
text-align: center;<br />
}</p></blockquote>
<p style="padding-left:30px;">当然不同种类的items还有不同的图标</p>
<blockquote>
<p style="padding-left:30px;">div.folder{<br />
background:<br />
transparent url(images/folder.png)<br />
top left no-repeat;<br />
}<br />
div.file{<br />
background:<br />
transparent url(images/file.png)<br />
top left no-repeat;<br />
}<br />
div.special{<br />
background:<br />
transparent url(images/folder_important.png)<br />
top left no-repeat;<br />
}</p></blockquote>
<p style="padding-left:30px;">差点把标题栏忘了</p>
<blockquote>
<p style="padding-left:30px;">div.titlebar{<br />
background-color: #0066aa;<br />
background-image: url(images/titlebar_bg.png);<br />
background-repeat: repeat-x;<br />
&#8230;<br />
}</p></blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=10&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/07/ajax-in-action-first-stepsfour-main-components/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>

		<media:content url="http://oyanglulu.files.wordpress.com/2009/04/ajax-in-actionpdf-adobe-reader.jpg" medium="image">
			<media:title type="html">ajax-in-actionpdf-adobe-reader</media:title>
		</media:content>
	</item>
		<item>
		<title>Regular Expression in .NET</title>
		<link>http://oyanglulu.wordpress.com/2009/04/06/regular-expression-in-net/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/06/regular-expression-in-net/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 16:45:26 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Regular Expressions]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[Regular Expression]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/?p=6</guid>
		<description><![CDATA[Common Matacharacters 常用元字符 1. 转义 \a 警告 [\b] 回车 \e   Esc \f    formfeed 换页 \n 换行 \r 回车 \t 横向tab \v 纵向tab \O## 两位十进制数 \x## 两位十六进制数 \u#### 四位十六进制数 \cchar control characters ctrl+char?? 2. Character Classes and Class-Like Constructs  匹配字符集 [] [^] 单字符集合 . 除了换行以外的任何字符 \w 所有unicode字符, [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] , 在纯ASCII模式中可以表示为 [a-zA-Z_0-9] \W    \w的非 \d [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=6&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Common Matacharacters 常用元字符</h2>
<p><span style="font-size:x-small;"><strong>1. </strong></span><span style="font-size:x-small;"><strong>转义</strong></span></p>
<p style="margin-bottom:.17in;font-family:arial,sans-serif;" align="left"><span style="font-size:x-small;"> </span><span style="font-size:x-small;">\a </span><span style="font-size:x-small;">警告</span><span style="font-size:x-small;"><br />
[\b] </span><span style="font-size:x-small;">回</span><span style="font-size:x-small;">车</span><span style="font-size:x-small;"><br />
\e   Esc<br />
\f    formfeed 换页</span><span style="font-size:x-small;"><br />
\n </span><span style="font-size:x-small;">换</span><span style="font-size:x-small;">行</span><span style="font-size:x-small;"><br />
\r </span><span style="font-size:x-small;">回</span><span style="font-size:x-small;">车</span><span style="font-size:x-small;"><br />
\t </span><span style="font-size:x-small;">横向</span><span style="font-size:x-small;">tab<br />
\v </span><span style="font-size:x-small;">纵</span><span style="font-size:x-small;">向</span><span style="font-size:x-small;">tab<br />
\</span><span style="color:#000000;font-size:x-small;">O##</span><span style="font-size:x-small;"> </span><span style="font-size:x-small;">两位十</span><span style="font-size:x-small;">进</span><span style="font-size:x-small;">制数</span><span style="font-size:x-small;"><br />
\x## </span><span style="font-size:x-small;">两位十六</span><span style="font-size:x-small;">进</span><span style="font-size:x-small;">制数</span><span style="font-size:x-small;"><br />
\u#### </span><span style="font-size:x-small;">四位十六</span><span style="font-size:x-small;">进</span><span style="font-size:x-small;">制数</span><span style="font-size:x-small;"><br />
\c</span><span style="color:#741b47;font-size:x-small;"><em>char</em></span><span style="font-size:x-small;"> control characters ctrl+</span><span style="color:#741b47;font-size:x-small;"><em>char</em></span><span style="font-size:x-small;">??</span></p>
<h3 style="margin-top:.19in;margin-bottom:.19in;font-family:arial,sans-serif;text-align:left;"><span style="font-size:x-small;"><strong>2. Character Classes and Class-Like Constructs  匹配字符集</strong></span></h3>
<p style="margin-bottom:.17in;font-family:arial,sans-serif;" align="left"><span style="font-size:x-small;">[] [^] </span><span style="font-size:x-small;">单</span><span style="font-size:x-small;">字符集合</span><span style="font-size:x-small;"><br />
. </span><span style="font-size:x-small;">除了</span><span style="font-size:x-small;">换</span><span style="font-size:x-small;">行以外的任何字符</span><span style="font-size:x-small;"><br />
</span><span style="font-size:x-small;">\w </span><span style="font-size:x-small;">所有</span><span style="font-size:x-small;">unicode</span><span style="font-size:x-small;">字符</span><span style="font-size:x-small;">, [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}] , </span><span style="font-size:x-small;">在</span><span style="font-size:x-small;">纯</span><span style="font-size:x-small;">ASCII</span><span style="font-size:x-small;">模式中可以表示</span><span style="font-size:x-small;">为</span><span style="font-size:x-small;"> </span><span style="font-size:x-small;">[a-zA-Z_0-9]<br />
\W    \w</span><span style="font-size:x-small;">的非</span><span style="font-size:x-small;"><br />
\d </span><span style="font-size:x-small;">数字</span><span style="font-size:x-small;">, \p{Nd}, </span><span style="font-size:x-small;">在</span><span style="font-size:x-small;">纯</span><span style="font-size:x-small;">ASCII</span><span style="font-size:x-small;">模式中可以表示</span><span style="font-size:x-small;">为</span><span style="font-size:x-small;"> </span><span style="font-size:x-small;">[0-9]<br />
\D    \d</span><span style="font-size:x-small;">的非</span><span style="font-size:x-small;"><br />
\s     Whitespace character</span><span style="font-size:x-small;">空白字符</span><span style="font-size:x-small;">, [ \f\n\r\t\v\x85\p{Z}], </span><span style="font-size:x-small;">在</span><span style="font-size:x-small;">纯</span><span style="font-size:x-small;">ASCII</span><span style="font-size:x-small;">模式中可以表示</span><span style="font-size:x-small;">为</span><span style="font-size:x-small;">[ \f\n\r\t\v]<br />
\S    \s</span><span style="font-size:x-small;">的非</span><span style="font-size:x-small;"><br />
\p </span>Unicode properties and block<span style="font-size:x-small;"><br />
\P    \p</span><span style="font-size:x-small;">的非</span></p>
<h3 style="margin-top:.19in;margin-bottom:.19in;font-family:arial,sans-serif;text-align:left;">3. Anchors and Other Zero-Width Tests<span><strong><span style="font-size:x-small;"><strong> 匹配位置</strong></span></strong></span></h3>
<h3 style="margin-bottom:.17in;font-family:arial,sans-serif;"><span style="font-size:x-small;"> </span></h3>
<p><span style="font-size:x-small;">^ \A     行头<br />
$ \z \Z  行尾</span><span style="font-size:x-small;"><br />
\G         前次匹配的末尾 </span>End of previous match<br />
<span style="font-size:x-small;"> \b \B     单词界</span><tt><span><br />
</span></tt></p>
<p><tt><span>(?= ⋯) Lookahead 返回true 如果匹配当前位置之后</span></tt></p>
<p><tt><span>(?! ⋯) </span></tt><tt><span>Lookahead 返回true 如果不匹配当前位置之后</span></tt></p>
<p><tt><span> (?&lt;=⋯) </span></tt><tt><span>Lookbehind 返回true 如果匹配当前位置之前</span></tt></p>
<p><tt><span> (?&lt;!⋯)</span></tt><span style="font-size:x-small;"> </span><tt><span>Look</span></tt><tt><span>behind</span></tt><tt><span> 返回true 如果不匹配当前位置之前</span></tt></p>
<h3>4. Comments and Mode Modifiers  匹配模式</h3>
<p>(?modifier)(?-modifier)       支持<tt><span> x s m i n</span></tt> ,如 (?i)&#8230;(?-i) 将以忽略大小写模式匹配<br />
(?modifier:&#8230;..) 只是另一种写法,如 (?i:&#8230;.) 将以忽略大小写模式匹配<br />
(?#&#8230;.)             注释</p>
<h3>5. Grouping, Capturing, Conditional, and Control  分组匹配</h3>
<p>(&#8230;)\1\2                           分组/捕获<br />
<strong>(?:</strong>&#8230;<strong>)</strong> 只分组, 不被捕获<br />
(?&lt;name-name&gt;&#8230;.)        按名字捕获<br />
(?&lt;name&gt;&#8230;)  \k&lt;name&gt; 按名字分组捕获<br />
(?&gt;&#8230;)                            Atomic grouping 只要匹配成功就不走组内剩余分支<br />
|                                    Alternation  或<br />
<tt><span>* + ? {n} {n,} {x,y} </span></tt>Greedy quantifiers<br />
<tt><span>*? +? ?? {n}? {n,}? {x,y}?  Lazy </span></tt>quantifiers<br />
(?if then|else)                  Conditional</p>
<h3>6. Regex Modes</h3>
<p>.Singleline                           单行模式, 点可以匹配任何字符, 等于(?s)<br />
.Mutiline                             多行模式, ^和$有效, 等于(?m)<br />
.IgnorePatternWhitespace    忽略空格的注释模式, 等于(?x)<br />
.IgnoreCase                        忽略大小写, 等于(?i)<br />
.ExplicitCapture                  精确捕获, 只捕获(?&lt;name&gt;&#8230;..), 等于(?n)<br />
.ECMAScript                      只匹配ASCII字符<br />
.RightToLeft                        从右忘左匹配<br />
.Compiled                           编译正则, 使得运行时更快</p>
<p><span style="color:#6fa8dc;">以上涵盖了几乎所有.NET所支持的正则表达式</span><span style="color:#0b5394;">, 下面介绍如何在C#中使用</span></p>
<h2><span style="font-size:x-large;">Quickstart</span></h2>
<p>在C#中, 用Regex, Match, Groups 这3个对象就可以实现正则表达式了, 下面来看一个简单的例子</p>
<p>用正则表达式匹配一个日期, 然后分别输出所匹配出来的年, 月, 日</p>
<p>这段代码可以用SVN在<br />
<a href="https://dotnetregularexpression.googlecode.com/svn/trunk/%20dotnetregularexpression/regex/MatchAndCaptureGroup">https://dotnetregularexpression.googlecode.com/svn/trunk/ dotnetregularexpression/regex/MatchAndCaptureGroup</a><br />
下到, 当然也可以直接在 <a href="http://code.google.com/p/dotnetregularexpression/">GoogleCode </a>看代码</p>
<blockquote>
<pre style="background-color:#cccccc;"><span style="color:#008080;"> 1</span> <span style="color:#0000ff;">using</span><span style="color:#000000;"> System.Text.RegularExpressions;
</span><span style="color:#008080;"> 2</span> <span style="color:#000000;">    </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> MatchTest
</span><span style="color:#008080;"> 3</span> <span style="color:#000000;">    {
</span><span style="color:#008080;"> 4</span> <span style="color:#000000;">        </span><span style="color:#0000ff;">static</span><span style="color:#000000;"> </span><span style="color:#0000ff;">void</span><span style="color:#000000;"> Main()
</span><span style="color:#008080;"> 5</span> <span style="color:#000000;">        {
</span><span style="color:#008080;"> 6</span> <span style="color:#000000;">            </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> date </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">"</span><span style="color:#800000;">12/30/1969</span><span style="color:#800000;">"</span><span style="color:#000000;">;
</span><span style="color:#008080;"> 7</span> <span style="color:#000000;">            </span><span style="color:#008000;">//</span><span style="color:#008000;">定义Regx</span><span style="color:#008000;">
</span><span style="color:#008080;"> 8</span> <span style="color:#000000;">            Regex r </span><span style="color:#000000;">=</span><span style="color:#000000;">
</span><span style="color:#008080;"> 9</span> <span style="color:#000000;">              </span><span style="color:#0000ff;">new</span><span style="color:#000000;"> Regex(</span><span style="color:#800000;">@"</span><span style="color:#800000;">^(\d\d)[-/](\d\d)[-/](\d\d(?:\d\d)?)$</span><span style="color:#800000;">"</span><span style="color:#000000;">);
</span><span style="color:#008080;">10</span> <span style="color:#000000;">            </span><span style="color:#008000;">//</span><span style="color:#008000;">定义Match</span><span style="color:#008000;">
</span><span style="color:#008080;">11</span> <span style="color:#000000;">            Match m </span><span style="color:#000000;">=</span><span style="color:#000000;"> r.Match(date);
</span><span style="color:#008080;">12</span> <span style="color:#000000;">            System.Console.Out.WriteLine(</span><span style="color:#800000;">"</span><span style="color:#800000;">In US prefer: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> m.ToString());
</span><span style="color:#008080;">13</span> <span style="color:#000000;">
</span><span style="color:#008080;">14</span> <span style="color:#000000;">            </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> (m.Success)
</span><span style="color:#008080;">15</span> <span style="color:#000000;">            {
</span><span style="color:#008080;">16</span> <span style="color:#000000;">                </span><span style="color:#008000;">//</span><span style="color:#008000;">使用Group</span><span style="color:#008000;">
</span><span style="color:#008080;">17</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> month </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">1</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;">18</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> day </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">2</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;">19</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> year </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">3</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;">20</span> <span style="color:#000000;">                System.Console.Out.Write(</span><span style="color:#800000;">"</span><span style="color:#800000;">month: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> month </span><span style="color:#000000;">+</span><span style="color:#000000;"> </span><span style="color:#800000;">"</span><span style="color:#800000;">\n</span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> </span><span style="color:#800000;">"</span><span style="color:#800000;">day: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> day </span><span style="color:#000000;">+</span><span style="color:#000000;"> </span><span style="color:#800000;">"</span><span style="color:#800000;">\n</span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> </span><span style="color:#800000;">"</span><span style="color:#800000;">year: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> year </span><span style="color:#000000;">+</span><span style="color:#000000;"> </span><span style="color:#800000;">"</span><span style="color:#800000;">\n</span><span style="color:#800000;">"</span><span style="color:#000000;">);
</span><span style="color:#008080;">21</span> <span style="color:#000000;">                </span><span style="color:#008000;">//</span><span style="color:#008000;">使用Regex.Replace</span><span style="color:#008000;">
</span><span style="color:#008080;">22</span> <span style="color:#000000;">                System.Console.Out.Write(</span><span style="color:#800000;">"</span><span style="color:#800000;">In Chinese prefer: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> r.Replace(date, </span><span style="color:#800000;">"</span><span style="color:#800000;">$3年$1月$2日</span><span style="color:#800000;">"</span><span style="color:#000000;">));
</span><span style="color:#008080;">23</span> <span style="color:#000000;">                </span><span style="color:#008000;">//</span><span style="color:#008000;">使用Match.Replace</span><span style="color:#008000;">
</span><span style="color:#008080;">24</span> <span style="color:#000000;">                System.Console.Out.Write(</span><span style="color:#800000;">"</span><span style="color:#800000;">In Japanese prefer: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> m.Result(</span><span style="color:#800000;">"</span><span style="color:#800000;">$3/$1/$2</span><span style="color:#800000;">"</span><span style="color:#000000;">));
</span><span style="color:#008080;">25</span> <span style="color:#000000;">                Console.ReadLine();
</span><span style="color:#008080;">26</span> <span style="color:#000000;">            }
</span><span style="color:#008080;">27</span> <span style="color:#000000;">        }
</span><span style="color:#008080;">28</span> <span style="color:#000000;">    }</span></pre>
</blockquote>
<p>6行: 声明一个讲被匹配的对象日期 12/30/1969</p>
<p>8行: Regex<br />
@&#8221;&#8230;..&#8221;可以防止双引号中的字符转义<br />
这个正则很简单, 其中的<span style="color:#800000;">(?:\d\d)<span style="color:#000000;"> 表示这两个\d不会被Group到</span></span>, 这个后面会讲到</p>
<p>11行: Match<br />
用Regex匹配日期, 返回一个Match型的对象<br />
MatchObject.<strong>Success()</strong> 返回匹配结果<br />
MatchObject.<strong>ToString()</strong> 将返回匹配上的字符<br />
MatchObject.<strong>Groups()</strong> 返回所匹配的Group对象数组</p>
<p>12行: Group<br />
用GroupObject<strong>.Value()</strong> 可以取出被group匹配的值</p>
<p>22行: 置换<br />
RegexObject<strong>.Replace(text, replacement</strong><strong>)</strong> 可以把<strong>text</strong>中匹配部分置换成<strong>replacement</strong><br />
其中的$1, $2, $3 要解释一下,<br />
在C#中, <strong>Regex.Replace</strong> 和 <strong>Match.Result</strong>(24行) 都支持用&#8217;$'符号转义, 讲一下常用的<br />
$&amp;  $0          代表所有被匹配的字符<br />
$1,$2,&#8230;       代表被捕捉的group<br />
${name}        按name捕捉上的group<br />
$$                一个$<br />
$_                被匹配前的整条字符串</p>
<h2><span style="font-size:x-large;">Common Use</span></h2>
<h3>2. Lookaround</h3>
<p>比如一长串金钱 549484656132 看起来很难分出来到底是多少钱&#8230;..要是能换成 549,484,656,132 就好多了,<br />
一下就能读出来, 549 billion 484 million 656 thousand<br />
<em>如何加逗号?</em><br />
用前面学过的可以想到, 分组匹配, 然后除了第一组其他都在前面加逗号<br />
<em>可以用 \b(\d{1,3})(\d\d\d)+\b 然后循环Group数组往中间加逗号, 这样可以吗?</em></p>
<p>调试会发现不行, 而且会发现group[1] 是549, 但是group[2]却是132, 只有两个group<br />
<em>这样加出来 只会是 549484656,132 怎么办?</em></p>
<p>现在插播 Lookaround</p>
<p><tt><span>(?= ⋯) Lookahead 返回true 如果匹配当前位置之后</span></tt></p>
<p><tt><span>(?! ⋯) </span></tt><tt><span>Lookahead 返回true 如果不匹配当前位置之后</span></tt></p>
<p><tt><span> (?&lt;=⋯) </span></tt><tt><span>Lookbehind 返回true 如果匹配当前位置之前</span></tt></p>
<p><tt><span> (?&lt;!⋯)</span></tt><span style="font-size:x-small;"> </span><tt><span>Look</span></tt><tt><span>behind</span></tt><tt><span> 返回true 如果不匹配当前位置之前</span></tt><br />
<tt></tt></p>
<p><tt><span>举个例子</span></tt></p>
<p><span style="color:#0b5394;"><span style="color:#000000;">(?&lt;!\w)(?=\w) </span></span><em><br />
</em></p>
<p><em>代表什么?</em> 其中 <span style="color:#ff0000;">\w</span> 代表有效Unicode字符, ASCII模式下相当于<span style="font-size:x-small;">[a-zA-Z_0-9]</span></p>
<p>注意: Lookaround匹配的是位置</p>
<p>意思是当前位置之前没有字符, 当前位置之后有, 相当于单词界左边的 \b</p>
<p>那么<span style="color:#0b5394;"><span style="color:#000000;"> (?&lt;!\w)(?=\w)|(?&lt;=\w)(?!\w) 就完全等价于 \b 了</p>
<p>有了这个, 我们就能匹配出逗号的位置了, 现在回来看逗号怎么解决</p>
<p>很简单, 只要前面有数字, 后面有N组3位数, 这个位置就是逗号的位置</p>
<p>(?&lt;=\d)(?=(?:\d\d\d)+\b)<br />
</span></span></p>
<pre style="background-color:#cccccc;"><span style="color:#008080;">22</span> <span style="color:#000000;">                System.Console.Out.Write(</span><span style="color:#800000;">"</span><span style="color:#800000;">In Chinese prefer: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> r.Replace(date, </span><span style="color:#800000;">"</span><span style="color:#800000;">$3年$1月$2日</span><span style="color:#800000;">"</span><span style="color:#000000;">));</span></pre>
<p>然后按QuickStart中的这个置换功能, 将匹配上的位置都换成逗号<br />
<em><br />
虽然.NET支持</em><em><span style="color:#0b5394;">Lookbehind</span></em><em>, 但是</em><span style="color:#0b5394;"><span style="color:#000000;"><em>有些工具不支持</em></span></span><em><span style="color:#0b5394;">Lookbehind</span></em><span style="color:#0b5394;"><span style="color:#000000;"><em>, 怎么办?</p>
<p></em></span></span><span style="color:#0b5394;"><span style="color:#000000;">\d(?=(?:\d\d\d)+\b)</span></span></p>
<p><em><span style="color:#0b5394;">**要是连 </span></em><em>Lookahead</em><em><span style="color:#0b5394;">都没有呢? 就实现不了了吗?</span></em></p>
<h3>1. Grouping</h3>
<h4>1.1 Capturing/Grouping</h4>
<p>可能大家还记得在 <a href="http://groups.google.com/group/yuritech/web/regular-expression-basic">基本</a> 里提到的Backreferences \1 \2 &#8230;.<br />
\1 \2 可以回调到上次匹配上的字符, \1是第一个括号匹配上的, \2是第二个括号匹配上的<br />
而这个用法是用在正则表达式里的, <em>要是我在程序里想取出来呢</em>?<br />
所以这样就引出了<span style="color:#ff0000;">$1 $2</span> &#8230;.的用法, 上一节quick start 里已经稍微提到了一下<br />
所有PCRE和类perl的引擎都支持 <strong>$1 $2</strong>&#8230;..</p>
<p>跟\1 \2 一样, 但是 $1 $2 可以在程序里直接调到被匹配上的<span style="color:#ff0000;">Group</span>, 见 QuickStart 22行 24行<br />
至于Group其实很简单, 就是只要被括号括起来就叫一个Group<br />
C# 中两种方法捕捉Group</p>
<pre style="background-color:#cccccc;"><span style="color:#008080;">17</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> month </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">1</span><span style="color:#000000;">].Value;</span></pre>
<pre style="background-color:#cccccc;"><span style="color:#008080;">24</span> <span style="color:#000000;">                System.Console.Out.Write(</span><span style="color:#800000;">"</span><span style="color:#800000;">In Japanese prefer: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> m.Result(</span><span style="color:#800000;">"</span><span style="color:#800000;">$3/$1/$2</span><span style="color:#800000;">"</span><span style="color:#000000;">));</span></pre>
<p>置换也可以用Group</p>
<pre style="background-color:#cccccc;"><span style="color:#008080;">22</span> <span style="color:#000000;">                System.Console.Out.Write(</span><span style="color:#800000;">"</span><span style="color:#800000;">In Chinese prefer: </span><span style="color:#800000;">"</span><span style="color:#000000;"> </span><span style="color:#000000;">+</span><span style="color:#000000;"> r.Replace(date, </span><span style="color:#800000;">"</span><span style="color:#800000;">$3年$1月$2日</span><span style="color:#800000;">"</span><span style="color:#000000;">));</span></pre>
<h4><em>1.2 </em>Grouping-only parentheses</h4>
<p><em>那要是嵌套括号怎么办</em>?<em> 如 <span style="color:#800000;">QuickStart里的 <span style="background-color:#cccccc;">^(\d\d)[-/](\d\d)[-/](\d\d</span><span style="background-color:#cccccc;text-decoration:underline;">(?:\d\d)</span><span style="background-color:#cccccc;">?)$</span></span></em><em> <span style="color:#0b5394;">中的下划线部分应该算 \几?</span></em><br />
很简单, 不管嵌不嵌套, 只数左括号就可以了<br />
<em>那捕捉下划线部分就是 $4 ?</em></p>
<p>不是, 如果调试会发现 $4 不存在, 为什么<br />
而这里出现的<em><span style="color:#800000;"><span style="background-color:#cccccc;">(?:\d\d)</span></span></em> 在QuickStart中提了一下, <span style="color:#ff0000;">(?:&#8230;.)</span>将不会被捕获, 他只是为了划分后面问号的作用域<br />
其实加不加 ?: 结果不会有区别, 但是效率上来讲尽量只捕获一些你想要的Group<br />
(?:&#8230;) 就可以实现这种一定要加括号, 但是不想被捕获的情况</p>
<h4>1.3 Named capture</h4>
<p>要是括号太多很难数的过来, 会浪费很多时间而且不明了</p>
<p>在.NET框架中支持按名字捕获, Python 和 PHP 的 preg 引擎都支持这种捕获<br />
.NET中用 <span style="color:#ff0000;">(?&lt;name&gt;&#8230;)</span> 来按名字分组,  Backreferences  <span style="color:#ff0000;">\k&lt;name&gt;</span><br />
如果在程序里想使用按名字捕获到的组, 可以用 <tt><span>RegexObj.Groups</span>["name"]</tt><br />
于是, 我的的QuickStart例可以改写成</p>
<pre style="background-color:#cccccc;"><span style="color:#008080;"> 7</span> <span style="color:#000000;">            </span><span style="color:#008000;">//</span><span style="color:#008000;">定义Regx</span><span style="color:#008000;">
</span><span style="color:#008080;"> 8</span> <span style="color:#000000;">            Regex r </span><span style="color:#000000;">=</span><span style="color:#000000;">
</span><span style="color:#008080;"> 9</span> <span style="color:#000000;">              </span><span style="color:#0000ff;">new</span><span style="color:#000000;"> Regex(</span><span style="color:#800000;">@"</span><span style="color:#800000;">^(?&lt;month&gt;\d\d)[-/](</span><span style="color:#800000;">?&lt;day&gt;</span><span style="color:#800000;">\d\d)[-/](</span><span style="color:#800000;">?&lt;year&gt;</span><span style="color:#800000;">\d\d(?:\d\d)?)$</span><span style="color:#800000;">"</span><span style="color:#000000;">);
</span></pre>
<pre style="background-color:#cccccc;"><span style="color:#008080;">16</span> <span style="color:#000000;">                </span><span style="color:#008000;">//</span><span style="color:#008000;">使用Group</span><span style="color:#008000;">
</span><span style="color:#008080;">17</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> month </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">"month"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;">18</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> day </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">"day"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;">19</span> <span style="color:#000000;">                </span><span style="color:#0000ff;">string</span><span style="color:#000000;"> year </span><span style="color:#000000;">=</span><span style="color:#000000;"> m.Groups[</span><span style="color:#800080;">"year"</span><span style="color:#000000;">].Value;
</span></pre>
<p>会比较直观</p>
<h4>1.4 Atomic grouping</h4>
<p>原子group&#8230;..   <span style="color:#ff0000;">(?&gt;&#8230;)</span><br />
只要失败就不走其他分支</p>
<p>我们知道 .*! 可以匹配 what&#8217;s up!<br />
<em><span style="background-color:#ffffff;color:#0b5394;">要是 (?&gt;.*)! 呢? </span></em></p>
<p>&lt;插播&gt;<br />
这里要注意星号, 他比较瓜,  只要匹配成功, 读到星号会继续用星号前的表达式继续匹配<br />
于是光一个 .* 已经匹配上整个单词 包括叹号<br />
然后继续读下一个表达式&#8230;居然是叹号, <em>于是引擎会回溯刚刚匹配的过程, 用叹号再来一次</em><br />
这样听起来效率就很低, 如果我后面有一千个问号号, 而我只想要前面的what&#8217;s up!<br />
.* 就白白多匹配了999个问号, 要优化很简单, 只要遇到叹号就失败就可以了  [^!]*!<br />
<em>但是如果我要匹配 up 前面的怎么办? [^up]*up 可以吗?</em> <span style="color:#ffffff;">no</span></p>
<p>&lt;插播&gt;<br />
我们把 <span style="color:#ff0000;">*</span> 叫做<span style="color:#ff0000;">Greedy quantifiers 贪婪计量号</span><br />
与贪婪相反的是懒惰, 于是.NET还支持 <span style="color:#ff0000;">懒惰计量号 Lazy quantifiers</span>, 就是在贪婪符号后加问号<br />
如 &lt;tag&gt;.<span style="color:#ff0000;">*?</span>&lt;/tag&gt;<br />
刚好跟贪婪相反, 他会一直看 ? 后面的字符是否匹配上, 只要匹配就跳出星号的贪婪匹配<br />
拿刚刚的表达式来匹配 &lt;tag&gt;here&#8217;s a &lt;tag&gt;&lt;/tag&gt;<br />
当走完 第一个&lt;tag&gt; 引擎先会先匹配 ? 后面的字符, 如果是 &lt;/tag&gt; 就直接不走问号前面的 .* 了<br />
如果不是, 继续用 . 匹配,<br />
&lt;/插播&gt;<br />
再回到要匹配 up 前面的问题, 用懒惰匹配可以写成   .*?up<br />
&lt;/插播&gt;</p>
<p>说回来刚刚叹号的问题 atomic grouping 不保留匹配过的状态, 也就是说正则引擎不会回溯过去的状态看有没有叹号<br />
所以 <em><span style="background-color:#ffffff;color:#0b5394;">(?&gt;.*)! </span></em><span style="background-color:#ffffff;color:#0b5394;"><span style="color:#000000;">匹配 what! 不会成功</span></span><em><span style="background-color:#ffffff;color:#0b5394;"><br />
</span></em><span style="background-color:#ffffff;color:#000000;">这个例子好像看不出来 </span>atomic grouping 有什么好处, 效率一样嘛<br />
但是如果用来匹配 what 呢? 没有叹号.<br />
如果用 (?&gt;.*)! 当走到叹号的时候直接就失败了<br />
而用 .*! 还会回溯循环找叹号<em><span style="background-color:#ffffff;color:#0b5394;"></p>
<p></span></em><span style="background-color:#ffffff;color:#000000;">所以 </span>atomic grouping 的效率就体现在匹配不成功的时候</p>
<p><em><tt>(?&gt;.*?) 匹配什么?</tt></em></p>
<h4>1.5 IF ELSE</h4>
<p><span style="color:#ff0000;">(?if then|else)</span><br />
这里说下用什么当if条件<br />
1. 用 lookaround<br />
(?(?&lt;=num)\d|\w)  如果当前位置前面是num, 就用数字匹配<br />
2. 用 reference<br />
(num)(?(1)\d*|\w*)  如果以num 开头, 就用数字匹配</p>
<h3>3. Mode modify</h3>
<p><span style="color:#ff0000;">模式转换 (?modifier:&#8230;.)</span> 支持的模式有</p>
<p><tt><span> x </span></tt>单行模式, 点可以匹配任何字符<br />
<tt><span> s </span></tt>多行模式, ^和$有效<br />
<tt><span> m </span></tt>忽略空格的注释模式<br />
<tt><span> i </span></tt>忽略大小写<br />
<tt><span> n</span></tt> 精确捕获, 只捕获(?&lt;name&gt;&#8230;..)</p>
<p>如: w(?i:hat) 相当于 w[Hh][Aa][Tt]</p>
<p>还有另外一种写法:  <span style="color:#ff0000;"> w(?i)hat(?-i)</span></p>
<h3>4. 注释</h3>
<p>只要在参数里加 <span style="color:#ff0000;">RegexOptions.IgnorePatternWhitespace</span> 就可以了, 变成忽略空格的注释模式, 注释用 <span style="color:#ff0000;">#</span> 号<br />
于是我们的 QuickStart 例子里可以加注释了</p>
<pre style="background-color:#cccccc;"><span style="color:#008080;"> 7</span> <span style="color:#000000;">            </span><span style="color:#008000;">//</span><span style="color:#008000;">定义Regx</span><span style="color:#008000;">
</span><span style="color:#008080;"> 8</span> <span style="color:#000000;">            Regex r </span><span style="color:#000000;">=</span><span style="color:#000000;">
</span><span style="color:#008080;"> 9</span> <span style="color:#000000;">              </span><span style="color:#0000ff;">new</span><span style="color:#000000;"> Regex(</span><span style="color:#800000;">@"</span><span style="color:#800000;">^(?&lt;month&gt;\d\d)[-/]   #this get the month
                           (</span><span style="color:#800000;">?&lt;day&gt;</span><span style="color:#800000;">\d\d)[-/]</span><span style="color:#800000;">        #and this get the day</span>
<span style="color:#800000;">                           (</span><span style="color:#800000;">?&lt;year&gt;</span><span style="color:#800000;">\d\d(?:\d\d)?)$</span><span style="color:#800000;"> </span><span style="color:#800000;">#and this get the year</span><span style="color:#800000;">"</span><span style="color:#000000;">
                           , </span><span style="color:#ff0000;"><span style="color:#0b5394;">RegexOptions<span style="color:#000000;">.</span></span><span style="color:#000000;">IgnorePatternWhitespace</span></span><span style="color:#000000;">);</span></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=6&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/06/regular-expression-in-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>
	</item>
		<item>
		<title>Regular Expression&#8217;s Basic</title>
		<link>http://oyanglulu.wordpress.com/2009/04/05/regular-expressions-basic/</link>
		<comments>http://oyanglulu.wordpress.com/2009/04/05/regular-expressions-basic/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 16:21:59 +0000</pubDate>
		<dc:creator>oyanglulu</dc:creator>
				<category><![CDATA[Regular Expressions]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[Regular Expression]]></category>

		<guid isPermaLink="false">http://oyanglulu.wordpress.com/2009/04/05/regular-expressions-basic/</guid>
		<description><![CDATA[Preface&#160; 这里先总结正则表达的一些基础, 部分专业术语不会翻译，就直接用英文了 参考数目可以到这里下载 首先介绍一下正则表达式WIKI ed&#160;&#160;&#160;&#160; &#160;&#160; Unix的文本编辑器, 最早引入正则表达式搜索的编辑器 grep&#160;&#160;&#160;&#160; 最早使用正则表达式的搜索工具, 其实就是把ed的搜索功能抽出来, 叫grep是因为g/re/p是ed使用正则表达式搜索时使用的命令 Egrep&#160; 随后出生于AT&#38;T Bell Labs, 在grep基础上加了n多功能 POSIX&#160; (Portable Operating System Interface for Unix)&#160; 为跨平台的正则表达式提供标准API, 一些传统工具用到这个标准, 但是在这里不提及了, 基本不会用到他 Perl&#160;&#160;&#160;&#160;&#160; 比POSIX更强大更灵活,大多高级程序设计语言中都使用类似语法, 如 Java, JavaScript, PCRE, Python, Ruby, Microsoft&#8216;s .NET Framework. 其中PCRE(Perl Compatible Regular Expressions)是仿Perl的API, 而PHP 同时支持POSIX和PCRE 在windows下我们可以用UE的正则表达式引擎, 比较容易用, 完成简单的搜索和替换 在UE -&#62;Advanced-&#62;Configuration-&#62;Search-&#62;Regular Expressions Engine中勾选Perl compatible Regular [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=4&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2><img src="http://groups.google.com/group/yuritech/web/javascript:void%280%29;" alt="" />Preface&nbsp;</h2>
<p>这里先总结正则表达的一些基础, 部分专业术语不会翻译，就直接用英文了</p>
<p>参考数目可以到<a href="http://code.google.com/p/dotnetregularexpression/downloads/list">这里</a>下载</p>
</p>
<p>首先介绍一下正则表达式WIKI</p>
<p><a href="http://en.wikipedia.org/wiki/Ed_%28text_editor%29" title="Ed (text editor)">ed</a>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Unix的文本编辑器, 最早引入正则表达式搜索的编辑器
</p>
<p><a href="http://en.wikipedia.org/wiki/Grep" title="Grep">grep</a>&nbsp;&nbsp;&nbsp;&nbsp; 最早使用正则表达式的搜索工具, 其实就是把ed的搜索功能抽出来, 叫grep是因为<code>g/<i>re</i>/p是ed使用正则表达式搜索时使用的命令</code></p>
<p><b>Egrep</b>&nbsp; 随后出生于AT&amp;T Bell Labs, 在grep基础上加了n多功能
</p>
<p><a href="http://en.wikipedia.org/wiki/POSIX" title="POSIX">POSIX</a>&nbsp; (Portable Operating System Interface for Unix)&nbsp; 为跨平台的正则表达式提供标准API, 一些传统工具用到这个标准, 但是在这里不提及了, 基本不会用到他
</p>
<p><a href="http://en.wikipedia.org/wiki/Perl" title="Perl">Perl</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比POSIX更强大更灵活,大多高级程序设计语言中都使用类似语法, 如 <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29" title="Java (programming language)">Java</a>, <a href="http://en.wikipedia.org/wiki/JavaScript" title="JavaScript">JavaScript</a>, <a href="http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions" title="Perl Compatible Regular Expressions">PCRE</a>, <a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29" title="Python (programming language)">Python</a>, <a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29" title="Ruby (programming language)">Ruby</a>, <a href="http://en.wikipedia.org/wiki/Microsoft" title="Microsoft">Microsoft</a>&#8216;s <a href="http://en.wikipedia.org/wiki/.NET_Framework" title=".NET Framework">.NET Framework</a>. 其中<b>PCRE</b>(<b>Perl Compatible Regular Expressions</b>)是仿Perl的API, 而PHP 同时支持POSIX和PCRE</p>
</p>
<p>在windows下我们可以用UE的正则表达式引擎, 比较容易用, 完成简单的搜索和替换
</p>
<p>在UE -&gt;Advanced-&gt;Configuration-&gt;Search-&gt;Regular Expressions Engine中勾选Perl compatible Regular Expressions(PCRE)
</p>
<p>因为perl对正则表达式支持的很全, 而且高级程序设计语言都跟perl的正则没有太大区别, 所以这里选择PCRE</p>
</p>
<p>这里再介绍两个可以在线测试正则表达式的网站</p>
<p><a href="http://www.rexv.org/">rexV</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持Javascript, PCRE(PHP Preg), POSIX(PHP Ereg) , 这个支持的比较好, 而且表现方式我喜欢, 就是好像有点慢
</p>
<p><a href="http://www.regextester.com/">REGex TESTER</a>&nbsp; 支持Javascript, PCRE(PHP Preg), POSIX(PHP Ereg), 不知道为啥有些应该支持的表达式不支持, 这上面还有一些参考, 和一些常用的例子, 可以看看</p>
<p><a href="http://www.regexlib.com/">regexlib</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正则表达式库, 可以搜索你想要的正则表达式, 上面也有 .NET引擎的正则测试</p>
<p><i>*前两个AJAX网站, 建议用较好支持javasript的浏览器(貌似现在最快的是safari4)&#8230;.不然计算会很慢</i>
</p>
</p>
<p>下面所有例子都刻在UE或者以上两个网上调试</p>
</p>
<p><span style="color:rgb(102,0,0);">*为了便于识别, 下面用 • 代表空格</span>
</p>
<h2>1. Start and End of the Line<br />
</h2>
<p><span style="color:rgb(255,0,0);">^</span>: 开始符号<br />
<span style="color:rgb(255,0,0);">$</span> : 结束符号<br />
由此<br />
^cat$ :&nbsp; 只匹配 cat, 而且cat占一整行<br />
^$： 匹配一行空行<br />
&nbsp;<br />
&nbsp;<span style="color:rgb(224,102,102);">^和$匹配的是位置, 而不是字符,</span> ^代表这个位置是行头, $代表这个位置是行尾<br />
 &nbsp; 所以要匹配以cat開頭，以dog結束？如 &#8220;cat run after dog&#8221;<br />
 &nbsp; 可以用^cat.*dog$, 但是这样的话&#8221;catalog of dog&#8221;也同样会被匹配上<br />
 &nbsp; 所以要匹配以cat单词開頭，以dog单词結束, 需要用到第七节的知识 </p>
<h2>2. Character Classes</h2>
<p><span style="color:rgb(255,0,0);"><span style="color:rgb(0,0,0);">用</span>[]</span>中的集合来匹配<br />
其实就是最经常见到的 <span style="color:rgb(255,0,0);">[0-9a-zA-Z]</span><br />
等价于[0123456789abcdefghijklmnopqrstuvwxyzABCDE...............], 匹配所有数字和字母。</p>
<h2>3. Negated character classes</h2>
<p><span style="color:rgb(255,0,0);">[^......]<br />
</span>字面翻译是‘<span style="color:rgb(255,0,0);">非</span>’, 这里用的符号还是<span style="color:rgb(255,0,0);">^</span>, 但是是在<span style="color:rgb(255,0,0);">[]</span>里用, 就算<span style="color:rgb(255,0,0);">非</span>的意思了<br />
q[^u]: 匹配&#8217;q'后紧跟一个character, 但不能是&#8217;u&#8217;<br />
如<br />
&nbsp;&nbsp;&nbsp; miqra<br />
&nbsp;&nbsp;&nbsp; qasida<br />
&nbsp;&nbsp;&nbsp; <span style="color:rgb(153,0,255);">zaqqum%</span><br />
但是<br />
&nbsp;&nbsp;&nbsp; Qantas</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color:rgb(153,0,255);">Iraq</span><br />
都不行<br />
&nbsp;<br />
 <i><span style="color:rgb(11,83,148);">想想如果匹配不包含后缀&#8221;.txt&#8221;&nbsp; 用 .*\.[^txt]行不行, .*\.[^t][^x][^t] 呢?</span></i><br />
<h2>4. Dot</h2>
<p><span style="color:rgb(255,0,0);">点<br />
.</span>:匹配任何字符<br />
03<span style="color:rgb(255,0,0);">.</span>19<span style="color:rgb(255,0,0);">.</span>76 匹配03[任何字符]19[任何字符]76</p>
<h2>5. Alternation</h2>
<p><span style="color:rgb(255,0,0);">|</span>:或<br />
gr[ea]y = grey<span style="color:rgb(255,0,0);">|</span>gray = gr(e<span style="color:rgb(255,0,0);">|</span>a)y<br />
这里用括号把 | 的作用域定限定在 e|a , 如果不加括号就是 gre 或 ay<br />
<tt>^From|Subject|Date 匹配</tt><tt>^From 或 Subject 或 Date</tt><br />
<tt>^(From|Subject|Date) 匹配</tt><tt>^From 或 ^Subject 或 ^Date</tt></p>
<h2>6. Ignoring Differences in Capitalization</h2>
<p>忽略大小写, 加参数i (ignore)<br />
egrep <span style="color:rgb(255,0,0);">-i</span> &#8216;from&#8217;&nbsp; 将匹配<tt>[Ff][Rr][Oo][Mm]</tt><br />
egrep 命令行是这么加 i 参数<br />
而在UE中直接不勾Match Case就可以<br />
用 <a href="http://www.rexv.org/">rexV</a>&nbsp; 和&nbsp; <a href="http://www.regextester.com/">REGex TESTER</a> 勾选 i 就可以了<br />
在C#怎么用到后面会讲到</p>
<h2>7. Word Boundaries</h2>
<p>单词界</p>
<p><span style="color:rgb(255,0,0);">\&lt;\&gt;</span> <span style="color:rgb(255,0,0);"> \b\b</span><br />
\&lt;cat\&gt; 只匹配整个单词cat<br />
这个我以前没见过&#8230;.话说最近的egrep版本才有这个功能&#8230;&#8230;</p>
<p>下图很好的解释了哪些地方算是单词界</p>
<h2><a href="http://groups.google.com/group/yuritech/web/index.jpeg"><img src="http://groups.google.com/group/yuritech/web/index.jpeg" border="0" /></a></h2>
<p>egrep 和grep 中用的是<span style="color:rgb(255,0,0);">\&lt;\&gt;</span><br />
但是在 PCRE 中 都是<span style="color:rgb(255,0,0);"> \b\b</span><br />
用 \B 表示 \b的非</p>
<h2>8. Optional Items</h2>
<p><span style="color:rgb(255,0,0);">?</span>&nbsp; 可有可无<br />
colo<span style="color:rgb(255,0,0);">u?</span>r&nbsp; 匹配 color 和 colour</p>
<h2>9. Repetition</h2>
<p><tt><span style="color:rgb(255,0,0);">*</span> 重复0次以上</tt></p>
<p><span style="color:rgb(255,0,0);">+</span>&nbsp; 重复1次以上<br />
<span style="color:rgb(255,0,0);">{}</span>&nbsp; 范围重复</p>
<p><tt>[0-9]* 匹配所有数字,而且还可以没有<br />
</tt><tt>[0-9]+ 匹配所有数字,至少得有一个数字</tt><br />
<tt>[a-zA-Z]{1,5} 匹配1到5个字母</tt></p>
<h2>10. Parentheses and Backreferences</h2>
<p>括号和回调(我是这么翻译的&#8230;&#8230;)<br />
匹配与前面相同的某一部分<br />
\&lt;([A-Za-z]+)&#8217;s•+\1\&gt; 就可以匹配What&#8217;s What<br />
\1只匹配与([A-Za-z]+)匹配过的相同的字符, 所以What&#8217;s that就不能匹配成功</p>
<p>*egrep命令行记得要用双引号把表达式括起来, 否则单引号会转义<br />
&nbsp;&nbsp;&nbsp;&nbsp; %egrep &#8220;\&lt;([A-Za-z]+)&#8217;s•+\1\&gt;&#8221; wordlist<br />
<i>想想\&lt;([A-Za-z]+)&#8217;s(•*)\1\2\&gt;匹配 What&#8217;s•What</i><i>•</i><i>吗?</i></p>
<h2>11. The Great Escape</h2>
<p>转义<br />
括号()在正则中将会被转义表示优先, 在他们前面加反斜杠来防止被转义<br />
如\(cool\) 就可以匹配(cool)</p>
<p>而一些没有转义意义的字符加反斜杠则会有特定的转义<br />
如之前学的一些 \&lt;&nbsp; \&gt;&nbsp; \1 \2&nbsp; 等等</p>
<h2><b>总结</b></h2>
<p>下面是不同工具对上述基本表达式的支持, 左边4个都是unix系统常用的工具<br />
可见右边的3种高级程序语言用所支持的都没有区别</p>
<h2><a href="http://groups.google.com/group/yuritech/web/flavor.jpg"><img src="http://groups.google.com/group/yuritech/web/flavor.jpg" border="0" /></a><span style="color:rgb(255,0,0);"></span></h2>
<p><img src="http://groups.google.com/group/yuritech/web/javascript:void%280%29;" alt="" /><img src="http://groups.google.com/group/yuritech/web/javascript:void%280%29;" alt="" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oyanglulu.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oyanglulu.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/oyanglulu.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/oyanglulu.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oyanglulu.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oyanglulu.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oyanglulu.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oyanglulu.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oyanglulu.wordpress.com&amp;blog=7244288&amp;post=4&amp;subd=oyanglulu&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://oyanglulu.wordpress.com/2009/04/05/regular-expressions-basic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e181d174303811fefaefb0b3a91ce567?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">oyanglulu</media:title>
		</media:content>

		<media:content url="http://groups.google.com/group/yuritech/web/javascript:void%280%29;" medium="image" />

		<media:content url="http://groups.google.com/group/yuritech/web/index.jpeg" medium="image" />

		<media:content url="http://groups.google.com/group/yuritech/web/flavor.jpg" medium="image" />

		<media:content url="http://groups.google.com/group/yuritech/web/javascript:void%280%29;" medium="image" />

		<media:content url="http://groups.google.com/group/yuritech/web/javascript:void%280%29;" medium="image" />
	</item>
	</channel>
</rss>
