zoukankan      html  css  js  c++  java
  • SpringFlex框架搭建

    或者参考http://limingnihao.iteye.com/blog/830409使用Eclipse的Maven构建SpringMVC项目

    1.1 简单介绍

             Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
    BlazeDS 是一个基于服务器的 Java 远程控制 (remoting) 和 Web 消息传递 (messaging)技术,以LGPL(Lesser GNU Public License)公共许可证书发布。它能够使得后端的 Java 应用程序和运行在浏览器上的Adobe Flex 应用程序相互通信。在Java应用服务器上,它以servlet的形式存在, 因此可以在任何标准Java网络应用中运用它。
             Spring通过集成BlazeDS技术,使用AdobeFlex客户端技术整合福互联网的顶级解决方案。SpringFlex主要是Spring集成管理BlazeDS MessageBrober的技术。

     

    1.2 需要的软件包

            使用maven的pom.xml配置文件的方式,添加spring和spring-flex的jar包。
            不使用maven项目,可以将下面这些软件包中的jar包,配置成相应的User Library,然后添加到项目中。(由于是自行配置Spring环境,所以需要另外添加logging、aspectj等jar包)。

     

    spring-framework-3.0.3
    spring-flex-1.5.0.M1
    commons-httpclient-3.1
    commons-logging-1.1.1
    aopalliance
    asm-3.3
    aspectj-1.6.6
    cglib-2.2
    blazeds-turnkey-4.0.0


    1.3 搭建Spring环境

            首先把Spring最基本的环境搭建起来,包括SpringMVC框架。


    1.3.1新建java Web项目(带Maven)

    依次选择:File->new->Web Project。
    弹出下面对话框,填写相关信息。一路new。

    如下图:


     

     

    1.3.2加入Spring框架

    右键单击项目文件,选择MyEclipse->Add Spring Capabilities
    然后选择User Libraries。(这里我使用maven添加的Libraries,没有使用MyEclipse自带的)
    配置文件的路径和名称。Next。

    如图:


     

    1.3.3使用pom.xml添加jar包

     点击maven项目中的pom.xml文件,使用MyEclipse自带的maven pom编译器。
     选择Dependencies。点击左上方的Add开始搜索,然后添加jar包。或者手动写dependencies下的dependency标签。
     当我们添加一个jar包之后,就可以在Dependency Hierarchy视图上看到此包所依赖的jar包,一起引入到项目中。

    如图:
     

     

     

    1.3.4修改配置文件

    修改web.xml文件。添加字符过滤,以及dispatcher。

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    6.   
    7.     <!-- 字符集 过滤器  -->  
    8.     <filter>  
    9.         <filter-name>CharacterEncodingFilter</filter-name>  
    10.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    11.         <init-param>  
    12.             <param-name>encoding</param-name>  
    13.             <param-value>UTF-8</param-value>  
    14.         </init-param>  
    15.         <init-param>  
    16.             <param-name>forceEncoding</param-name>  
    17.             <param-value>true</param-value>  
    18.         </init-param>  
    19.     </filter>  
    20.     <filter-mapping>  
    21.         <filter-name>CharacterEncodingFilter</filter-name>  
    22.         <url-pattern>/*</url-pattern>  
    23.     </filter-mapping>  
    24.   
    25.     <!-- Spring view分发器 -->  
    26.     <servlet>  
    27.         <servlet-name>dispatcher</servlet-name>  
    28.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    29.         <init-param>  
    30.             <param-name>contextConfigLocation</param-name>  
    31.             <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  
    32.         </init-param>  
    33.         <load-on-startup>1</load-on-startup>  
    34.     </servlet>  
    35.     <servlet-mapping>  
    36.         <servlet-name>dispatcher</servlet-name>  
    37.         <url-pattern>*.do</url-pattern>  
    38.     </servlet-mapping>  
    39.       
    40. </web-app>  

     


     修改dispatcher-servlet.xml文件。添加相应的xmlns,xsi,添加视图解析器,mvc驱动等。

    Xml代码  收藏代码
    1. <aop:aspectj-autoproxy />  
    2. <mvc:annotation-driven />  
    3. <context:component-scan base-package="com.springFlex.example" />  
    4.   
    5.   
    6. <bean  
    7.     class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
    8.     <property name="prefix" value="/WEB-INF/views/" />  
    9.     <property name="suffix" value=".jsp" />  
    10. </bean>  

     

    1.3.5编写Controller和RequestMapping

     编写控制器类,以及页面映射方法。

    Java代码  收藏代码
    1. @Controller  
    2. public class GeneralController {  
    3.   
    4.     @RequestMapping(value="index.do")  
    5.     public void indexPage(){  
    6.         System.out.println("访问页面 - index.jsp");  
    7.     }  
    8. }  

     

    1.3.6添加jsp页面

    在WEB-INF下新建文件夹views,并新建一个jsp页面:index.jsp。

     

     

    1.3.7测试

    暂时没有定义service和data层,只定义view controller层做简单测试。
    此时SpringMVC框架就都搭建完成。
    配置tomcat并启动tomcat访问http://localhost:8080...../index.do,如果成功,说明Spring环境已经配置成功了。接下来配置Spring与Flex结合的环境。


    二、配置使用SpringFlex

    2.1SpringFlex的基本配置

            Spring与BlazeDS结合必须使用MessageBroker,Flex客户端的HTTP请求将有Spring的DispatcherServlet分发到Spring管理的MessageBroker。使用Spring管理MessageBroker就无需配置BlazeDS MessageBrokerServlet了。

     

     

    2.1.1添加Flex配置文件和BlazeDS包

            添加BlazeDS相关的jar包:
    通过pom搜索blazeds添加相应的jar包。可能版本不是最新的。
    或者自行在blazeds-turnkey-4.0.0.rar解压的文件中(路径: blazeds-turnkey-4.0.0.14931 omcatwebappslazedsWEB-INFlib)。

            添加XML配置文件:
    将下载的BlazeDS解压,如:在blazeds-turnkey-4.0.0.14931 omcatwebappslazedsWEB-INF路径下的flex整个文件,copy到项目中WEB-INF下。

     

     

     

    2.1.2配置Spring的DispatcherServlet

    将Spring的DispatcherServlet对应的servlet-mapping的url-pattern改成/messagebroker/*。改完效果如下实例:

    Xml代码  收藏代码
    1. <servlet>  
    2.     <servlet-name>dispatcher</servlet-name>  
    3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    4.     <init-param>  
    5.         <param-name>contextConfigLocation</param-name>  
    6.         <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  
    7.     </init-param>  
    8.     <load-on-startup>1</load-on-startup>  
    9. </servlet>  
    10. <servlet-mapping>  
    11.     <servlet-name>dispatcher</servlet-name>  
    12.     <url-pattern>/messagebroker/*</url-pattern>  
    13. </servlet-mapping>  
    14.    

     

     

     

    2.1.3在Spring中配置MessageBroker

    Spring提供了简化的XML配置命令来再在Spring的WebApplicationContext中配置(dispatcher-servlet.xml)MessageBroker,需要是这些命名空间支持需要在SpringXML配置文件中添加相应的架构。

    典型配置如下例子:

     

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"  
    4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"  
    5.     xmlns:flex="http://www.springframework.org/schema/flex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/aop   
    7.         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
    8.         http://www.springframework.org/schema/beans   
    9.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
    10.         http://www.springframework.org/schema/context   
    11.         http://www.springframework.org/schema/context/spring-context-3.0.xsd   
    12.         http://www.springframework.org/schema/mvc   
    13.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd   
    14.         http://www.springframework.org/schema/tx   
    15.         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    16.         http://www.springframework.org/schema/flex   
    17.         http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">  
    18.   
    19. </beans>  

     

     

            这使Spring BlazeDS 集成了flex命名空间,可在配置文件中使用。
            最基本的配置,需要在Spring的WebApplicationContext中声明一个MessageBrokerFactoryBean的Bean,以便将传去的请求引导到MessageBroder中,以及Spring管理MessageBroker需要的MessageBrokerHandlerAdapter和HandlerMapping(一般为SimpleUrlHandlerMapping)。
            这些bean可以使用message-broker标签来自动注册。例如最简单的方法:

    Xml代码  收藏代码
    1. <flex:message-broker/>  

     

            这样设置MessageBroker和必要的基础默认配置。默认值可以被重写,配置message-broker标签的属性和他的子元素。
            例如BlazeDS XML配置文件默认位置为:/ WEB-INF/flex/services-config.xml。但可以使用services-config-path属性重新配置路径。classpath在maven项目中默认为src/main/resources路径下。

    Xml代码  收藏代码
    1. <flex:message-broker services-config-path="classpath*:services-config.xml"/>  

     

     

    2.2Flex Remoting调用Spring Bean

    使用Spring管理MessageBroker可以使Spring的beans很方便的被Flex客户端直接远程调用。MessageBroker处理在Flex AMF与Java传送的序列化和反序列化的数据格式。

     

    2.2.1配置Remoting Service

    通过xml配置文件进行配饰Remoting Service时,只需要声明这个允许被调用的Java类的一个bean,再将这个bean声明成一个remoting-destination。如下示例:

    Xml代码  收藏代码
    1. <bean id="flexGeneralController" class="com.springFlex.example.view.flex.FlexGeneralController"/>  
    2. <flex:remoting-destination ref="flexGeneralController"/>  

     

    也可以写成:

    Xml代码  收藏代码
    1. <bean id="flexGeneralController" class="com.springFlex.example.view.flex.FlexGeneralController">  
    2.     <flex:remoting-destination/>  
    3. </bean>  

     
     使用上面方式声明remoting-destination时,必须保证添加了flex:message-broker标签。

     

     

     

    2.2.2使用@RemotingDestination

            @RemotingDestination注解用于基于注解的remoting-destination配置而替换xml方法。@RemotingDestination使用在类级别上一标记此类为remoting-destination。@ RemotingInclude和 @ RemotingExclude注解用在方法级别上,进行标记@RemotingDestination注解类中的方法,是“包括”还是“不包括”此类remoting-destination远程调用。
            另,被@RemotingDestination注解的类,必须声明成一个bean。例如Service层或Controller层的功能类。

     

            下面给出一个简单的例子,controller层类被声明成remoting-destination:

    Java代码  收藏代码
    1. @Controller(value="flexGeneralController")  
    2. @RemotingDestination(value="flexGeneralController", channels="my-amf")  
    3. public class FlexGeneralController {  
    4.   
    5.     @RemotingInclude  
    6.     public String getName(String name) {  
    7.         return "hello:" + name;  
    8.     }  
    9.       
    10.     @RemotingExclude  
    11.     public double getSqrt(int number) {  
    12.         return Math.sqrt(number);  
    13.     }  
    14. }  

     

     @RemotingDestination中的value为destination的id(Flex端的RemoteObject需要配置此属性),channels为AMP通道。

     

     

     

    2.2.3Flex端的RemoteObject

    在Flex端,使用RemoteObject就可以直接调用Java端的remoting-destination中的方法。需要配置endpoint和destination。
    Endpoint一般路径为:http://[java项目IP地址]:[端口号]/[项目名称]/messagebroker/amf;
    Destination为Java端的remoting-destination的id。例如在2.2.2中的例子中,Destination值为flexGeneralController。


     如下例子:

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"   
    3.                 minWidth="955" minHeight="600">  
    4.     <mx:Script>  
    5.         <![CDATA[  
    6.             import mx.controls.Alert;  
    7.             import mx.messaging.ChannelSet;  
    8.             import mx.messaging.channels.AMFChannel;  
    9.             import mx.rpc.Fault;  
    10.             import mx.rpc.events.FaultEvent;  
    11.             import mx.rpc.events.ResultEvent;  
    12.               
    13.             protected function button1_clickHandler(event:MouseEvent):void  
    14.             {  
    15.                 this.remoteObject.getName("limingnihao");  
    16.             }  
    17.               
    18.             protected function button2_clickHandler(event:MouseEvent):void  
    19.             {  
    20.                 this.remoteObject.getSqrt(5);  
    21.             }  
    22.               
    23.             protected function getStringResultHandler(event:ResultEvent):void{  
    24.                 Alert.show(event.result.toString());  
    25.             }  
    26.               
    27.             protected function getSqrtResultHandler(event:ResultEvent):void{  
    28.                 Alert.show(event.result.toString());  
    29.             }  
    30.             protected function remoteobject1_faultHandler(event:FaultEvent):void  
    31.             {  
    32.                 Alert.show(event.fault.toString());  
    33.             }  
    34.               
    35.         ]]>  
    36.     </mx:Script>  
    37.       
    38.     <mx:RemoteObject id="remoteObject" destination="flexGeneralController" fault="remoteobject1_faultHandler(event)"   
    39.                      endpoint="http://192.168.1.119:8080/SpringFlexExample_JavaService/messagebroker/amf">  
    40.         <mx:method name="getName" result="getStringResultHandler(event)"/>  
    41.         <mx:method name="getSqrt" result="getSqrtResultHandler(event)"/>  
    42.     </mx:RemoteObject>  
    43.       
    44.     <mx:Button x="37" y="64" label="按钮1" click="button1_clickHandler(event)"/>  
    45.     <mx:Button x="130" y="64" label="按钮2" click="button2_clickHandler(event)"/>  
    46.       
    47. </mx:Application>  

     


     

     

    2.3消息拦截器MessageInterceptor


    自定义消息拦截器,可以用于处理特殊逻辑在AMF传入传出java 表单的时候。例如,用拦截器检查传入消息的内容,或者给返回信息进行额外统一的操作。
    通过实现org.springframework.flex.core.MessageInterceptor接口就可以进行自定义message拦截器。然后必须配置成Spring Bean,在用XML命名空间关联此bean。

     

    如下实例:自定义message拦截器:CustomMessageInterceptor,和xml文件的配置方法。

    Java代码  收藏代码
    1. package com.springFlex.example.exception;  
    2.   
    3. import org.springframework.flex.core.MessageInterceptor;  
    4. import org.springframework.flex.core.MessageProcessingContext;  
    5.   
    6. import flex.messaging.messages.Message;  
    7.   
    8. public class CustomMessageInterceptor implements MessageInterceptor {  
    9.   
    10.     public Message postProcess(MessageProcessingContext context, Message inputMessage, Message outputMessage) {  
    11.         System.out.println("CustomMessageInterceptor - postProcess");  
    12.         return outputMessage;  
    13.     }  
    14.   
    15.     public Message preProcess(MessageProcessingContext context, Message inputMessage) {  
    16.         System.out.println("CustomMessageInterceptor - preProcess");  
    17.         return inputMessage;  
    18.     }  
    19.   
    20. }  

     

    需要在xml文件中添加bean,和关联bean。

    Xml代码  收藏代码
    1. <bean id="customMessageInterceptor" class="com.springFlex.example.exception.CustomMessageInterceptor"/>  
    2. <flex:message-broker>  
    3.     <flex:message-interceptor ref="customMessageInterceptor"/>  
    4. </flex:message-broker>  

     

     

     

     

    2.4异常转换器Exception Translators

            在服务器发生异常时,会将这个异常对象传播到Flex客户端,但必须将这个原始异常转换翻译成flex.messaging.MessageException 的一个实例。如果不进行翻译工作,一般“Server.Processing”错误将传播到Flex客户端,这样客户端就无法根据错误的原因而作处理。通常情况下,将转换成Spring安全异常MessageException,但也可以使用自定义的应用程序级别异常进行转换。
            通过实现org.springframework.flex.core.ExceptionTranslator接口进行自定义异常转换器。然后必须配置成Spring Bean,在用XML命名空间关联此bean。
            接口的handles方法的返回值来控制是否进行翻译。返回false不进行翻译工作。返回true则就会去执行接口的translate方法进行异常转换。


            如下实例:自定义Exception Translators:CustomExceptionTranslator,和xml文件的配置方法。

    Java代码  收藏代码
    1. package com.springFlex.example.exception;  
    2.   
    3. import org.springframework.flex.core.ExceptionTranslator;  
    4.   
    5. import flex.messaging.MessageException;  
    6.   
    7. public class CustomExceptionTranslator implements ExceptionTranslator {  
    8.   
    9.     public boolean handles(Class<?> clazz) {  
    10.         System.out.println("CustomExceptionTranslator - handles - " + clazz.getName());  
    11.         return true;  
    12.     }  
    13.   
    14.     public MessageException translate(Throwable t) {  
    15.         System.out.println("CustomExceptionTranslator - translate - " + t.getMessage());  
    16.         return new MessageException(t);  
    17.     }  
    18. }  

     

    需要在xml文件中添加bean,和关联bean。

    Xml代码  收藏代码
    1. <bean id="customExceptionTranslator" class="com.springFlex.example.exception.CustomExceptionTranslator"/>  
    2. <flex:message-broker>  
    3.     <flex:exception-translator ref="customExceptionTranslator"/>  
    4. </flex:message-broker>  

      

     

     附件中有源代码:

    SpringFlexExample_JavaService为Java项目;

    SpringFlexExample_FlexClient.rar为Flex项目;

     

     


  • 相关阅读:
    Html.Partial和Html.RenderPartial, Html.Action和Html.RenderAction的区别
    cygwin下git出现cabundle.crt相关错误的解决办法
    Orchard CMS前台页面为什么没有Edit链接?
    Entity Framework练习题
    分析Autofac如何实现Controller的Ioc(Inversion of Control)
    在Winform,Silvelight,WPF等程序中访问Asp.net MVC web api
    适合.net程序员的.gitignore文件
    如何处理Entity Framework中的DbUpdateConcurrencyException异常
    Asp.net MVC中repository和service的区别
    smplayer中使用srt字幕乱码问题
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958662.html
Copyright © 2011-2022 走看看