一、搭建开发环境
1.给Eclipse安装Flex Builder插件(Flex4.0之后改为叫Flash Builder)
2.给Eclipse安装Google App Engine的插件,这个在Google App Engine官方网站上能找到相关的文档。
二、新建GAE项目
略过,这个没什么好说的
三、给GAE项目加Flex的Nature
在项目名上右键==》Flex Project Nature==》Add Flex Project Nature
然后服务器选择J2EE和BlazeDS
添加完Flex的Nature之后需要设置Flex Server(在项目的属性里)里的
Root folder:选择GAE项目里的war子文件夹
Root URL: http://localhost:8888/(注意,这里和普通的Flex+J2EE的项目不一样)
Context Root:/(这里也不一样,普通的Flex+J2EE项目,这里需要设定为项目名称,要不然Flex在编译之后,运行时找不到BlazeDS的服务器)
项目上的配置到此结束。
四、配置BlazeDS
在网上有关于如何配置Google App Engine项目里使用的文章BlazeDS,上Google搜索一下就o了
五、配置Spring+BlazeDS
有两种Spring+BlazeDS的配置方式。
第一种就是在BlazeDS的service-config.xml文件里配置一个factory,factory里设置需要的bean从Spring上下文里去找。这种方法我以前就这么使用,想尝试一下新的方式,所以放弃这种方法。这种方法在BlazeDS的文档里的倒数第二章里有奖,需要的可以去那里查。
第二种就是Spring提供的Spring+BlazeDS配置方式(Spring FLex Home
http://www.springsource.org/spring-flex,想详细了解的可以去看这里的文档)。
1.拷贝Spring相关的lib包
2.配置web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/config/service-context.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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/config/web-application-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--
Map all /messagbroker requests to the DispatcherServlet for handling
-->
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
熟悉Spring的应该很清楚这些都干什么的
设置一下Spring配置文件的位置
添加一个加载Spring的Listener
为BlazeDS配置servlet以及url-mapping
其实从本质上讲这种方法和第一种方法没有什么区别的,唯一的区别就是第一种方法是使用BlazeDS自己提供的servlet,这里是使用Spring的MVC框架的Servlet而已。
3.配置web-application-config.xml
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<flex:message-broker />
</beans>
这个文件里就一行有用,其他都是Spring的命名空间声明。这里虽然简单,其实是Spring2.5之后提供的自定义命名空间帮我们做了很多事情,很多都是默认的。比如说到哪里去找flex的配置文件(默认在WEB-INF\flex目录下)。
4.配置service-context.xml
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byName">
[color=red]<import resource="jdo-context.xml" />
<context:component-scan base-package="com.rever.gae.service" />
<context:component-scan base-package="com.rever.gae.dao.jdo" />[/color]
<bean id="velocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath">
<value>WEB-INF/velocity</value>
</property>
<property name="velocityProperties">
<props>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
<prop key="contentType">text/html;charset=UTF-8</prop>
<prop key="file.resource.loader.cache">false</prop>
<prop key="file.resource.loader.modificationCheckInterval">1</prop>
<!-- <prop key="runtime.log">velocity.log</prop> -->
<prop key="runtime.log.logsystem.class">org.apache.velocity.runtime.log.CommonsLogLogChute
</prop>
<prop key="velocimacro.library.autoreload">true</prop>
<prop key="velocimacro.max.depth">200</prop>
</props>
</property>
<property name="overrideLogging">
<value>false</value>
</property>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="ApplicationResources" />
</bean>
</beans>
重要配置在红色地方标出来了。第一行是引入jdo配置文件,第二行是告诉Spring去哪里找service。这里我用Spring3.0里提供的Annotation来暴露Spring的service给BlazeDS的(我觉的这一点比第一种方法更方便一些,第一种方法如果重构service的名字或者添加一个新的service,需要改两处配置文件才能生效,而且修改也是拷贝粘贴)。第三行是告诉Spring到哪里去找DAO的实现,这里跟BlazeDS没有多少关系。
5.配置jdo-context.xml
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
[color=darkred]<bean id="persistenceManagerFactory"
class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean">
<property name="jdoProperties">
<props>
<prop key="javax.jdo.PersistenceManagerFactoryClass">
org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory
</prop>
<prop key="javax.jdo.option.ConnectionURL">
appengine
</prop>
<prop key="javax.jdo.option.NontransactionalRead">
true
</prop>
<prop key="javax.jdo.option.NontransactionalWrite">
true
</prop>
<prop key="javax.jdo.option.RetainValues">
true
</prop>
<prop key="datanucleus.appengine.autoCreateDatastoreTxns">
true
</prop>
</props>
</property>
</bean>
[/color]
[color=blue]<bean id="jdoTransactionManager" class="org.springframework.orm.jdo.JdoTransactionManager">
<property name="persistenceManagerFactory" ref="persistenceManagerFactory" />
</bean>[/color]
[color=violet]<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">
PROPAGATION_REQUIRED,-Exception
</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-Exception
</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly
</prop>
</props>
</property>
</bean>[/color]
[color=cyan]<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="true"/>
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>[/color]
</beans>
深红色的bean是Google App Engine里关于JDO的配置,从自动生成的文件里改过来就ok了,其余的是自动管理事务的配置。
六、编写Service
如何编写Service就看自己的业务了,这里主要说一下Spring的Annotation的使用。
@Service("systemStatusService")
@RemotingDestination(channels = {
"my-amf"
})
public class SystemStatusService {
@RemotingInclude
public void addTotal() {
..............................
..............................
..............................
}
}
第一个:@Service("systemStatusService") 注明该类需要暴露为bean,并且该bean的id是systemStatusService(当然你也可以使用他默认的命名策略)。
第二个:@RemotingDestination(channels = {
"my-amf"
}) 用来注明该bean被BlazeDS暴露为service。这里的my-amf在flex的配置文件里配置,表明用那个序列化。
第三个:@RemotingInclude 注明该方法暴露给BlazeDS,你可以在Flex能够调用该方法。
这其实也是第一种配置方法里加一个service的三个步骤。
----------------------------------华丽的分割线----------------------------------
关于GAE+Flex+Spring的配置到此结束。