<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>像一颗晨土</title>
    <description></description>
    <link>http://bbmyth.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>关于Django的ORM</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/126228" style="color:red;">http://bbmyth.javaeye.com/blog/126228</a>&nbsp;
          发表时间: 2007年09月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>又遇到了灵异事件。。Django的ORM。orz.</p>
<p>昨天对Blog的程序进行了优化。见<a href="http://www.fallever.com/blog/jeff/16/" target="_blank">前一篇文章</a>， 因于文章分类允许为Null导致查询文章列表时（列表需要显示分类名）Select_related不起作用引发了1+N问题，所以我把Null= True去掉。减却了多余的N条查询。但是奇怪的事情发生了，我从早上开始发觉，首页列表的作者变成了Blog的Title。但代码明明是 {{entry.author.name}}！我改成其他属性试下，依然是Print出Blog的其他属性。我回想昨天更新做过的改动，撒销均无效。最后 想起会不会是因为改了Model的属性引起的，于是我把分类的Null=True加上。果然！显示正常了。这是为什么呢？不解！缓存？没可能吧？</p>
<p>我是不可能再把分类的Null=true保留的，因为实践证明这样对性能损耗太大。但不加上又出现属性值错乱的情况。怎么办？最后我作了个尝试，我把Model里面的属性调换了一下位置，原来Author在Catelog下方:<br />
<br />
catelog = models.ForeignKey(Catelog,verbose_name='分类')<br />
author = models.ForeignKey(Account,verbose_name='作者')<br />
<br />
现在改回来，Author写在Catelog上方。显示正常。My god!</p>
<p>author = models.ForeignKey(Account,verbose_name='作者')<br />
catelog = models.ForeignKey(Catelog,verbose_name='分类')</p>
<p>这是我的程序的Bug？还是Django的Bug？还是我的Bug？我想这个解决的办法不是好办法。</p>
<p>我拿到三种情况的Sql。一是分类为Null的查询，二是分类为NotNull的查询，三是分类为NotNull且Author属性排在 Catelog前面的查询。结果是第一和第三种情况blog_account_name所在的列位置是一样的。这是否说明Django的确是记住查询结果 的位置并且缓存起来了？但缓存到哪里了呢？如果刷新呢？</p>
<p>原因追寻中。原文见：<a href="http://www.fallever.com/blog/jeff/17/">http://www.fallever.com/blog/jeff/17/</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/126228#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Sep 2007 00:01:11 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/126228</link>
        <guid>http://bbmyth.javaeye.com/blog/126228</guid>
      </item>
      <item>
        <title>Django也能智能LazyLoad？</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/126227" style="color:red;">http://bbmyth.javaeye.com/blog/126227</a>&nbsp;
          发表时间: 2007年09月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天在本地很快实现了最新评论的功能。在右手边的最新评论点击连接时会去到文章的页面，并定位到评论所在的锚点上，也就是说，我需要在页面上取得评 论所在文章的ID，也就是需要这样：{{comment.comment_to.id}}。这时候，我仅仅需要获得文章的ID，但不知道Django是否 会到数据库去把相应的文章查出来（我没有使用Select_relate）之后再拿ID呢？不过Django好现没有可以设置打印执行Sql语句的开关， 并不能通过配置来看到运行时Django查了多少次数据库。而这样的功能，我使用Java的Hibernate时就有的。</p>
<p>我Google了一下，发现Django本身是没有提供日志和Sql打印功能的。而有人做了些工作，如<a href="http://www.djangosnippets.org/snippets/161/" target="_blank">这位仁兄</a>写了个中间件，可以在页面上打印出该次请求一共执行了多少条语句，每条语句的执行时间。而这里有个叫<a href="http://code.google.com/p/django-logging/wiki/Overview" target="_blank">Django-logging</a>的项目，为Django提供Logging，包括Sql的打印。等会就试验一下。Django天生就是Lazyload的，需要用到数据的时候才去加载，我希望，我的担心是多余的。一会尝试使用Log来看看测试结果吧。</p>
<p>结果一：Select_related对允许为空的外键不起作用。<br />
我的查询语句是这样：entries = blog.entry_set.filter(status=1).select_related(depth=1).order_by('-id') 查询一个Blog下面所有的Entry，并把有关联的数据一并抓取出来（根据ForeignKey）。也就是说，在查询Entry的同时查出Blog，作 者，分类等信息。<br />
但是情况是，我在页面找印这些文章的时候，需要把文章的分类也打显示出来，这时候，Django却跑到数据库执行了N次查询分类的语句。暴汗。这是经典的 Hibernate的延迟加载用得不恰当的情况啊！我一看打印出来的查询语句，有查相关的作者、Blog，但偏偏没有查分类。最后我回到Model里比较 了一下，我的分类属性上面设置了null=true，原意是让文章可以没有分类。最后我尝试着去掉Null=true，一运行。那N条查询不见了。靠。。<font color="#0000ff">原来Select_related在外键允许空的情况下是行不通D。</font></p>
<p>结果二：Django不会智能LazyLoad。要手动去Select_related。<br />
回到对Django有疑问的情景，recent_comments = Comment.objects.filter(blog=blog).order_by('-comment_time')[:10] 查出本BLog最新的十条评论。我的假设是，Comment本身保存有Entry的ID，所以在仅仅是获取Entry的ID的时候不需要去数据据里找， Hibernate的LazyLoad就是这样做的，使用动态代理的解决方案。我想在Python这样的动态语言的解决方案更佳，但事实证明我错了。上面 的语句又产生了经典的1+N的问题。我在页面根据评论取EntryID的时候{{comment.entry.id}}还是去加载了一次数据，搞笑的是， 这句查询需要得到的数据对我有用的是ID，但是查询条件就是ID。我只好把查询语句改成：<br />
recent_comments = Comment.objects.select_related(depth=1).filter(blog=blog).order_by('-comment_time') [:10]。显示去Select_related。宁愿直接去Join相关的表，也不要做1+ N的查询。显然这很浪费，仅仅为了一个ID，要Join好几个表。</p>
<p>原文在<a href="http://www.fallever.com/blog/jeff/">这里</a><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/126227#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/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><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>Sat, 22 Sep 2007 23:59:59 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/126227</link>
        <guid>http://bbmyth.javaeye.com/blog/126227</guid>
      </item>
      <item>
        <title>安装Mod_python</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/126226" style="color:red;">http://bbmyth.javaeye.com/blog/126226</a>&nbsp;
          发表时间: 2007年09月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Mod_python的使用要求与Apache结合。我使用的Apache版本为2.2，python为2.5，配套的Mod_python为3.3.1。安装及调通的步骤如下： </p>
<p> 一、安装Apache。到http://httpd.apache.org/下载最新版本的Apache，如果是Windows环境，直接下载可执行文件 安装完就可以了。测试Apache是否正常工作，直接访问http://localhost就可以，当看到It works表示安装成功了。 </p>
<p> 二、安装Python。下载Python2.5版，直接安装即可。 </p>
<p> 三、安装Mod_python。到http://www.modpython.org/下载合适版本的Mod_python，注意Apache与 Python的版本。在Windows下直接执行安装完之后，找到 C:/Program Files/Apache Software Foundation/Apache2.2\conf\httpd.conf（看apache安装的地方而定） 文件进行编辑，找到LoadModule部分并加上这句：LoadModule python_module modules/mod_python.so，这时候，安装Mod_python已经完成了。下面来进行测试Mod_python的工作情况。 </p>
<p> 四、测试。在本地建立一个独立的测试目录，如 D:/site，然后修改httpd.conf加入下面代码： </p>
<p> Alias /py d:/site/ </p>
<p> <directory d:="" site=""> </directory></p>
<p>         Order deny,allow </p>
<p>         Allow from all </p>
<p> 	AddHandler mod_python .py </p>
<p> 	PythonHandler mptest  </p>
<p> 	PythonDebug On  </p>
<p>  </p>
<p> 上面的代表是这样的意思：定义一个别名，当访问localhost/py时，实际上是去d:/site/找文件。Directory里面定义了一些规则， 注意前两行很有必要，否则有可能出现拒绝访问的情况，AddHandler mod_python .py意指针对.py文件指定一个Handler。PythonHandler mptest意指Python的Handler是mptest.py。我们在d:/site/下面添加一个mptest.py文件： </p>
<p> from mod_python import apache </p>
<p> def handler(req): </p>
<p>     req.content_type = 'text/plain' </p>
<p>     req.write('hello world') </p>
<p>     return apache.OK </p>
<p> 重启Apache，访问http://localhost/py/xyz.py 得到的结果是hello world。只要是.py结束的请求都会调用mptest.py来处理。 </p>
<p> That's all。</p>
<br />
原文在<a href="http://www.fallever.com/blog/jeff/12/">这里</a>。
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/126226#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/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/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>Sat, 22 Sep 2007 23:57:53 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/126226</link>
        <guid>http://bbmyth.javaeye.com/blog/126226</guid>
      </item>
      <item>
        <title>试用WYMeditor</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/126225" style="color:red;">http://bbmyth.javaeye.com/blog/126225</a>&nbsp;
          发表时间: 2007年09月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.wymeditor.org/" target="_blank">WYMeditor</a>。又一个RichText editor，我怎么说又呢？猛地看上去我以为又一个HtmlArea或者<a href="http://www.fckeditor.net/" target="_blank">FCKeditor</a>或者<a href="http://tinymce.moxiecode.com/" target="_blank">Tinymce</a>。看到Demo和features才知道，这东西蛮有个性的。打算在本站使用一下的。Features：</p>
<ul>
    <li>完全兼容XHTML strict + CSS</li>
    <li>没有Font，你不能对字体颜色、大小，字体对进调整，WYMeditor是基于CSS的</li>
    <li>被设计用来易于与你的应用相结合</li>
    <li>不需安装，100%的Javascript代码，无插件，无扩展</li>
    <li>很简单的Javascript代码，很易懂</li>
    <li>继续保持简单</li>
    <li>我们致力于测试友好的代码，保证新功能的稳定性及有效性</li>
    <li>图像、连接、表格支持</li>
    <li>通过CSS支持皮肤</li>
    <li>免费并且开源，完全适合你的需要</li>
</ul>
<p>N小时后。</p>
<p>测评结果：</p>
<p>一、很固执，wymeditor.js一定要位于一个名叫wymeditor的文件夹下面，不然一律罢工，报错XmlHelper找不到，这个问题很怪异也很变态，花了我好多时间才找到原因。</p>
<p>二、提交时不更新TextArea的内容，要手动写程序或者在Submit的Button指定Class为wymupdate，我试过第二种方法，由于我的Button还需要使用Onclick方法，没戏。这样很变态。</p>
<p>三、指定CSS的时候，要按规则对CSS进行注释，偶笨，不得法，注释的CSS搞得整个Editor出错不能用。</p>
<p>总的来说，指导思想很好(What You See Is What You Mean)，只是目前处于Beta阶段。我还是先使用最熟悉的FCK吧。等待Wymeditor的成熟！</p>
<p>原文在<a href="http://www.fallever.com/blog/jeff/15/">这里</a><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/126225#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Sep 2007 23:56:08 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/126225</link>
        <guid>http://bbmyth.javaeye.com/blog/126225</guid>
      </item>
      <item>
        <title>使用Django生成RSS</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/126224" style="color:red;">http://bbmyth.javaeye.com/blog/126224</a>&nbsp;
          发表时间: 2007年09月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>感谢Django强大的syndication feed framework，我可以很轻松地实现RSS的生成工作。Fallever的RSS可以从每个Blog的右下角找到。Django的官方文档见<a href="http://www.djangoproject.com/documentation/syndication_feeds/">这里</a>。文档中的第一个Example并不适合我，Fallever现在的情况是提供每个Blogger一个RSS文件，因此需要传参数，情况比较类似&ldquo;A complex example&rdquo;那一段。 </p>
<p> 使用Django的SFF来生成RSS太简单了。有下面几个步骤： </p>
<p> 一、配置URLConf： </p>
<p> <code>(r'^feeds/(?P<url>.*)/rss.xml$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds})</url></code> </p>
<p> URL表达式中，url参数实际上允许很多个&ldquo;/&rdquo;存在。在Fallever中的用法是：/feeds/blog/{{shortcut}} /rss.xml.那么Django会把&ldquo;feeds/&rdquo;后面那一大截当作URL的参数传进去生成的机器（姑且这样叫吧），Shortcut是代表一个 Blog的简称。注意，&quot;feeds/&quot;作为RSS路径的开头是必须的。 </p>
<p> 二、写feeds。 </p>
<p> 你已经留意到了URLConf里面的第三个参数吧。feeds是一个字典，Key是Feed的类型，Value是处理该类型的类。Fallever的第一个字典是： </p>
<p> <code>feeds = {'blog':recent_blog_entry}</code> </p>
<p> 这个字典说&ldquo;feeds/&rdquo;后面凡是跟着blog字样的路径全由recent_blog_entry这个类来处理。在blog后面跟着的参数从哪里可以找 回来呢，我一开始就有这样的问题，原来在这里：重写Feeds类的get_object(self, bits):bits参数就是把blog后面的参数切成了数组，如/feeds/blog/jeff/rss.xml切割后bits参数是： ['jeff','rss.xml']在这里我们只需要拿我们有用的元素就可以了。rss.xml这一节东西我是用来哄IE的。 </p>
<p> 三、在recent_blog_entry类里重写Feeds的几个方法：title,link,description,items,items_link。具体的在这里不说了，还有需要为这一次的Feed加上两个简单的模板。都去参考文档看吧 ：）</p>
原文出处：<a href="http://www.fallever.com/blog/jeff/8/">http://www.fallever.com/blog/jeff/8/</a>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/126224#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Sep 2007 23:53:08 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/126224</link>
        <guid>http://bbmyth.javaeye.com/blog/126224</guid>
      </item>
      <item>
        <title>Django学习笔记之模板</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/110074" style="color:red;">http://bbmyth.javaeye.com/blog/110074</a>&nbsp;
          发表时间: 2007年08月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          模板是一个文本文件.可以是HTML,XML,CSV甚至其他任意格式的文本.<br />
模板有自己的元素:<br />
一.Variables(变量):<br />
变量的写法是:{{variable}}或{{book.name}},使用&quot;.&quot;来获得对象的属性.与Freemarker等流行模板类似.<br />
二.filters(过滤):<br />
我们可以通过过滤器来改变变量的显示,用法:<br />
{{name|lower}}效果是将名字全部变成小写.<br />
过滤器可以联用,只要在后面跟着写上就OK了.<br />
过滤器还可以加参数:<tt><span>{{</span> <span>bio|truncatewords:30</span> <span>}},如果Filter的参数带有空格,那个这个参数必须括起来:</span></tt><tt><span><br />
{{</span> <span>list|join:&quot;,</span> <span>&quot;</span> <span>}}<br />
三、tags（标签）：<br />
标签看起来是这样的：</span></tt><tt><span>{%</span> <span>tag</span> <span>%}，与Jsp Tag一样，有单一Tag，也有组合Tag，即有开始Tag及结束Tag。<br />
四、Comments（注释）：<br />
注释是这样写的{# 这里是注释 #}<br />
五、模板继承：<br />
这是Django模板最强，也是最复杂的部分。利用模板继承机制，你可以创建一个骨架模板，里面包含一些公用内容。而那些个性内容则通过定义block（块）来允许子模板去重载。（像极了Java的类继承！）<br />
块是使用block标签来实现的。下面来看一个例子就完全明白了：<br />
1，这是基础模板，传说中的骨架。命名为base.html<br />
</span></tt>
<pre><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN&quot;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span>&nbsp;</span><span class="attribute">xml:lang</span><span>=</span><span class="attribute-value">&quot;en&quot;</span><span>&nbsp;</span><span class="attribute">lang</span><span>=</span><span class="attribute-value">&quot;en&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;stylesheet&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;style.css&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>{%&nbsp;block&nbsp;title&nbsp;%}My&nbsp;amazing&nbsp;site{%&nbsp;endblock&nbsp;%}</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;sidebar&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;block&nbsp;sidebar&nbsp;%}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ul</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">li</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;/&quot;</span><span class="tag">&gt;</span><span>Home</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">li</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">li</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;/blog/&quot;</span><span class="tag">&gt;</span><span>Blog</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">li</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">ul</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;endblock&nbsp;%}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;content&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;block&nbsp;content&nbsp;%}{%&nbsp;endblock&nbsp;%}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><br /></pre>
2，这是一个子模板，继承上一个模板：<br />
<pre><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>{%&nbsp;extends&nbsp;&quot;base.html&quot;&nbsp;%}&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>{%&nbsp;block&nbsp;title&nbsp;%}My&nbsp;amazing&nbsp;blog{%&nbsp;endblock&nbsp;%}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>{%&nbsp;block&nbsp;content&nbsp;%}&nbsp;&nbsp;</span></li><li class=""><span>{%&nbsp;for&nbsp;entry&nbsp;in&nbsp;blog_entries&nbsp;%}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">h2</span><span class="tag">&gt;</span><span>{{&nbsp;entry.title&nbsp;}}</span><span class="tag">&lt;/</span><span class="tag-name">h2</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">p</span><span class="tag">&gt;</span><span>{{&nbsp;entry.body&nbsp;}}</span><span class="tag">&lt;/</span><span class="tag-name">p</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>{%&nbsp;endfor&nbsp;%}&nbsp;&nbsp;</span></li><li class=""><span>{%&nbsp;endblock&nbsp;%}&nbsp;&nbsp;</span></li></ol></div><br /></pre>
结果你应该已经想到了。子模板里的同标题的block标签里的内容会替换掉父模板的。这就像对象语言里面的类重载。<br />
使用模板几点要注意的：<br />
# 如果在模板中使用<tt><span>{%</span> <span>extends</span> <span>%}，一定要作为模板中的第一个Tag使用<br />
#</span></tt> <tt><span>{{</span> <span>block.super</span> <span>}}可以获得父模板本块的内容<br />
# 为了看起来明确，你可以在endblock后面加上块的名称。<br />
<br />
六、自定义标签和过滤器<br />
使用load标签加载自定义标签的模块。加载多个模块使用空格隔开<br />
#注意，模板继承机制不继承自定义模板。<br />
<br />
Django的模板就这么些东西。更多的内容请查看内置的支持。</span></tt>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/110074#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/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Aug 2007 10:44:37 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/110074</link>
        <guid>http://bbmyth.javaeye.com/blog/110074</guid>
      </item>
      <item>
        <title>介绍ExtremeTable的下一代Jmesa</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/107106" style="color:red;">http://bbmyth.javaeye.com/blog/107106</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;说到<a href="http://www.extremecomponents.org/extremesite/index.jsp">ExtremeTable</a>(以下简称ET,呃,,,ET.....),可以说不知道的人甚少.不过估计用的也未必多罢了.今天,给大家介绍一个由ET的作者重新实现的一套关于Table的API.<a href="http://code.google.com/p/jmesa/">JMesa</a>.<br />
我是一个偶然的机会知道Jmesa,我在做一个数据展现系统的时候想寻找ET的帮忙,但发现ET己不再更新,作者把精力转移到了新的项目中,也就是这个 JMesa.这个项目的目的是为开发者提供更有效的表格展现的API,而不是简单的TagLib.无论从灵活性,易扩展性,易用性,均比ET上了一个层 次.最近Release的版本里面,并不包括TagLib.而在下一个版本(2.1.0)将会加入TagLib,目前TagLib己经可用,在SVN里已 有.只是等待下一个版本的发布,其间会有一些更新,不过会兼容目前的TagLib的.<br />
假如我从API开始介绍JMesa,恐怕并不是个好的办法,像我以前的文章里面有介绍,结果反响不大.这次决定从TagLib入手,来给大家介绍一下Jmesa.<br />
大家可以从附件里拿到一个Demo.注意Demo依赖JMesa以及其他Lib.在Lib文件夹下有详细说明.<br />
现在来看看JMesa的使用:<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">jm:table</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;product&quot;</span><span>&nbsp;</span><span class="attribute">items</span><span>=</span><span class="attribute-value">&quot;products&quot;</span><span>&nbsp;</span><span class="attribute">caption</span><span>=</span><span class="attribute-value">&quot;product&nbsp;listing&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">sortable</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">filterable</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;price&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;createdTime&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;edit&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;viewProduct.action?id=&lt;jm:property/&gt;&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">jm:property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">jm:column</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">jm:table</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
估计比较容易看得懂的代码吧.<br />
Jmesa 的检签规范当中只有三个Tag:Table,Row,Column.而当前的TagLib实现中只实现了Table和Column两个(Row是可选 的).另加一个Property的Tag.此阶段,Property的Tag是很有用的,其起到的作用与Webwork的PropertyTag相差无几, 用来获得对象的某个属性.之所以使用Property Tag是因为当前的TagLib有个限制就是暂时不支持如JSTL的${}这种写法.将来会支持,届时Property Tag也会继续获得兼容.Jeff比较倾向于使用迭代的方式实现Tag,那样可以支持${}这样的写法.不过作为TagLib的开始,问题不大.有时间再 重构一下TagLib,支持JSTL的写法.<br />
好了,来说一说这些Tag的使用方法:<br />
<strong>Table:</strong><br />
<table>
    <tbody>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"><strong>Attribute</strong> </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> <strong>Description</strong> </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> id </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">表格的ID(必须) </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> items </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> 对象或者Map的集合 (必须)</td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> caption </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> 表格的标题 <br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> theme </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  表格的主题,自定义样式<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> exportTypes </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">使用逗号分割导出的类型,目前支持导出类型有CSV,Excel <br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> width </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  表格宽度<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> style </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  即表格的Style属性<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> styleClass </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  使用的Css的Class名字<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> border </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  表格宽<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> cellpadding </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  表格属性<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> cellspacing </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  表格属性<br />
            </td>
        </tr>
    </tbody>
</table>
实际上,真正Release的版本里面将会加上var以及Limit属性.<br />
var属性值即在Column标签里可以获得的对象变量.<br />
Limit属性是保存在当前请求的Limit的对象名.<br />
<strong>Row:</strong><br />
<table>
    <tbody>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"><strong>Attribute</strong> </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> <strong>Description</strong> </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> highlighter </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  是否高亮显示<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> onclick </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  点击事件<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> onmouseout </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  鼠标移出事件<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> onmouseover </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  鼠标移入事件<br />
            </td>
        </tr>
    </tbody>
</table>
该Tag是可选的.实际上Jmesa提供了一系列默认的事件响应,有必要的情况下才使用.<br />
<strong>Column:</strong><br />
<table>
    <tbody>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"><strong>Attribute</strong> </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> <strong>Description</strong> </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> property </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">Java对象或Map的属性名 </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> title </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> 列的名称 <br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> filterable </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  是否可按过滤条件查找<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> sortable </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  是否要排序<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> width </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  列宽<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> style </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  Style属性<br />
            </td>
        </tr>
        <tr>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;"> styleClass </td>
            <td style="border: 1px solid rgb(170, 170, 170); padding: 5px;">  使用的Css的Class的名字<br />
            </td>
        </tr>
    </tbody>
</table>
ColumnTag的使用方法有下面几种:<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
将仅仅输出对象中Name属性值.列名是Name<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;名字&quot;</span><span>&nbsp;</span><span class="attribute">sortable</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">filterable</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这样可以得到自定义的列名,可以让列可查找,可排序,当然你Server端需要相应提供排序及查找功能.不过就算你不提供,客户端也会把当前结果排序和查找的.<span><span class="tag"><br />
</span></span><span><span class="tag"></span></span><span>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;edit&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;viewProduct.action?id=&lt;jm:property/&gt;&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">jm:property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">jm:column</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<span><span class="tag">这里结合了PropertyTag.实现自定义列显示.可以灵活定制自己的单元格.<br />
在ColumnTag里面,使用PropertyTag的时候,可以指定Name属性,如果不指定则使用当前Column的Property属性值.<br />
</span></span>  以后将支持:<br />
<span><span class="tag"></span><br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;edit&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;viewProduct.action?id=${id}&quot;</span><span class="tag">&gt;</span><span>${name}</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">jm:column</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<span><span> 这样的写法.当然会继续兼容PropertyTag,尽管不是Tag规范里的东西.<br />
<br />
相信经过上面的一番介绍,大家对Jmesa有一定的感性认识了吧.还没有?下载Demo,扔进Tomcat 的App里跑一下就明白了.<br />
有什么建议,请一定要告诉我 :).<br />
</span></span></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/107106#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/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 00:34:32 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/107106</link>
        <guid>http://bbmyth.javaeye.com/blog/107106</guid>
      </item>
      <item>
        <title>正式加入Jmesa项目</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/105522" style="color:red;">http://bbmyth.javaeye.com/blog/105522</a>&nbsp;
          发表时间: 2007年07月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天早上起床收到了Email.Jeff很喜欢我写的Tag,并且把源码加入了SubVersion,作为Jmesa的Tag的一个开始版本.<br />
<br />
这段时间我提交了两个功能的代码(ExcelView和Tag).Jeff显得比较喜欢俺的代码,直夸简单清析.狂喜ing!固然自知自己对代码要求比较高,不过有牛人一赞,感觉是不一样..嘿嘿.他邀请我加入Jmesa的项目进行开发工作.我当即答应了,因为开时除了上班,回到家里大部分时间是在学习和写代码,一直找到地方使力气.如今能参与做开源项目也算是做一回正经事.记得在国内也曾短暂加入过Springside,仅贡献了几根牛毛.惭愧.惭愧.<br />
<br />
接下来的工作要继续宣传Jmesa,作为ExtremeTable的下一代,的确是值得一试的.陆续会写些介绍性,入门性的文章<br />
<br />
继续完善Jmesa Tag Lib.
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/105522#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/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>Thu, 26 Jul 2007 01:57:35 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/105522</link>
        <guid>http://bbmyth.javaeye.com/blog/105522</guid>
      </item>
      <item>
        <title>Jmesa开始Taglib计划</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/104398" style="color:red;">http://bbmyth.javaeye.com/blog/104398</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://code.google.com/p/jmesa/">Jmesa</a>社区最近有个提交了一套TagLib的实现。使用方法是这样：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>1.&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ensco:table</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;exampleTable&quot;</span><span>&nbsp;</span><span class="attribute">exportable</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">numRows</span><span>=</span><span class="attribute-value">&quot;5&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ensco:column</span><span>&nbsp;</span><span class="attribute">displayName</span><span>=</span><span class="attribute-value">&quot;Property&nbsp;1&quot;</span><span>&nbsp;</span><span class="attribute">propertyName</span><span>=</span><span class="attribute-value">&quot;prop1&quot;</span><span>&nbsp;</span><span class="attribute">cellEditor</span><span>=</span><span class="attribute-value">&quot;someEditor&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ensco:column</span><span>&nbsp;</span><span class="attribute">displayName</span><span>=</span><span class="attribute-value">&quot;Property&nbsp;2&quot;</span><span>&nbsp;</span><span class="attribute">propertyName</span><span>=</span><span class="attribute-value">&quot;prop2&quot;</span><span>&nbsp;&nbsp;</span><span class="attribute">filterable</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ensco:column</span><span>&nbsp;</span><span class="attribute">displayName</span><span>=</span><span class="attribute-value">&quot;Property&nbsp;3&quot;</span><span>&nbsp;</span><span class="attribute">propertyName</span><span>=</span><span class="attribute-value">&quot;prop3&quot;</span><span>&nbsp;</span><span class="attribute">sortable</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">filterable</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">ensco:table</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li>
</ol>
</div>
Taglib作者说是Display Tag风格。不过个人很不爽的是，居然还需要开发者去实现cellEditor？并且不支持Column Tag里面嵌套内容的用法。很不实用。我跟Jeff沟通后，他也很赞成我的观点。于是我昨天花了几个小时写了一套新的Taglib。归功能Jmesa API的优雅及易用，TagLib很快就可以工作了。我实现有TagLib用法这样：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">jm:table</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;product&quot;</span><span>&nbsp;</span><span class="attribute">items</span><span>=</span><span class="attribute-value">&quot;products&quot;</span><span>&nbsp;</span><span class="attribute">caption</span><span>=</span><span class="attribute-value">&quot;product&nbsp;listing&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="attribute">export</span><span>=</span><span class="attribute-value">&quot;csv,pdf&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;jmesa&quot;</span><span>&nbsp;</span><span class="attribute">width</span><span>=</span><span class="attribute-value">&quot;100%&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;edit&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;viewProduct.action?id=<jm:property>&quot;</jm:property></span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">jm:property</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span class="tag">/&gt;</span><span class="tag"><!--</span--><span class="tag-name">a</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">jm:column</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;price&quot;</span><span>&nbsp;</span><span class="attribute">sortable</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">filterable</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">jm:column</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;createdTime&quot;</span><span>&nbsp;</span><span class="attribute">width</span><span>=</span><span class="attribute-value">&quot;20%&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">jm:table</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></span></li>
</ol>
</div>
开发者只需要提供一个Collection，写JSPTag，不需要实现其他任何接口。<br />
我给Jeff发了封Email:<span id="thread_subject_site">   <a href="http://groups.google.com/group/jmesa/browse_thread/thread/9a3e4b506c292776">another jmesa taglib</a></span>Jeff相当感兴趣，马上制订了<a href="http://code.google.com/p/jmesa/wiki/Tags">Jmesa Taglib的规范</a>，让社区去实现TagLib。呵，Jeff的相法与我制订的Tag的出发点是相当的一致啊。是不是因为我也叫Jeff的原因？偶是（Jeff jie）。可以到<a href="http://groups.google.com/group/jmesa/browse_thread/thread/55cc48f7610683db">这里</a>看看偶的TLD文件与Jeff的说法 ：）<br />
这两天会继续抽时间，按照规范把原来的Tag作一下小的修改。再发给Jeff看看。争取成为官方实现版本 ：P。<br />
<br />
Jmesa相关文章：<br />
<span class="dark_c">&nbsp;<a href="../../../admin/show/89567"><font size="2">jmesa系列之一：什么是Jmesa</font></a></span><font size="2"><a>&nbsp;</a>        <br />
<strong><strong><a href="../../../admin/show/89570">&nbsp;jmesa系列(二)Jmesa源码的包结构解读</a></strong><br />
<a href="http://bbmyth.javaeye.com/admin/show/95768">Jmesa系列（三）</a></strong></font><a href="javascript:void(0);/*1185164198166*/"><span class="dark_c" style="font-size: 14pt; font-weight: bold;">开始使用JMesa</span></a>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/104398#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>Mon, 23 Jul 2007 12:13:18 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/104398</link>
        <guid>http://bbmyth.javaeye.com/blog/104398</guid>
      </item>
      <item>
        <title>代码被Jmesa使用了！</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/104397" style="color:red;">http://bbmyth.javaeye.com/blog/104397</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用<a href="http://code.google.com/p/jmesa/">Jmesa</a>有一段时间了。中文资料基本上为0。经过一段时间的摸索及使用。渐渐爱上这套API。<br />
前一段时间因为项目需要，自己基于Jmesa实现了Excel文件的导出功能。并在前天将代码交给了Jeff。Jeff很高兴，马上将我的代码加入项目中，将会在下一个发布的版本中看到，不过现在在Subversion上已经可以看到。<br />
偷偷的高兴一下。
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/104397#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jul 2007 11:58:09 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/104397</link>
        <guid>http://bbmyth.javaeye.com/blog/104397</guid>
      </item>
      <item>
        <title>python 练习 : 帮我把硬盘里的图片都找出来</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/101716" style="color:red;">http://bbmyth.javaeye.com/blog/101716</a>&nbsp;
          发表时间: 2007年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          要点:使用系统模块,遍历磁盘,遍历文件,找到符合条件的文件记录下来到一个Log文件中(XML格式).<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;win32api&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">os</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">#constants&nbsp;and&nbsp;configs</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>IGNORE_PATH&nbsp;=&nbsp;[&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;C:\\WINDOWS&quot;,&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;C:\\Program&nbsp;Files&quot;,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;C:\\Documents&nbsp;<span class="keyword">and</span><span>&nbsp;Settings&quot;,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;C:\\System&nbsp;Volume&nbsp;Information&quot;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">#TODO&nbsp;use&nbsp;re&nbsp;replace</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>IMAGE_TYPE&nbsp;=&nbsp;[&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&quot;jpg&quot;,&quot;gif&quot;,&quot;png&quot;,&quot;<span class="commonlibs">jpeg</span><span>&quot;,&quot;bmp&quot;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">#find&nbsp;out&nbsp;the&nbsp;logic&nbsp;disks</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>disks&nbsp;=&nbsp;win32api.GetLogicalDriveStrings().split(&quot;\x00&quot;)&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;disk&nbsp;</span><span class="keyword">in</span><span>&nbsp;disks:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;disk&nbsp;</span><span class="keyword">in</span><span>&nbsp;['','A:\\']:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disks.<span class="builtins">remove</span><span>(disk)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">#TODO&nbsp;store&nbsp;to&nbsp;xml&nbsp;file</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">def</span><span>&nbsp;store(filePath,fileName):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;'about&nbsp;to&nbsp;store&nbsp;%s\\%s'&nbsp;%&nbsp;(filePath,fileName)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">def</span><span>&nbsp;scan(path):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;'scanding&nbsp;path&nbsp;:&nbsp;'&nbsp;+&nbsp;path&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;</span><span class="keyword">not</span><span>&nbsp;path.endswith('\\'):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;=&nbsp;path&nbsp;+&nbsp;'\\'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;_file&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.listdir(path):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.path.isdir(path&nbsp;+&nbsp;_file)&nbsp;</span><span class="keyword">and</span><span>&nbsp;path&nbsp;+&nbsp;_file&nbsp;</span><span class="keyword">not</span><span>&nbsp;</span><span class="keyword">in</span><span>&nbsp;IGNORE_PATH:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan(path&nbsp;+&nbsp;_file)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;image_type&nbsp;</span><span class="keyword">in</span><span>&nbsp;IMAGE_TYPE:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;_file.endswith(&quot;.%s&quot;&nbsp;%&nbsp;image_type):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;store(path,_file)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">#&nbsp;now&nbsp;iterat&nbsp;the&nbsp;disks</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;disk&nbsp;</span><span class="keyword">in</span><span>&nbsp;disks:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;'now&nbsp;scan&nbsp;disk&nbsp;:&nbsp;%s&nbsp;'&nbsp;%&nbsp;disk&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;scan(disk)&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
到此为止,Python把硬盘里的图片都找出来了,还差把图片信息存储到XML文件里面去.<br />
TODOs:<br />
一,使用正则表达式匹配后缀名<br />
二,保存信息到XML &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/101716#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>Tue, 17 Jul 2007 02:22:00 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/101716</link>
        <guid>http://bbmyth.javaeye.com/blog/101716</guid>
      </item>
      <item>
        <title>从dir学到的</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/100551" style="color:red;">http://bbmyth.javaeye.com/blog/100551</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          dir函数可以接受任何类型参数,如类型,对象,模块等.<br />
下面一段程序将说明dir一个模块,类,对象时的情况:<br />
&nbsp;先写一个模块:<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Person:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="magicmethods">__init__</span><span>(</span><span class="builtins">self</span><span>,name):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="builtins">self</span><span>.name&nbsp;=&nbsp;name&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;getName(</span><span class="builtins">self</span><span>):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="builtins">self</span><span>.name&nbsp;&nbsp;</span></span></li>
    <li class=""><span>heyhey&nbsp;=&nbsp;Person(&quot;jeff&quot;)&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
另存为一个文件testdir.py<br />
然后在控制台输入:<br />
import testdir<br />
&gt;&gt;&gt; dir(testdir)<br />
['Person', '__builtins__', '__doc__', '__file__', '__name__', 'heyhey']<br />
# 这里,列出整个模块里面包含的对象,不管是内置函数还是类,还是变量.Person是一个类,Heyhey是一个变量.<br />
&gt;&gt;&gt; dir(testdir.Person)<br />
['__doc__', '__init__', '__module__', 'getName']<br />
#这里列出Person类的所有方法和<strong>显示定义的属性</strong>,在构造函数里面出现有属性是没有出现,注意dir一个类实例的情况:<br />
&gt;&gt;&gt; dir(testdir.heyhey)<br />
['__doc__', '__init__', '__module__', 'getName', 'name']<br />
#实际上是dir一个Person对象.这个对象因为通过构造函数生成.而在执行构造函数的时候有了一个name的属性.这就是dir类与类实例有区别的原因,推而广之,dir不同的实例也有可能得到不一样的结果.<br />
而这个,就是动态语言的&quot;动态&quot;之处鸟.卡卡.
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/100551#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/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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 02:30:19 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/100551</link>
        <guid>http://bbmyth.javaeye.com/blog/100551</guid>
      </item>
      <item>
        <title> 麻雀虽小，五脏俱全－－一个简单python程序剖析</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/100523" style="color:red;">http://bbmyth.javaeye.com/blog/100523</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre class="programlisting"><span class="pykeyword">python 代码如下：<br /></span><div class="code_title">python 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-py" start="1"><li class="alt"><span><span class="keyword">def</span><span>&nbsp;buildConnectionString(params):&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;<span class="string">&quot;&quot;&quot;Build&nbsp;a&nbsp;connection&nbsp;string&nbsp;from&nbsp;a&nbsp;dictionary&nbsp;of&nbsp;parameters.</span>&nbsp;</span></li><li class="alt"><span><span class="string"></span>&nbsp;</span></li><li class=""><span><span class="string">&nbsp;Returns&nbsp;string.&quot;&quot;&quot;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;<span class="keyword">return</span><span>&nbsp;&quot;;&quot;.join([&quot;%s=%s&quot;&nbsp;%&nbsp;(k,&nbsp;v)&nbsp;</span><span class="keyword">for</span><span>&nbsp;k,&nbsp;v&nbsp;</span><span class="keyword">in</span><span>&nbsp;params.</span><span class="builtins">items</span><span>()])&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;&quot;</span><span class="builtins">__main__</span><span>&quot;:&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;myParams&nbsp;=&nbsp;{&quot;server&quot;:&quot;mpilgrim&quot;,&quot;database&quot;:&quot;master&quot;, &quot;uid&quot;:&quot;sa&quot;, &quot;<span class="commonlibs">pwd</span><span>&quot;:&quot;secret&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;<span class="keyword">print</span><span>&nbsp;buildConnectionString(myParams)&nbsp;&nbsp;</span></span></li></ol></div><br /></pre>
这是来自Dive into python一书上开头的程序，简单的一段程序里却包括了python的多个内置类及格式化输出、遍历、方法、注释等。<br />
一、&ldquo;&rdquo;&ldquo;   &rdquo;&ldquo;&rdquo;所包括部分为文档化注释，有如Java的/***/<br />
二、方法的声明语法：def functionName(params):方法体需要缩进，这是python的特性<br />
三、字典类型，{}表示字典，字典的形式是key:value的。<br />
四、数组类型，[]表示此为一数组，元素可以是任何类型。<br />
五、元组类型，()表示元组，元组即不可变数组。<br />
六、格式化输出:print &quot;name=%s,age=%d&quot; % (&quot;jeff&quot;,24)，跟C的格式化输出差不多，后面总是跟着一个元组。<br />
七、数组的映射，由一个数组开始，对数组的每一个元素进行同样的操作，然后变成另一个数组。<br />
<pre class="screen"><tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">li = [1, 9, 8, 4]</span><br /><tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">[elem*2 <span class="pykeyword">for</span> elem <span class="pykeyword">in</span> li]</span>    <br /><span class="computeroutput">[2, 18, 16, 8]</span></pre>
<br />
八、连接数组join函数，把List元素一个个连接起来成一个字符串。
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/100523#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/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><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 02:05:45 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/100523</link>
        <guid>http://bbmyth.javaeye.com/blog/100523</guid>
      </item>
      <item>
        <title> python的内置类型（1）</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/100522" style="color:red;">http://bbmyth.javaeye.com/blog/100522</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、真假值类型<br />
与Javascript一样地，或者说这是脚本语言的相同特性，python的任何对象都可以出现在真假表达式中，即if obj，或while obj。下面是一些被认为是False的值：<br />
None，False，数值类型的0值，空队列（）、［］，空字典 ｛｝，而对于用户自定义的类型，如果实现了方法__nonzero__()返回False值或__len__()方法返回0值的。<br />
2、布尔值的操作符：<br />
and     与<br />
or       或<br />
not     非<br />
3、比较操作符：<br />
＜、＜＝、＞、＞＝、！＝、＜＞、is、is not。浅而易明。明显地。<br />
4、数据类型：<br />
int,long,float,complex即整数，长整型，浮点型，复数。<br />
python 的int 相当于c的long 2的32次方的范围<br />
python的long型无限制地使用的。<br />
python的float相当于c的double类型，实际上可以用尽你的计算机的资源。<br />
复数有实部及虚部，如c = 1+2j，如实部可通过c.real获得,虚部即镜像，可能过c.imag获得。<br />
long型的数值常在后面加上L或l，复数的虚部加上j或J<br />
5、整数的位操作：<br />
x|y 位或操作<br />
x^y<br />
x&amp;y 位与操作<br />
x&lt;<n 位左移操作=""><br />
x&gt;&gt;n 位右移操作<br />
~x 非<br />
6、序列类型，seqence。<br />
下面六种类型都属于序列类型，字符串，unicode字符串、list、tuple、buffer、xrange.<br />
字符串可以看作是字符的数组。<br />
关于序列的操作：<br />
x in s  、x not in s。x 在不在s序列里面？可以在判断语句中，前者可更以用在for循环中。<br />
s + t 两个序列相连接<br />
s*n n是整数，把S序列增长n倍，内容重复<br />
s[i] 好明显的下标啊<br />
s[i:j] 序列分片，从i个元素到j个元素，切下来<br />
s[i:j:k] 跟上面的类似，不过k是一个step的值。指一跳跳k个元素。<br />
len(s)  长度<br />
min(s) 最小值<br />
max(s)  最大值<br />
<br />
广告回来更精彩 ：P
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/100522#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/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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 02:04:24 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/100522</link>
        <guid>http://bbmyth.javaeye.com/blog/100522</guid>
      </item>
      <item>
        <title>python的动态参数</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/100521" style="color:red;">http://bbmyth.javaeye.com/blog/100521</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          动态参数是样很神奇的东西。我写了下面一段代码：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Person:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="magicmethods">__init__</span><span>(</span><span class="builtins">self</span><span>,*pros,**attrs):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="builtins">self</span><span>.name&nbsp;=&nbsp;&quot;jeff&quot;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="builtins">self</span><span>.pros&nbsp;=&nbsp;pros&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">for</span><span>&nbsp;(key,value)&nbsp;</span><span class="keyword">in</span><span>&nbsp;attrs.</span><span class="builtins">items</span><span>():&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;stm&nbsp;=&nbsp;&quot;<span class="builtins">self</span><span>.%s&nbsp;=&nbsp;\&quot;%s\&quot;&quot;%&nbsp;(key,value)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">exec</span><span>(stm)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;&quot;</span><span class="builtins">__main__</span><span>&quot;:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;jeff&nbsp;=&nbsp;Person(1,2,3,sex=&quot;boy&quot;)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;jeff.pros&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;<span class="keyword">print</span><span>&nbsp;jeff.sex&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">print</span><span>&nbsp;</span><span class="builtins">dir</span><span>(jeff)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
打印出来的内容是<br />
(1, 2, 3)<br />
boy<br />
['__doc__', '__init__', '__module__', 'name', 'pros', 'sex']<br />
<br />
简单解释一下：<br />
参数以一个＊号开头的代表着一个任意长度的数组，可以接收连续一串参数，如上面代码里传的是1，2，3，你可以更多。<br />
参数以两个＊号开头的代表着一个字典，参数的形式是&ldquo;key=value&rdquo;，接受连续任意多个参数。<br />
在函数内，我们就可以把前者当作一个元组来处理，打印结果看得出来是一个元组。注意，调用方法是参数不定长，而在方法执行的时候，长度已定了，所以是元组。同时，我们可以把后者当作一个字典来处理。<br />
<br />
示 例代码里使用可变长参数实现了一个类属性的个性化定制，对于一个Person类，你可以通过传入字典类型的参数使这个类有更多原来不存在的属性，实现方法 是用了exec方法，目前只能通过字符串的参数。这里只是展示了可变参数的使用及exec的神奇力量。真正的函数不应该允许任意用户自定义属性的，可变参 数的目的是为定义函数方便及调用函数时，参数传入形式更自由而已。
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/100521#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 02:03:27 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/100521</link>
        <guid>http://bbmyth.javaeye.com/blog/100521</guid>
      </item>
      <item>
        <title>python猜数小游戏</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/100520" style="color:red;">http://bbmyth.javaeye.com/blog/100520</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用Python写了一个猜数的小游戏。很简单，电脑抽一个0到100的随机数，玩家猜电脑里的数字是什么，并视玩家所猜的数而给出太大或太小的提示，一直玩到猜中为止，程序将记录玩家所猜的次数。<br />
程序涉及了控制台输入输出，数据类型转换，随机数，异常捕捉等。<br />
<pre><br /><br /><font color="#0000ff">#!/usr/bin/python</font><br /><br />'''<font color="#ff00ff"> this is a number guessing game.the computer make a random number and store</font><br /><font color="#ff00ff">    into the memory.the player guess what the number is.the computer will give</font><br /><font color="#ff00ff">    the tips.</font><br />'''<br /><font color="#a020f0">from</font> random <font color="#a020f0">import</font> Random<br /><font color="#a020f0">import</font> sys<br /><br /><br /><font color="#a52a2a"><strong>class</strong></font> <font color="#008b8b">GuessNumberGame</font>:<br />    <font color="#a52a2a"><strong>def</strong></font> <font color="#008b8b">__init__</font>(self,player):<br />        self.player = player<br />        rd = Random()<br />        self.number = rd.randint(0,100)<br />    <font color="#a52a2a"><strong>def</strong></font> <font color="#008b8b">compare</font>(self,guessNum):<br />        <font color="#a52a2a"><strong>if</strong></font> guessNum &gt; self.number:<br />            <font color="#a52a2a"><strong>return</strong></font> 1<br />        <font color="#a52a2a"><strong>if</strong></font> guessNum &lt; self.number:<br />            <font color="#a52a2a"><strong>return</strong></font> -1<br />        <font color="#a52a2a"><strong>return</strong></font> 0<br /><br /><br /><br /><font color="#a52a2a"><strong>if</strong></font> __name__ == '<font color="#ff00ff">__main__</font>':<br />    game = GuessNumberGame('<font color="#ff00ff">jeff</font>')<br />    <font color="#a52a2a"><strong>print</strong></font> '''<font color="#ff00ff">WOW!!!!let's start the game now.the computer now get a number in mind,the number is between 0 and 100,now what you guess?tell me by typing the number in your mind </font>'''<br /><br />    count = 0<br />    <font color="#a52a2a"><strong>while</strong></font> True:<br />        <font color="#a52a2a"><strong>try</strong></font>:<br />            guess = int(raw_input('<font color="#ff00ff">the number you guess =&gt;</font>'))<br />        <font color="#a52a2a"><strong>except</strong></font> ValueError:<br />            <font color="#a52a2a"><strong>print</strong></font> '<font color="#ff00ff">wrong value format! NUMBER is accept.</font>'<br />            <font color="#a52a2a"><strong>continue</strong></font><br />        <font color="#a52a2a"><strong>except</strong></font> EOFError:<br />            <font color="#a52a2a"><strong>print</strong></font> '<font color="#ff00ff">good bye!</font>'<br />        count = count + 1<br />        result = game.compare(guess)<br />        <font color="#a52a2a"><strong>if</strong></font> result == 0:<br />            <font color="#a52a2a"><strong>print</strong></font> '<font color="#ff00ff">grade!!you finally get the right number in %d times</font>' % count<br />            <font color="#a52a2a"><strong>break</strong></font><br />        <font color="#a52a2a"><strong>elif</strong></font> result == 1:<br />            <font color="#a52a2a"><strong>print</strong></font> '<font color="#ff00ff">the number you guess is grade then the real number,please try again :)</font>'<br />        <font color="#a52a2a"><strong>elif</strong></font> result == -1:<br />            <font color="#a52a2a"><strong>print</strong></font> '<font color="#ff00ff">the number you guess is small then the real number ,please try again :)</font>'<br /><br />    <font color="#a52a2a"><strong>print</strong></font> '<font color="#ff00ff">Done!</font>'</pre>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/100520#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/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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 02:02:37 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/100520</link>
        <guid>http://bbmyth.javaeye.com/blog/100520</guid>
      </item>
      <item>
        <title>关于Python的Type,Module,Class</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/100518" style="color:red;">http://bbmyth.javaeye.com/blog/100518</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>type?</strong><br />
注意,Python里面任何东西都是对象,但并不是任何东西都是类!<br />
看下面一段程序及说明(来自Dive into python):<br />
<div>
<div>
<div> </div>
</div>
</div>
<div>
<h3>例&nbsp;4.5.&nbsp;<tt>type</tt> 介绍</h3>
<pre><tt>&gt;&gt;&gt; </tt><span>type(1)</span>           .1<br /><span>&lt;type 'int'&gt;</span><br /><tt>&gt;&gt;&gt; </tt><span>li = []</span><br /><tt>&gt;&gt;&gt; </tt><span>type(li)</span>         &nbsp;.2<br /><span>&lt;type 'list'&gt;</span><br /><tt>&gt;&gt;&gt; </tt><span><span>import</span> odbchelper</span><br /><tt>&gt;&gt;&gt; </tt><span>type(odbchelper)</span> &nbsp;.3<br /><span>&lt;type 'module'&gt;</span><br /><tt>&gt;&gt;&gt; </tt><span><span>import</span> types</span>      .4<br /><tt>&gt;&gt;&gt; </tt><span>type(odbchelper) == types.ModuleType</span><br /><span>True<br /><br />.1 </span><tt>type</tt> 可以接收任何东西作为参数 -- 我的意思是任何东西 -- <br />并返回它的数据类型。整型、字符串、列表、字典、元组、函数、类、模块、甚至类型对象都可以作为参数被 <tt>type</tt> <br />函数接受。<br />.2<tt> type</tt> 可以接收变量作为参数，并返回它的数据类型。<br />.3 <tt>type</tt> 还可以作用于模块。<br />.4 你可以使用 <tt>types</tt> 模块中的常量来进行对象类型的比较。这就是 <tt>info</tt> 函数所做的，很快你就会看到。<br />-----------------获得的知识---------------------------------------<br />看到没有?第1点所说的,分明是说明了Python的元素(或者说是数据类型)有: &nbsp; &nbsp; &nbsp; <br />整型、字符串、列表、字典、元组、函数、类、模块、类型对象等.想起一句话,<strong>Python里面任何东西都是对象.</strong>起初我是这样以为的:<strong><br />那是不是所有东西都是类呢?</strong>我错了.<strong>类在Python中只是一种数据类型.而任何东西都是对象应该是针对Type来说的,对象是Type的实例,而并不限于是类的实例.<br /></strong>要知道Python所支持的Type?那dir一下types就知道:<br />['BooleanType', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'ClassType', 'CodeType', 'ComplexType', 'DictProxyType', <br />'DictType', 'DictionaryType', 'EllipsisType', 'FileType', 'FloatType', 'FrameType', 'FunctionType', 'GeneratorType', <br />'GetSetDescriptorType', 'InstanceType', 'IntType', 'LambdaType', 'ListType', 'LongType', 'MemberDescriptorType', 'MethodType',<br />&nbsp;'ModuleType', 'NoneType', 'NotImplementedType', 'ObjectType', 'SliceType', 'StringType', 'StringTypes', 'TracebackType',<br />&nbsp;'TupleType', 'TypeType', 'UnboundMethodType', 'UnicodeType', 'XRangeType']<br />这些就是Python的数据实际类型了.嘿.<br /><strong>---------------------------------------------------------<br />module?</strong><br />一个Py文件可以看作是一个模块?一个包可以看作一个模块?当Import一个包的时候,所获得的东西只有__init__.py里面的东西?<br />import一个模块的时候会去执行此模块的文件中的程序?<br />全中!<br /><br /><strong>class?</strong><br />我想不用多说了.或者留待以后再说.</pre>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://bbmyth.javaeye.com/blog/100518#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/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><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 01:55:47 +0800</pubDate>
        <link>http://bbmyth.javaeye.com/blog/100518</link>
        <guid>http://bbmyth.javaeye.com/blog/100518</guid>
      </item>
      <item>
        <title>Jmesa系列（三）开始使用JMesa</title>
        <author>我想我是海</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbmyth.javaeye.com">我想我是海</a>&nbsp;
          链接：<a href="http://bbmyth.javaeye.com/blog/95768" style="color:red;">http://bbmyth.javaeye.com/blog/95768</a>&nbsp;
          发表时间: 2007年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          相关文章:<br />
<span class="dark_c" style="font-size: 14pt; font-weight: bold;">&nbsp;<a href="http://bbmyth.javaeye.com/admin/show/89567"><font size="2">jmesa系列之一：什么是Jmesa</font></a></span><font size="2"><a href="javascript:void(0);/*1183178915828*/">&nbsp;</a>        <br />
<strong><a href="http://bbmyth.javaeye.com/admin/show/89570">&nbsp;jmesa系列(二)Jmesa源码的包结构解读</a></strong></font><font size="2"><span class="dark_c" style="font-size: 14pt; font-weight: bold;"></span></font><br />
<br />
这次目标很简单：实现服务器端分页列表功能。暂时不包括过滤、排序及Ajax。<br />
诸如过滤、排序及Ajax功能会在过程中逐一加上去。<br />
下面以一个简单的商品列表来说明<a href="http://code.google.com/p/jmesa/">JMesa</a>的使用方法。<br />
<br />
从JSP的代码可以看出.开发者不需要在页面上使用任何的JSP Tag来显示表格,只需要简单把products变量Print出来即可.而显示的逻辑基本上是放到Controller了.肯定有同学有疑问,这样的使 用方法远远不及使用JSP Tag方便啊!为什么要这样做?<br />
<br />
这里的显示仅仅是做一个API的使用Demo,为了说明我们可以直接使用<a href="http://code.google.com/p/jmesa/">Jmesa</a>的API,构造出只要你能想得到的形式的表格展现,而不限制于JSP Tag.你想封装成跟EC一样的Jsp Tag是很容易的事.那就是说,ExtreamTable只可以是JSP Tag.而Jmesa是可以提供Jsp Tag还有Jsp Tag以外的东西.在架构上,作者从EC到Jmesa的转变就是值得肯定的.对了,作者在<a href="http://code.google.com/p/jmesa/">Jmesa</a>中引进了<a href="http://groovy.codehaus.org/">Groovy</a>,目的我想就是可以让开发人员动态地决定表格的显示啦.效果跟JSP Tag一样,并且更方便.<br />
<br />
说说我目前在做的一个报表数据显示应用,同一个页面,可以显示不同构的数据列表,支持过滤,排序等.如果使用JSP Tag是很难达到动态显示数据列的目的,而用Jmesa的API转而易举..<br />
<br />
本文的目的是让大家对Jmesa有个感性的认识.而他的各个元素,如<a href="http://code.google.com/p/jmesa/wiki/Limit">Limit</a>,<a href="http://code.google.com/p/jmesa/wiki/CoreContext">CoreContext</a>这些,将会在接下来的时间详细说明.<br />
<br />
<br />
代码：Java代码仅有一实体类，一个Service，及一个Controller<br />
<strong>Product.java</strong><br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Product&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;index&nbsp;=&nbsp;</span><span class="number">1</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;price;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;Date&nbsp;createdTime;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;description;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Product(String&nbsp;name,&nbsp;</span><span class="keyword">int</span><span>&nbsp;price)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.id&nbsp;=&nbsp;index&nbsp;++;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.price&nbsp;=&nbsp;price;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.createdTime&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.description&nbsp;=&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//省略Getter&nbsp;setter</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<strong>ProductService.java<br />
<div class="code_title"><strong>java 代码</strong></div>
</strong>
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ProductService&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;List
    <product>&nbsp;products;&nbsp;&nbsp;</product>
    </span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ArrayList
    <product>();&nbsp;&nbsp;</product>
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;java&quot;</span><span>,&nbsp;</span><span class="number">10</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;ruby&nbsp;program&quot;</span><span>,&nbsp;</span><span class="number">50</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;c++&nbsp;start&quot;</span><span>,&nbsp;</span><span class="number">30</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;python&nbsp;cookbook&quot;</span><span>,&nbsp;</span><span class="number">40</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;java&nbsp;in&nbsp;a&nbsp;nut&nbsp;shell&quot;</span><span>,&nbsp;</span><span class="number">10</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;.net&nbsp;framework&quot;</span><span>,&nbsp;</span><span class="number">20</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;are&nbsp;you&nbsp;ok?&quot;</span><span>,&nbsp;</span><span class="number">21</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;are&nbsp;your&nbsp;light&nbsp;on?&quot;</span><span>,&nbsp;</span><span class="number">10</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;go&nbsp;to&nbsp;hell&quot;</span><span>,&nbsp;</span><span class="number">14</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;my&nbsp;name&nbsp;is&nbsp;red&quot;</span><span>,&nbsp;</span><span class="number">16</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;perl&nbsp;cookbook&quot;</span><span>,&nbsp;</span><span class="number">15</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;groovy&nbsp;in&nbsp;action&quot;</span><span>,&nbsp;</span><span class="number">20</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.add(<span class="keyword">new</span><span>&nbsp;Product(</span><span class="string">&quot;ruby&nbsp;on&nbsp;rails&quot;</span><span>,&nbsp;</span><span class="number">100</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span><span><span class="comment">//分页显示商品</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;List&nbsp;findProduct(</span><span class="keyword">int</span><span>&nbsp;pageNum,&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageSize)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;start&nbsp;=&nbsp;(pageNum&nbsp;-&nbsp;</span><span class="number">1</span><span>)&nbsp;*&nbsp;pageSize;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;end&nbsp;=&nbsp;start&nbsp;+&nbsp;pageSize;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List
    <product>&nbsp;ret&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ArrayList
    <product>();&nbsp;&nbsp;</product>
    </span></product>
    </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;products.size();&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(i&nbsp;&lt;&nbsp;start)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">continue</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(i&nbsp;&gt;=&nbsp;end)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(products.get(i));&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;ret;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; </span><span><span class="comment">//获得商品总数</span><span> <br />
    </span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getCountOfProduct()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;products.size();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
Demo避免使用数据库，在内存中初始化一些实体及实现分页查询功能。<br />
<strong><span><span>ListProductController </span><span class="keyword">.java</span></span></strong><br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>ProductController.java&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ListProductController&nbsp;</span><span class="keyword">extends</span><span>&nbsp;AbstractController&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;ProductService&nbsp;productService;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;maxRows;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setProductService(ProductService&nbsp;productService)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.productService&nbsp;=&nbsp;productService;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setMaxRows(</span><span class="keyword">int</span><span>&nbsp;maxRows)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.maxRows&nbsp;=&nbsp;maxRows;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;ModelAndView&nbsp;handleRequestInternal(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//step1 创建</span></span><span><span class="comment">limit(</span></span><span><span class="comment"> 包括查询条件,排序,分页信息等)</span><span><br />
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebContext&nbsp;webContext&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HttpServletRequestWebContext(request);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LimitFactory&nbsp;limitFactory&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;LimitFactoryImpl(</span><span class="string">&quot;product&quot;</span><span>,&nbsp;webContext);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Limit&nbsp;limit&nbsp;=&nbsp;limitFactory.createLimit();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;totalRows&nbsp;=&nbsp;productService.getCountOfProduct();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//classic&nbsp;export&nbsp;style&nbsp;program</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(limit.isExportable())&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowSelect&nbsp;rowSelect&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;RowSelectImpl(</span><span class="number">1</span><span>,&nbsp;totalRows,&nbsp;totalRows);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;limit.setRowSelect(rowSelect);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowSelect&nbsp;rowSelect&nbsp;=&nbsp;limitFactory.createRowSelect(maxRows,&nbsp;totalRows);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;limit.setRowSelect(rowSelect);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;items&nbsp;=&nbsp;productService.findProduct(limit.getRowSelect().getPage(),&nbsp;limit.getRowSelect().getMaxRows());&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//step2&nbsp; 创建 CoreContext</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoreContextFactory&nbsp;factory&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;CoreContextFactoryImpl(webContext);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoreContext&nbsp;coreContext&nbsp;=&nbsp;factory.createCoreContext(items,&nbsp;limit);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//step3 创建 table</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HtmlTableFactory&nbsp;tableFactory&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HtmlTableFactory(webContext,&nbsp;coreContext);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HtmlTable&nbsp;table&nbsp;=&nbsp;tableFactory.createTable(<span class="string">&quot;id&quot;</span><span>,&nbsp;</span><span class="string">&quot;name&quot;</span><span>,&nbsp;</span><span class="string">&quot;price&quot;</span><span>,&nbsp;</span><span cl