<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>邓胤的家当</title>
    <description></description>
    <link>http://dengyin2000.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>让gwt在linux 64位机上跑起来</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/217729" style="color:red;">http://dengyin2000.javaeye.com/blog/217729</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          gwt本身只提供32位的lib。所以你用64位的jdk去跑的话就会抛错。<br /><br /><pre name="code" class="java">Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/denny/Working/gwt-linux-1.5.0/libswt-pi-gtk-3235.so: /home/denny/Working/gwt-linux-1.5.0/libswt-pi-gtk-3235.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
</pre><br /><br />解决的方法就是安装一个32位的jdk。 如果在ubuntu的话， 用apt安装的默认的就是64位的，你需要去sun的网站上下载32位的jdk， 然后解压即可， 使用gwt时， export 32位的jdk。 然后导入到eclipse中， 这时候把这个项目使用的jdk也配置成使用32位的jdk（build path里面设置）。 这样就ok了<br /><br /><br />参考：http://theworldofapenguin.blogspot.com/2008/05/google-web-toolkit-in-linux-64-bit.html
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/217729#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 11:22:47 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/217729</link>
        <guid>http://dengyin2000.javaeye.com/blog/217729</guid>
      </item>
      <item>
        <title>使用sqldeveloper迁移mysql数据库至oracle</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/200637" style="color:red;">http://dengyin2000.javaeye.com/blog/200637</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我用的sqldeveloper是1.5.0.53的版本。 如果你在机子上装了oracle客户端的话，我们可能会发现一个奇怪的问题，当你执行任何操作的时候可能会发生下面的错误。 <br /><br /><pre name="code" class="java">oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert
(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert
(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert
(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert
(persistableObject.java:238)
oracle.dbtools.metadata.persistence.persisitableObject.dolnInsert(persistableObject.java:238)
....

oracle.dbtools.metadata.persistence.persistenceException: Protocol Violation</pre><br /><br />这是因为sqldeveloper用的是oracle 11g的jdbc driver， 如果装了oracle客户端的话， sqldeveloper会用到oracle客户端上的驱动 （这都是oracle_home搞得鬼）。我们在sqldeveloper的主目录下创建一个"sqldeveloper.cmd"的文件， 然后写入以下内容。<br /><br /><pre name="code" class="java">
SET ORACLE_HOME=%CD%
start sqldeveloper.exe
</pre><br /><br />以前启动sqldeveloper就双击这个cmd文件。 其实这个文件的作用也是很明显的。 就是在启动sqldeveloper时修改oracle_home环境变量 指向当前目录。<br /><br />在migration之前， 你需要创建一个repository， 这个是个中间库，会记录一下迁移数据库的信息 （就是在数据库中建议写MD_开头的表）。 <br /><br />在sqldeveloper最方便使用的是quick migrate，但是quick migrate只能让你选择是迁移table，data 或者所有。 所以index constraint之类的信息都会迁移过去。 <br /><br />在你source database中选择capture tables 或者 capture schema， 会在Captured Objects视图中出现你捕获的内容， 你可以选择删除掉一些不需要的东西， 比如外键约束，不需要导的表 等等。 <br /><br />准备好你捕获的信息之后，在captured model上单击右键-》Convert to Oracle Model。完成之后会在Converted Objects中生成Converted Model， 然后右键-》Generate 会生成对应的oracle数据库的sql scripts， 然后在你的target数据库运行这些脚本， 你就得到了对应的oracle的数据库结构了。 然后再在Converted Model上点击右键-》 Move Data。 选择source database和target数据库。OK。 让数据慢慢迁移吧。 <br /><br /><br />参考：http://forums.oracle.com/forums/thread.jspa?messageID=2536737&#2536737
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/200637#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 18:13:08 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/200637</link>
        <guid>http://dengyin2000.javaeye.com/blog/200637</guid>
      </item>
      <item>
        <title>篮球-坚持</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/196429" style="color:red;">http://dengyin2000.javaeye.com/blog/196429</a>&nbsp;
          发表时间: 2008年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          好久没打篮球了 好像最近一次还是去年11月。今天终于打了。 隔这么久没打   手感还没丢了。 一上来就命中几个中投。 篮下也依靠身体优势放进几个。不过打了久之后 体力明显不行了。 几个必进球没进。 还是努力减些体重。 经常打。。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/196429#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 24 May 2008 20:23:41 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/196429</link>
        <guid>http://dengyin2000.javaeye.com/blog/196429</guid>
      </item>
      <item>
        <title>ubuntu中使用VirtualBox的无缝模式集成Windows</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/180413" style="color:red;">http://dengyin2000.javaeye.com/blog/180413</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在ubuntu中安装VirtualBox非常简单,因为VirtualBox在ubuntu的源里. 你只需要sudo aptitude install VirtualBox就行了. <br /><br />安装好了之后在创建VM machine. 安装完了之后运行虚拟机,然后再点设备-->安装虚拟电脑软件包  即可. 包括显卡  网络   支持无缝模式.   OK 装完之后按 ctrl+L就可以启动无缝模式了. <br /><br /><img src="http://dengyin2000.javaeye.com/upload/picture/pic/11507/4d063000-8eef-365d-8346-f210ccfd5265.png" />
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/180413#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Apr 2008 12:52:59 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/180413</link>
        <guid>http://dengyin2000.javaeye.com/blog/180413</guid>
      </item>
      <item>
        <title>Eclipse启动参数(感觉是最好的一个)</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/178433" style="color:red;">http://dengyin2000.javaeye.com/blog/178433</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          -vmargs -Xverify:none -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -XX:+UseParallelGC
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/178433#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 15:04:35 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/178433</link>
        <guid>http://dengyin2000.javaeye.com/blog/178433</guid>
      </item>
      <item>
        <title>javaee开发者？那你一定得看The Java EE 5 Tutorial</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/177799" style="color:red;">http://dengyin2000.javaeye.com/blog/177799</a>&nbsp;
          发表时间: 2008年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果你说你用的是struts spring hibernate。 ok， 你大可不必在意我说的。 最近在学习JBoss seam，因为JBoss Seam使用的JSF，EJB（当然你可以不用ejb，但是Seam提供了非常方便的JSF和EJB的整合，而且现在EJB3也是不错的。所以觉得没有必要拒绝EJB。）  因为以前一直也是用spring hibernate。 没有接触过一些经典的j2ee的东西，比如EJB, JNDI, MESSAGEBEAN JPA 等等。以前<a href="http://java.sun.com/docs/books/tutorial/" target="_blank">java tutorial</a>带给我了入门java很大的帮助。 现在我也希望<a href="http://java.sun.com/javaee/5/docs/tutorial/doc/" target="_blank">java ee tutorial</a>也能让我真正的跨入java ee的殿堂。 Java ee 5 tutorial涵盖了所有的java ee知识。作为一本参考书也是非常不错的。另外，这两本书Sun都提供下载或在线阅读。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/177799#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 30 Mar 2008 16:31:30 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/177799</link>
        <guid>http://dengyin2000.javaeye.com/blog/177799</guid>
      </item>
      <item>
        <title>Dbunit中需要把schema name 大写</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/177270" style="color:red;">http://dengyin2000.javaeye.com/blog/177270</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用dbunit做dao的测试。 数据库用的是oracle。 在sqlplus用小写的schema name没有关系。 但是在dbunit中一定要用大写的schema name。 <a href="http://dbunit.sourceforge.net/faq.html#AmbiguousTableNameException" target="_blank">http://dbunit.sourceforge.net/faq.html#AmbiguousTableNameException</a>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/177270#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Mar 2008 15:11:29 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/177270</link>
        <guid>http://dengyin2000.javaeye.com/blog/177270</guid>
      </item>
      <item>
        <title>让你用seam new-project创建的项目也能用上JBossTools的功能。</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/173667" style="color:red;">http://dengyin2000.javaeye.com/blog/173667</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们可以用jbosstools直接创建Seam的项目， 但是我试了创建war项目还好，创建ear项目的话， 创建出来的都是不能编译的， 而且发布到Jboss deploy目录也是不合法的ear布局。 这些问题虽然可以通过手工修改来解决。但是我觉得还是用seam new-project创建出来的项目结构好很多，而且有很好的ant脚本。可以很方便的执行各种任务，而且我看到<a href="http://www.seamframework.org/Community/SeamUsersForum" target="_blank">seam论坛上</a>有人就说用jbosstools创建的seam的ear项目其实有4个项目（大家可以试试）。 他更喜欢seam new-project创建出来的一种目录的形式。就只有一个目录，用svn也更方便。 <br /><br />Seam2.0.1, JbossTools2.0.0GA(现在已经出了2.0.1GA，请看我在javaeye上发的新闻<a href="http://www.javaeye.com/news/1554" target="_blank">http://www.javaeye.com/news/1554</a>)。<br /><br />安装好JbossTools后， 你需要在eclipse中设置你的Seam的home。<br /><br /><img src="http://dengyin2000.javaeye.com/upload/picture/pic/9738/be3c7189-cd12-3c39-a15c-932af621ea7b.png" /><br /><br />用seam创建你的项目。请看。 <a href="http://docs.jboss.com/seam/2.0.1.GA/reference/en/html/gettingstarted.html#d0e2146" target="_blank">http://docs.jboss.com/seam/2.0.1.GA/reference/en/html/gettingstarted.html#d0e2146</a><br /><br />创建玩项目后用eclipse把刚创建的项目导入到eclipse中。File->Import->General->Existed projects into Workspace. 导入后你可能会发现有编译错误。 这个是因为eclipse把这个项目的java compiler设到了1.4. 我们把这个改成5.0就行了。 <br /><br /><img src="http://dengyin2000.javaeye.com/upload/picture/pic/9742/42656887-0be4-3c8d-a919-c6a393bb51e8.png" /><br /><br />Jbosstools最好的一项功能是它能自动的识别出项目中所有的component。这个在写xhtml非常方便。而且还能在xhtml中跳转到java code。 更多的jbosstools的功能请看。<a href="http://in.relation.to/Bloggers/JBossToolsScreenshots" target="_blank">http://in.relation.to/Bloggers/JBossToolsScreenshots</a><br /><br />我们在eclipse中打开Seam Component， Window->Show View->Other->Seam->Seam Component.<br /><br />我们发现我们刚刚导入的sample项目找不到任何的compoent。Order是我用Jbosstools创建的一个war seam项目。<br /><img src="http://dengyin2000.javaeye.com/upload/picture/pic/9744/99958599-c172-3258-a90f-833db087b8f2.png" /><br /><br />OK，打开你的.project文件，加入以下的代码。 （不要告诉我你不知道.project在哪里，是干什么用的。）<br /><br /><pre name="code" class="xml">		&lt;buildCommand>
			&lt;name>org.jboss.tools.common.verification.verifybuilder&lt;/name>
			&lt;arguments>
			&lt;/arguments>
		&lt;/buildCommand>
		&lt;buildCommand>
			&lt;name>org.jboss.tools.seam.core.seambuilder&lt;/name>
			&lt;arguments>
			&lt;/arguments>
		&lt;/buildCommand></pre><br /><br />加入之后的.project应该是这样的。<br /><br /><pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;projectDescription>
	&lt;name>sample&lt;/name>
	&lt;comment>&lt;/comment>
	&lt;projects>
	&lt;/projects>
	&lt;buildSpec>
		&lt;buildCommand>
			&lt;name>org.eclipse.jdt.core.javabuilder&lt;/name>
			&lt;arguments>
			&lt;/arguments>
		&lt;/buildCommand>
		&lt;buildCommand>
			&lt;name>org.jboss.tools.common.verification.verifybuilder&lt;/name>
			&lt;arguments>
			&lt;/arguments>
		&lt;/buildCommand>
		&lt;buildCommand>
			&lt;name>org.jboss.tools.seam.core.seambuilder&lt;/name>
			&lt;arguments>
			&lt;/arguments>
		&lt;/buildCommand>		
		&lt;buildCommand>
			&lt;name>org.eclipse.ui.externaltools.ExternalToolBuilder&lt;/name>
			&lt;triggers>auto,full,incremental,&lt;/triggers>
			&lt;arguments>
				&lt;dictionary>
					&lt;key>LaunchConfigHandle&lt;/key>
					&lt;value>&lt;project&gt;/explode.launch&lt;/value>
				&lt;/dictionary>
			&lt;/arguments>
		&lt;/buildCommand>
	&lt;/buildSpec>
	&lt;natures>
		&lt;nature>org.eclipse.jdt.core.javanature&lt;/nature>
		&lt;nature>org.hibernate.eclipse.console.hibernateNature&lt;/nature>
		&lt;nature>org.jboss.tools.seam.core.seamnature&lt;/nature>
	&lt;/natures>
&lt;/projectDescription></pre><br /><br />OK， 再看下Seam Component， 现在已经可以找到所有的seam component了。 <br /><img src="http://dengyin2000.javaeye.com/upload/picture/pic/9748/747cb906-06d5-3936-9366-bb436fb3b0e2.png" /><br /><br /><br />随便写个seam compoenent。<br /><pre name="code" class="java">
import org.jboss.seam.annotations.Name;

@Name("testELExpression")
public class TestElExpression {
	public String getName() {
		return "deng.yin@gmail.com";
	}
	
	public void doListener() {
		
	}
}</pre><br /><br />已经有提示了。 <br /><br /><img src="http://dengyin2000.javaeye.com/upload/picture/pic/9750/92883305-e11b-3d47-b947-9a8d86769497.png" />
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/173667#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 11:02:49 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/173667</link>
        <guid>http://dengyin2000.javaeye.com/blog/173667</guid>
      </item>
      <item>
        <title>Set up mysql replication and control slave thread</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/171427" style="color:red;">http://dengyin2000.javaeye.com/blog/171427</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3>1. Environment</h3>&nbsp;&nbsp; <br />&nbsp; In <a href="http://192.168.1.202/" target="_blank">192.168.1.202</a><br /><br />&nbsp; Database: BILLING<br />&nbsp; DB Account: root<br />&nbsp; DB Password: <br /><br /><br />&nbsp; In <a href="http://192.168.1.204/" target="_blank">192.168.1.204</a><br />&nbsp; Database: BILLING<br />&nbsp; DB Account: root<br />&nbsp; DB Password: <br /><br />&nbsp; We need to replicate the following tables from <a href="http://192.168.1.204/" target="_blank">192.168.1.204</a> to <a href="http://192.168.1.202/" target="_blank">192.168.1.202</a>.<br />&nbsp; users<br />&nbsp; plan<br />&nbsp; profile<br /><br /><h3>2. Steps</h3><br />&nbsp; Because we need replicate the data from 204 to 202, So, Mysql server in 204 is master, and the 202 is slave. <br />&nbsp; <br />&nbsp; a. Ssh to 204, Open /etc/mysql/my.cnf mysql configuration file. Make sure the following two lines is uncommented. <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_bin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = /var/log/mysql/mysql-bin.log<br /><br />&nbsp; b. Ssh to 202, Open /etc/mysql/my.cnf mysql configuration file. Make sure it has following lines. <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server-id=2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log-slave-updates<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read-only=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replicate-do-db=BILLING<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replicate-do-table=BILLING.users<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replicate-do-table=BILLING.plan<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replicate-do-table=BILLING.profile<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; relay-log-purge=1<br /><br />&nbsp; c. Connect to master mysql server, Create a mysql user for replication. <br />&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mysql&gt; grant replication slave on *.* to 'rep'@'%' identified by 'rep';<br /><br />&nbsp;
d. Lock the tables on master mysql server, So we can dump the master
server's data and import to slave server. Make master and slave has the
same data.<br />&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  mysql&gt; flush tables with read lock;<br /><br />&nbsp; e. Show master status, and record the data. <br /><br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; mysql&gt; show master status;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+------------------+----------+--------------+------------------+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| File&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Position | Binlog_Do_DB | Binlog_Ignore_DB |<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+------------------+----------+--------------+------------------+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| <span style="color: #ff0000">mysql-bin.000002</span> |&nbsp; &nbsp; &nbsp; <span style="color: #ff0000">228 </span>|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+------------------+----------+--------------+------------------+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 row in set (0.00 sec)<br />&nbsp; <br />&nbsp; f. Connect to slave server and run the following commands. <span style="color: #ff0000">Notice, the data of MASTER_LOG_FILE and MASTER_LOG_POS come from step 6. </span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql&gt; CHANGE MASTER TO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;-&gt; MASTER_HOST='192.168.1.204',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;-&gt; MASTER_USER='rep',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;-&gt; MASTER_PASSWORD='rep',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: #ff0000">-&gt; MASTER_LOG_FILE='mysql-bin.000002',</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: #ff0000">-&gt; MASTER_LOG_POS=228;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query OK, 0 rows affected (0.01 sec)&nbsp;&nbsp;&nbsp; <br /><br />&nbsp; g. Start the slave thread. <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; start slave;<br /><br />&nbsp; h. OK, the replication is completed, Don't forget to unlock the master's tables. <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; unlock tables;<br /><br /><br /><br /><h3>3. Start/Stop slave thread by Java code. <br /></h3><p>We can start/stop the slave thread by java code(actually by JDBC). First create a user with all privileges. <br /><br />mysql&gt; GRANT ALL PRIVILEGES ON *.* TO slave@&quot;%&quot;&nbsp; IDENTIFIED BY 'slave';<br /><br />OK, Now, We have a user which use to start/stop slave thread. The following code is how to start/stop slave thread. <br /><br />import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.PreparedStatement;<br />import java.sql.SQLException;<br /><br /><br />public class Slave {<br /><br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp; &nbsp;* @param args<br />&nbsp;&nbsp;&nbsp; &nbsp;*/<br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String connString = &quot;jdbc:mysql://192.168.1.202:3306/RMC_BILLING&quot;;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class.forName(&quot;com.mysql.jdbc.Driver&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (ClassNotFoundException e) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Connection connection = DriverManager.getConnection(connString, &quot;slave&quot;, &quot;slave&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PreparedStatement ps = connection.prepareStatement(&quot;start slave&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //The next line is used to stop the slave. <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //PreparedStatement ps = connection.prepareStatement(&quot;stop slave&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int executeUpdate = ps.executeUpdate();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(executeUpdate);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br /><br />}<br /><br /><br />在项目中有这样的需求， 就是想控制定期的slave thread。 在网上找到了http://forums.mysql.com/read.php?26,43705,43705#msg-43705&nbsp; 上面有两种方式。 不过都比较复杂。 后面不知道怎么就突然想到了 是不是可以用jdbc去做。 然后马上写了个Main跑了一下， 果然可以。 </p><p>&nbsp;</p><p>参考： http://www.ningoo.net/html/2007/mysql_replication_configuration.html</p>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/171427#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Mar 2008 15:44:57 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/171427</link>
        <guid>http://dengyin2000.javaeye.com/blog/171427</guid>
      </item>
      <item>
        <title>想买个手机，价格在1000-1600之间。 </title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/167798" style="color:red;">http://dengyin2000.javaeye.com/blog/167798</a>&nbsp;
          发表时间: 2008年03月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          手上的西门子的手机从03年底用到现在。 质量确实不错。 但是电池感觉快没用了。 待机也就能呆个2天。 主要想有的功能是 听歌， 看看电子书， U盘。 摄像的功能可以不用。 最近也看了一些手机。 主要集中在诺基亚 和摩托罗拉 索爱上。 <br /><br />诺基亚 6120c  6300 n72 <br /><br />索爱 w810  <br /><br />感觉  诺基亚6120c不错。 网上的评价也好。 是一款普及型的职能手机。 屏幕虽然很小，但是字还是比较清晰。 速度快。 <br /><br />大家有没有什么推荐？
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/167798#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Mar 2008 16:48:58 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/167798</link>
        <guid>http://dengyin2000.javaeye.com/blog/167798</guid>
      </item>
      <item>
        <title>在jboss中设置ssl</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/163307" style="color:red;">http://dengyin2000.javaeye.com/blog/163307</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 id="SetupCASforSSO">Set up CAS for SSO<a href="https://geoman-trac.cvsdude.com/reader/wiki/SetupCasForSSO#SetupCASforSSO" class="anchor" title="Link to this section"> &para;</a></h1>
<p>
<strong>1. Create Server Certificate for JBoss</strong>
</p>
<p>
CAS largely depends on secure transfer layer (STL), so having SSL enabled on JBoss server is critical to this application.
</p>
<p>
Firstly we will create the server certificate:
</p>
<pre class="wiki">keytool -genkey -alias jboss -keyalg RSA -keystore server.keystore
or
keytool -genkey -alias devdap1 -keyalg RSA -keystore devdap1.keystore
</pre><p>
 
<strong><em>Caution:</em></strong>
</p>
<blockquote>
<p>
1: Give the keystore a password (hereinafter referred as keystore
password). There is another password in the end, which will be referred
to as alias password.
</p>
</blockquote>
<blockquote>
<p>2: Use the full domain name of the server machine as the first and
last name, as well as the organization unit. Don&rsquo;t use the IP address
here, or you will fail the SSL verification later. And try to avoid
using &ldquo;localhost&rdquo; also since you may need to deploy CAS on some
dedicated server and there are applications that are trying to access
it from some remote JVM.
</p>
</blockquote>
<blockquote>
<p>3: We may have multiple machines that need their own certificates
and do the cross-certified (we will cover this later), so a wise way to
arrange the them is to name it based on the hostname. In the above
example, say we have a machine whose hostname is devdap1, we can name
the keystore file as devdap1.keystore and give it an alias as devdap1.
</p>
</blockquote>
<p>Then we will export a server certificate for installation on the
client machines, we actually can skip these steps since in a Browser
client, the browser will download the server cert automatically.
</p>
<pre class="wiki">keytool -export -file devdap1.crt -alias devdap1 -keystore devdap1.keystore

keytool -import -keystore &quot;%JAVA_HOME%\jre\lib\security\cacerts&rdquo; -file devdap1.crt -alias devdap1

(On Linux: keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file devdap1.crt -alias devdap1)
</pre><p>
 
<strong>2. Cross-Certified</strong>
</p>
<p>We may have a group of servers to host all the applications. Let&rsquo;s
say we have a CAS server deployed on a JBoss server running on a box
with the hostname devdap1 (the full domain name is
devdap1.monitor110.com). And we have another box named &ldquo;reader&rdquo; hosting
the reader application. When &ldquo;reader&rdquo; wants to access CAS server, it
needs to install devdap1&rsquo;s certificate installed in the JVM that runs
the reader application.
</p>
<p>
Firstly, we copy the devdap1.crt file that generated in the above step to the reader machine.
</p>
<p>
Then we run the following command to install the certificate:
</p>
<pre class="wiki">keytool -import -keystore &quot;%JAVA_HOME%\jre\lib\security\cacerts&rdquo; -file devdap1.crt -alias devdap1

(On Linux: keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file devdap1.crt -alias devdap1)
</pre><p>
 
The default password of keystore cacerts is &ldquo;changeit&rdquo;.
</p>
<p>
You may also want to delete the alias first if that alias has been installed before.
</p>
<pre class="wiki">keytool -delete -keystore $JAVA_HOME/jre/lib/security/cacerts -alias devdap1
</pre><p> If you want to enable SSL on &ldquo;reader&rdquo; machine and use
proxyTicket over SSL, you need to generate the certificate of &ldquo;reader&rdquo;
machine, and install it on CAS (devdap1) machine as well. Let&rsquo;s say you
will generate files &ldquo;reader1.keystore&rdquo; and &ldquo;reader1.crt&rdquo;, and use an
alias &ldquo;reader1&rdquo; for this certificate when doing import/export and
installation. This way you won&rsquo;t mess up all those certificates.
</p>
<p>
<strong>3. Enable SSL for JBoss</strong>
</p>
<p>
We take JBoss App Server 4.0.3 as example. We use $JBOSS_HOME to refer to the location where JBoss is installed.
</p>
<p>
Firstly copy the server.keystore file that generated in the above step to the location of $JBOSS_HOME/server/default/conf.
</p>
<p>Then modify this file:
$JBOSS_HOME/server/default/deploy/jbossweb-tomcat55.sar/server.xml.
Uncomment this configuration directive:
</p>
<pre class="wiki">&lt;!-- SSL/TLS Connector configuration using the admin devl guide keystore --&gt;

      &lt;Connector port=&quot;8443&quot; address=&quot;${jboss.bind.address}&quot;
           maxThreads=&quot;100&quot; strategy=&quot;ms&quot; maxHttpHeaderSize=&quot;8192&quot;
           emptySessionPath=&quot;true&quot;
           scheme=&quot;https&quot; secure=&quot;true&quot; clientAuth=&quot;false&quot; 
           keystoreFile=&quot;${jboss.server.home.dir}/conf/server.keystore&quot;
           keystorePass=&quot;123456&quot; sslProtocol = &quot;TLS&quot; /&gt;
</pre><p>
The keystorePass used here is the key store password we mentioned in the above step 1.
</p>
<p>
Restart the JBoss server and verify the SSL installation by entering this URL in the browser: <a href="https://localhost:8443/" class="ext-link"><span class="icon">https://localhost:8443/</span></a>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/163307#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Feb 2008 12:11:28 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/163307</link>
        <guid>http://dengyin2000.javaeye.com/blog/163307</guid>
      </item>
      <item>
        <title>Mysql的bind-address</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/158410" style="color:red;">http://dengyin2000.javaeye.com/blog/158410</a>&nbsp;
          发表时间: 2008年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天下午准备搞下mysql的replication， 搞了一下午竟然被bind-address搞死了。 <br /><br />msyql默认的bind-address是127.0.0.1，这样的话就算你创建的用户有可以remote访问的话 也不能通过-h 来访问。 mysql只接受localhost。 <br /><br />shit  mysql的replication比较简单。<br /><br /><br />官方文档： http://dev.mysql.com/doc/refman/5.0/en/replication.html<br />一篇中文的简单方法： http://www.ningoo.net/html/2007/mysql_replication_configuration.html
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/158410#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jan 2008 19:45:19 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/158410</link>
        <guid>http://dengyin2000.javaeye.com/blog/158410</guid>
      </item>
      <item>
        <title>扔掉T5复杂的Grid组件，打造自己灵活的支持分页排序组件。</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/152783" style="color:red;">http://dengyin2000.javaeye.com/blog/152783</a>&nbsp;
          发表时间: 2008年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Grid算是比较T5中较复杂的一个组件，我也有篇介绍Grid怎么使用的文章。<a href="http://www.javaeye.com/topic/114754" target="_blank">http://www.javaeye.com/topic/114754</a>   但是如果我们平时需要些比较灵活的布局。 Grid组件用起来就比较别扭了。  <br /><br />下面我介绍下使用Loop组件实现一个灵活但是又不缺乏分页，排序功能的Grid组件的实现。 <br /><br />首先我们全局看下页面上是要怎样写的。 <br /><br /><pre name="code" class="html">        &lt;table>
        	&lt;tr>
        		&lt;td>&lt;a t:type="OrderColumn" orderProperty="country" paging="paging">Country&lt;/a> &lt;/td>
        		&lt;td>&lt;a t:type="OrderColumn" orderProperty="language" paging="paging">Language&lt;/a> &lt;/td>
        	&lt;/tr>
        	&lt;tr t:type="Loop" source="items" value="item">
        		&lt;td>${item.country}&lt;/td>
        		&lt;td>${item.language}&lt;/td>
        	&lt;/tr>
        	&lt;tr>
        		&lt;td colspan="2">&lt;div t:type="PageNavigation" paging="paging" useAll="false">&lt;/div>&lt;/td>
        	&lt;/tr>
        &lt;/table></pre><br /><br />是不是比较简单。 你可以单独输出Table的头部和body部分。 这里使用了2个组件一个OrderColumn，一个是PageNavigation。 这两个组件公用了一个paging对象， 这个paging对象其实提供了对分页，和当前排序字段的支持。 下面看看page class的内容。 <br /><br /><pre name="code" class="java">package com.javaeye.com.dengyin000.tapestry.quickstart.pages;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.apache.tapestry.annotations.Persist;

import com.javaeye.com.dengyin000.tapestry.quickstart.utils.Paging;

/**
 * Start page of application quickstart.
 */
public class Start
{
	@Persist("session")
	private Paging paging;
	
	private Locale item;
	
	public Locale getItem() {
		return item;
	}

	public Date getCurrentTime() 
	{ 
		return new Date(); 
	}
	
	public Locale[] getAvailableLocales(){
		return Locale.getAvailableLocales();
	}
	
	public void pageLoaded(){
		if (paging == null){
			paging = new Paging("country");
		}
	}
	
	public List&lt;Locale> getItems(){
		Locale[] availableLocales = Locale.getAvailableLocales();
		List&lt;Locale> list = Arrays.asList(availableLocales);
		paging.setItemCount(list.size());
		return list.subList(paging.getFirstResult(), paging.getFirstResult() + paging.getMaxResults());
	}

	public Paging getPaging() {
		return paging;
	}

	public void setPaging(Paging paging) {
		this.paging = paging;
	}

	public void setItem(Locale item) {
		this.item = item;
	}
}

</pre><br /><br />这里我们把paging对象保存在了session里。 然后绑定到OrderColumn和PageNavigation组件中。 请注意getItems方法。 这个是获得你要显示的数据。 这里你要先得到所有的数据的总数然后调用setItemCount方法， 然后你要通过paging中的firstResult maxResult orderProperty order（desc，ase）去获取你要显示的数据。 下面看看paging对象。 <br /><br /><pre name="code" class="java">package com.javaeye.com.dengyin000.tapestry.quickstart.utils;

import java.io.Serializable;
import java.util.List;

public class Paging implements Serializable {

	private static final long serialVersionUID = 4260574632101852340L;

	public static int ROWS_PER_PAGE = 15;

	public static int ALL = -1;

	private int firstResult = 0;

	private int maxResults = ROWS_PER_PAGE;

	/**
	 * One or more property names separated by comma (,). They are later used in
	 * ORDER BY clause.
	 */
	private String orderProperties;

	private boolean orderDescending = false;

	private int pageNo = 0;

	private long itemCount = 0;

	private String alias = null;

	protected boolean recalculateFirst = false; // enabled by setPageNo or
												// setItemCount

	private transient List results;

	public Paging(String orderColumn) {
		setOrderProperties(orderColumn);
	}

	public Paging(String orderColumn, boolean orderDescending) {
		setOrderProperties(orderColumn);
		setOrderDescending(orderDescending);
	}

	public Paging(String orderColumn, int pageNo) {
		setOrderProperties(orderColumn);
		setPageNo(pageNo);
	}

	public Paging(int firstResult, int maxResults, String orderColumn,
			boolean orderDescending) {
		this(firstResult, maxResults, orderColumn, null, orderDescending);
	}

	public Paging(int firstResult, int maxResults, String orderColumn,
			String alias, boolean orderDescending) {
		setFirstResult(firstResult);
		setMaxResults(maxResults);
		setOrderProperties(orderColumn);
		setOrderDescending(orderDescending);
		setAlias(alias);
	}

	public boolean isAll() {
		return pageNo == ALL;
	}

	public int getFirstResult() {
		if (this.recalculateFirst == true) {
			if (pageNo != ALL) {
				if (pageNo &lt; 0) {
					pageNo = 0;
				}
				firstResult = pageNo * maxResults;
				if (firstResult >= itemCount) {
					firstResult = pageNo = 0;
				}
			} else {
				firstResult = 0;
			}
			this.recalculateFirst = false;
		}
		return firstResult;
	}

	public void changeSortColumn(String sortColumn) {
		if (sortColumn != null && sortColumn.equals(getOrderProperties())) {
			setOrderDescending(isOrderDescending() == true ? false : true); // change
																			// order
																			// desc
		} else {
			setOrderDescending(false); // set ascending order
			setOrderProperties(sortColumn);
		}
	}

	public void setFirstResult(int firstResult) {
		this.firstResult = firstResult;
	}

	public int getMaxResults() {
		return maxResults;
	}

	public void setMaxResults(int maxResults) {
		this.maxResults = maxResults;
	}

	public String getOrderProperties() {
		return orderProperties;
	}

	public void setOrderProperties(String sortColumn) {
		this.orderProperties = sortColumn;
	}

	public boolean isOrderDescending() {
		return orderDescending;
	}

	public void setOrderDescending(boolean sortOrder) {
		this.orderDescending = sortOrder;
	}

	public long getItemCount() {
		return itemCount;
	}

	public void setItemCount(long itemCount) {
		this.itemCount = itemCount;
		this.recalculateFirst = true;
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
		this.recalculateFirst = true;
	}

	public String getAlias() {
		return alias;
	}

	public void setAlias(String alias) {
		this.alias = alias;
	}

	public void setResults(List results) {
		this.results = results;
	}

	public List getResults() {
		return results;
	}

	/**
	 * apply order properties to the query string.
	 * @param query
	 * @param pas
	 * @return
	 */
	public static String buildOrderBy(String query, Paging pas) {
	    //FIXME
		if (pas != null && pas.getOrderProperties() != null) {
			StringBuffer orderBy = new StringBuffer();
			/** Oracle 
			int groupindex = query.toLowerCase().indexOf(" group ");
            if(groupindex>0){
                int i = query.toLowerCase().indexOf(" by ",groupindex+1);
                if(i>groupindex && (i-groupindex)&lt;12)return query;
            }
			**/
			int posOrder = query.toLowerCase().indexOf(" order ");
			if (posOrder > 0) {
				int posBy = query.toLowerCase().indexOf(" by ", posOrder - 1);
				if (posBy >= 0) {
					orderBy.append(query.substring(0, posOrder));
				} else
					orderBy.append(new String(query));
			} else {
				orderBy.append(new String(query));
			}
			
			orderBy.append(" order by ");
			String[] orderCols = pas.getOrderProperties().split(",");
			for (int i = 0; i &lt; orderCols.length; i++) {
				if (i > 0) {
					orderBy.append(", ");
				}
				if (pas.getAlias() != null) {
					orderBy.append(pas.getAlias() + ".");
				}
				
				orderBy.append(orderCols[i]);
				
				if (pas.isOrderDescending()) {
					orderBy.append(" desc");
				}
			}
			return orderBy.toString();
		}
		return query;

	}

	/**
	 * 'from User' or 'select name from User' will be changed to 
	 * 'select count(*) from User'
	 * replace select fields with count(*)
	 * @param queryString
	 * @return
	 */
	public static String buildItemCount(String queryString) {
		int posOfFrom = queryString.toLowerCase().indexOf("from ");
		return "select count(*) " + queryString.substring(posOfFrom);
	}
}
</pre><br /><br />ok， 下面贴下OrderColumn， PageNavigation的代码<br /><br />OrderColumn.tml<br /><br /><pre name="code" class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
&lt;span xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
	&lt;a t:type="ActionLink" t:id="changeOrderLink"  t:context="orderProperty">
		&lt;t:body/>&lt;img src="${icon}" class="t-sort-icon" alt="${iconLabel}"/>
	&lt;/a>
&lt;/span></pre><br /><br />OrderColumn.java<br /><pre name="code" class="java">package com.javaeye.com.dengyin000.tapestry.quickstart.components;

import org.apache.tapestry.Asset;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.annotations.Path;
import org.apache.tapestry.ioc.annotations.Inject;

import com.javaeye.com.dengyin000.tapestry.quickstart.utils.Paging;

public class OrderColumn {

	@Parameter(required=true, defaultPrefix="literal")
	private String orderProperty;
	
	@Parameter(required=true)
	private Paging paging;

    @Inject
    @Path("sort-asc.png")
    private Asset _ascendingAsset;

    @Inject
    @Path("sort-desc.png")
    private Asset _descendingAsset;

    @Inject
    @Path("sortable.png")
    private Asset _sortableAsset;	

	public String getOrderProperty() {
		return orderProperty;
	}

	public void setOrderProperty(String orderProperty) {
		this.orderProperty = orderProperty;
	}

	public Paging getPaging() {
		return paging;
	}

	public void setPaging(Paging paging) {
		this.paging = paging;
	}
	
	public void onActionFromChangeOrderLink(String orderProperty){
		paging.changeSortColumn(orderProperty);
	}
	
	public Asset getIcon(){
        if (isActiveSortColumn()) {
        	return getPaging().isOrderDescending() ?  _descendingAsset : _ascendingAsset;
        }

        return _sortableAsset;
    }
	
	private boolean isActiveSortColumn() {
		return orderProperty.equals(getPaging().getOrderProperties());
	}

	public String getIconLabel(){
        String key = isActiveSortColumn() ? ( getPaging().isOrderDescending() ? "descending": "ascending")
                : "sortable";

        return key;
	}
}</pre><br /><br /><br />PageNavigation.tml<br /><br /><pre name="code" class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
&lt;span t:type="If"  t:test="navigationDisplayed" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
	&lt;table border="0">
	&lt;tr>
	  &lt;td>&nbsp;&lt;/td>
	  &lt;td class="navigation">
	  	&lt;span t:type="If" t:test="notUnderAllStatus">
	  		&lt;a t:type="ActionLink" t:id="first" t:context="first" t:disabled="firstDisabled">|&lt;&lt;&lt;/a>
	  		&nbsp;
	  		&lt;a t:type="ActionLink" t:id="previous" t:context="previous" t:disabled="previousDisabled">&lt;&lt;&lt;/a>
	  		&nbsp;
	  		Page ${currentPage} Of ${pageCount}
	  		&lt;a t:type="ActionLink" t:id="next" t:context="next" t:disabled="nextDisabled">&gt;&gt;&lt;/a>
	  		&nbsp;
	  		&lt;a t:type="ActionLink" t:id="last" t:context="last" t:disabled="lastDisabled">&gt;&gt;|&lt;/a>
	  		&nbsp;
	  		&lt;span t:type="If" t:test="useAll">
	  			&lt;a t:type="ActionLink" t:context="all" t:disabled="allDisabled">All&lt;/a>
	  			&lt;t:parameter name="else">
	  				&lt;a t:type="ActionLink" t:id="pageStatus" t:disabled="prop:notUnderAllStatus">View Paginated&lt;/a>
	  			&lt;/t:parameter>
	  		&lt;/span>
	  	&lt;/span>
	  &lt;/td>
	&lt;/tr>
	&lt;/table>
&lt;/span></pre><br /><br />PageNavigation.java<br /><br />package <pre name="code" class="java">com.javaeye.com.dengyin000.tapestry.quickstart.components;

import org.apache.tapestry.annotations.OnEvent;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.annotations.Persist;

import com.javaeye.com.dengyin000.tapestry.quickstart.utils.Paging;

public class PageNavigation {

	@Persist
	private boolean underAllStatus;
	@Parameter(required=true)
	private Paging paging;
	
	private Integer num;
	
	@Parameter
	private boolean useAll;

	public boolean isUseAll() {
		return useAll;
	}

	public void setUseAll(boolean useAll) {
		this.useAll = useAll;
	}

	public boolean isUnderAllStatus() {
		return underAllStatus;
	}
	
	public boolean getNotUnderAllStatus(){
		return !underAllStatus;
	}

	public void setUnderAllStatus(boolean underAllStatus) {
		this.underAllStatus = underAllStatus;
	}

	public Paging getPaging() {
		return paging;
	}

	public void setPaging(Paging paging) {
		this.paging = paging;
	}

	public Integer getNum() {
		return num;
	}

	public void setNum(Integer num) {
		this.num = num;
	}
	
	public void onActionFromFirst(Integer newPageNo){
		changePageNo(newPageNo);
	}
	public void onActionFromPrevious(Integer newPageNo){
		changePageNo(newPageNo);
	}
	public void onActionFromNext(Integer newPageNo){
		changePageNo(newPageNo);
	}
	public void onActionFromLast(Integer newPageNo){
		changePageNo(newPageNo);
	}	
	  public void changePageNo(Integer newPageNo) {

		    getPaging().setPageNo(newPageNo == null ? Paging.ALL : newPageNo.intValue());
//		    setPaging(getPaging()); // persist!
		    
		    if (newPageNo == null)
		    	setUnderAllStatus(true);
		  }

		  public Integer[] getAllPageNumbers() {
		    int size = getLast().intValue() + 1;
		    Integer[] allPages = new Integer[size];
		    for (int i = 0; i &lt; size; i++) {
		      allPages[i] = new Integer(i);
		    }
		    return allPages;
		  }

		  public String getPageLabel() {
		    return "" + (getNum().intValue() + 1);
		  }

		  public Integer getFirst() {
		    return new Integer(0);
		  }

		  public Integer getPrevious() {
		    return new Integer(getPaging().getPageNo() - 1);
		  }

		  public Integer getNext() {
		    return new Integer(getPaging().getPageNo() + 1);
		  }

		  public Integer getLast() {
		    int last = (int)Math.ceil((double)getPaging().getItemCount() / getPaging().getMaxResults()) - 1;
		    return new Integer(last);
		  }

		  public Integer getAll() {
		    return null;
		  }

		  public boolean isFirstDisabled() {
		    return getPaging().getPageNo() == 0;
		  }

		  public boolean isPreviousDisabled() {
		    return isFirstDisabled() || getPaging().getPageNo() == Paging.ALL;
		  }

		  public boolean isSelectedPage() {
		    return getPaging().getPageNo() == getNum().intValue();
		  }

		  public boolean isNextDisabled() {
		    return isLastDisabled() || getPaging().getPageNo() == Paging.ALL;
		  }

		  public boolean isLastDisabled() {
		    return getPaging().getPageNo() == getLast().intValue();
		  }

		  public boolean isAllDisabled() {
		    return getPaging().getPageNo() == Paging.ALL || getLast().intValue() == 0;
		  }

		  public boolean isNavigationDisplayed() {
		    return getLast().intValue() > 0;
		  }
		  
		  @OnEvent(component="pageStatus")
		  public void enterPagingStatus(){
			  setUnderAllStatus(false);
			  
			  getPaging().setPageNo(0);
//			  setPaging(getPaging());
		  }
		  
		  public int getCurrentPage(){
			  return paging.getPageNo() + 1;
			  
		  }
		  
		  public int getPageCount(){
			  return getLast() + 1;
		  }
}</pre><br /><br /><br />Ok,这个对于T4, T3也是一样的。 你只要把OrderColumn 和 PageNavigation 组件改成相应版本下面的组件就行了。 还有就是如果觉得PageNavigation看起来不是很好的话， 你也可以自己做各式各样的PageNavigation，他就只需要Paging这个类。 <br /><br />我把这个打包成了一个Maven项目。 如果你装了WTP的话。 <br />运行mvn eclipse:eclipse -Dwtpversion=1.0 -DdownloadSources=true 然后再import项目到eclipse中就行了。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/152783#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jan 2008 13:12:00 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/152783</link>
        <guid>http://dengyin2000.javaeye.com/blog/152783</guid>
      </item>
      <item>
        <title>对Tapestry的一点思考。</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/151370" style="color:red;">http://dengyin2000.javaeye.com/blog/151370</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry5已经开发了蛮久了。 听说最近要发布T5.0.7了， 会加上Ajax的功能。 我觉得Tapestry5丢掉了Tapestry的一个非常重要的优点和特色， 那就是把jwcid换成了用xml namespace定义组件了。 这样的话跟jsp里使用tag没什么区别。 很多人当初使用tapestry也是冲着Tapestry能够非常好的预览html， 不会像jsp那样， tag把html页面弄得支离破碎。 这样能够拉近程序员和美工之间的距离，提高工作效率。 如果tapestry还是使用这种方式。 我觉得struts2是更好的选择。 <br /><br />最近也是因为我帮组公司中的其他项目修改页面有感而发的。 那个项目使用seam， 在调整jsf中的dateTable组件时非常不爽。 <br /><br />感觉Tapestry可能马上会没落下去。 T5搞了这么久都还没有release。 所以也有了一点小的想法。 能不能对T4进行改造， 用spring替换hivemind， 把page class可以向T5那样用个pojo。提高T4的效率。 其实直接点的话就是把T5的page template的写法换回成T4的方式。 使用jwcid。 <br /><br /><img src="/images/smiles/icon_biggrin.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/151370#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Dec 2007 23:33:38 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/151370</link>
        <guid>http://dengyin2000.javaeye.com/blog/151370</guid>
      </item>
      <item>
        <title>帖子在博客和论坛的中浏览次数不一致</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/151360" style="color:red;">http://dengyin2000.javaeye.com/blog/151360</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          请看附件。。。。。。。。。。。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/151360#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Dec 2007 22:50:51 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/151360</link>
        <guid>http://dengyin2000.javaeye.com/blog/151360</guid>
      </item>
      <item>
        <title>在struts2中使用拦截器（Interceptor）控制登录和权限</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/149260" style="color:red;">http://dengyin2000.javaeye.com/blog/149260</a>&nbsp;
          发表时间: 2007年12月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在jsp servlet中我们通常使用Servlet Filter控制用户是否登入， 是否有权限转到某个页面。在struts2中我们应该会想到他的拦截器（Interceptor）， Interceptor在struts2中起着非常重要的作用。 很多struts2中的功能都是使用Interceptor实现的。 <br /><br />需求：简单的登入界面，让用户输入用户名、密码、记住密码（remember me）。 如果用户选中remember me的话， 下次就不需要再登入了（使用cookie实现， 用需要点击logout取消remeber me功能）。 如果用户起始输入的地址不是登入页面的话，在用户登入之后需要转到用户输入的起始地址。<br /><br />我们先看看LoginInterceptor.java<br /><pre name="code" class="java">
package com.javaeye.dengyin2000.wallet.interceptor;

import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.StrutsStatics;

import com.javaeye.dengyin2000.wallet.dao.UserDAO;
import com.javaeye.dengyin2000.wallet.dao.UserNotFoundException;
import com.javaeye.dengyin2000.wallet.domains.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginInterceptor extends AbstractInterceptor {
	public static final String USER_SESSION_KEY="wallet.session.user";
	public static final String COOKIE_REMEMBERME_KEY="wallet.cookie.rememberme";
	public static final String GOING_TO_URL_KEY="GOING_TO";
	
	private UserDAO userDao;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		
		ActionContext actionContext = invocation.getInvocationContext();
		HttpServletRequest request= (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
		
		Map session = actionContext.getSession();
		if (session != null && session.get(USER_SESSION_KEY) != null){
			return invocation.invoke();
		}
		
		Cookie[] cookies = request.getCookies();
		if (cookies!=null) {
			for (Cookie cookie : cookies) {
				if (COOKIE_REMEMBERME_KEY.equals(cookie.getName())) {
					String value = cookie.getValue();
					if (StringUtils.isNotBlank(value)) {
						String[] split = value.split("==");
						String userName = split[0];
						String password = split[1];
						try {
							User user = userDao
									.attemptLogin(userName, password);
							session.put(USER_SESSION_KEY, user);
						} catch (UserNotFoundException e) {
							setGoingToURL(session, invocation);
							return "login";
						}
					} else {
						setGoingToURL(session, invocation);
						return "login";
					}
					return invocation.invoke();
				}
			}
		}
		setGoingToURL(session, invocation);
		return "login";
	}

	private void setGoingToURL(Map session, ActionInvocation invocation){
		String url = "";
		String namespace = invocation.getProxy().getNamespace();
		if (StringUtils.isNotBlank(namespace) && !namespace.equals("/")){
			url = url + namespace;
		}
		String actionName = invocation.getProxy().getActionName();
		if (StringUtils.isNotBlank(actionName)){
			url = url + "/" + actionName + ".action";
		}
		session.put(GOING_TO_URL_KEY, url);
	}
	
	public UserDAO getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDAO userDao) {
		this.userDao = userDao;
	}

}</pre><br /><br />首先判断session中有没有用户信息， 如果有的话继续， 如果没有的话，检查cookie中有没有rememberme的值，如果有的话，用==分割， 取得用户名密码进行登入。如果没有这个用户的话，记录下request的action地址然后转到登入页面。如果验证有这个用户，则继续下面的interceptor。 如果cookie中没有信息的话，则记录request的action地址然后转到登入页面。  以上就是LoginInterceptor的全部代码。<br /><br />下面我们看看struts.xml<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

&lt;struts>
	&lt;package name="default" extends="struts-default">
		&lt;interceptors>
			&lt;interceptor name="loginInterceptor" class="loginInterceptor">&lt;/interceptor>
			&lt;interceptor-stack name="loginDefaultStack">
				&lt;interceptor-ref name="loginInterceptor">&lt;/interceptor-ref>
				&lt;interceptor-ref name="defaultStack">&lt;/interceptor-ref>
			&lt;/interceptor-stack>
		&lt;/interceptors>
		&lt;default-interceptor-ref name="loginDefaultStack">&lt;/default-interceptor-ref>
		&lt;global-results>
			&lt;result name="login" type="redirect">/login.jsp&lt;/result>
		&lt;/global-results>		
		&lt;action name="index" class="indexAction">
			&lt;result>/index.jsp&lt;/result>
		&lt;/action>
		&lt;action name="logout" class="logoutAction">&lt;/action>
		
		&lt;action name="login" class="loginAction" method="login">
			&lt;result type="redirect">${goingToURL}&lt;/result>
			&lt;result name="input">/login.jsp&lt;/result>
			&lt;interceptor-ref name="defaultStack">&lt;/interceptor-ref>
		&lt;/action>
		
		&lt;action name="register" class="registerAction">
			&lt;result type="redirect">/login.jsp&lt;/result>
			&lt;result name="input">/register.jsp&lt;/result>
			&lt;interceptor-ref name="defaultStack">&lt;/interceptor-ref>
		&lt;/action>
	&lt;/package>
&lt;/struts></pre><br /><br />我们是使用的默认的interceptor stack是loginInterceptor， 如果你需要让不登入的用户也能访问的话，你需要配置你的action使用defaultStack。 我们这里的login, register使用的就是defaultStack。 这里要注意的是success的result是我们用LoginInterceptor设过来的值。 这样我们就能够转到用户输入的起始页面。 下面我们再来看看login.jsp 和 loginAction<br /><br /><pre name="code" class="java">&lt;%@taglib prefix="s" uri="/struts-tags" %>
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
&lt;html>
&lt;head>
	&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	&lt;title>Wallet-Login&lt;/title>
&lt;/head>
&lt;body>
&lt;h2>Login&lt;/h2> 
&lt;s:actionmessage/>
&lt;s:actionerror/>
&lt;s:form action="login" method="post" validate="false" theme="xhtml">
&lt;s:textfield name="loginName" label="Username">&lt;/s:textfield>&lt;br/>
&lt;s:password name="password" label="Password">&lt;/s:password>&lt;br/>
&lt;s:checkbox label="Remember Me" name="rememberMe">&lt;/s:checkbox>
&lt;s:submit value="%{'Login'}">&lt;/s:submit> 
&lt;/s:form>
&lt;a href="register.jsp">Register&lt;/a>
&lt;/body>
&lt;/html></pre><br /><br /><pre name="code" class="java">package com.javaeye.dengyin2000.wallet.actions;

import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.interceptor.CookiesAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.javaeye.dengyin2000.wallet.dao.UserDAO;
import com.javaeye.dengyin2000.wallet.dao.UserNotFoundException;
import com.javaeye.dengyin2000.wallet.domains.User;
import com.javaeye.dengyin2000.wallet.interceptor.LoginInterceptor;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware, CookiesAware{

	private UserDAO userDao;
	private String loginName;
	private String password;
	private boolean rememberMe;
	private HttpServletResponse response;
	private HttpServletRequest request;
	private Map session;
	private Map cookies;
	private String goingToURL;
	public String getGoingToURL() {
		return goingToURL;
	}
	public void setGoingToURL(String goingToURL) {
		this.goingToURL = goingToURL;
	}
	public boolean isRememberMe() {
		return rememberMe;
	}
	public void setRememberMe(boolean rememberMe) {
		this.rememberMe = rememberMe;
	}
	public String getLoginName() {
		return loginName;
	}
	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	
	public String login()throws Exception{
		try {
			User user = userDao.attemptLogin(loginName, password);
			if (rememberMe){
				Cookie cookie = new Cookie(LoginInterceptor.COOKIE_REMEMBERME_KEY, user.getLoginName() + "==" + user.getPassword());
				cookie.setMaxAge(60 * 60 * 24 * 14);
				response.addCookie(cookie);
			}
			session.put(LoginInterceptor.USER_SESSION_KEY, user);
			String goingToURL = (String) session.get(LoginInterceptor.GOING_TO_URL_KEY);
			if (StringUtils.isNotBlank(goingToURL)){
				setGoingToURL(goingToURL);
				session.remove(LoginInterceptor.GOING_TO_URL_KEY);
			}else{
				setGoingToURL("index.action");
			}
			return SUCCESS;
		} catch (UserNotFoundException e) {
			addActionMessage("user name or password is not corrected.");
			return INPUT;
		}
	}
	public UserDAO getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDAO userDao) {
		this.userDao = userDao;
	}
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
	public void setSession(Map session) {
		this.session = session;
	}
	public void setCookiesMap(Map cookies) {
		this.cookies = cookies;
	}
}
</pre><br /><br />差不多就是这么多代码了。 最后看看logoutAction<br /><br /><pre name="code" class="java">package com.javaeye.dengyin2000.wallet.actions;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.javaeye.dengyin2000.wallet.interceptor.LoginInterceptor;
import com.opensymphony.xwork2.ActionSupport;

public class LogoutAction extends ActionSupport implements ServletRequestAware , ServletResponseAware{

	private HttpServletRequest request;
	private HttpServletResponse response;

	public String execute() throws Exception{
		HttpSession session = request.getSession(false);
		if (session!=null)
			session.removeAttribute(LoginInterceptor.USER_SESSION_KEY);
		
		Cookie[] cookies = request.getCookies();
		if (cookies!=null) {
			for (Cookie cookie : cookies) {
				if (LoginInterceptor.COOKIE_REMEMBERME_KEY.equals(cookie
						.getName())) {
					cookie.setValue("");
					cookie.setMaxAge(0);
					response.addCookie(cookie);
					return "login";
				}
			}
		}
		return "login";
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

}</pre><br /><br />这里需要注意的是需要把cookie也清理下。 <br /><br />applicationContext-struts.xml<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE beans PUBLIC 
	"-//SPRING//DTD BEAN//EN" 
	"http://www.springframework.org/dtd/spring-beans.dtd">
	
&lt;beans>
	&lt;!-- Example of SAF2 action instantiated by Spring -->
    &lt;!-- bean id="helloWorldAction" class="tutorial.HelloWorldAction" singleton="false" />
     -->
     &lt;bean id="indexAction" class="com.javaeye.dengyin2000.wallet.actions.IndexAction" singleton="false">&lt;/bean>
     &lt;bean id="loginAction" class="com.javaeye.dengyin2000.wallet.actions.LoginAction" singleton="false">
     	&lt;property name="userDao" ref="userDao" />
     &lt;/bean>
     
     &lt;bean id="logoutAction" class="com.javaeye.dengyin2000.wallet.actions.LogoutAction" singleton="false">&lt;/bean>
     
     &lt;bean id="registerAction" class="com.javaeye.dengyin2000.wallet.actions.RegisterAction" singleton="false">&lt;/bean>
     
     &lt;!-- the following is struts2 interceptors -->
     &lt;bean id="loginInterceptor" class="com.javaeye.dengyin2000.wallet.interceptor.LoginInterceptor">
     	&lt;property name="userDao" ref="userDao" />
     &lt;/bean>
     
     &lt;bean id="userDao" class="com.javaeye.dengyin2000.wallet.dao.UserDAOImpl">
     &lt;/bean>
&lt;/beans></pre><br /><br /><br />参考：http://www.vitarara.org/cms/struts_2_cookbook/creating_a_login_interceptor
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/149260#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Dec 2007 22:46:13 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/149260</link>
        <guid>http://dengyin2000.javaeye.com/blog/149260</guid>
      </item>
      <item>
        <title>maven command to create your application</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/143824" style="color:red;">http://dengyin2000.javaeye.com/blog/143824</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="section">
<h3><a name="How_do_I_make_my_first_Maven_project">How do I make my first Maven project?</a> </h3>
<p>We are going to jump headlong into creating your first Maven project! To create our first Maven project we are going to use Maven's archetype mechanism. An archetype is defined as <em>an original pattern or model from which all other things of the same kind are made</em> . In Maven, an archetype is a template of a project which is combined with some user input to produce a working Maven project that has been tailored to the user's requirements. We are going to show you how the archetype mechanism works now, but if you would like to know more about archetypes please refer to our <a href="http://maven.apache.org/guides/introduction/introduction-to-archetypes.html">Introduction to Archetypes</a> .</p>
<p>On to creating your first project! In order to create the simplest of Maven projects, execute the following from the command line:</p>
<div class="source">
<pre>mvn archetype:create \<br />  -DarchetypeGroupId=org.apache.maven.archetypes \<br />  -DgroupId=com.mycompany.app \<br />  -DartifactId=my-app</pre>
</div>
<p>Once you have executed this command, you will notice a few things have happened. First, you will notice that a directory named <tt>my-app</tt>  has been created for the new project, and this directory contains a file named <tt>pom.xml</tt>  that should look like this:</p>
<div class="source">
<pre><project xmlns="http://maven.apache.org/POM/4.0.0"><br />  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br />  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0<br />                      http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;<br />  <modelversion>4.0.0</modelversion><br />  <groupid>com.mycompany.app</groupid><br />  <artifactid>my-app</artifactid><br />  <packaging>jar</packaging><br />  <version>1.0-SNAPSHOT</version><br />  <name>Maven Quick Start Archetype</name><br />  <url>http://maven.apache.org</url><br />  <dependencies><br />    <dependency><br />      <groupid>junit</groupid><br />      <artifactid>junit</artifactid><br />      <version>3.8.1</version><br />      <scope>test</scope><br />    </dependency><br />  </dependencies><br /></project><br /></pre>
</div>
<p><tt>pom.xml</tt> contains the Project Object Model (POM) for this project. The POM is the basic unit of work in Maven. This is important to remember because Maven is inherently project-centric in that everything revolves around the notion of a project. In short, the POM contains every important piece of information about your project and is essentially one-stop-shopping for finding anything related to your project. Understanding the POM is important and new users are encouraged to refer to the <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html">Introduction to the POM</a> .</p>
<p>This is a very simple POM but still displays the key elements every POM contains, so let's walk through each of them to familiarize you with the POM essentials:</p>
<ul>
    <li><strong>project</strong>  This is the top-level element in all Maven pom.xml files.</li>
    <li><strong>modelVersion</strong> This element indicates what version of the object model this POM is using. The version of the model itself changes very infrequently but it is mandatory in order to ensure stability of use if and when the Maven developers deem it necessary to change the model.</li>
    <li><strong>groupId</strong> This element indicates the unique identifier of the organization or group that created the project. The groupId is one of the key identifiers of a project and is typically based on the fully qualified domain name of your organization. For example <tt>org.apache.maven.plugins</tt>  is the designated groupId for all Maven plug-ins.</li>
    <li><strong>artifactId</strong> This element indicates the unique base name of the primary artifact being generated by this project. The primary artifact for a project is typically a JAR file. Secondary artifacts like source bundles also use the artifactId as part of their final name. A typical artifact produced by Maven would have the form <artifactid>-<version>.<extension> (for example, <tt>myapp-1.0.jar</tt> ).</extension></version></artifactid></li>
    <li><strong>packaging</strong> This element indicates the package type to be used by this artifact (e.g. JAR, WAR, EAR, etc.). This not only means if the artifact produced is JAR, WAR, or EAR but can also indicate a specific lifecycle to use as part of the build process. (The lifecycle is a topic we will deal with further on in the guide. For now, just keep in mind that the indicated packaging of a project can play a part in customizing the build lifecycle.) The default value for the <tt>packaging</tt>  element is JAR so you do not have to specify this for most projects.</li>
    <li><strong>version</strong> This element indicates the version of the artifact generated by the project. Maven goes a long way to help you with version management and you will often see the <tt>SNAPSHOT</tt> designator in a version, which indicates that a project is in a state of development. We will discuss the use of snapshots and how they work further on in this guide.</li>
    <li><strong>name</strong>  This element indicates the display name used for the project. This is often used in Maven's generated documentation.</li>
    <li><strong>url</strong>  This element indicates where the project's site can be found. This is often used in Maven's generated documentation.</li>
    <li><strong>description</strong>  This element provides a basic description of your project. This is often used in Maven's generated documentation.</li>
</ul>
<p>For a complete reference of what elements are available for use in the POM please refer to our <a href="http://maven.apache.org/maven-model/maven.html">POM Reference</a> . Now let's get back to the project at hand.</p>
<p>After the archetype generation of your first project you will also notice that the following directory structure has been created:</p>
<div class="source">
<pre>my-app<br />|-- pom.xml<br />`-- src<br />    |-- main<br />    |   `-- java<br />    |       `-- com<br />    |           `-- mycompany<br />    |               `-- app<br />    |                   `-- App.java<br />    `-- test<br />        `-- java<br />            `-- com<br />                `-- mycompany<br />                    `-- app<br />                        `-- AppTest.java<br /></pre>
</div>
<p>As you can see, the project created from the archetype has a POM, a source tree for your application's sources and a source tree for your test sources. This is the standard layout for Maven projects (the application sources reside in <tt>${basedir}/src/main/java</tt>  and test sources reside in <tt>${basedir}/src/test/java</tt> , where ${basedir} represents the directory containing <tt>pom.xml</tt> ).</p>
<p>If you were to create a Maven project by hand this is the directory structure that we recommend using. This is a Maven convention and to learn more about it you can read our <a href="http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html">Introduction to the Standard Directory Layout</a> .</p>
<p>Now that we have a POM, some application sources, and some test sources you are probably asking ...</p>
<br />
<p> </p>
<p><a href="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project" target="_blank">http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_my_first_Maven_project</a></p>
<br />
<p>&nbsp;</p>
如果是建一个web项目的话 需要在命令中加上&nbsp; <br />
<pre><code><strong><strong>-DarchetypeArtifactId=maven-archetype-webapp<br /><br />http://today.java.net/pub/a/today/2007/03/01/building-web-applications-with-maven-2.html</strong></strong></code></pre>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/143824#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 Nov 2007 21:36:52 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/143824</link>
        <guid>http://dengyin2000.javaeye.com/blog/143824</guid>
      </item>
      <item>
        <title>Swiftfox linux下firefox的代替品</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/142499" style="color:red;">http://dengyin2000.javaeye.com/blog/142499</a>&nbsp;
          发表时间: 2007年11月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在我的xubuntu上用firefox简直就是受罪, 打开一个有很多图片的页面时慢得要命,而且在tab切换时就像没有响应一样. 在用google reader时也是难以忍受.&nbsp; swiftfox很早就听说过. 以前在linux中也用过. 感觉速度提高明显.&nbsp;&nbsp; http://getswiftfox.com/<br />
<br />
如果你使用的是debian或者ubuntu的话, 建议你用过aptitude的方式安装. 请看http://getswiftfox.com/debian.htm&nbsp; 这样你的swiftfox能够即使的得到更新. <br />
<br />
安装完swiftfox后,我发现swiftfox能够使用firefox创建的profile. 例如&nbsp; 我的机子上用firefox创建了default 和 debug两个profile. 你可以用下面的命令让swiftfox使用这两个profile. swiftfox -P default -no-remote&nbsp; swiftfox -P debug -no-remote&nbsp; <br />
<br />
<br />
但是swiftfox -ProfileManager并不能打开profile 管理界面. 所以只能用上面的方式建立profile了.
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/142499#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 Nov 2007 10:37:20 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/142499</link>
        <guid>http://dengyin2000.javaeye.com/blog/142499</guid>
      </item>
      <item>
        <title>重新使用xubuntu.</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/142227" style="color:red;">http://dengyin2000.javaeye.com/blog/142227</a>&nbsp;
          发表时间: 2007年11月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以前用过xubuntu, xubuntu以轻量级为目标. 使128M内存也能使用. 是老机子的福音.以前用过一段时间xubuntu,但是是从ubuntu上install xubuntu-desktop. 不知道这样会不会在运行xubuntu的时候会运行ubuntu的一些进程. 感觉并没有多大的速度提高. 而且还需要装vmware运行ie.1G内存感觉非常吃了. 如果运行xubuntu又运行vmware的话 eclipse常常ouf of memory. 前段时间公司又加了1G内存. 所以有了回到xubuntu的想法. <br />
<br />
这次我是直接安装xubuntu的. 从iso来看xubuntu-7.10-desktop-i386.iso 566.4M&nbsp; ubuntu-7.10-desktop-i386.iso 695.8M, 恩不错 xubuntu比ubuntu的光盘就少了130多M. 安装xubuntu和安装ubuntu的方法是一样的. 你需要下载xubuntu的desktop版本. 请参照这篇文章. http://forum.ubuntu.org.cn/viewtopic.php?t=82302<br />
<br />
这篇文章是教从硬盘启动ubuntu的livecd的. 同样适合xubuntu的livecd. 需要改变的是 你需要把c盘的menu.lst中的ubuntu-7.10-desktop-i386.iso 换成 xubuntu-7.10-desktop-i386.iso. 把从网上下载的iso文件放在一个fat23分区. 重启进入grldr就可以进入xubuntu的livecd的, 然后click 桌面的install就行了. 安装的时候最好拔掉网线. 我安装完成大概花了20分钟不到. 安装完之后在改为cn99的源&nbsp; update一下就行了. <br />
<br />
<br />
这里要说我遇到的一个问题. 安装xubuntu后&nbsp; 我发现屏幕非常发白. 就是屏幕太白了. 网上找了很久都没有找到. 以前装ubuntu都没有发现这个问题. 非常气馁&nbsp; 都已经把ubuntu的iso下载下来 准备重装了. 这时想想会不会是显卡驱动的问题. 然后<font color="#ff0000">启动受限驱动(Appliations-&gt;系统--&gt;受限驱动管理器). <font color="#000000">下载了一些驱动看到好像安装了fglrx.安装完了之后需要重启. 可是重启后发现屏幕发白的问题解决了. 但是只能有800*600的分辨率. 换了其他的显示器型号也不行. 晕..&nbsp; 试了很多次. 这里省略大约1000个字(尝试的过程)..<br />
<br />
<br />
.....<br />
......<br />
<br />
<br />
终于发现可以这样解决.&nbsp; 运行 sudo dpkg-reconfigure xserver-xorg&nbsp;&nbsp; 在选择X 服务器驱动时选 </font></font><font size="7" color="#ff0000"><strong>fglrx</strong></font>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/142227#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 Nov 2007 10:17:21 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/142227</link>
        <guid>http://dengyin2000.javaeye.com/blog/142227</guid>
      </item>
      <item>
        <title>阅读Webwork in action.</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/138366" style="color:red;">http://dengyin2000.javaeye.com/blog/138366</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近因为想学structs2，所以有必要读读Webwork in action这本书。这确实是本好书。或者是因为Webwork是如此的优秀。 看得很快，但是获得的东西却不少。 Webwork能把基于action的web 框架做的如果洒脱（全归Interceptor）。 也说明Webwork是非常不错的。 怪不得javaeye也是极力推荐webwork。 我没有使用过基于action的web 框架。 一开始就是使用tapestry，组件式的框架在头脑中已经根深蒂固，Tapestry4也是一个不错的框架。 但是对于新手上手比较慢 加上又附带了难以理解的hivemind，而且好像性能也不算太好，所以对tapestry的推广造成了非常大的麻烦。 虽然最近tapestry正在着力打造tapestry5，我也一直有关注，但是tapestry5进展太慢， 现在也远远达不到应用的条件， 组件库缺乏， DateField才刚刚在5.0.6中加入。 希望Tapestry5能够加快步伐。早点release。 但同时我想我也应该关注Structs2（Webwork）。它确实不错。 随着改名为Structs2。我想会有更多的Structs的人员参与到Structs开发中。 使它有了坚固的后盾，比Tapestry好很多。 <br />
<br />
现在刚刚看完Implementing Webwork action这章。 兄弟们， 我继续。。。。。。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/138366#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Nov 2007 14:38:06 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/138366</link>
        <guid>http://dengyin2000.javaeye.com/blog/138366</guid>
      </item>
      <item>
        <title>好晕。 折腾了半天。</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/134487" style="color:red;">http://dengyin2000.javaeye.com/blog/134487</a>&nbsp;
          发表时间: 2007年10月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天下午。 不知道怎么回事，系统登入后老是又返回到登入界面。 搞了老半天，原来是disable all cookie了（Firefox的firebug）。&nbsp; 晕死。出现类似的情况不只一两次了。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/134487#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Oct 2007 16:45:25 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/134487</link>
        <guid>http://dengyin2000.javaeye.com/blog/134487</guid>
      </item>
      <item>
        <title>The MyGWT Library--Extjs looking widgets, no external JS</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/132893" style="color:red;">http://dengyin2000.javaeye.com/blog/132893</a>&nbsp;
          发表时间: 2007年10月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>MyGWT is an open source Java library for the Google Web Toolkit.    	The library helps developers easily create compelling desktop like AJAX web   	applications.  No messing around with HTML, CSS, or images, all MyGWT widgets   	look great out the box. MyGWT is 100% native, using no external JavaScript code or libraries.    	Taka a look at the <a href="http://mygwt.net/demo" class="dreadon">Explorer Demo</a> to see MyGWT in action.</p>
<p><font color="#ff0000">MyGWT has joined <a href="http://extjs.com/">Ext JS</a></font>. Ext JS is an amazing javascript framework and if you have not seen it you should really take a look. MyGWT can now leverage the Ext user interface. MyGWT is licensed under the Open Source <a href="http://www.gnu.org/licenses/lgpl.html">LGPL 3.0</a> license.</p>
希望这个项目能够结合ExtJs的漂亮和GWT开发的舒适。 让gwt也能有extjs上的那些漂亮好看的widget。<br />
<br />
地址：<a href="http://mygwt.net/">http://mygwt.net/</a><br />
<br />
演示：<a href="http://mygwt.net/demo/index.html">http://mygwt.net/demo/index.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/132893#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 17 Oct 2007 15:46:33 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/132893</link>
        <guid>http://dengyin2000.javaeye.com/blog/132893</guid>
      </item>
      <item>
        <title>使用Terracotta和Tomcat建立ACTIVE-PASSIVE模式的集群。</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/126003" style="color:red;">http://dengyin2000.javaeye.com/blog/126003</a>&nbsp;
          发表时间: 2007年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果大家还没听过Terracotta的话， 请参考http://www.javaeye.com/topic/88466这篇文章了解下使用Terracotta的好处。<br />
<br />
下载地址：http://www.terracotta.org/confluence/display/orgsite/Download<br />
<br />
大家可以通过这个http://www.terracotta.org/confluence/display/docs1/Sessions+Quick+Start知道如果操作Terracotta的tomcat cluster地址。<br />
<br />
演示中运行了一个Terracotta server， 两个Tomcat server[9081, 9082]。 演示中没有使用如果Build Terracotta ACTIVE-PASSIVE （多个Terracotta server 让Terracotta server也能failover）。<br />
<br />
<br />
ok。 我先介绍下我的环境。 我共用了2台pc。&nbsp; 使用的是windows环境。<br />
<br />
pc1&nbsp; ip:192.168.1.119&nbsp; host name:ydeng<br />
pc2&nbsp; ip:192.168.1.104&nbsp; host name:icmwei<br />
<br />
<br />
我会在pc1，pc2 上分别起一个Terracotta server， 和2个tomcat server。 用 %TERRACOTTA_HOME%作为terracotta的安装地址。<br />
<br />
<br />
1. 首先打开%TERRACOTTA_HOME%\samples\tc-config.xml 这个文件。修改后的请看如下：<br />
<br />
<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servers</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">server</span><span>&nbsp;</span><span class="attribute">host</span><span>=</span><span class="attribute-value">&quot;192.168.1.119&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ydeng&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">data</span><span class="tag">&gt;</span><span>data/server-data</span><span class="tag">&lt;/</span><span class="tag-name">data</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">logs</span><span class="tag">&gt;</span><span>logs/server-logs</span><span class="tag">&lt;/</span><span class="tag-name">logs</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">l2-group-port</span><span class="tag">&gt;</span><span>9530</span><span class="tag">&lt;/</span><span class="tag-name">l2-group-port</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">server</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">server</span><span>&nbsp;</span><span class="attribute">host</span><span>=</span><span class="attribute-value">&quot;192.168.1.104&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;icmwei&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">data</span><span class="tag">&gt;</span><span>data/server-data</span><span class="tag">&lt;/</span><span class="tag-name">data</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">logs</span><span class="tag">&gt;</span><span>logs/server-logs</span><span class="tag">&lt;/</span><span class="tag-name">logs</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">l2-group-port</span><span class="tag">&gt;</span><span>9530</span><span class="tag">&lt;/</span><span class="tag-name">l2-group-port</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">server</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ha</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">mode</span><span class="tag">&gt;</span><span>networked-active-passive</span><span class="tag">&lt;/</span><span class="tag-name">mode</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">networked-active-passive</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">election-time</span><span class="tag">&gt;</span><span>5</span><span class="tag">&lt;/</span><span class="tag-name">election-time</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">networked-active-passive</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">ha</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">servers</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
我只列出了 servers 这个节点。你需要在两台机子上都修改。 你可以在%TERRACOTTA_HOME%\samples\这个目录下看到有个start-demo-server.bat bat文件（sh文件for linux）。 这个就是我们用来启动terracotta server的脚本。 启动时他会使用我们修改的tc-config.xml这个文件。 <br />
<br />
2. 修改%TERRACOTTA_HOME%\tools\sessions\configurator-sandbox\tomcat5.5\tc- config.xml这个文件， 其实跟上面的修改是一样的。都是把servers 节点修改成步骤1的样子。 修改如下：<br />
<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>....................&nbsp;&nbsp;省略&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">servers</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">server</span><span>&nbsp;</span><span class="attribute">host</span><span>=</span><span class="attribute-value">&quot;192.168.1.119&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;denny&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">data</span><span class="tag">&gt;</span><span>data/server-data</span><span class="tag">&lt;/</span><span class="tag-name">data</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">logs</span><span class="tag">&gt;</span><span>logs/server-logs</span><span class="tag">&lt;/</span><span class="tag-name">logs</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">l2-group-port</span><span class="tag">&gt;</span><span>9530</span><span class="tag">&lt;/</span><span class="tag-name">l2-group-port</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">server</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">server</span><span>&nbsp;</span><span class="attribute">host</span><span>=</span><span class="attribute-value">&quot;192.168.1.104&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;wenwei&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">data</span><span class="tag">&gt;</span><span>data/server-data</span><span class="tag">&lt;/</span><span class="tag-name">data</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">logs</span><span class="tag">&gt;</span><span>logs/server-logs</span><span class="tag">&lt;/</span><span class="tag-name">logs</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">l2-group-port</span><span class="tag">&gt;</span><span>9530</span><span class="tag">&lt;/</span><span class="tag-name">l2-group-port</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">server</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ha</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">mode</span><span class="tag">&gt;</span><span>networked-active-passive</span><span class="tag">&lt;/</span><span class="tag-name">mode</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">networked-active-passive</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">election-time</span><span class="tag">&gt;</span><span>5</span><span class="tag">&lt;/</span><span class="tag-name">election-time</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">networked-active-passive</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">ha</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servers</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">clients</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">logs</span><span class="tag">&gt;</span><span>logs/client-logs/%(webserver.log.name)</span><span class="tag">&lt;/</span><span class="tag-name">logs</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">modules</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">module</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;clustered-apache-struts-1.1&quot;</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.1.0&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">modules</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">clients</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></li>
</ol>
</div>
<br />
<br />
Ok， 所有的配置都完成了。&nbsp; 让我们分别在两台机子上启动Terracotta server。&nbsp; 运行 %TERRACOTTA_HOME%\samples\start-demo-server.bat。 然后我们再转到%TERRACOTTA_HOME%\tools\sessions\configurator-sandbox\tomcat5.5目 录。运行start.bat 9081 这样我们就启动了目录9081中的tomcat，端口也是9081。 再运行start.bat 9082启动另外一个tomcat实例。 假设现在的active的Terracotta server在ydeng这台机子上。在这台机子上打开Administrator Console。 路径是 开始--》程序--》Terracotta2.4.3--》Administrator Console。 打开之后你会开到如下图所示的界面。 <br />
<br />
<img src="http://dengyin2000.javaeye.com/upload/picture/pic/5445/1c9c90df-84cc-4a39-9859-645a8df6d743.png" height="464" alt="Admin console" width="682" /><br />
<br />
Ok. 这样tomcat cluster就算是跑起来了。 要注意的是Terrcatta sever的active-passive的配置有两种方式。 一种是使用共享目录，另外一种是通过network的方式。&nbsp; 我这里使用的是后者。 各自的优缺点请看文章最后提供的参考资料。 <br />
<br />
最后我们测试下terrcatta server 的failover。 和 failback。&nbsp; 我们ctrol + c掉active的那个terracotta server。 我们再打开icmwei的那台机子的administator conosle。 如下图：<br />
<br />
<img src="http://dengyin2000.javaeye.com/upload/picture/pic/5446/5680ea12-a37a-4b76-9124-91f9776d7e59.png" alt="" /><br />
<br />
<br />
红色应该表示ydeng这台机子上的terracotta server已经down掉了。 而且4个tomcat都已经连到192.168.1.104这个server上了。 他也变成active了（绿色）。&nbsp; 你也可以再试试把ydeng上面的terracotta server再重启。 你会发现ydeng会变成蓝色了。 说明ydeng failback了。<br />
<br />
<br />
<br />
参考：http://www.terracotta.org/confluence/display/docs1/Configuring+a+Terracotta+Server+Cluster<br />
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/126003#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Sep 2007 17:34:07 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/126003</link>
        <guid>http://dengyin2000.javaeye.com/blog/126003</guid>
      </item>
      <item>
        <title>READING GWT IN ACTION</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/124669" style="color:red;">http://dengyin2000.javaeye.com/blog/124669</a>&nbsp;
          发表时间: 2007年09月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          公司即将用gwt重写一个项目。 把GWT IN ACTION从emule download下来。 阅读中。。。。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/124669#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Sep 2007 10:56:25 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/124669</link>
        <guid>http://dengyin2000.javaeye.com/blog/124669</guid>
      </item>
      <item>
        <title>电脑升级小记</title>
        <author>dengyin2000</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyin2000.javaeye.com">dengyin2000</a>&nbsp;
          链接：<a href="http://dengyin2000.javaeye.com/blog/124650" style="color:red;">http://dengyin2000.javaeye.com/blog/124650</a>&nbsp;
          发表时间: 2007年09月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在前几天就在网上看到内存大跌，kingston 1G 667也才买235。 所有有了再买跟1G的内存的想法。 周么来到了太平洋电脑城3楼的电脑（专买电脑配件）。 开始问了几家都说没货。还有真有点担心，不过还好多了了几家没家都报价230，，没有还价的余地。 后来找了一家以227的价钱成交了。&nbsp; 一回到家准备把那1G的内存插上，可死活插不上去。仔细一看插槽根本对不上。 Oh My god。 此时我想到的是可能我的内存插槽可能只支持ddr1代的。第二天我带着一根256M的内存回到电脑城， 果然印证了我说的话， 是DDR1的。然后问DDR1 1G的多少钱。 410，尽然多出了将近200元。 没办法之后换了一个DDR1 512M的。。&nbsp; 210。&nbsp; 唉 没想到尽然想升级1G内存变成升级512M的了。&nbsp; 回家插上内存后 运行良好。
          <br/>
          <span style="color:red;">
            <a href="http://dengyin2000.javaeye.com/blog/124650#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Sep 2007 09:49:44 +0800</pubDate>
        <link>http://dengyin2000.javaeye.com/blog/124650</link>
        <guid>http://dengyin2000.javaeye.com/blog/124650</guid>
      </item>
  </channel>
</rss>