云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          index.jsp重定向到mainMenu.html,但其實mainMenu.html并不是一個真正的存在的Html頁面。
          在appfuse中,Struts的Action的后綴使用的是不是常見的.do,而使用的是.html。
          見Web.xml:

          ??? <servlet-mapping>
          ??????? <servlet-name>action</servlet-name>
          ??????? <url-pattern>*.html</url-pattern>
          ??? </servlet-mapping>


          因此,查看struts-config.xml,發現/menuMenu只是簡單地Forward到/WEB-INF/pages/mainMenu.jsp。
          所以,在此處顯示的內容是mainMenu.jsp的內容。

          mainMenu.jsp頁面中的內容不多,只有一個簡單的列表,包含兩個鏈接:編輯信息、上傳文件。

          現在需要仔細研究一下菜單的顯示了。可以看到在menuMenu.jsp和login.jsp中都沒有菜單的定義和顯示。其實菜單的定義和顯示還是在前面說到的default.jsp中。
          default.jsp中如下一段代碼:

          ??????????? <c:set var="currentMenu" scope="request"><decorator:getProperty property="meta.menu"/></c:set>
          ??????????? <c:if test="${currentMenu == 'AdminMenu'}">
          ??????????? <div id="sub">
          ??????????????? <menu:useMenuDisplayer name="Velocity" config="WEB-INF/classes/cssVerticalMenu.vm" permissions="rolesAdapter">
          ??????????????????? <menu:displayMenu name="AdminMenu"/>
          ??????????????? </menu:useMenuDisplayer>
          ??????????? </div>
          ??????????? </c:if>

          ??????????? <div id="nav">
          ??????????????? <div class="wrapper">
          ??????????????????? <h2 class="accessibility">Navigation</h2>
          ??????????????????? <jsp:include page="/common/menu.jsp"/>
          ??????????????? </div>
          ??????????????? <hr />
          ??????????? </div><!-- end nav -->

          首先從頁面中取出meta.menu的值,這個值在login.jsp中是: <meta name="menu" content="Login"/>
          在mainMenu.jsp中是:<meta name="menu" content="MainMenu"/>
          所以,login.jsp中 test="${currentMenu == 'AdminMenu'}" 都不通過。每一部分的內容在這兩個頁面中都不顯示。

          下面的一部分是common/menu.jsp,主要是一個menu:useMenuDisplayer
          顯示的菜單第一個進行了判斷,<c:if test="${empty pageContext.request.remoteUser}">
          查看Jsp容器中維護的認證中當前用戶是否為空,如果成功登錄,則這個值即為登錄用戶名,否則為空。
          也就是說,如果沒有成功登錄,則會顯示登錄菜單<li><a href="<c:url value="/login.jsp"/>" class="current"><fmt:message key="login.title"/></a></li>。

          除了剛才的第一個登錄項以外,還有5條菜單菜單項,這5個菜單項使用的是struts-menu的標準用法,而不是象剛才那樣直接HTML的輸出。
          ??? <menu:displayMenu name="MainMenu"/>
          ??? <menu:displayMenu name="UserMenu"/>
          ??? <menu:displayMenu name="FileUpload"/>
          ??? <menu:displayMenu name="AdminMenu"/>
          ??? <menu:displayMenu name="Logout"/>
          查看menu-config.xml,可以發現,只有第一的菜單項MainMenu沒有定義角色

          < MenuConfig >
          ????
          < Displayers >
          ????????
          < Displayer? name ="Velocity" ?type ="net.sf.navigator.displayer.VelocityMenuDisplayer" />
          ????
          </ Displayers >
          ????
          < Menus >
          ????????
          < Menu? name ="MainMenu" ?title ="mainMenu.title" ?page ="/mainMenu.html" />
          ????????
          < Menu? name ="UserMenu" ?title ="menu.user" ?description ="User?Menu" ?forward ="editProfile" ?roles ="admin,user" />
          ????????
          < Menu? name ="FileUpload" ?title ="menu.selectFile" ?description ="File?Upload" ?width ="100" ?forward ="selectFile" ?roles ="admin,user" />
          ????????
          < Menu? name ="AdminMenu" ?title ="menu.admin" ?description ="Admin?Menu" ?roles ="admin" ?width ="120" ?forward ="viewUsers" >
          ????????????
          < Item? name ="ViewUsers" ?title ="menu.admin.users" ?forward ="viewUsers" />
          ????????????
          < Item? name ="ActiveUsers" ?title ="mainMenu.activeUsers" ?action ="activeUsers" />
          ????????????
          < Item? name ="ReloadContext" ?title ="menu.admin.reload" ?action ="reload" />
          ????????????
          < Item? name ="FlushCache" ?title ="menu.flushCache" ?action ="flush" />
          ????????????
          < Item? name ="Clickstream" ?title ="menu.clickstream" ?page ="/clickstreams.jsp" />
          ????????
          </ Menu >
          ????????
          < Menu? name ="Logout" ?title ="user.logout" ?page ="/logout.jsp" ?roles ="admin,user" />
          ????
          </ Menus >
          </ MenuConfig >


          因此,在login.jsp頁面也能顯示此菜單項。
          而剩下需要角色的菜單,就需要登錄后,根據角色的設置來顯示相應的菜單了。

          比如:mraible用戶是admin角色,可以顯示全部菜單。tomcat用戶是user角色,就看不到AdminMenu了。

          ?

          posted @ 2007-03-08 09:51 云自無心水自閑 閱讀(1625) | 評論 (0)編輯 收藏

          這次詳細地說明一下Appfuse的認證過程:
          1. 在Web.xml中定義了FilterChainProxy,
          2. 在Security.xml中對FilterChain進行了詳細定義。
          3. 其中AuthenticationManager的Providers包含了DaoAuthenticationProvider,而此Provider的UserDetailsService引用了userDao。
          4. 在applicationContext-hibernate.xml中定義了userDao,是org.appfuse.dao.hibernate.UserDaoHibernate。
          5. 而UserDaoHibernate實現了UserDetailsService接口,主要是實現了loadUserByUsername(String)方法,其中參數是String類型的用戶名,而返回一個UserDetails類型的對象。
          6. 在LoadUserByUsername方法中,使用getHibernateTemplate().find來獲得了一個org.appfuse.model.User類型的List,其中User類型實現了UserDetails。

          posted @ 2007-03-07 23:46 云自無心水自閑 閱讀(1335) | 評論 (2)編輯 收藏

          ??? Acegi提供了一個優秀的基于J2EE企業級應用的安全認證機制。尤其是對于Spring框架的支持,在J2EE的企業軟件開發解決方案中是領先的。
          ??? 來看一下Acegi的重要的共享組件。如果組件是框架的核心而且一旦缺少這些組件框架將無法運轉,那么這些組件可以稱為是“共享”的。這些Java類型是系統其他部分的基礎,所以理解他們是十分重要的,雖然你可以并不會直接與之互動。

          ??? 其中最基礎的對象是SecurityContextHolder,用于存儲應用安全上下文的細節信息。缺省情況下,SecurityContextHolder使用ThreadLocal來存儲信息,這意味著安全上下文對于同一個線程的所有方法都是有效的。有一些應用不適合使用ThreadLocal,比如:一個Swing的客戶端可能希望所有JVM所有的線程都使用相同的安全上下文。對于這種情況,你可以用SecurityContextHolder.MODE_GLOBAL。你可以把SecurityContextHolder從缺省模式MODE_THREADLOCAL改變為MODE_GLOBAL。

          ??? 在SecurityContextHolder中存儲了與應用互動的規則。Acegi使用Authentication對象來表示這些信息。這并不是需要你自己創建Authentication對象,更通常的做法是查詢到一個Authentication對象。舉例如下,在應用的任何一個地方都可以這樣使用:

          Object obj = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
          if( obj instanceof UserDetails){
          ?String username=((UserDetails)obj).getUsername();
          }else{
          ?String username=obj.toString();
          }

          ??? 上面這段代碼介紹了不少有意思的對象和關系。首先,大家會發現在SecurityContextHolder和Authentication之間存在著一個即時對象:SecurityContext,SecurityContextHolder.GetContext()返回的類型就是SecurityContext。Acegi有數個SecurtiyContext的實現。

          ??? 另一個值得注意的是我們從Authentication中獲得了一個規則。這個規則的類型是:Object。大多數情況下,我們可以把它強制性轉換成UserDetails對象。UserDetails是Acegi的核心接口。它代表了一種規則,但是經過了應用相關的擴展。可以把UserDetails想象成為應用數據庫與Acegi的SecurityContextHolder需要的兩者之間的適配器(Adapter)。如果作為應用自己的數據庫的代表,那么可以把UserDetails強制性轉換為其原始類,這樣,你就可以調用其中的業務方法(比如:getEmail()等等)。

          ??? 那么,為什么要提供一個UserDetails對象呢?是這樣的:有一個特殊的接口:UserDetailsService,這個接口只有一個方法,這個方法接收一個String類型的表示用戶名的參數,返回UserDetails對象。大多數認證提供provider裝配一個代理到UserDetailsService上。UserDetailsService被用于創建SecurityContextHolder中存儲的Authentication對象。Acegi中提供了若干個UserDetailsService的實現,一個使用內存Map,一個用JDBC。大多數用戶傾向于寫一個自己的實現,通常是使用DAO。不論UserDetailsService返回的是什么,都可以通過SecurityContextHolder獲得。


          ??? Authentication提供另一個重要的方法是getAuthorites()。這個方法返回一個GrantedAuthority對象的數組。GrantedAuthority是授權給的認證。這個認證通常指的是“角色”,比如:ROLE_ADMINISTRATOR或者ROLE_HR_SUPERVISOR。這些角色需配置用于web認證,方法認證和域對象認證。如果Acegi的其他部分希望看到這些認證,那么UserDetailsService返回GrantedAuthority對象即可。

          ??? 最后,有時你需要在HTTP requests之間傳遞SecurityContext,有時每次請求都需要重新認證。那么可以使用HttpSessionContextIntergrationFilter,這是用于在HTTP Request之間傳遞SecurityContext的東東。就象名稱所表示的那樣:HttpSession用于存儲這些信息。但是你不需要直接操作HttpSession。

          posted @ 2007-03-07 13:00 云自無心水自閑 閱讀(1645) | 評論 (0)編輯 收藏

          1、編譯部署成功后,在地址欄中輸入:http://localhost:8080/appfuse,即可看到首頁-登錄頁

          2、第一個頁面是login.jsp,此頁面使用include包含了taglibs.jsp和loginForm.jsp
          其中taglibs.jsp是一個公共頁面,定義了頁面中使用到的taglibs
          而loginForm.jsp則是用戶登錄Form定義的頁面

          3、現在會發現一點:此時瀏覽器中顯示的內容比login.jsp的內容要多,包括最上方的語言切換行,下面的標題行,最下文的版本信息行等。
          這是因為Appfuse使用了Sitemesh的Decorator。
          在WEB-INF目錄下,有兩個Xml文件:sitemesh.xml和decorators.xml
          在Web.xml中定義了sitemesh的Filter
          在decorators目錄下有default.jsp這個布局文件。
          Sitemesh的作用就是對定義的文件進行裝飾。
          在Appfuse中,會對所有的文件作為Body安放到default.jsp這個布局文件中。

          4、查看login.jsp,發現他的Form的Action是比較奇怪的:j_security_check
          這并不是一個真實存在的URL
          在security.xml中可以發現,這個是authenticationProcessingFilter的filterProcessesUrl屬性
          這就是Spring中使用Acegi安全認證服務,在Appfuse1.9.4中使用的是Acegi的基于表單的身份認證
          filterProcessUrll告訴AuthenticationProcessingFilter應該攔截哪個URL
          屬性authenticationFailureUrl指定當身份驗證失敗時用戶應該被送往哪里
          defaultTargetUrl定義登陸成功時轉向的頁面

          5、用戶登錄成功后,轉到defaultTargeUrl所指定的路徑:/ 根路徑
          而此路徑的Welcome file是index.jsp, 而index.jsp又redirect到了mainMenum.html
          因此會顯示mainMenu.html頁面。

          posted @ 2007-03-04 23:08 云自無心水自閑 閱讀(1591) | 評論 (0)編輯 收藏

          http://www.graniteds.org/confluence/display/INTRO/Granite+Data+Services+Overview

          支持AMF3

        1. 支持AMF3
        2. EJB3服務的透明externalization機制,參見Flex2的開發文檔
        3. http://www.adobe.com/livedocs/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=ent_services_config_097_11.html
          在Flex的序列化和反序列化過程中,只能傳遞public的,非靜態的屬性,如果要序列化此部分內容在Flex與Java間傳遞,必須使用externalization機制

        4. ActionScript3的Beans的Lazy Initialize
        5. EJB3實體Bean到ActionScript3的類的代碼生成(計劃中)
        6. POJO服務(遠程調用簡單Java類的公共方法)
        7. 一系列Flex組件用于復雜的數據結構(計劃中)、
        8. posted @ 2007-03-01 22:22 云自無心水自閑 閱讀(876) | 評論 (0)編輯 收藏

          (續昨日)
          頁面亂碼的問題,今天看了一下,是資源文件的問題。
          原來appfuse提供的資源文件沒有用native2ascii處理過。

          學習心得:
          1、Appfuse的頁面基本上都包含了commom\taglibs.jsp,在此文件中定義了taglib
          在Tomcat5以上的版本中,不再需要在Web.xml中定義Taglib了,只需要在WEB-INF\lib目錄下放置standard.jar就可以了。

          posted @ 2007-03-01 00:49 云自無心水自閑 閱讀(885) | 評論 (0)編輯 收藏

          目前網上有一些介紹如何在Eclipse中應用Appfuse的文章,但因為Appfuse本身附帶了強大的Ant任務,Eclipse在其中如Raible據說更多充當的是文本編輯器的作用。編譯/部署都使用Ant完成,也比較方便。但是,無法跟蹤調試源碼,有些不爽,因此,想把Appfuse進行提煉完全整合到Eclipse中。

          一、運行Ant New
          1. 不知道為什么,此項任務會到jre的lib目錄下尋找tools.jar,沒有仔細地查找原因,簡單地把jdk\lib\tools.jar拷貝過來
          2. 需要定義CATALINA_HOME這個環境變量
          OK, 完成上述兩個步驟后,Ant命令執行成功,命令過程中有數個選項可以選擇,比如:應用名稱,數據庫名稱,Package名稱,這些關系都不大。
          有一個選項比較重要一些,是詢問使用何種Web框架,有webwork, tapestry, spring, jsf等,我也是使用的默認選項:struts.

          二、啟動MySql數據庫,運行Ant setup-db
          在數據庫中生成mydb數據庫,以及數據表

          三、在Eclipse中建立Tomcat Project名字與Ant New中輸入的應用一致。

          四、將common, decorators, images, MATA-INF, scripts, styles這幾個目錄從ant new生成的目錄復制到Eclipse項目的目錄中.
          將web-inf\pages目錄下的jsp文件拷貝到Eclipse相同目錄下。

          五、運行ant webdoclet, 生成Form目錄下的3個Form的java源文件,以及model目錄下的2個hibernate的xml映射文件

          六、將org.appfuse.webapp,org.appfuse.sercies, org.appfuse.dao以及model和util目錄所包含的所有Java源文件復制到Eclipse項目所在的文件夾web-inf\src中。

          七、將lib復制到web-inf\lib目錄下
          acegi-security-1.0.2.jar
          activation.jar
          antlr-2.7.6.jar
          antlr.jar
          asm.jar
          aspectjweaver-1.5.2.jar
          cglib-2.1.3.jar
          clickstream-1.0.2.jar
          commons-beanutils.jar
          commons-codec-1.3.jar
          commons-collections.jar
          commons-dbcp.jar
          commons-digester.jar
          commons-fileupload.jar
          commons-io.jar
          commons-lang.jar
          commons-logging-1.1.jar
          commons-pool.jar
          commons-validator.jar
          displaytag-1.1.jar
          dom4j-1.6.1.jar
          dwr.jar
          ehcache-1.2.3.jar
          hibernate3.jar
          itext-1.4.jar
          jakarta-oro.jar
          jstl.jar
          jta.jar
          log4j-1.2.11.jar
          mail.jar
          mysql-connector-java-5.0.3-bin.jar
          oscache-2.3.2.jar
          sitemesh-2.2.1.jar
          spring.jar
          standard.jar
          struts-el.jar
          struts-menu-2.4.2.jar
          struts.jar
          urlrewrite-3.0-beta.jar
          velocity-1.4.jar
          velocity-tools-view-1.1.jar

          八、啟動Sysdeo Tomcat, 在瀏覽器中輸入http://locallhost:8080/myapp, 出現頁面,輸入mraible/tomcat,登錄成功。

          九、還有一個問題就是目前所有的頁面都是亂碼,明天再解決了,今天要睡覺了。

          ?

          posted @ 2007-02-28 00:52 云自無心水自閑 閱讀(2966) | 評論 (2)編輯 收藏

          最近在Oracle網站上下載一個Oracle 10g安裝了一下,只有一張盤,而且安裝時還有一個便捷的選項,非常方便。
          可以安裝完畢后,使用的時候卻遇到了麻煩:如果只是本機的訪問 sqlplus system/manager這樣是沒有問題的。
          但是如果使用 sqlplus system/manager@orcl的時候卻會報ora-12514的錯誤。

          解決方法:
          1. 打開<OracleHome>/network/admin/listener.ora文件,找到:

          ?? SID_LIST_LISTENER =
          ?? (SID_LIST =
          ???? (SID_DESC =
          ?????? (SID_NAME = PLSExtProc)
          ?????? (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
          ?????? (PROGRAM = extproc)
          ???? )
          ?? )
          ? 2.?添加:
          ??????????? (SID_DESC =
          ?????? (GLOBAL_DBNAME = ORACLE)
          ?????? (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)?
          ?????? (SID_NAME = ORACLE)
          ????? )
          ? 3. 最后變成:
          ?SID_LIST_LISTENER =
          ?? (SID_LIST =
          ???? (SID_DESC =
          ?????? (SID_NAME = PLSExtProc)
          ?????? (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
          ?????? (PROGRAM = extproc)
          ???? )
          ???? (SID_DESC =
          ?????? (GLOBAL_DBNAME = ORACLE)
          ?????? (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)?
          ?????? (SID_NAME = ORACLE)
          ????? )
          ?? )
          ? 4. 保存文件,重啟服務中的TNSListener,OK!

          PS: Oracle10g有一個好處:不再與Tomcat的端口沖突了。原來的Oracle9i安裝完成后,8080端口就會被占用,一般都需要改tomcat的端口。現在終于輕松了。

          posted @ 2007-02-12 23:45 云自無心水自閑 閱讀(273853) | 評論 (50)編輯 收藏

          Flex是一個事件驅動的編程模型, 任何事情的發生, 其背后必然存在一個事件. 而開發者第一次看到MXML時, 很難體會到一個Xml標記的應用的事件流和實例化的生命周期. 這個對于HTML和Flash的開發者尤其會感到困惑, 因為其熟悉的方式與Flex的一點也不相似. HTML的實例化是從上到下的, Flash的執行是從Frame0開始一幀幀運行的. 而Flex則又有不同.

          從我們開始學習Flex時, 我們就需要了解事件流和MXML的實例化. 我非常困惑因為我實在難以理解什么樣的事件會被觸發或者事件什么時候會被觸發. 關鍵是要理解事件的基礎并親自觀察事件流的初始化.


          我們來看一個簡單的MXML的應用.

          <?xml version="1.0" encoding="utf-8"?>
          <mx:Application
          ??? xmlns:mx="??? layout="absolute"
          ??? backgroundGradientColors="[#67cbff, #fcffff]"
          ??? color="#000000"
          ??? fontSize="12"???
          ??? preinitialize="report( event , 'preinitialize' )"
          ??? initialize="report( event , 'initialize' )"
          ??? creationComplete="report( event , 'creationComplete' )"
          ??? applicationComplete="report( event , 'applicationComplete' )"
          ??? >
          ???
          ??? <mx:Script>
          ??????? <![CDATA[???
          ???????????????????
          ??????????? [Bindable]
          ???????????
          ??????????? public var outTextData:String="";
          ???????????
          ??????????? public function report( event:Event , value:String ):void
          ??????????? {
          ??????????????? outTextData += String( flash.utils.getTimer() ) + 'ms >> '
          ??????????????? + event.currentTarget + '.' + value + '\n';???
          ??????????? }
          ???????????
          ??????? ]]>
          ??? </mx:Script>
          ???
          ??? <mx:TextArea
          ??????? id="outTextArea"
          ??????? text="{ outTextData }"
          ??????? right="10" left="10" top="50" bottom="10" alpha="0.5"
          ??????? wordWrap="false"
          ??????? initialize="report( event , 'initialize' )"
          ??????? creationComplete="report( event , 'creationComplete' )"
          ??????? />
          ???
          ??? <mx:Button
          ??????? y="10" height="30" left="168" width="150"
          ??????? id="HelloButton"
          ??????? label="Say Hello"
          ??????? initialize="report( event , 'initialize' )"
          ??????? creationComplete="report( event , 'creationComplete' )"
          ??????? rollOver="report( event , 'rollOver' )"
          ??????? rollOut="report( event , 'rollOut' )"
          ??????? click="report( event , 'click > Hello!' )"
          ??????? />
          ???????
          ??? <mx:Button
          ??????? id="GoodByeButton"
          ??????? label="Say Goodbye"
          ??????? y="10" left="10" height="30" width="150" color="#000000"
          ??????? initialize="report( event , 'initialize' )"
          ??????? creationComplete="report( event , 'creationComplete' )"
          ??????? click="report( event , 'click > Goodbye!' )"
          ??????? />
          ???????
          ??? <mx:Button
          ??????? id="ClearButton"
          ??????? label="Clear"
          ??????? y="10" left="326" height="30" color="#000000" right="10"???????
          ??????? initialize="report( event , 'initialize' )"
          ??????? creationComplete="report( event , 'creationComplete' )"
          ??????? click="outTextData='';report( event , 'click' )"
          ???????? />
          ???
          </mx:Application>


          這個應用運行時, 輸出了實例流程和事件流. 這校我們就能夠看到所有事件的觸發順序. 可以發現應用啟動后, 事件的順序是一定的. 下面是輸出的內容:

          167ms >> EventFlow0.preinitialize
          183ms >> EventFlow0.outTextArea.initialize
          187ms >> EventFlow0.HelloButton.initialize
          188ms >> EventFlow0.GoodByeButton.initialize
          189ms >> EventFlow0.ClearButton.initialize
          189ms >> EventFlow0.initialize
          243ms >> EventFlow0.outTextArea.creationComplete
          243ms >> EventFlow0.HelloButton.creationComplete
          243ms >> EventFlow0.GoodByeButton.creationComplete
          244ms >> EventFlow0.ClearButton.creationComplete
          244ms >> EventFlow0.creationComplete
          246ms >> EventFlow0.applicationComplete

          一旦applicationComplete事件觸發后, 組件就會在鼠標事件派發后觸發自己的事件.

          1807ms >> EventFlow0.HelloButton.rollOver
          2596ms >> EventFlow0.HelloButton.rollOut
          2954ms >> EventFlow0.HelloButton.rollOver
          3170ms >> EventFlow0.HelloButton.rollOut
          3543ms >> EventFlow0.HelloButton.rollOver
          4052ms >> EventFlow0.HelloButton.click > Hello!
          4267ms >> EventFlow0.HelloButton.click > Hello!
          4474ms >> EventFlow0.HelloButton.click > Hello!
          4569ms >> EventFlow0.HelloButton.rollOut
          4907ms >> EventFlow0.GoodByeButton.click > Goodbye!
          5130ms >> EventFlow0.GoodByeButton.click > Goodbye!

          ?

          posted @ 2007-02-11 23:50 云自無心水自閑 閱讀(3930) | 評論 (1)編輯 收藏

          ?

          在ActionScript 3中,你會發現在flash.utils包中有一系列函數提供了反射的功能。主要包含以下功能:

          ??? * 確定對象的類
          ??? * 獲取類的成員、方法、構造函數、父類的信息
          ??? * 確定接口聲明的常數和方法
          ??? * 在運行時根據類名創建類的實例
          ??? * 在運行時根據成員名稱獲取或者設置對象成員的值
          ??? * 在運行時根據方法名稱,調用對象的方法

          你可以使用類似于"describeType"之類的功能,它返回一個Xml對象。舉一個例子:

          package {
          ??? import flash.display.Sprite;
          ??? import flash.utils.describeType;
          ??
          ??? public class DescribeTypeExample extends Sprite {
          ??????? public function DescribeTypeExample() {
          ??????????? var child:Sprite = new Sprite();
          ??????????? var description:XML = describeType(child);
          ??????????? trace(description..accessor.@name.toXMLString());
          ??????? }
          ??? }
          }

          如果你想進一步,根據類名創建對象的實例,我們可以使用"getDefinitionByName()"

          package {
          ??? import flash.display.DisplayObject;
          ??? import flash.display.Sprite;
          ??? import flash.utils.getDefinitionByName;

          ??? public class GetDefinitionByNameExample extends Sprite {
          ??????? private var bgColor:uint = 0xFFCC00;
          ??????? private var size:uint = 80;

          ??????? public function GetDefinitionByNameExample() {
          ??????????? var ClassReference:Class = getDefinitionByName(“flash.display.Sprite”) as Class;
          ??????????? var instance:Object = new ClassReference();
          ??????????? instance.graphics.beginFill(bgColor);
          ??????????? instance.graphics.drawRect(0, 0, size, size);
          ??????????? instance.graphics.endFill();
          ??????????? addChild(DisplayObject(instance));
          ??????? }
          ??? }
          }

          盡管這是一些非常方便的方法,但是在FlashPlayer中使用反射還是會有許多的限制,因為缺乏運行時的動態源碼編譯。上面的功能對于那些在內建的類,比如:Sprite類來說無疑是有用的,但是對于自定義類來說,我們會遇到很多麻煩。比如:

          package {
          ??? import com.customtypes.string; // Custom String Implementation Class
          ??? import flash.utils.getDefinitionByName;

          ??? public class GetDefinitionByNameExample {
          ??????? public function GetDefinitionByNameExample() {
          ??????????? var ClassReference:Class = getDefinitionByName(“com.customtypes.string”) as Class;
          ??????????? var instance:Object = new ClassReference();
          ??????????? instance.customParameter = “my parameter”;
          ??????? }
          ??? }
          }

          盡管我們使用了import語句,但是"getDefinitionByName()"還是會失敗。原因上面已經說過了,在運行時編譯源代碼是不允許的。也許以后可以。在目前情況下,要實現上述功能,至少要在代碼中初始化一個類的實例。也就是聲明一個類的實例:

          var customType : com.customtypes.string;

          ?

          posted @ 2007-02-10 14:32 云自無心水自閑 閱讀(1250) | 評論 (4)編輯 收藏

          僅列出標題
          共29頁: First 上一頁 18 19 20 21 22 23 24 25 26 下一頁 Last 
          主站蜘蛛池模板: 五常市| 北流市| 十堰市| 伊金霍洛旗| 双鸭山市| 东明县| 安图县| 织金县| 运城市| 嘉兴市| 襄汾县| 民乐县| 水城县| 明水县| 平和县| 桦川县| 胶州市| 宁国市| 永嘉县| 鹰潭市| 吉安县| 秦皇岛市| 青州市| 衡阳市| 麻城市| 城市| 积石山| 柏乡县| 平顺县| 桐柏县| 搜索| 雷州市| 铁力市| 南华县| 柞水县| 屯昌县| 安岳县| 藁城市| 林州市| 灵武市| 沾化县|