<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>躺在沙滩上的小猪</title>
    <description></description>
    <link>http://mmm.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>2008/06/30 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/209579" style="color:red;">http://mmm.javaeye.com/blog/209579</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          cheat sheets.<br />http://cheat.errtheblog.com/<br />http://cheat.errtheblog.com/s/datamapper/<br /><br />More Named Scope Awesomeness  <br />http://www.pathf.com/blogs/2008/06/more-named-scope-awesomeness/<br /><br />Security (CAS and OpenID) with Ruby<br />http://www.infoq.com/presentations/gehtland-security-and-identity<br /><br />BenchmarkForRails and Controller Filters<br />http://codelevy.com/articles/2008/06/28/benchmarkforrails-and-controller-filters
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/209579#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 09:22:20 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/209579</link>
        <guid>http://mmm.javaeye.com/blog/209579</guid>
      </item>
      <item>
        <title>Code Review&amp;JRuby on Rails</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/207300" style="color:red;">http://mmm.javaeye.com/blog/207300</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在emule上发现的，共享下。javaeye不准许交流这东西，我们瞧瞧的<img src="/images/smiles/icon_biggrin.gif"/><br /><br />嘘...<br /><br /><img src="http://mmm.javaeye.com/upload/picture/pic/16531/81d186c0-dc09-32c0-84e4-c29654e99960.png" />
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/207300#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jun 2008 08:07:13 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/207300</link>
        <guid>http://mmm.javaeye.com/blog/207300</guid>
      </item>
      <item>
        <title>2008/06/24 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/207297" style="color:red;">http://mmm.javaeye.com/blog/207297</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://weblog.hypotheticalabs.com/" target="_blank">http://weblog.hypotheticalabs.com/</a><br /><br />http://munin.projects.linpro.no/
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/207297#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jun 2008 07:48:01 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/207297</link>
        <guid>http://mmm.javaeye.com/blog/207297</guid>
      </item>
      <item>
        <title>2008/06/23 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/207241" style="color:red;">http://mmm.javaeye.com/blog/207241</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tidal Enterprise Job Scheduling Software<br />http://www.tidalsoftware.com/products/enterpriseJobScheduling.asp<br /><br />Jing Project<br />http://www.jingproject.com/<br /><br />Splunk Your Distributed Logs in EC2<br />http://www.igvita.com/2008/06/19/splunk-your-distributed-logs-in-ec2/<br /><br />架构Twitter<br />http://www.infoq.com/cn/news/2008/06/twitter-and-sharding<br /><br />named_scope is super awsome with has_many<br />http://blog.peelmeagrape.net/2008/6/21/named_scope-is-super-awsome-with-has_many<br /><br />Named Scopes Are Awesome<br />http://www.pathf.com/blogs/2008/06/named-scopes-are-awesome/<br /><br />Extra geeky: the recursive lambda<br />http://blog.hasmanythrough.com/2008/6/20/recursive-lambda<br /><br />oVirt <br />http://www.ovirt.org/<br /><br /><br />Shout - at a glance status<br />http://davidsmalley.com/2008/4/21/shout-at-a-glance-status<br /><br />A peek at In/Out, an internal app at 37signals<br />http://www.37signals.com/svn/posts/976-a-peek-at-inout-an-internal-app-at-37signals<br /><br /><br />http://zachinglis.com/2008/coding/rails/introducing-holler/
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/207241#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jun 2008 22:33:30 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/207241</link>
        <guid>http://mmm.javaeye.com/blog/207241</guid>
      </item>
      <item>
        <title>2008/06/19 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/205645" style="color:red;">http://mmm.javaeye.com/blog/205645</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          RESTful AJAX with Forgery Protection<br />http://www.metaskills.net/2008/6/18/restful-ajax-with-forgery-protection<br /><br />Functor<br />http://functor.rubyforge.org/<br /><br />Bulk insertion of data with ActiveRecord<br />http://rubypond.com/articles/2008/06/18/bulk-insertion-of-data-with-activerecord/<br /><br />Using jQuery with Ruby on Rails<br />http://jimneath.org/2008/06/18/using-jquery-with-ruby-on-rails/
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/205645#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 10:02:47 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/205645</link>
        <guid>http://mmm.javaeye.com/blog/205645</guid>
      </item>
      <item>
        <title>2008/06/13 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/202857" style="color:red;">http://mmm.javaeye.com/blog/202857</a>&nbsp;
          发表时间: 2008年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          A Concise Guide to Using Thinking Sphinx<br />http://freelancing-gods.com/posts/a_concise_guide_to_using_thinking_sphinx<br /><br />Merb → Mongrel, not Mongrel → Merb<br />http://toolmantim.com/article/2008/5/30/merb_mongrel_not_mongrel_merb<br /><br />可伸缩性最佳实践：来自eBay的经验<br />http://www.infoq.com/cn/articles/ebay-scalability-best-practices
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/202857#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jun 2008 10:56:03 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/202857</link>
        <guid>http://mmm.javaeye.com/blog/202857</guid>
      </item>
      <item>
        <title>DM &amp; Merb 快速体验</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/200557" style="color:red;">http://mmm.javaeye.com/blog/200557</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          发觉她们很有趣，今天开始学习并使用。<br /><br />http://datamapper.org<br /><br />Why DataMapper?<br />http://datamapper.org/why.html<br /><br />一：通过irb快速体验DM<br /><br />安装<br /><pre name="code" class="java">
gem sources -a http://gems.datamapper.org
sudo gem install data_objects do_mysql dm-core dm-more
</pre><br /><br />打开irb开始试用DM<br /><br /><pre name="code" class="ruby">
require 'rubygems'
gem 'dm-core'
require 'data_mapper'

#我们把日志打到控制台里，方面看
DataMapper::Logger.new(STDOUT, 0)

#连接MYSQL
DataMapper.setup(:default,'mysql://root:password@localhost:3306/test_dev')

#新建model:post
class Post
  #DM 0.9 改变了之前继承DM的类方式，通过mixin DataMapper::Resource 来实现类似于AR:Base中的操作
  include DataMapper::Resource
  
  #最新的版本中需要指定主键
  #serial=>true 表示该建为自动增长 
  property :id, Integer,:serial=>true
  
  #新建其他的几个字段测试下
  #更多内容查看这个：http://datamapper.org/docs/properties.html
  property :title,String
  property :body,Text
  property :created_at,DateTime

   
end

#建表,auto_migrate! 会先drop现有的表，然后再重新创建
Post.auto_migrate!

Post.create :title=>'Post title',:body=>'Body goes here'

#这些和AR没有太巨大的差距了 
</pre><br /><br />不过她的查询很有趣<br /><br /><pre name="code" class="ruby">
exhibitions = Exibition.all(:run_time.gt => 2, :run_time.lt => 5)
# => SQL conditions: 'run_time > 1 AND run_time &lt; 5'
</pre><br /><br />更多可以查看这里：<br />http://datamapper.org/docs/find.html<br /><br />二：快速体验Merb<br />http://merbivore.com/<br /><br />安装：<br /><pre name="code" class="java">
 sudo gem install merb merb-more merb-plugins
</pre><br /><br />快速体验<br />新建一个空项目<br /><pre name="code" class="java">
merb-gen app demo
cd demo
</pre><br /><br />通过merb-gen generators可以当当前查看所有的generator，自带的有<br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />Installed Generators<br />  Rubygems: controller, migration, model, part_controller, resource, resource_controller<br /></div><br /><br />看到后台生成的目录结构和rails有很大的相似，继续，修改config/init.rb<br /><pre name="code" class="java">
#新增如下的依赖包，0.9 默认是不包含Helper的这些方法，手工加入，下面我们会用到，譬如link_to
dependencies "merb_helpers","merb-assets"
#orm 我们使用datamapper,这个在init.rb中有，去掉注释即可,Merb也可以使用AR
use_orm :datamapper
#去掉rspec的注释
use_test :rspec
</pre><br /><br />再执行下<br /><pre name="code" class="java">
merb-gen
</pre><br /><br />会生成一个database.yml.example<br /><pre name="code" class="java">
mv config/database.yml.example config/database.yml
</pre><br /><br />修改，我这里使用的是mysql,这个和rails一样，没啥特殊的地方<br /><pre name="code" class="ruby">
# This is a sample database file for the DataMapper ORM
development: &defaults
  # These are the settings for repository :default
  adapter:  mysql
  database: test_dev
  username: root
  password: password
  host:     localhost
  socket:   /var/run/mysqld/mysqld.sock
</pre><br /><br />socket的值不知道，可以通过mysql_config查看<br /><pre name="code" class="java">
mysql_config --socket
</pre><br /><br />简单的建立个model,和rails一样也有resource的脚手架<br /><pre name="code" class="java">
merb-gen resource user id:integer login:string email:string created_at:date_time
</pre><br /><br />会生成mode,controller,views,helper以及rspec的代码。<br /><br />修改mode/users.rb将id修改为主键<br /><br /><pre name="code" class="ruby">
class User
  include DataMapper::Resource
  
  property :id, Integer, :serial=>true
  #.....
end
</pre><br /><br />和上面的auto_migrate!一样，也有rake相应的建表task<br /><pre name="code" class="java">
rake -T | grep 'rake dm'
</pre><br />会看到所有的tasks<br /><br />其中<br />rake dm:db:automigrate  和上面的一样，先drop再create<br />rake dm:db:autoupgrade  仅仅添加新增的字段，不会drop表，也不会删除字段<br /><br />执行<br /><pre name="code" class="ruby">
rake dm:db:automigrate
</pre><br /><br />下一步 修改route.rb<br /><pre name="code" class="ruby">
Merb::Router.prepare do |r|
  # RESTful routes
  #增加
  r.resources :users
  #.....
  r.default_routes
  
  # Change this for your home page to be available at /
  #修改默认的页面转向users的index
  r.match('/').to(:controller => 'users', :action =>'index')
end   
</pre><br /><br />安装mongrel<br /><pre name="code" class="java">
sudo gem install mongrel
</pre><br /><br />启动<br /><pre name="code" class="java">
merb
</pre><br /><br />默认端口为4000，浏览下http://localhost:4000/，增删改查也应该就出来了<br /><br />和我们在rails中一样，也可以传递不同的参数，譬如<br /><pre name="code" class="java">
merb -p 3000 -e production
</pre><br /><br /> 等等,默认启动了mongrel.更多查看<br /><pre name="code" class="java">
merb --help
</pre><br /><br />安装thin<br /><pre name="code" class="java">
sudo gem install thin
</pre><br /><br />以thin启动<br /><pre name="code" class="java">
merb -a thin
</pre><br /><br />启动多个cluster结点<br /><br /><pre name="code" class="java">
merb -a thin -c 2
</pre><br /><br />停止<br /><pre name="code" class="java">
merb -K all
</pre><br /><br />TODO:<br />　RSpec
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/200557#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 16:13:16 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/200557</link>
        <guid>http://mmm.javaeye.com/blog/200557</guid>
      </item>
      <item>
        <title>开始使用 merb＋dm</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/200481" style="color:red;">http://mmm.javaeye.com/blog/200481</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          很帮，感觉很好。上次听了John的merb演讲，当时还没怎么感兴趣，今天自己试了一把，感觉来了 <img src="/images/smiles/icon_biggrin.gif"/>于是乎决定开始使用。<br /><br />merb+dm+thin(mongrel)。
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/200481#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 13:25:22 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/200481</link>
        <guid>http://mmm.javaeye.com/blog/200481</guid>
      </item>
      <item>
        <title>do_mysql problem</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/200435" style="color:red;">http://mmm.javaeye.com/blog/200435</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">martin@martin-laptop:~/$ sudo gem install data_objects do_sqlite3 do_mysql dm-core dm-more<br />.....<br />.....<br />Building native extensions.  This could take a while...<br />ERROR:  Error installing do_mysql:<br />	ERROR: Failed to build gem native extension.<br /><br />/usr/bin/ruby1.8 extconf.rb install data_objects do_sqlite3 do_mysql dm-core dm-more<br />checking for mysql_query() in -lmysqlclient... no<br />*** extconf.rb failed ***<br />Could not create Makefile due to some reason, probably lack of<br />necessary libraries and/or headers.  Check the mkmf.log file for more<br />details.  You may need configuration options.<br /><br />Provided configuration options:<br />	--with-opt-dir<br />	--without-opt-dir<br />	--with-opt-include<br />	--without-opt-include=${opt-dir}/include<br />	--with-opt-lib<br />	--without-opt-lib=${opt-dir}/lib<br />	--with-make-prog<br />	--without-make-prog<br />	--srcdir=.<br />	--curdir<br />	--ruby=/usr/bin/ruby1.8<br />	--with-mysql-config<br />	--without-mysql-config<br />	--with-mysql-dir<br />	--without-mysql-dir<br />	--with-mysql-include<br />	--without-mysql-include=${mysql-dir}/include<br />	--with-mysql-lib<br />	--without-mysql-lib=${mysql-dir}/lib<br />	--with-mysqlclientlib<br />	--without-mysqlclientlib<br /><br /><br />Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/do_mysql-0.9.1 for inspection.<br />Results logged to /usr/lib/ruby/gems/1.8/gems/do_mysql-0.9.1/ext/gem_make.out</div><br /><br /><br />http://groups.google.com/group/datamapper/browse_thread/thread/f2bd7ba7365e95bf/0e71c069e6d52245?lnk=raot<br /><br /><div class="quote_title">引用</div><div class="quote_div">This is consecuence of lacking the development libraries of mysql<br />which (off course) include mysql.h<br /><br />Once you install libmysqlclient15-dev using apt-get, aptitude or<br />synaptic, you should get the missing file:<br /><br />/usr/include/mysql/mysql.h<br /><br />And be able to install withour problem: </div><br /><br /><pre name="code" class="java">
sudo apt-get install libmysqlclient15-dev
</pre><br /><br />Then install gems again.<br /><pre name="code" class="java">
sudo gem install do_mysql
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/200435#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 11:16:32 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/200435</link>
        <guid>http://mmm.javaeye.com/blog/200435</guid>
      </item>
      <item>
        <title>2008/06/04 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/200374" style="color:red;">http://mmm.javaeye.com/blog/200374</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.lycom.de/past/2008/6/5/rails-2-1-2008-06-04/" target="_blank">http://www.lycom.de/past/2008/6/5/rails-2-1-2008-06-04/</a><br /><br />http://www.dcmanges.com/blog/rails-21-partial-updates-may-create-invalid-records
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/200374#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 09:59:16 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/200374</link>
        <guid>http://mmm.javaeye.com/blog/200374</guid>
      </item>
      <item>
        <title>无聊，无题</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/200034" style="color:red;">http://mmm.javaeye.com/blog/200034</a>&nbsp;
          发表时间: 2008年06月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="ruby">
LOCATION_CODE = %w{110000 110100 110101 110102 110103 110104 110105 110106 110107 110108 110109 110111 110112 110113 110114 110115 110116 110117 110200 110228 110229 120000 120100 120101 120102 120103 120104 120105 120106 120107 120108 120109 120110 120111 120112 120113 120114 120115 120200 120221 120223 120225 130000 130100 130101 130102 130103 130104 130105 130107 130108 130121 130123 130124 130125 130126 130127 130128 130129 130130 130131 130132 130133 130181 130182 130183 130184 130185 130200 130201 130202 130203 130204 130205 130207 130208 130223 130224 130225 130227 130229 130230 130281 130283 130300 130301 130302 130303 130304 130321 130322 130323 130324 130400 130401 130402 130403 130404 130406 130421 130423 130424 130425 130426 130427 130428 130429 130430 130431 130432 130433 130434 130435 130481 130500 130501 130502 130503 130521 130522 130523 130524 130525 130526 130527 130528 130529 130530 130531 130532 130533 130534 130535 130581 130582 130600 130601 130602 130603 130604 130621 130622 130623 130624 130625 130626 130627 130628 130629 130630 130631 130632 130633 130634 130635 130636 130637 130638 130681 130682 130683 130684 130700 130701 130702 130703 130705 130706 130721 130722 130723 130724 130725 130726 130727 130728 130729 130730 130731 130732 130733 130800 130801 130802 130803 130804 130821 130822 130823 130824 130825 130826 130827 130828 130900 130901 130902 130903 130921 130922 130923 130924 130925 130926 130927 130928 130929 130930 130981 130982 130983 130984 131000 131001 131002 131003 131022 131023 131024 131025 131026 131028 131081 131082 131100 131101 131102 131121 131122 131123 131124 131125 131126 131127 131128 131181 131182 140000 140100 140101 140105 140106 140107 140108 140109 140110 140121 140122 140123 140181 140200 140201 140202 140203 140211 140212 140221 140222 140223 140224 140225 140226 140227 140300 140301 140302 140303 140311 140321 140322 140400 140401 140402 140411 140421 140423 140424 140425 140426 140427 140428 140429 140430 140431 140481 140500 140501 140502 140521 140522 140524 140525 140581 140600 140601 140602 140603 140621 140622 140623 140624 140700 140701 140702 140721 140722 140723 140724 140725 140726 140727 140728 140729 140781 140800 140801 140802 140821 140822 140823 140824 140825 140826 140827 140828 140829 140830 140881 140882 140900 140901 140902 140921 140922 140923 140924 140925 140926 140927 140928 140929 140930 140931 140932 140981 141000 141001 141002 141021 141022 141023 141024 141025 141026 141027 141028 141029 141030 141031 141032 141033 141034 141081 141082 141100 141101 141102 141121 141122 141123 141124 141125 141126 141127 141128 141129 141130 141181 141182 150000 150100 150101 150102 150103 150104 150105 150121 150122 150123 150124 150125 150200 150201 150202 150203 150204 150205 150206 150207 150221 150222 150223 150300 150301 150302 150303 150304 150400 150401 150402 150403 150404 150421 150422 150423 150424 150425 150426 150428 150429 150430 150500 150501 150502 150521 150522 150523 150524 150525 150526 150581 150600 150601 150602 150621 150622 150623 150624 150625 150626 150627 150700 150701 150702 150721 150722 150723 150724 150725 150726 150727 150781 150782 150783 150784 150785 150800 150801 150802 150821 150822 150823 150824 150825 150826 150900 150901 150902 150921 150922 150923 150924 150925 150926 150927 150928 150929 150981 152200 152201 152202 152221 152222 152223 152224 152500 152501 152502 152522 152523 152524 152525 152526 152527 152528 152529 152530 152531 152900 152921 152922 152923 210000 210100 210101 210102 210103 210104 210105 210106 210111 210112 210113 210114 210122 210123 210124 210181 210200 210201 210202 210203 210204 210211 210212 210213 210224 210281 210282 210283 210300 210301 210302 210303 210304 210311 210321 210323 210381 210400 210401 210402 210403 210404 210411 210421 210422 210423 210500 210501 210502 210503 210504 210505 210521 210522 210600 210601 210602 210603 210604 210624 210681 210682 210700 210701 210702 210703 210711 210726 210727 210781 210782 210800 210801 210802 210803 210804 210811 210881 210882 210900 210901 210902 210903 210904 210905 210911 210921 210922 211000 211001 211002 211003 211004 211005 211011 211021 211081 211100 211101 211102 211103 211121 211122 211200 211201 211202 211204 211221 211223 211224 211281 211282 211300 211301 211302 211303 211321 211322 211324 211381 211382 211400 211401 211402 211403 211404 211421 211422 211481 220000 220100 220101 220102 220103 220104 220105 220106 220112 220122 220181 220182 220183 220200 220201 220202 220203 220204 220211 220221 220281 220282 220283 220284 220300 220301 220302 220303 220322 220323 220381 220382 220400 220401 220402 220403 220421 220422 220500 220501 220502 220503 220521 220523 220524 220581 220582 220600 220601 220602 220605 220621 220622 220623 220681 220700 220701 220702 220721 220722 220723 220724 220800 220801 220802 220821 220822 220881 220882 222400 222401 222402 222403 222404 222405 222406 222424 222426 230000 230100 230101 230102 230103 230104 230108 230109 230110 230111 230112 230123 230124 230125 230126 230127 230128 230129 230182 230183 230184 230200 230201 230202 230203 230204 230205 230206 230207 230208 230221 230223 230224 230225 230227 230229 230230 230231 230281 230300 230301 230302 230303 230304 230305 230306 230307 230321 230381 230382 230400 230401 230402 230403 230404 230405 230406 230407 230421 230422 230500 230501 230502 230503 230505 230506 230521 230522 230523 230524 230600 230601 230602 230603 230604 230605 230606 230621 230622 230623 230624 230700 230701 230702 230703 230704 230705 230706 230707 230708 230709 230710 230711 230712 230713 230714 230715 230716 230722 230781 230800 230801 230803 230804 230805 230811 230822 230826 230828 230833 230881 230882 230900 230901 230902 230903 230904 230921 231000 231001 231002 231003 231004 231005 231024 231025 231081 231083 231084 231085 231100 231101 231102 231121 231123 231124 231181 231182 231200 231201 231202 231221 231222 231223 231224 231225 231226 231281 231282 231283 232700 232701 232702 232703 232704 232721 232722 232723 310000 310100 310101 310103 310104 310105 310106 310107 310108 310109 310110 310112 310113 310114 310115 310116 310117 310118 310119 310120 310200 310230 320000 320100 320101 320102 320103 320104 320105 320106 320107 320111 320113 320114 320115 320116 320124 320125 320200 320201 320202 320203 320204 320205 320206 320211 320281 320282 320300 320301 320302 320303 320304 320305 320311 320321 320322 320323 320324 320381 320382 320400 320401 320402 320404 320405 320411 320412 320481 320482 320500 320501 320502 320503 320504 320505 320506 320507 320581 320582 320583 320584 320585 320600 320601 320602 320611 320621 320623 320681 320682 320683 320684 320700 320701 320703 320705 320706 320721 320722 320723 320724 320800 320801 320802 320803 320804 320811 320826 320829 320830 320831 320900 320901 320902 320903 320921 320922 320923 320924 320925 320981 320982 321000 321001 321002 321003 321011 321023 321081 321084 321088 321100 321101 321102 321111 321112 321181 321182 321183 321200 321201 321202 321203 321281 321282 321283 321284 321300 321301 321302 321311 321322 321323 321324 330000 330100 330101 330102 330103 330104 330105 330106 330108 330109 330110 330122 330127 330182 330183 330185 330200 330201 330203 330204 330205 330206 330211 330212 330225 330226 330281 330282 330283 330300 330301 330302 330303 330304 330322 330324 330326 330327 330328 330329 330381 330382 330400 330401 330402 330411 330421 330424 330481 330482 330483 330500 330501 330502 330503 330521 330522 330523 330600 330601 330602 330621 330624 330681 330682 330683 330700 330701 330702 330703 330723 330726 330727 330781 330782 330783 330784 330800 330801 330802 330803 330822 330824 330825 330881 330900 330901 330902 330903 330921 330922 331000 331001 331002 331003 331004 331021 331022 331023 331024 331081 331082 331100 331101 331102 331121 331122 331123 331124 331125 331126 331127 331181 340000 340100 340101 340102 340103 340104 340111 340121 340122 340123 340200 340201 340202 340203 340207 340208 340221 340222 340223 340300 340301 340302 340303 340304 340311 340321 340322 340323 340400 340401 340402 340403 340404 340405 340406 340421 340500 340501 340502 340503 340504 340521 340600 340601 340602 340603 340604 340621 340700 340701 340702 340703 340711 340721 340800 340801 340802 340803 340811 340822 340823 340824 340825 340826 340827 340828 340881 341000 341001 341002 341003 341004 341021 341022 341023 341024 341100 341101 341102 341103 341122 341124 341125 341126 341181 341182 341200 341201 341202 341203 341204 341221 341222 341225 341226 341282 341300 341301 341302 341321 341322 341323 341324 341400 341401 341402 341421 341422 341423 341424 341500 341501 341502 341503 341521 341522 341523 341524 341525 341600 341601 341602 341621 341622 341623 341700 341701 341702 341721 341722 341723 341800 341801 341802 341821 341822 341823 341824 341825 341881 350000 350100 350101 350102 350103 350104 350105 350111 350121 350122 350123 350124 350125 350128 350181 350182 350200 350201 350203 350205 350206 350211 350212 350213 350300 350301 350302 350303 350304 350305 350322 350400 350401 350402 350403 350421 350423 350424 350425 350426 350427 350428 350429 350430 350481 350500 350501 350502 350503 350504 350505 350521 350524 350525 350526 350527 350581 350582 350583 350600 350601 350602 350603 350622 350623 350624 350625 350626 350627 350628 350629 350681 350700 350701 350702 350721 350722 350723 350724 350725 350781 350782 350783 350784 350800 350801 350802 350821 350822 350823 350824 350825 350881 350900 350901 350902 350921 350922 350923 350924 350925 350926 350981 350982 360000 360100 360101 360102 360103 360104 360105 360111 360121 360122 360123 360124 360200 360201 360202 360203 360222 360281 360300 360301 360302 360313 360321 360322 360323 360400 360401 360402 360403 360421 360423 360424 360425 360426 360427 360428 360429 360430 360481 360500 360501 360502 360521 360600 360601 360602 360622 360681 360700 360701 360702 360721 360722 360723 360724 360725 360726 360727 360728 360729 360730 360731 360732 360733 360734 360735 360781 360782 360800 360801 360802 360803 360821 360822 360823 360824 360825 360826 360827 360828 360829 360830 360881 360900 360901 360902 360921 360922 360923 360924 360925 360926 360981 360982 360983 361000 361001 361002 361021 361022 361023 361024 361025 361026 361027 361028 361029 361030 361100 361101 361102 361121 361122 361123 361124 361125 361126 361127 361128 361129 361130 361181 370000 370100 370101 370102 370103 370104 370105 370112 370113 370124 370125 370126 370181 370200 370201 370202 370203 370205 370211 370212 370213 370214 370281 370282 370283 370284 370285 370300 370301 370302 370303 370304 370305 370306 370321 370322 370323 370400 370401 370402 370403 370404 370405 370406 370481 370500 370501 370502 370503 370521 370522 370523 370600 370601 370602 370611 370612 370613 370634 370681 370682 370683 370684 370685 370686 370687 370700 370701 370702 370703 370704 370705 370724 370725 370781 370782 370783 370784 370785 370786 370800 370801 370802 370811 370826 370827 370828 370829 370830 370831 370832 370881 370882 370883 370900 370901 370902 370911 370921 370923 370982 370983 371000 371001 371002 371081 371082 371083 371100 371101 371102 371103 371121 371122 371200 371201 371202 371203 371300 371301 371302 371311 371312 371321 371322 371323 371324 371325 371326 371327 371328 371329 371400 371401 371402 371421 371422 371423 371424 371425 371426 371427 371428 371481 371482 371500 371501 371502 371521 371522 371523 371524 371525 371526 371581 371600 371601 371602 371621 371622 371623 371624 371625 371626 371700 371701 371702 371721 371722 371723 371724 371725 371726 371727 371728 410000 410100 410101 410102 410103 410104 410105 410106 410108 410122 410181 410182 410183 410184 410185 410200 410201 410202 410203 410204 410205 410211 410221 410222 410223 410224 410225 410300 410301 410302 410303 410304 410305 410306 410311 410322 410323 410324 410325 410326 410327 410328 410329 410381 410400 410401 410402 410403 410404 410411 410421 410422 410423 410425 410481 410482 410500 410501 410502 410503 410505 410506 410522 410523 410526 410527 410581 410600 410601 410602 410603 410611 410621 410622 410700 410701 410702 410703 410704 410711 410721 410724 410725 410726 410727 410728 410781 410782 410800 410801 410802 410803 410804 410811 410821 410822 410823 410825 410881 410882 410883 410900 410901 410902 410922 410923 410926 410927 410928 411000 411001 411002 411023 411024 411025 411081 411082 411100 411101 411102 411103 411104 411121 411122 411200 411201 411202 411221 411222 411224 411281 411282 411300 411301 411302 411303 411321 411322 411323 411324 411325 411326 411327 411328 411329 411330 411381 411400 411401 411402 411403 411421 411422 411423 411424 411425 411426 411481 411500 411501 411502 411503 411521 411522 411523 411524 411525 411526 411527 411528 411600 411601 411602 411621 411622 411623 411624 411625 411626 411627 411628 411681 411700 411701 411702 411721 411722 411723 411724 411725 411726 411727 411728 411729 420000 420100 420101 420102 420103 420104 420105 420106 420107 420111 420112 420113 420114 420115 420116 420117 420200 420201 420202 420203 420204 420205 420222 420281 420300 420301 420302 420303 420321 420322 420323 420324 420325 420381 420500 420501 420502 420503 420504 420505 420506 420525 420526 420527 420528 420529 420581 420582 420583 420600 420601 420602 420606 420607 420624 420625 420626 420682 420683 420684 420700 420701 420702 420703 420704 420800 420801 420802 420804 420821 420822 420881 420900 420901 420902 420921 420922 420923 420981 420982 420984 421000 421001 421002 421003 421022 421023 421024 421081 421083 421087 421100 421101 421102 421121 421122 421123 421124 421125 421126 421127 421181 421182 421200 421201 421202 421221 421222 421223 421224 421281 421300 421301 421302 421381 422800 422801 422802 422822 422823 422825 422826 422827 422828 429000 429004 429005 429006 429021 430000 430100 430101 430102 430103 430104 430105 430111 430121 430122 430124 430181 430200 430201 430202 430203 430204 430211 430221 430223 430224 430225 430281 430300 430301 430302 430304 430321 430381 430382 430400 430401 430405 430406 430407 430408 430412 430421 430422 430423 430424 430426 430481 430482 430500 430501 430502 430503 430511 430521 430522 430523 430524 430525 430527 430528 430529 430581 430600 430601 430602 430603 430611 430621 430623 430624 430626 430681 430682 430700 430701 430702 430703 430721 430722 430723 430724 430725 430726 430781 430800 430801 430802 430811 430821 430822 430900 430901 430902 430903 430921 430922 430923 430981 431000 431001 431002 431003 431021 431022 431023 431024 431025 431026 431027 431028 431081 431100 431101 431102 431103 431121 431122 431123 431124 431125 431126 431127 431128 431129 431200 431201 431202 431221 431222 431223 431224 431225 431226 431227 431228 431229 431230 431281 431300 431301 431302 431321 431322 431381 431382 433100 433101 433122 433123 433124 433125 433126 433127 433130 440000 440100 440101 440103 440104 440105 440106 440111 440112 440113 440114 440115 440116 440183 440184 440200 440201 440203 440204 440205 440222 440224 440229 440232 440233 440281 440282 440300 440301 440303 440304 440305 440306 440307 440308 440400 440401 440402 440403 440404 440500 440501 440507 440511 440512 440513 440514 440515 440523 440600 440601 440604 440605 440606 440607 440608 440700 440701 440703 440704 440705 440781 440783 440784 440785 440800 440801 440802 440803 440804 440811 440823 440825 440881 440882 440883 440900 440901 440902 440903 440923 440981 440982 440983 441200 441201 441202 441203 441223 441224 441225 441226 441283 441284 441300 441301 441302 441303 441322 441323 441324 441400 441401 441402 441421 441422 441423 441424 441426 441427 441481 441500 441501 441502 441521 441523 441581 441600 441601 441602 441621 441622 441623 441624 441625 441700 441701 441702 441721 441723 441781 441800 441801 441802 441821 441823 441825 441826 441827 441881 441882 441900 442000 445100 445101 445102 445121 445122 445200 445201 445202 445221 445222 445224 445281 445300 445301 445302 445321 445322 445323 445381 450000 450100 450101 450102 450103 450105 450107 450108 450109 450122 450123 450124 450125 450126 450127 450200 450201 450202 450203 450204 450205 450221 450222 450223 450224 450225 450226 450300 450301 450302 450303 450304 450305 450311 450321 450322 450323 450324 450325 450326 450327 450328 450329 450330 450331 450332 450400 450401 450403 450404 450405 450421 450422 450423 450481 450500 450501 450502 450503 450512 450521 450600 450601 450602 450603 450621 450681 450700 450701 450702 450703 450721 450722 450800 450801 450802 450803 450804 450821 450881 450900 450901 450902 450921 450922 450923 450924 450981 451000 451001 451002 451021 451022 451023 451024 451025 451026 451027 451028 451029 451030 451031 451100 451101 451102 451121 451122 451123 451200 451201 451202 451221 451222 451223 451224 451225 451226 451227 451228 451229 451281 451300 451301 451302 451321 451322 451323 451324 451381 451400 451401 451402 451421 451422 451423 451424 451425 451481 460000 460100 460101 460105 460106 460107 460108 460200 460201 469000 469001 469002 469003 469005 469006 469007 469021 469022 469023 469024 469025 469026 469027 469028 469029 469030 469031 469032 469033 500000 500100 500101 500102 500103 500104 500105 500106 500107 500108 500109 500110 500111 500112 500113 500114 500115 500116 500117 500118 500119 500200 500222 500223 500224 500225 500226 500227 500228 500229 500230 500231 500232 500233 500234 500235 500236 500237 500238 500240 500241 500242 500243 510000 510100 510101 510104 510105 510106 510107 510108 510112 510113 510114 510115 510121 510122 510124 510129 510131 510132 510181 510182 510183 510184 510300 510301 510302 510303 510304 510311 510321 510322 510400 510401 510402 510403 510411 510421 510422 510500 510501 510502 510503 510504 510521 510522 510524 510525 510600 510601 510603 510623 510626 510681 510682 510683 510700 510701 510703 510704 510722 510723 510724 510725 510726 510727 510781 510800 510801 510802 510811 510812 510821 510822 510823 510824 510900 510901 510903 510904 510921 510922 510923 511000 511001 511002 511011 511024 511025 511028 511100 511101 511102 511111 511112 511113 511123 511124 511126 511129 511132 511133 511181 511300 511301 511302 511303 511304 511321 511322 511323 511324 511325 511381 511400 511401 511402 511421 511422 511423 511424 511425 511500 511501 511502 511521 511522 511523 511524 511525 511526 511527 511528 511529 511600 511601 511602 511621 511622 511623 511681 511700 511701 511702 511721 511722 511723 511724 511725 511781 511800 511801 511802 511821 511822 511823 511824 511825 511826 511827 511900 511901 511902 511921 511922 511923 512000 512001 512002 512021 512022 512081 513200 513221 513222 513223 513224 513225 513226 513227 513228 513229 513230 513231 513232 513233 513300 513321 513322 513323 513324 513325 513326 513327 513328 513329 513330 513331 513332 513333 513334 513335 513336 513337 513338 513400 513401 513422 513423 513424 513425 513426 513427 513428 513429 513430 513431 513432 513433 513434 513435 513436 513437 520000 520100 520101 520102 520103 520111 520112 520113 520114 520121 520122 520123 520181 520200 520201 520203 520221 520222 520300 520301 520302 520303 520321 520322 520323 520324 520325 520326 520327 520328 520329 520330 520381 520382 520400 520401 520402 520421 520422 520423 520424 520425 522200 522201 522222 522223 522224 522225 522226 522227 522228 522229 522230 522300 522301 522322 522323 522324 522325 522326 522327 522328 522400 522401 522422 522423 522424 522425 522426 522427 522428 522600 522601 522622 522623 522624 522625 522626 522627 522628 522629 522630 522631 522632 522633 522634 522635 522636 522700 522701 522702 522722 522723 522725 522726 522727 522728 522729 522730 522731 522732 530000 530100 530101 530102 530103 530111 530112 530113 530121 530122 530124 530125 530126 530127 530128 530129 530181 530300 530301 530302 530321 530322 530323 530324 530325 530326 530328 530381 530400 530401 530402 530421 530422 530423 530424 530425 530426 530427 530428 530500 530501 530502 530521 530522 530523 530524 530600 530601 530602 530621 530622 530623 530624 530625 530626 530627 530628 530629 530630 530700 530701 530702 530721 530722 530723 530724 530800 530801 530802 530821 530822 530823 530824 530825 530826 530827 530828 530829 530900 530901 530902 530921 530922 530923 530924 530925 530926 530927 532300 532301 532322 532323 532324 532325 532326 532327 532328 532329 532331 532500 532501 532502 532522 532523 532524 532525 532526 532527 532528 532529 532530 532531 532532 532600 532621 532622 532623 532624 532625 532626 532627 532628 532800 532801 532822 532823 532900 532901 532922 532923 532924 532925 532926 532927 532928 532929 532930 532931 532932 533100 533102 533103 533122 533123 533124 533300 533321 533323 533324 533325 533400 533421 533422 533423 540000 540100 540101 540102 540121 540122 540123 540124 540125 540126 540127 542100 542121 542122 542123 542124 542125 542126 542127 542128 542129 542132 542133 542200 542221 542222 542223 542224 542225 542226 542227 542228 542229 542231 542232 542233 542300 542301 542322 542323 542324 542325 542326 542327 542328 542329 542330 542331 542332 542333 542334 542335 542336 542337 542338 542400 542421 542422 542423 542424 542425 542426 542427 542428 542429 542430 542500 542521 542522 542523 542524 542525 542526 542527 542600 542621 542622 542623 542624 542625 542626 542627 610000 610100 610101 610102 610103 610104 610111 610112 610113 610114 610115 610116 610122 610124 610125 610126 610200 610201 610202 610203 610204 610222 610300 610301 610302 610303 610304 610322 610323 610324 610326 610327 610328 610329 610330 610331 610400 610401 610402 610403 610404 610422 610423 610424 610425 610426 610427 610428 610429 610430 610431 610481 610500 610501 610502 610521 610522 610523 610524 610525 610526 610527 610528 610581 610582 610600 610601 610602 610621 610622 610623 610624 610625 610626 610627 610628 610629 610630 610631 610632 610700 610701 610702 610721 610722 610723 610724 610725 610726 610727 610728 610729 610730 610800 610801 610802 610821 610822 610823 610824 610825 610826 610827 610828 610829 610830 610831 610900 610901 610902 610921 610922 610923 610924 610925 610926 610927 610928 610929 611000 611001 611002 611021 611022 611023 611024 611025 611026 620000 620100 620101 620102 620103 620104 620105 620111 620121 620122 620123 620200 620201 620300 620301 620302 620321 620400 620401 620402 620403 620421 620422 620423 620500 620501 620502 620503 620521 620522 620523 620524 620525 620600 620601 620602 620621 620622 620623 620700 620701 620702 620721 620722 620723 620724 620725 620800 620801 620802 620821 620822 620823 620824 620825 620826 620900 620901 620902 620921 620922 620923 620924 620981 620982 621000 621001 621002 621021 621022 621023 621024 621025 621026 621027 621100 621101 621102 621121 621122 621123 621124 621125 621126 621200 621201 621202 621221 621222 621223 621224 621225 621226 621227 621228 622900 622901 622921 622922 622923 622924 622925 622926 622927 623000 623001 623021 623022 623023 623024 623025 623026 623027 630000 630100 630101 630102 630103 630104 630105 630121 630122 630123 632100 632121 632122 632123 632126 632127 632128 632200 632221 632222 632223 632224 632300 632321 632322 632323 632324 632500 632521 632522 632523 632524 632525 632600 632621 632622 632623 632624 632625 632626 632700 632721 632722 632723 632724 632725 632726 632800 632801 632802 632821 632822 632823 640000 640100 640101 640104 640105 640106 640121 640122 640181 640200 640201 640202 640205 640221 640300 640301 640302 640323 640324 640381 640400 640401 640402 640422 640423 640424 640425 640500 640501 640502 640521 640522 650000 650100 650101 650102 650103 650104 650105 650106 650107 650109 650121 650200 650201 650202 650203 650204 650205 652100 652101 652122 652123 652200 652201 652222 652223 652300 652301 652302 652323 652324 652325 652327 652328 652700 652701 652722 652723 652800 652801 652822 652823 652824 652825 652826 652827 652828 652829 652900 652901 652922 652923 652924 652925 652926 652927 652928 652929 653000 653001 653022 653023 653024 653100 653101 653121 653122 653123 653124 653125 653126 653127 653128 653129 653130 653131 653200 653201 653221 653222 653223 653224 653225 653226 653227 654000 654002 654003 654021 654022 654023 654024 654025 654026 654027 654028 654200 654201 654202 654221 654223 654224 654225 654226 654300 654301 654321 654322 654323 654324 654325 654326 659000 659001 659002 659003 659004 710000 810000 820000}

LOCATION_LENGTH = LOCATION_CODE.size

CALC_C = %w{7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2}
CALC_V = %w{1 0 X 9 8 7 6 5 4 3 2}

card_numbers = []

#生成一百个测试下
100.times do   
  card_number = "#{LOCATION_CODE[rand(LOCATION_LENGTH)]}"
  #定死为 19**年的
  card_number &lt;&lt; "19"
  card_number &lt;&lt; rand(100).to_s.rjust(2, '0')
  card_number &lt;&lt; rand(13).to_s.rjust(2, '0')
  
  #日期，简单的点的，生成28之内的两位数
  card_number &lt;&lt; rand(28).to_s.rjust(2, '0')

  #生成两位随机数和一个奇偶位，偷懒，直接随机生成
  card_number &lt;&lt; rand(1000).to_s.rjust(3, '0')
  
  calc = 0

  #计算和
  card_number.split("").each_with_index do |char,index|
    calc += char.to_i * CALC_C[index].to_i 
  end

  #获取最后一位验证码
  card_number &lt;&lt; CALC_V[calc%11]
  card_numbers &lt;&lt; card_number
end
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/200034#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jun 2008 11:40:26 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/200034</link>
        <guid>http://mmm.javaeye.com/blog/200034</guid>
      </item>
      <item>
        <title>AOM2 组件介绍（一）：DataGrid</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/195655" style="color:red;">http://mmm.javaeye.com/blog/195655</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DataGrid 应该是最常用的组件之一，第一篇我们先来介绍AOM2组件之DataGrid.<br /><br />我们先来回顾下之前的做法：<br /><pre name="code" class="java">
@Bind
private List&lt;user> grid;
</pre><br /><br />然后直接在页面上编码，显示数据。<br /><pre name="code" class="xml">
&lt;w:datagrid paged="true" rows="20" id="users" contextmenu="true" toolbarposition="top" var="user">
  &lt;w:outputcolumn header="用户名" value="#{user.username}">
  &lt;w:outputcolumn header="电子邮件" value="#{user.email}">
&lt;/w:outputcolumn>
</pre><br /><br />AOM2的对DataGrid 进行了重新设计，主要通过ViewProvider,RowDataProvider分类提供视图和数据的展示<br /><br /><br />一起来实践：<br /><br />新建一Faces 页面 grid.xml。<br /><pre name="code" class="xml">
&lt;f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:w="http://www.apusic.com/jsf/widget" xmlns:layout="http://www.apusic.com/jsf/layout" xmlns:ajax="http://www.apusic.com/jsf/ajax" renderkitid="AJAX">
	&lt;w:head>
		
	&lt;/w:head>
	&lt;w:page title="Grid Demo">
		&lt;w:datagrid id="grid">
	&lt;/w:datagrid>
&lt;/w:page>
</pre><br /><br />很简单，就写了一行代码<br /><pre name="code" class="xml">
&lt;w:dataGrid id="grid"/>
</pre><br /><br />在GridBean 中新建一UIDataGrid，并绑定到id为grid的页面组件<br /><pre name="code" class="java">
@Bind
private UIDataGrid grid;
</pre><br /><br />新建一个class:User.java用来展示数据<br /><pre name="code" class="java">
public class User {
	private String id;
	private String name;
	private String email;
        //getter and setter ...

        public User(String id, String name, String email) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
	}

	public User() {

	}
        //顺手写几个测试数据，用于下面的测试
	public static List&lt;User> samples(){
		List&lt;User> users = new ArrayList&lt;User>();
		users.add(new User("1","AAA","a@g.com"));
		users.add(new User("2","bbb","b@g.com"));
		users.add(new User("3","CCC","c@g.com"));
		users.add(new User("4","ddd","d@g.com"));
		users.add(new User("5","EEE","e@g.com"));
		users.add(new User("6","fff","f@g.com"));
		return users;
	}
}
</pre><br /><br />新增value属性，就是这个grid的数据来源。<br /><pre name="code" class="java">
@Bind(id = "grid", attribute = "value")
private List&lt;User> users = User.samples();
</pre><br /><br />新增viewProvider属性，这个属性是grid视图展示的一个提供者，包括 Grid的数据列模型，Grid表头的描述模型 等，可以通过viewProvider来设置显示的名称，宽度，是否可以排序，转换类型，对齐方式，以及是否是隐藏列。还可以配置显示复杂的表头，譬如合并多行/多列等<br /><pre name="code" class="java">
	@Bind(id = "grid", attribute = "viewProvider")
	private GridViewProvider viewProvider = new GridViewProvider() {
                //GridViewProvider 是一接口，需要我们实现如下三个方法
                //getColumnModel 为Grid的数据列模型，
		public GridColumnModel getColumnModel(Object input) {
			GridColumnModel model = new GridColumnModel();
                        //新增列，指定id为name
			GridColumn column = new GridColumn("name");
                        //指定宽度为150
                        column.setWidth(150);
                        //可以排序
			column.setEnableSort(true);
                        //添加到grid的数据模型 
			model.addColumn(column);

                        //新增列，指定id为email
			column = new GridColumn("email");
			model.addColumn(column);

                        //新增列，指定id为id
			column = new GridColumn("id");
                        //并将该列设置为隐藏列
			column.setHidden(true);
			model.addColumn(column);
                        
                        //在展示数据的时候，显示行号 
			model.setShowRowNumber(true);
			return model;
		}

		public GridHeaderModel getHeaderModel(Object input) {
			GridHeaderModel model = new GridHeaderModel();
			GridHeader header = new GridHeader();
			GridHeaderCell cell;
                        //新增列的头单元，并命名为"名称" 
			cell = new GridHeaderCell("名称");
			header.addCell(cell);
                        //新增列的头单元，并命名为"电子邮件"    
			cell = new GridHeaderCell("电子邮件");
			header.addCell(cell);
			model.addHeader(header);
			return model;
		}

		public GridSelectionModel getSelectionModel(Object input) {
			return null;
		}
	};
</pre><br /><br />新增rowDataProvider，DataGrid渲染每一行时，会将每一行的数据传递给下面的getLabel方法，由他来决定如何展示数据<br /><pre name="code" class="java">
@Bind(id = "grid", attribute = "rowDataProvider")
	private GridRowDataProvider rowProvider = new GridRowDataProvider() {
                //其中 rowData为每行数据，column 为列信息。
                //通过column.getId可以获得上面定义的列ID
		public Object getLabel(Object rowData, GridColumn column) {
                        //获取当前列的ID
			String id = column.getId();
			User user = (User) rowData;
                        //判断，根据不同的id，展示不同的数据，如果上面的Grid的数据列模型设置了转换，那么会自动调用
			if ("name".equals(id)) {
                                //列的id是name,显示用户名
				return user.getName();
			} else if ("email".equals(id)) {
                                //列的id是email,显示电子邮件
				return user.getEmail();
			}
			return null;
		}
	};
</pre><br /><br />OK，一个基本的数据展示就完成了。可以简单的测试下，浏览下效果。<br /><br />图就忽略了。。。。<br /><br />没有分页，高度一直拉到最下面，太丑了：（<br /><br />一：你可以用最上面的方法，直接在页面上写上属性<br /><pre name="code" class="xml">
&lt;w:datagrid paged="true" rows="20" contextmenu="true" toolbarposition="top" .... />
</pre><br /><br />二：也可以直接通过元数据@ComponentAttributes，批量给组件添加属性，首先还是将上面的datagrid恢复原来的代码<br /><pre name="code" class="xml">
&lt;w:datagrid id="grid"/>
</pre><br /><br />在GridBean代码中，新增<br /><pre name="code" class="java">
@ComponentAttributes(id = "grid")
private Map&lt;String, Object> config;
</pre><br /><br />在构造函数里面，增加相应的属性<br /><pre name="code" class="java">
public GridBean() {
    this.config = = new HashMap&lt;String, Object>();
    //分页
    this.config.put("paged", true);
    //每页10条记录
    this.config.put("rows", 10);
    //根据记录的多少，自动调整表格高度
    this.config.put("autoHeight", true);
    //.....
}
</pre><br /><br /><br />也许有人疑惑了，问，这里的属性paged,rows,autoHeight那里来的，如果你不知道，你可以查看Faces页面对应的属性，这个和那里是一样的关键字。<br /><br />再次测试下，浏览效果<br /><img src="http://mmm.javaeye.com/upload/picture/pic/14875/d2732ba8-86bf-36d9-aeac-2b2efc4d9188.gif" /><br /><br />不错。<br /><br />动态绑定数据：<br />下面我们介绍第二个常用的功能，如何动态的绑定Gridl的数据。<br />首先在那个User.java中新增一个方法，我们填充更多的内容<br /><pre name="code" class="java">
	public static List&lt;User> samples2(){
		List&lt;User> users = new ArrayList&lt;User>();
		for(int i=0;i&lt;10;i++){
			users.addAll(samples());
		}
		return users;
	}
</pre><br /><br />在页面上放一个button<br /><pre name="code" class="xml">
&lt;w:form>
  &lt;w:button id="btn" />
&lt;/w:form>
&lt;w:dataGrid id="grid"/>
</pre><br /><br />绑定button的value,显示字符为“Reload Data”<br /><pre name="code" class="java">
@Bind(id = "btn", attribute = "value")
private String btn_label = "Reload Data";
</pre><br /><br />绑定一个Action,当点击按钮的时候，触发该方法，重新加载新的数据。<br /><pre name="code" class="java">
@Action(id = "btn")
public void changeValues() {
        //首先，赋值新的数据
	this.users = User.samples2();
        //配置第一个显示的记录，这里是估计用了2，用来演示，如果不填写，或者0 那么将会全部展示
	grid.setFirst(2);
        //重新配置表格的每页显示的条数，更新为15条每页
	grid.setRows(15);
        //重新版定Grid,展示新的数据
	this.grid.rebind();
}
</pre><br /><br />注：重新加载数据的时候，不仅仅可以重新赋值，还可以更新viewProvider,rowDataProvider，如 (该片段代码来自于AOM RCDEMOS，推荐阅读)：<br /><br /><pre name="code" class="java">
grid.setViewProvider(GridBeanHelper.getTrainViewProvider());
grid.setRowDataProvider(GridBeanHelper.getTrainRowProvider());
</pre><br /><br />收工，明天继续。<br />Done!
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/195655#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 14:40:59 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/195655</link>
        <guid>http://mmm.javaeye.com/blog/195655</guid>
      </item>
      <item>
        <title>Messaging with Rails</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/187469" style="color:red;">http://mmm.javaeye.com/blog/187469</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          周六在SOR上的PPT，有兴趣的同学一起研究。
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/187469#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 11:18:11 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/187469</link>
        <guid>http://mmm.javaeye.com/blog/187469</guid>
      </item>
      <item>
        <title>2008/04/25 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/186676" style="color:red;">http://mmm.javaeye.com/blog/186676</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://jonathanleighton.com/blog/rails-delegate-default-option" target="_blank">http://jonathanleighton.com/blog/rails-delegate-default-option</a><br /><br />http://code.google.com/p/scope-out-rails/<br /><br />http://rubyforge.org/projects/starling/<br /><br />http://stomp.codehaus.org/<br /><br />http://activemq.apache.org/<br /><br />http://www.infoq.com/articles/intro-active-messaging-rails<br /><br />http://www.novawave.net/public/rails_messaging_tutorial.html
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/186676#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 11:40:51 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/186676</link>
        <guid>http://mmm.javaeye.com/blog/186676</guid>
      </item>
      <item>
        <title>QuickServer 中接口 ClientCommandHandler 的修改</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/180364" style="color:red;">http://mmm.javaeye.com/blog/180364</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ClientCommandHandler 中的原gotConnected,closingConnection,lostConnection在1.4.5已经转移到ClientEventHandler 中。而原有的ClientCommandHandler 仅有一个handleCommand。<br /><br />原有Guide也应该相应的做修改为：<br /><pre name="code" class="java">public class EchoCommandHandler implements ClientCommandHandler ,ClientEventHandler </pre>
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/180364#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Apr 2008 10:35:57 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/180364</link>
        <guid>http://mmm.javaeye.com/blog/180364</guid>
      </item>
      <item>
        <title>Elite教程系列(二)：模式匹配 Pattern Matching</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/170160" style="color:red;">http://mmm.javaeye.com/blog/170160</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          模式匹配(Pattern Matching)，这个已经不是什么新的概念了，很多语言都是，包括现在大家都在学习的erlang.今天我来讨论下elite中的模式匹配。<br /><br />首先来个例子：<br /><pre name="code" class="java">
define [a,b] = ['1',[1,2,3]]
a->print
b->print
</pre><br /><br />a,b 分别和 a ,[1,2,3] 匹配。<br /><br />执行上面的代码输出<br /><div class="quote_title">引用</div><div class="quote_div"><br />elite sample.xel<br />1<br />[1, 2, 3]<br /></div><br /><br />不过可惜的是elite似乎不支持 “|” 语法。<br /><pre name="code" class="java">
define [a,b|c] = ['1',[1,2,3],'dd','cc',[1,2,3,4]]
</pre><br />c 无法匹配后面全部的内容。<br /><br />elite 还支持这样的匹配，很容易读懂   <br /><br /><pre name="code" class="java">
define test(n){  
  : is Number => "$n is number"
  : is String => "$n is string"
}

test(2)->print
test('test')->print
</pre><br /><br />这个就不需要解释了，看下运行的结果就知道了<br /><pre name="code" class="java">
2 is number
test is string
</pre><br /><br />elite还支持基于属性匹配<br /><pre name="code" class="java">
class Person(name){}

define martin = Person.new('Martin')
define kevin = Person.new('Kevin')

martin.name->print
kevin.name->print

define test(p){
  : {name:'Martin'} =>"Hello ${p.name}"
  : {name:'Kevin'}  =>"Welcome back,${p.name}"
}

martin->test->print
kevin->test->print
</pre><br /><br />输出<br /><pre name="code" class="java">
Hello Martin
Welcome back,Kevin
</pre><br /><br />同时我们可以对象其他的属性赋值给局部变量<br /><pre name="code" class="java">
class Person(name,age){}

define martin = Person.new('Martin',26)

define test(p){
  : {name:'Martin',age:x} =>"Hello ${p.name},your are $x years old"
}

martin->test->print
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/170160#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Mar 2008 13:46:11 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/170160</link>
        <guid>http://mmm.javaeye.com/blog/170160</guid>
      </item>
      <item>
        <title>Elite教程系列(一)：快速上手</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/170038" style="color:red;">http://mmm.javaeye.com/blog/170038</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一：什么是Elite.<br />更多的信息，你可以查看 <a href="http://www.operamasks.org" target="_blank">http://www.operamasks.org</a> 浏览<br /><br />二：关于本教程的目录<br />初步的打算：<br />第一篇：快速上手<br />第二篇：数据类型及其控制语句<br />第三篇：内置函数及其扩展<br />第四篇：集成AOM的应用<br />第五篇：独立使用<br />第六篇：思考<br /><br />今天我们先来熟悉下Elite长的什么样子，第一篇：快速上手<br /><br />三：安装<br />当前最新elite版本为0.2，可以从这里下载<br /><a href="http://sourceforge.net/project/showfiles.php?group_id=214934" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=214934</a><br /><br />里面包括elite.jar，elite-src.jar,以及两个启动的脚本<br /><br />四：运行<br />elite自带了一个交互的shell<br /><br />在windows下运行<br /><pre name="code" class="java">
bin/elite.cmd
</pre><br /><br />在*nix下运行<br /><pre name="code" class="java">bin/elite.sh</pre><br /><br />或者直接运行<br /><pre name="code" class="java">java -jar elite.jar</pre><br /><br />启动的界面如下：<br /><img src="http://mmm.javaeye.com/upload/picture/pic/9090/ed368690-ea0b-367a-8582-71d1ec699e02.png" /><br /><br />看到<span style="color: darkred"><strong>></strong></span> 说明已经启动成功，我们先来编写第一个例子：<br /><br />注：<br />elite是基于java的，在运行请前先确认你正确安装了jdk。这方面的资料google下会有很多，我们不多做介绍。<br /><br />五：Hello World<br />每个程序的开篇都是Hello World，我们也不例外，让我们开始elite的Hello world<br /><pre name="code" class="java">
>define hello = "Hello World"
>print(hello)
>Hello World
</pre><br /><br />1：define 在这里是关键字，用来定义变量 <br />2：print  同于常用的System.out.println(hello),这里的括号并不能省略,个人感觉有点不太喜欢，还是偏好括号可选的语法。<br /><pre name="code" class="java">
print hello
</pre><br /><br />同样你可以演练一样简单的计算器，来熟悉下shell<br /><img src="http://mmm.javaeye.com/upload/picture/pic/9100/7da22dbd-39aa-36f7-a1f0-06a73d7f42f4.png" /><br />(这里我们故意的用0做除数，目的就是想查看它报错)<br /><br />六：函数<br /><pre name="code" class="java">
>define sayHello = {name=>"Hello,$name"}
>sayHello("martin")
>Hello martin
</pre><br /><br />看起来似乎不习惯，OK,我们修改下<br /><pre name="code" class="java">
>define sayHello(name){"Hello $name"}
>sayHello("martin")
>Hello martin
</pre><br /><br />哦，这个看起来跟我们普通的函数还长的有点像。<br /><br />我们能否对name做更多一点操作呢？<br />譬如：sayHello2(‘martin’)，能否自动将首字母大写呢？使用过ruby的朋友都知道，ruby的字符对象有个capitalize 方法，<br />Elite内置的方法并没有提供这样的功能，不过Elite够强大，允许你如ruby一样，打开对象，添加属于你自己的方法。你可以通过attach来追加新的方法。<br /><pre name="code" class="java">
String.attach('capitalize') {
  if (this.length > 0) {
     Character.toUpperCase(this[0]) + this[1..*];
   } else {
     this;
   }
}
</pre><br /><br /><br />capitalize是方法名,{} 之间是代码块。在代码块访问本身对象，你可以通过关键字this来访问。<br /><br />现在我们就可以重新定义我们的sayHello了<br /><pre name="code" class="java">
define sayHello3 = {name =>”Hello ${name.capitalize}”} 
</pre><br /><br /><br />七：OO!<br />是的，我们好像漏掉了这一点。但是细心的读者难道不曾想过,elite基于java的，java中的OO同样也是elite中的OO.我们这里介绍的是更多有趣点的东西。<br /><br />Ruby，号称一切皆对象（Oh,my god,老掉牙的话题了）。<br />先从new开始说起：在ruby中,new是object的一个方法<br /><pre name="code" class="java">user = User.new</pre><br />而不是我们java中<br /><pre name="code" class="java">User user= new User()</pre><br /><br />在Elite中你不仅仅可以保持原来的语法，还可以同时使用这一新的语法<br /><pre name="code" class="java">
>define a = new String('aa')
>a
>aa
>define b = String.new('bb')
>b
>bb
</pre><br /><br />哦，看起来不错。不过这个太简单了点。OK,我们继续<br /><img src="http://mmm.javaeye.com/upload/picture/pic/9096/1a37ac0c-6d9b-3ea1-95a5-08bfab8b4fdb.png" /><br /><br />1：）我们定义一个新的class:Greeting<br />2：）通过define定义属性 name<br />4：）构造函数，这个和java一样，没啥区别<br />6：）定义sayHello 函数，返回一串字符。这里或许有同学要疑问了，上面name是包括在${}里面的，为什么到这里不要{}了呢，这个其实是一样的。简洁就是美，去掉之<br />9：）实例化一个Greeting对象，并传递参数’Martin’赋值给name属性<br />10：）调用print属性sayHello的结果<br />12：）修改name的属性值。怎么不需要setter?如果还保持那些，不如回家继续写java代码算了<br />13：）重新输出<br /><br />10、13：）这里我们采用两种不同的输出，仅仅想说明elite的有趣性。我们会再以后的章节详细介绍的。<br /><br />执行，为了能让elite在任何地方执行，建议你将路径添加到当前的PATH中，并且添加ELITE_HOME至当前环境中。<br /><br />现在再执行<br /><pre name="code" class="java">
elite  greeting.xel
</pre><br /><br />会看到输入的结果<br /><img src="http://mmm.javaeye.com/upload/picture/pic/9092/86cd37f2-42a6-3047-afb9-d90ff0b9b121.png" /><br /><br />通过new Object还可以动态的创建对象<br /><pre name="code" class="java">
define greeting = new Object{
  define name

  sayHello(){"Hello $name"}
}

greeting.name = 'Martin'

print(greeting.sayHello())
</pre><br /><br /><br />八：来点更精彩的<br />在elite中运行你自己定义语法，来自于sampels/dsl.xel<br /><pre name="code" class="java">
define syntax {
    Send :message to :someone
=>  print("Hello, ${:someone}! ${:message}.")
}

Send 'Welcome to earth' to 'uncle Martin';

define syntax {
    Convert :amount :from into :to
=>  :amount[:from] -> :to
}

print(Convert 25 DEM into ECU);
</pre><br /><br />Cool！<br /><br />九：接下来<br />敬请关注 elite：）后面的文章更精彩，o(∩_∩)o...
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/170038#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Mar 2008 09:42:38 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/170038</link>
        <guid>http://mmm.javaeye.com/blog/170038</guid>
      </item>
      <item>
        <title>为你的calendar_helper增加ajax功能</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/169776" style="color:red;">http://mmm.javaeye.com/blog/169776</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一：前提<br /> <a href="http://nubyonrails.com" target="_blank">http://nubyonrails.com</a> 提供的calendar_helper 并不支持ajax，而在我们平常应用，经常需要这样的功能：仅仅加载局部的日历。<br /><br />二：动手<br />其实很简单，就是通过Ajax.Updater来更新日历即可。<br />第一步：修改calendar_helper 第100行起的代码，为:<br /><pre name="code" class="java">
        cal = %(&lt;table class="#{options[:table_class]}" border="0" cellspacing="0" cellpadding="0">)
        cal &lt;&lt; %(&lt;thead>&lt;tr>)
        cal &lt;&lt; %(&lt;th colspan="2">&lt;a href='javascript:previous_month(#{options[:year]},#{options[:month]})'>#{options[:previous_month_text]}&lt;a>&lt;/th>)
        colspan=3


        cal &lt;&lt; %(&lt;th colspan="#{colspan}" class="#{options[:month_name_class]}">#{Date::MONTHNAMES[options[:month]]}&lt;/th>)
        cal &lt;&lt; %(&lt;th colspan="2">&lt;a href='javascript:next_month(#{options[:year]},#{options[:month]})'>#{options[:next_month_text]}&lt;/a>&lt;/th>) 
</pre><br /><br /><br />修改default_options 中这两个label<br /><pre name="code" class="java">
  :previous_month_text =>'Previous',
  :next_month_text => 'Next'
</pre><br /><br />第二步：<br />新增route<br /><pre name="code" class="java">
map.calendar '/calendar/:year/:month', :controller=>'calendar'
</pre><br /><br /><br />第三步：<br />具体实现，仅仅为演示，你可以自己实现你的代码<br /><br />在页面上增加日历<br /><pre name="code" class="java">
  new Ajax.Updater('calendar', '/calendar/2008/03')
</pre><br /><br />新增Action<br /><pre name="code" class="java">
    def calendar
        now =Time.now
        @year = params[:year]||now.year
        @month = params[:month]||now.month
        …..
       @dates = @someresults.collect(&:some_date_field)
       render :partial=>'calendar'
   End
</pre><br />新增页面_partial.html.erb<br /><br /><pre name="code" class="java">
&lt;%=
    calendar(:year => @year, :month => @month) do |d|
        if @dates.include?(d)
            [d.mday, {:class => "specialDay", :onclick=>"go('/programs/#{d.to_s(:db)}')", :target=>'_blank'}]
        else
            [d.mday, {:class => "normalDay"}]
        end
    end
%>
</pre><br /><br />效果<br /><img src="http://mmm.javaeye.com/upload/picture/pic/9040/9c1b45b1-5d3e-36e7-8ec6-9bbb77f5a6b5.png" /><br /><br />点击上一月，下一月，查看firebug的console，会看到发送不同的请求，日历部分的页面片段会同时改变。<br /><br />Done。
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/169776#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Mar 2008 12:42:07 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/169776</link>
        <guid>http://mmm.javaeye.com/blog/169776</guid>
      </item>
      <item>
        <title>AOM 初体验（一）</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/169018" style="color:red;">http://mmm.javaeye.com/blog/169018</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          AOM2.0M1在2月2号就发布了：<br /><div class="quote_title">引用</div><div class="quote_div">Apusic OperaMasks 2.0 M1 发布<br />1.  升级到Ext2.0<br />2.  IoVC编程模型支持<br />3.  无状态支持<br />4.  增强调试辅助<br />5.  完善的布局组件<br />6.  组件快速开发支持</div><br /><br />还有就是现在地球人都知道的：约定优先配置（Convention Over Configuration），AOM在2.0M1中已经得到了很大的支持。<br /><br />我们以用户登陆例子开始AOM2.0的探索之旅。<br /><br />新建apusic标准项目<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8866/2fa57464-f678-33a5-a715-30607ee87e9d.png" /><br /><br /><img src="http://mmm.javaeye.com/upload/picture/pic/8878/dc36149f-7361-340a-9872-f8fe751173f1.png" /><br />点击 完成<br /><br />新建一个web模块<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8880/c90c90de-b25c-39c0-96cc-a6ebea26d668.png" /><br />点击下一步，将默认后缀名xhtml 选上<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8882/b90b07ca-c253-3cd9-aa5e-5d564a952c69.png" /><br />点击完成。<br /><br />在web/webContent下新建登陆页面 login.xhtml<br /><pre name="code" class="java">
&lt;f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
  xmlns:w="http://www.apusic.com/jsf/widget" xmlns:layout="http://www.apusic.com/jsf/layout"
  xmlns:ajax="http://www.apusic.com/jsf/ajax"
  renderKitId="AJAX" xmlns:h="http://java.sun.com/jsf/html">	
  &lt;w:page>
    &lt;w:form clientValidate="true">
      &lt;layout:panelGrid columns="3">
                     
         &lt;h:outputLabel for="username"/>
         &lt;w:textField id="username"/>
         &lt;h:message for="username"/>
        
         &lt;h:outputLabel for="password"/>      
         &lt;h:inputSecret id="password" />
         &lt;h:message for="password"/>               							
         &lt;h:outputText id="message"/>	               
      &lt;/layout:panelGrid>
      &lt;layout:panelGrid>        
        &lt;w:button id="login"/>
      &lt;/layout:panelGrid>
    &lt;/w:form>    
  &lt;/w:page>
&lt;/f:view>
</pre><br /><br />页面很简单，就是一个表单，包括用户名、密码还有个按钮。可是为什么label的value都没有值呢？不急，我们先继续做下去。<br /><br />在web/src下，新建LoginBean.java<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8874/dbd8eaaf-6e4a-39bb-b245-6b47f55dc4ca.png" /><br /><br /><img src="http://mmm.javaeye.com/upload/picture/pic/8876/690a733e-a27e-3b70-ab74-4cc7ae26a314.png" /><br />点击完成。<br /><br />那么页面上的控件如何和代码绑定呢？<br />在Bean中<br />   1：属性是通过元数据@Bind   来绑定页面对应控件的ID的。<br />   2：方法是通过元数据@Action 来绑定页面对应控件的ID <br /><br />LoginBean 修改成如下代码<br /><pre name="code" class="java">
package org.operamasks.demo.login;

import org.operamasks.faces.annotation.Action;
import org.operamasks.faces.annotation.Bind;
import org.operamasks.faces.annotation.ManagedBean;
import org.operamasks.faces.annotation.ManagedBeanScope;

@ManagedBean(scope = ManagedBeanScope.SESSION)
public class LoginBean {
	/**
	 * 用户账号
	 * 
	 * @Bind 表示绑定页面对应的控件
	 */
	@Bind
	private String username;

	/**
	 * 用户密码
	 * 
	 * @Bind 表示绑定页面对应的控件
	 */
	@Bind
	private String password;

	/**
	 * 绑定页面id为message控件，用于显示消息
	 */
	@Bind
	private String message;

	/**
	 * 用户登陆
	 * 
	 * @Action 表示页面对应id控件的action 
	 */
	@Action
	public void login() {
            this.message = "欢迎你："+this.username;
	}
}
</pre><br /><br />绑定的属性是可以直接在页面上通过el之类的表达式访问的，因此也无需要getter/setter了。<br /><br />如何将页面和Bean对应起来，在jsf中，大家都知道通过faces-config.xml 来配置url,model-bean.在AOM中，可以简化掉这繁琐的工作。<br />在webContent/web-inf/目录下，新建operamasks.xml<br /><pre name="code" class="java">
&lt;?xml version="1.0"?>

&lt;operamasks-config xmlns="http://www.operamasks.org/IoVC"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.operamasks.org/IoVC http://www.operamasks.org/schema/operamasks.xsd ">
	&lt;view-mapping>
		&lt;url-pattern>*&lt;/url-pattern>
		&lt;model-bean>#{~View}Bean&lt;/model-bean>
	&lt;/view-mapping>
&lt;/operamasks-config>
</pre><br /><br />login.xhtml 会自动寻找bean:LoginBean，如果你的bean的name为小写,即loginBean，那么将<pre name="code" class="java">
&lt;model-bean>#{~View}Bean&lt;/model-bean>
</pre><br />中的大写V改成小写的v即可<br /><pre name="code" class="java">
&lt;model-bean>#{~view}Bean&lt;/model-bean>
</pre><br /><br />在那里配置bean的name?<br />哦，忘记了。在LoginBean代码中<br /><pre name="code" class="java">
@ManagedBean(name="loginBean",scope = ManagedBeanScope.SESSION)
public class LoginBean {
}
</pre><br />如果没有写，默认的是LoginBean。<br /><br />好了，这就是全部可以运行的代码，我们测试下<br />Apusic Studio默认已经内置支持apusic，选择login.xhtml，点击右键浏览即可<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8884/85a92816-6a09-3602-875b-62ca35149a9f.png" /><br /><br />有人要问，是不是不能在其他的服务器上运行呢？<br />当然可以，AOM并没有绑定死在Apusic上，如果你愿意(想)，当然没有任何问题的。你可以参考operamasks.org上的文档<br /><a href="http://infocenter.apusic.com/help/index.jsp?topic=/org.operamasks.infocenter/output/eclipse/install_requirement.html" target="_blank">http://infocenter.apusic.com/help/index.jsp?topic=/org.operamasks.infocenter/output/eclipse/install_requirement.html</a><br /><br /><img src="http://mmm.javaeye.com/upload/picture/pic/8886/f1c3a484-4311-309d-b8ec-d439408b8eca.png" /><br />输入用户名测试下：<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8888/10904ac1-b651-3e6d-bf30-aad74a2366ff.png" /><br /><br />用户名和密码都是必须的，我该如何验证呢？<br />OK,该@Required登场了。修改LoginBean.java,在需要验证的地方，加上@Required元数据<br /><pre name="code" class="java">
	/**
	 * 用户账号
	 * 
	 * @Bind 表示绑定页面对应的控件
	 * @Required 验证 表示该属性是必须的
	 */
	@Bind
	@Required
	private String username;

	/**
	 * 用户密码
	 * 
	 * @Bind 表示绑定页面对应的控件
	 * @Required 验证 表示该属性是必须的
	 */
	@Bind
	@Required
	private String password;
</pre><br /><br />保存代码，刷新下页面，看看效果<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8890/2ad2effd-bc3a-369d-b062-05a10652ca28.png" /><br /><br />Great!<br /><br />可是这个我可以放在客户端先验证的，没必要直接提交给服务器验证，该怎么办？<br />这个提议不错，AOM当然也提供支持，修改login.xhtml<br /><pre name="code" class="java">
&lt;w:form>
</pre><br />为<br /><pre name="code" class="java">
&lt;w:form clientValidate="true">
</pre><br /><br />打开FireBug, 盯着 Console，再刷新，哦，确实是在客户端验证了。<br /><br />那么错误信息可以自定义吗？<br />@Bind有个message属性，你可以直接输入 @Bind(messages="Ooops....")<br /><br />还有更多验证吗？<br />当然有，不过不是本文的范围，会在接下来的文章中专门介绍。<br /><br />输入框旁边的字符这么出来的呢？<br />这个是根据你的id自动产生的，首字母大写。<br /><br />可是我想改呢？<br />控件都有个value的属性，直接修改即可<br /><pre name="code" class="java">
&lt;h:outputLabel for="username" value="用户名"/>
</pre><br /><br />看着上面直接在代码中输入 message ,value="用户名" 感觉代码的坏味道又出来了，我要全球化怎么办？<br />AOM很好，也很强大:) 已经有很到的支持了，每个bean会自动去加载同目录级别下的LocalStrings_xxx.properties<br /><br />在LoginBean.java同目录新建<br />LocalStrings_en_US.properties<br /><pre name="code" class="java">
LoginBean.username.label=Username
LoginBean.password.label=Password
LoginBean.login.label=Login
</pre><br /><br />LocalStrings_zh_CN.properties<br /><pre name="code" class="java">
LoginBean.username.label=用户名
LoginBean.password.label=密码
LoginBean.login.label=登陆
</pre><br /><br />再次浏览页面<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8896/628e0fb6-4227-3b2c-adce-6a03dc11c931.png" /><br />错误信息的改变：<br /><img src="http://mmm.javaeye.com/upload/picture/pic/8894/10b20168-45d5-3db6-85cc-4de8c9320d3a.png" /><br /><br />还等什么呢？还不快来试试:)
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/169018#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 12:24:31 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/169018</link>
        <guid>http://mmm.javaeye.com/blog/169018</guid>
      </item>
      <item>
        <title>让你的相册炫起来</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/164304" style="color:red;">http://mmm.javaeye.com/blog/164304</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先，请先浏览<a href="http://www.piclens.com/" target="_blank">http://www.piclens.com/</a>，安装Firefox或IE的插件<br /><br />默认已经支持了很多的网站。<br /><img src="http://www.piclens.com/site/images/p-piclens-brands.png" /><br /><br />怎么使用？<br /><a href="http://www.piclens.com/site/firefox/tutorial_pl_ff.php" target="_blank">http://www.piclens.com/site/firefox/tutorial_pl_ff.php</a><br /><br />看完之后也许你也会和我有一样的想法，我能不能给自己的网站上加上呢？ 我们每个会员都有自己的 JavaEye的相册的？<br /><br />很幸运，目前PicLens已经提供相应的支持。<br /><a href="http://piclens.com/lite/webmasterguide.php" target="_blank">http://piclens.com/lite/webmasterguide.php</a><br /><br />文档已经很详细了，这个没啥好说的，这也不是我们今天要说的重点。我们的目的是新建个插件，让其他的用户不需要再过问这些繁琐的东西，直接拿来用就行了。<br /><br /><br />=============================不想看过程，直接跳到下个分割线=================================<br /><br />新建插件<br /><pre name="code" class="java">
ruby script/generate plugin pic_lens_lite_helper
</pre><br /><br />这里主要的就是图片的rss,参照piclens上的文档，uuid和link是必须的，这个难不倒我们，一个builder而已。<br /><br /><pre name="code" class="ruby">
module PicLensLiteHelper
    module ActionController
        def piclens_rss(photos=[], options={})
            xml = Builder::XmlMarkup.new(:indent =>2)
            xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8", :standalone=>"yes"
            xml.rss 'version'=>'2.0', 'xmlns:media' => 'http://search.yahoo.com/mrss' do
                xml.channel do
                    xml.title  options[:title]||''
                    xml.link  options[:link]||''
                    xml.description  options[:description]||''
                    photos.each do |photo|
                        xml.item do
                            xml.title  photo.title if photo.respond_to?(:title)
                            xml.link   photo.link #必须的参数
                            xml.guid   UUID.random_create.to_s
                            xml.media  :thumbnail, :url=>photo.thumbnail  if photo.respond_to?(:thumbnail)
                            xml.media  :content,   :url=>photo.url  if photo.respond_to?(:url)
                        end
                    end

                    yield xml if block_given?
                end
            end
        end

        def render_piclens_rss_for(photos=[], options={})
            render :text=> piclens_rss(photos, options), :content_type => Mime::XML
        end
    end

    module ActionView
        #一个helper而已，代码有点丑，呵呵
        def piclens_includes(url, options={})
            if options[:local]
                %Q{&lt;link rel="alternate" href="#{url}" type="application/rss+xml" title="" id="gallery"/>
                  &lt;script type="text/javascript" src="/javascripts/piclens.js"/>}
            else
                %Q{&lt;link rel="alternate" href="#{url}" type="application/rss+xml" title="" id="gallery"/>
                &lt;script type="text/javascript" src="http://lite.piclens.com/current/piclens.js"/>}
            end
        end
    end
end
</pre><br /><br />include 这两个方法<br /><pre name="code" class="ruby">
ActionView::Base.send :include, PicLensLiteHelper::ActionView
ActionController::Base.send :include, PicLensLiteHelper::ActionController
</pre><br /><br />=============================不想看演示，直接跳到下个分割线=================================<br />使用之。。。。<br /><br /><pre name="code" class="java">
rails pic_lens_lite_demo
</pre><br /><br />安装插件<br /><pre name="code" class="java">
ruby script/plugin install http://martinx.googlecode.com/svn/trunk/plugins/pic_lens_lite_helper
</pre><br /><br />新建model:photo<br /><pre name="code" class="java">
ruby script/generate scaffold photo title:string link:string thumbnail:string url:string
</pre><br /><br /><br />添加 PiclensLite js和 所照片的 rss feed<br /><pre name="code" class="java">
 &lt;%= piclens_includes formatted_photos_path(:rss)%>
</pre><br /><br />同时我们还提供了一个本地js,已防止用户无法连接piclens.com的网站。执行<br /><pre name="code" class="java">
rake picslen:install
</pre><br />将js拷贝至public/javascripts目录下。<br /><br />将上面的代码修改成<br /><pre name="code" class="java">
&lt;%= piclens_includes formatted_photos_path(:rss), :local=>true %>
</pre><br /><br />好了，最后一步生成piclens需要的rss<br /><pre name="code" class="ruby">
        @photos = Photo.find(:all)

        respond_to do |format|
            format.html # index.html.erb
            format.xml  { render :xml => @photos }
            format.rss  { render_piclens_rss_for @photos}
        end
</pre><br /><br /><strong><span style="color: darkred">如何基于已有的model上使用呢</span></strong><br />最简单，偷懒的方法：定义一个link 函数即可<br /><pre name="code" class="ruby">
Someodle &lt;AR
   def link
      "" #这里给出图片的具体路径即可,譬如"/static/images/#{self.image}" etc.
   end
end
</pre><br /><br />更多功能<br /><pre name="code" class="ruby">
def thumbnail;end #缩微图
def title;end     #图片标题 
</pre><br /><br />===============================================================================<br />完整的文件请下载附件<br /><br />Env:<br />  rails 2.0<br />  sqlite3
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/164304#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 17:06:03 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/164304</link>
        <guid>http://mmm.javaeye.com/blog/164304</guid>
      </item>
      <item>
        <title>2008/02/18 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/162919" style="color:red;">http://mmm.javaeye.com/blog/162919</a>&nbsp;
          发表时间: 2008年02月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Mechanize<br /><a href="http://mechanize.rubyforge.org/mechanize/" target="_blank">http://mechanize.rubyforge.org/mechanize/</a><br /><a href="http://tenderlovemaking.com/category/mechanize/" target="_blank">http://tenderlovemaking.com/category/mechanize/</a><br /><br />Cookes 相关<br /><a href="http://snippets.dzone.com/tag/cookies" target="_blank">http://snippets.dzone.com/tag/cookies</a><br /> <br />Snarl<br /><a href="http://www.fullphat.net/" target="_blank">http://www.fullphat.net/</a><br /><br />BackgrounDRb<br /><a href="http://backgroundrb.rubyforge.org/" target="_blank">http://backgroundrb.rubyforge.org/</a><br /><br /><br />newjs<br /><a href="http://newjs.rubyforge.org/" target="_blank">http://newjs.rubyforge.org/</a><br /><br /><br />http://www.caliban.org/ruby/
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/162919#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Feb 2008 11:40:38 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/162919</link>
        <guid>http://mmm.javaeye.com/blog/162919</guid>
      </item>
      <item>
        <title>2008/02/16 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/162600" style="color:red;">http://mmm.javaeye.com/blog/162600</a>&nbsp;
          发表时间: 2008年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Ruby GUI Toolkits<br />http://www.trug.ca/Ruby_GUI_Toolkits<br /><br /><br />http://developer.amazonwebservices.com/connect/entry.jspa?categoryID=139&externalID=1182<br /><br />FastSessions Rails Plugin<br />http://blog.kovyrin.net/2008/02/06/fastsessions-rails-plugin-released/
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/162600#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Feb 2008 10:54:40 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/162600</link>
        <guid>http://mmm.javaeye.com/blog/162600</guid>
      </item>
      <item>
        <title>2008/02/01 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/160968" style="color:red;">http://mmm.javaeye.com/blog/160968</a>&nbsp;
          发表时间: 2008年02月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://nubyonrails.com/articles/better-reporting-with-sparklines" target="_blank">http://nubyonrails.com/articles/better-reporting-with-sparklines</a><br />http://nubyonrails.com/pages/sparklines<br /><br />http://www.dsg4.com/04/extra/bitmap/
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/160968#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Feb 2008 12:50:01 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/160968</link>
        <guid>http://mmm.javaeye.com/blog/160968</guid>
      </item>
      <item>
        <title>Yet another chart plugin</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/159063" style="color:red;">http://mmm.javaeye.com/blog/159063</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          图表的插件已经越来越多了，连google也提供了相应的api，今天我们再来折腾一个。这个插件基于<br />Open Flash Chart:http://teethgrinder.co.uk/open-flash-chart/<br /><br />官方文档中提到了rails相关插件，其中有一个http://pullmonkey.com/写的，能用，但是感觉代码混乱，并且每次都会include一个swfobject.js，一个图还要写个action,不爽。于是乎想动手重写。<br /><br />=====================================分割线===================================<br /><br />分两步走：<br />第一：增加view相关的helper<br />第二：完全从写他的Grahp代码<br /><br />今天先来说说第一步<br />首先new 一个 plugin<br /><pre name="code" class="java">
ruby script/generate plugin open_flash_chart
</pre><br /><br />下载 http://teethgrinder.co.uk/open-flash-chart/ 上最新的代码，将open-flash-chart.swf 和 swfobject.js 按下图放置<br /><img src="http://mmm.javaeye.com/upload/picture/pic/7223/f5b6e95b-5ca2-3859-ad95-278b2e192442.gif" /><br /><br /><br />新增task,用于将js,swf拷贝至public目录下,这个就很简单了，就是FileUtils cp 就可以了<br />file:/vendor/plugins/open_flash_chart/tasks/open_flash_chart_tasks.rake<br /><pre name="code" class="java">
namespace :chart do
  desc 'Install the Open Flash Chart components'
  task :install do
    require 'fileutils'

    FileUtils.rm_rf(File.join(File.join(RAILS_ROOT, 'public', 'javascripts', 'open_flash_chart')))
    FileUtils.cp_r(File.join(File.dirname(__FILE__), '..', 'public', 'javascripts', 'open_flash_chart'),
            File.join(RAILS_ROOT, 'public', 'javascripts'))
  end
end
</pre><br /><br /><br />增加javascript_include_tag，我们定义为:chart<br />file:/vendor/plugins/open_flash_chart/lib/open_flash_chart.rb<br /><pre name="code" class="java">
module ActionView::Helpers::AssetTagHelper
  alias_method :old_javascript_include_tag, :javascript_include_tag

  def javascript_include_tag(*sources)
    main_sources, application_source = [], []
    if sources.include?(:chart)
      sources.delete(:chart)
      sources.push('open_flash_chart/swfobject')
    end
    unless sources.empty?
      main_sources = old_javascript_include_tag(*sources).split("\n")
      application_source = main_sources.pop if main_sources.last.include?('application.js')
    end
    [main_sources.join("\n"), application_source].join("\n")
  end
end
</pre><br /><br />增加view的helper方法，用于显示图片，这样就不用再新建一个action了<br />file:/vendor/plugins/open_flash_chart/lib/open_flash_chart.rb<br /><pre name="code" class="java">
module OpenFlashChart
  module Helper        
    def open_flash_chart(width, height, url, background_color='#FFFFFF')
      uuid = UUID.random_create.to_s
      &lt;&lt;doc
&lt;div id="#{uuid}">
  Open Flash Chart.
&lt;/div>

&lt;script type="text/javascript">
   var so = new SWFObject("/javascripts/open_flash_chart/open-flash-chart.swf", "Open Flash Chart", "#{width}", "#{height}", "9", "#{background_color}");
   so.addVariable("variable","true");
   so.addVariable("data", "#{url}");
   so.addParam("allowScriptAccess", "sameDomain");
   so.write("#{uuid}");
&lt;/script>
doc
    end

    alias chart open_flash_chart
  end
end
</pre><br /><br />这里我们采用UUID来生成DIV的ID。(关于UUID可以参考我很久以前写的一篇帖子：http://mmm.javaeye.com/blog/24298)<br /><br /><br />目前还没有时间自己来写graph的代码，继续沿用pullmonkey的，我们拿到手修改之，删掉不需要的，这断没有太的意思，代码又长，就不写了。<br /><br />require 和 include 我们上面的代码<br />file:/vendor/plugins/open_flash_chart/init.rb<br /><pre name="code" class="java">
require 'uuidtools'
require 'open_flash_chart'
require 'graph'

ActionView::Base.send :include, OpenFlashChart::Helper
</pre><br /><br /><br />一个新的插件就诞生了，虽然现在还是基于pullmonkey写的，但是以后有时间一定会再次折腾：）<br /><br />=====================================分割线===================================<br /><br />我知道很多人对怎么折腾并不感兴趣，也许会跟我说:"别啰唆，告诉我怎么用就行了，烦死了"<br /><br />OK<br /><br />首先请忽略上面所有的内容，安装插件<br /><pre name="code" class="java">
ruby script/plugin install http://martinx.googlecode.com/svn/trunk/plugins/open_flash_chart
</pre><br /><br /><br />执行task拷贝js和swf文件<br /><pre name="code" class="java">
rake chart:install
</pre><br /><br />在你的layout中添加javascript_include_tag :chart<br /><pre name="code" class="java">
&lt;%= javascript_include_tag :defaults, :chart %>
</pre><br /><br />在视图中使用 open_flash_chart 或者 chart 显示图表<br /><pre name="code" class="java">
&lt;%= chart width, height, url[,background]%>
</pre><br /><br />来个具体的例子吧：<br /><br />我们采用http://pullmonkey.com/projects/open_flash_chart/view_source_code/candle中的代码<br /><br />新建controller demo<br /><pre name="code" class="java">
ruby script/generate controller demo index
</pre><br /><br />修改：<br />/app/views/demo/index.html.erb<br /><pre name="code" class="java">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
&lt;html xmlns="http://www.w3.org/1999/xhtml">
&lt;head>
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    &lt;%= javascript_include_tag :defaults, :chart %>
&lt;/head>
&lt;body>
&lt;%= chart 500, 250, '/demo/candle' %>
&lt;/body>
&lt;/html>
</pre><br /><br />新建action :candle <br />file:/app/controllers/demo_controller.rb<br /><pre name="code" class="java">
重复的代码没什么好拷贝的，请查阅http://pullmonkey.com/projects/open_flash_chart/view_source_code/candle 上的action:candle
</pre><br /><br />启动server,浏览一下 http://host:port/demo<br /><br />来个截图：<br /><img src="http://mmm.javaeye.com/upload/picture/pic/7229/1491b1c7-5c6b-3fae-9afb-8194ff4f3296.gif" /><br /><br />下一步，下一步，彻底放弃他的graph.rb。<br /><br />TO BE CONTINUE....
          <br/>
          <span style="color:red;">
            <a href="http://mmm.javaeye.com/blog/159063#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 13:53:05 +0800</pubDate>
        <link>http://mmm.javaeye.com/blog/159063</link>
        <guid>http://mmm.javaeye.com/blog/159063</guid>
      </item>
      <item>
        <title>2008/01/17 links</title>
        <author>xxj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mmm.javaeye.com">xxj</a>&nbsp;
          链接：<a href="http://mmm.javaeye.com/blog/156874" style="color:red;">http://mmm.javaeye.com/blog/156874</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
   