乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JSF Tour 5 MyFaces Intro

       chanvy 2009-01-08
      Apache MyFaces項(xiàng)目包含了幾個(gè)關(guān)于JavaServer技術(shù)的子項(xiàng)目。如果需要了解更多關(guān)于JavaServer Faces的知識(shí),請(qǐng)參考MyFaces對(duì)于JSF的介紹。
          Apache MyFaces項(xiàng)目提供了以下的功能:
          JavaServer Faces的實(shí)現(xiàn)(MyFaces API和MyFaces Impl模塊)
          用于構(gòu)建JSF相關(guān)的web應(yīng)用程序的組件庫(kù),例如MyFaces Tomahawk、MyFaces Trinidad、MyFaces Tobago。
          JavaServer Faces擴(kuò)展包,例如MyFaces Orchestra。
          與其他技術(shù)和標(biāo)準(zhǔn)的集成模塊。(用于開發(fā)移動(dòng)客戶端,在本文和后續(xù)文章中對(duì)這部分功能不進(jìn)行介紹。)
          可以在如下位置下載和MyFaces Impl及其各個(gè)子項(xiàng)目的發(fā)布包及樣例程序。MyFaces API 中國(guó)網(wǎng)管聯(lián)盟www、bitsCN、com

          在JSF的子項(xiàng)目中,Core子項(xiàng)目視JSF規(guī)范的一個(gè)實(shí)現(xiàn),其他的項(xiàng)目實(shí)現(xiàn)了相關(guān)的規(guī)范,例如Portlet Bridge,或者為其他的JSF實(shí)現(xiàn)添加了擴(kuò)展,注意,不僅僅是MyFaces Core。同時(shí),MyFaces的擴(kuò)展,例如Tomahawk,可以和任意的JSF實(shí)現(xiàn)協(xié)同工作,例如Sun Reference Inplementation。
          MyFaces Core1.1.x可以在Tomcat 5.5下工作,但是MyFaces Core 1.2.x要求 Tomcat 6.0環(huán)境。
          MyFaces項(xiàng)目不依賴于其他的項(xiàng)目。它是一個(gè)獨(dú)立的程序。

      網(wǎng)管網(wǎng)bitsCN_com

       

          JSF FAQ
          1.     javax.faces.STATE_SAVING_METHOD的值為client和server時(shí)的區(qū)別?
          簡(jiǎn)而言之,server端狀態(tài)降將UI組件的持有的信息在HTTP Session中保存,而client狀態(tài)將UI組件持有的信息保存在返回給用戶的頁(yè)面的隱藏域(hidden field)。
          client端狀態(tài)對(duì)于非常大數(shù)量的用戶來(lái)說(shuō)比較實(shí)用,因?yàn)椴恍枰诜?wù)器端保存用戶的狀態(tài),從而節(jié)省了內(nèi)存。但是缺點(diǎn)是在網(wǎng)絡(luò)中為每個(gè)請(qǐng)求傳送了更多的數(shù)據(jù)。
          即使選擇的是client端狀態(tài),任何一個(gè)session-scoped實(shí)體仍然存在于http session中,這個(gè)標(biāo)記只是影響JSF實(shí)現(xiàn)將UI組件持有的數(shù)據(jù)存放在什么位置。
          任何實(shí)現(xiàn)了StateHolder的組件,必須實(shí)現(xiàn)saveState(FacesContext)和restoreState(FacesContext, Object)方法,來(lái)幫助JavaServer Faces Implementation來(lái)保存和恢復(fù)跨越多個(gè)請(qǐng)求的組件的狀態(tài)。
          為了設(shè)置值,必須實(shí)現(xiàn)saveState方法。這個(gè)方法在render響應(yīng)階段被調(diào)用,在這期間響應(yīng)的狀態(tài)被設(shè)置,用來(lái)處理后需的請(qǐng)求。下面是MapComponent組件的該方法的實(shí)現(xiàn):
          public Object saveState(FacesContext context) { 中國(guó)網(wǎng)管聯(lián)盟www、bitsCN、com
              Object values[] = new Object[2];
              values[0] = super.saveState(context);
              values[1] = current;
              return (values);
          }
          該方法初始化了一個(gè)數(shù)組,用來(lái)持有保存了的狀態(tài),然后保存所有與MapComponent關(guān)聯(lián)的狀態(tài)的所有內(nèi)容。
          實(shí)現(xiàn)StateHolder的組件必須提供restoreState方法,該方法用來(lái)恢復(fù)保存在saveState方法中保存的組件的狀態(tài)。restoreState方法在恢復(fù)視圖階段被調(diào)用,在此期間,JavaServer Faces Implementation會(huì)檢查是否在最后render response階段保存了狀態(tài),并判斷是否需要恢復(fù),以便進(jìn)行下次的后退。下面是MapComponent組件的restoreState方法。
          public void restoreState(FacesContext context, Object state) {
              Object values[] = (Object[]) state;
               super.restoreState(context, values[0]);
              current = (String) values[1]; 中國(guó)網(wǎng)管聯(lián)盟www_bitscn_com
          }
          該方法的參數(shù)為FacesContext和Object實(shí)例,表示存儲(chǔ)組件狀態(tài)的數(shù)組。這個(gè)方法將Object數(shù)組中保存的數(shù)據(jù)進(jìn)行設(shè)置。
          當(dāng)在自定義的組件類中實(shí)現(xiàn)這些方法時(shí),確保在部署描述符中指定了需要將這些狀態(tài)保存在哪里,即client還是server。如果狀態(tài)時(shí)保存在client,整個(gè)視圖的狀態(tài)都被提供給頁(yè)面的一個(gè)hidden field。
          可以通過(guò)設(shè)置javax.faces.STATE_SAVING_METHOD上下文參數(shù)(context-parameter)。
          2.     瀏覽器總是顯示一個(gè)到上一個(gè)頁(yè)面的鏈接?
          默認(rèn)情況下,JSF在內(nèi)部使用forward操作來(lái)在頁(yè)面之間導(dǎo)航。
          所以當(dāng)一個(gè)用戶首先訪問(wèn)頁(yè)面A,然后取回一些內(nèi)容。這些內(nèi)容會(huì)被包裝在表單中,表單以頁(yè)面A作為提交的地址。
          當(dāng)用戶接著執(zhí)行操作,提交頁(yè)面,這時(shí)JSF收到post請(qǐng)求,回復(fù)頁(yè)面A的視圖,并執(zhí)行postback處理。作為postback處理的一部分,頁(yè)面A的邏輯可能通知JSF框架應(yīng)該顯示頁(yè)面B。
          默認(rèn)情況下,JSF會(huì)執(zhí)行一個(gè)內(nèi)部forward到頁(yè)面B,使頁(yè)面B被取回,作為用戶提交表單的結(jié)果。
          這時(shí)用戶在屏幕上看到頁(yè)面B。但是瀏覽器只知道它將數(shù)據(jù)發(fā)送給了頁(yè)面A,所以,瀏覽器導(dǎo)航欄上顯示的URL是頁(yè)面A的URL,雖然顯示的內(nèi)容是頁(yè)面B。不幸的是,HTTP/HTML不能使瀏覽器知道應(yīng)該顯示頁(yè)面B的URL。因此,作為JSF的默認(rèn)行為,瀏覽器的URL經(jīng)常是實(shí)際顯示內(nèi)容的頁(yè)面的上一頁(yè)。 中國(guó)網(wǎng)管論壇bbs.bitsCN.com
          不僅僅對(duì)于用戶來(lái)說(shuō)是奇怪的,同時(shí)加入收藏夾的時(shí)候也比較困難,注意,收藏夾的位置一般來(lái)說(shuō)是沒(méi)有關(guān)系的。因?yàn)镴SF應(yīng)用程序通常是可交互的,并且是狀態(tài)豐富的。
          另外一個(gè)缺點(diǎn)是在JSF視圖中使用關(guān)聯(lián)鏈接是不安全的。(例如樣式表的相對(duì)路徑或者圖標(biāo))。當(dāng)瀏覽器提交內(nèi)容到A,并獲取數(shù)據(jù)共頁(yè)面B使用時(shí),在返回頁(yè)面中的relative links都會(huì)被作為相對(duì)于它(瀏覽器)所知道的最后的url。所以第一次查看頁(yè)面B時(shí),所有相對(duì)鏈接都是相對(duì)于頁(yè)面A的,如果A和頁(yè)面B不在一個(gè)目錄中,那么就會(huì)出現(xiàn)問(wèn)題。
          這個(gè)問(wèn)題的一個(gè)解決辦法就是使用<redirect/>標(biāo)記來(lái)定義導(dǎo)航規(guī)則。這樣,會(huì)使用http redirect命令錘嫠咪榔骰袢⌒亂趁媯傭〈蔥心誆康膄orward。 但是,這樣做效率比較低,因?yàn)闉g覽器需要使用第二次請(qǐng)求來(lái)獲取它的內(nèi)容,而不是在針對(duì)初始的post請(qǐng)求,在響應(yīng)時(shí)立即獲取它的內(nèi)容。另外一個(gè)重要的問(wèn)題就是,獲取頁(yè)面B的內(nèi)容是在一個(gè)單獨(dú)的請(qǐng)求中,這樣就沒(méi)有辦法從A頁(yè)面中傳遞任何的請(qǐng)求范圍(request-scoped)數(shù)據(jù),在這樣的目的使用request范圍的變量非常方便,也是很常用的。
          Tomahawk sandbox庫(kù)中包含了s:redirectTracker組件,可以臨時(shí)將request-scoped變量保存在http session中,這樣使用<redirect/>規(guī)則就可以在不丟失request范圍變量的情況下使用,但是這要求存在http session,并且效率低下。

      中國(guó)網(wǎng)管聯(lián)盟www、bitsCN、com


          MyFaces FAQ
          1.     什么是shared項(xiàng)目?
          如果myfaces-core、tomahawk、tobago、trinidad都是完全獨(dú)立的項(xiàng)目,那么就不需要shared代碼項(xiàng)目,每個(gè)項(xiàng)目都在各自的名稱空間內(nèi)維護(hù)代碼。但是,會(huì)存在大量的重復(fù)代碼,并且工作量的浪費(fèi)。因?yàn)樗鼈兌紝儆趍yfaces項(xiàng)目,所以多個(gè)子項(xiàng)目可以共用的代碼放在shared項(xiàng)目中,以便減少開發(fā)和維護(hù)的工作量。
          但是,這些子項(xiàng)目又都有各自的獨(dú)立釋放周期。并且,tomahawk/tobago/trinidad都應(yīng)該運(yùn)行在任意的JSF實(shí)現(xiàn)上,而不僅僅是myfaces-core。目前使用的解決辦法是重命名shared的類的報(bào)名。代碼被重命名成org.apache.myfaces.shared_impl、org.apache.myfaces.shared_tomahawk等等。這樣每個(gè)子項(xiàng)目就可以在發(fā)布的時(shí)候包含所有的支持類,而不是一個(gè)獨(dú)立的共享jar文件,也不需要關(guān)心相同類的定義的沖突。對(duì)于特定項(xiàng)目的升級(jí)不會(huì)影響到相同環(huán)境下的其他項(xiàng)目。
          注意最近的MyFaces項(xiàng)目的釋放都是用了shared庫(kù),并在源代碼的jar文件中包含了shared項(xiàng)目的源代碼,所以不需要添加額外的源代碼jar文件。
          2.     如何從MyFaces獲取格式良好的HTML輸出?

      中國(guó)網(wǎng)管聯(lián)盟www_bitscn_com


          JTidy項(xiàng)目提供了一個(gè)ServletFilter,可以將響應(yīng)的消息在輸出前進(jìn)行重新的格式化。Mozilla Firefox瀏覽器提供了一個(gè)擴(kuò)展的View Formatted Source功能。
          在一些版本的MyFaces中,可以通過(guò)設(shè)置org.apache.myfaces.PRETTY_HTML來(lái)在web.xml文件中啟用pretty輸出。但是,這個(gè)選項(xiàng)從來(lái)都沒(méi)有被很好的支持,因?yàn)樾枰械膔enderer來(lái)支持,以便其工作。可能在以后的MyFaces發(fā)布中移除。
          3.     MyFaces Core和tomahawk發(fā)布包中的版本號(hào)表示什么?
          MyFaces Core使用三個(gè)部分來(lái)表示版本,例如1.1.1。但是這個(gè)值和普通的版本號(hào)計(jì)數(shù)是不同的。強(qiáng)兩個(gè)數(shù)字表示了JSF規(guī)范的版本。因?yàn)槎M(jìn)制的JSF規(guī)范的API沒(méi)有改變,前兩位數(shù)字相同的發(fā)布包被認(rèn)為是兼容的,所有使用JSF指定特征的既存代碼會(huì)同樣可以使用。
          Tomahawk庫(kù)也適用相同格式的版本號(hào)。但是因?yàn)镴SF 1.2規(guī)范是向后兼容的,即兼容JSF 1.1規(guī)范,所有Tomahawk發(fā)布的版本中,1.1.x同樣可以工作在JSF 1.2上。注意,tomahawk釋放不保證二進(jìn)制向后兼容。
          4.     為什么DataModel不是可序列化的? 網(wǎng)管聯(lián)盟www.bitsCN.com
          DataModel類(在UIData組件中使用)在顯示和恢復(fù)視圖階段不需要保存任何任何狀態(tài)。因此,不需要將它定義為可序列化的。
          如果需要定義可序列化的managed bean,并且它包含一個(gè)DataModel類型的成員變量,那么將成員變量定義為transient。
          5.     為什么時(shí)間顯示不正確?
          JSF規(guī)范要求默認(rèn)的date->String轉(zhuǎn)換器使用標(biāo)準(zhǔn)的UTC時(shí)區(qū),也叫做GMT時(shí)區(qū)。
          MyFaces 1.1.0或者早期的發(fā)布并沒(méi)有遵循JSF規(guī)范,它們默認(rèn)的使用了服務(wù)器的時(shí)區(qū)。
          可以通過(guò)顯示試用轉(zhuǎn)換器來(lái)進(jìn)行時(shí)區(qū)的控制,例如:
          <f:convertDateTime timeZone="Antarctica/South_Pole" .../>
          或者
          <f:convertDateTime timeZone="#{bean.timeZone}" .../>
          #{bean.timeZone}返回字符串id或者TimeZone實(shí)例。
          當(dāng)然,也可以注冊(cè)自定義的converter來(lái)覆蓋標(biāo)準(zhǔn)的converter,使自定義代碼適用于所有的時(shí)間到字符串的轉(zhuǎn)換。
          6.     如何在一個(gè)managed bean中訪問(wèn)另外一個(gè)managed bean?

      54ne.com


          有兩種方法來(lái)實(shí)現(xiàn)訪問(wèn)同一個(gè)webapp中的其他managed bean:
          使用依賴注入:在faces配置文件中定義managed beans,managed bean的屬性可以被聲明成到其他managed bean的引用:
          <managed-bean>
             <managed-bean-name>neededBean</managed-bean-name>
             <managed-bean-class>fqn.to.NeededBean</managed-bean-class>
             <managed-bean-scope>session</managed-bean-scope>
           </managed-bean> m

       

           <managed-bean>
             <managed-bean-name>usingBean</managed-bean-name>
             <managed-bean-class>fqn.to.UsingBean</managed-bean-class>
             <managed-bean-scope>request</managed-bean-scope>
             <managed-property>
               <property-name>neededBean</property-name>
               <value>#{neededBean}</value>
             </managed-property>
           </managed-bean>
          限定條件如下:
          using bean必須的生命周期小于或者等于被引用的needed bean
          using bean必須具有setter方法,以needed bean作為參數(shù)
          beans不能管理彼此的依賴。
          使用查詢機(jī)制:下面的代碼可以在MyFaces 1.1中來(lái)顯示的通過(guò)名字查詢?nèi)我獾膍anaged bean。 54com.cn
          FacesContext facesContext = FacesContext.getCurrentInstance();
          NeededBean neededBean
              = (NeededBean) facesContext.getApplication()
                  .getVariableResolver().resolveVariable(facesContext, "neededBean");
          在MyFaces 1.2中,不使用上述的方法,而是推薦使用:
          ELContext elContext = FacesContext.getCurrentInstance().getELContext();
          NeededBean neededBean
              = (NeededBean) FacesContext.getCurrentInstance().getApplication()
                  .getELResolver().getValue(elContext, null, "neededBean");
          同樣,可以使用這個(gè)代碼來(lái)計(jì)算任意的JSF表達(dá)式:
          FacesContext facesContext = FacesContext.getCurrentInstance();
          NeededBean neededBean
              = (NeededBean)facesContext.getApplication() feedom.net
                .createValueBinding("#{neededBean}").getValue(facesContext);
          7.     如何得知一個(gè)managed bean的屬性是否都被設(shè)置?
          managed bean必須具有一個(gè)默認(rèn)的無(wú)參構(gòu)造器。所有的managed-property聲明會(huì)調(diào)用合適的setter方法。但是,通常在所有的bean屬性被定義后進(jìn)行一些初始化的操作。
          Spring提供了post-inistialisation回調(diào)功能,任何實(shí)現(xiàn)InitializingBean的bean會(huì)調(diào)用afterPropertiesSet方法。在JSF中沒(méi)有準(zhǔn)確的等價(jià)操作,但是有一些接近的方式:
          定義bean的setter方法,例如public void setInitialized(boolean state)
          將下面的屬性作為managed bean的最后一個(gè)屬性
           <managed-bean>
              ....
              <managed-property>
                <property-name>initialized</property-name>
                <value>true</value>

      中國(guó)網(wǎng)管聯(lián)盟www、bitsCN、com

              </managed-property>
           </managed-bean>
          JSF規(guī)范要求managed properties根據(jù)它們聲明的順序進(jìn)行初始化。所以setInitialized方法會(huì)在所有其他屬性被調(diào)用后進(jìn)行設(shè)置。
       
      8.     PhaseListener為什么會(huì)被調(diào)用兩次?
          JSF規(guī)范要求任何JSF實(shí)現(xiàn)框架在啟動(dòng)時(shí)自動(dòng)加載/WEB-INF/faces-config.xml,所以沒(méi)有必要添加如下的context參數(shù):
          <context-param>
             <param-name>javax.faces.CONFIG_FILES</param-name>
             <param-value>/WEB-INF/faces-config.xml</param-value>
          </context-param>
          如果在web.xml文件中配置了上述信息,會(huì)迫使JSF實(shí)現(xiàn)加載配置文件兩次,所以注冊(cè)了每個(gè)phase listener兩次。
          9.     dataTables的Action listener和action命令沒(méi)有被調(diào)用?
          如果action源(h:commandLink,h:commandButton)沒(méi)有被提供,那么Action Listeners和actions就不會(huì)被激活。當(dāng)action源在dataTable上時(shí),并且dataTable的value屬性指向一個(gè)請(qǐng)求范圍的數(shù)據(jù)源,那么action源在接下來(lái)的請(qǐng)求中就沒(méi)有被提供,例如:
          <h:dataTable value="#{requestScopedBean.dataModel.wrappedData}" /> 
                  <h:column>
                          <h:commandLink value="click here" action="#{backingBean.willNotFire}" />
                  </h:column>
          </h:dataTable>
          action源沒(méi)有被rendered,是因?yàn)閿?shù)據(jù)源在隨后的請(qǐng)求中不存在了(在第一次響應(yīng)完成后,被垃圾回收器進(jìn)行了回收)。
          為了解決這個(gè)問(wèn)題,使用t:saveState標(biāo)記或者將request范圍的bean放在session范圍內(nèi):
          <t:saveState value="#{myRequestScopedBean.dataModel.wrappedData}" />
          10. 日歷、樹等不能工作,并發(fā)生javascript腳本錯(cuò)誤?
          這是需要配置MyFacesExtensionFilter。
          一些MyFaces組件不僅僅包含了HTML,可能需要額外的支持腳本、樣式表、圖片等等。這些資源包含在MyFaces的jar文件中,Extensions Filter添加所需的代碼和URL來(lái)提供這些資源給生成的HTML。
      網(wǎng)管聯(lián)盟www.bitsCN.com

          一些其他的組件,例如文件上傳需要解析Multipart請(qǐng)求,這也是由Extensions Filter來(lái)完成的。
          使用ExtensionFilter有如下的好處:
          將MyFaces的組件和應(yīng)用程序良好的隔離
          不需要在頁(yè)面或者webapp中添加MyFaces其他的組件相關(guān)的代碼或者資源。
          為MyFaces開發(fā)組提供了靈活的更新組件,保持透明及向后兼容的功能。
          為頁(yè)面開發(fā)人員減輕了壓力。
          只加載對(duì)使用組件的資源
          處理MyFaces資源緩存
          可以通過(guò)如下方式配置extension filter:
          在web.xml文件中,將filter映射到JSF頁(yè)面,例如*.jsp,以便使filter可以更新頁(yè)面中的資源鏈接;同時(shí)映射filter到/faces/myFaces/ExtensionResources/*路徑,這樣可以處理頁(yè)面獨(dú)立的資源,例如圖片,javascript腳本文件以及樣式表等等。下面是一個(gè)配置的例子:
          <filter>
              <filter-name>MyFacesExtensionsFilter</filter-name>
              <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
      54ne.com

              <init-param>
                  <param-name>maxFileSize</param-name>
                  <param-value>20m</param-value>
                  <description>Set the size limit for uploaded files.
                      Format: 10 - 10 bytes
                              10k - 10 KB
                              10m - 10 MB
                              1g - 1 GB
                  </description> feedom.net
              </init-param>
          </filter>
      網(wǎng)管網(wǎng)bitsCN_com

       

          <!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
          <filter-mapping>
              <filter-name>MyFacesExtensionsFilter</filter-name>
              <!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->
              <servlet-name>Faces Servlet</servlet-name>
          </filter-mapping>

      網(wǎng)管聯(lián)盟www.bitsCN.com

       

          <!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.) -->
          <filter-mapping>
              <filter-name>MyFacesExtensionsFilter</filter-name>
              <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
          </filter-mapping>
          同樣,也可以將使用url-pattern來(lái)代替serlvet-name元素。但是仍然需要/faces/myFacesExtensionResource/*這個(gè)映射。
          <!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages -->
          <filter-mapping>
              <filter-name>MyFacesExtensionsFilter</filter-name>
              <url-pattern>*.jsf</url-pattern>
          </filter-mapping>
          使用這個(gè)過(guò)濾器不會(huì)對(duì)性能造成太大的影響,即不會(huì)延遲響應(yīng)時(shí)間,但是由于需要在將響應(yīng)寫出到客戶端之前在內(nèi)存中將整個(gè)response進(jìn)行緩存,會(huì)增加內(nèi)存的使用。

      中國(guó)網(wǎng)管論壇bbs.bitsCN.com

          如果只是使用標(biāo)準(zhǔn)的JSF組件,而不是用MyFaces擴(kuò)展的組件,以t:打頭的,那么就不需要使用這個(gè)filter,否則的話,就需要進(jìn)行配置。
          11. “ExtensionFilter not correctly configured.” Error?
          如果發(fā)生如下的錯(cuò)誤:
          "java.lang.IllegalStateException: ExtensionsFilter not correctly configured. JSF mapping missing. JSF pages not covered"
          并且所有的配置已經(jīng)正確的設(shè)置,那么檢查以下內(nèi)容:
          確保配置正確,參考:http://myfaces./tomahawk/extensionsFilter.html
          如果使用Servlet 2.4,那么不能使用jsp:forward或者request.getDispatcher().forward來(lái)跳轉(zhuǎn)到某個(gè)頁(yè)面,因?yàn)闆](méi)有執(zhí)行extensions filter,作為替代方法,要使用response.sendRedirect方法。
          12. 使用tomahawk:popup標(biāo)記時(shí),發(fā)生NullPointerException,在HtmlPopupRenderer.encodedEnd
          facet的名字需要硬編碼成”popup”。
          庫(kù)的依賴情況
          MyFaces核心包和組件庫(kù)。
          當(dāng)發(fā)布MyFaces類庫(kù)的時(shí)候,也就是說(shuō)不是Core框架,它會(huì)和當(dāng)前的MyFaces Core,Sun Mojarra(即Sun JSF RI)的釋放版本兼容。
      54com.cn

          同時(shí)支持一些其他的版本,但是不做任何保證。
          Getting Started
          開始Apache MyFaces的第一步應(yīng)該是查看一下樣例應(yīng)用程序??梢栽趆ttp://www./myfaces.jsf查看這些程序,或者可以通過(guò)自定義部署來(lái)完成??梢酝ㄟ^(guò)以下方式來(lái)部署:
          下載Tomcat5.x/Tomcat6.x
          MyFaces例子。下載最新的webapp文件(tomahawk-X.X.X-examples.zip)
          將MyFaces樣例文件解壓縮到指定目錄。
          將任何之前在Tomcat中發(fā)布過(guò)的MyFaces應(yīng)用程序清除,同時(shí)清空Tomcat的work目錄。并且保證類路徑或者Tomcat的lib(common/lib or shared/lib)中不存在jsf-api.jar或者jsf-impl.jar(也就是說(shuō)Sun API和實(shí)現(xiàn))。將simple.war文件或者其他的例子拷貝到Tomcat安裝目錄的webapps目錄。啟動(dòng)Tomcat。
          也可以使用MyFaces 運(yùn)行Sun JSF RI樣例程序,具體介紹參考這里。
          如何在自定義的web應(yīng)用程序中使用MyFaces?建議步驟:
          在MyFaces Wiki網(wǎng)站查看與開發(fā)環(huán)境中servlet容器的兼容性
              然后可以使用樣例程序來(lái)開始開發(fā),例如blank.war。將blank.war解壓縮后,就構(gòu)成了需要工作的目錄結(jié)構(gòu)。 中國(guó)網(wǎng)管聯(lián)盟www_bitscn_com
          安裝和配置
          1.     在沒(méi)有網(wǎng)絡(luò)連接的情況下使用Tomahawk
          tomahawk.jar文件包含了META-INF/faces-config.xml,該文件使用了到web-facesconfig_1_1.dtd的PUBLIC引用。這使得在應(yīng)用程序服務(wù)器啟動(dòng)的時(shí)候,訪問(wèn)java.sun.com來(lái)參考該DTD文件。這個(gè)問(wèn)題的顯示如下(從Tomcat日志中獲取):
          “javax.faces.FacesException:Can’t parse configuration file:jar:file:/<web-context-path>/WEB-INF/lib/tomahawk.jar !/META-INF/faces-config.xml”
          解決這個(gè)問(wèn)題的辦法如下:
          在tomahawk.jar文件中添加META-INF/web-facesconfig_1_1.dtd
          修改同目錄的faces-config.xml的到DTD的引用:
          <!DOCTYPE faces-config SYSTEM "web-facesconfig_1_1.dtd">
          2.     Apache Tomcat作為Servlet容器。
          Apache Tomcat 5.5.x(不包括5.5.9)
          Apache Tomcat 5.5.x可以和MyFaces共同工作,所有需要的jar文件已經(jīng)在MyFaces提供的war文件中包含。 54ne.com
          如果在啟動(dòng)時(shí)看到空白頁(yè)面,那么需要移除jsp-2.0.jar和commons.el。因?yàn)門omcat5.5.x將這些文件放在容器外,造成了和MyFaces的war文件提供的jar文件沖突。 54ne.com

       

          專題項(xiàng)目
          1.     JSF狀態(tài)管理
          StateManager管理狀態(tài),但是作為終端用戶,必須告訴它需要保存什么。這可以通過(guò)實(shí)現(xiàn)Serializable接口(正確的使用transient變量)或者實(shí)現(xiàn)StateHolder來(lái)完成。
          數(shù)據(jù)在JSF中以兩種不同的方式存儲(chǔ):在特定范圍的bean中,或者在組件樹中。特定范圍的bean經(jīng)常是自解釋的。組件的狀態(tài)保存在響應(yīng)中,然后再請(qǐng)求到達(dá)時(shí)被恢復(fù)。有效的方式是讓數(shù)據(jù)存儲(chǔ)在組件的page范圍,只要頁(yè)面不改變的話。注意,組件保存值的綁定和方法的綁定,通過(guò)使用EL表達(dá)式(#{}),所以他們指向的beans不在頁(yè)面范圍內(nèi)存儲(chǔ)到組件樹中。
          MyFaces有一個(gè)SaveState組件叫做<t:saveState>,允許將數(shù)據(jù)作為組件樹的一部分存儲(chǔ)。
          Immediate屬性是如何工作的?
          immediate屬性可以被用來(lái)達(dá)成如下的功能:
          允許commandLink或者commandButton來(lái)將用戶導(dǎo)航到其他頁(yè)面,而不需要處理當(dāng)前頁(yè)面的輸入域中的數(shù)據(jù)。特別是這允許在發(fā)生驗(yàn)證錯(cuò)誤的情況下進(jìn)行導(dǎo)航。典型的例子就是cancel按鈕。
          允許commandLink或者commandButton在忽略一些輸入域的驗(yàn)證來(lái)觸發(fā)后臺(tái)邏輯。這是上面所說(shuō)的更普遍說(shuō)法。 中國(guó)網(wǎng)管聯(lián)盟www_bitscn_com
          使一個(gè)或多個(gè)輸入組件具有驗(yàn)證高優(yōu)先級(jí)。這樣的話,如果同一個(gè)頁(yè)面中有些低優(yōu)先級(jí)的輸入包含不合法的輸入時(shí),驗(yàn)證也不會(huì)進(jìn)行。這樣可以減少錯(cuò)誤消息的顯示。
          在討論immediate之前,首先來(lái)看一下JSF請(qǐng)求處理生命周期:
          Restore View – 創(chuàng)建或者回復(fù)前一個(gè)頁(yè)面
          Apply Request Values – 將組件的提交值設(shè)置為請(qǐng)求值
          Process Validations – 轉(zhuǎn)換和驗(yàn)證組件的值。如果提交的值是合法的,那么將組件的值設(shè)置為提交的值。
          Update Model Values – 將后臺(tái)bean的值設(shè)置為組件的值。
          Invoke Application – 執(zhí)行actionListeners和actions。
          Render Response – 返回響應(yīng)。
          很多開發(fā)人員認(rèn)為使用immediate標(biāo)記是用來(lái)使組件跳過(guò)Process Validations階段。使用immediate屬性的目的是使組件在Apply Request Values階段被處理。
          使用immediate屬性意味著組件的值會(huì)在apply-request-values階段被驗(yàn)證,也就是說(shuō),在其他的non-immediate組件的值之前(這些驗(yàn)證是在process-validators階段被驗(yàn)證)。任何被標(biāo)記為immediate的輸入組件如果發(fā)生炎癥錯(cuò)誤,都會(huì)導(dǎo)致處理在完成apply-request-values后跳轉(zhuǎn)到render階段。也就是說(shuō),如果任何immediate組件驗(yàn)證失敗,那么non-immediate組件的錯(cuò)誤消息不會(huì)被顯示。另外,如果immediate組件的新的值和既存的value屬性的值不同,那么會(huì)激活一個(gè)ValueChangedEvent,但是這個(gè)事件會(huì)在ApplyRequestValues階段最后執(zhí)行,而不是在ProcessValidations階段最后。特別的,這意味著任意關(guān)聯(lián)到這個(gè)組件的ValueChangeListener都會(huì)在其他的immediate !UICommand組件的ActionListener之前執(zhí)行(假設(shè)command組件在頁(yè)面的后面發(fā)生)。

      網(wǎng)管網(wǎng)bitsCN.com

          將輸入組件設(shè)置為immediate并不影響模型的更新,任何的新的值仍然會(huì)在Update Model階段被注入(也就是說(shuō),在任何immediate命令組件執(zhí)行之后)。注意,也可以使用ValueChangeListener直接更新模型。
          使用immediate屬性使組件ActionListener或者action方法在apply-request-values階段的最后被執(zhí)行。也就是說(shuō),在任意非immediate值的驗(yàn)證和后臺(tái)bean被更新之前執(zhí)行。
          如果是返回一個(gè)導(dǎo)航字符串的form的action方法,那么:
          任意非null字符串會(huì)使得生命周期直接運(yùn)行到render-response階段,意味著任意非immediate組件的驗(yàn)證永遠(yuǎn)不會(huì)被執(zhí)行。這就是為什么immediate命令組件會(huì)以自然的方式來(lái)實(shí)現(xiàn)cancel操作。它甚至在頁(yè)面中輸入域驗(yàn)證失敗的情況。當(dāng)然,也就沒(méi)有什么update model階段,也就是說(shuō)用戶輸入的數(shù)據(jù)被丟棄。
          null返回值會(huì)導(dǎo)致處理正常進(jìn)行,也就是說(shuō),非immediate組件被驗(yàn)證,然后執(zhí)行update model(如果不發(fā)生驗(yàn)證錯(cuò)誤)。
          如果想讓actionListener方法返回void,必須調(diào)用
          facesContext.renderResponse();
          在使用immediate輸入組件時(shí)最重要的問(wèn)題就是用戶新輸入的數(shù)值并不是總能在model中訪問(wèn),因?yàn)閡pdate-model階段還沒(méi)有執(zhí)行。
      網(wǎng)管網(wǎng)bitsCN.com

          對(duì)于頁(yè)面中的非immediate輸入組件,immediate命令組件的action方法訪問(wèn)用戶輸入數(shù)據(jù)的唯一方式就是通過(guò)使用組件綁定和通過(guò)名稱查詢來(lái)獲取指定的UIComponent對(duì)象,然后調(diào)用getSubmittedValue方法來(lái)獲取用戶提供的原始字符串。這個(gè)值沒(méi)有被轉(zhuǎn)換成它的目標(biāo)類型,也不會(huì)被驗(yàn)證。
          對(duì)于immediate輸入組件,進(jìn)行了轉(zhuǎn)換和驗(yàn)證的步驟,使用對(duì)應(yīng)的UIComponnet組件,是可能獲取轉(zhuǎn)換后的值。如果組件在頁(yè)面中位于UICommand組件的前面,并且觸發(fā)了ValueChangeListener,這樣就會(huì)執(zhí)行ValueChangeListener。
          警告:如果action方法更新模型,但是不進(jìn)行導(dǎo)航,那么在輸入組件的值通過(guò)驗(yàn)證并更新模型時(shí)都會(huì)覆蓋后臺(tái)bean的值。
          任何immediate 組件的驗(yàn)證失敗都不會(huì)停止immediate命令組件的執(zhí)行,這和non-immediate輸入組件和命令組件大不相同。
          學(xué)習(xí)指南
          當(dāng)學(xué)習(xí)JSF的時(shí)候,不需要仔細(xì)查看具體的實(shí)現(xiàn),下面建議了一個(gè)類/方法的列表,對(duì)學(xué)習(xí)JSF和MyFaces如何實(shí)際工作的很有幫助,同時(shí)提到了對(duì)典型方法的一個(gè)簡(jiǎn)短描述。
          javax.faces.webapp.FacesServlet
          init方法用于啟動(dòng)基本的faces。它演示了如何使用FactoryFinder來(lái)創(chuàng)建LifeCycle和FacesContext工廠 網(wǎng)管網(wǎng)bitsCN.com
          service方法演示了LifeCycle對(duì)象控制整個(gè)JSF處理
          javax.faces.component.UIViewRoot
          queueEvent方法在組件決定激活一個(gè)value-change事件(或者其他類型的事件)時(shí)被調(diào)用。事件隊(duì)列的有意思的地方是:
          javax.faces.component.UIInput的驗(yàn)證方法
          org.apache.myfaces.renderkit.html.HtmlButtonRendererBase的decode方法
          javax.faces.component.UIComponentBase
      getRenderer方法演示了如何使用當(dāng)前視圖中的renderkit-id、組件聲明的組件家族和組件聲明的renderer-type名稱來(lái)決定使用哪一個(gè)renderer。
          javax.faces.webapp.UIComponentTag
          createComponentInstance演示了在JSP標(biāo)記引用UIComponent組件并且組建不存在于view眾時(shí),如何實(shí)例化這個(gè)組件,通過(guò)調(diào)用Application.createComponent(String),注意該createComponentInstance方法調(diào)用自己的getComponentType()方法,這個(gè)方法典型的實(shí)現(xiàn)了JSF終端標(biāo)記類,例如org.apache.myfaces.taglib.html.HtmlCommandButtonTag。
          javax.faces.componnet.UIInput
          processDecodes、processValidators、processUpdates方法演示了表單數(shù)據(jù)是如何變成模型的數(shù)據(jù),通過(guò)轉(zhuǎn)換和驗(yàn)證的處理。對(duì)于多數(shù)的組件,實(shí)際的工作過(guò)程為Apply Values、Process Validators和Update Model階段。注意,數(shù)據(jù)從表單中開始,加載到組件的提交值字段,轉(zhuǎn)換成組件的本地值字段,然后拷貝到后臺(tái)bean。很多條件影響到process的出口,例如rendered state、immediate state、conversion errors和validation errors。
          結(jié)合DataTable和ActionListeners

      網(wǎng)管網(wǎng)bitsCN_com


          如果在dataTable的某一行包含command link或者command button,可以從javax.faces.event.ActionListener中輕松的獲取bean:
          <h:dataTable value="#{ResultsBean.hitSet.hits}" var="hit">
           <h:column>
              <h:commandLink>
                <f:actionListener type="net.java.OrderActionListener" />
                <h:outputText value="Order" />
              </h:commandLink>
              ...
           </h:column>
          </h:dataTable>
          可以通過(guò)下面的java代碼來(lái)獲取bean:
          public class OrderActionListener implements ActionListener {
           public void processAction(ActionEvent anEvent) throws AbortProcessingException {
              YourBeanClass tmpBean = null; 
              // 事件的getComponent方法返回command link或者command button
              UIComponent tmpComponent = anEvent.getComponent();
              // 遍歷command link或者command button的父組件,出口:父組件為UIData
              while (null != tmpComponent && !(tmpComponent instanceof UIData)) {
                tmpComponent = tmpComponent.getParent();
              }
              // 如果事件組件不為空,并且父組件為UIData,那么取每行的數(shù)據(jù),如果是Bean實(shí)例,那么強(qiáng)制轉(zhuǎn)換
              if (tmpComponent != null && (tmpComponent instanceof UIData)) {
                Object tmpRowData = ((UIData) tmpComponent).getRowData();
                if (tmpRowData instanceof YourBeanClass) { 網(wǎng)管網(wǎng)bitsCN_com
                  tmpBean = (YourBeanClass) tmpRowData;
                  //TODO Implementation of your method
                }
              }
              //TODO Exception Handling if UIData not found or tmpRowBean of wrong type
           }
          }
          通過(guò)Link或者Button的參數(shù)來(lái)執(zhí)行方法
          一個(gè)典型的情景:
          表格顯示了對(duì)象的集合,需要通過(guò)點(diǎn)擊edit link或者button來(lái)跳轉(zhuǎn)到要編輯的記錄的詳細(xì)頁(yè)面。
          如果熟悉Struts或者其他的MVC框架,那么可能會(huì)考慮到傳輸一個(gè)主鍵來(lái)作為請(qǐng)求參數(shù),在請(qǐng)求頁(yè)面的URL中被包含。
          <a href="/appContext/someAction.do?id=1234&userAction=prepareEdit">Edit</a>
          可以使用JSTL來(lái)生成上面的內(nèi)容:
          <c:url value="someAction.do" var="url"> feedom.net
             <c:param name="id" value="1234" />
             <c:param name="userAction" value="prepareEdit" />
          </c:url>
          <a href="${url}">Edit</a>
          在JSF中,有很多方法來(lái)處理這種情況,下面列舉了三種,關(guān)于第一種解決方式還存在爭(zhēng)議,這里列舉出來(lái)的目的是這可能是開發(fā)人員最先想到的。
          1>     使用<f:factionListener ...>和UIData的getRowData()
          可以參考上面的集成DataTable和ActionListeners來(lái)完成。
          2>     使用f:param來(lái)傳遞參數(shù)
          使用JSF完成的第一個(gè)思路可能就是模擬已經(jīng)將參數(shù)傳遞給了鏈接??梢酝ㄟ^(guò)在commandButton或者commandLink中使用f:param標(biāo)記:
          <t:dataTable var="emp" .... >

       

           <h:commandLink id="editLink" action="#{employeeAction.prepareEdit}">
           <h:outputText value="#{msg.edit}"/>
           <f:param name="id" value="#{emp.id}"/>
          </h:commandLink>

       

          然后獲取處理請(qǐng)求參數(shù)的句柄:

       

          FacesContext context = FacesContext.getCurrentInstance();
          Map map = context.getExternalContext().getRequestParameterMap();
          String employeeID = (String) map.get("id");
          上述的方式是可行的,但是需要開發(fā)人員處理String,可能需要自己編寫轉(zhuǎn)換器。另外,需要添加額外的代碼來(lái)獲取map保存的參數(shù)。有更簡(jiǎn)潔的方法來(lái)完成:
          3>     使用<t:updateActionListener .../>


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多