熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java Flex對象透明映射最佳實踐

2013-11-15 11:51:45  來源: JSP教程 

  在我之前的兩篇文章Flex 性能提示 Ajax輪詢以及Comet模式—寫在Servlet 發布之前中我反復提到Adobe BlazeDS這個開源產品假設某天你在看了Flex 性能提示之後放棄了Flex+Servlet+XML方案那麼如何進行下一步?本文試圖用簡單的表述來實踐一回Java到Flex之間的對象透明傳遞所謂透明本人理解為不需要人工的(反)序列化在閱讀本文之前你需要有一定的SpringBlazeDSFlex使用經驗

  我使用的是Eclipse Java EE平台和Tomcatx以及SQL Server 為了不脫俗選用了Spring(傳說中的春天框架)外加最近才GA的Spring BlazeDS IntegrationPS其實不用春天框架也可以只是覺得他的JdbcDaoSupport很不錯可以自己偷懶了而且連接池和JDBC驅動這些基礎設施也allinone了另外要使用Spring BlazeDS Integration需滿足它個願望Java or higherSpring or higherAdobe BlazeDS or higher(推薦下載blazedsturnkey)我想這三個願望在google上是很好實現的成品的項目結構是這樣的對於如此簡單的實踐無需用到Service層

  

  有了上面的目標接下來就很好辦了首先創建名為JavaFlexMapping的動態Web項目接著導入blazedsturnkeyxxxxx\resources\lib下的所有jar至於Spring相關的jar你可以根據自己的經驗導入也可以先導入springjar然後導入springwebmvcjar(Spring BlazeDS Integration需要)最後再把springframework\lib下的所有jar都導入進來這樣干犧牲了磁盤空間但換來了更少的煩惱Spring BlazeDS Integration的orgspringframeworkflexRELEASEjar也導入進來吧這就算完成了部分包導入工作不過在實際使用中還會需要其他jarxalanjarbackportutilconcurrentjarjtdsjar(SQL Server JDBC驅動)如果在之後的實際操作中出現缺包情況Spring會在控制台說明的最後把blazedsturnkeyxxxxx 下的\tomcat\webapps\blazeds\WEBINF\flex文件全部拷貝到WEBINF下的flex目錄中

  Java程序的運行環境都配置好了看看表結構是怎樣的

  

  這是一個簡單的表反映了組和五個組成員的信息

  所有必要的資源准備完畢可以編碼了先看VO類FlexGroupjava的內容

   package orgrosenjiangflex;

/**
 *  Flex Group Object
 *  @author  rosen jiang
 *  @since  //
 * 
 */
public class FlexGroup {

    private String groupName;
    private String member;
    private String member;
    private String member;
    private String member;
    private String member;
    
    public String getGroupName() {
        return groupName;
    }
    public void setGroupName(String groupName) {
        thisgroupName = groupName;
    }
    public String getMember() {
        return member;
    }
    public void setMember(String member) {
        mber = member;
    }
    public String getMember() {
        return member;
    }
    public void setMember(String member) {
        mber = member;
    }
    public String getMember() {
        return member;
    }
    public void setMember(String member) {
        mber = member;
    }
    public String getMember() {
        return member;
    }
    public void setMember(String member) {
        mber = member;
    }
    public String getMember() {
        return member;
    }
    public void setMember(String member) {
        mber = member;
    }
}

  沒啥好說的就是一個表結構的對象化表述不過有兩個問題

  既然牽涉到跨語言的對象傳輸為什麼沒實現序列化接口?

  為了讓自己和大家了解昨天我專門請教了據說是Sun公司還是IBM公司的名叫toad的達人解惑曰(未找到確鑿證據僅僅是技術層面的推測)不實現序列化接口是因為BlazeDS在進行序列化的時候並未使用Java自己的機制如果各位有更好的解釋尤其是看了BlazeDS源碼的同學請過來share

  BlazeDS官方文檔所要求成員變量必須為public(參看_devguide/l這些白紙黑字寫著Private properties constants static properties and readonly properties and so on are not serialized )?

  的確聲明為private的成員變量也不會出問題這個問題我想是因為官方文檔滯後的原因另外就算是私有成員明顯可以通過反射獲取其值

  接下來是接口ListDAOjava注意按照規范暴露給Flex調用的不能包含以下保留的方法名

  

  disconnect()

  getOperation()

  hasOwnProperty()

  initialized()

  isPrototypeOf()

  logout()

  propertyIsEnumerable()

  setCredentials()

  setPropertyIsEnumerable()

  setRemoteCredentials()

  toString()

  valueOf()

  如果你不小心用到了可以參考BlazeDS官方文檔RemoteObject component章節看如何解決getData()方法是供Flex端調用的傳入參數是Flex構造的FlexGroup對象實例

   package orgrosenjiangflex;

import javautilList;


/**
 *  DAO Interface
 *  @author  rosen jiang
 *  @since  //
 * 
 */
public interface ListDAO {

    /**
     * 
     */
    public List<FlexGroup> getData(FlexGroup fg);
}

  然後是實現類ListDAOImpljava該類利用了JdbcDaoSupport的模板方法來處理JDBC操作

   package orgrosenjiangflex;

import javasqlResultSet;
import javasqlSQLException;
import javautilList;

import orgsprireJdbcTemplate;
import orgsprireRowMapper;
import orgspriresupportJdbcDaoSupport;

/**
 *  DAO Impl
 *  @author  rosen jiang
 *  @since  //
 * 
 */
public class ListDAOImpl extends JdbcDaoSupport implements ListDAO {

    /**
     * 
     */
    public List<FlexGroup> getData(FlexGroup fg){
        //test properties
        Systemoutprintln(fggetGroupName());
        Systemoutprintln(fggetMember());
        Systemoutprintln(fggetMember());
        Systemoutprintln(fggetMember());
        Systemoutprintln(fggetMember());
        Systemoutprintln(fggetMember());
        //Jdbc Template
        JdbcTemplate jt = thisgetJdbcTemplate();
        List<FlexGroup> list = jtquery(select * from flex_group 
                new RowMapper() {
            public FlexGroup mapRow(ResultSet rs int rowNum) throws SQLException {
                FlexGroup fg = new FlexGroup();
                fgsetGroupName(rsgetString(group_name));
                fgsetMember(rsgetString(member));
                fgsetMember(rsgetString(member));
                fgsetMember(rsgetString(member));
                fgsetMember(rsgetString(member));
                fgsetMember(rsgetString(member));
            return fg;
            }
            });
        return list;
    }
}

  開始寫webxml文件注意由於使用了Spring BlazeDS Integration所以內容和單純使用BlazeDS不一樣以往通過messagebroker獲取的請求現在交由Spring處理了

   <?xml version= encoding=UTF?>
<webapp xmlns:xsi=instance xmlns= xmlns:web=app__xsd xsi:schemaLocation=;app__xsd id=WebApp_ID version=>

    <! The front controller of this Spring Web application responsible for handling all application requests >
    <servlet>
        <servletname>Spring MVC Dispatcher Servlet</servletname>
        <servletclass>orgspringframeworkwebservletDispatcherServlet</servletclass>
        <initparam>
            <paramname>contextConfigLocation</paramname>
            <paramvalue>/WEBINF/classes/applicationContextxml</paramvalue>
        </initparam>
        <loadonstartup></loadonstartup>
    </servlet>
    <! Map all /messagbroker requests to the DispatcherServlet for handling >
    <servletmapping>
        <servletname>Spring MVC Dispatcher Servlet</servletname>
        <urlpattern>/messagebroker/*</urlpattern>
    </servletmapping>   
</webapp>

  最後是applicationContextxml

   <?xml version= encoding=UTF?>
<beans xmlns=
       xmlns:flex=
       xmlns:xsi=instance
       xsi:schemaLocation=
           
           beansxsd
           ;
           flexxsd>

<! Dada Source >
    <bean id=dataSource class=monsdbcpBasicDataSource destroymethod=close>
        <property name=driverClassName value=netsourceforgejtdsjdbcDriver/>
        <property name=url value=jdbc:jtds:sqlserver://localhost:/cfd/>
        <property name=username value=sa/>
        <property name=password value=/>
    </bean>
    
<! Message Broker >
<flex:messagebroker servicesconfigpath=/WEBINF/flex/servicesconfigxml/>
    
<! List Data Bean >
    <bean id=listDAO class=orgrosenjiangflexListDAOImpl>
      <property name=dataSource>
        <ref bean=dataSource></ref>
      </property>
      <flex:remotingdestination/>
    </bean>
</beans>

  這裡引入了flex命名空間拜Spring BlazeDS Integration所賜僅僅需要一個<flexremotingdestination/>節點就能讓這個bean暴露給遠端Flex調用另外還需要配置messagebroker來指定BlazeDS配置文件以上webxmlapplicationContextxml相關配置可參考Configuring and Using the BlazeDS MessageBroker with Spring章節到此Java部分代碼就完成了

  Flex部分就兩個文件首先是和Java相對應的FlexGroupas

   package{
    [Bindable]
    [RemoteClass(alias=orgrosenjiangflexFlexGroup)]
    public class FlexGroup{
        public var groupName:String;
        public var member:String;
        public var member:String;
        public var member:String;
        public var member:String;
        public var member:String;
    }
}

  利用[RemoteClass(alias=)]元數據映射Java端的FlexGroup對象注意這裡的成員名一定要一致詳情可參考Explicitly mapping ActionScript and Java objects章節

  最後一個是JavaFlexMappingmxml文件也就是我們的主程序界面

   <?xml version= encoding=utf?>
<mx:Application xmlns:mx= backgroundColor=black fontSize=
     verticalAlign=middle horizontalAlign=center color=# creationComplete=init()>
    
    <mx:RemoteObject id=lo destination=listDAO result=handleResult(event) fault=handleFault(event)>
        <mx:channelSet>
            <mx:ChannelSet>
                <mx:channels>
                    <mx:AMFChannel
                        uri=/>
                </mx:channels>
            </mx:ChannelSet>
        </mx:channelSet>
    </mx:RemoteObject>

    <mx:Script>
        <![CDATA[
            import mxrpceventsResultEvent;
            import mxrpceventsFaultEvent;
            import ntrolsAlert;
            import llectionsArrayCollection;
            var fg:FlexGroup;
            var ac:ArrayCollection;

            private function init():void{
                //create FlexGroup instance for remote DAO
                fg = new FlexGroup();
                fggroupName = 測試組;
                mber = 成員;
                mber = 成員;
                mber = 成員;
                mber = 成員;
                mber = 成員;
            }

            private function handleResult(event:ResultEvent):void{
                ac = ArrayCollection(eventresult);
                dgdataProvider = ac;
            }

            private function handleFault(event:FaultEvent):void{
                Alertshow(ssage 出錯了);
            }
        ]]>
    </mx:Script>
    <mx:Panel height= width= title=Java Flex對象透明映射最佳實踐 horizontalAlign=center verticalAlign=middle>
        <mx:VBox>
            <mx:ApplicationControlBar dock=true width=>
                <mx:Button label=趕快點我 我就給數據 click=logetData(fg)/>
            </mx:ApplicationControlBar>

            <mx:DataGrid height= width= id=dg>
                <mx:columns>
                    <mx:DataGridColumn headerText=組名 dataField=groupName/>
                    <mx:DataGridColumn headerText=成員一 dataField=member/>
                    <mx:DataGridColumn headerText=成員二 dataField=member/>
                    <mx:DataGridColumn headerText=成員三 dataField=member/>
                    <mx:DataGridColumn headerText=成員四 dataField=member/>
                    <mx:DataGridColumn headerText=成員五 dataField=member/>
                </mx:columns>
            </mx:DataGrid>
        </mx:VBox>
    </mx:Panel>
</mx:Application>

  在這裡引入了RemoteObject對象並使用運行時注冊機制指定AMFChannel詳情可參考Accessing dynamic components with a Flex client application章節Flex程序的運行步驟是這樣的當界面都創建完畢後執行init()方法構造FlexGroup對象實例並填充其成員程序進入監聽狀態當點擊快點我我就給數據的按鈕後通過RemoteObject實例調用Java端的getData()方法並傳入FlexGroup對象實例供Java端測試最後由於注冊了異步的handleResult()方法所以當Java端返回List對象實例後立即轉換為ArrayCollection數據類型並填充到DataGrid進行顯示運行截圖如下

  

  同時可以到Eclipse控制台上觀察收到的數據

  到此JavaFlex透明映射就完成了更多信息請參考Spring BlazeDS Integration Reference Guide以及BlazeDS Developer Guide


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19765.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.