<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    云自無心水自閑

    天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
    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 云自無心水自閑 閱讀(1630) | 評論 (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 云自無心水自閑 閱讀(1343) | 評論 (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 云自無心水自閑 閱讀(1649) | 評論 (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 云自無心水自閑 閱讀(1595) | 評論 (0)編輯 收藏

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

    支持AMF3

  • 支持AMF3
  • EJB3服務的透明externalization機制,參見Flex2的開發文檔
  • 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機制

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

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

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

    posted @ 2007-03-01 00:49 云自無心水自閑 閱讀(888) | 評論 (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 云自無心水自閑 閱讀(2969) | 評論 (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 云自無心水自閑 閱讀(273864) | 評論 (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 云自無心水自閑 閱讀(3933) | 評論 (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 云自無心水自閑 閱讀(1253) | 評論 (4)編輯 收藏

    僅列出標題
    共29頁: First 上一頁 18 19 20 21 22 23 24 25 26 下一頁 Last 
    主站蜘蛛池模板: 亚洲AV成人潮喷综合网| 免费精品人在线二线三线区别| 亚洲精品乱码久久久久久蜜桃| 亚洲av永久无码精品秋霞电影秋 | 亚洲色丰满少妇高潮18p| 国产精品无码免费播放| 亚洲人成电影网站久久| 国产情侣激情在线视频免费看| 亚洲人成激情在线播放| 97无码免费人妻超级碰碰碰碰 | 国产精品亚洲专区无码唯爱网| 国产精品黄页在线播放免费| 国产精品亚洲lv粉色| 无码欧精品亚洲日韩一区夜夜嗨 | 最近高清国语中文在线观看免费 | 亚洲色偷精品一区二区三区| 免费在线视频一区| 国产V片在线播放免费无码| 亚洲欧洲日产国码无码网站| 免费人成网站在线观看不卡| 亚洲国产美女福利直播秀一区二区 | 免费91麻豆精品国产自产在线观看 | 激情97综合亚洲色婷婷五 | 一个人看的www免费视频在线观看| 亚洲av无码精品网站| 亚洲三级高清免费| 国产偷国产偷亚洲高清人| 亚洲中文字幕无码一区| 猫咪免费人成网站在线观看| 亚洲一区AV无码少妇电影| 亚洲国产精品无码久久青草 | 亚洲AV无码专区日韩| 国产又黄又爽胸又大免费视频 | 青青视频免费在线| 亚洲av午夜成人片精品网站 | 伊人免费在线观看| 亚洲制服丝袜第一页| 亚洲乱码中文字幕手机在线| 99视频精品全部免费观看| 国产精品亚洲专区无码唯爱网| 亚洲国产精品一区二区成人片国内 |