`
lijingyao8206
  • 浏览: 219305 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

iBATIS&Spring合奏(二)--Flex前端融合

阅读更多
    iBatis和Spring的进度依然如昨。回馈社区的时间到了,今天是Flex的时间。以前用Java+Flex做一般用LCDS的dataservice组件,其实就是偷懒。因为最近研究了下Spring+iBATIS,也是出于项目需要,决定勤奋一回,用LCDS的RPC服务吧。RPC在FlexLCDS中支持三种服务——WebService,HttpService以及本文用的RemotingObject。LCDS官方文档是一手资料,虽然没人翻译,依然一个人孤独和单词作战到底吧。依然用比较清晰的思路和模式为童鞋们呈现集成环境下开发一下简单web程序的过程。另,最近总是看到分布式之类的讨论,RPC也是一种分布式技术啊,后面再加上SpringAOP中管理MemCache也蛮好。不多扯了,越扯越跑题……
     1)前面的可以参看上一篇文章。这里要注意的是搭建集成环境myeclipse+flexbuilder。为了大家不走弯路,myeclipse7.0以后不支持Flex插件啦,可以下载插件版的flexbuilder也可以。我用的是老版(myeclipse6.5+flexbuilder3.0)若说,不用什么集成开发环境也一样,只是懒得开两个编译器,反正都是Web程序,都要部署滴嘛。tomcat6.x。spring,ibatis随便啦。
     2)配置RemotingObject——remoting-config.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
	class="flex.messaging.services.RemotingService">
	<adapters>
		<adapter-definition id="java-object"
			class="flex.messaging.services.remoting.adapters.JavaAdapter"
			default="true" />
	</adapters>
	<default-channels>
		<channel ref="my-amf"/>
	</default-channels>
	
	<destination id="userservice">
		<properties>
			<source>com.qiyun.spritis.service.UserService</source>
			<scope>application</scope>
		</properties>
	</destination>
	
</service>

     以上的路径就指向需要调用的服务器端的服务。当然了解的童鞋知道,底层也是用序列化反序列化来实现的。这里UserService要extends AbstractAssembler。这里有个装配器的概念,可以参看官方文档解释。
      3)值对象ValueObject与持久化对象PersistenceObject的遥相呼应
      这里简单提一下,RemotingObject指的是服务器端的要请求服务的对象。大家可以理解为javaRMI服务中的 服务器存根(stub)。而VO啦就是与PO相对应的客户端对象。序列化也得告诉人家传神马对象吧。VO如下,在Flex的src下,其实就是个ActionScriptClass。源码如下:
package vo
{
	[Bindable]
	[RemoteClass(alias="com.qiyun.spritis.pojo.User")]
	public class User
	{
		public function User()
		{
		}
		
		
		public var id:int;
		public var username:String;
		public var password:String;
		public var company:String;

	}
}

     4)Flex强有力的MXML客户端界面。这里可以看到,调用远程对象的方法是非常容易的一件事情。这里的消息协议采用的是服务自带的amf。基于http轮询建立的。当然可以采用nio的相关协议,可以在配置文件中修改协议。还有这里的Channel配置必不可少。这里多一句,LCDS的四大项服务——Remoting,Messaging,DataService,Proxy都是基于Messaging的。换句话说,只是实现方式不同,但是底层都是通过调用Messaging服务来实现的。所以有兴趣的可以先了解下Messaging,可以自己写通信协议,木有问题。这里不介绍那方面的了。至于DataService就是以前用的比较多的,前面几篇文章有提到。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    backgroundGradientColors="[0x000000,0x323232]"  >
    <mx:Script>
        <![CDATA[
        	import vo.User;
        	import mx.collections.ArrayCollection;
        	import mx.rpc.events.ResultEvent;
        	import mx.rpc.events.FaultEvent;
        	import mx.utils.ArrayUtil;
            import mx.controls.Alert;
            [Bindable]
            private var users:ArrayCollection;
            [Bindable]
            private var myUser:User=new User();
            
            private function selectedDGrid():void{
            	userName.text=userdg.selectedItem.username;
            	password.text=userdg.selectedItem.password;
            	company.text=userdg.selectedItem.company;
            }
            
            private function getAllUsers_resultHandler(event:ResultEvent):void
            {
                users = event.result as ArrayCollection;
            }
            
            private function getUserByCompanyName_resultHandler(event:ResultEvent):void
            {
                users = event.result as ArrayCollection;
            }
            
            private function insertUser():void{
            	 myUser.username=userName.text;
             	 myUser.password=password.text;
             	 myUser.company=company.text;
             	 user.insertUser(myUser);
             	 Alert.show("save a user named : "+userName.text,"SAVE!");
            }
            
            
            private function updateUser():void{
                 var uu:User=userdg.selectedItem as User;
            	 uu.username=userName.text;
             	 uu.password=password.text;
             	 uu.company=company.text;
             	 user.updateUser(uu);
             	 Alert.show("update a user!","UPDATE!");
            }
            
            private function deleteUser():void{
            	 user.deleteUser(userdg.selectedItem.id);
            	 Alert.show("delete a user named : "+userdg.selectedItem.username,"DELETE!");
            }
            

            private function faultHandler(event:FaultEvent):void
            {
                Alert.show(event.fault.faultString, "Error");
            }
            
           
        ]]>
    </mx:Script>
   <mx:RemoteObject  id="user" destination="userservice"  channelSet="{channelSet}" fault="faultHandler(event)" source="com.qiyun.spritis.pojo.User">
        <mx:method name="getAllUsers" result="getAllUsers_resultHandler(event)"/>
        <mx:method name="getUserByCompanyName" result="getUserByCompanyName_resultHandler(event)">
            <mx:arguments>
                <arg1> {companies.selectedItem.data}</arg1>
            </mx:arguments>
        </mx:method>
        <mx:method name="updateUser" >
        <mx:arguments>
        	<arg1>
        		{myUser}
        	</arg1>
        </mx:arguments> 
        </mx:method>
        <mx:method name="insertUser">
        <mx:arguments>
        	<arg1>
        		{myUser}
        	</arg1>
        </mx:arguments> 
        </mx:method>
        <mx:method name="deleteUser" >
        <mx:arguments>
        	<arg1>
        		{userdg.selectedItem.id}
        	</arg1>
        </mx:arguments> 
        </mx:method>
        
    </mx:RemoteObject>
   <mx:ChannelSet id="channelSet">
        <mx:AMFChannel id="amfChannel" url="http://localhost:8080/spritis/messagebroker/amf" />
    </mx:ChannelSet>
    
   <mx:DataGrid id="userdg" itemClick="selectedDGrid()" editable="false"  dataProvider="{users}" width="100%" height="100%">
        <mx:columns >
        	<mx:DataGridColumn dataField="id" headerText="id"/>
            <mx:DataGridColumn dataField="username" headerText="username"/>
            <mx:DataGridColumn dataField="password" headerText="password"/>
            <mx:DataGridColumn dataField="company" headerText="company" textAlign="right"/>
        </mx:columns>
    </mx:DataGrid>
	<mx:HBox>
   		<mx:Button label="Get All Users" click="user.getAllUsers()"/> 
    	<mx:Button label="Get User By CompanyName" 
             click="user.getUserByCompanyName(companies.selectedItem.data);"/>
    	<mx:ComboBox id="companies" width="150" text="company" >
    	  <mx:dataProvider>
           <mx:ArrayCollection>
                <mx:source>
                    <mx:Object label="TB" data="TB"/>
                    <mx:Object label="IBM" data="IBM"/>
                    <mx:Object label="alibaba" data="alibaba"/>
                    <mx:Object label="MS" data="MS"/>
                    <mx:Object label="TX" data="TX"/>
                </mx:source>
            </mx:ArrayCollection>
          </mx:dataProvider>
   		</mx:ComboBox>
   </mx:HBox>
   <mx:Panel title="Add User" >
    	 <mx:Form id="myForm" color="black" >
            <mx:FormItem label="username:">
                <mx:TextInput  id="userName" width="100"/>
            </mx:FormItem>
             <mx:FormItem label="password:">
                <mx:TextInput id="password" color="black" width="100" /> 
            </mx:FormItem>
            <mx:FormItem label="company:">
                <mx:TextInput id="company"  width="100" /> 
            </mx:FormItem>
            <mx:HBox>
               	 <mx:Button label="clear" click="userName.text='';password.text='';company.text=''"/>
               	 <mx:Button label="Save"  click="insertUser();user.getAllUsers()"/> 
               	 <mx:Button label="Delete"  click="deleteUser();user.getAllUsers()"/> 
               	 <mx:Button label="Update"  click="updateUser();user.getAllUsers()"/>   
               </mx:HBox>
        </mx:Form>
   </mx:Panel>
    
</mx:Application>

     5)在这里,我想说,就是部署服务了。然后运行吧。弄点效果图吧,今天没有兴致写神马界面,只为简单介绍吧。主界面如下:


下面这张是添加User的小图



     总算写完收工。坐得腰疼……程序员真的是短寿又令人激动的职业。我只能说,不能怪代码了,该去运动一下,少吃夜宵和零食。生活在世界上很美好,不是因为世界有多美好而是因为我们活着,活着就会有好事发生,就要珍惜和感激。
       下面依旧一段猿类们的冷笑话,轻松一下氛围:
       孩子哭闹的时候就在边上打开吸尘器,然后拍小孩的背,一会儿小孩子就睡着了,理论依据是小孩子最多同时关注2件事情,如果有三件事情需要同时关注,他就只能睡觉了…结论:所有小孩都是单核处理器,一旦多线程,就自动挂起..——这爹是个程序员
      (把源码spritis奉上吧,果真加了Flex就是大了不少。WebContent\WEB-INF\lib里面的jar包麻烦大家自己搞定吧实在超过10M啦)
  • 大小: 38.2 KB
  • 大小: 116.1 KB
3
0
分享到:
评论

相关推荐

    iBATIS&Spring合奏(一)--DAO

    标题中的“iBATIS&Spring合奏(一)--DAO”指的是在Java开发中,将iBATIS和Spring框架结合使用来实现数据访问层(DAO)的一种技术整合。iBATIS是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,提供...

    apache开源项目源码ibatis-3-core-src-3.0.0.227(ibatis框架java源程序)

    spring,struts,hibernate,ibatis,框架源码 各种ibatis框架应用源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其优良的代码风格和高质量的源码是学习者难得的学习资料!

    mybaits-spring(ibatis-spring)-1.0.2-bundle

    《MyBatis-Spring整合详解及1.0.2版本剖析》 MyBatis-Spring是MyBatis和Spring框架的集成库,旨在简化在Spring应用中使用MyBatis的过程,实现两者的无缝连接。本篇文章将深入探讨MyBatis-Spring的核心功能,以及...

    ibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.zip

    ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip

    flex 整合 spring+struts2+ibatis - 乐的日志 - 网易博客.htm

    flex 整合 spring+struts2+ibatis - 乐的日志 - 网易博客.htm flex 整合 spring+struts2+ibatis - 乐的日志 - 网易博客.htm

    ibatis-3-core-3.0.0.200

    ibatis-3-core-3.0.0.200

    myeclipse热部署jrebel6.5.0

    亲测可用,资源下载到磁盘,然后打开myeclipse 路径为:Windows ---&gt; Perferences --&gt; MyEclipse --&gt;Servers --&gt;Tomcat --&gt;...-Drebel.ibatis-plugin--------热部署ibatis相关的jar

    myeclipse 插件热部署 jrebel6.5

    myeclipse 插件热部署 jrebel6.5 亲测可用,资源下载到磁盘,然后打开myeclipse 路径为:Windows ---&gt; Perferences --&gt; MyEclipse --&gt;...-Drebel.ibatis-plugin--------热部署ibatis相关的jar

    iBATIS-SqlMaps-2-Tutorial_cn.pdf

    iBATIS-SqlMaps-2-Tutorial_cniBATIS-SqlMaps-2-Tutorial_cn.pdf.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdf

    Ibatis基本配置---[环境搭建

    Ibatis基本配置---[环境搭建

    Spring-Struts-IBatis-AOP-Transaction

    在 "17-Prj-Spring-Struts-IBatis-AOP-Transaction" 这个项目中,这四个框架被集成在一起,形成一个强大的 web 应用开发解决方案。Spring 作为整个系统的基石,负责依赖注入和事务管理;Struts 2 处理 HTTP 请求,...

    spring-modules-0.9.zip

    在Java Web开发中,数据验证是必不可少的,Spring Modules提供了一个统一的验证层,使得开发者可以方便地在Spring应用中实现前端和后端的数据验证。它支持JSR-303/JSR-349(Bean Validation)规范,允许开发者定义...

    ibatis-3-core-3.0.0.227.z

    《深入解析iBatis 3.0.0.227核心框架》 iBatis,作为一款优秀的Java持久层框架,一直以来都是开发者们青睐的工具。本文将围绕"ibatis-3-core-3.0.0.227.z"这个压缩包,详细介绍其包含的元素以及相关的知识要点。 ...

    ibatis-3-core-3.0.0.204

    ibatis-3-core-3.0.0.204 最新官方下载版

    spring-framework-3.0.5.RELEASE-dependencies-1

    spring-framework-3.0.5.RELEASE-dependencies 好不容易找到了,赶紧分享一下 因为不能大于20M,共分了8个包,都是独立的,我列了目录,可以只下载需要的包,这是1号包: 1号包: edu.emory.mathcs.backport edu.oswego.cs....

    iBATIS-SqlMaps-2_cn.rar_ibatis/spring

    在Spring中配置iBATIS,开发者可以通过Spring的DataSource和TransactionManager来管理数据源和事务,同时,通过SqlSessionFactoryBean来创建SqlSessionFactory,进一步创建SqlSession,从而执行SQL操作。 此外,...

    spring-boot-starter-mybatis-spring-boot-2.2.0.zip

    《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的应用启动能力,已经成为主流的微服务框架。而MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和强大的DAO操作,深受...

    ibatis与spring整合

    ### ibatis与Spring框架整合详解 #### 一、ibatis简介 ibatis是一个开源的、基于Java的持久层框架,它提供了SQL映射的方式来进行数据库访问。与Hibernate等其他ORM框架相比,ibatis更加轻量级,对于那些只需要简单...

Global site tag (gtag.js) - Google Analytics