<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>xzcgeorge</title>
    <description></description>
    <link>http://xzcgeorge.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>[zt]自己换机油的一点体会</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/203918" style="color:red;">http://xzcgeorge.javaeye.com/blog/203918</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://web.wenxuecity.com/BBSView.php?SubID=auto_best&MsgID=3139" target="_blank">http://web.wenxuecity.com/BBSView.php?SubID=auto_best&MsgID=3139</a><br /><br />近来我的accord出了点小毛病。右前大灯不亮了。空调不够冷。同时也该换机油了。给dealer打了个电话，换大灯灯泡要25刀。空调还不知道要多少钱。换机油最便宜（用coupon）也要20刀。<br /><br />从小受马克思的教育，感觉资本主义也太宰人了。虽然钱不多，但都是小活，自己未必干不了。于是，决定自己动手，丰衣足食。人争一口气。<br /><br />先是做调查研究。上网找换机油的教程。还真找到了。http://www.ehow.com/how_11_change-motor-oil.html<br />步骤详细清晰，还带视频的。真是再清楚不过了。又听说在保修期内自己换机油可能影响保修，网上又查了一下，结论是只要每次自己换完后做笔记，并保留购物发票，就可以了。<br />关于空调制冷问题，研究结果是，有一种产品叫“Measure&Charge".http://www.id-usa.com/how_to_videos.asp<br />产品象一桶发胶，比发胶大，顶端带管子和一个压力表。只要把它接到车前面的一个空调接口上，就可以补充制冷剂。而售价在20刀左右。如果能够解决问题，可谓物美价廉了。关键是制冷剂有两种，一种是老式的幅凉，对环境有污染，并且现在的价格据说比黄金还贵，另一种是134a。该产品就是补充134a的。现在的问题就是我的车用的是什么制冷剂。在网上查了半天，一无所获。<br /><br />回家后，把accord的用户手册拿了出来，仔细查了一下。明确了一下几项：<br />1. 机油用5W-20.<br /><br />2. 大灯近距灯泡用HB4.<br /><br />3. 制冷剂用的是134a。这一项可是用了我好长时间，终于在最后的基业技术指标细节里找到了（Refregrent Type）。<br /><br />购物。<br /><br />开车到walmart。机油很好找，买了5QT，1.5刀／QT。oil filter，柜台处有一本手册，通过手册很快查到我的车配套的filter的型号，花了大概3.5刀。又买了一个专门接废机油的盆，设计合理方便，花了7.85刀。买了一个用来拧oil filter的扳手，3刀左右。HB4的灯泡很容易找到。一个包装里两个，10.8刀。（单包装的没货，只好留一个下次用了）。补充制冷剂的产品原来有多个品牌。比较了一番还是决定买网上看到的那种，interdynamics。20刀。用完后管子及压力表可以留着，下次再买就只用买refill了。refill柜台里也有卖。还买了一对支架，用千斤顶把车抬起来后，要用这种钢支架把车拖住，为的是稳固，别人在车地下，千斤顶松了，几吨的车压下来可不是好玩的。一对钢支架11刀，可灵活调节高度，比想象的便宜。总共支付约65刀。<br /><br />动手<br />1.用千斤顶把车一边支起来，然后用支架拖住。好用的一个压杆的千斤顶忘在老婆车里了，老婆带孩子出去听故事。只好用车里自带的拧螺栓式的了。一边顶起来后，再把另一边也顶好。千万注意，在此之前要把手刹拉紧。否则一旦前轮架空，车会滑动！我是从错误中学到的。其实在网上的教程里说了，是我给忘了。<br /><br />2.爬到车头下，找到机油排泄出口的螺栓。其实很好找，那附近就那么一个朝斜下方的螺栓，明摆着是方便出机油的。机油过滤器就在螺栓上更高一点的位置。至此一切顺利。把接机油的盆摆好位置，用17号扳子开始拧螺栓。没想到居然这么紧。咱这天天敲键盘的手就是没劲。最后，在强烈的爱国主义的鼓舞下及美国人能干我就能干的坚定信念的激励下，终于把螺栓拧开了。就看见黑色的机油喷薄而出，郁闷之情也就此一泻千里。建议，1.提前热车，热机油流的快；2.准备一把常把的扳子，把的长度与自身肌肉力量成反比。现在可以从车底下爬出来，机油且流呢。<br /><br />3.参照用户手册换大灯灯泡。什么工具都不要，从前车盖一侧把手伸进去，把一个电插头从灯泡后面拔出来，将灯泡按逆时针方向旋转20-30度，灯泡就卸下来了。把新灯泡按顺时针方向拧上，插上插头。一共30秒钟，灯泡就换完了。就这点活，dealer竟向我要25刀。打倒帝国主义！<br /><br />4.进屋喝杯茶。然后看看机油是不是还在滴。不用等它流完，且着呢。用买的oil filter扳子把油滤拧下来，又有一堆机油流下来。接着进屋喝茶。<br /><br />5.一刻钟后，回来，把新的油滤拧上，油滤就像一个大的空心的螺母，车上的接口就是一根5厘米长的螺丝，拧上去就行了。用手尽量拧紧，不要用扳子，会把油滤拧变形的。用手把机油口的螺丝拧上，最后用扳子拧紧。把流到外面的机油擦干净。车底下的活就完了。<br /><br />6.打开发动机上的机油盖子，用漏斗往里加入4.5QT的机油（手册上说了用多少）。盖上盖。把车打着，空调开到最大。<br /><br />7.加制冷剂的口就在前面很靠近车头的位置，在一条管子上，象自行车的打气口一样，用一个塑料盖拧着。拧开，把制冷剂添加剂的管子摇一摇，接上口，按下罐子上的开关，就像喷发胶一样。注意压力表。accord的手册上建议25-27.完后记着把塑料盖拧回去。制冷剂这就补充完了。<br /><br />8.把车熄了。检查机油尺，看机油是否已够量。多不退少补。<br /><br />9.用千斤顶把车顶起来，换下支架。<br /><br />齐活。<br /><br />费时1个半小时，只要是第一次不熟练，再加上千斤顶不顺手。耗资65刀。换了机油，换了大灯灯泡，补充了空调制冷剂。其中30刀为一次性投入工具费用，以后可长期使用；5刀为备用大灯灯泡，留下次使用。实际variable cost仅30刀。<br /><br />关键是，不被剥削的感觉真好啊！ <br /><br />补充<br /><br />0 “千万注意，在此之前要把手刹拉紧。”不够！还要用木块挡住后轮<br />1 旧油滤拧下来，检查橡胶垫圈是否还在上面<br />2 把新的油滤拧上之前，擦干净引擎上与垫圈的接触面<br />3 把新的油滤拧上之前，用新油涂油滤的橡胶垫圈和中间的螺纹<br />4 检查机油尺，车要停在平的地方，换句话说，“用千斤顶把车顶起来，换下支架”之后。
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/203918#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 05:46:19 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/203918</link>
        <guid>http://xzcgeorge.javaeye.com/blog/203918</guid>
      </item>
      <item>
        <title>create your own mail server - james</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/203190" style="color:red;">http://xzcgeorge.javaeye.com/blog/203190</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          telnet 127.0.0.1 4555<br />root/root<br /><br />enter help will show commands.<br /><br /><br /><br />1. Start James server using run.bat. These run scripts can be found in james-2.1.2/bin directory. <br />    When you run the script the output will look like: <br /><br /> Using PHOENIX_HOME: D:\James\james-2.1.2<br /> Using PHOENIX_TMPDIR: D:\James\james-2.1.2\temp<br /> Using JAVA_HOME: c:\programming\java14<br /> <br /> Phoenix 4.0.1<br /> <br /> James 2.1.2<br /> Remote Manager Service started plain: 4555<br /> POP3 Service started plain: 110<br /> SMTP Service started plain: 25<br /> NNTP Service started plain: 119<br /> Fetch POP Disabled<br /> <br />- Now shutdown the server by Ctl-C. A file config.xml gets created <br />   in james-2.1-2/apps/james/SAR-INF. This file can be used to change <br />   the administrator account and the DNS server address. <br />  If you can not use the 25 port of smtp server's default port, change it to:<br />  <br />   &lt;smtpserver enabled="true"><br />      &lt;!-- port 25 is the well-known/IANA registered port for SMTP --><br />      &lt;port>2525&lt;/port>   <br /><br /><br />modify james-2.1-2/apps/james/SAR-INF/config.xml seciton &lt;dnsserver>'s from &lt;authoritative>true&lt;/authoritative> to &lt;authoritative>false&lt;/authoritative><br /><br />   &lt;dnsserver><br />      &lt;servers><br />         &lt;!--Enter ip address of your DNS server, one IP address per server --><br />         &lt;!-- element. --><br />         &lt;!--<br />          &lt;server>127.0.0.1&lt;/server><br />         --><br />      &lt;/servers><br />      &lt;!-- Change autodiscover to false if you would like to turn off autodiscovery --><br />      &lt;!-- and set the DNS servers manually in the &lt;servers> section --><br />      &lt;autodiscover>false&lt;/autodiscover><br />      &lt;authoritative>false&lt;/authoritative><br /><br />      &lt;!-- Maximum number of entries to maintain in the DNS cache --><br />      &lt;maxcachesize>50000&lt;/maxcachesize><br />   &lt;/dnsserver><br /><br /><br /><br />- Create a new user with username 'jmanage-alert'. For this, <br /><br />  1. Start James server (run.bat).<br />  2. telnet to localhost: telnet localhost 4555<br />  3. Login using  username and password  : root/root<br />  4  Enter the command:  addUser jmanage-alert jmanage-alert<br />  5. Enter 'listUsers' command to check that the above user is created.<br />  6. Enter 'quit' command to exit the remote manager.<br /><br /><br />2. test if you can send an email:Send mail to your test user <br /><br /># telnet localhost 2525<br />220 C403193 SMTP Server (JAMES SMTP Server 2.3.0) ready Thu, 15 Feb 2007 11:18:40 -0500 (EST)<br />ehlo &lt;localhost><br />250-C403193 Hello &lt;localhost> (C403193.NCR.PWGSC.GC.CA [10.24.209.212])<br />250-PIPELINING<br />250 ENHANCEDSTATUSCODES<br />mail from:&lt;testuser><br />250 2.1.0 Sender &lt;testuser@localhost> OK<br />rcpt to:&lt;testuser><br />250 2.1.5 Recipient &lt;testuser@localhost> OK<br />data<br />354 Ok Send data ending with &lt;CRLF>.&lt;CRLF><br />2.15 test<br />.<br />250 2.6.0 Message received<br />quit<br />221 2.0.0 C403193 Service closing transmission channel<br /><br /><br />3. check: Have a look at the store to see if your testuser got the message: <br /><br /># cd james-2.3.0/apps/james/var/mail<br /># ls inboxes/testuser<br /># ls inboxes/testuser<br /><br />4D61696C313134303436333937353538352D38.Repository.FileObjectStore<br />4D61696C313134303436333937353538352D38.Repository.FileStreamStore<br /># more inboxes/testuser/4D61696C313134303436333937353538352D38.Repository.FileStreamStore<br />Return-Path: &lt;morgan@yourEmailAddressDomain.com><br />Received: from hostname ([127.0.0.1])<br />          by hostname (JAMES SMTP Server 2.2.0) with SMTP ID 498<br />          for &lt;testuser@JAMESServersConfigSetting.com>;<br />          Mon, 20 Feb 2006 14:32:54 -0500 (EST)<br />subject: test to testuser at JAMESServersConfigSetting.com<br />Date: Mon, 20 Feb 2006 14:32:54 -0500 (EST)<br />From: morgan@yourEmailAddressDomain.com<br />Delivered-To: testuser@JAMESServersConfigSetting.com<br />Content-Transfer-Encoding: 7bit<br />Content-Type: text/plain; charset=us-ascii<br />Mime-Version: 1.0<br />Message-ID: &lt;18306724.1140463975582.JavaMail.root@hostname><br /><br />test<br />#<br /><br /><br />4. download a email client like mozilla's.<br /><br />set up :<br />   4.1 add account:<br />   		account name:  testuser@localhost<br />     	email address:testuser@localhost<br />     <br />	4.2 POP mail server setttings:<br />   			 server name: c403193<br />   			 server port: 110   <br />   <br />    4.3 SMTP setttings:<br />        server name: c403193<br />        port:		2525<br />        user name: testuser<br />        <br />   <br />   you can send email to:<br />   testuser@localhost<br />   testuser@yourMachineName ( such as c403193 )
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/203190#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 05:06:23 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/203190</link>
        <guid>http://xzcgeorge.javaeye.com/blog/203190</guid>
      </item>
      <item>
        <title>setup maven 2</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/203188" style="color:red;">http://xzcgeorge.javaeye.com/blog/203188</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Windows 2000/XP<br /><br />1. Unzip maven-2.0.3-bin.zip to the directory you wish to install Maven 2.0.4. <br /><br />These instructions assume you chose C:\Program Files\Apache Software Foundation\maven-2.0.4<br /><br />2. Add the bin directory to your path, by opening up the system properties (WinKey + Pause), <br />	selecting the "Advanced" tab, and the "Environment Variables" button, then editing the <br />	PATH variable in the user variables. eg. "C:\Program Files\Apache Software Foundation\maven-2.0.3\bin";%PATH%<br /><br />3. In the same dialog, make sure that JAVA_HOME is set to the location of your JDK, eg. C:\Program Files\Java\jdk1.5.0_02<br /><br />4. in the system variables box, make sure that M2_HOME is set to D:\maven2_all\maven-2.0.4<br /><br /><br />5. Run mvn --version to verify that it is correctly installed.<br /><br />6. If you are behind a firewall, then you will have to set up Maven to understand that. To do this, <br />in the &lt;$installedDir>/conf/settings.xml file, add the following content to &lt;proxies> section:<br /><br />		&lt;proxy><br />			&lt;active>true&lt;/active><br />			&lt;protocol>http&lt;/protocol><br />		 	&lt;host>proxy.prv&lt;/host><br />			&lt;port>80&lt;/port><br />			&lt;!--<br />			  	&lt;username>your-username&lt;/username><br />				&lt;password>your-password&lt;/password><br />			-->	<br />			&lt;nonProxyHosts>*.hrdc-drhc.net | 10.* *.prv|proxy.prv:80&lt;/nonProxyHosts><br />			<br />		&lt;/proxy><br />    <br /><br />7. mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app<br /><br /><br />You will get the depencies downloaded and a directory called my-app is created.<br /><br />&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><br />  &lt;modelVersion>4.0.0&lt;/modelVersion><br />  &lt;groupId>com.mycompany.app&lt;/groupId><br />  &lt;artifactId>my-app&lt;/artifactId><br />  &lt;packaging>jar&lt;/packaging><br />  &lt;version>1.0-SNAPSHOT&lt;/version><br />  &lt;name>my-app&lt;/name><br />  &lt;url>http://maven.apache.org&lt;/url><br />  &lt;dependencies><br />    &lt;dependency><br />      &lt;groupId>junit&lt;/groupId><br />      &lt;artifactId>junit&lt;/artifactId><br />      &lt;version>3.8.1&lt;/version><br />      &lt;scope>test&lt;/scope><br />    &lt;/dependency><br />  &lt;/dependencies><br />&lt;/project><br /><br />in my-app directory, the directory structure is:<br />      ---+<br />         +---------src<br />         |           +-------main<br />         |           |		 +------ java<br />         |           |		 <br />         |           +-------test<br />         |            		 +------ java<br />         |           		 <br />         +--------target<br />         |           +-------classes<br />         |<br />         +---------pom.xml<br />  <br />8. Maven automatically generate a helloworld class for you. Compile: change to my-app directory, and issue:  mvn compile<br /><br />9. run the test:  mvn test<br /><br />10 To compile your test sources (but not execute the tests), use the following command:<br />		 mvn test-compile<br /><br /><br />11.  pack it into a jar fiel: mvn package<br />  the file my-app-1.0-SNAPSHOT.jar will be put in the my-app directory.<br />  <br />in the pom.xml, you can see &lt;packaging>jar&lt;/packaging>.<br /><br /><br />12. to install the artifact (the JAR file) you've generated into your local repository. It can<br />then be used by other projects as a dependency. The directory &lt;your-homedirectory>/.<br />m2/repository is the default location of the repository. To install, execute the following command:<br /> mvn install<br /> <br /> <br />13.to create a basic Web site for your project, simply execute the following command:<br /> mvn site<br /><br />The site directory is generated. <br /> <br />To clean: 	mvn clean<br /><br />to generate an IntelliJ IDEA descriptor for the project: mvn idea:idea<br /><br />The my-app.iws, my-app.iml and my-app.? files are generated.<br /><br />This can be run over the top of a previous IDEA project. In this case, it will update the settings rather than starting fresh.<br /><br />To generate an Eclipse descriptor:   mvn eclipse:eclipse <br /><br />the classpath and .project files will be generated in project directory.<br /><br /><br />14. packing resources to a jar file:<br />The rule employed by Maven is that all directories or files placed <br />within the src/main/resources directory are packaged in your JAR with<br />the exact same structure, starting at the base of the JAR.<br /><br />15. To add resources to the classpath for your unit tests, follow the <br />same pattern as you do for adding resources to the JAR, except place <br />resources in the src/test/resources directory.<br /><br /><br />========================================================================================================<br /><br /><br />Chapter 3 Creating Applications with Maven<br /><br /><br />1. To see what happens during the inheritance process you will need to use the handy<br />mvn help:effective-pom command.<br /><br /><br />3.8. Using Profiles<br /><br />You can define profiles in one of the following three places:<br /> The Maven settings file (typically &lt;your -home-directory>/.m2/settings.xml)<br /> A file in the the same directory as the POM, called profiles.xml<br /> The POM itself<br /><br /><br /><br /><br /><br /><br />4. <br /><br />to intall missed artifact manually, do<br /><br />Missing:<br />----------<br />1) javax.activation:activation:jar:1.0.2<br /><br />  Try downloading the file manually from:<br />      http://java.sun.com/products/javabeans/glasgow/jaf.html<br /><br />  Then, install it using the command:<br />      mvn install:install-file -DgroupId=javax.activation -DartifactId=activation -Dversion=1.0.2 -Dpackaging=jar -Dfile=D:\maven2_all\jarsForMaven2\jaf-1.0.2\activation.jar<br /><br />  Path to dependency:<br />        1) org.codehaus.mojo:axistools-maven-plugin:maven-plugin:1.0<br />        2) axis:axis:jar:1.2.1<br />        3) javax.activation:activation:jar:1.0.2<br /><br />2) javax.mail:mail:jar:1.3.2<br /><br />  Try downloading the file manually from:<br />      http://java.sun.com/products/javamail/downloads/index.html<br /><br />  Then, install it using the command:<br />      mvn install:install-file -DgroupId=javax.mail -DartifactId=mail -Dversion=1.3.2 -Dpackaging=jar -Dfile=D:\maven2_all\jarsForMaven2\javamail-1.3.2\mail.jar<br /><br />  Path to dependency:<br />        1) org.codehaus.mojo:axistools-maven-plugin:maven-plugin:1.0<br />        2) axis:axis:jar:1.2.1<br />        3) javax.mail:mail:jar:1.3.2<br /><br /><br />=====================================================================================<br />Chapter 6  reporting<br /><br />to generate report,  add <br />&lt;reporting><br />&lt;plugins><br />&lt;plugin><br />&lt;groupId>org.apache.maven.plugins&lt;/groupId><br />&lt;artifactId>maven-surefire-report-plugin&lt;/artifactId><br />&lt;/plugin><br />&lt;/plugins><br />&lt;/reporting><br /><br />to the pom top level.<br /><br />run : mvn site  <br /> to get site  or mvn surefire-report:report to get only the report.<br /> <br /> <br /> To only show failed:<br /> <br /> &lt;reporting><br />&lt;plugins><br />&lt;plugin><br />&lt;groupId>org.apache.maven.plugins&lt;/groupId><br />&lt;artifactId>maven-surefire-report-plugin&lt;/artifactId><br />&lt;configuration><br />&lt;showSuccess>false&lt;/showSuccess><br />&lt;/configuration><br />&lt;/plugin><br />&lt;/plugins><br />&lt;/reporting>
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/203188#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 03:06:37 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/203188</link>
        <guid>http://xzcgeorge.javaeye.com/blog/203188</guid>
      </item>
      <item>
        <title>Different ways to find hibernate hbm files</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/203186" style="color:red;">http://xzcgeorge.javaeye.com/blog/203186</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><br />        &lt;!--1.    &lt;property name="mappingLocations" value="classpath*:ca/gc/publiservice/jobs/model/*.hbm.xml" /><br />        -->  <br />        &lt;!--2.<br />               &lt;property name="mappingJarLocations"><br />                    &lt;list>&lt;value>WEB-INF/lib/2006_jobsCommons.jar&lt;/value>&lt;/list><br />                &lt;/property><br />        --><br />         &lt;!-- 3. --><br />        &lt;property name="mappingDirectoryLocations" value="classpath:/ca/gc/wco/security/model"/><br /><br />        &lt;!-- 4. &lt;property name="mappingResources">--><br />        &lt;!--&lt;list>--><br />        &lt;!--&lt;value>ca/gc/publiservice/letterBuilder/model/LetterType.hbm.xml&lt;/value>--><br />        &lt;!--&lt;/list>--><br />        &lt;!--&lt;/property>--><br /><br />        &lt;property name="hibernateProperties"><br />            &lt;props><br />                &lt;prop key="hibernate.dialect"><br />                    org.hibernate.dialect.Oracle9Dialect<br />                &lt;/prop><br />                &lt;prop key="hibernate.show_sql">true&lt;/prop><br />                &lt;prop key="hibernate.max_fetch_depth">3&lt;/prop><br />                &lt;prop key="hibernate.cache.use_second_level_cache">true&lt;/prop><br />                &lt;prop key="hibernate.cache.use_query_cache">false&lt;/prop><br />                &lt;prop key="hibernate.cache.provider_class"><br />                    org.hibernate.cache.EhCacheProvider<br />                &lt;/prop><br />            &lt;/props><br />        &lt;/property><br /><br />        &lt;property name="entityCacheStrategies"><br />            &lt;props><br />                &lt;prop key="ca.gc.wco.security.model.Role">nonstrict-read-write&lt;/prop><br />                &lt;prop key="ca.gc.wco.security.model.Resource">nonstrict-read-write&lt;/prop><br />            &lt;/props><br />        &lt;/property><br />        &lt;!--end of cache strategies--><br /><br />        &lt;property name="dataSource"><br />            &lt;ref local="dataSource"/><br />        &lt;/property><br />    &lt;/bean>
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/203186#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 02:22:52 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/203186</link>
        <guid>http://xzcgeorge.javaeye.com/blog/203186</guid>
      </item>
      <item>
        <title>How to setup  a default datasource for spring app?</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/203182" style="color:red;">http://xzcgeorge.javaeye.com/blog/203182</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.    &lt;!-- add those to tmotcat/conf/context.xml:<br />    &lt;..><br />    &lt;Resource name="jdbc/wcosso"<br />            auth="Container"<br />            type="javax.sql.DataSource"<br />            username="webuser"<br />            password="temp1"<br />            driverClassName="oracle.jdbc.driver.OracleDriver"<br />            url="jdbc:oracle:thin:@c403193:1521:c403193"<br />            maxActive="18"<br />            maxIdle="4"/><br /><br />&lt;/Context><br />--><br />2. in spring config xml file:<br /><br />    &lt;bean id="devDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><br />        &lt;property name="jndiName" value="jdbc/wcosso"/><br />        &lt;property name="resourceRef" value="true"/><br />        &lt;property name="lookupOnStartup" value="false"/><br />        &lt;property name="proxyInterface" value="javax.sql.DataSource"/><br />    &lt;/bean><br /><br />    &lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><br />        &lt;property name="jndiName" value="jdbc/wcosso"/><br />        &lt;property name="resourceRef" value="false"/><br />        &lt;property name="defaultObject" ref="devDataSource"/><br />    &lt;/bean><br /><br />In such, you don't need to change the config file to two different stages.
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/203182#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 01:57:41 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/203182</link>
        <guid>http://xzcgeorge.javaeye.com/blog/203182</guid>
      </item>
      <item>
        <title>Digital signature, ws security</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/201062" style="color:red;">http://xzcgeorge.javaeye.com/blog/201062</a>&nbsp;
          发表时间: 2008年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Useful links:<br /><br />1. 使用 WebSphere Studio 构建安全的 Web 服务: 第 1 部分：XML 签名 (You will know how to create keystore db,  ) : http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0403_liu/0403_liu.html<br /><br />2. OASIS Web Services Security: SOAP Message Security 1.0 Standard 200401, March 2004:<br />http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf<br /><br />3. Username Token profile V1.0: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf<br /><br />4. X.509 Token Profile V1.0: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0.pdf <br /><br />5. CXF, Spring and WS-Security putting it all togeather - part 1:<br />http://domagojtechtips.blogspot.com/search/label/cxf<br /><br />You will know:<br />   Pass authentication tokens between services<br />    Encrypt messages or parts of messages<br />    Sign messages<br />    Timestamp messages<br /><br /><br /><strong>Definition:</strong><br /><br />A digital signature scheme typically consists of three algorithms:<br /><br />A key generation algorithm G that randomly produces a "key pair" (PK, SK) for the signer. PK is the verifying key, which is to be public, and SK is the signing key, to be kept private. <br /><br />A signing algorithm S, that on input of a message m and a signing key SK, produces a signature σ. <br /><br />A signature verifying algorithm V, that on input of a message m, a verifying key PK and a signature σ, either accepts or rejects. <br /><br />Two main properties are required. First, signatures computed honestly should always verify. That is, V should accept (m, PK, S (m, SK)) where SK is the secret key related to PK, for any message m. Secondly, it should be hard for any adversary, knowing only PK, to create valid signature(s)<br /><br />Sign:<br />1. Doc -- calc --> Calculated fingerprint(CFP)<br />2. CFP -- SK --> signed FP<br />3.  Signed FP + PK + Certificate(All of the three are called digitally signed document) are sent out.<br /><br />Verify:<br /><br />1. Doc -- calc --> Calculated fingerprint(CFP)<br />2. Signed FP--> PK, Cert --> Original FingerPrint(OFP)<br />3. If CFP == OFP, aceept the doc. Otherwise, discard it.
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/201062#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jun 2008 22:08:18 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/201062</link>
        <guid>http://xzcgeorge.javaeye.com/blog/201062</guid>
      </item>
      <item>
        <title>[zt] 用 BAT 注册 Subversion 服务 </title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/196840" style="color:red;">http://xzcgeorge.javaeye.com/blog/196840</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          zt: http://www.cnblogs.com/zealic/archive/2007/03/10/669849.html<br /><br /><br />用 BAT 注册 Subversion 服务 <br />将 Subversion 安装为服务很麻烦<br /><br />于是就写了个Bat处理文件,简化操作。<br /><br />不想，想实现一个功能的时候，卡壳了。<br /><br />想将一个程序的输出设置到某个变量中，结果弄了半天也无法实现<br /><br />退而求其次之，将文件内容读入变量中，不想也是很复杂，也查到了一些处理方法。<br /><br />不过，这些处理方法太变态了，我吐血三升才看明白大部分代码。<br /><br />如何将文件的内容读入变量，看这里。<br /><br />下面是如何安装 Subversion 为服务的批处理，可以直接拷贝到 Subversion 的主目录中运行，这样你也可以快速安装了。<br /><br />另外:SETX.EXE 可能只在Win2000/Win2003才有。<br /><br /><br />SVN_INSTALL.BAT<br />@ECHO OFF<br />::======================================================================<br />::作者     : Zealic<br />::版本     : 1.05<br />::功能     : 通过简便快捷的方式安装 Subversion.<br />::最后更新 : 2007-12-28<br />::======================================================================<br />::初始化环境<br />::======================================================================<br />SET svn_dir=%cd%<br />ECHO *** 安装 Subversion 服务 ***<br /><br />::======================================================================<br />::======================================================================<br />::创建服务<br />::======================================================================<br />ECHO +++ 创建资源库服务 +++<br />ECHO 创建系统服务，这需要输入一些信息...<br /><br />:INPUT_SVC_NAME<br />SET /P svc_name=请输入服务名     : <br />::服务名不能为空值<br />if "%svc_name%" == "" (<br />  ECHO 服务名不能为空，请重新输入。<br />  GOTO INPUT_SVC_NAME<br />)<br />::查询服务是否存在，通过查找输出是否存在错误，"1060:"是发生错误是时输出的错误代码。<br />SC QUERY "%svc_name%" | find "1060:" >> NUL<br />IF %errorlevel% == 1 (<br />  ECHO 服务 "%svc_name%" 已经存在！请重新输入服务名。<br />  GOTO INPUT_SVC_NAME<br />)<br />ECHO.<br /><br />::输入资源库信息<br />:INPUT_REPOS<br />SET /P    repos=请输入资源库路径 : <br />ECHO.<br /><br />::创建服务<br />ECHO 您使用以下信息创建 Subversion 服务 : <br />ECHO 服务名称   : "%svc_name%"<br />ECHO 资源库路径 : "%repos%"<br />ECHO 正在创建服务...<br />SC create %svc_name% binPath= "\"%svn_dir%\bin\svnserve.exe\" --service -r \"%repos%\"" depend= Tcpip start= auto| find "1060:" >> NUL<br />ECHO.<br />IF %errorlevel% == 0 GOTO SC_ERROR<br />ECHO --- 创建服务成功! ---<br />ECHO.<br />ECHO.<br /><br />::======================================================================<br />::生成操作批处理文件<br />::======================================================================<br />ECHO +++ 生成服务操作批处理 +++<br />ECHO 服务操作批处理文件可以帮助您快速操作服务。<br />SET bat_delete=DELETE_%svc_name%.BAT<br />SET bat_start=START_%svc_name%.BAT<br />SET bat_stop=STOP_%svc_name%.BAT<br />ECHO 生成删除服务批处理 "%bat_delete%" ...<br />::bat_delete<br />ECHO @ECHO OFF> %bat_delete%<br />ECHO NET STOP %svc_name%>> %bat_delete%<br />ECHO SC delete %svc_name%>> %bat_delete%<br />ECHO DEL %bat_start%>> %bat_delete%<br />ECHO DEL %bat_stop%>> %bat_delete%<br />ECHO DEL %bat_delete%>> %bat_delete%<br />ECHO PAUSE>> %bat_delete%<br />::bat_start<br />ECHO 生成运行服务批处理 "%bat_start%" ...<br />ECHO @ECHO OFF> %bat_start%<br />ECHO NET START %svc_name%>> %bat_start%<br />ECHO PAUSE>> %bat_start%<br />::bat_stop<br />ECHO 生成停止服务批处理 "%bat_stop%" ...<br />ECHO @ECHO OFF> %bat_stop%<br />ECHO NET STOP %svc_name%>> %bat_stop%<br />ECHO PAUSE>> %bat_stop%<br />ECHO.<br />ECHO --- 生成服务操作批处理成功! ---<br />ECHO.<br />ECHO.<br /><br />::======================================================================<br />::Finish<br />::======================================================================<br />ECHO ### 所有操作成功! ###<br />GOTO END<br /><br />::======================================================================<br />::错误段<br />::======================================================================<br />:ENV_ERROR<br />ECHO --- 设置环境变量失败! ---<br />GOTO END<br /><br />:SC_ERROR<br />ECHO --- 创建服务失败! ---<br />GOTO END<br /><br />:SC_INV_PORT<br />ECHO 无效的端口号，请重新输入。<br />GOTO INPUT_SVC_PORT<br /><br />:END<br />PAUSE<br /><br /><br /><br />事实证明<br />想写好批处理也不是很简单的。
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/196840#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 08:21:04 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/196840</link>
        <guid>http://xzcgeorge.javaeye.com/blog/196840</guid>
      </item>
      <item>
        <title>zt:create public key, private key and D signature</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/196838" style="color:red;">http://xzcgeorge.javaeye.com/blog/196838</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.ibm.com/developerworks/cn/websphere/techjournal/0606_singh/0606_singh.html" target="_blank">http://www.ibm.com/developerworks/cn/websphere/techjournal/0606_singh/0606_singh.html</a><br /><br /><br />创建本文加密部分中使用的下列密钥存储库。您可以运行文件 createKeysForEncryption.bat 来创建这些密钥存储库，或者如果您不打算创建自己的文件，可以使用下载文件中包含的文件。<br /><br />创建一个密钥存储库来存储 Alice 的私钥：keytool -genkey -v -alias alice -keypass senderkeys -ksenderkeys.jks -storepass<br />	senderkeys -storetype jks -dname "cn=alice,o=IBM,c=US" -keyalg "RSA" <br /><br /><br />将 Alice 的公钥导出到一个名为 alice.cert 的文件中：keytool -export -v -alias alice -file alice.cert -rfc -keystore senderkeys.jks<br />	-storepass senderkeys -storetype jks <br /><br /><br />创建 reckeys.jks 密钥存储库来存储 Bob 的密钥：keytool -genkey -v -alias bob -keypass reckeys -keystore reckeys.jks -storepass<br />	reckeys -storetype jks -dname "cn=bob,o=IBM,c=US" -keyalg "RSA" <br /><br /><br />将 Bob 的公钥导出到一个名为 bob.cert 的文件中：keytool -export -v -alias bob -file bob.cert -rfc -keystore reckeys.jks -storepass<br />	reckeys -storetype jks <br /><br /><br />将 Bob 的公钥导入到 Alice 的密钥存储库中，即 senderkeys.jks：keytool -import -v -noprompt -alias bob -file bob.cert -keystore senderkeys.jks<br />	-storepass senderkeys -storetype jks <br /><br /><br />将 Alice 的公钥导入到 Bob 的密钥存储库中，即 reckeys.jks：keytool -import -v -noprompt -alias alice -file alice.cert -keystore reckeys.jks<br />	-storepass reckeys -storetype jks <br /><br /><br />接下来，创建数字签名所使用的密钥存储库。您可以使用那些与加密中相同的证书。如果您使用相同的证书，那么可以跳过步骤 7-10。您可以运行文件 C:\WSS-ENCAndDigSig\DigSig\createKeysForDigitalSig.bat 来创建下面的密钥：<br /><br />创建一个名为 clientkeys.jks 的密钥存储库来存储客户端的私钥：keytool -genkey -v -alias myclient -keypass password -keystore clientkeys.jks<br />	-storepass password -storetype jks -dname "cn=myclient,o=IBM,c=US" -keyalg "RSA" <br /><br /><br />将客户端的公钥导入到名为 myclient.cert 的文件中：keytool -export -v -alias myclient -file myclient.cert -keystore clientkeys.jks<br />	-storepass password -storetype jks -rfc <br /><br /><br />创建 myservice.jks 密钥存储库来存储服务的密钥：keytool -genkey -v -alias myservice -keypass password -keystore myservice.jks<br />	-storepass password -storetype jks -dname "cn=myservice,o=ibm, c=us" -keyalg "RSA" <br /><br /><br />将服务的公钥导入到名为 myservice.cert 的文件中：keytool -export -v -alias myservice -file myservice.cert -keystore myservice.jks<br />	-storepass password -storetype jks -rfc <br /><br /><br />为服务创建一个信任存储库：keytool -import -v -noprompt -alias myclient -file myclient.cert -keystore<br />	servertrust.jks -storepass servertrust -storetype jks
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/196838#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 04:10:13 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/196838</link>
        <guid>http://xzcgeorge.javaeye.com/blog/196838</guid>
      </item>
      <item>
        <title>spring mail jndi setting</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/196300" style="color:red;">http://xzcgeorge.javaeye.com/blog/196300</a>&nbsp;
          发表时间: 2008年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Step 1: Configure the JavaMailSenderImpl<br />The first step is to setup a MailSender for the PositionManager. To do this, you need to configure a JavaMailSenderImpl with a host or a session. For a host, it's rather simple. Add the following to your applicationContext.xml file: <br /><br />&lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><br />    &lt;property name="host">&lt;value>localhost&lt;/value>&lt;/property><br />    &lt;!-- If you don't want to hardcode "localhost", load it from a mail.properties file<br />         with PropertyPlaceholderConfigurer --><br />&lt;/bean><br /><br /><br />Optionally, you can also configure it with a Session from JNDI when you're running in a servlet container:<br /><br />&lt;bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean"><br />    &lt;property name="jndiName">&lt;value>java:comp/env/mail/Session&lt;/value>&lt;/property><br />&lt;/bean><br />&lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><br />    &lt;property name="session">&lt;ref bean="mailSession"/>&lt;/property><br />&lt;/bean><br />I use the first option for JUnit tests, and the 2nd when running in Tomcat. Thanks to Juergen for showing me how easy the JNDI setup is. ;-)
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/196300#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 24 May 2008 03:08:06 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/196300</link>
        <guid>http://xzcgeorge.javaeye.com/blog/196300</guid>
      </item>
      <item>
        <title>[zt]搭上 WebSphere 快车， 1: RoR on WSAS 6.1</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/195426" style="color:red;">http://xzcgeorge.javaeye.com/blog/195426</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.ibm.com/developerworks/cn/websphere/techjournal/0801_shillington/0801_shillington.html" target="_blank">http://www.ibm.com/developerworks/cn/websphere/techjournal/0801_shillington/0801_shillington.html</a><br /><br />搭上 WebSphere 快车，第 1 部分: 将 Ruby on Rails 与 WebSphere Application Server 结合使用，在保证安全性、可伸缩性和可靠性的情况下进行快速开发  <br /> <br />级别： 中级<br /><br />Ryan Shillington (shillington@us.ibm.com), 软件工程师, IBM<br /><br />2008 年 5 月 15 日<br /><br /> 这篇入门文章将说明如何在 IBM® WebSphere® Application Server V6.1 内部署 Ruby on Rails 应用程序并将其与 WebSphere Application Server 的现有功能进行集成——以及为何希望考虑将二者组合在一起的原因。<br /><br />来自 IBM WebSphere Developer Technical Journal.<br />引言<br /><br />由于采用 Java™ 的 IBM WebSphere Application Server 环境具有出色的可伸缩性、安全性和技术支持，因此很多组织都将其作为标准配置。不过，使用 Java 开发动态的网页经常非常单调乏味，而且极为费时。Ruby on Rails 提供了值得编程社区为之一振的快速开发和测试功能，简化了动态网页的创建工作。<br /><br />本系列包括两个部分，本文是其中的第一部分，将演示如何在 WebSphere Application Server V6.1 内部署 Ruby on Rails 应用程序以及如何将 Ruby on Rails 应用程序与 WebSphere Application Server 的现有功能集成。这样的结合同时具有二者的优点：快速开发和测试，而且同时充分利用在 WebSphere Application Server 中的投资。<br /><br /><br />什么是 Ruby on Rails？<br /><br />Ruby on Rails 有时候很难予以简洁地描述，因为其中包括如此多的东西。Ruby on Rails（以下称为 Rails）是：<br /><br />模型-视图-控制器（Model, View, Controller，MVC）框架，拆分为两个部分：ActionController 用于控制器，而 ActionView 用于模型和视图。 <br />对象关系映射（Object Relational Mapping，ORM）框架，称为 ActiveRecord。 <br />一组命令行工具，用于进行设置目录结构和创建初始生产及测试代码的修改工作。 <br />Rails 的动态性让我们惊叹，它是在不需要严格的构造和类型安全性的编程语言 (Ruby) 的基础上构建的。由于这个原因，从代码行数量而言，其他希望开发人员采用 Java 进行编码的框架很难与 Rails 竞争。使用 Ruby on Rails 的主要优势在于，它的简单简直让人着迷。<br /><br />例如，Ruby 通过解释方式执行，这意味着您可以采用迭代方式工作：编写代码，单击浏览器中的“刷新”按钮查看更改，编写更多的代码，再次刷新，如此往复。通过使用随 Rails 提供的内置 WEBrick Web 服务器，您不需要等待重新部署 WAR 和 EAR 文件。当然，对于长期的 Java 开发，可以设置 WebSphere Application Server 来对特定的 WAR 和 EAR 进行此工作，但对于快速而简单的迭代开发，基本的 WEBrick Web 服务器就可以完成此工作，不会带来额外的设置成本——而且真的相当方便。<br /><br />作为老牌 Java 开发人员，在完成了一些 Rails 教程的学习之后，我很惊讶地发现只需要很少的代码行就可以开发可正常工作的 Web 应用程序，而且不需要进行大量的 XML 配置。事实上，本文依赖于随 Rails 提供的命令行工具来帮助您创建整个示例“愿望列表”应用程序。（其中唯一的例外是迁移中用于创建数据库表的代码，但事实上这也可以通过数据库中的简单 SQL 完成。）<br /><br />本文将指导您在 WebSphere Application Server 中充分利用 Rails 应用程序的功能。如果您有希望迁移到 WebSphere Application Server 上运行的现有 Rails 应用程序，或希望开始使用 Rails 作为现有 Java EE 应用程序的前端，或对使用 Rails 感兴趣，但不确定此新技术是否能集成到您当前的环境中，此信息将为您提供所需的帮助。这里的目标不是简单地提供完成重要任务的步骤，而且还要说明采用此方法的原因以及将 Ruby on Rails 与 WebSphere Application Server 结合使用所带来的价值。<br /><br />先决条件和设置<br /><br />为了按照本文列出的步骤进行操作，您需要安装此软件：<br /><br />IBM WebSphere Application Server V6.1.0.11，安装到 C:\WAS。 <br />Sun™ JRuby 1.0.2，解压到 C:\jruby-1.0.2，并设置以下环境变量： <br />set JAVA_HOME=C:\WAS\java <br />set JRUBY_HOME=C:\jruby-1.0.2 <br />set PATH=%JAVA_HOME%\bin;%JRUBY_HOME%\bin;%PATH% <br /><br />JRuby 的较早版本运行 IBM JDK 时存在问题。 <br />Ruby 提供了一个方便的程序包管理工具，称为 gem，其功能与 Perl 的 CPAN 类似。向您的 Rudy 安装添加库将非常有用，而且可以使用这个方法安装 Rails 和 ActiveRecord-JDBC：<br /><br /><br />清单 1<br />                <br />C:\>gem install rails -y --no-rdoc --no-ri<br />Bulk updating Gem source index for: http://gems.rubyforge.org<br />Successfully installed rails-1.2.5<br />Successfully installed activesupport-1.4.4<br />Successfully installed activerecord-1.15.5<br />Successfully installed actionpack-1.13.5<br />Successfully installed actionmailer-1.3.5<br />Successfully installed actionwebservice-1.2.5<br /><br />C:\projects\wishlist\WEB-INF\gems\specifications><br />gem install activerecord-jdbc-adapter --no-rdoc --no-ri<br />Successfully installed activerecord-jdbc-adapter-0.6 <br /><br /><br />Rails 中包含 ActiveRecord，可支持各种数据库但并不直接支持 JDBC。ActiveRecord-JDBC gem 提供了连接适配器，使 ActiveRecord 看起来似乎直接支持 JDBC。ActiveRecord-JDBC 支持 IBM DB2®、MySQL、Oracle、Microsoft® SQL Server 和其他数据库，但本文示例中使用的是 Derby，这主要是因为此数据库可免费使用，而且可以方便地迁移到 DB2，这在以后需要承担较为繁重的任务时非常方便。<br /><br /><br />Ruby 和 Jruby：有什么区别？<br /><br />JRuby 是原始 Rudy 解释程序（最初使用 C 编写的）的纯 Java 实现，其相对于 Rudy 的主要优势似乎是，您可以在 Java 代码和 Rudy 代码之间进行相互调用。尽管这非常有用，但并不是考虑使用 JRuby 替代 Ruby 的唯一原因。<br /><br />Rudy 的标准 C 实现使用绿色线程，即某个用户长期运行的进程可以阻塞所有其他用户。假定某个用户请求信息量大的报告，需要一分钟才能完成，这将阻塞所有其他用户，而其他用户可能只是尝试查看通常显示所需时间少于一秒钟的网页。尽管这一点可能在发布 Ruby 2.0 时发生变化，但在这种情况下标准 Rudy 实现的所有用户可能会被阻塞长达一分钟，等待这个用户长时间跨度的请求完成。<br /><br />对于 JRuby 并不会这样，因为 JRudy 基于 Java 线程实现 Rudy 线程，而 Java 线程使用的是本机操作系统线程。JRuby 几乎可以随时切换上下文。因此，在处理负载较重的情况下，在 JRudy 上运行的 Rails 应用程序的响应能力通常比使用标准 Ruby 实现时更好。<br /><br /><br />部署 Rails 项目<br /><br />您要进行的第一个大步骤将是，详细了解在 WebSphere Application Server 上部署包含 Rails 项目的 WAR 的基本步骤。在此部分，您将首先部署其中仅包含 Rails 欢迎页面的空白 Rails 应用程序。具体来说，您将设置目录结构、将其打包为 WAR 文件，然后将其部署到正在运行的 WebSphere Application Server 上。<br /><br />创建 Rails 项目 <br /><br />通过 Rails 可以非常方便地设置项目的基本目录结构。运行 rails 命令，以创建所有必要的初始文件：<br /><br />清单 2<br />                            <br />C:\>mkdir projects<br /><br />C:\>cd \projects<br /><br />C:\projects>jruby -S rails wishlist<br />      create<br />      create  app/controllers<br />      create  app/helpers<br />      create  app/models<br />      create  app/views/layouts<br />  &lt;continued...> <br /><br />您可能注意到了，在上面的命令中并不是调用标准 Ruby rails，而是 jruby -S rails。-S 标志告知 JRuby 在 Jruby 的 bin 目录中查找脚本。否则将在用户的当前目录中查找脚本。<br /><br />安装 Goldspike <br /><br />Goldspike 是 Rails 插件，提供充实构建系统所需的任务和模板，以便从新创建的 Rails 项目创建 WAR 文件。Rake 是 Ruby 的构建工具，用于自动执行类似于 shell 的命令，如打包和部署 Ruby 代码以及执行数据库迁移。对于 Java 开发人员，基本上可以将其视为与 Ant 等效的工具；而对于 C/C++ 开发人员，基本上可以将其视为与 make 等效的工具。它和二者都相似，不过 Rake 实际上是 Rudy 代码。对于本文，您只需要了解 Rake 用于创建构建系统即可。<br /><br />运行清单 3 中所示的命令，以安装 Goldspike。<br /><br />清单 3<br />                                <br />C:\projects\wishlist>jruby script\plugin install <br />http://jruby-extras.rubyforge.org/svn/trunk/rails-integration/plugins/goldspike<br />+ ./goldspike/README<br />+ ./goldspike/Rakefile<br />+ ./goldspike/generators/goldspike/goldspike_generator.rb<br />+ ./goldspike/generators/goldspike/templates/war.rb<br />+ ./goldspike/generators/goldspike/templates/web.xml.erb<br />+ ./goldspike/init.rb<br />+ ./goldspike/install.rb<br />+ ./goldspike/lib/create_war.rb<br />+ ./goldspike/lib/java_library.rb<br />+ ./goldspike/lib/packer.rb<br />+ ./goldspike/lib/run.rb<br />+ ./goldspike/lib/util.rb<br />+ ./goldspike/lib/war_config.rb<br />+ ./goldspike/tasks/war.rake<br />+ ./goldspike/test/test_create_war.rb<br />+ ./goldspike/test/test_java_library.rb<br />+ ./goldspike/test/test_maven_library.rb<br />+ ./goldspike/test/war_config_test_config.rb<br />      exists  config<br />      create  config/war.rb<br />      create  WEB-INF<br />      create  WEB-INF/web.xml.erb <br /><br />Goldspike 将在 source 树中创建两个新文件： <br />config/war.rb：通过此文件可以限制将打包在 WAR 文件中的 Jruby、Rails 和其他插件的版本。 <br />WEB-INF/web.xml.erb：这是 WAR 中最终生成的 WEB-INF/web.xml 文件的模板。 <br />创建 lib\java 目录，并将此目录用于存储在 JRudy 代码中将引用的任何 JAR 文件。lib\java 中 JAR 内的任何类都将打包到 Goldspike 所创建的 WAR 中。这些新目录将在首次运行 Rake 任务来创建 WAR 时创建： <br />WEB-INF/classes：Rudy 代码所引用的任何 Java 类都包含在此目录中。 <br />WEB-INF/gems：Goldspike 将自动对安装到此目录中的所有 gems 进行捆绑，以便在 WebSphere Application Server 内提供。 <br />不要在这里添加新 JAR；将自动从 lib\java 复制此类文件。 <br />创建 WAR 文件 <br /><br />为了确保基础结构正常工作，请使用 JRuby 和 Goldspike 创建您的第一个 WAR 文件：<br /><br />清单 4<br />                            <br />C:\projects\wishlist>jruby -S rake war:standalone:create<br />	(in C:/projects/wishlist)<br />	info: Assembling web application<br />	info: Packing needed Java libraries ...<br />	info: Packing needed Ruby gems ...<br />	info:   adding Ruby gem ActiveRecord-JDBC version 0.5<br />	info: Packing needed files ...<br />	info: Creating web archive <br /><br />新创建的 WAR 文件的大小应该略微大于 7 MB。不要看到空的 Rails 项目这么大而感到惊慌：Goldspike 还将 JRuby 和 Rails 打包到了 WAR 文件中。（或者，您可以让 Goldspike 通过 web.xml 将 JRudy 和 Rails 的安装位置告知 WebSphere Application Server，以避免将其包含在这些包中，但这不在本文的讨论范围之内。）<br /><br />部署 WAR 文件 <br /><br />要部署新 WAR：<br /><br />导航到 http://localhost:9060/admin，打开 WebSphere 管理控制台。 <br />在左侧导航菜单中，展开 Applications 并单击 Install New Application。 <br />单击 Browse，以选择最近创建的 WAR 文件：C:\projects\wishlist\wishlist.war（图 1）。 <br /><br />图 1. 准备应用程序安装<br /> <br /><br /><br />将 Context root 设置为 wishlist，然后单击 Next。 <br />在 Deployment 向导中，接受缺省设置，并单击 Next，直到进入步骤 4，然后单击 Finish。 <br />搜索所显示的 Installing... 面板上的消息，确定没有报警和错误，然后单击 Save。 <br />在导航窗格中的 Applications 下选择 Enterprise Applications。 <br />选中 wishlist_war 旁边的复选框，然后单击 Start 按钮。 <br />或者，如果您计划在整个开发周期中进行重新部署，则可以考虑设置一个 Jython wsadmin 脚本。尽管脚本的详细信息不在本文的讨论范围内，但我在下面给出了一个示例。不过，要注意，只需要针对您的环境修改 # Customize these: 注释之后的六行代码。<br /><br />清单 5<br />                                <br />import re<br />import os<br /><br /># Customize these:<br />WAR_FILE = "C:/projects/wishlist/wishlist.war"<br />WAR_NAME = "wishlist_war"<br />WAR_CONTEXT_ROOT = "/wishlist"<br />SERVER_NAME = "server1";<br />NODE_NAME = "rshillington-ltNode01"<br />CELL_NAME = "rshillington-ltNode01Cell"<br /><br /># No need to customize the rest.<br />def log(text):<br />    print "---- " + text;<br /><br />appList = AdminApp.list()<br />log("Apps installed before uninstall: \n" + appList + "\n\n")<br /><br />log("Find the appManager...")<br />appManager = AdminControl.queryNames<br />            ("cell=" + CELL_NAME + ",node=" + NODE_NAME +<br />",type=ApplicationManager,process=" + SERVER_NAME + ",*")<br /><br />containsApp = re.compile("\\b" + WAR_NAME + "\\b", 0).search(appList) != None<br /><br />if containsApp:<br />    log("Stop the application...")<br />    try:<br />        AdminControl.invoke(appManager, "stopApplication", WAR_NAME)<br />    except:<br />        # This is okay - it just wasn't started.<br />        log("\tApplication not started.");<br /><br />    log("Uninstall the application...")<br />    AdminApp.uninstall(WAR_NAME)<br /><br />    log("Save the changes...")<br />    AdminConfig.save()<br /><br /><br />log("Install the application...")<br />AdminApp.install(WAR_FILE, "-appname " + WAR_NAME + " -server " + SERVER_NAME + <br />" -contextroot " + WAR_CONTEXT_ROOT + " -usedefaultbindings")<br />AdminConfig.save()<br /> <br />log("Start the application...")<br />AdminControl.invoke(appManager, "startApplication", WAR_NAME)<br /> <br />log("Save the changes...");<br />AdminConfig.save()<br /><br />appList = AdminApp.list()<br />log("Apps installed after install: \n" + appList + "\n\n") <br /><br /><br />将脚本保存为 deployWishlist.py，并使用 wsadmin 工具运行。您应该看到与下面所示类似的内容：<br /><br />清单 6<br />                                <br />C:\WAS\bin>wsadmin.bat -f c:\moveit\deployWishlist.py <br />-user admin -password &lt;your password><br />WASX7209I: Connected to process "server1" on node rshillington-ltNode01 <br />using SOAP <br />connector;  The type of process is: UnManagedProcess<br />---- Apps installed before uninstall:<br />DefaultApplication<br />ivtApp<br /><br /><br />---- Find the appManager...<br />---- Install the application...<br />WASX7327I: Contents of was.policy file:<br /> //<br />// Template policy file for enterprise application.<br />// Extra permissions can be added if required by the enterprise application.<br />//<br />// NOTE: Syntax errors in the policy files will cause the enterprise <br />//       application FAIL to start. Extreme care should be taken when  <br />//       editing these policy files. It is advised to use the policytool <br />//       editing the policy files provided by the JDK for <br />//       (WAS_HOME/java/jre/bin/policytool).<br /><br />grant codeBase "file:${application}" {<br />};<br /><br />grant codeBase "file:${jars}" {<br />};<br /><br />grant codeBase "file:${connectorComponent}" {<br />};<br /><br />grant codeBase "file:${webComponent}" {<br />};<br /><br />grant codeBase "file:${ejbComponent}" {<br />};<br /><br /><br />ADMA5016I: Installation of wishlist_war started.<br />ADMA5058I: Application and module versions are validated with versions <br />of deployment targets.<br />ADMA5062W: An error occurred while reusing the existing deployment.xml file. <br />The original deployment settings are not reused."<br />ADMA5005I: The application wishlist_war is configured in the WebSphere <br />Application Server repository.<br />ADMA5053I: The library references for the installed optional package <br />are created.<br />ADMA5005I: The application wishlist_war is configured in the WebSphere <br />Application Server repository.<br />ADMA5001I: The application binaries are saved in <br />C:\WAS\profiles\AppSrv01\wstemp\Script116c5288827\workspace\cells\rshillington-<br />ltNode01Cell\applications\wishlist_war.ear\wishlist_war.ear<br />ADMA5005I: The application wishlist_war is configured in the WebSphere <br />Application Server repository.<br />SECJ0400I: Successfuly updated the application wishlist_war with the <br />appContextIDForSecurity information.<br />ADMA5011I: The cleanup of the temp directory for application wishlist_war <br />is complete.<br />ADMA5013I: Application wishlist_war installed successfully.<br />---- Start the application...<br />---- Save the changes...<br />---- Apps installed after install:<br />DefaultApplication<br />ivtApp<br />wishlist_war <br /><br /><br />现在将您的浏览器指向 http://locahost:9080/wishlist。您将看到与图 2 所示类似的网页。 <br /><br />图 2. 初始应用程序欢迎页面<br /> <br /><br />编写“愿望列表”应用程序<br /><br />接下来，您将开发简洁的生日愿望列表应用程序，可以在其中输入想要的礼物的名称，让其他人买来送给您：<br /><br />Rails 需要知道如何连接到数据库。对于本文，您将使用基于文件的 Derby 数据库，其具体路径以硬编码的形式提供。更改 config\database.yml，以包含以下代码：<br /><br />清单 7<br />                        <br />development:<br />  adapter: jdbc<br />  driver: org.apache.derby.jdbc.EmbeddedDriver<br />  url: jdbc:derby:c:\projects\wishlist\db\wishlist_dev;create=true<br /><br />test:<br />  adapter: jdbc<br />  driver: org.apache.derby.jdbc.EmbeddedDriver<br />  url: jdbc:derby:c:\projects\wishlist\db\wishlist_test;create=true<br /><br />production:<br />  adapter: jdbc<br />  driver: org.apache.derby.jdbc.EmbeddedDriver<br />  url: jdbc:derby:c:\projects\wishlist\db\wishlist_prod;create=true<br /> <br /><br />测试和生产部分与开发部分完全相同，不过它们配置为在 URL 中使用数据库 wishlist_test 和 wishlist_prod，而不是 wishlist_dev。测试数据库将用于运行您的测试，以避免影响开发环境。生产环境最好指向承载应用程序的位置。对于本文，生产环境用于将应用程序部署到 WebSphere Application Server。就目前而言，数据库为空也无大碍。Derby URL 上的 create=true 标志告知 Derby，如果目录和数据库不存在，则进行创建。 <br />为了识别 ActiveRecord JDBC，请将清单 8 中的 if RUBY_PLATFORM 块中的前五个语句添加到 environment.rb 中 Rails::Initializer.run 块之前的位置，从而加载 activerecord-jdbc-adapter gem。您的 config\environment.rb 将与以下所示类似：<br /><br />清单 8<br />                        <br /># Be sure to restart your web server when you modify this file.<br /><br /># Uncomment below to force Rails into production mode when<br /># you don't control web/app server and can't set it the proper way<br /># ENV['RAILS_ENV'] ||= 'production'<br /><br /># Specifies gem version of Rails to use when vendor/rails is not present<br />RAILS_GEM_VERSION = '1.2.5' unless defined? RAILS_GEM_VERSION<br /><br /># Bootstrap the Rails environment, frameworks, and default configuration<br />require File.join(File.dirname(__FILE__), 'boot')<br /><br />if RUBY_PLATFORM =~ /java/<br />    require 'rubygems'<br />    gem 'activerecord-jdbc-adapter'<br />    require 'jdbc_adapter'<br />end<br /><br />Rails::Initializer.run do |config|<br />  # Settings in config/environments/* take precedence over those specified here<br />... <br /><br /><br />要在 JRuby 类路径和 WAR 中包括 Derby JDBC JAR，请将其添加到系统 CLASSPATH 中。要将其包括到 WAR 中，请将 derby.jar 复制到 lib\java 中<br /><br />清单 9<br />                        <br />C:\projects\wishlist>cd lib\java<br /><br />C:\projects\wishlist\lib\java>copy C:\WAS\derby\lib\derby.jar derby-10.1.3.jar<br />        1 file(s) copied.<br /><br />C:\projects\wishlist\lib\java>set CLASSPATH=C:\projects\wishlist\lib\java\derby-10.1.3.jar<br />|--10--------20--------30--------40--------50--------60--------70--------80--------9|<br />|-------- XML error:  The previous line is longer than the max of 90 characters ---------|<br /> <br /><br /><br />请特别注意所添加的版本号。Goldspike 仅仅识别 Maven 样式的依赖关系，因此不能识别没有版本号的 JAR 文件。不过，Goldspike 并不会扫描 lib\java 目录并选取其中的所有 JAR 文件，因此您需要将 config\war.rb 修改为与以下所示类似的样子：<br /><br />清单 10<br />                        <br /># Goldspike configuration<br /><br /># Set the version of JRuby and GoldSpike to use:<br />maven_library 'org.jruby', 'jruby-complete', '1.0.2'<br /><br /># Add the Derby library to the WAR<br />include_library 'derby', '10.1.3';<br /><br /># Add the ActiveDirectory-JDBC adapter to the WAR<br />add_gem 'activerecord-jdbc-adapter', '0.6';<br /><br /># Uncomment this to have the war run in the rails 'development' environment <br />(against wishlist_dev) when run in WebSphere<br />#@result.rails_env= 'development'; <br /><br /><br />Goldspike 允许有一系列很大程度上未公开的选项，可以在 vendor\plugins\goldspike\lib\war_config.rb 中找到这些选项。例如，要更改所生成的 WAR 文件的路径和名称，请将以下代码行添加到 config/war.rb 结束的位置：<br /><br />清单 11<br />                        <br />@result.war_file= 'c:/temp/funnyName.war'; <br /><br /><br />运行 Rails 生成的脚本，以创建“愿望列表”编辑器的代码。Rails 提示问题时，请回答 Y（代表是）。<br /><br />清单 12<br />                        <br />C:\projects\wishlist>jruby script\generate controller Editor<br />      exists  app/controllers/<br />      exists  app/helpers/<br />      create  app/views/editor<br />      create  test/functional/<br />      create  app/controllers/editor_controller.rb<br />      create  test/functional/editor_controller_test.rb<br />      create  app/helpers/editor_helper.rb<br /><br />C:\projects\wishlist>jruby script\generate model Wish<br />      exists  app/models/<br />      exists  test/unit/<br />      exists  test/fixtures/<br />      create  app/models/wish.rb<br />      create  test/unit/wish_test.rb<br />      create  test/fixtures/wishes.yml<br />      exists  db/migrate<br />      create  db/migrate/001_create_wishes.rb<br /><br />C:\projects\wishlist>jruby script\generate scaffold Wish Editor<br />      exists  app/controllers/<br />      exists  app/helpers/<br />      exists  app/views/editor<br />      exists  app/views/layouts/<br />      exists  test/functional/<br />  dependency  model<br />      exists    app/models/<br />      exists    test/unit/<br />      exists    test/fixtures/<br />   identical    app/models/wish.rb<br />   identical    test/unit/wish_test.rb<br />   identical    test/fixtures/wishes.yml<br />      create  app/views/editor/_form.rhtml<br />      create  app/views/editor/list.rhtml<br />      create  app/views/editor/show.rhtml<br />      create  app/views/editor/new.rhtml<br />      create  app/views/editor/edit.rhtml<br />overwrite app/controllers/editor_controller.rb? [Ynaqd]<br />       force  app/controllers/editor_controller.rb<br />overwrite test/functional/editor_controller_test.rb? [Ynaqd]<br />       force  test/functional/editor_controller_test.rb<br />   identical  app/helpers/editor_helper.rb<br />      create  app/views/layouts/editor.rhtml<br />      create  public/stylesheets/scaffold.css <br /><br /><br />上面脚本中的第一个命令 jruby script\generate controller Editor 创建将包含编辑器操作的后端代码的控制器。 <br />第二个命令 jruby script\generate model Wish 将创建负责将数据写入数据库的模型。 <br />第三个命令 jruby script\generate scaffold Wish Editor 提供基本列表和针对存储在数据库中的 wish 对象的编辑器控制器操作（创建、编辑和删除）。 <br />迁移是在生成模型期间创建的文件之一，位于 db/migrate/001_create_wishes.rb 中。迁移用于将数据库从其现有状态（在本例中为空白数据库）迁移到新状态（通常包括新表、新列等）。在这里，迁移将用于在数据库中创建表（名为 wishes），用于保存愿望列表中的各个项目。编辑新迁移 db/migrate/001_create_wishes.rb，在其中添加您认为必要的列。无论向 wishes 表添加什么列，都会按照相同的顺序显示在您的应用程序中。<br /><br />清单 13<br />                        <br />class CreateWishes &lt; ActiveRecord::Migration<br />  def self.up<br />    create_table :wishes do |t|<br />        t.column :name,               :string, :limit => 255, :null => false<br />        t.column :url,                :string, :limit => 1024, :null => true<br />    end<br />  end<br /><br />  def self.down<br />    drop_table :wishes<br />  end<br />end <br /><br /><br />运行 rake，以让 Rails 在您的 wishlist_dev 开发数据库中创建表。<br /><br />清单 14<br />                        <br /> C:\projects\wishlist>jruby -S rake db:migrate<br />(in C:/projects/wishlist)<br />== CreateWishesTable: migrating ===============================================<br />-- create_table(:wishes)<br />   -> 0.8440s<br />== CreateWishesTable: migrated (0.8440s) ====================================== <br /><br /><br />对生产数据库进行相同的处理，WebSphere Application Server 将指向此数据库：<br /><br />清单 15<br />                        <br />C:\projects\wishlist>jruby -S rake db:migrate RAILS_ENV=production<br />(in C:/projects/wishlist)<br />== CreateWishes: migrating ====================================================<br />-- create_table(:wishes)<br />   -> 0.1400s<br />== CreateWishes: migrated (0.1400s) =========================================== <br /><br /><br />最后，再次打包 WAR，并确保其中包括 Derby JAR。<br /><br />清单 16<br />                        <br />C:\projects\wishlist>jruby -S rake war:standalone:create<br />(in C:/projects/wishlist)<br />(in C:/projects/wishlist)<br />info: Assembling web application<br />info: Packing needed Java libraries ...<br />info:   adding Java library jruby-complete-1.0.2<br />info:   adding Java library derby-10.1.3<br />info: Packing needed Ruby gems ...<br />info: Packing needed files ...<br />info: Creating web archive <br /><br /><br />从 WebSphere 管理控制台卸载旧 WAR，并重新安装在 C:\projects\wishlist\wishlist.war 中生成的新 WAR（按照与之前相同的目录进行安装）。首次访问 http://localhost:9080/wishlist/editor/ 时，可能收到以下错误：<br /><br />清单 17<br />                        <br />Error 503: The server is currently overloaded, please try again later. <br /><br />这与预期的情况相符。尽管 WebSphere Application Server 认为 WAR 已经启动，但 JRuby 仍然需要时间来启动自己的解释程序，然后再启动 Rails。在您服务器的 SystemOut.log 文件中，最终将看到与以下所示类似的内容：<br /><br />清单 18<br />                        <br />WebApp        A   SRVE0180I: [wishlist.war1165c5b3058#wishlist.war] [/wishlist] <br />[Servlet.LOG]: JRuby init time: 6344ms<br />WebApp        A   SRVE0180I: [wishlist.war1165c5b3058#wishlist.war] [/wishlist] <br />[Servlet.LOG]: Rails init time: 14531ms<br />WebApp        A   SRVE0180I: [wishlist.war1165c5b3058#wishlist.war] [/wishlist] <br />[Servlet.LOG]: Runtime 0 loaded<br />WebApp        A   SRVE0180I: [wishlist.war1165c5b3058#wishlist.war] [/wishlist] <br />[Servlet.LOG]: Requests can now be processed <br /><br /><br />看到最终“现在可以处理请求了(Requests can now be processed)”消息后，就可以开始在您的新“愿望列表”应用程序中添加和编辑愿望了。如果您在 WebSphere Application Server SystemOut.log 中看到与此类似的内容：<br /><br />清单 19<br />                        <br />WebApp        A   SRVE0180I: [wishlist_war#wishlist.war] [/wishlist] [Servlet.LOG]: <br />Failed to load Rails: No such file or directory - C:/WAS/profiles/AppSrv01/C: <br /><br />，则请确保在使用 JRuby 1.0.2 而不是更早的版本。由于在设置 war.rb 文件前创建了初始 WAR 文件，因此请确保 WEB-INF\lib 中唯一以“jruby”开头的文件名为 jruby-complete-1.0.2.jar。如果一切正常，则在转到 http://localhost:9080/wishlist/editor/list 时应该看到与图 3 所示类似的面板。 <br /><br />图 3. “愿望列表”应用程序面板<br /> <br /><br /><br /><br />测试用例<br /><br />如果不能确保质量，快速开发软件能力就没有用。Rails 提供了强大的测试框架，包括自动化单元测试（用于模型）、功能测试用例（用于控制器）和集成测试（跨多个控制器的端到端集成）。Rails 真正强大的地方在于，您可以像编写代码一样快速编写测试。<br /><br />为编辑器控制器生成代码时，会在 test\functional\editor_controller_test.rb 中创建测试。还记得在本练习开始时如何设置三个数据库的情况吗？Rails 框架将复制开发环境中的表结构，并使用 fixture（位于 test\fixtures）中的数据填充这些表。由于前面在迁移中已将数据库中的 Name 列标记为 NOT NULL，因此需要编辑 Rails 在 test\fixtures\wishes.yml 中创建的测试数据，以包括您的愿望名称。您的 wishes.yml fixture 文件可能与以下所示类似：<br /><br /><br />清单 20<br />                <br />first:<br />  id: 1<br />  name: A new bike<br />second:<br />  id: 2<br />  name: A great programming language<br />  url: http://www.rubyonrails.org <br /><br /><br />您还需要在 editor_controller_test.rb 中修改第 55 行 test_create 方法的内容，因为其中尝试不使用名称创建新 wish 对象——这样应该行不通，会导致测试失败。将该行代码改为与以下所示类似的内容：<br /><br /><br />清单 21<br />                <br />post :create, :wish => <br />		{:name => "Gift certificate to my favorite store."} <br /><br /><br />现在测试用例将能够正常地运行：<br /><br /><br />清单 22<br />                <br />C:\projects\wishlist>jruby -S rake<br />(in C:/projects/wishlist)<br />C:/jruby-1.0.2/bin/jruby.bat -Ilib;test <br />"C:/jruby-1.0.2/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" <br />"test/unit/wish_test.rb"<br />Loaded suite C:/jruby-1.0.2/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader<br />Started<br />.<br />Finished in 0.375 seconds.<br /><br />1 tests, 1 assertions, 0 failures, 0 errors<br />C:/jruby-1.0.2/bin/jruby.bat -Ilib;test <br />"C:/jruby-1.0.2/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" <br />"test/functional/editor_controller_test.rb"<br />Loaded suite C:/jruby-1.0.2/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader<br />Started<br />.....DEPRECATION WARNING: paginate is deprecated and will be removed from Rails 2.0 <br />(Pagination is moving to a plugin in Rails 2.0: script/plugin install <br />svn://errtheblog.com/svn/plugins/classic_pagination)  See http://www.rubyonrails.org/<br />deprecation for details. (called from list at C:/projects/wishlist/app/controllers/<br />editor_controller.rb:12)<br />DEPRECATION WARNING: paginate is deprecated and will be removed from Rails 2.0 (Pagination<br />is moving to a plugin in Rails 2.0: script/plugin install svn://errtheblog.com/svn/<br />plugins/classic_pagination)  See http://www.rubyonrails.org/deprecation for details. <br />(called from list at C:/projects/wishlist/app/controllers/editor_controller.rb:12)<br />...<br />Finished in 1.344 seconds.<br /><br />8 tests, 26 assertions, 0 failures, 0 errors<br />C:/jruby-1.0.2/bin/jruby.bat -Ilib;test <br />"C:/jruby-1.0.2/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" <br /><br /> 您所收到的任何弃用警告都是告诉您在 Rails 2.0 发布之后，您的代码将失效。与 Java 不同，Rails 社区删除了以后版本中的已弃用功能。 <br /> <br />既然测试成功，就可以开发 Rails 应用程序了：首先编写测试，然后添加 Ruby 代码让测试用例工作——不用定期将其部署到 WebSphere Application Server。如果您在 Rudy 代码中调用任何 Java 方法，请记住将支持 JAR 添加到系统 CLASSPATH 变量和 lib\java 中。在持续对应用程序进行更改的过程中，您还可以运行 WEBrick 服务器来快速测试您所进行的更改：<br /><br /><br />清单 23<br />                <br />C:\projects\wishlist>jruby script/server<br />=> Booting WEBrick...<br />=> Rails application started on http://0.0.0.0:3000<br />=> Ctrl-C to shutdown server; call with --help for options<br />[2007-11-20 01:05:25] INFO  WEBrick 1.3.1<br />[2007-11-20 01:05:25] INFO  ruby 1.8.5 (2007-11-01) [java]<br />[2007-11-20 01:05:25] INFO  WEBrick::HTTPServer#start: pid=1881829418 port=3000 <br /><br /><br />WEBrick 和 WebSphere Application Server 可以同时运行。它们各自位于侦听不同端口的不同 JVM 中，不应该彼此存在连接。<br /><br /><br /><br /> <br />安全性<br /><br />尽管让公众都能查看您的愿望列表的做法可以接受，但您希望能够控制对其进行编辑的人员。在 Ruby on Rails 的标准 C 版本中，处理用户身份验证有两个方法：通过安装十多个不同的用户身份验证包中的一个，或尝试通过创建用户表（或类似的东西）来创建自己身份验证包。当然，与此相对，WebSphere Application Server 可以处理 LDAP、ActiveDirectory、Kerberos 和很多第三方身份验证提供程序。当然，它还支持标准 Java EE 安全性，因此您可以找到大量相关文档（请参见参考资料）。<br /><br />为了使用 WebSphere Application 安全性限制对您愿望列表的功能访问，请执行以下步骤：<br /><br />创建查看器控制器，该控制器与编辑器平行，用于显示愿望列表，然后将编辑器访问限制为一个特定的用户：<br /><br />清单 24<br />                        <br />C:\projects\wishlist>jruby script\generate controller Viewer<br />      exists  app/controllers/<br />      exists  app/helpers/<br />      create  app/views/viewer<br />      exists  test/functional/<br />      create  app/controllers/viewer_controller.rb<br />      create  test/functional/viewer_controller_test.rb<br />      create  app/helpers/viewer_helper.rb <br /><br /><br />将 EditorController 的代码复制出来作为 ViewerController 唯一的方法。完成此操作后，app\controllers\viewer_controller.rb 应该与以下所示类似：<br /><br />清单 25<br />                        <br />class ViewerController &lt; ApplicationController<br />    def list<br />        @wish_pages, @wishes = paginate :wishes, :per_page => 10<br />    end<br />end <br /><br /><br />在编辑器中，将列出愿望的模板复制到 app\views\viewer\list.rhtml，然后删除 Show、Edit、Destroy 和 New Wish 的链接。这里的目的是为了设置两个独立的控制器，以便演示如何在其中之一上启用 Java EE 安全性。<br /><br />清单 26<br />                        <br />&lt;h1>Listing wishes&lt;/h1><br /><br />&lt;table><br />  &lt;tr><br />  &lt;% for column in Wish.content_columns %><br />    &lt;th>&lt;%= column.human_name %>&lt;/th><br />  &lt;% end %><br />  &lt;/tr><br />  <br />&lt;% for wish in @wishes %><br />  &lt;tr><br />  &lt;% for column in Wish.content_columns %><br />    &lt;td>&lt;%=h wish.send(column.name) %>&lt;/td><br />  &lt;% end %><br />  &lt;/tr><br />&lt;% end %><br />&lt;/table><br /><br />&lt;%= link_to 'Previous page', { :page => @wish_pages.current.previous } <br />if @wish_pages.current.previous %><br />&lt;%= link_to 'Next page', { :page => @wish_pages.current.next } <br />if @wish_pages.current.next %> <br /><br />&lt;br /> <br /><br /><br />在 public\login.html 创建简单的登录页面：<br /><br />清单 27<br />                        <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />        "http://www.w3.org/TR/html4/loose.dtd"><br />&lt;html><br />&lt;head><br />    &lt;title>Login&lt;/title><br />&lt;/head><br />&lt;body><br />&lt;h1>Login&lt;/h1><br />&lt;form action="j_security_check" method="post"><br />    Username: &lt;input type="text" name="j_username">&lt;br><br />    Password: &lt;input type="password" name="j_password">&lt;br><br />    &lt;br><br />    &lt;input type="submit">&lt;br><br />&lt;/form><br />&lt;/body><br />&lt;/html> <br /><br /><br />在 public\login-error.html 创建简单的登录错误页面：<br /><br />清单 28<br />                        <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />        "http://www.w3.org/TR/html4/loose.dtd"><br />&lt;html><br />&lt;head><br />    &lt;title>Login Failed&lt;/title><br />&lt;/head><br />&lt;body><br />&lt;h1>Login Failed.&lt;/h1>&lt;br><br />&lt;br><br />&lt;a href="login.html">Please try again.&lt;/a><br />&lt;/body><br />&lt;/html> <br /><br /><br />为了对编辑器控制下（即位于相对 URL editor/* 下）的所有内容进行限制，请将下面的 security section 部分添加到 web.xml.erb 中。这就是 WebSphere Application Server 所需的全部，可以将 /editor/* 中的所有对象限制为仅供 Administrator 组的用户访问。请记住，Goldspike war:standalone:create Rake 任务将使用 web.xml.erb 作为模板创建 web.xml 文件。下面是在 WEB-INF/web.xml.erb 中添加的 &lt;servlet-mapping> 元素：<br /><br />清单 29<br />                        <br />&lt;security-constraint><br />    &lt;display-name>Editor&lt;/display-name><br />    &lt;web-resource-collection><br />        &lt;web-resource-name>Editor&lt;/web-resource-name><br />        &lt;url-pattern>/editor/*&lt;/url-pattern><br />    &lt;/web-resource-collection><br />    &lt;auth-constraint><br />        &lt;role-name>Administrator&lt;/role-name><br />    &lt;/auth-constraint><br />&lt;/security-constraint><br /><br />&lt;login-config><br />    &lt;auth-method>FORM&lt;/auth-method><br />    &lt;form-login-config><br />        &lt;form-login-page>/login.html&lt;/form-login-page><br />        &lt;form-error-page>/login-error.html&lt;/form-error-page><br />    &lt;/form-login-config><br />&lt;/login-config><br /><br />&lt;security-role><br />    &lt;role-name>Administrator&lt;/role-name><br />&lt;/security-role> <br /><br /><br />最后，您需要在 WebSphere Application Server 中启用应用程序安全性，并将您的用户添加到愿望列表的 Administrator 组： <br />通过 http://localhost:9060/admin 登录到管理控制台。 <br />在左侧的菜单中，展开 Security 并选择 Secure administration, applications, and infrastructure。 <br />选中 Enable application security 复选框，然后单击 Apply。 <br />直接保存到主配置。 <br />在左侧菜单中，展开 Applications 并选择 Enterprise Applications。 <br />选择 wishlist_war。 <br />在 Detail Properties 部分下，选择 Security role to user/group mapping。 <br />单击 Administrator 旁边的复选框，然后单击 Look up users 按钮。 <br />单击 Search。 <br />选择用户，并单击 > >，以将用户移动到 Selected: 列。（如果 Available: 列没有可选用户，则可以通过在左侧菜单中展开 Users and Groups 并选择 Manage Users 来创建新用户。） <br />单击 OK。 <br />重新启动 WebSphere Application Server。（如果应用程序安全性已经启用，则将不需要重新启动 WebSphere Application Server。） <br />重新启动 WebSphere Application Server（如果有必要进行此步骤）后，请在查看器控制台中查看列表操作 (http://localhost:9080/wishlist/viewer/list)。在尝试从编辑器控制器导航到页面时（如 http://localhost:9080/wishlist/editor/），应该会提示出现登录错误。 <br />在以后为其他控制器或特定 URL 添加安全性的操作就像修改 WEB-INF/web.xml.erb 模板一样简单。<br /><br /><br />指定默认用户和组<br /><br />现在，每次卸载和重新安装 WAR 文件时，您需要将用户添加回 WAR 的 Administrator 组。为了避免进行此操作，可以将您的 WAR 文件打包在 EAR 内，并在 EAR 的 META-INF 配置文件内指定缺省组和用户。要完成此任务，请执行以下步骤：<br /><br />在靠近 WEB-INF 的 root rails 目录中创建 META-INF 目录。 <br />在 META-INF 中创建描述 WAR 文件和角色的 application.xml 文件：<br /><br />清单 30<br />                        <br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;application id="Application_ID" version="1.4" <br />xmlns="http://java.sun.com/xml/ns/j2ee" <br />xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br />xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee <br />http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"><br />	&lt;display-name>Wishlist_EAR&lt;/display-name><br />	<br />	&lt;module id="wishlist"><br />		&lt;web><br />			&lt;web-uri>wishlist.war&lt;/web-uri><br />                  &lt;context-root>/wishlist&lt;/context-root><br />		&lt;/web><br />	&lt;/module><br />	<br />	&lt;security-role id="Administrator"><br />		&lt;role-name>Administrator&lt;/role-name><br />	&lt;/security-role><br />&lt;/application> <br /><br /><br />上述文件的目的是为了实现 Web 应用程序的上下文根的自动化，以免手动输入。如果您在使用前面提到的 Jython 脚本，则将需要修改第 40 行的 AdminApp.install 命令，以不再包括上下文根。如果您手动部署，则不需要在初始安装页上键入上下文根。即使对提供默认上下文根不感兴趣，但下面的步骤要正常工作，必须进行此步骤。 <br />在 META-INF 中创建 ibm-application-bnd.xml 文件，此文件详细描述映射到应用程序的 Administrator 组的 WebSphere Application Server 用户和组：<br /><br />清单 31<br />                        <br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;applicationbnd:ApplicationBinding xmi:version="2.0" <br />xmlns:xmi="http://www.omg.org/XMI" <br />xmlns:applicationbnd="applicationbnd.xmi" <br />xmi:id="ApplicationBinding"><br />  &lt;authorizationTable xmi:id="AuthorizationTable"><br />    &lt;authorizations xmi:id="RoleAssignment"><br />      &lt;users xmi:id="admin_user" name="admin"/><br />      &lt;role href="META-INF/application.xml#Administrator"/><br />      &lt;groups xmi:id="Administrators_Group" name="Administrators"/><br />    &lt;/authorizations><br />  &lt;/authorizationTable><br />  &lt;application href="META-INF/application.xml#Application_ID"/><br />&lt;/applicationbnd:ApplicationBinding> <br /><br />users 元素指定将用户“admin”放入此角色。此文件中相关的行是第 4 行、第 5 行和第 6 行的 users、role 和 groups 元素： <br />users 元素指定将用户“admin”放入此角色。 <br />role 元素描述 web.xml 中 users 和 groups 元素引用的角色。 <br />groups 元素指定此角色中将涉及哪些组。 <br />其中可以包含任意多的 users 和 groups 元素，但每个 authorizations 只有一个对应的 role 元素。 <br />创建自定义 Rails 任务，以将 WAR 文件和 META-INF 中的文件打包为 EAR：<br /><br />清单 32<br />                        <br />namespace :ear do<br />    desc 'Create an ear file to wrap the war created by goldspike'<br />    task :create do<br />        unless system("jar -cf wishlist.ear META-INF\* wishlist.war")<br />            raise "Error: failed to create archive, error code #{$?}"<br />        end<br />	  puts "Ear was successfully created."<br />    end<br />end <br /><br />这个最后一步实际上会在命令行执行 jar -cf wishlist.ear META-INF\* wishlist.war。请记住，Rails 任务只是 Rudy 代码；前三行在“ear”命名空间中创建“create”。将任务放入命名空间的唯一目的是为了方便维护。下一行代码指定执行您的 JAR 命令，如果不成功则引发错误。最后，发出了用于向用户提供反馈的语句，告知用户命令成功完成。以下是应有的输出情况：<br /><br />清单 33<br />                        <br />C:\projects\wishlist>jruby -S rake ear:create<br />(in C:/projects/wishlist)<br />Ear was successfully created. <br /><br />其结果是，根 rails 目录现在将包含 wishlist.ear。 <br /><br /><br /> <br /><br />使用数据源<br /><br />到目前为止，此示例依赖于 ActiveRecord-JDBC 创建和管理 JDBC 数据库连接池。在生产系统中，经常最好首选可通过应用服务器的管理控制台控制的 Java EE JNDI 数据源。这样，可以通过应用服务器监视数据库连接，而且不需要开发人员的帮助。<br /><br />ActiveRecord-JDBC 的优势在于，在正确配置的情况下，它将尝试使用 JNDI 数据源（如果能找到），如果找不到，将退而采用传统 JDBC。这样做的目的是为了让您能继续使用 Rake 命令迁移数据库、运行测试等等。<br /><br />要创建新数据源（如果之前未创建），请执行以下操作：<br /><br />登录到 WebSphere Application Server 管理控制台。 <br />选择 Resources => JDBC => Data sources. => New。 <br />给数据源指定一个有意义的名称，如 Derby Wishlist。 <br />JNDI 名称应该与目录路径类似，如 jdbc/wishlist。 <br />假定您使用的是 Derby，请将组件管理身份验证别名和 XA 恢复身份验证别名集保留为 none。 <br />单击 Next。 <br />选择 Select an existing JDBC provider 单选按钮，然后从下拉列表中选择 Derby JDBC Provider。 <br />单击 Next。 <br />将数据库名称设置为 Derby 数据库在文件系统中驻留的目录路径，例如：C:\projects\wishlist\db\wishlist_prod。（如果您的数据库在此步骤之前不存在，请确保将 create=true 追加到命令末尾。） <br />依次单击 Next、Finish 和 Save。 <br />您现在已经有了指向 wishlist_prod 数据库的数据源，而且拥有了名为 jdbc/wishlist 的 JNDI。修改 config/database.yml，以添加 JNDI 名称，并将实际数据库 URL 参数注释掉：<br /><br />清单 34<br />                        <br />  adapter: jdbc<br />  driver: org.apache.derby.jdbc.EmbeddedDriver<br />  jndi: jdbc/wishlist<br />#  url: jdbc:derby:c:/projects/wishlist/db/wishlist_prod;create=true <br /><br />正如前面提到的，test 和 db:migrate Rake 任务并不会使用已经注释掉的 JDBC URL 属性工作。您仅仅注释掉了用于指定所使用的数据源的 url 行。确定应用服务器在使用 JNDI 名称查找数据源后，将再次取消注释 URL 属性。 <br />重新部署“愿望列表”应用程序。这一次，在编辑器控制器之后，您应该看到在 WebSphere Application Server SystemOut.log 中与以下所示类似的内容：<br /><br />清单 35<br />                        <br />InternalGener I   DSRA8203I: Database product name : Apache Derby<br />InternalGener I   DSRA8204I: Database product version : 10.1.3.2<br />InternalGener I   DSRA8205I: JDBC driver name  : Apache Derby Embedded JDBC Driver<br />InternalGener I   DSRA8206I: JDBC driver version  : 10.1.3.2 <br /><br /><br />要使用 Rails Rake 命令行任务执行进一步的迁移，请执行以下步骤：<br /><br />在 config\database.yml 中取消注释 URL。 <br />停止 WebSphere Application Server，因为其中包含对数据库的锁定。 <br />运行 jruby -S rake db:migrate RAILS_ENV=production，验证您的数据库处于最新状态。 <br />在从命令行运行 Rake 或脚本时，您可能会看到与以下所示类似的警告：<br /><br /><br />清单 36<br />                <br />JNDI data source unavailable: javax.naming.NoInitialContextException: Need to specify <br />class name in environment or system property, or as an applet parameter, or in an <br />application resource file:  java.naming.factory.initial; trying straight JDBC <br /><br /><br />这是正常的，也是预期的情况。Rails 警告您无法查找 JNDI 信息，将按照预期的方式返回采用 JDBC 的方式。<br /><br /><br /><br /> 结束语<br /><br />无论其特性和功能如何先进，新编程语言总是需要一定的时间才能成熟。就其本质而言，企业应用程序需要一系列相对较为普通的要素：最好的安全性、强大的管理界面以及由 IT 人员（非程序员）在运行时进行维护的能力，诸如此类。通过将 WebSphere Application Server 的成熟和 Ruby on Rails 的快速开发能力结合，您可以同时获得二者的竞争优势。<br /><br />本文是在 WebSphere Application Server 上开发 Rails 应用程序的入门篇。第 2 部分将介绍如何将现有自定义 Java API 和 EJB 组件与 Rails 一起使用，WebSphere Application Server 上的 Rails 是否可以用于创建 SOAP 和 REST Web 服务，在 Ruby/JRuby 上运行的 Rails 和常规 Java Servlet 及 JSP 在性能和内存使用率方面有何差异，等等。<br /><br /> 分享这篇文章……<br /><br />  <br />  提交到 Digg  <br />  <br />  发布到 del.icio.us  <br />  <br />  Slashdot 一下!  <br />  <br /><br /> <br /> <br />IBM WebSphere Application Server V6.1 Security Handbook（第 8 章）<br /><br /><br />IBM developerWorks WebSphere <br /><br /><br />IBM WebSphere Application Server 信息中心
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/195426#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 21:20:06 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/195426</link>
        <guid>http://xzcgeorge.javaeye.com/blog/195426</guid>
      </item>
      <item>
        <title>create your own component-v1.0</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/192762" style="color:red;">http://xzcgeorge.javaeye.com/blog/192762</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. in a jsp file use your component:<br /><br />&lt;p><br />&lt;ww:component template="datefield.vm"><br />&lt;ww:param name="label" value="'Date'" /><br />&lt;ww:param name="name" value="'mydatefield'" /><br />&lt;ww:param name="size" value="3" /><br />&lt;/ww:component><br />&lt;/p><br /><br /><br /><br />2. create your component vm file datefield.vm in src/template/xhtml:<br /><br /><br />#set ($name = $parameters.get('name'))<br />#set ($size = $parameters.get('size'))<br />#set ($yearSize = $size * 2)<br />$parameters.get("label"):<br />&lt;input type="text" name="${name}.day" size="$size" /> /<br />&lt;input type="text" name="${name}.month" size="$size" /> /<br />&lt;input type="text" name="${name}.year" size="$yearSize" /> (dd/mm/yyyy)<br /><br />3. you will get:<br /><br /><pre name="code" class="java">
&lt;p>
Date:
&lt;input name="mydatefield.day" size="3" type="text"> /
&lt;input name="mydatefield.month" size="3" type="text"> /
&lt;input name="mydatefield.year" size="6" type="text"> (dd/mm/yyyy)
&lt;/p>
</pre><br /><br />4. pay attention to:<br />1. pass  string, quote it with ';
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/192762#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 May 2008 23:41:17 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/192762</link>
        <guid>http://xzcgeorge.javaeye.com/blog/192762</guid>
      </item>
      <item>
        <title>[zt]Log4J实践</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/191288" style="color:red;">http://xzcgeorge.javaeye.com/blog/191288</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Azi: http://azi.javaeye.com/blog/189764<br /><br /><br />下面给出得Log4J配置文件实现了输出到控制台，文件，回滚文件，发送日志邮件，输出到数据库日志表，自定义标签等全套功能。<br /><br />log4j.rootLogger=DEBUG,CONSOLE,A1,im<br />#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE<br /><br />log4j.addivity.org.apache=true<br /><br /><br />###################<br /># Console Appender<br />###################<br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender<br />log4j.appender.Threshold=DEBUG<br />log4j.appender.CONSOLE.Target=System.out<br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n<br /><br /><br />#####################<br /># File Appender<br />#####################<br />log4j.appender.FILE=org.apache.log4j.FileAppender<br />log4j.appender.FILE.File=file.log<br />log4j.appender.FILE.Append=false<br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /># Use this layout for LogFactor 5 analysis<br /><br /> <br /><br />########################<br /># Rolling File<br />########################<br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.ROLLING_FILE.Threshold=ERROR<br />log4j.appender.ROLLING_FILE.File=rolling.log<br />log4j.appender.ROLLING_FILE.Append=true<br />log4j.appender.ROLLING_FILE.MaxFileSize=10KB<br />log4j.appender.ROLLING_FILE.MaxBackupIndex=1<br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /><br /><br />####################<br /># Socket Appender<br />####################<br />log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender<br />log4j.appender.SOCKET.RemoteHost=localhost<br />log4j.appender.SOCKET.Port=5001<br />log4j.appender.SOCKET.LocationInfo=true<br /># Set up for Log Facter 5<br />log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout<br />log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n<br /><br /><br />########################<br /># Log Factor 5 Appender<br />########################<br />log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender<br />log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000<br /><br /><br />########################<br /># SMTP Appender<br />#######################<br />log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender<br />log4j.appender.MAIL.Threshold=FATAL<br />log4j.appender.MAIL.BufferSize=10<br />log4j.appender.MAIL.From=xxx@xxx.com<br />log4j.appender.MAIL.SMTPHost=mail.hollycrm.com<br />log4j.appender.MAIL.Subject=Log4J Message<br />log4j.appender.MAIL.To=xxx@xxx.com<br />log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout<br />log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /><br /><br />########################<br /># JDBC Appender<br />#######################<br />log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender<br />log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test<br />log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver<br />log4j.appender.DATABASE.user=root<br />log4j.appender.DATABASE.password=<br />log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')<br />log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /><br /><br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A1.File=SampleMessages.log4j<br />log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'<br />log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout<br /><br />###################<br />#自定义Appender<br />###################<br />log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender<br /><br />log4j.appender.im.host = mail.cybercorlin.net<br />log4j.appender.im.username = username<br />log4j.appender.im.password = password<br />log4j.appender.im.recipient = xxxx@xxx.com<br /><br />log4j.appender.im.layout=org.apache.log4j.PatternLayout<br />log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/191288#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 08:15:59 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/191288</link>
        <guid>http://xzcgeorge.javaeye.com/blog/191288</guid>
      </item>
      <item>
        <title>Put objects into servlet context(applicationLevel)</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/189008" style="color:red;">http://xzcgeorge.javaeye.com/blog/189008</a>&nbsp;
          发表时间: 2008年05月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. create a bean to implements the ServletContextAware, and spring will automatically set the servletContext:<br /><br />public class ApplicationScopeObjectSettings implements ServletContextAware {<br />    ServletContext servletContext;<br /><br />    public void setServletContext(ServletContext servletContext) {<br />        this.servletContext = servletContext;<br />        servletContext.setAttribute("appScope", "appScope" + (new java.util.Date()));<br /><br />    }<br />}<br /><br /><br />2. in xml file:<br />&lt;bean id="ApplicationScopeObjectSettings" class="ApplicationScopeObjectSettings"/> <br /><br />3. Then you can access the appScope in application scope in your jsp<br />page.
          <br/>
          <span style="color:red;">
            <a href="http://xzcgeorge.javaeye.com/blog/189008#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 03 May 2008 03:57:43 +0800</pubDate>
        <link>http://xzcgeorge.javaeye.com/blog/189008</link>
        <guid>http://xzcgeorge.javaeye.com/blog/189008</guid>
      </item>
      <item>
        <title>[zt] Pathway from ACEGI to Spring Security 2.0</title>
        <author>xzcgeorge</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xzcgeorge.javaeye.com">xzcgeorge</a>&nbsp;
          链接：<a href="http://xzcgeorge.javaeye.com/blog/188605" style="color:red;">http://xzcgeorge.javaeye.com/blog/188605</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Source URL: http://java.dzone.com/tips/pathway-acegi-spring-security- <br /><br /><br />Published on Javalobby (<a href="http://java.dzone.com">http://java.dzone.com</a>)</p>
<p>Pathway from ACEGI to Spring Security 2.0</p>
<p>By Chris.Baker</p>
<p>Created 2008/04/22 - 9:44am</p>
<p>&nbsp;</p>
<p>Formerly called ACEGI Security for Spring, the re-branded Spring Security 2.0 has delivered on its promises of making it simpler to use and improving developer productivity. Already considered as the Java platform's most widely used enterprise security framework [1] with over 250,000 downloads from SourceForge, Spring Security 2.0 provides a host of new features.This article outlines how to convert your existing ACEGI based Spring application to use Spring Security 2.0.</p>
<p>What is Spring Security 2.0</p>
<p>Spring Security 2.0 [2] has recently been released as a replacement to ACEGI and it provides a host of new security features:</p>
<p>Substantially simplified configuration.</p>
<p>OpenID integration, single sign on standard.</p>
<p>Windows NTLM support, single sign on against Windows corporate networks.</p>
<p>Support for JSR 250 ("EJB 3") security annotations.</p>
<p>AspectJ pointcut expression language support.</p>
<p>Comprehensive support for RESTful web request authorization.</p>
<p>Long-requested support for groups, hierarchical roles and a user management API.</p>
<p>An improved, database-backed "remember me" implementation.</p>
<p>New support for web state and flow transition authorization through the Spring Web Flow 2.0 release.</p>
<p>Enhanced WSS (formerly WS-Security) support through the Spring Web Services 1.5 release.</p>
<p>A whole lot more...</p>
<p>&nbsp;</p>
<p>Goal</p>
<p>Currently I work on a Spring web application that uses ACEGI to control access to the secure resources. Users are stored in a database and as such we have configured ACEGI to use a JDBC based UserDetails Service. Likewise, all of our web resources are stored in the database and ACEGI is configure to use a custom AbstractFilterInvocationDefinitionSource to check authorization details for each request.<br />With the release of Spring Security 2.0 I would like to see if I can replace ACEGI and keep the current ability to use the database as our source of authentication and authorization instead of the XML configuration files (as most examples demonstrate).</p>
<p>Here are the steps that I took... </p>
<p>Steps </p>
<p>The first (and trickiest) step was to download [3] the new Spring Security 2.0 Framework and make sure that the jar files are deployed to the correct location. (/WEB-INF/lib/)<br />There are 22 jar files that come with the Spring Security 2.0 download. I did not need to use all of them (especially not the *sources packages). For this exercise I only had to include:<br />spring-security-acl-2.0.0.jar</p>
<p>&nbsp;</p>
<p>spring-security-core-2.0.0.jar</p>
<p>&nbsp;</p>
<p>spring-security-core-tiger-2.0.0.jar</p>
<p>&nbsp;</p>
<p>spring-security-taglibs-2.0.0.jar</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Configure a DelegatingFilterProxy in the web.xml file.</p>
<p>&nbsp;springSecurityFilterChain<br />&nbsp;org.springframework.web.filter.DelegatingFilterProxy</p>
<p><br />&nbsp;springSecurityFilterChain<br />&nbsp;/*</p>
<p>&nbsp;</p>
<p><br />Configuration of Spring Security 2.0 is far more concise than ACEGI, so instead of changing my current ACEGI based configuration file, I found it easier to start from a empty file. If you do want to change your existing configuration file, I am sure that you will be deleting more lines than adding.</p>
<p>The first part of the configuration is to specifiy the details for the secure resource filter, this is to allow secure resources to be read from the database and not from the actual configuration file. This is an example of what you will see in most of the examples:</p>
<p>&nbsp;<br />&nbsp;<br />&nbsp;</p>
<p><br />Replace this with:</p>
<p>&nbsp;</p>
<p>&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;</p>
<p>&nbsp;</p>
<p><br />&nbsp;<br />&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;</p>
<p><br />The main part of this piece of configuration is the secureResourceFilter, this is a class that implements FilterInvocationDefinitionSource and is called when Spring Security needs to check the Authorities for a requested page.<br />Here is the code for MySecureResourceFilter:<br />package org.security.SecureFilter;</p>
<p>import java.util.Collection;<br />import java.util.List;</p>
<p>import org.springframework.security.ConfigAttributeDefinition;<br />import org.springframework.security.ConfigAttributeEditor;<br />import org.springframework.security.intercept.web.FilterInvocation;<br />import org.springframework.security.intercept.web.FilterInvocationDefinitionSource;</p>
<p><br />public class MySecureResourceFilter implements FilterInvocationDefinitionSource {</p>
<p>&nbsp;public ConfigAttributeDefinition getAttributes(Object filter) throws IllegalArgumentException {<br />&nbsp;<br />&nbsp;FilterInvocation filterInvocation = (FilterInvocation) filter;<br />&nbsp;<br />&nbsp;String url = filterInvocation.getRequestUrl();<br />&nbsp;<br />&nbsp;// create a resource object that represents this Url object<br />&nbsp;Resource resource = new Resource(url);<br />&nbsp;<br />&nbsp;if (resource == null) return null;<br />&nbsp;else{<br />&nbsp;ConfigAttributeEditor configAttrEditor = new ConfigAttributeEditor();<br />&nbsp;// get the Roles that can access this Url<br />&nbsp;List roles = resource.getRoles();<br />&nbsp;StringBuffer rolesList = new StringBuffer();<br />&nbsp;for (Role role : roles){<br />&nbsp;rolesList.append(role.getName());<br />&nbsp;rolesList.append(",");<br />&nbsp;}<br />&nbsp;// don't want to end with a "," so remove the last ","<br />&nbsp;if (rolesList.length() &gt; 0)<br />&nbsp;rolesList.replace(rolesList.length()-1, rolesList.length()+1, "");<br />&nbsp;configAttrEditor.setAsText(rolesList.toString());<br />&nbsp;return (ConfigAttributeDefinition) configAttrEditor.getValue();<br />&nbsp;} <br />&nbsp;}</p>
<p>&nbsp;public Collection getConfigAttributeDefinitions() {<br />&nbsp;return null;<br />&nbsp;}</p>
<p>&nbsp;public boolean supports(Class arg0) {<br />&nbsp;return true;<br />&nbsp;}</p>
<p>}</p>
<p>This getAttributes() method above essentially returns the name of Authorities (which I call Roles) that are allowed access to the current Url. </p>
<p>OK, so now we have setup the database based resources and now the next step is to get Spring Security to read the user details from the database. The examples that come with Spring Security 2.0 shows you how to keep a list of users and authorities in the configuration file like this:</p>
<p>&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;</p>
<p><br />You could replace these examples with this configuration so that you can read the user details straight from the database like this:</p>
<p>&nbsp;</p>
<p><br />While this is a very fast and easy way to configure database based security it does mean that you have to conform to a default databases schema. By default, the requires the following tables: user, authorities, groups, group_members and group_authorities.<br />In my case this was not going to work as my security schema it not the same as what the requires, so I was forced to change the :</p>
<p>&nbsp;<br />&nbsp;users-by-username-query="SELECT U.username, U.password, U.accountEnabled AS 'enabled' FROM User U where U.username=?"<br />&nbsp;authorities-by-username-query="SELECT U.username, R.name as 'authority' FROM User U JOIN Authority A ON u.id = A.userId JOIN Role R ON R.id = A.roleId WHERE U.username=?"/&gt;</p>
<p><br />By adding the users-by-username-query and authorities-by-username-query properties you are able to override the default SQL statements with your own. As in ACEGI security you must make sure that the columns that your SQL statement returns is the same as what Spring Security expects. There is a another property group-authorities-by-username-query which I am not using and have therefore left it out of this example, but it works in exactly the same manner as the other two SQL statements.</p>
<p>This feature of the has only been included in the past month or so and was not available in the pre-release versions of Spring Security. Luckily it has been added as it does make life a lot easier. You can read about this here [4] and here [5].</p>
<p>The dataSource bean instructs which database to connect to, it is not included in my configuration file as it's not specific to security. Here is an example of a dataSource bean for those who are not sure:<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;</p>
<p>&nbsp;</p>
<p>And that is all for the configuration of Spring Security. My last task was to change my current logon screen. In ACEGI you could create your own logon by making sure that you POSTED the correctly named HTML input elements to the correct URL. While you can still do this in Spring Security 2.0, some of the names have changed.<br />You can still call your username field j_username and 