关于Flex

Adobe Flex是一套创建富客户端应用(RIAs)的框架.Flex生成的swf文件可以直接运行在Flash Player之中。相比较基于时间轴的Flash开发,Flex框架更适合那些用传统方式开发应用程序的开发人员。Flex应用可以使用Flex builder来开发。这套IDE是基于Eclipse平台开发的。Action

 

关于Spring

Spring是目前最受欢迎的创建企业级应用的Java框架。不像传统的J2EE开发,Spring提供了轻量级的容器。使用Spring会使应用的测试和开发更为简单。虽然Spring依赖注入的功能最出名,但是它也提供了其他服务端企业程序所需要的功能。如安全和事务处理。

 

为什么使用Flex和Spring

Flex技术本身和Java就有很强的关联性,它提供了一个基于Eclipse的IDE和BlazeDS.BlazeDS是个基于服务端的Java远程调用和Web消息的一个开源的技术。有许多应用都是以Java为后端处理的。Flex用于前端。由于Java和Flex一起频繁的使用。人们很容易就想到Flex和Spring的整合。有许多企业和组织已经着手开始使用Flex作为用户接口了。在2008年末,Spring社区已经着手Spring BlazeDS整合的项目。为Java和Spring添加更好的Flex支持。

 

默认的情况下BlazeDS创建了一个服务端Java对象的实例,用它们来完成远程对象的请求。但是这种方法并不适用于Spring.因为整个框架使用的服务的对象都是用Spring容器所创建的。Spring和BlazeDS的整合,Flex就可以使用Spring中的对象了。

 

整合Flex和Spring

为了使用BlazeDS,服务端的Java应用应打包为WAR文件。这部分的代码实例是使用Eclipse来创建和编辑的。步骤如下

 

  • 设置服务端的BlazeDS Java工程以及Spring框架。
  • 在BlazeDS中配置Spring的bean
  • 写一个Flex应用去使用Spring/BlazeDS的服务。


所需要的开发环境如下

  • Eclipse3.4(J2EE版本):http://www.eclipse.org/downloads/
  • Flex Builder3:http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email&sdid=EOZPI
  • Tomcat 6:http://tomcat.apache.org/
  • BlazeDS:http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/
  • Spring框架:http://www.springsource.org/download
  • Spring BlazeDS整合:http://www.springsource.org/spring-flex
  • ANTLR3.0:http://www.antlr.org/download.html


首先设置服务端的JAVA工程,用blazeds.war(在blazeds的压缩包中)创建一个WEB工程。步骤如下


  • Choose File>import
  • 选择WAR选项。指定blazedsWAR文件的位置。输入工程名test-server
  • 点击完成

现在就可以创建一个服务器来运行这个WEB应用。


  • File>New>Other
  • 选择Server>Server
  • 点击Next
  • 选择Apache>Tomcat6 Server
  • 点击Next
  • 指定Tomcat的安装位置以及JRE(5以上版本)
  • 点击Next
  • 在Availble Projects list中选择test-server
  • 点击Add添加到Configured Project list
  • 点击Finish

接下来就可以创建Java类了。这个类在Java和Flex之间传输


Java代码


1. public class
2. private
3. private
4. private
5.     
6. public
7. return
8.  }   
9. public void
10. this.frstName = frstName;   
11.  }   
12. public
13. return
14.  }   
15. public void
16. this.lastName = lastName;   
17.  }   
18. public
19. return
20.  }   
21. public void
22. this.emailAddress = emailAddress;   
23.  }   
24. }


public class MyEntity {
 private String frstName;
 private String lastName;
 private String emailAddress;
 
 public String getFirstName() {
  return frstName;
 }
 public void setFirstName(String frstName) {
  this.frstName = frstName;
 }
 public String getLastName() {
  return lastName;
 }
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 public String getEmailAddress() {
  return emailAddress;
 }
 public void setEmailAddress(String emailAddress) {
  this.emailAddress = emailAddress;
 }
}


Java服务接口

Java代码


1. import
2. public interface
3. public
4. }


import java.util.List;
public interface MyService {
 public List<MyEntity> getMyEntities();
}


 


Java服务的实现


Java代码



    1. import
    2. import
    3. public class MyServiceImpl implements
    4. public
    5. new
    6. new
    7. "Hello");     
    8. "World");     
    9. "hello@world.com");     
    10.   list.add(entity);     
    11. new
    12. "Hello");     
    13. "Space");     
    14. "hello@space.com");     
    15.   list.add(entity2);     
    16. new
    17. "Hello");     
    18. "Neighbor");     
    19. "hello@neighbor.com");     
    20.   list.add(entity3);     
    21. return
    22.  }     
    23. }



    import java.util.ArrayList;  
    import java.util.List;  
    public class MyServiceImpl implements MyService {  
     public List<MyEntity> getMyEntities() {  
      List<MyEntity> list = new ArrayList<MyEntity>();  
      MyEntity entity = new MyEntity();  
      entity.setFirstName("Hello");  
      entity.setLastName("World");  
      entity.setEmailAddress("hello@world.com");  
      list.add(entity);  
      MyEntity entity2 = new MyEntity();  
      entity2.setFirstName("Hello");  
      entity2.setLastName("Space");  
      entity2.setEmailAddress("hello@space.com");  
      list.add(entity2);  
      MyEntity entity3 = new MyEntity();  
      entity3.setFirstName("Hello");  
      entity3.setLastName("Neighbor");  
      entity3.setEmailAddress("hello@neighbor.com");  
      list.add(entity3);  
      return list;  
     }  
    }



    这三个类对于例子足够了。在实战中,这个服务类可能要连接到数据库。为了方便我们学习,这个例子中就返回的是个list的硬编码了。



    基本的java工程算是完工了。。



    接下来我们要做Spring的配置了。


    • 把Spring的库以及Spring BlazeDS整合的库,还有ANTLR库文件放到项目/WEB-INF/lib下。
    • 创建一个Spring配置文件。鼠标右键点击WebContent/WEB-INF以及选择New>File,文件名输入application-config.xml.点击完成。配置文件内容如下。


    Xml代码



      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <beans xmlns="http://www.springframework.org/schema/beans"
      3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4. xsi:schemaLocation="     
      5.  http://www.springframework.org/schema/beans     
      6. >
      7. <!-- Spring Beans’s -->
      8.  <bean id="myService" class="MyServiceImpl" />
      9. </beans>    
       
       
      <?xml version="1.0" encoding="UTF-8"?>  
      <beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="  
       http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
       <!-- Spring Beans’s -->  
       <bean id="myService" class="MyServiceImpl" />  
      </beans>


      懂Spring的人看这配置最熟悉不过了。。



      通过这一步,已经有了一个BlazeDS默认配置的Java web工程。下面我们就更改BlazeDS默认配置,去使用新创建的Spring中的bean.



      为了配置Spring BlazeDS的整合,更新web.xml。


      Xml代码



      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      5. id="WebApp_ID" version="2.5">
      6.     <display-name>test-server</display-name>  
      7.     <servlet>  
      8.         <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>  
      9.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
      10.         <init-param>  
      11.             <param-name>contextConfigLocation</param-name>  
      12.             <param-value>/WEB-INF/application-config.xml</param-value>  
      13.         </init-param>  
      14.         <load-on-startup>1</load-on-startup>  
      15.     </servlet>  
      16. <!-- Map /spring/* requests to the DispatcherServlet -->
      17.     <servlet-mapping>  
      18.         <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>  
      19.         <url-pattern>/spring/*</url-pattern>  
      20.     </servlet-mapping>  
      21. </web-app>


      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      	id="WebApp_ID" version="2.5">
      	<display-name>test-server</display-name>
      	<servlet>
      		<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
      		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      		<init-param>
      			<param-name>contextConfigLocation</param-name>
      			<param-value>/WEB-INF/application-config.xml</param-value>
      		</init-param>
      		<load-on-startup>1</load-on-startup>
      	</servlet>
      	<!-- Map /spring/* requests to the DispatcherServlet -->
      	<servlet-mapping>
      		<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
      		<url-pattern>/spring/*</url-pattern>
      	</servlet-mapping>
      </web-app>


      创建的Servlet可以处理这个请求,http://localhost:8080/test-server/spring


      这是访问BlazeDS的基本的URL。当然这也是Spring标准的DispatcherServlet.



      现在已经把Spring整合到Java web工程中了。要整合BlazeDS,就要修改下Spring的配置文件。


      application-config.xml文件如下


      Xml代码



        1. <?xml version="1.0" encoding="UTF-8"?>
        2. <beans xmlns="http://www.springframework.org/schema/beans"
        3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        4. xmlns:flex="http://www.springframework.org/schema/flex"
        5. xsi:schemaLocation="   
        6.  http://www.springframework.org/schema/beans   
        7.  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
        8.  http://www.springframework.org/schema/flex   
        9. >
        10. <!-- Spring Beans’s -->
        11.  <bean id="myService" class="MyServiceImpl" />
        12. <!-- Simplest possible message broker -->
        13.  <flex:message-broker/>  
        14. <!-- exposes myService as BlazeDS destination -->
        15.  <flex:remoting-destination ref="myService" />
        16. </beans>



        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:flex="http://www.springframework.org/schema/flex"
         xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
         http://www.springframework.org/schema/flex
         http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">  
         <!-- Spring Beans’s -->
         <bean id="myService" class="MyServiceImpl" />
         <!-- Simplest possible message broker --> 
         <flex:message-broker/>
          <!-- exposes myService as BlazeDS destination -->
         <flex:remoting-destination ref="myService" />
        </beans>




        remoting-destination标签使Spring bean变为远程目标。



        接下来修改默认的BlazeDS service-config.xml文件。代码如下


        Xml代码


        1. <?xml version="1.0" encoding="UTF-8"?>
        2. <services-config>  
        3.     <services>  
        4.         <default-channels>  
        5.             <channel ref="my-amf" />
        6.         </default-channels>  
        7.     </services>  
        8.     <channels>  
        9.         <channel-definition id="my-amf"
        10. class="mx.messaging.channels.AMFChannel">
        11.             <endpoint  
        12. url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf"
        13. class="flex.messaging.endpoints.AMFEndpoint" />
        14.         </channel-definition>  
        15.         <channel-definition id="my-polling-amf"
        16. class="mx.messaging.channels.AMFChannel">
        17.             <endpoint  
        18. url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amfpolling"
        19. class="flex.messaging.endpoints.AMFEndpoint" />
        20.             <properties>  
        21.                 <polling-enabled>true</polling-enabled>  
        22.                 <polling-interval-seconds>4</polling-interval-seconds>  
        23.             </properties>  
        24.         </channel-definition>  
        25.     </channels>  
        26. </services-config>


        <?xml version="1.0" encoding="UTF-8"?>
        <services-config>
        	<services>
        		<default-channels>
        			<channel ref="my-amf" />
        		</default-channels>
        	</services>
        	<channels>
        		<channel-definition id="my-amf"
        			class="mx.messaging.channels.AMFChannel">
        			<endpoint
        				url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf"
        				class="flex.messaging.endpoints.AMFEndpoint" />
        		</channel-definition>
        		<channel-definition id="my-polling-amf"
        			class="mx.messaging.channels.AMFChannel">
        			<endpoint
        				url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amfpolling"
        				class="flex.messaging.endpoints.AMFEndpoint" />
        			<properties>
        				<polling-enabled>true</polling-enabled>
        				<polling-interval-seconds>4</polling-interval-seconds>
        			</properties>
        		</channel-definition>
        	</channels>
        </services-config>



        看一下 endpoint标签的的url.唯一可以修改的就是content.root之后的spring.所有远程目标配置都应该配置在application-config.xml文件中。



        现在我们完成了Spring/BlazeDS Java应用。可以启动Tomcat来查看配置是否出错。



        接下来我们就可以新建一个Flex来远程调用Spring服务。步骤如下


        • File>New>Other
        • 选择Flex Project
        • 填写工程名称test-flex
        • 用默认的地址
        • 选择Web application(运行在Flash player)
        • Application Type 选择None
        • 点击Next
        • 指定Output的文件夹。如   C:/workspace/test-server/WebContent/
        • 点击Finish


        工程创建完毕,我们会看到一个main.mxml的文件。修改代码如下


        Xml代码


        1. <?xml version="1.0" encoding="utf-8"?>
        2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        3. layout="absolute"
        4. creationComplete="srv.getMyEntities()">
        5.     <mx:AMFChannel id="myamf" uri="/test-server/spring/messagebroker/amf"/>
        6.  <mx:ChannelSet id="channelSet" channels="{[myamf]}"/>
        7.  <mx:RemoteObject id="srv"
        8. destination="myService" channelSet="{channelSet}"/>
        9.  <mx:DataGrid dataProvider="{srv.getMyEntities.lastResult}"/>
        10. </mx:Application>  
         
         
        <?xml version="1.0" encoding="utf-8"?>
        <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
        	layout="absolute" 
        	creationComplete="srv.getMyEntities()">
        	<mx:AMFChannel id="myamf" uri="/test-server/spring/messagebroker/amf"/>  
         <mx:ChannelSet id="channelSet" channels="{[myamf]}"/>  
         <mx:RemoteObject id="srv" 
           destination="myService" channelSet="{channelSet}"/>  
         <mx:DataGrid dataProvider="{srv.getMyEntities.lastResult}"/>
        </mx:Application>


        以上代码的AMFChannel访问了Spring的服务。


        destination要和spring的application-config.xml中remote-service标签的ref所设置的值保持一致。通过代码可以看出Flex并没有包含关于Spring的东西。编写Flex的


        开发人员不必知道关于Spring的知识。



        要更新test-server的程序。可以Refresh这个工程。