搭建GAE+Flex+Spring

一、搭建开发环境

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的配置到此结束。


你可能感兴趣的:(spring,xml,Flex,配置管理,GAE)