<?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>S.F.F.S. -- Selene Fox Free Spaces</title>
	<atom:link href="http://selenefox.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://selenefox.wordpress.com</link>
	<description>Just myself</description>
	<lastBuildDate>Mon, 20 Feb 2012 13:09:17 +0000</lastBuildDate>
	<language>zh-cn</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='selenefox.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/1bcc8fdc8efe29e984568678a9200bf1?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>S.F.F.S. -- Selene Fox Free Spaces</title>
		<link>http://selenefox.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://selenefox.wordpress.com/osd.xml" title="S.F.F.S. -- Selene Fox Free Spaces" />
	<atom:link rel='hub' href='http://selenefox.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Google App Engine</title>
		<link>http://selenefox.wordpress.com/2012/02/20/google-app-engine/</link>
		<comments>http://selenefox.wordpress.com/2012/02/20/google-app-engine/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 13:09:15 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sping]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=362</guid>
		<description><![CDATA[最近都着迷于GoogleApp Engine的使用。在部署完代理程序之后，着手编写自己的加密代理，以备不时之需。因为在写代理的时候就用到了Servlet做成程序的核心，今天就突发奇想的想，既然Servlet可以运行，那么在GoogleApp上加载Sping+struts2的Web框架应该也是可以的，然后在成功加载完Sping后发现struts2在return后找不到页面，界面也出现从没见过的错误信息，估计是有些模块没有被正确的启动造成的，虽然说GoogleApp Engine类似java的容器，毕竟有自己的框架，在网上找到了些资料，在Servlet的监听contextInitialized事件中增加 OgnlRuntime.setSecurityManager(null)；就可以让struts2正常的工作了。现在就只剩下数据持久层还没有涉及，打算把给朋友写的摇奖程序般到GoogleApp Engine上，这样就可以直接让朋友使用而不需要在电脑上开个Tomcat或者是jBoss什么的来运行一个网络程序来。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=362&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>最近都着迷于GoogleApp Engine的使用。在部署完代理程序之后，着手编写自己的加密代理，以备不时之需。因为在写代理的时候就用到了Servlet做成程序的核心，今天就突发奇想的想，既然Servlet可以运行，那么在GoogleApp上加载Sping+struts2的Web框架应该也是可以的，然后在成功加载完Sping后发现struts2在return后找不到页面，界面也出现从没见过的错误信息，估计是有些模块没有被正确的启动造成的，虽然说GoogleApp Engine类似java的容器，毕竟有自己的框架，在网上找到了些资料，在Servlet的监听contextInitialized事件中增加 OgnlRuntime.setSecurityManager(null)；就可以让struts2正常的工作了。现在就只剩下数据持久层还没有涉及，打算把给朋友写的摇奖程序般到GoogleApp Engine上，这样就可以直接让朋友使用而不需要在电脑上开个Tomcat或者是jBoss什么的来运行一个网络程序来。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/362/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=362&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2012/02/20/google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>回归WordPress</title>
		<link>http://selenefox.wordpress.com/2012/02/20/%e5%9b%9e%e5%bd%92wordpress/</link>
		<comments>http://selenefox.wordpress.com/2012/02/20/%e5%9b%9e%e5%bd%92wordpress/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 12:40:38 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=356</guid>
		<description><![CDATA[好久没有更新自己的blog了，又有好多事情发生，呵呵，最棒的事情应该就是SeleneFox2.0的诞生了吧哈哈哈哈。。。。。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=356&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>好久没有更新自己的blog了，又有好多事情发生，呵呵，最棒的事情应该就是SeleneFox2.0的诞生了吧哈哈哈哈。。。。。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/356/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=356&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2012/02/20/%e5%9b%9e%e5%bd%92wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>深入理解iPhone数据持久化</title>
		<link>http://selenefox.wordpress.com/2011/05/31/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3iphone%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%8c%96/</link>
		<comments>http://selenefox.wordpress.com/2011/05/31/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3iphone%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%8c%96/#comments</comments>
		<pubDate>Tue, 31 May 2011 10:00:22 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/2011/05/31/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3iphone%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%8c%96/</guid>
		<description><![CDATA[在所有的移动开发平台数据持久化都是很重要的部分：在j2me中是rms或保存在应用程序的目录中，在symbian中可以保存在相应的磁盘目录中和数据库中。symbian中因为权限认证的原因，在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。在iphone中，apple博采众长，提供了多种数据持久化的方法，下面笔者会逐个进行详细的讲解。 iphone提供的数据持久化的方法，从数据保存的方式上讲可以分为三大部分：属性列表、对象归档、嵌入式数据库(SQLite3)、其他方法。 一、属性列表NSUserDefaults NSUserDefaults类的使用和NSKeyedArchiver有很多类似之处，但是查看NSUserDefaults的定义可以看出，NSUserDefaults直接继承自NSObject而NSKeyedArchiver 继承自NSCoder。这意味着NSKeyedArchiver实际上是个归档持久化的类，也就可以使用NSCoder类的［encodeObject: (id)objv forKey:(NSString *)key］方法来对数据进行持久化存储。 - (void)applicationDidFinishLaunching:(UIApplication *)application { NSString *strOne = @”Persistent data1″; NSString *strTwo = @”Persistent data 2″; NSMutableArray *persistentArray = [[NSMutableArray alloc] init]; [persistentArray addObject:strOne]; [persistentArray addObject:strTwo]; //archive NSUserDefaults *persistentDefaults = [NSUserDefaults standardUserDefaults]; [persistentDefaults setObject:persistentArray forKey:@"myDefault"]; NSString *descriptionDefault = [persistentDefaults description]; NSLog(@”NSUserDefaults description is :%@”,descriptionDefault); //unarchive NSArray *UnpersistentArray = [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=357&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>在所有的移动开发平台数据持久化都是很重要的部分：在j2me中是rms或保存在应用程序的目录中，在symbian中可以保存在相应的磁盘目录中和数据库中。symbian中因为权限认证的原因，在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。在iphone中，apple博采众长，提供了多种数据持久化的方法，下面笔者会逐个进行详细的讲解。</p>
<p>iphone提供的数据持久化的方法，从数据保存的方式上讲可以分为三大部分：属性列表、对象归档、嵌入式数据库(SQLite3)、其他方法。</p>
<p>一<strong>、属性列表NSUserDefaults</strong></p>
<p>NSUserDefaults类的使用和NSKeyedArchiver有很多类似之处，但是查看NSUserDefaults的定义可以看出，NSUserDefaults直接继承自NSObject而NSKeyedArchiver 继承自NSCoder。这意味着NSKeyedArchiver实际上是个归档持久化的类，也就可以使用NSCoder类的［encodeObject: (id)objv forKey:(NSString *)key］方法来对数据进行持久化存储。</p>
<p>- (void)applicationDidFinishLaunching:(UIApplication *)application {<br />
NSString *strOne = @”Persistent data1″;<br />
NSString *strTwo = @”Persistent data 2″;</p>
<p>NSMutableArray *persistentArray = [[NSMutableArray alloc] init];<br />
[persistentArray addObject:strOne];<br />
[persistentArray addObject:strTwo];</p>
<p>//archive<br />
NSUserDefaults *persistentDefaults = [NSUserDefaults standardUserDefaults];<br />
[persistentDefaults setObject:persistentArray forKey:@"myDefault"];<br />
NSString *descriptionDefault = [persistentDefaults description];<br />
NSLog(@”NSUserDefaults description is :%@”,descriptionDefault);</p>
<p>//unarchive<br />
NSArray *UnpersistentArray =</p>
<p>[persistentDefaults objectForKey:@"myDefault"];<br />
NSString *UnstrOne = [UnpersistentArray objectAtIndex:0];<br />
NSString *UnstrTwo = [UnpersistentArray objectAtIndex:1];</p>
<p>NSLog(@”UnstrOne = %@,UnstrTwo = %@”,UnstrOne,UnstrTwo);</p>
<p>// Override point for customization after application launch<br />
[window makeKeyAndVisible];<br />
}</p>
<p><strong><br />
二、对象归档NSKeyedArchiver和NSKeyedUnarchiver</strong></p>
<p>iPhone和symbian 3rd一样，会为每一个应用程序生成一个私有目录，这个目录位于</p>
<p>/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications下，并随即生成一个数字字母串作为目录名，在每一次应用程序启动时，这个字母数字串都是不同于上一次的，上一次的应用程序目录信息被转换成名为.DS_Store隐藏文件，这个目录的文件结构如下图：<br />
通常使用Documents目录进行数据持久化的保存，而这个Documents目录可以通过NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask,YES)得到，代码如下：</p>
<p>- (void)applicationDidFinishLaunching:(UIApplication *)application {<br />
NSString *strOne = @”Persistent data1″;<br />
NSString *strTwo = @”Persistent data 2″;</p>
<p>NSArray *persistentArray = [NSArray arrayWithObjects:strOne,strTwo,nil];<br />
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSAllDomainsMask, YES);</p>
<p>int pathLen = [pathArray count];</p>
<p>NSLog(@”path number is :%d”,pathLen);</p>
<p>NSString *filePath;</p>
<p>for(int i = 0; i &lt; pathLen; i++)<br />
{<br />
filePath = [pathArray objectAtIndex:i];<br />
NSLog(@”%d path is :%@”,i,filePath);<br />
}</p>
<p>NSString *myFilename = [filePath stringByAppendingPathComponent:@"myFile.rtf"];</p>
<p>NSLog(@”myfile’s path is :%@”,myFilename);</p>
<p>// no files generated in correspond directory now</p>
<p>[NSKeyedArchiver archiveRootObject:persistentArray toFile:myFilename];<br />
// now the myFile.rtf is generated</p>
<p>// Override point for customization after application launch<br />
[window makeKeyAndVisible];<br />
}</p>
<p>NSSearchPathForDirectoriesInDomains()的第二个参数是个枚举值，在笔者的测试代码中，只有NSUserDomainMask和NSAllDomainsMask可以获取到目录数为1，其余的皆为0，打印出来的结果如下：</p>
<p>[Session started at 2009-11-10 21:30:08 +0800.]<br />
2009-11-10 21:30:10.516 PersistentExample[763:207] path number is :1<br />
2009-11-10 21:30:10.518 PersistentExample[763:207] 0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/C93DC783-F137-4660-AE5A-08C3E11C774B/Documents<br />
2009-11-10 21:30:10.521 PersistentExample[763:207] myfile’s path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/C93DC783-F137-4660-AE5A-08C3E11C774B/Documents/myFile.rtf<br />
Terminating in response to SpringBoard’s termination.</p>
<p>[Session started at 2009-11-10 21:32:27 +0800.]<br />
2009-11-10 21:32:30.091 PersistentExample[803:207] path number is :1<br />
2009-11-10 21:32:30.092 PersistentExample[803:207] 0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/763E6772-E754-452F-8532-80C2CE4466B5/Documents<br />
2009-11-10 21:32:30.100 PersistentExample[803:207] myfile’s path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/763E6772-E754-452F-8532-80C2CE4466B5/Documents/myFile.rtf<br />
Terminating in response to SpringBoard’s termination.<br />
从打印的结果如下，每次应用程序启动时生成的数字字母串目录名字并不一样。在调用[NSKeyedArchiver archiveRootObject:persistentArray toFile:myFilename]方法前，文件myFile.rtf并每生成，只有在调用此方法后才产生相应的文件。</p>
<p>下面需要把数据从属性列表中读取出来，在上面的代码中，笔者使用NSArray保存数据。但在大多数应用程序中，数据的尺寸并不是固定的，这个时候就需要使用NSMutalbeArray动态的保存数据，代码优化如下：</p>
<p>- (void)applicationDidFinishLaunching:(UIApplication *)application {<br />
NSString *myFilename;<br />
// archive<br />
{<br />
NSString *strOne = @”Persistent data1″;<br />
NSString *strTwo = @”Persistent data 2″;</p>
<p>NSMutableArray *persistentArray = [[NSMutableArray alloc] init];<br />
[persistentArray addObject:strOne];<br />
[persistentArray addObject:strTwo];</p>
<p>NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSAllDomainsMask, YES);</p>
<p>int pathLen = [pathArray count];<br />
NSLog(@”path number is :%d”,pathLen);</p>
<p>NSString *filePath;</p>
<p>for(int i = 0; i &lt; pathLen; i++)<br />
{<br />
filePath = [pathArray objectAtIndex:i];</p>
<p>NSLog(@”%d path is :%@”,i,filePath);<br />
}</p>
<p>myFilename = [filePath stringByAppendingPathComponent:@"myFile.rtf"];</p>
<p>NSLog(@”myfile’s path is :%@”,myFilename);</p>
<p>[NSKeyedArchiver archiveRootObject:persistentArray toFile:myFilename];<br />
}</p>
<p>// unarchive<br />
{<br />
NSArray *unarchiveArray = [NSKeyedUnarchiver unarchiveObjectWithFile:myFilename];<br />
NSString *UnstrOne = [unarchiveArray objectAtIndex:0];<br />
NSString *UnstrTwo = [unarchiveArray objectAtIndex:1];</p>
<p>NSLog(@”UnstrOne = %@,UnstrTwo = %@”,UnstrOne,UnstrTwo);<br />
}</p>
<p>// Override point for customization after application launch<br />
[window makeKeyAndVisible];<br />
}</p>
<p>输出结果如下：</p>
<p>[Session started at 2009-11-10 22:41:57 +0800.]<br />
2009-11-10 22:41:59.344 PersistentExample[1082:207] path number is :1<br />
2009-11-10 22:41:59.346 PersistentExample[1082:207] 0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/055CD17C-864E-4A83-ABF0-5F01EE85BD5A/Documents<br />
2009-11-10 22:41:59.355 PersistentExample[1082:207] myfile’s path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/055CD17C-864E-4A83-ABF0-5F01EE85BD5A/Documents/myFile.rtf<br />
2009-11-10 22:41:59.357 PersistentExample[1082:207] UnstrOne = Persistent data1,UnstrTwo = Persistent data 2<br />
Terminating in response to SpringBoard’s termination.<br />
从上面的图中可以看到，目录中还有个tmp目录，读者也可以把数据保存在tmp目录中，获取这个目录使用NSTemporaryDirectory()方法。<br />
<strong>三、嵌入式数据库(SQLite3)</strong></p>
<p>嵌入式数据库持久化数据就是把数据保存在iphone的嵌入式数据库系统SQLite3中，本质上来说，数据库持久化操作是基于文件持久化基础之上的。<br />
要使用嵌入式数据库SQLite3，首先需要加载其动态库libsqlite3.dylib，这个文件位于/Xcode3.1.4/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/lib目录下。在Framework文件夹上右击，选择“Adding-&gt;Existing Files…”，定位到上述目录并加载到文件夹。</p>
<p>首先在头文件中做如下修改：</p>
<p>#import &lt;UIKit/UIKit.h&gt;</p>
<p>#include “sqlite3.h”<br />
#define kFileName @”mydb.sql”</p>
<p>@interface PersistentExampleAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {<br />
sqlite3 *database;<br />
UIWindow *window;<br />
}</p>
<p>@property (nonatomic, retain) IBOutlet UIWindow *window;</p>
<p>@end</p>
<p>- (void)applicationDidFinishLaunching:(UIApplication *)application {</p>
<p>NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />
NSString *paths = [[path objectAtIndex:0] stringByAppendingPathComponent:kFileName];</p>
<p>NSFileManager *fileManager = [NSFileManager defaultManager];<br />
BOOL findFile = [fileManager fileExistsAtPath:paths];</p>
<p>NSLog(@”Database file path = %@”,paths);</p>
<p>// 如果找到了数据库文件<br />
if(findFile)<br />
{<br />
NSLog(@”Database file have already existed.”);</p>
<p>if(sqlite3_open([paths UTF8String], &amp;database) != SQLITE_OK)//打开数据库失败<br />
{<br />
sqlite3_close(database);<br />
NSAssert(0,@”Failed to open database”);<br />
}<br />
}else<br />
{<br />
NSLog(@”Database file does not exsit!”);<br />
if(sqlite3_open([paths UTF8String], &amp;database) != SQLITE_OK)//打开数据库失败<br />
{<br />
sqlite3_close(database);<br />
NSAssert(0,@”Failed to open database”);<br />
}<br />
}</p>
<p>char *errorMsg;</p>
<p>//创建表<br />
NSString *createSQL = @”create table if not exists fields (row integer primary key, field_data text);”;<br />
if(sqlite3_exec(database, [createSQL UTF8String],NULL,NULL,&amp;errorMsg)!=SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSAssert1(0,@”Error creating table: %s”,errorMsg);<br />
}</p>
<p>NSString *strOne = @”Persistent data1″;<br />
NSString *strTwo = @”Persistent data 2″;</p>
<p>NSMutableArray *persistentArray = [[NSMutableArray alloc] init];<br />
[persistentArray addObject:strOne];<br />
[persistentArray addObject:strTwo];</p>
<p>for (int i = 0; i &lt; [persistentArray count]; i++) {<br />
NSString *upDataSQL = [[NSString alloc] initWithFormat:@”insert or replace into</p>
<p>fields (row,field_data) values (%d,’%@’);”,i,[persistentArray objectAtIndex:i]];<br />
char* errorMsg;<br />
if(sqlite3_exec(database,[upDataSQL UTF8String],NULL,NULL,&amp;errorMsg)</p>
<p>!= SQLITE_OK)<br />
{<br />
sqlite3_close(database);<br />
NSAssert(0,@”Failed to open database”);<br />
}<br />
}</p>
<p>//unarchive<br />
NSString *query = @”select row, field_data from fields order by row”;//查找表中的数据<br />
sqlite3_stmt *statement;<br />
if(sqlite3_prepare_v2(database, [query UTF8String], -1, &amp;statement, nil)</p>
<p>== SQLITE_OK)<br />
{<br />
while(sqlite3_step(statement) == SQLITE_ROW)<br />
{<br />
int row = sqlite3_column_int(statement, 0);<br />
char *rowData = (char *)sqlite3_column_text(statement, 1);</p>
<p>NSString *fieldName = [[NSString alloc] initWithFormat:@”show%d”,row];<br />
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];</p>
<p>NSLog(@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue);</p>
<p>[fieldName release];<br />
[fieldValue release];<br />
}<br />
sqlite3_finalize(statement);<br />
}</p>
<p>// Override point for customization after application launch<br />
[window makeKeyAndVisible];<br />
}<br />
在上面的代码中，我们使用<br />
NSFileManager *fileManager = [NSFileManager defaultManager];<br />
BOOL findFile = [fileManager fileExistsAtPath:paths];<br />
来判断数据库文件是否已经存在，其实在大多数情况下是没有必要的，sqlite3_open()方法会自动帮我们判断数据库文件是否存在，如果不存在则创建心的数据库文件。<br />
<strong><br />
四、其它方法</strong></p>
<p>除了上面的三种方法来保存持久化数据以外，我们还可以用写文件到磁盘的方式来保存持久化数据。</p>
<p>- (void)applicationDidFinishLaunching:(UIApplication *)application {</p>
<p>NSString *strOne = @”Persistent data1″;<br />
NSString *strTwo = @”Persistent data 2″;</p>
<p>NSMutableArray *persistentArray = [[NSMutableArray alloc] init];<br />
[persistentArray addObject:strOne];<br />
[persistentArray addObject:strTwo];</p>
<p>NSArray *filePathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />
NSString *filePath =</p>
<p>- [[filePathArray objectAtIndex:0] stringByAppendingPathComponent:@”mydatas.plist”];</p>
<p>[[NSArray arrayWithObjects:persistentArray,nil] writeToFile:filePath atomically:NO];</p>
<p>//load<br />
NSMutableArray *saveDataArray = [[NSMutableArray alloc] init];<br />
if([[NSFileManager defaultManager] fileExistsAtPath:filePath])<br />
saveDataArray = [NSMutableArray arrayWithContentsOfFile:filePath];<br />
else<br />
saveDataArray = [NSMutableArray arrayWithContentsOfFile:[[NSBundle</p>
<p style="margin:0 0 10px;padding:0;">-                  mainBundle] pathForResource:@”Savedatas” ofType:@”plist”]];</p>
<p>-<br />
NSArray *strArray = [saveDataArray objectAtIndex:0];</p>
<p>NSString *UnstrOne = [strArray objectAtIndex:0];<br />
NSString *UnstrTwo = [strArray objectAtIndex:1];</p>
<p>// Override point for customization after application launch<br />
[window makeKeyAndVisible];<br />
}</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/357/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/357/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/357/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=357&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/05/31/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3iphone%e6%95%b0%e6%8d%ae%e6%8c%81%e4%b9%85%e5%8c%96/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>艺术性的提问</title>
		<link>http://selenefox.wordpress.com/2011/05/05/%e8%89%ba%e6%9c%af%e6%80%a7%e7%9a%84%e6%8f%90%e9%97%ae/</link>
		<comments>http://selenefox.wordpress.com/2011/05/05/%e8%89%ba%e6%9c%af%e6%80%a7%e7%9a%84%e6%8f%90%e9%97%ae/#comments</comments>
		<pubDate>Thu, 05 May 2011 00:50:00 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=354</guid>
		<description><![CDATA[我同事告诉我，现在相亲女方不再SB地直接问男方是否有房有车，而是问：你们小区停车费多少钱一个月？我一听，震精了。这问题太TM有艺术性了！<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=354&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>我同事告诉我，现在相亲女方不再SB地直接问男方是否有房有车，而是问：你们小区停车费多少钱一个月？我一听，震精了。这问题太TM有艺术性了！</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/354/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/354/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/354/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/354/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/354/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/354/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/354/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/354/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=354&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/05/05/%e8%89%ba%e6%9c%af%e6%80%a7%e7%9a%84%e6%8f%90%e9%97%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>放假喽</title>
		<link>http://selenefox.wordpress.com/2011/04/29/%e6%94%be%e5%81%87%e5%96%bd/</link>
		<comments>http://selenefox.wordpress.com/2011/04/29/%e6%94%be%e5%81%87%e5%96%bd/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 05:51:05 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=351</guid>
		<description><![CDATA[什么项目啊，文档啊，邮件啊~~~全部~~全部丢开~~~ 终于可以休息休息了<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=351&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>什么项目啊，文档啊，邮件啊~~~全部~~全部丢开~~~ 终于可以休息休息了</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/351/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/351/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/351/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=351&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/04/29/%e6%94%be%e5%81%87%e5%96%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>Quartz的任务时间调度配置信息</title>
		<link>http://selenefox.wordpress.com/2011/04/12/quartz%e7%9a%84%e4%bb%bb%e5%8a%a1%e6%97%b6%e9%97%b4%e8%b0%83%e5%ba%a6%e9%85%8d%e7%bd%ae%e4%bf%a1%e6%81%af/</link>
		<comments>http://selenefox.wordpress.com/2011/04/12/quartz%e7%9a%84%e4%bb%bb%e5%8a%a1%e6%97%b6%e9%97%b4%e8%b0%83%e5%ba%a6%e9%85%8d%e7%bd%ae%e4%bf%a1%e6%81%af/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 11:03:11 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=343</guid>
		<description><![CDATA[给公司写的OA系统中需要用到Quartz进行任务调度，因此又一次去找里面的配置信息，于是放这里，方便以后查询。 字段 允许值 允许的特殊字符 秒 0-59 , &#8211; * / 分 0-59 , &#8211; * / 小时 0-23 , &#8211; * / 日期 1-31 , &#8211; * ? / L W C 月份 1-12 或者 JAN-DEC , &#8211; * / 星期 1-7 或者 SUN-SAT , &#8211; * ? / L C # 年（可选） 留空, 1970-2099 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=343&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>给公司写的OA系统中需要用到Quartz进行任务调度，因此又一次去找里面的配置信息，于是放这里，方便以后查询。<br />
字段 允许值 允许的特殊字符<br />
秒 0-59 , &#8211; * /<br />
分 0-59 , &#8211; * /<br />
小时 0-23 , &#8211; * /<br />
日期 1-31 , &#8211; * ? / L W C<br />
月份 1-12 或者 JAN-DEC , &#8211; * /<br />
星期 1-7 或者 SUN-SAT , &#8211; * ? / L C #<br />
年（可选） 留空, 1970-2099 , &#8211; * /<br />
表达式意义<br />
&#8220;0 0 12 * * ?&#8221; 每天中午12点触发<br />
&#8220;0 15 10 ? * *&#8221; 每天上午10:15触发<br />
&#8220;0 15 10 * * ?&#8221; 每天上午10:15触发<br />
&#8220;0 15 10 * * ? *&#8221; 每天上午10:15触发<br />
&#8220;0 15 10 * * ? 2005&#8243; 2005年的每天上午10:15触发<br />
&#8220;0 * 14 * * ?&#8221; 在每天下午2点到下午2:59期间的每1分钟触发<br />
&#8220;0 0/5 14 * * ?&#8221; 在每天下午2点到下午2:55期间的每5分钟触发<br />
&#8220;0 0/5 14,18 * * ?&#8221; 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发<br />
&#8220;0 0-5 14 * * ?&#8221; 在每天下午2点到下午2:05期间的每1分钟触发<br />
&#8220;0 10,44 14 ? 3 WED&#8221; 每年三月的星期三的下午2:10和2:44触发<br />
&#8220;0 15 10 ? * MON-FRI&#8221; 周一至周五的上午10:15触发<br />
&#8220;0 15 10 15 * ?&#8221; 每月15日上午10:15触发<br />
&#8220;0 15 10 L * ?&#8221; 每月最后一日的上午10:15触发<br />
&#8220;0 15 10 ? * 6L&#8221; 每月的最后一个星期五上午10:15触发<br />
&#8220;0 15 10 ? * 6L 2002-2005&#8243; 2002年至2005年的每月的最后一个星期五上午10:15触发<br />
&#8220;0 15 10 ? * 6#3&#8243; 每月的第三个星期五上午10:15触发<br />
每天早上6点<br />
0 6 * * *<br />
每两个小时<br />
0 */2 * * *<br />
晚上11点到早上8点之间每两个小时，早上八点<br />
0 23-7/2，8 * * *<br />
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点<br />
0 11 4 * 1-3<br />
1月1日早上4点<br />
0 4 1 1 *</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/343/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=343&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/04/12/quartz%e7%9a%84%e4%bb%bb%e5%8a%a1%e6%97%b6%e9%97%b4%e8%b0%83%e5%ba%a6%e9%85%8d%e7%bd%ae%e4%bf%a1%e6%81%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>忙碌的日子</title>
		<link>http://selenefox.wordpress.com/2011/04/12/%e5%bf%99%e7%a2%8c%e7%9a%84%e6%97%a5%e5%ad%90/</link>
		<comments>http://selenefox.wordpress.com/2011/04/12/%e5%bf%99%e7%a2%8c%e7%9a%84%e6%97%a5%e5%ad%90/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 00:43:47 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=344</guid>
		<description><![CDATA[天天加班到晚上九点，实行大小周，我觉的自己又回到了小学读书时代，可能最现在觉的最幸福的时刻应该就是躺床上的时刻了。周末也已经没有精力外出，大部分的时间就是窝在被窝里睡觉了。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=344&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>天天加班到晚上九点，实行大小周，我觉的自己又回到了小学读书时代，可能最现在觉的最幸福的时刻应该就是躺床上的时刻了。周末也已经没有精力外出，大部分的时间就是窝在被窝里睡觉了。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/344/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=344&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/04/12/%e5%bf%99%e7%a2%8c%e7%9a%84%e6%97%a5%e5%ad%90/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>链接池(DBCP)配置参考</title>
		<link>http://selenefox.wordpress.com/2011/03/18/%e9%93%be%e6%8e%a5%e6%b1%a0dbcp%e9%85%8d%e7%bd%ae%e5%8f%82%e8%80%83/</link>
		<comments>http://selenefox.wordpress.com/2011/03/18/%e9%93%be%e6%8e%a5%e6%b1%a0dbcp%e9%85%8d%e7%bd%ae%e5%8f%82%e8%80%83/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 07:15:41 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[JavaEE]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=338</guid>
		<description><![CDATA[tomcat Context.xml中配置Resource中的参数定义 username 传递给JDBC驱动的用于建立连接的用户名 password 传递给JDBC驱动的用于建立连接的密码 url 传递给JDBC驱动的用于建立连接的URL driverClassName 使用的JDBC驱动的完整有效的java 类名 connectionProperties 当建立新连接时被发送给JDBC驱动的连接参数，格式必须是 [propertyName=property;]* defaultAutoCommit true 连接池创建的连接的默认的auto-commit状态 defaultReadOnly 驱动默认 连接池创建的连接的默认的read-only状态. 如果没有设置则setReadOnly方法将不会被调用. (某些驱动不支持只读模式,比如:Informix) defaultTransactionIsolation 驱动默认 连接池创建的连接的默认的TransactionIsolation状态. 下面列表当中的某一个: (参考javadoc)&#160; ● NONE ● READ_COMMITTED ● READ_UNCOMMITTED ● REPEATABLE_READ ● SERIALIZABLE defaultCatalog 连接池创建的连接的默认的catalog initialSize 0 初始化连接:连接池启动时创建的初始化连接数量,1.2版本后支持 maxActive 8 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制 maxIdle 8 最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制 minIdle 0 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建 maxWait 无限 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待 validationQuery SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录 testOnBorrow true [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=338&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>tomcat Context.xml中配置Resource中的参数定义</p>
<table border="1" cellspacing="1" cellpadding="0" width="80%">
<tbody>
<tr>
<td><strong>username</strong></td>
<td>传递给JDBC驱动的用于建立连接的用户名</td>
</tr>
<tr>
<td><strong>password</strong></td>
<td>传递给JDBC驱动的用于建立连接的密码</td>
</tr>
<tr>
<td><strong>url</strong></td>
<td>传递给JDBC驱动的用于建立连接的URL</td>
</tr>
<tr>
<td><strong>driverClassName</strong></td>
<td>使用的JDBC驱动的完整有效的java 类名</td>
</tr>
<tr>
<td>connectionProperties</td>
<td>当建立新连接时被发送给JDBC驱动的连接参数，格式必须是   [propertyName=property;]*</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>defaultAutoCommit</strong></td>
<td>true</td>
<td>连接池创建的连接的默认的auto-commit状态</td>
</tr>
<tr>
<td><strong>defaultReadOnly </strong></td>
<td>驱动默认</td>
<td>连接池创建的连接的默认的read-only状态. 如果没有设置则setReadOnly方法将不会被调用. (某些驱动不支持只读模式,比如:Informix)</td>
</tr>
<tr>
<td><strong>defaultTransactionIsolation</strong></td>
<td>驱动默认</td>
<td>连接池创建的连接的默认的TransactionIsolation状态. 下面列表当中的某一个: (参考javadoc)&nbsp;</p>
<p>● NONE<br />
● READ_COMMITTED<br />
● READ_UNCOMMITTED<br />
● REPEATABLE_READ<br />
● SERIALIZABLE</td>
</tr>
<tr>
<td><strong>defaultCatalog</strong></td>
<td></td>
<td>连接池创建的连接的默认的catalog</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>initialSize</strong></td>
<td>0</td>
<td>初始化连接:连接池启动时创建的初始化连接数量,1.2版本后支持</td>
</tr>
<tr>
<td><strong>maxActive</strong></td>
<td>8</td>
<td>最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制</td>
</tr>
<tr>
<td><strong>maxIdle</strong></td>
<td>8</td>
<td>最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制</td>
</tr>
<tr>
<td><strong>minIdle</strong></td>
<td>0</td>
<td>最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建</td>
</tr>
<tr>
<td><strong>maxWait</strong></td>
<td>无限</td>
<td>最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>validationQuery</strong></td>
<td></td>
<td>SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录</td>
</tr>
<tr>
<td><strong>testOnBorrow</strong></td>
<td>true</td>
<td>指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串</td>
</tr>
<tr>
<td><strong>testOnReturn</strong></td>
<td>false</td>
<td>指明是否在归还到池中前进行检验注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串</td>
</tr>
<tr>
<td><strong>testWhileIdle</strong></td>
<td>false</td>
<td>指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串</td>
</tr>
<tr>
<td><strong>timeBetweenEvictionRunsMillis</strong></td>
<td>-1</td>
<td>在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程</td>
</tr>
<tr>
<td><strong>numTestsPerEvictionRun</strong></td>
<td>3</td>
<td>在每次空闲连接回收器线程(如果有)运行时检查的连接数量</td>
</tr>
<tr>
<td><strong>minEvictableIdleTimeMillis</strong></td>
<td>1000 * 60 * 30</td>
<td>连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值，单位毫秒</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>poolPreparedStatements</strong></td>
<td>false</td>
<td>开启池的prepared statement 池功能</td>
</tr>
<tr>
<td><strong>maxOpenPreparedStatements</strong></td>
<td>无限制</td>
<td>statement池能够同时分配的打开的statements的最大数量, 如果设置为0表示不限制</td>
</tr>
</tbody>
</table>
<p>这里可以开启PreparedStatements池. 当开启时, 将为每个连接创建一个statement池,并且被下面方法创建的PreparedStatements将被缓存起来:</p>
<p>● public PreparedStatement prepareStatement(String sql)<br />
● public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)</p>
<p>注意: 确认连接还有剩余资源可以留给其他statement。</p>
<table border="1" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>accessToUnderlyingConnectionAllowed </strong></td>
<td>false</td>
<td>控制PoolGuard是否容许获取底层连接</td>
</tr>
</tbody>
</table>
<p>如果容许则可以使用下面的方式来获取底层连接:</p>
<p>Connection conn = ds.getConnection();<br />
Connection dconn = ((DelegatingConnection)conn).getInnermostDelegate();<br />
&#8230;<br />
conn.close();</p>
<p>默认false不开启, 这是一个有潜在危险的功能, 不适当的编码会造成伤害.(关闭底层连接或者在守护连接已经关闭的情况下继续使用它).请谨慎使用,并且仅当需要直接访问驱动的特定功能时使用.</p>
<p>注意: 不要关闭底层连接, 只能关闭前面的那个。</p>
<table border="1" cellspacing="1" cellpadding="0" width="100%">
<tbody>
<tr>
<td><strong>removeAbandoned</strong></td>
<td>false</td>
<td>标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制.如果设置为true, 连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout. 设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接.</td>
</tr>
<tr>
<td><strong>removeAbandonedTimeout</strong></td>
<td>300</td>
<td>泄露的连接可以被删除的超时值, 单位秒</td>
</tr>
<tr>
<td><strong>logAbandoned </strong></td>
<td>false</td>
<td>标记当Statement或连接被泄露时是否打印程序的stack   traces日志。被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,因为需要生成stack trace。</td>
</tr>
</tbody>
</table>
<p>如果开启&#8221;removeAbandoned&#8221;,那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() &lt; 2) and (getNumActive() &gt; getMaxActive() &#8211; 3)时被触发.举例当maxActive=20, 活动连接为18,空闲连接为1时可以触发&#8221;removeAbandoned&#8221;.但是活动连接只有在没有被使用的时间超过&#8221;removeAbandonedTimeout&#8221;时才被删除,默认300秒.在resultset中游历不被计算为被使用.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/338/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=338&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/03/18/%e9%93%be%e6%8e%a5%e6%b1%a0dbcp%e9%85%8d%e7%bd%ae%e5%8f%82%e8%80%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>最近研究Spring2.5的Bean作用域</title>
		<link>http://selenefox.wordpress.com/2011/03/01/%e6%9c%80%e8%bf%91%e7%a0%94%e7%a9%b6spring2-5%e7%9a%84bean%e4%bd%9c%e7%94%a8%e5%9f%9f/</link>
		<comments>http://selenefox.wordpress.com/2011/03/01/%e6%9c%80%e8%bf%91%e7%a0%94%e7%a9%b6spring2-5%e7%9a%84bean%e4%bd%9c%e7%94%a8%e5%9f%9f/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 09:27:54 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[JavaEE]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=333</guid>
		<description><![CDATA[如何使用spring的作用域： 　　 　　这里的scope就是用来配置spring bean的作用域，它标识bean的作用域。在spring2.0之前bean只有2种作用域即：singleton(单例)、non-singleton（也称prototype）, Spring2.0以后，增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此，默认情况下Spring2.0现在有五种类型的Bean。当然，Spring2.0对Bean的类型的设计进行了重构，并设计出灵活的Bean类型支持，理论上可以有无数多种类型的Bean，用户可以根据自己的需要，增加新的Bean类型，满足实际应用需求。 　　1、singleton作用域 　　当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例，并且所有对bean的请求，只要id与该bean定义相匹配，则只会返回bean的同一实例。换言之，当把一个bean定义设置为singleton作用域时，Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存（singleton cache）中，并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例，这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的，单例设计模式表示一个ClassLoader中只有一个class存在，而这里的singleton则表示一个容器对应一个bean，也就是说当一个bean被标识为singleton时候，spring的IOC容器中只会存在一个该bean。 　　配置实例： 　　 　　或者 　　 　　2、prototype 　　prototype作用域部署的bean，每一次请求（将其注入到另一个bean中，或者以程序的方式调用容器的getBean()方法）都会产生一个新的bean实例，相当与一个new的操作，对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责，容器在初始化、配置、装饰或者是装配完一个prototype实例后，将它交给客户端，随后就对该prototype实例不闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用bean的后置处理器，该处理器持有要被清除的bean的引用。） 　　配置实例： 　　 　　或者 　　 　　3、request 　　request表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效，配置实例： request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置：如果你使用的是Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可： 　　 　　&#8230; 　　 　　org.springframework.web.context.request.RequestContextListener 　　 　　&#8230; 　　 　　如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现： 　　 　　.. 　　 　　requestContextFilter 　　org.springframework.web.filter.RequestContextFilter 　　 　　 　　requestContextFilter 　　/* 　　 　　&#8230; 　　 　　接着既可以配置bean的作用域了： 　　4、session 　　session作用域表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效，配置实例： 　　配置实例：和request配置实例的前提一样，配置好web启动文件就可以如下配置： [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=333&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>如何使用spring的作用域：</p>
<p>　　</p>
<p>　　这里的scope就是用来配置spring bean的作用域，它标识bean的作用域。在spring2.0之前bean只有2种作用域即：singleton(单例)、non-singleton（也称prototype）, Spring2.0以后，增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此，默认情况下Spring2.0现在有五种类型的Bean。当然，Spring2.0对Bean的类型的设计进行了重构，并设计出灵活的Bean类型支持，理论上可以有无数多种类型的Bean，用户可以根据自己的需要，增加新的Bean类型，满足实际应用需求。</p>
<p>　　1、singleton作用域</p>
<p>　　当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例，并且所有对bean的请求，只要id与该bean定义相匹配，则只会返回bean的同一实例。换言之，当把一个bean定义设置为singleton作用域时，Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存（singleton cache）中，并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例，这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的，单例设计模式表示一个ClassLoader中只有一个class存在，而这里的singleton则表示一个容器对应一个bean，也就是说当一个bean被标识为singleton时候，spring的IOC容器中只会存在一个该bean。</p>
<p>　　配置实例：</p>
<p>　　</p>
<p>　　或者</p>
<p>　　</p>
<p>　　2、prototype</p>
<p>　　prototype作用域部署的bean，每一次请求（将其注入到另一个bean中，或者以程序的方式调用容器的getBean()方法）都会产生一个新的bean实例，相当与一个new的操作，对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责，容器在初始化、配置、装饰或者是装配完一个prototype实例后，将它交给客户端，随后就对该prototype实例不闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用bean的后置处理器，该处理器持有要被清除的bean的引用。）</p>
<p>　　配置实例：</p>
<p>　　</p>
<p>　　或者</p>
<p>　　</p>
<p>　　3、request</p>
<p>　　request表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效，配置实例： request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置：如果你使用的是Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可：</p>
<p>　　</p>
<p>　　&#8230;</p>
<p>　　</p>
<p>　　org.springframework.web.context.request.RequestContextListener</p>
<p>　　</p>
<p>　　&#8230;</p>
<p>　　</p>
<p>　　如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现：</p>
<p>　　</p>
<p>　　..</p>
<p>　　</p>
<p>　　requestContextFilter</p>
<p>　　org.springframework.web.filter.RequestContextFilter</p>
<p>　　</p>
<p>　　</p>
<p>　　requestContextFilter</p>
<p>　　/*</p>
<p>　　</p>
<p>　　&#8230;</p>
<p>　　</p>
<p>　　接着既可以配置bean的作用域了：</p>
<p>　　4、session<br />
　　session作用域表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效，配置实例：<br />
　　配置实例：和request配置实例的前提一样，配置好web启动文件就可以如下配置：<br />
　　<br />
　　5、global session<br />
　　global session作用域类似于标准的HTTP Session作用域，不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念，它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean，那么web会自动当成session类型来使用。配置实例：和request配置实例的前提一样，配置好web启动文件就可以如下配置：<br />
　　<br />
　　6、自定义bean装配作用域在spring2.0中作用域是可以任意扩展的，你可以自定义作用域，甚至你也可以重新定义已有的作用域（但是你不能覆盖singleton和prototype），spring的作用域由接口org.springframework.beans.factory.config.Scope来定义，自定义自己的作用域只要实现该接口即可，下面给个实例：我们建立一个线程的scope，该scope在表示一个线程中有效，代码如下：<br />
　　publicclass MyScope implements Scope &#8230;{<br />
　　privatefinal ThreadLocal threadScope = new ThreadLocal() &#8230;{<br />
　　protected Object initialValue() &#8230;{<br />
　　returnnew HashMap();<br />
　　}<br />
　　};<br />
　　public Object get(String name, ObjectFactory objectFactory) &#8230;{<br />
　　Map scope = (Map) threadScope.get();<br />
　　Object object = scope.get(name);<br />
　　if(object==null) &#8230;{<br />
　　object = objectFactory.getObject();<br />
　　scope.put(name, object);<br />
　　}<br />
　　return object;<br />
　　}<br />
　　public Object remove(String name) &#8230;{<br />
　　Map scope = (Map) threadScope.get();<br />
　　return scope.remove(name);<br />
　　}<br />
　　publicvoid registerDestructionCallback(String name, Runnable callback) &#8230;{<br />
　　}<br />
　　public String getConversationId() &#8230;{<br />
　　// TODO Auto-generated method stub<br />
　　returnnull;<br />
　　}<br />
　　}</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/333/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/333/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/333/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/333/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/333/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/333/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/333/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=333&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/03/01/%e6%9c%80%e8%bf%91%e7%a0%94%e7%a9%b6spring2-5%e7%9a%84bean%e4%bd%9c%e7%94%a8%e5%9f%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
		<item>
		<title>Object-C</title>
		<link>http://selenefox.wordpress.com/2011/02/28/object-c/</link>
		<comments>http://selenefox.wordpress.com/2011/02/28/object-c/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 09:20:06 +0000</pubDate>
		<dc:creator>selenefox</dc:creator>
				<category><![CDATA[代码技巧]]></category>

		<guid isPermaLink="false">http://selenefox.wordpress.com/?p=324</guid>
		<description><![CDATA[最近居然着迷与Object-C，着迷与它的代码风格的随意，和简洁的编写方式，觉的比C++ 和 JAVA都是有过之而无不及的感觉。。好吧，我承认我是苹果控。。我是代码控。。 昨天半夜三更的杀到书城去找需要的书，然后刷卡买单走人。回到家后就开始研究起了Object-C，虽然用MacOS系统已经三四年了，但一直没有仔细研究过Object-C，因为，能用Java解决问题我都Java解决了，所以我MacOS系统里面尽是些用Java写的程序，然后打包成.app的程序。最近入手了一只Mac mini ，因此就想在这个上面去装一个USB的摄像头，然后通过一个服务去做一个小型的家庭监控，前期的架构打算用Java写一个Web服务，服务中通过JMF获取摄像头的视频数据通过Web服务提供出去，但是JMF悲催的没有MacOS版本，不知道是故意不提供呢，还是没有，虽然找到一个all-java的版本，但还不知道能不能用，因此就直接放弃使用Java了，而且刚好一直想有一个契机让自己有点动力去学一下Object-C。 下面是一个自己写的一个很基本的Hello,world! 的程序，由于一直对内存泄露的问题表示头疼的我，发现了有样东西叫NSAutoreleasePool的东西后，就开始喜欢上Object-C了，这个可是帮了大忙的功能，呵呵呵呵。。 也许吧，等我把我自己的iDVR写出来后一定做成开源的，现在开源才是王道啊。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=324&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>最近居然着迷与Object-C，着迷与它的代码风格的随意，和简洁的编写方式，觉的比C++ 和 JAVA都是有过之而无不及的感觉。。好吧，我承认我是苹果控。。我是代码控。。</p>
<p>昨天半夜三更的杀到书城去找需要的书，然后刷卡买单走人。回到家后就开始研究起了Object-C，虽然用MacOS系统已经三四年了，但一直没有仔细研究过Object-C，因为，能用Java解决问题我都Java解决了，所以我MacOS系统里面尽是些用Java写的程序，然后打包成.app的程序。最近入手了一只Mac mini ，因此就想在这个上面去装一个USB的摄像头，然后通过一个服务去做一个小型的家庭监控，前期的架构打算用Java写一个Web服务，服务中通过JMF获取摄像头的视频数据通过Web服务提供出去，但是JMF悲催的没有MacOS版本，不知道是故意不提供呢，还是没有，虽然找到一个all-java的版本，但还不知道能不能用，因此就直接放弃使用Java了，而且刚好一直想有一个契机让自己有点动力去学一下Object-C。</p>
<p>下面是一个自己写的一个很基本的Hello,world! 的程序，由于一直对内存泄露的问题表示头疼的我，发现了有样东西叫NSAutoreleasePool的东西后，就开始喜欢上Object-C了，这个可是帮了大忙的功能，呵呵呵呵。。<br />
<pre class="brush: objc;">
#import &lt;Foundation/Foundation.h&gt;
int main (int argc, const char * argv[])
{
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
     NSLog(@&quot;Hello, World!&quot;);
     [pool release];
     return 0;
}
</pre></p>
<hr />
也许吧，等我把我自己的iDVR写出来后一定做成开源的，现在开源才是王道啊。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selenefox.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selenefox.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/selenefox.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/selenefox.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selenefox.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selenefox.wordpress.com/324/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selenefox.wordpress.com/324/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selenefox.wordpress.com/324/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=selenefox.wordpress.com&amp;blog=16145174&amp;post=324&amp;subd=selenefox&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://selenefox.wordpress.com/2011/02/28/object-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e27f7ca64307eec37f6bab1cff249762?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">selenefox</media:title>
		</media:content>
	</item>
	</channel>
</rss>
