天天看點

flex3+blazeds+spring+hibernate整合筆記

 近來flex盛行,是以這兩天也借了本書看了兩天,發覺作為非頁面設計人員,flex 還是很好的,flex builder很好用,拖拉就

有很COOL的界面了,而且flex總的來說基本東西不難學,有程式設計基礎的人很快掌握,當然要精通就要時間了,因為庫,API等很多.

下面就flex3+blazeds+spring+hibernate整合作個小結,是之前讀外國好文的心得,而見國内這方面的文比較少,是以筆記之.

   首先要知道,flex3是做前端的,其實就是view層的東西了,可以替換掉struts 2,如果項目中你喜歡的話.而blazeds是

adobe免費的轉換網關(可以了解成轉換網關),負責把後端的資料與actionscript進行轉換,當然也可以用

收費的那個livecycle data services了.而spring+hiberate的組合很傳統了.

1 準備好東西

   A 下載下傳blazeds,這裡下載下傳blazeds_turnkey_3-0-0-544的版本,因為自帶了tomcat還有些好的例子

   B FLEXBUILDER 3

         C MYSQL 5

       D SPRING+HIBERNATE,myeclipse,這些就不說了.

2 本文是根據http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=2&postId=7923

 去小結的.其中在http://www.adobe.com/devnet/livecycle/articles/blazeds_spring.html中,讨論了如何跟spring結合,如何跟

hsqldb結合.那麼文中是舉了blazeds自帶的例子來做說明的,在它的基礎上進行修改,變成hibernate+spring.

3 先從http://download.macromedia.com/pub/developer/flex_spring.zip下載下傳例子檔案,其中包括了例子和作者寫的

用spring調用的元件.

   解壓flex-spring.zip

将/flex-spring/factory/bin/flex/samples/factories 目錄下的class檔案拷貝到/WEB-INF/classes/flex/samples/factories目錄中

4 在/WEB-INF/flex/services-config.xml檔案中注冊spring factory

<factories>

<factory id="spring" class="flex.samples.factories.SpringFactory"/>

</factories>

5 配置web.xml

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>

</listener>

6 在下載下傳的程式中,我們重點關注samples/store這個目錄下的程式.

其中flex目錄是寫好了的flex界面了,大家可以用flexbuilder去看.

而java目錄其實就是後端的目錄.無非就是用spring來實作對product對象的增,删改.

7 我們先用mysql 5在建立資料庫 flexhibernate,表結構如下:

CREATE TABLE `product` (

  `productId` int(11) NOT NULL auto_increment,

  `name` varchar(40) NOT NULL,

  `category` varchar(40) NOT NULL,

  `image` varchar(255) NOT NULL,

  `price` double NOT NULL,

  `description` varchar(255) NOT NULL,

  `qtyInStock` int(20) NOT NULL,

  KEY `productId` (`productId`)

)

8 ,我們編寫一個product.hbm.xml如下,放在samples/store/java目錄下

   <?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"[]>

<hibernate-mapping package="flex.samples.spring.store">

 <class name="Product" table="PRODUCT">

  <id name="productId" type="long" column="PRODUCTID"

   unsaved-value="0">

   <generator class="identity" />

  </id>

  <property name="name" column="NAME" length="40" />

  <property name="category" column="CATEGORY" length="40" />

  <property name="image" column="IMAGE" length="40" />

  <property name="price" column="PRICE" type="double" />

  <property name="description" column="DESCRIPTION" length="255" />

  <property name="qtyInStock" column="QTYINSTOCK"

   type="integer" />

 </class>

</hibernate-mapping>

9 編寫applicationContext.xml,注意要放在blazeds_turnkey_3-0-0-544/tomcat/webapps/blazeds/WEB-INF下

内容如下

    

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  <bean id="dataSource"

  class="org.apache.commons.dbcp.BasicDataSource"

  destroy-method="close">

  <property name="driverClassName" value="com.mysql.jdbc.Driver" />

  <property name="url"

   value="jdbc:mysql://localhost:3306/flexhibernate" />

  <property name="username" value="root" />

  <property name="password" value="abc" />

 </bean>

 <bean id="sessionFactory"

  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

  <property name="mappingResources">

   <list>

    <value>flex/samples/spring/store/Product.hbm.xml</value>

   </list>

  </property>

  <property name="hibernateProperties">

   <props>

    <prop key="hibernate.dialect">

     org.hibernate.dialect.HSQLDialect

    </prop>

   </props>

  </property>

  <property name="dataSource">

   <ref bean="dataSource" />

  </property>

 </bean>

 <bean id="txManager"

  class="org.springframework.orm.hibernate3.HibernateTransactionManager">

  <property name="sessionFactory">

   <ref local="sessionFactory" />

  </property>

 </bean>

 <bean id="productDAOBeanTarget"

  class="flex.samples.spring.store.HibernateProductDAO">

  <property name="sessionFactory" ref="sessionFactory" />

 </bean>

 <bean id="productDAOBean"

  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

  <property name="transactionManager" ref="txManager" />

  <property name="target" ref="productDAOBeanTarget" />

  <property name="transactionAttributes">

   <props>

    <prop key="create*">PROPAGATION_REQUIRED</prop>

    <prop key="update*">PROPAGATION_REQUIRED</prop>

    <prop key="delete*">PROPAGATION_REQUIRED</prop>

    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

   </props>

  </property>

 </bean>

</beans>

  很典型的傳統spring+hibernate的配置了.

10 修改blazeds_turnkey_3-0-0-544/tomcat/webapps/blazeds/WEB-INF/flex目錄下的

remoting-config.xml檔案,增加如下部分:

  <destination id="productService">

<properties>

<factory>spring</factory>

<source>productDAOBean</source>

</properties>

</destination>  

11 準備spring,hibernate,mysqljdbc等驅動包,可以先放在blazeds_turnkey_3-0-0-544/tomcat/webapps/blazeds/WEB-INF/lib下,

當然也可以通過下面寫ANT檔案去指定,道理都是一樣的.注意我用的是spring 1.2.8的包,2.0X的還沒試過,各位可以試下.

12 可以看到,原文作者在sample/store目錄下,有個build.xml,但其中因為我是windows下的,是以修改了路徑符号為\,

如下

  

<?xml version="1.0" encoding="utf-8"?>

<project name="Store Application" basedir="." default="main">

    <property name="FLEX_HOME" value="C:/Program Files/Adobe/Flex Builder 3/sdks/3.1.0"/>

    <property name="DEPLOY_DIR" value="L:/blazeds_turnkey_3-0-0-544/tomcat/webapps/blazeds"/>

    <property name="CONTEXT_ROOT" value="blazeds"/>

<property   name="lib.dir"   value="L:/blazeds_turnkey_3-0-0-544/tomcat/webapps/blazeds/WEB-INF/lib"/>

<path   id="classpath">  

                  <fileset   dir="${lib.dir}">  

                          <include   name="*.jar"/>  

                  </fileset>  

          </path>  

    <taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/flexTasks.jar"  />

    <target name="main" depends="compile-flex,html-wrapper,compile-java"/>

    <target name="compile-flex">

        <mxmlc file="flex/storeadmin.mxml"

         services="${DEPLOY_DIR}/WEB-INF/flex/services-config.xml"

         context-root="${CONTEXT_ROOT}"

   output="${DEPLOY_DIR}/storeadmin/storeadmin.swf"/>

        <mxmlc file="flex/store.mxml"

         services="${DEPLOY_DIR}/WEB-INF/flex/services-config.xml"

         context-root="${CONTEXT_ROOT}"

   output="${DEPLOY_DIR}/store/store.swf"/>

     <copy todir="${DEPLOY_DIR}/store/pic">

      <fileset dir="flex/pic"/>

    </copy>

    </target>

    <target name="compile-java">

        <javac srcdir="java" destdir="${DEPLOY_DIR}/WEB-INF/classes">

   <classpath   refid="classpath"/> 

         </javac>

   <copy todir="${DEPLOY_DIR}/WEB-INF/classes/flex/samples/spring/store"> 

    <fileset dir="java" includes="**/*hbm.xml"/> 

  </copy>

    </target>

 <target name="html-wrapper">

        <html-wrapper

              application="app"

              width="100%"

              height="100%"

              swf="storeadmin"

              version-major="9"

              version-minor="0"

              version-revision="0"

              history="true"             

              template="express-installation"

              output="${DEPLOY_DIR}/storeadmin"/>

        <html-wrapper

              application="app"

              width="100%"

              height="100%"

              swf="store"

              version-major="9"

              version-minor="0"

              version-revision="0"

              history="true"             

              template="express-installation"

              output="${DEPLOY_DIR}/store"/>

    </target>

</project>

 要注意的是,因為flex 3的ant擴充了ant,是以,要保證Adobe/Flex Builder 3/sdks/3.1.0/ant下有檔案flexTasks.jar,

也要把flexTasks.jar COPY到ant的目錄下去.

  之後就可以在sample/store根目錄下,運作ant打包運作了.

13 之後啟動tomcat,運作

   http://localhost:8400/blazeds/store/index.html

 和 http://localhost:8400/blazeds/storeadmin/index.html,

  就可以看到效果了.

14 簡單分析其調用過程

  把其中一個flex檔案打開,比如

   

<Product id="product"

  name="{productName.text}"

  category="{category.text}"

  price="{Number(price.text)}"

  qtyInStock="{int(qtyInStock.text)}"

  image="{image.text}"

  description="{description.text}"/>

 <mx:RemoteObject id="srv" destination="productService"/>

 <mx:Form width="100%">

  <mx:FormItem label="Name">

   <mx:TextInput id="productName" text="{product.name}"/>

  </mx:FormItem>

  <mx:FormItem label="Category">

   <mx:TextInput id="category" text="{product.category}"/>

  </mx:FormItem>

  <mx:FormItem label="Image">

   <mx:TextInput id="image" text="{product.image}"/>

  </mx:FormItem>

  <mx:FormItem label="Price">

   <mx:TextInput id="price" text="{product.price}"/>

  </mx:FormItem>

  <mx:FormItem label="In Stock">

   <mx:TextInput id="qtyInStock" text="{product.qtyInStock}"/>

  </mx:FormItem>

  <mx:FormItem label="Description" width="100%">

   <mx:TextArea id="description" text="{product.description}" width="100%" height="100"/>

  </mx:FormItem>

 </mx:Form>

 <mx:ControlBar>

  <mx:Button label="Update" click="srv.updateProduct(product)"/>

 </mx:ControlBar>

  其中,關注<mx:Button label="Update" click="srv.updateProduct(product)"/>,這裡,就是調用srv的updateProduct(product)了,

其中,srv是一個 <mx:RemoteObject id="srv" destination="productService"/>,destination="productService"是什麼?

就是第10步中指定的那個productService了,呵呵,應該大緻明白了吧?

繼續閱讀