或者参考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。

  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. <filter>
  8. <filter-name>CharacterEncodingFilter</filter-name>
  9. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  10. <init-param>
  11. <param-name>encoding</param-name>
  12. <param-value>UTF-8</param-value>
  13. </init-param>
  14. <init-param>
  15. <param-name>forceEncoding</param-name>
  16. <param-value>true</param-value>
  17. </init-param>
  18. </filter>
  19. <filter-mapping>
  20. <filter-name>CharacterEncodingFilter</filter-name>
  21. <url-pattern>/*</url-pattern>
  22. </filter-mapping>
  23. <!-- Spring view分发器 -->
  24. <servlet>
  25. <servlet-name>dispatcher</servlet-name>
  26. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  27. <init-param>
  28. <param-name>contextConfigLocation</param-name>
  29. <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
  30. </init-param>
  31. <load-on-startup>1</load-on-startup>
  32. </servlet>
  33. <servlet-mapping>
  34. <servlet-name>dispatcher</servlet-name>
  35. <url-pattern>*.do</url-pattern>
  36. </servlet-mapping>
  37. </web-app>

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

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

1.3.5编写Controller和RequestMapping

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

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

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\tomcat\webapps\blazeds\WEB-INF\lib)。

添加XML配置文件:

将下载的BlazeDS解压,如:在blazeds-turnkey-4.0.0.14931\tomcat\webapps\blazeds\WEB-INF路径下的flex整个文件,copy到项目中WEB-INF下。

2.1.2配置Spring的DispatcherServlet

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

  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>

2.1.3在Spring中配置MessageBroker

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

典型配置如下例子:

  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. </beans>

这使Spring BlazeDS 集成了flex命名空间,可在配置文件中使用。

        最基本的配置,需要在Spring的WebApplicationContext中声明一个MessageBrokerFactoryBean的Bean,以便将传去的请求引导到MessageBroder中,以及Spring管理MessageBroker需要的MessageBrokerHandlerAdapter和HandlerMapping(一般为SimpleUrlHandlerMapping)。

        这些bean可以使用message-broker标签来自动注册。例如最简单的方法:

  1. <flex:message-broker/>

这样设置MessageBroker和必要的基础默认配置。默认值可以被重写,配置message-broker标签的属性和他的子元素。

        例如BlazeDS XML配置文件默认位置为:/ WEB-INF/flex/services-config.xml。但可以使用services-config-path属性重新配置路径。classpath在maven项目中默认为src/main/resources路径下。

  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。如下示例:

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

也可以写成:

  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:

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

@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。

如下例子:

  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. protected function button1_clickHandler(event:MouseEvent):void
  13. {
  14. this.remoteObject.getName("limingnihao");
  15. }
  16. protected function button2_clickHandler(event:MouseEvent):void
  17. {
  18. this.remoteObject.getSqrt(5);
  19. }
  20. protected function getStringResultHandler(event:ResultEvent):void{
  21. Alert.show(event.result.toString());
  22. }
  23. protected function getSqrtResultHandler(event:ResultEvent):void{
  24. Alert.show(event.result.toString());
  25. }
  26. protected function remoteobject1_faultHandler(event:FaultEvent):void
  27. {
  28. Alert.show(event.fault.toString());
  29. }
  30. ]]>
  31. </mx:Script>
  32. <mx:RemoteObject id="remoteObject" destination="flexGeneralController" fault="remoteobject1_faultHandler(event)"
  33. endpoint="http://192.168.1.119:8080/SpringFlexExample_JavaService/messagebroker/amf">
  34. <mx:method name="getName" result="getStringResultHandler(event)"/>
  35. <mx:method name="getSqrt" result="getSqrtResultHandler(event)"/>
  36. </mx:RemoteObject>
  37. <mx:Button x="37" y="64" label="按钮1" click="button1_clickHandler(event)"/>
  38. <mx:Button x="130" y="64" label="按钮2" click="button2_clickHandler(event)"/>
  39. </mx:Application>

2.3消息拦截器MessageInterceptor

自定义消息拦截器,可以用于处理特殊逻辑在AMF传入传出java 表单的时候。例如,用拦截器检查传入消息的内容,或者给返回信息进行额外统一的操作。

通过实现org.springframework.flex.core.MessageInterceptor接口就可以进行自定义message拦截器。然后必须配置成Spring Bean,在用XML命名空间关联此bean。

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

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

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

  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文件的配置方法。

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

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

  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项目;

SpringFlex框架搭建的更多相关文章

  1. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  2. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  3. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  4. 【Java EE 学习 69 中】【数据采集系统第一天】【SSH框架搭建】

    经过23天的艰苦斗争,终于搞定了数据采集系统~徐培成老师很厉害啊,明明只是用了10天就搞定的项目我却做了23天,还是模仿的...呵呵,算了,总之最后总算是完成了,现在该好好整理该项目了. 第一天的内容 ...

  5. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  6. 原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务

    一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Equinox OSGi应用嵌入Jersey框架搭建REST服务 1.新建插件工程HelloWebOSGI a. ...

  7. 关于使用ABP框架搭建的项目升级时需要注意的问题汇总

    ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 说明 升级方法 问题_01:Log4Net导致编译不成功 2015/12/18更新 ...

  8. ssh框架搭建的基本步骤(以及各部分作用)

    ssh框架搭建的基本步骤(以及各部分作用)     一.首先,明确spring,struts,hibernate在环境中各自的作用.   struts: 用来响应用户的action,对应到相应的类进行 ...

  9. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

  10. 【PHP】基于ThinkPHP框架搭建OAuth2.0服务

    [PHP]基于ThinkPHP框架搭建OAuth2.0服务 http://leyteris.iteye.com/blog/1483403

随机推荐

  1. VC 单文档FormView视图增加打印预览

    1修改my.rc文件二处 3 TEXTINCLUDE BEGIN "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO ...

  2. 丝滑解决Chatgpt频繁奔溃、断网掉线问题

    事件缘由 这段时间使用Chatgpt的时候频繁出现something wrong等断网掉线问题,中间还频繁出现物品转向的人机验证(我那么具有迷惑性吗...),被烦的不行.后面了解到有一个KeepCha ...

  3. C#自定义控件—指示灯

    C#用户控件之指示灯 在体现通讯状态.运行状态等用一个靓眼的指示灯如何做? 思路(GDI) 外环用笔绘制(Pen),内圆用画刷(SolidBrush); 两个方法(用笔画圆,用画刷填充圆的内部): 绘 ...

  4. RxJS 系列 – 大杂烩

    前言 RxJS 有太多方法了, 想看完整的可以去看 REFERENCE – API List, 这篇介绍一些非 operator 的常用方法. NEVER NEVER.subscribe({ comp ...

  5. SpringMVC —— RESTful案例

    案例:基于RESTful页面数据交互            

  6. 暑假集训CSP提高模拟1

    A.Start 比较小的大模拟,还没改出来 B.mine 线性推一下(这个题记搜容易写偏,因为分讨太多) 设 \(f[i][j]\),第一维表示位置,第二位表示末位状态(是雷,是 \(0\),是 \( ...

  7. o1 式开源推理链项目 g1:可基于 Llama 3.2-90b 模型

    g1 简介 g1 是一个开源项目,利用 Llama 3.1 70b 模型在 Groq 硬件上实现类似 OpenAI o1 的推理链能力.项目通过精心设计的提示策略引导语言模型进行逐步推理,解决了传统语 ...

  8. Linux内核中cpu_capacity是什么?

    cpu_capacity 在Linux内核中,cpu_capacity 是用于表示每个CPU的处理能力的一个参数,通常用于调度器的负载均衡.它表明不同的CPU核心在计算资源分配中的相对性能,尤其在异构 ...

  9. /proc/pids/status

    /proc/279/status是一个Linux内核中的文件,其中包含了当前进程的状态信息.每行的含义如下: Name: 进程的名称,例如"java"或"bash&quo ...

  10. Nodejs C++插件(N-API)

    Nodejs C++插件(N-API) 0. 环境搭建 1. JS中调用C++方法 1.1 JS中调用源文件的C++方法 1.2 JS中调用动态库的C++方法 2. C++中调用JS方法 2.1. C ...