<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Jacally</title>
    <description>热爱Java、支持开源，相信共享才能共赢！</description>
    <link>http://lib.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>Flex 开发学习笔记6.2 - 引用自定义的 Flex Library Project</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/209792" style="color:red;">http://lib.javaeye.com/blog/209792</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          创建一个新的Flex Project工程:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16955/82d5b2af-0ba5-395d-816c-a6b228638c83.jpg" /><br /><br />点击下一步<br /><img src="http://lib.javaeye.com/upload/picture/pic/16969/23f2eea9-17dd-3ca5-9612-2ae8c7905ab5.jpg" /><br /><br />点击完成创建工程以后,将上一节创建的<a href="http://lib.javaeye.com/blog/209774" target="_blank">MyFlexLib工程</a>打开,复制bin目录下的MyFlexLib.swc到本工程的libs目录下:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16967/b8f02da2-e7a5-3f05-8852-0e54cff92d38.jpg" /><br /><br />修改本工程中的mxml文件,来引用自定义的组件,本例中修改的是MyFlexProj.mxml:<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;!-- 
xmlns:myFlexLib="http://myflexlib.org.cn/myflexlib"
通过myFlexLib定义的命名,就可以在该应用中引用自定义的组件了
-->
&lt;mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:myFlexLib="http://myflexlib.org.cn/myflexlib"
	layout="absolute" xmlns:ns1="mylib.controls.date.*">
	
	&lt;myFlexLib:DateFieldLocal x="97" y="78" locale="zh_CN"/>
	
&lt;/mx:Application>
</pre><br /><br />以下是生成的最终效果:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16965/420643fe-ea85-3564-8bec-67ba8a9a2f03.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/209792#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/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>Mon, 30 Jun 2008 15:19:07 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/209792</link>
        <guid>http://lib.javaeye.com/blog/209792</guid>
      </item>
      <item>
        <title>Flex 开发学习笔记6.1 - 创建 Flex Library Project</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/209774" style="color:red;">http://lib.javaeye.com/blog/209774</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          创建 Flex Library Project可以将自定义的组件保存到一个项目中,并打包成swc库文件供其他应用程序调用.<br /><br />首先创建一个Flex Library Project:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16951/5780b7ce-5950-333b-91a8-3f08ac2863ca.jpg" /><br />点击下一步:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16953/e9858126-8091-30e9-8732-a39c9baa13a1.jpg" /><br />点击下一步,输入主程序目录为src:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16963/d8420fc1-7327-332b-903f-2d46260a293e.jpg" /><br /><br />点击完成按钮,最终生成的Flex Library Project工程目录结构如下:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16961/3379bc18-359b-351b-baf1-fd2173166872.jpg" /><br /><br />下面创建一下自定义组件DateFieldLocal组件,附件中该组件源码:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16959/cd8155d9-ecc7-3ec8-8d3a-eea0a26389f5.jpg" /><br /><br />然后在src目录中创建一个xml文件,来定义该组件库中的自定义组件的外部引用名称.<br />该例中该xml文件命名为myflexlib-define.xml,以下是该文件的内容:<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;componentPackage>   
    &lt;component id="DateFieldLocal" class="mylib.controls.date.DateFieldLocal"/>   
&lt;/componentPackage> 
</pre><br />以后再增加新的组件以后,记得要在该定义文件中加新的组件声明,才可以被其他应用所引用.<br /><br />定义组件库的命名空间,首先在该项目上右键点击选择属性:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16973/5225c084-f830-3bfb-89b4-e391c07b2221.jpg" /><br /><br />然后定义命名空间URL与选择Manifest File,即上面定义的xml文件:<br /><img src="http://lib.javaeye.com/upload/picture/pic/16957/187c2d82-a7be-3621-91c1-2b851317d1f0.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/209774#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/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>Mon, 30 Jun 2008 15:02:25 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/209774</link>
        <guid>http://lib.javaeye.com/blog/209774</guid>
      </item>
      <item>
        <title>Flex 开发学习笔记5 - Flex Component 组件开发 - 时间选择</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/203060" style="color:red;">http://lib.javaeye.com/blog/203060</a>&nbsp;
          发表时间: 2008年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这一次仍然总结一下Flex Component 组件的开发,在Flex <a href="http://lib.javaeye.com/blog/202385" target="_blank">开发学习笔记3</a>中开发的是一个分页列表的组件，是通过Flex MXML 的定义实现的，这次我来通过Flex 的 ActionScript 来定义一个组件，其实是通过继承的方式实现了一个新的类。<br /><br /><img src="http://lib.javaeye.com/upload/picture/pic/15909/26ad9e73-2eea-30b1-ac0e-f8e4a8e05482.jpg" /><br /><br />在Flex的组件库中，DateFiled定义了一个选择日期的输入框，默认是英文环境，如果要设置为中文的月份与星期，需要作以下的设置：<br /><pre name="code" class="xml">
        &lt;mx:DateField id="dateField1" yearNavigationEnabled="true" 
        	dayNames="['日','一','二','三','四','五','六']"
        	monthNames="['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']"
        	 formatString="YYYY-MM-DD"/>
</pre><br /><br />如果日期输入的地方比较多，需要每一个DateFiled都要这样定义，应该定义一个适应不同语言环境的日期组件，通过引用这个组件自动设置当前的日期选择。以下就是通过Flex的ActionScript自定义的DateFieldLocal代码，比较简单：<br /><pre name="code" class="java">
package simples.date
{
	import mx.controls.DateField;
	
	public class DateFieldLocal extends DateField
	{
		
		/** 中文环境标识 **/
		public static var LOCAL_ZH_CN:String = "zh_CN";
		
		public function DateFieldLocal()
		{
			super();
		}
		
		private var _locale : String;
		
		public function get locale():String{
			return _locale;
		}
		
		public function set locale(value:String):void{
			this._locale = value;
			
			//
			initLanguage();
		}
		
		private function initLanguage():void{
			
			if(_locale && _locale.length >0){
				switch(_locale){
					
					case LOCAL_ZH_CN:
						dayNames=['日','一','二','三','四','五','六'] ;
						monthNames=['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'];
						this.formatString="YYYY年MM月DD日";
					break;
					
					//case "zh_HK":					
					//break;
					//default:
					//break;
				}
			}
		}

	}
}
</pre><br /><br />对这个组件的引用：<br /><pre name="code" class="java">
&lt;user:DateFieldLocal id="dateField2" locale="zh_CN"/>
</pre><br /><br />目前还没有作到根据客户机的语言环境自动设置，如何获得客户机的语言环境信息？还希望有知道的达人给指点一下。<br />附件中有demo代码。
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/203060#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jun 2008 17:19:40 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/203060</link>
        <guid>http://lib.javaeye.com/blog/203060</guid>
      </item>
      <item>
        <title>Flex 开发学习笔记4 - 应用分页列表组件</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/202883" style="color:red;">http://lib.javaeye.com/blog/202883</a>&nbsp;
          发表时间: 2008年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          结合<a href="http://lib.javaeye.com/blog/202385" target="_blank">Flex 开发学习笔记3</a>中的分页列表组件作了个demo,先传上去，供大家研究所用。。。<br />部分列表代码：<br /><pre name="code" class="xml">
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	creationComplete="creationComplete()" 
	xmlns:user="list.comp.*">
&lt;!-- 这里的 xmlns:user="list.comp.*" 引用了一个命名空间，可以通过&lt;user:...>的方式引用"list.comp.*"命名空间中的自定义组件。-->
......

&lt;!-- 自定义列表双击事件"dataGridDoubleClick"的触发方法 -->
		public function showUserInfo() : void{
			Alert.show("name:" +myDG.dataGrid.selectedItem.name);
		}
.....

 &lt;user:PaginationDataGrid id="myDG" label="Employees" 
    	dataGridDoubleClick="showUserInfo()" 
    	width="100%" height="100%" pageSize="8">
......

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/202883#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jun 2008 11:25:32 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/202883</link>
        <guid>http://lib.javaeye.com/blog/202883</guid>
      </item>
      <item>
        <title>Flex 开发学习笔记3 - Flex Component 组件开发-分页列表</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/202385" style="color:red;">http://lib.javaeye.com/blog/202385</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>以下是我开发的Flex列表，该列表的分页参照了<a href="http://hereson.javaeye.com/blog/188512" target="_blank">Kelvin的教程</a>。以下是该列表的样式：</p>
<p>&nbsp;</p>
<p><img src="http://www.javaeye.com/upload/picture/pic/15907/002a18c8-b7d1-35af-b591-db2cc8e48b34.jpg?1213161385" height="411" alt="" width="701" /></p>
<p>&nbsp;</p>
<p>从这个列表的开发过程中感觉到了 Flex Component 的强大与方便！比如在这个列表中，分页列表作成了 Flex Component 组件，并自定义了双击事件(也可以增加自定义属性)，可以被应用到不同的列表中，达到了组件共用的目的。以下是该分页条的代码：</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" xmlns:local="*"&gt;

    &lt;!-- 这里定义的是列表上的双击事件 --&gt;
    &lt;mx:Metadata&gt;
        [Event(name="dataGridDoubleClick", type="flash.events.Event")]
    &lt;/mx:Metadata&gt;
    
    &lt;mx:Script&gt;

       &lt;![CDATA[

           /*&lt;SPAN class=hilite2&gt;分页&lt;/SPAN&gt;DataGrid

            by Kelvin 2008-02-24

            MSN:xiaobolove@hotmail.com

            Email:xiaobolove334421@163.com

            
            因为是一次取出全部数据，所以适合数据量不会太大的情况。

            加了一个pageSize,用来控制每页显示的行数，可以在调用这个组件的时候为pageSize属性赋值，

            默认为每页显示10行数据,不需要为DataGrid指定高度。

            参考 古刹飞鹰@E鹰创作室 的文章

            */

           import mx.collections.ArrayCollection;

           

           [Bindable]public var pageSize:int=10;//每页显示行数

           [Bindable]private var totalPage:int=0;//总页数

           [Bindable]private var currentPage:int=0;//当前页

           

           [Bindable]
           public var acAllData:ArrayCollection;//所有数据

           [Bindable]
           private var acPageData:ArrayCollection=new ArrayCollection();//当前页数据

           [Bindable]
           public var arrColumns:Array;//DataGrid列,在调用时需要为这个数组设置数据


           //初始化

           public function init(value:ArrayCollection):void

           {

              acAllData=value;

              if(acAllData.length!=0 &amp;&amp; acAllData!=null)

              {

                  totalPage=Math.ceil(acAllData.length/pageSize);

                  loadData(0);

              }else{

                  currentPage=0;

                  totalPage=0;

              }

           }

           

           //加载数据

           private function loadData(pageNum:int):void

           {

              if(pageNum&gt;=0 &amp;&amp; pageNum&lt;totalPage)

              {

                  acPageData.removeAll();

                  currentPage=pageNum;//重新为当前页的变量赋值

                  var startIndex:int=pageNum*pageSize;//计算起始索引

                  for(var i:int=0;i&lt;pageSize &amp;&amp; startIndex&lt;acAllData.length;i++)

                  {

                     acPageData.addItem(acAllData[startIndex]);

                     startIndex++;

                  }

              }

           }
           
           //双击事件
           private function dbClickEvent():void{
           		
           		dispatchEvent(new Event("dataGridDoubleClick"));
           		
           }

       ]]&gt;

    &lt;/mx:Script&gt;

    &lt;mx:VBox x="0" y="0" width="100%" height="100%" verticalGap="0" horizontalAlign="center" backgroundColor="white"&gt;

       &lt;mx:DataGrid id="dataGrid" width="98%" doubleClick="dbClickEvent()" doubleClickEnabled="true" dataProvider="{acPageData}" columns="{arrColumns}" rowCount="{pageSize}"/&gt;

       &lt;mx:HBox cornerRadius="0" borderStyle="solid" horizontalAlign="left" verticalAlign="middle" width="98%"&gt;

           &lt;mx:Text text="{'  第'+(totalPage&gt;0?(currentPage+1):0)+'页/共'+totalPage+'页'+'  共'+(acAllData!=null?acAllData.length:0)+'条记录'}" fontSize="12"/&gt;

           &lt;mx:LinkButton id="lbtnFirst" label="首页" click="loadData(0)" enabled="{lbtnPrevious.enabled}" fontSize="12"/&gt;

           &lt;mx:LinkButton id="lbtnPrevious" label="上一页" click="loadData(currentPage-1)" enabled="{currentPage!=0?true:false}" fontSize="12"/&gt;

           &lt;mx:LinkButton id="lbtnNext" label="下一页" click="loadData(currentPage+1)" enabled="{totalPage&gt;(currentPage+1)?true:false}" fontSize="12"/&gt;

           &lt;mx:LinkButton id="lbtnLast" label="尾页" click="loadData(totalPage-1)" enabled="{lbtnNext.enabled}" fontSize="12"/&gt;

            &lt;mx:NumericStepper id="nsPageNum" stepSize="1" minimum="1" maximum="{totalPage}" enabled="{lbtnJump.enabled}" cornerRadius="0"/&gt;

            &lt;mx:LinkButton id="lbtnJump" label="跳转" click="loadData(nsPageNum.value-1)" enabled="{totalPage&gt;1?true:false}" fontSize="12"/&gt;

       &lt;/mx:HBox&gt;

    &lt;/mx:VBox&gt;

&lt;/mx:Canvas&gt;

</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/202385#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 09:56:15 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/202385</link>
        <guid>http://lib.javaeye.com/blog/202385</guid>
      </item>
      <item>
        <title>Flex 开发学习笔记2 - 采用的架构 BlazeDS + Spring + Hibernate</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/202193" style="color:red;">http://lib.javaeye.com/blog/202193</a>&nbsp;
          发表时间: 2008年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>上一篇&ldquo;<a href="../../blog/202111">Flex 开发学习笔记1 - 与Flex的亲密接触,秀一下两周的成果</a>&rdquo;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;上篇中show了一下近期作的demo页面，现在讲一讲我使用的架构：</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自己原来的项目架构是 WebWork2 +&nbsp;Spring + Hibernate，现在通过FLex替代了WebWrok2来表显视图层，而Flex与Spring通讯采用了BlazeDS这个开源免费的Flex服务程序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BlazeDS是Adobe公司发布的免费开源产品，与该公司的另一款收费产品LCDS功能相近，应该是LCDS简化开源免费版。目前我通过RemoteObject的方式访问后台Service感觉比较方便。BlazeDS下载地址：<a href="http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+3">http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+3</a></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如何通过RemoteObject访问Spring管理的Bean，我参照<a href="http://www.riachina.com/showtopic-8723.html">另一篇教程文档</a>进行了设计与开发，在这篇文章中，用的是Adobe非免费Flex服务程序，只需要将LCDS中的flex.war换成BlazeDS中的flex.war就可以了。另外，这里有一篇&ldquo;<span style="color: #e9650e;"><a href="http://yexin218.javaeye.com/blog/199933" target="_blank">使用BlazeDS实现<span class="hilite2"><span style="background-color: #55ff55;">Java</span></span>和<span class="hilite1"><span style="background-color: #ffff00;">Flex</span></span>通信</a> </span>&rdquo;的文章，讲解了如何在eclipse中配置Flex工程。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是一个Flex页面访问RemoteObject的代码：</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.rpc.events.ResultEvent;
			import mx.controls.Alert;
			private function callRO(str:String):void{
				Alert.show("flexSpringBeanTest");
				firstRO.say(str);
				firstRO.addEventListener(ResultEvent.RESULT,getROResult);
			}
			
			private function getROResult(e:ResultEvent) :void {
				Alert.show(e.result.toString());
			}
			//flexObjectTest
		]]&gt;
	&lt;/mx:Script&gt;
	
	&lt;mx:RemoteObject id="firstRO" destination="flexSpringBeanTest"/&gt;
	&lt;mx:TextInput x="109" y="28" id="input" text="hello!"/&gt;
	&lt;mx:Button x="270" y="28" click="callRO(input.text)" label="请求"/&gt;
&lt;/mx:Application&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 在remote-config.xml配置里，映射一个Spring管理的Bean是这么写的</p>
<pre name="code" class="xml">  &lt;destination id="flexSpringBeanTest"&gt;
        &lt;properties&gt;
                &lt;factory&gt;springFactory&lt;/factory&gt; 
                &lt;source&gt;flexObjectTest&lt;/source&gt;
        &lt;/properties&gt;
  &lt;/destination&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 在services-config.xml配置自定义的SpringFactory类,即我们要实现从从spring容器中去取得bean。</p>
<pre name="code" class="xml">  &lt;factories&gt;
        &lt;factory id="springFactory" class="cn.org.coral.core.flex.factory.FlexSpringFactory" /&gt; 
  &lt;/factories&gt;</pre>
<p>&nbsp;&nbsp;&nbsp; 这个工厂类的定义:</p>
<pre name="code" class="java">package cn.org.coral.core.flex.factory;

import flex.messaging.FactoryInstance;
import flex.messaging.FlexFactory;
import flex.messaging.config.ConfigMap;

/**
 * 要对某个java类实现自己定义的切入，可以使用工厂配置，需要在ro访问前，从spring里去getbean&lt;br&gt;
 * 
 * @author Libin
 *
 */
public class FlexSpringFactory implements FlexFactory{

	@Override
	public FactoryInstance createFactoryInstance(String id, ConfigMap properties){
        SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);
        instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()));
        return instance;
    }
	@Override
	public Object lookup(FactoryInstance inst)  {
        SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;
        return factoryInstance.lookup();
    } 

	@Override
	public void initialize(String arg0, ConfigMap arg1) {
		// TODO Auto-generated method stub
		
	}

}
</pre>
<p>&nbsp;</p>
<p>该factory需要实现FlexFactory接口。实现createFactoryInstance方法和lookup方法</p>
<pre name="code" class="java">package cn.org.coral.core.flex.factory;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import flex.messaging.FactoryInstance;
import flex.messaging.config.ConfigMap;
import flex.messaging.services.ServiceException;

public class SpringFactoryInstance extends FactoryInstance
{
    SpringFactoryInstance(FlexSpringFactory factory, String id, ConfigMap properties)
    {
        super(factory, id, properties);
    }
    public Object lookup() 
    {
        //这就是从spring容器中getbean了
        ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext());
        String beanName = getSource();

        try
        {
            return appContext.getBean(beanName);
        }
        catch (NoSuchBeanDefinitionException nexc)
        {
            ServiceException e = new ServiceException();
            throw e;
        }
        catch (BeansException bexc)
        {
            ServiceException e = new ServiceException();
            throw e;
        } 
    }
    
} 

</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 后台service的定义：</p>
<pre name="code" class="java">package cn.org.coral.sample.flex.manager;

public class FlexObjectTest {

	public String say(String str){
		return "say : " + str;
	}
	
}
</pre>
<p>&nbsp;</p>
<p>&nbsp; spring-context.xml的配置</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;
&lt;beans&gt;

	&lt;bean id="flexObjectTest"
		class="cn.org.coral.sample.flex.manager.FlexObjectTest"&gt;
	&lt;/bean&gt;

&lt;/beans&gt;</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/202193#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jun 2008 16:02:24 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/202193</link>
        <guid>http://lib.javaeye.com/blog/202193</guid>
      </item>
      <item>
        <title>Flex 开发学习笔记1 - 与Flex的亲密接触,秀一下两周的成果</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/202111" style="color:red;">http://lib.javaeye.com/blog/202111</a>&nbsp;
          发表时间: 2008年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>终于跨进了Flex的大门，虽然只窥到Flex的精彩一斑，已经让我激动不已，从此认定她将是我以后的脸面：）</p>
<p>闲话少说，先秀一下我两周的学习成果：</p>
<p>1.人员列表：</p>
<p><img src="http://www.javaeye.com/upload/picture/pic/15907/002a18c8-b7d1-35af-b591-db2cc8e48b34.jpg?1213161385" height="411" alt="人员列表" width="701" /></p>
<p>&nbsp;</p>
<p>2.人员编辑：</p>
<p><img src="http://www.javaeye.com/upload/picture/pic/15909/26ad9e73-2eea-30b1-ac0e-f8e4a8e05482.jpg?1213161452" height="402" alt="人员明细" width="693" /></p>
<p>&nbsp;</p>
<p>3.查询：</p>
<p>&nbsp;<img src="http://www.javaeye.com/upload/picture/pic/15911/25b5d844-15da-3c93-af8f-3321a2ac4ce5.jpg?1213161609" height="408" alt="查询" width="697" /></p>
<p>&nbsp;</p>
<p>以后将陆续将开发过程总结出来，一起来学习Flex的精妙之处。</p>
<p>本Demo参照了BlazeDS实例程序"Inventory Management"的样式设计而成，BlazeDS给的例子代码比较实用，值得研究一下。</p>
<p>BlazeDS工程的下载地址：<a href="http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+3" target="_blank">http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+3</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/202111#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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jun 2008 13:22:51 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/202111</link>
        <guid>http://lib.javaeye.com/blog/202111</guid>
      </item>
      <item>
        <title>JAD反编译工具</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/198176" style="color:red;">http://lib.javaeye.com/blog/198176</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>This is README file for Jad - the fast Java Decompiler.<br />
Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html<br />
Copyright 2000 Pavel Kouznetsov (kpdus@yahoo.com).<br />
<br />
0. Please read the disclaimer on the Jad home page.<br />
<br />
1. Installation.<br />
<br />
Unzip jad.zip file into any appropriate directory on your hard drive.<br />
This will create two files:<br />
<br />
&nbsp;&nbsp;&nbsp; - an executable file named 'jad.exe' (Windows 95/NT)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or 'jad' (Linux)<br />
<br />
&nbsp;&nbsp;&nbsp; - this README file<br />
<br />
<br />
No other setup is required.<br />
<br />
2. How to use Jad<br />
<br />
To decompile a single JAVA class file 'example1.class' <br />
type the following:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; jad example1.class<br />
<br />
This command creates file 'example1.jad' in the current directory.<br />
If such file already exists Jad asks whether you want to overwrite it or not.<br />
Option -o permits overwriting without a confirmation.<br />
<br />
You can omit .class extension and/or use wildcards in the names of<br />
input files.<br />
<br />
Option -s &lt;ext&gt; allows to change output file extension:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; jad -sjava example1.class<br />
<br />
This command creates file 'example1.java'. Be careful when using<br />
options -o and -sjava together, because Jad can accidentally overwrite<br />
your own source files.<br />
<br />
Jad uses JAVA class name as an output file name. For example, if class<br />
file 'example1.class' contains JAVA class 'test1' then Jad will create<br />
file 'test1.jad' rather than 'example1.jad'. If you want to specify<br />
your own output file name use the output redirection:<br />
<br />
&nbsp;&nbsp; jad -p example1.class &gt; myexm1.java<br />
<br />
Option -d allows you to specify another directory for output files,<br />
which are created, by default, in the current directory. For example:<br />
<br />
&nbsp;&nbsp; jad -o -dtest -sjava *.class<br />
<br />
&nbsp;&nbsp; (or jad -o -d test -s java *.class, which has the same effect)<br />
<br />
This command decompiles all .class files in the current directory <br />
and places all output files with extension .java into directory 'test'.<br />
<br />
<br />
If you want to decompile the whole tree of JAVA classes,<br />
use the following command:<br />
<br />
&nbsp;&nbsp; jad -o -r -sjava -dsrc tree/**/*.class<br />
<br />
This command decompiles all .class files located in all <br />
subdirectories of 'tree' and creates output files in subdirectories<br />
of 'src' according to package names of classes. For example, if file <br />
'tree/a/b/c.class' contains class 'c' from package 'a.b', then <br />
output file will have a name 'src/a/b/c.java'.<br />
<br />
Note the use of the &quot;two stars&quot; wildcard ('**') in the previous<br />
command. It is handled by Jad rather than the command shell, so on<br />
UNIX the last argument should be single-quoted:<br />
<br />
&nbsp;&nbsp; jad -o -r -sjava -dsrc 'tree/**/*.class'<br />
<br />
<br />
In a case you want to check the accuracy of the decompilation or just<br />
curious, there is an option -a which tells Jad to annotate the output<br />
with JAVA Virtual Machine bytecodes.<br />
<br />
Jad supports the inner and anonymous classes. <br />
When Jad expands wildcards in the input file names, <br />
it automatically skips matching inner classes. <br />
On UNIX Jad skips inner classes if there is more than <br />
one class specified in the command line.<br />
Jad looks for inner classes in the directory of their top-level<br />
container class.<br />
<br />
3. List of the command-line options.<br />
<br />
Jad accepts the following options:<br />
<br />
&nbsp;&nbsp; -a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - annotate the output with JVM bytecodes<br />
&nbsp;&nbsp; -af&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - same as -a, but output fully qualified names when annotating;<br />
&nbsp;&nbsp; -clear&nbsp;&nbsp; - clear all prefixes, including the default ones (can be abbreviated as -cl)<br />
&nbsp;&nbsp; -b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - output redundant braces (e.g., if(a) { b(); }, default: no)<br />
&nbsp;&nbsp; -d &lt;dir&gt; - directory for output files (will be created when necessary)<br />
&nbsp;&nbsp; -dead&nbsp;&nbsp;&nbsp; - try to decompile dead parts of code (if any) (default: no)<br />
&nbsp;&nbsp; -disass&nbsp; - disassemble method bytecodes (no JAVA source generated)<br />
&nbsp;&nbsp; -f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - output fully qualified names for classes/fields/methods<br />
&nbsp;&nbsp; -ff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - output class fields before methods (default: after methods)<br />
&nbsp;&nbsp; -i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - output default initializers for all non-final fields<br />
&nbsp;&nbsp; -l&lt;num&gt;&nbsp; - split strings into pieces of maximum &lt;num&gt; chars (default: no)<br />
&nbsp;&nbsp; -lnc&nbsp;&nbsp;&nbsp;&nbsp; - annotate the output with line numbers (default: no)<br />
&nbsp;&nbsp; -nl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - split strings on newline character (default: no)<br />
&nbsp;&nbsp; -nodos&nbsp;&nbsp; - do not check for class files written in DOS mode (CR before NL, default: check)<br />
&nbsp;&nbsp; -nocast&nbsp; - don't generate auxiliary casts<br />
&nbsp;&nbsp; -nocode&nbsp; - don't generate the source code for methods<br />
&nbsp;&nbsp; -noconv&nbsp; - don't convert Java identifiers (default: do)<br />
&nbsp;&nbsp; -noctor&nbsp; - suppress the empty constructors<br />
&nbsp;&nbsp; -noinner - turn off the support of inner classes (default: turn on)<br />
&nbsp;&nbsp; -nolvt&nbsp;&nbsp; - ignore Local Variable Table information<br />
&nbsp;&nbsp; -nonlb&nbsp;&nbsp; - don't output a newline before opening brace (default: do)<br />
&nbsp;&nbsp; -o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - overwrite output files without confirmation (default: no)<br />
&nbsp;&nbsp; -p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - send decompiled code to STDOUT (e.g., for piping)<br />
&nbsp;&nbsp; -pi&lt;num&gt; - pack imports into one line after &lt;num&gt; imports (default: 3)<br />
&nbsp;&nbsp; -pv&lt;num&gt; - pack fields with identical types into one line (default: no)<br />
&nbsp;&nbsp; -pa &lt;pfx&gt;- prefix for all packages in generated source files<br />
&nbsp;&nbsp; -pc &lt;pfx&gt;- prefix for classes with numerical names (default: _cls)<br />
&nbsp;&nbsp; -pf &lt;pfx&gt;- prefix for fields with numerical names (default: _fld)<br />
&nbsp;&nbsp; -pe &lt;pfx&gt;- prefix for unused exception names (default: _ex)<br />
&nbsp;&nbsp; -pl &lt;pfx&gt;- prefix for locals with numerical names (default: _lcl)<br />
&nbsp;&nbsp; -pm &lt;pfx&gt;- prefix for methods with numerical names (default: _mth)<br />
&nbsp;&nbsp; -pp &lt;pfx&gt;- prefix for method parms with numerical names (default: _prm)<br />
&nbsp;&nbsp; -r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - restore package directory structrure<br />
&nbsp;&nbsp; -s &lt;ext&gt; - output file extension (by default '.jad')<br />
&nbsp;&nbsp; -space&nbsp;&nbsp; - output space between keyword (if/for/while/etc) and expression (default: off)<br />
&nbsp;&nbsp; -stat&nbsp;&nbsp;&nbsp; - display the total number of processed classes/methods/fields<br />
&nbsp;&nbsp; -t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - use tabs instead of spaces for indentation<br />
&nbsp;&nbsp; -t&lt;num&gt;&nbsp; - use &lt;num&gt; spaces for indentation (default: 4)<br />
&nbsp;&nbsp; -v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - display method names being decompiled<br />
&nbsp;&nbsp; -8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - convert UNICODE strings into 8-bit strings<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using the current ANSI code page (Win32 only)<br />
&nbsp;&nbsp; -&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - redirect STDERR to STDOUT (Win32 only)<br />
<br />
All single-word options have three formats:<br />
<br />
&nbsp; -o&nbsp;&nbsp;&nbsp; - 'reverses' value of an option<br />
&nbsp; -o+&nbsp;&nbsp; - set value to 'true' or 'on'<br />
&nbsp; -o-&nbsp;&nbsp; - set value to 'false' or 'off'<br />
<br />
You can specify the options you want to be set by default in the environment variable<br />
JAD_OPTIONS. For example:<br />
<br />
JAD_OPTIONS=-ff+ -nonlb+ -t+</p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/198176#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 11:33:08 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/198176</link>
        <guid>http://lib.javaeye.com/blog/198176</guid>
      </item>
      <item>
        <title>(转)flex中的三个.war包下载</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/196905" style="color:red;">http://lib.javaeye.com/blog/196905</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3>(转)flex中的三个.war包下载</h3>
<div class="t_msgfont" id="message35789">目前来说 Flex Data Services （最近又升级并改名为LiveCycle Data Services了）下面简称FDS,绝对是Flash、Flex最强劲的服务端了。 <br />下面介绍一下怎样将它部署到tomcat上面去。 <br />步骤1：首先去把tomcat下载回来，我们选用目前用得最多的版本5.5。下载地址是 <a href="http://tomcat.apache.org/" target="_blank">http://tomcat.apache.org/</a> 至于怎样安装这里就不介绍了，网上 <br /><br />很多相关的教程。 <br /><br />步骤2：把FDS下载回来，下载地址是：<a href="http://www.adobe.com/products/livecycle/" target="_blank">http://www.adobe.com/products/livecycle/</a>，目前FDS的开发版是免费的，不过只支持一个CPU的服务器 <br /><br />，作为普通的开发测试应用绰绰有余了，而企业版则很贵很贵（不过我自己已经把开发版破解成企业版了）。 <br /><br />步骤3：tomcat要运行 FDS，还需要 另外一个东西 ：JOTM (Java Open Transaction Manager)的支持。它提供了 JAVA 应用程序的事务支持。 <br />下载地址是：<a href="http://forge.objectweb.org/projects/jotm/" target="_blank">http://forge.objectweb.org/projects/jotm/</a> <br /><br />步骤4：安装JOTM，将下载回来的压缩包解压缩后复制 jotm-2.0.10\lib里面的所有文件到tomcat的公共库（tomcat的安装目录/common/lib）下面 <br /><br />，并在tomcat安装目录/conf/context.xml加入&lt;Transaction factory="org.objectweb.jotm.UserTransactionFactory" <br /><br />jotm.timeout="60"/&gt;。 <br /><br />步骤5：安装FDS，安装完之后将 安装目录下的 flex.war（FDS最基本的文件内容）, flex-admin.war（FDS管理）, and samples.war（比较全的 <br /><br />FDS范例）复制到 tomcat安装目录下的webapps目录下。 <br /><br />步骤6：重新启动tomcat，在IE上输入http://localhost/samples/ 就可以看到FDS令人振奋的一些范例效果了。 </div>
<div class="t_msgfont">原贴:<a href="http://www.riachina.com/showtopic-8083.html">http://www.riachina.com/showtopic-8083.html</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/196905#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 10:34:44 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/196905</link>
        <guid>http://lib.javaeye.com/blog/196905</guid>
      </item>
      <item>
        <title>压力测试与系统调优</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/189391" style="color:red;">http://lib.javaeye.com/blog/189391</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近用loadrunner对开发的系统进行了压力测试，考察系统的性能，是否可以应对客户的需要，并通过jconsole监控应用系统的各项技术指标数据，进面对系统参数进行了优化。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、 对Web应用服务器端的性能监视可以使用JDK5版以后自带的监控软件JConsole,可以满足简单的性能监控需要，我的服务端的环境为window + jdk 6 + tomcat 6 + mysql，为了能够监控Tomcat服务器的运行性能，需要在批处理文件catalina.bat中加入以下设置：</p>
<div class="quote_title">&nbsp;</div>
<div class="quote_div">set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9004" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、Tomcat服务器启动以后，然后启动JConsole，就新建连接中的本地进程中的tomcat的启动进程，选择后点连接按钮：</p>
<p>&nbsp;<img src="../../../upload/attachment/22678/59435d3a-8bf0-35e0-a77c-d93bd4056334.jpg" alt="" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、 LoadRunner的设置可以查看我的另一文章：<a href="../../../blog/189220">通过压力测试排查Bug(一)--测试过程</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、一个测试实例，以下是LoadRunner的测试图示与对应的服务端性能监控图示：</p>
<p>&nbsp;<img src="../../../upload/attachment/22687/1fa9fe0c-f9da-3042-b30a-437c561b9f32.jpg" alt="" /></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="../../../upload/attachment/22695/3f4541f3-55a1-32e2-b4f7-4a4acaea4170.jpg" height="768" alt="" width="1024" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5、通过监控服务器信息，进行了系统参数的优化：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先优化了Java VM参数：</p>
<p>&nbsp;&nbsp;</p>
<div class="quote_div">JAVA_OPTS=-server -Xms150m -Xmx220m -Xss128k -XX:MaxNewSize=256m -XX:PermSize=64M -XX:MaxPermSize=256m</div>
<p>&nbsp;</p>
<p><span style="font-size: 10.5pt; color: #0000ff; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原来设置为"-Xms512m -Xmx768m"，现在看来没有必要设置如此之高，如上设置即可，同时垃圾回收更及时了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再就是优化了Tomcat的线程池启设置，配置在server.xml文件中，对以下几个参数进行具体的调整：</p>
<p>&nbsp;</p>
<p>maxThreads：Tomcat可创建的最大线程数；</p>
<p>acceptCount：如果当前可用线程数为0，则将请求放入处理队列中。这个值限定了请求队列的大小，超过这个数值的请求将不予处理。</p>
<p>connectionTimeout：网络连接超时数，单位毫秒。</p>
<p>minSpareThreads：如果当前没有空闲线程，且没有超过maxThreads，一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。</p>
<p>maxSpareThreads：一旦创建的线程超过此数值，Tomcat会关闭不再需要的线程。</p>
<p>线程数可以大致上用 &ldquo;同时在线人数*每秒用户操作次数*系统平均操作时间&rdquo; 来计算。</p>
<p>&nbsp;</p>
<p>具体设置如下：</p>
<p><span style="font-size: 10.5pt; color: #0000ff; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">
<p>&nbsp;</p>
<div class="quote_div">&lt;Connector port="80" maxThreads="256" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/&gt; </div>
<p>&nbsp;</p>
</span></p>
<p>&nbsp;</p>
</span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/189391#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 16:19:56 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/189391</link>
        <guid>http://lib.javaeye.com/blog/189391</guid>
      </item>
      <item>
        <title>通过压力测试排查Bug(二)--排查Bug</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/189239" style="color:red;">http://lib.javaeye.com/blog/189239</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 最近的一个项目应用了Acegi作为安全框架，项目试运行期间出现了一个隐藏比较深的Bug：当运行一段时间之后，对于URL资源串的控制功能失效！在更新了acegi最新版本后仍没有排除该Bug。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为该Bug的发生需要在运行一段时间后才会发现，排查起来比较困难，因此需要通过测试工具进行一定时间的压力测试以后来重现故障的发生！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在 <a href="../../../blog/189220" target="_blank">通过压力测试排查Bug(一)--测试过程</a> 中我把测试的步骤介绍了一下，下面我将该Bug的排查过程介绍一下，以供参考：</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过MyEclipse的调试模式运行的Web应用程序，可以通过设置断点进行单步调试，设置断点很容易，只需要在代码行之前（行数标注上）双击鼠标左键即可。当程序运行该代码处即会暂停运行，你可以在Debug模式窗口中观察程序运行状态。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为acegi对url的控制是在filter中进行的，所以我将断点设置在了继承了AbstractFilterInvocationDefinitionSource的自定义filter中：</p>
<p><img src="../../upload/picture/pic/13627/fb6bc610-dd82-335f-94c9-9df99e9ea920.jpg " alt="" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过观察断点处的变量值，发现urls变量的值不正常，该值应该是在后台管理的所有URL资源才对，现在全部变成了多个一样的同一个URL，问题就出在了这里！什么导致了变量值的紊乱呢？以下方法引起了我的注意：</p>
<pre name="code" class="java">		//倒叙排序所有获取的url
		orderUrls(urls);</pre>
<pre name="code" class="java">	/**
	 * 把url资源按倒序排序
	 * @param urls
	 */
	private  void orderUrls(List&lt;String&gt; urls) {
		Collections.sort(urls);
		Collections.reverse(urls);
	}</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该方法对urls按照字母顺序进行了倒序排序，因为Collections.sort是静态方法，在执行时，值参应该是在一处内存地址上操作，因此并发操作时，一定会产生互相干扰重叠的排序操作，造成了urls变量值的紊乱！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此我将该方法前加上了synchronized关键字，防止多个线程同时访问这个方法。</p>
<pre name="code" class="java">	/**
	 * 把url资源按倒序排序
	 * @param urls
	 */
	private  synchronized  void orderUrls(List&lt;String&gt; urls) {
		Collections.sort(urls);
		Collections.reverse(urls);
	}</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再经过一轮的压力测试，没有再出现类似的问题，至此该Bug成功消除！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 出现的这个缺陷提醒我们，以后编程时一定要注意线程并发操作的影响，在有影响的位置注意使用synchronized&nbsp;关键字来防止多个线程同时访问一处代码！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同时看出，压力测试的必要性，不进行适当的压力测试有可能发现不了更隐蔽的缺陷，尤其是多线程并发操作的应用。压力测试还能考察开发出来的系统的性能如何、运行是否稳定、是否能够满足实际应用环境的客户的访问量。</p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/189239#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>Sun, 04 May 2008 11:44:53 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/189239</link>
        <guid>http://lib.javaeye.com/blog/189239</guid>
      </item>
      <item>
        <title>通过压力测试排查Bug(一)--测试过程</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/189220" style="color:red;">http://lib.javaeye.com/blog/189220</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 最近的一个项目应用了Acegi作为安全框架，项目试运行期间出现了一个隐藏比较深的Bug：当运行一段时间之后，对于URL资源串的控制功能失效！在更新了acegi最新版本后仍没有排除该Bug。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为该Bug的发生需要在运行一段时间后才会发现，排查起来比较困难，因此需要通过测试工具进行一定时间的压力测试以后来重现故障的发生！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下面我将该Bug的排查过程介绍一下，以供参考：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、首先通过MyEclipse的调试模式启动Web应用服务器，发布Web应用，以便在出现问题以后可以进行单步调试，查看后台变量的值，缩定引起Bug发生的问题代码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、压力测试工具我使用的是LoadRunner，LoadRunner可以录制操作角本，模拟测试场景，功能非常强大！</p>
<ul>
<li>首先启动LoadRunner Controller<br /><img src="../../../upload/picture/pic/13603/e256c532-c0c1-3a33-ae38-54c2dccc0b88.jpg" height="143" alt="" width="465" /></li>
</ul>
<p>&nbsp;</p>
<ul>
<li>创建新的scenario，点击Record启动录制脚本程序：</li>
</ul>
<p><img src="../../../upload/picture/pic/13607/dd96e0c7-bd9e-3e62-ab98-f6138f9a7840.jpg " alt="" /></p>
<p>&nbsp;</p>
<ul>
<li>点击OK按钮，然后点击"Start Record"按钮开始录制操作脚本程序。输入Web服务程序的访问地址点OK按钮后即开始录制：</li>
</ul>
<p><img src="../../../upload/picture/pic/13611/7b558999-52a6-3f54-aa06-3020dede6487.jpg " alt="" /></p>
<p>&nbsp;</p>
<ul>
<li>在随后弹出的浏览器窗口中进行若干操作，最后点击Stop按钮或按&ldquo;ctrl+F5"即停止录制生成操作脚本。最后保存退出Virtural User Generator程序，返回到LoadRunner Controller程序，将刚才保存的脚本添加到&ldquo;Script in Scenario&rdquo;中，点击OK。</li>
</ul>
<p><img src="../../../upload/picture/pic/13617/f00fcf35-a573-3f2e-bd3b-3782b5712772.jpg" height="523" alt="" width="587" /></p>
<p>&nbsp;</p>
<ul>
<li>通过Quantity可以设置模拟人数的个数，默认为10个。</li>
</ul>
<p><img src="../../../upload/picture/pic/13621/713324c5-7c4e-3161-9ac9-2c874dc7d640.jpg " alt="" /></p>
<p>&nbsp;</p>
<ul>
<li>设置Schedule，点击&ldquo;Edit Schedule&rdquo;，点击&ldquo;Duration&rdquo;，设置测试持续时间，目前设置了连续测试1个小时，设置完成点击OK确定。</li>
</ul>
<p><img src="../../../upload/picture/pic/13623/cbfc6b10-10bf-37c3-9ae8-1d1ecf97bc2d.jpg " alt="" /></p>
<p>&nbsp;</p>
<ul>
<li>&nbsp;最后点击&ldquo;start scenario&rdquo;启动测试。</li>
</ul>
<p><img src="../../../upload/picture/pic/13625/3dec0066-f925-325c-85e1-1c97216d8368.jpg " alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/189220#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 11:05:18 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/189220</link>
        <guid>http://lib.javaeye.com/blog/189220</guid>
      </item>
      <item>
        <title>转发:国人当自强</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/183684" style="color:red;">http://lib.javaeye.com/blog/183684</a>&nbsp;
          发表时间: 2008年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 西方国家这次为什么会如次的团结？欧洲的德国、法国，一般是不会冒著这样的风险得罪中国这个经济大国的。伊拉克战争时德国和法国都和中国站在一边，不支持美国对伊动武。为伊拉克而得罪美国，不符合他们的国家利益啊。法国10年前为了不得罪中国，终止了对台军售，损失了几十亿的收入。而为什么今天会冒著这么大的风险公然与中国为敌？难到就是为了和自己根本不相干的西藏和奥运？<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而另一个值得让人思考的问题是，一向是西方老大的美国，为什么这一次这么低调？让英、法、德在前台唱主角？对于西藏，西方国家很清楚，再怎么闹，中国也不可能做出让步。对于奥运，他们也很清楚，就算西方国家没有一个领导人出席北京奥运会，中国也就是面子上过不去罢了，对中国有实质影响吗？没有。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，西藏只是一个幌子，奥运也只是一个幌子。那么他们到底想从中国得到什么？<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 西方国家正面临著10年来经济陷入衰退的危险，他们需要有一个有实力的国家为这次西方经济的衰退买单。不言而喻，他们不约而同的想到了中国。做为一个普通老百姓，我对国际经济没有什么研究，但2008年一开始我还是隐约到中国经济面临的危险，现在也就想起了温总理说过的一句话：2008年也许是中国经济最困难的一年。现在想起正在进行的这场闹剧，真的有点让人毛骨耸然了。美国不是低调，是很冷静，他们早已经不露声色的出招了：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、美元贬值。因为美元贬值，人民币升值，中国16000亿美元的外汇储备已经人间蒸发了3000亿美元，而且还在继续蒸发中。更要命的是，由于人民币升值，中国出口产品成本增加，沉重的打击中国的出口，许多企业面临倒闭的危险。因为中国企业的倒闭，西方国家生产企业就可以开始生产复苏。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、通过高油价以拖跨中国经济。中国经济的高速发展需要大量的进品原油，而西方国家则不断的提高石油储备，造成高油价一直持续，以增加中国经济建设的成本。这就是美国为什么要打伊拉克、打伊朗的原因：控制石油就是控制了经济命脉。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、足涨中国金融泡沫。人民币升值，大量热钱自然要涌入中国，造成中国高成本、高币值的经济泡沫。或许这就是为什么政府就算是背著千夫所指都绝不救市的原因，就是为了打击国际投机资本在中国的恶意圈钱行为，而另一方面却不得不面对成千上万痛不欲生的股民的唾骂而有可能造成国内社会动荡的危险。现在看了，什么西藏事件、抵制奥运都是不足为道的事。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，&ldquo;西藏&rdquo;和&ldquo;奥运&rdquo;只是西方国家绑架的两个&ldquo;人质&rdquo;，他们真正的目的不是西藏，也不是奥运，而是以此为要挟，要中国为他们的经济衰退买单。不买单：搞乱你，要死大家一起死。买单：坐下来谈，你答应我我就息事宁人！&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中国政府的冷静是对的，死死抓住经济建设这个中心不动摇才是关键。经济如果一跨，那就什么都跨了。国民要冷静，要相互理解，不要给政府出难题。还是那句话：发展才是硬道理，压倒一切的是稳定。一个普通的中国人都能预料到，我相信政府能从容应对。我们要支持政府打赢这场表面上看起来是舆论战，而事实上是经济的战争&nbsp; <br />我们需要更团结&nbsp; 希望大家奔走先告<br />1、多省油&nbsp; 多乘坐公共交通出行&nbsp; 能做车就不要开车 能开窗户就不要开 空调<br />2、多省电&nbsp; 路灯不用就关掉， 能用耳机就不要开音箱，家电不用就要把整个开关拔下来 又省电又安全 希望政府把夜景工程的灯光就关掉&nbsp; <br />3、支持国货 能买到国货就不要买外国货 促进内需 钱要给自己人赚&nbsp;&nbsp; <br />4、努力工作 多开发和制造更好的产品&nbsp; 实业才是救国之本<br />5、尊重自己 尊重国人 不要崇洋媚外&nbsp; <br />6、告诉台湾 西藏 包括其他民族的青年 为什么我们现在还这么痛苦别的国家看不起，因为我们的祖辈太喜欢窝里斗，。&nbsp; <br />7、告诉身边的每一个人 中国只有强大才会有更好的家 ，落后就要挨打挨骂&nbsp; <br />8、政府在进步 督促政府更快的进步 而不是推到他 那样高兴的是美日 痛苦的是自己<br />9、转发给群上的弟兄姐妹 </p>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/183684#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Apr 2008 10:46:30 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/183684</link>
        <guid>http://lib.javaeye.com/blog/183684</guid>
      </item>
      <item>
        <title>C#.net如何将空值保存到值类型DataTime数据库字段中呢?</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/173712" style="color:red;">http://lib.javaeye.com/blog/173712</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          C#.net如何将空值保存到值类型DataTime数据库字段中呢?<br /><br />强行给值类型赋null值:<br />DateTime optime = null;<br />编译就不会通过，会报出类似下面的异常：<br />无法将 NULL 转换成“System.DateTime”，因为它是一种值类型<br /><br />要借助Nullable&lt;T>结构体<br />Nullable&lt;DateTime> optime = null;<br /><br />以下为解决方案:<br /><br /><pre name="code" class="c#">

                Nullable&lt;DateTime> optime = null;
                result = this.itemAdapter.Insert(oid, content,
                    operate, optime, 
                    Convert.ToDecimal(billId),ToInt16(item.orderno));
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/173712#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 13:03:36 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/173712</link>
        <guid>http://lib.javaeye.com/blog/173712</guid>
      </item>
      <item>
        <title>WebService开发笔记 3 -- 增强访问 WebService 的安全性</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/173641" style="color:red;">http://lib.javaeye.com/blog/173641</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在<a href="http://lib.javaeye.com/blog/170620" target="_blank">WebService开发笔记 1</a>中我们创建了一个WebService简单实例,下面我们通过一个简单的用户口令验证机制来加强一下WebService的安全性:<br /><br />1.修改WebService 服务端 spring 配置文件 ws-context.xml <br /><pre name="code" class="xml">
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
	
	&lt;jaxws:endpoint id="webServiceSample"
		address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl">

		&lt;jaxws:inInterceptors>
			&lt;bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
			&lt;bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
				&lt;constructor-arg>
					&lt;map>
						&lt;entry key="action" value="UsernameToken" />
						&lt;entry key="passwordType" value="PasswordText" />
						&lt;entry key="passwordCallbackClass" value="cn.org.coral.biz.examples.webservice.handler.WsAuthHandler" />
					&lt;/map>
				&lt;/constructor-arg>
			&lt;/bean>
		&lt;/jaxws:inInterceptors>	

	&lt;/jaxws:endpoint>
	
&lt;/beans>
</pre><br /><br />2.服务端添加passwordCallbackClass回调类,该类进行用户口令验证:<br /><pre name="code" class="java">
package cn.org.coral.biz.examples.webservice.handler;

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class WsAuthHandler  implements CallbackHandler{

	public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
		WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        if (pc.getIdentifer().equals("ws-client")){
            if (!pc.getPassword().equals("admin")) {
                throw new SecurityException("wrong password");
           }
        }else{
        	throw new SecurityException("wrong username");
        }
	}

}
</pre><br /><br />3.客户端修改spring 配置文件 wsclient-context.xml 如下:<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">


	&lt;!-- ws clinet -->
	&lt;bean id="webServiceSampleClient" class="cn.org.coral.biz.examples.webservice.WebServiceSample"
		factory-bean="webServiceSampleClientFactory" factory-method="create" />


	&lt;bean id="webServiceSampleClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		&lt;property name="serviceClass"
			value="cn.org.coral.biz.examples.webservice.WebServiceSample" />
		&lt;property name="address"
			value="http://88.148.29.54:8080/aio/services/WebServiceSample" />
		&lt;property name="outInterceptors">
			&lt;list>
				&lt;bean
					class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
				&lt;ref bean="wss4jOutConfiguration" />
			&lt;/list>
		&lt;/property>
	&lt;/bean>

	&lt;bean id="wss4jOutConfiguration"
		class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
		&lt;property name="properties">
			&lt;map>
				&lt;entry key="action" value="UsernameToken" />
				&lt;entry key="user" value="ws-client" />
				&lt;entry key="passwordType" value="PasswordText" />
				&lt;entry>
					&lt;key>
						&lt;value>passwordCallbackRef&lt;/value>
					&lt;/key>
					&lt;ref bean="passwordCallback" />
				&lt;/entry>
			&lt;/map>
		&lt;/property>
	&lt;/bean>
	&lt;bean id="passwordCallback"
		class="cn.org.coral.biz.examples.webservice.handler.WsClinetAuthHandler">
	&lt;/bean>

&lt;/beans>
</pre><br /><br />4.客户端添加passwordCallback类,通过该类设置访问口令<br /><pre name="code" class="java">
package cn.org.coral.biz.examples.webservice.handler;

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class WsClinetAuthHandler  implements CallbackHandler{


    public void handle(Callback[] callbacks) throws IOException, 
                    UnsupportedCallbackException { 
            for (int i = 0; i &lt; callbacks.length; i++) { 
                    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 
                    int usage = pc.getUsage(); 


                    System.out.println("identifier: " + pc.getIdentifer()); 
                    System.out.println("usage: " + pc.getUsage()); 
                    if (usage == WSPasswordCallback.USERNAME_TOKEN) { 
                            // username token pwd... 
                            pc.setPassword("admin"); 

                    } else if (usage == WSPasswordCallback.SIGNATURE) { 
                            // set the password for client's keystore.keyPassword 
                            pc.setPassword("keyPassword"); 
                    } 
            } 
    } 

}
</pre><br /><br />5.junit单元测试程序:<br /><pre name="code" class="java">
package cn.org.coral.biz.examples.webservice;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.util.Assert;

public class TestWebService extends AbstractDependencyInjectionSpringContextTests {
	WebServiceSample webServiceSampleClient;
	
	@Override
	protected String[] getConfigLocations() {
		setAutowireMode(AUTOWIRE_BY_NAME);
		return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
	}

	/**
	 * @param webServiceSampleClient the webServiceSampleClient to set
	 */
	public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
		this.webServiceSampleClient = webServiceSampleClient;
	}

	public void testSay(){
		String result = webServiceSampleClient.say(" world");
		Assert.hasText(result);		
	}
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/173641#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 09:50:53 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/173641</link>
        <guid>http://lib.javaeye.com/blog/173641</guid>
      </item>
      <item>
        <title>WebService开发笔记 2 -- VS 2005 访问WebServcie更简单</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/170628" style="color:red;">http://lib.javaeye.com/blog/170628</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          WebService开发笔记 2 -- VS 2005 访问WebServcie更简单<br /><br />在上一回中我们创建了一个WebService服务(<a href="http://lib.javaeye.com/blog/170620" target="_blank">WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单</a><br />),下面就来作一个跨平台访问WebServcie服务的例子....<br /><br />下面将在vs2005中通过c#.net访问我们创建好的WebService服务，C#.net第一次用，TNN的没想到这么简单,MS就是MS，不服不行。 <br /><br />1.首先在vs中新建项目  <br /><img src="http://lib.javaeye.com/upload/picture/pic/9222/0f3a1ad5-34c4-35b0-94d0-52d6cd25e7a1.jpg?1205321363" /><br /><br />2.添加web引用....  <br /><img src="http://lib.javaeye.com/upload/picture/pic/9220/e5e21986-a77f-3918-8b12-8290e62456a1.jpg?1205321362" /><br /><br />3.输入WebService地址：http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl最后点击“添加引用”  <br /><img src="http://lib.javaeye.com/upload/picture/pic/9218/d394c612-a53d-340a-bc28-fb405952b9b8.jpg?1205321361" /><br /><br />4.创建一个简单的form  <br /><img src="http://lib.javaeye.com/upload/picture/pic/9216/7be4342c-d86e-3dec-a7fd-325a2257f0b7.jpg?1205321360" /><br /><br />5.编写按钮事件代码 <br /><br /><pre name="code" class="c#">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net;

using System.Windows.Forms;


using WindowsApplication1.WebReference;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        WindowsApplication1.WebReference.WebServiceSampleImplService service = null;

        public Form1()
        {
            
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
             
            String str = "";
           
            try
            {
                str = service.say("Libin");
            
            }
            catch (Exception we)
            {
                str = we.Message;
            }

            //MessageBox.Show(str);

            textBox1.Text = str ;


        }

        private void Form1_Load(object sender, EventArgs e)
        {
            service = new WebServiceSampleImplService();
            
            label1.Text = "WS.url:" + service.Url + "\r\n";

        }

        private void button2_Click(object sender, EventArgs e)
        {
            String str = "";

            try
            {
                User user = new User();
                user.id = 1;
                user.name = "Libin";
                str = "userName:" + service.sayUserName(user);

            }
            catch (Exception we)
            {
                str = we.Message;
            }

            //MessageBox.Show(str);

            textBox1.Text = str;
        }

        private void button3_Click(object sender, EventArgs e)
        {

            String str = "";
            try
            {

                Object[]  users = service.findUsers();
                for (int i = 0; i &lt; users.Length; i++)
                {
                    User user = (User)users[i];
                    str += "id:"+user.id + "  name:" + user.name + "\r\n";
                }

            }
            catch (Exception we)
            {
                str = we.Message;
            }

            //MessageBox.Show(str);

            textBox1.Text = str;
        }
    }
}</pre><br /><br />6.最后点击调试运行，或按F5运行，通过点击按钮就可以看到调用WebService的运行结果了<br /><img src="http://lib.javaeye.com/upload/picture/pic/9214/d4de199c-d6e7-3e39-a69f-494a38b972c9.jpg?1205321360" />
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/170628#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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 19:32:44 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/170628</link>
        <guid>http://lib.javaeye.com/blog/170628</guid>
      </item>
      <item>
        <title>WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/170620" style="color:red;">http://lib.javaeye.com/blog/170620</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单<br /><br />    现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作。下面就将我们在开发中摸索的一点经验教训总结以下，以供大家参考.<br /><br />在<a href="http://lib.javaeye.com/blog/170628" target="_blank">WebService开发笔记 2 -- VS 2005 访问WebServcie更简单</a>中作一个跨平台访问WebServcie服务的例子.... <br /><br />在<a href="http://lib.javaeye.com/blog/173641" target="_blank">WebService开发笔记 3 -- 增强访问 WebService 的安全性</a>通过一个简单的用户口令验证机制来加强一下WebService的安全性....<br /><br />我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate;<br />1.首先集成Apacha CXF WebService 到 Spring 框架中;<br />   apache cxf 下载地址:<a href="http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip" target="_blank">http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip</a><br />  在spring context配置文件中引入以下cxf配置<br /><pre name="code" class="xml">
	&lt;import resource="classpath*:META-INF/cxf/cxf.xml" />
	&lt;import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
	&lt;import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
</pre><br />   在web.xml中添加过滤器:<br /><pre name="code" class="xml">
	&lt;servlet>
		&lt;servlet-name>CXFServlet&lt;/servlet-name>
		&lt;servlet-class>
			org.apache.cxf.transport.servlet.CXFServlet
		&lt;/servlet-class>
	&lt;/servlet>
	&lt;servlet-mapping>
		&lt;servlet-name>CXFServlet&lt;/servlet-name>
		&lt;url-pattern>/services/*&lt;/url-pattern>
	&lt;/servlet-mapping>
</pre><br /><br />2.开发服务端WebService接口:<br /><pre name="code" class="java">
/**
 * WebService接口定义类.
 * 
 * 使用@WebService将接口中的所有方法输出为Web Service.
 * 可用annotation对设置方法、参数和返回值在WSDL中的定义.
 */
@WebService
public interface WebServiceSample {


	/**
	 * 一个简单的方法,返回一个字符串
	 * @param hello
	 * @return
	 */
	String say(String hello);
	
	/**
	 * 稍微复杂一些的方法,传递一个对象给服务端处理
	 * @param user
	 * @return
	 */
	String sayUserName(
			@WebParam(name = "user") 
			UserDTO user);
	
	/**
	 * 最复杂的方法,返回一个List封装的对象集合
	 * @return
	 */
	public 
	@WebResult(partName="o")
	ListObject findUsers();

}
</pre><br />由简单到复杂定义了三个接口,模拟业务需求;<br /><br />3.实现接口<br /><pre name="code" class="java">
/**
 * WebService实现类.
 * 
 * 使用@WebService指向Interface定义类即可.
 */
@WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")
public class WebServiceSampleImpl implements WebServiceSample {

	public String sayUserName(UserDTO user) {
		return "hello "+user.getName();
	}

	public String say(String hello) {
		return "hello "+hello;
	}

	public ListObject findUsers() {
		ArrayList&lt;Object> list = new ArrayList&lt;Object>();
		
		list.add(instancUser(1,"lib"));
		list.add(instancUser(2,"mld"));
		list.add(instancUser(3,"lq"));
		list.add(instancUser(4,"gj"));
		ListObject o = new ListObject();
		o.setList(list);
		return o;
	}
	
	private UserDTO instancUser(Integer id,String name){
		UserDTO user = new UserDTO();
		user.setId(id);
		user.setName(name);
		return user;
	}
}
</pre><br /><br />4.依赖的两个类:用户对象与List对象<br /><pre name="code" class="java">
/**
 * Web Service传输User信息的DTO.
 * 
 * 分离entity类与web service接口间的耦合，隔绝entity类的修改对接口的影响.
 * 使用JAXB 2.0的annotation标注JAVA-XML映射，尽量使用默认约定.
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User")
public class UserDTO {

	protected Integer id;

	protected String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer value) {
		id = value;
	}

	public String getName() {
		return name;
	}

	public void setName(String value) {
		name = value;
	}
}
</pre><br />关于List对象,参照了<a href="http://www.javaeye.com/post/253814" target="_blank">有关JWS的一个问题</a>中的描述:DK6.0 自带的WebService中 WebMethod的参数好像不能是ArrayList 或者其他List<br />传递List需要将List 包装在其他对象内部才行 (个人理解 如有不对请指出) ,我在实践中也遇到了此类问题.通过以下封装的对象即可以传递List对象.<br /><pre name="code" class="java">
/**
 * &lt;p>Java class for listObject complex type.
 * 
 * &lt;p>The following schema fragment specifies the expected content contained within this class.
 * 
 * &lt;pre>
 * &lt;complexType name="listObject">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * &lt;/pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "listObject", propOrder = { "list" })
public class ListObject {

	@XmlElement(nillable = true)
	protected List&lt;Object> list;

	/**
	 * Gets the value of the list property.
	 * 
	 * &lt;p>
	 * This accessor method returns a reference to the live list,
	 * not a snapshot. Therefore any modification you make to the
	 * returned list will be present inside the JAXB object.
	 * This is why there is not a &lt;CODE>set&lt;/CODE> method for the list property.
	 * 
	 * &lt;p>
	 * For example, to add a new item, do as follows:
	 * &lt;pre>
	 *    getList().add(newItem);
	 * &lt;/pre>
	 * 
	 * 
	 * &lt;p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link Object }
	 * 
	 * 
	 */
	public List&lt;Object> getList() {
		if (list == null) {
			list = new ArrayList&lt;Object>();
		}
		return this.list;
	}

	public void setList(ArrayList&lt;Object> list) {
		this.list = list;
	}

}
</pre><br /><br />5.WebService 服务端 spring 配置文件 ws-context.xml<br /><pre name="code" class="xml">
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
	
	&lt;jaxws:endpoint id="webServiceSample"
		address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/>

&lt;/beans>
</pre><br /><br />WebService 客户端 spring 配置文件 wsclient-context.xml<br /><pre name="code" class="xml">
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">

	&lt;!-- ws client -->
	&lt;bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
		factory-bean="identityValidateServiceClientFactory" factory-method="create" />

	&lt;bean id="identityValidateServiceClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		&lt;property name="serviceClass"
			value="cn.org.coral.admin.service.IdentityValidateService" />
		&lt;property name="address"
			value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
	&lt;/bean>
	
&lt;/beans>
</pre><br />6.发布到tomcat服务器以后通过以下地址即可查看自定义的webservice接口生成的wsdl:<br />http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl<br /><br />7.调用WebService接口的Junit单元测试程序<br /><pre name="code" class="java">
package test.coral.sample;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;

import cn.org.coral.biz.examples.webservice.WebServiceSample;
import cn.org.coral.biz.examples.webservice.dto.UserDTO;

public class TestWebServiceSample extends
		AbstractDependencyInjectionSpringContextTests {
	WebServiceSample webServiceSampleClient;

	public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
		this.webServiceSampleClient = webServiceSampleClient;
	}
	
	@Override
	protected String[] getConfigLocations() {
		setAutowireMode(AUTOWIRE_BY_NAME);
                  //spring 客户端配置文件保存位置
		return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
	}
	
	public void testWSClinet(){
		Assert.hasText(webServiceSampleClient.say(" world"));
	}
}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/170620#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/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>Wed, 12 Mar 2008 18:37:56 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/170620</link>
        <guid>http://lib.javaeye.com/blog/170620</guid>
      </item>
      <item>
        <title>JS 倒记时</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/167800" style="color:red;">http://lib.javaeye.com/blog/167800</a>&nbsp;
          发表时间: 2008年03月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="html">
&lt;h2>本窗口将在&lt;span id="sec">&lt;/span>秒后自动关闭退出！&lt;/h2>	
</pre><br /><br /><pre name="code" class="JS">
&lt;script type="text/javascript">

var MAX_TIME_SEC = 5;
var curTime = MAX_TIME_SEC;
var showId = document.getElementById("sec");
showId.innerHTML=curTime ; 

var interval = setInterval(showTime,1000);

function showTime(){
	if(curTime > 0){
		showId.innerHTML=curTime ;
		curTime--;
	}else{
		clearInterval(interval);
		window.close();
	} 
}
&lt;/script>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/167800#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/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>Tue, 04 Mar 2008 16:51:38 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/167800</link>
        <guid>http://lib.javaeye.com/blog/167800</guid>
      </item>
      <item>
        <title>Tomcat 配置 -- 打开中文文件名的附件</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/167624" style="color:red;">http://lib.javaeye.com/blog/167624</a>&nbsp;
          发表时间: 2008年03月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          设计了文件上传的工具,但在Tomcat服务器上访问中文文件名的文件不能打开,报找不到文件的错误,文件名称在后台进行了UTF-8的转码,而在tomcat的server.xml文件中的设置是这样的:<br /><br /><pre name="code" class="xml">
    &lt;Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="GBK"/> 
</pre><br /><br />将编码格式改为UTF-8就可以了:<br /><br /><pre name="code" class="xml">
    &lt;Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8"/> 
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/167624#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Mar 2008 10:23:56 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/167624</link>
        <guid>http://lib.javaeye.com/blog/167624</guid>
      </item>
      <item>
        <title>CAS 单点登录安装笔记4 -- asp.net client端的设置</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/166619" style="color:red;">http://lib.javaeye.com/blog/166619</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CAS 单点登录安装笔记4<br />--- asp.net client端的设置 <br /><br />1、首先修改web.Config文件，加入以下设置：<br /><pre name="code" class="xml">
&lt;authentication mode="Forms" >
  &lt;forms name="casauth" loginUrl="login.aspx" />
&lt;/authentication>
&lt;authorization>
  &lt;deny users="?" />
&lt;/authorization>
</pre><br />本人对.net不是很熟悉，感觉这里的配置类似java web应用程序中的过滤器，当用户访问web页时首先跳转到login.aspx页面进行验证。<br /><br />2、加入以下c#代码到login.aspx页面的加载事件中：<br /><pre name="code" class="c#">
    //CAS 身份验证 服务器地址
    private const string CASHOST = "https://sso.gzps.net:8443/cas/";

    protected void Page_Load(object sender, EventArgs e)
    {
        System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();

        // Look for the "ticket=" after the "?" in the URL
          string tkt = Request.QueryString["ticket"];

          // This page is the CAS service=, but discard any query string residue
          string service = Request.Url.GetLeftPart(UriPartial.Path);

          // First time through there is no ticket=, so redirect to CAS login
          if (tkt == null || tkt.Length == 0)
          {
            string redir = CASHOST + "login?" +
              "service=" + service;
            Response.Redirect(redir);
            return;
          }

          // Second time (back from CAS) there is a ticket= to validate
          string validateurl = CASHOST + "serviceValidate?" +
            "ticket=" + tkt + "&"+
            "service=" + service;
          StreamReader Reader = new StreamReader( new WebClient().OpenRead(validateurl));
          string resp = Reader.ReadToEnd();
          // I like to have the text in memory for debugging rather than parsing the stream

          // Some boilerplate to set up the parse.
          NameTable nt = new NameTable();
          XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
          XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
          XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);

          string netid = null;

          // A very dumb use of XML. Just scan for the "user". If it isn't there, its an error.
          while (reader.Read())
          {
            if (reader.IsStartElement()) {
              string tag = reader.LocalName;
              if (tag=="user")
                netid = reader.ReadString();
            }
          }
          // if you want to parse the proxy chain, just add the logic above
          reader.Close();
          // If there was a problem, leave the message on the screen. Otherwise, return to original page.
          if (netid == null)
          {
            Label1.Text = "CAS returned to this application, but then refused to validate your identity.";
          }
          else
          {
              Session["UserName"] = netid;
            Label1.Text = "Welcome " + netid;
            FormsAuthentication.RedirectFromLoginPage(netid, false); // set netid in ASP.NET blocks
          }

    }
}
</pre><br /><br />以上代码参照了ja-sig网站的解决方案：<a href="http://www.ja-sig.org/wiki/display/CASC/ASP.NET+Forms+Authentication" target="_blank">http://www.ja-sig.org/wiki/display/CASC/ASP.NET+Forms+Authentication</a><br /><br />3、以为这样就可以了，运行时可以跳到sso服务器进行验证，但跳转以后报以下错误：<br />" System.Net.WebException。 基础连接已关闭。 无法建立与远程服务器信任关系 "。<br />应该与CAS Server端安装了数字证书，而.net Client端并没有安装相应的证书有关。<br />可以通过<a href="http://hi.baidu.com/wjmd521/blog/item/d0244e60edc9a045ebf8f898.html" target="_blank">配置IIS服务器，支持HTTPS SSL协议实现安全数据交换</a>中介绍的步骤导入CAS 服务端的数字证书,或者通过<a href="http://support.microsoft.com/kb/823177/" target="_blank">http://support.microsoft.com/kb/823177/</a>上介绍的解决方案进行处理：<br />实现类<br /><pre name="code" class="c#">
using System.Net;
using System.Security.Cryptography.X509Certificates;

public class MyPolicy : ICertificatePolicy {
    public bool CheckValidationResult(
          ServicePoint srvPoint
        , X509Certificate certificate
        , WebRequest request
        , int certificateProblem) {

        //Return True to force the certificate to be accepted.
        return true;

    } // end CheckValidationResult
} // class MyPolicy

</pre><br />客户端代码中包含下列代码：<br /><pre name="code" class="#c">
   System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
</pre><br /><br />所有代码见附件WebSite.rar,将其部署到你的IIS服务器就可以了。<br />关于IIS服务器的设置见<a href="http://tech.163.com/special/00091PDS/aspnet.html" target="_blank">asp.net一夜速成教程</a>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/166619#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 02 Mar 2008 11:51:45 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/166619</link>
        <guid>http://lib.javaeye.com/blog/166619</guid>
      </item>
      <item>
        <title>CAS 单点登录安装笔记3 -- 与acegi集成</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/165980" style="color:red;">http://lib.javaeye.com/blog/165980</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CAS 单点登录安装笔记3<br />-- 与acegi集成<br /><br />在我的项目中应用了acigi安全框架,以下是结合yale cas单点登录系统进行的相关配置<br /><pre name="code" class="xml">

 &lt;!-- =========  Acegi as a CAS Client的配置============= --> 
	&lt;bean id="authenticationProcessingFilter"
		class="org.acegisecurity.ui.cas.CasProcessingFilter">
		&lt;property name="authenticationManager"
			ref="authenticationManager" />
		&lt;property name="authenticationFailureUrl"
			value="/login.do?login_error=1" />
		&lt;property name="defaultTargetUrl" value="/main.do" />
		
        &lt;property name="filterProcessesUrl">
            &lt;value>/j_acegi_cas_security_check&lt;/value>
        &lt;/property>		

		&lt;property name="rememberMeServices" ref="rememberMeServices" />
		&lt;property name="exceptionMappings">
            &lt;value>
				org.acegisecurity.AuthenticationServiceException=/login.do?login_error=user_not_found_error
				org.acegisecurity.BadCredentialsException=/login.do?login_error=user_psw_error
				org.acegisecurity.concurrent.ConcurrentLoginException=/login.do?login_error=too_many_user_error
				org.acegisecurity.DisabledException=/login.do?login_error=disabled_user_error
            &lt;/value>
        &lt;/property> 		
	&lt;/bean>	
	 
    &lt;bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
        &lt;property name="authenticationEntryPoint">
            &lt;ref local="casProcessingFilterEntryPoint"/>
        &lt;/property>
		&lt;property name="accessDeniedHandler">
			&lt;bean
				class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
				&lt;property name="errorPage"
					value="/errors/accessDenied.jsp" />
			&lt;/bean>
		&lt;/property>        
    &lt;/bean>
    
   &lt;!-- cas config -->
    &lt;bean id="casProcessingFilterEntryPoint" class="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint">
        &lt;property name="loginUrl">&lt;value>https://sso.gzps.net:8443/cas/login&lt;/value>&lt;/property>
        &lt;property name="serviceProperties">&lt;ref local="serviceProperties"/>&lt;/property>
    &lt;/bean>
    
    &lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
        &lt;property name="providers">
            &lt;list>
                &lt;ref local="casAuthenticationProvider"/>
            &lt;/list>
        &lt;/property>
    &lt;/bean>
    
    &lt;bean id="casAuthenticationProvider" class="org.acegisecurity.providers.cas.CasAuthenticationProvider">
        &lt;property name="casAuthoritiesPopulator">&lt;ref bean="casAuthoritiesPopulator"/>&lt;/property>
        &lt;property name="casProxyDecider">&lt;ref local="casProxyDecider"/>&lt;/property>
        &lt;property name="ticketValidator">&lt;ref local="casProxyTicketValidator"/>&lt;/property>
        &lt;property name="statelessTicketCache">&lt;ref local="statelessTicketCache"/>&lt;/property>
        &lt;property name="key">&lt;value>my_password_for_this_auth_provider_only&lt;/value>&lt;/property>
    &lt;/bean>
    &lt;bean id="casProxyTicketValidator" class="org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator">
        &lt;property name="casValidate">&lt;value>https://sso.gzps.net:8443/cas/proxyValidate&lt;/value>&lt;/property>
        &lt;property name="serviceProperties">&lt;ref local="serviceProperties"/>&lt;/property>
    &lt;/bean>
    &lt;!-- 
    &lt;bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.AcceptAnyCasProxy" />
    -->
    &lt;bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.RejectProxyTickets" />
    
    &lt;bean id="serviceProperties" class="org.acegisecurity.ui.cas.ServiceProperties">
        &lt;property name="service">
            &lt;value>http://localhost:8080/aio/j_acegi_cas_security_check&lt;/value>
        &lt;/property>
        &lt;property name="sendRenew">
            &lt;value>false&lt;/value>
        &lt;/property>
    &lt;/bean>
    
    &lt;bean id="statelessTicketCache" class="org.acegisecurity.providers.cas.cache.EhCacheBasedTicketCache">
        &lt;property name="cache">
            &lt;bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
                &lt;property name="cacheManager">
                    &lt;bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
                &lt;/property>
                &lt;property name="cacheName" value="userCache"/>
            &lt;/bean>
        &lt;/property>
    &lt;/bean>
    
    &lt;bean id="casAuthoritiesPopulator" class="org.acegisecurity.providers.cas.populator.DaoCasAuthoritiesPopulator">
        &lt;property name="userDetailsService">&lt;ref local="userDetailsService"/>&lt;/property>
    &lt;/bean>

    &lt;bean id="casProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter">
        &lt;property name="authenticationManager">&lt;ref local="authenticationManager"/>&lt;/property>
        &lt;property name="authenticationFailureUrl">&lt;value>/casfailed.jsp&lt;/value>&lt;/property>
        &lt;property name="defaultTargetUrl">&lt;value>/&lt;/value>&lt;/property>
        &lt;property name="filterProcessesUrl">&lt;value>/j_acegi_cas_security_check&lt;/value>&lt;/property>
    &lt;/bean>
    
    
    &lt;!-- ======================================================= -->

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/165980#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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 23:38:36 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/165980</link>
        <guid>http://lib.javaeye.com/blog/165980</guid>
      </item>
      <item>
        <title>CAS 单点登录安装笔记2 -- 配置CAS,访问自己的用户表</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/165538" style="color:red;">http://lib.javaeye.com/blog/165538</a>&nbsp;
          发表时间: 2008年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CAS 单点登录安装笔记2<br /><br /><br />1.修改cas/webapp/WEB-INF/deployerConfigContext.xml<br />加入以下定义:<br /><pre name="code" class="xml">
	&lt;!-- 数据源定义 -->
    &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
		&lt;property name="driverClassName" value="${db.driver}" />
		&lt;property name="url" value="${db.url}" />
		&lt;property name="username" value="${db.username}" />
		&lt;property name="password" value="${db.password}" />       
    &lt;/bean>
	&lt;!-- 
	　　　passwordEncoder　使用Md5算法加密 
	-->
	&lt;bean id="passwordEncoder"
		class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">   
		&lt;constructor-arg value="MD5"/>
	&lt;/bean>
</pre><br /><br />2.屏蔽原有验证方法:<br /><pre name="code" class="xml">
				&lt;!-- 
				&lt;bean
					class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
				 -->
</pre><br /><br />3.加入通过访问数据库进行验证的handler:<br /><pre name="code" class="xml">
				&lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                    &lt;property name="sql" value="select password from CORE_USERS where logid=?" />
                    &lt;property name="passwordEncoder" ref="passwordEncoder"/>
                    &lt;property name="dataSource" ref="dataSource" />
                &lt;/bean>	
</pre><br /><br />4.修改cas\webapp\WEB-INF\cas.properties,定义数据库连接资源,本例子是连接的oracle数据库<br /><pre name="code" class="properties">
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc\:oracle\:thin\:@192.168.1.1\:1521\:xxxx
db.username=xxxx
db.password=xxxx
</pre><br /><br />5.增加相关jar包到cas\webapp\WEB-INF\lib\目录下:<br />cas-server-support-jdbc-3.2.jar (cas连接数据库的支持包)<br />ojdbc14.jar (连接oracle数据的jdbc驱动程序)
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/165538#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Feb 2008 17:45:57 +0800</pubDate>
        <link>http://lib.javaeye.com/blog/165538</link>
        <guid>http://lib.javaeye.com/blog/165538</guid>
      </item>
      <item>
        <title>CAS 单点登录安装笔记1 -- 基本设置与数字证书的安装</title>
        <author>jacally</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
          链接：<a href="http://lib.javaeye.com/blog/165196" style="color:red;">http://lib.javaeye.com/blog/165196</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          安装JA-SIG SSO系统笔记1<br /><br />(关于配置访问数据库的用户表见<a href="http://lib.javaeye.com/blog/165538" target="_blank">安装JA-SIG SSO系统笔记2</a>)<br />(与acegi结合配置见<a href="http://lib.javaeye.com/blog/165980" target="_blank">安装JA-SIG SSO系统笔记3</a>)<br />(ASP.NET client端的设置见<a href="http://lib.javaeye.com/blog/166619" target="_blank">安装JA-SIG SSO系统笔记4</a>)<br /><br />ps:配置中的文件路径根据自己的实际情况的设定<br /><br />1.安装JA-SIG 到 TOMCAT;<br />JA-SIG下载地址:<br /><a href="http://www.ja-sig.org/products/cas/downloads/index.html" target="_blank">http://www.ja-sig.org/products/cas/downloads/index.html</a><br /><br />2.生成数字证书,见批处理文件"cas 生成数字证书.bat";<br /><br />3.配置Tomcat的HTTPS服务,修改server.xml<br /><pre name="code" class="xml">
		&lt;Connector protocol="org.apache.coyote.http11.Http11Protocol"
           port="8443" minSpareThreads="5" maxSpareThreads="75"
           enableLookups="true" disableUploadTimeout="true" 
           acceptCount="100"  maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="C:/Documents and Settings/Administrator/.keystore" keystorePass="changeit"
           truststoreFile="D:/Java/jdk1.6.0_02/jre/lib/security/cacerts"
           clientAuth="false" sslProtocol="TLS"/>
</pre><br /><br />4.导出 SERVER 的证书，用来给所有需要用到的客户端导入,见"导出 cas 数字证书.bat"<br /><br />5.在客户端的 JVM 里导入信任的 SERVER 的证书 ( 根据情况有可能需要管理员权限 ),见"导入 cas 证书.bat"；<br /><br />5.修改客户端服务程序,加入cas过滤器,修改web.xml<br /><pre name="code" class="xml">
	&lt;!-- CAS -->
	&lt;filter>
	 &lt;filter-name>CAS Filter&lt;/filter-name>
	 &lt;filter-class>edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class>
	 &lt;init-param>
	  &lt;param-name>edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name>
	  &lt;param-value>https://sso.gzps.net:8443/cas/login&lt;/param-value>
	 &lt;/init-param>
	 &lt;init-param>
	  &lt;param-name>edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name>
	  &lt;param-value>https://sso.gzps.net:8443/cas/serviceValidate&lt;/param-value>
	 &lt;/init-param>
	 &lt;init-param>
	  &lt;param-name>edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name>
	  &lt;param-value>88.148.29.54:8080&lt;/param-value>
	 &lt;/init-param>
	&lt;/filter>
	&lt;filter-mapping>
		&lt;filter-name>CAS Filter&lt;/filter-name>
		&lt;url-pattern>/*&lt;/url-pattern>
	&lt;/filter-mapping>	

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lib.javaeye.com/blog/165196#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adver