隨筆 - 3, 文章 - 0, 評論 - 12, 引用 - 0
          數據加載中……

          2008年2月22日

          IoVC的組件屬性綁定----@Bind

          組件屬性綁定

              我所接觸到的基于JSF的Web應用中,位于UI界面上的一個界面元素或組件,想要顯示數據,通常的寫法是這樣:
          greeting.xhtml
          <h:inputText value="#{demo.helloduke.UserBean.name}"/>

          demo.helloduke.UserBean.java:
          @ManagedBean(name="demo.helloduke.UserBean", scope=ManagedBeanScope.SESSION)
          public class UserBean {
              
          private String name;
              
          public String getName() {
                  
          return name;
              }
              
          public void setName(String name) {
                  
          this.name = name;
              }
          }

          這樣的寫法意味著,在greeting.xhtml中,需要知道UserBean的存在,并且需要知道UserBean的name屬性是對應著這個inputText組件的value。這在很大程度上,限制了greeting.xhtml的作用范圍,使這個UI完全沒有機會被重用。很長一段時間,這都是困照著我的一個問題。

          Binding是IoVC包含的一個重要特性,它不僅可以使UI獨立出來,而且Binding是采用后期綁定模式實現,為組件的無狀態的實現提供了底層基礎支撐。關于IoVC的實現方式,在這篇隨筆中并不過多討論。
          在IoVC的編程模式下,對UI上的界面元素的控制力被轉移到了ManagedBean中,UI不需要關心誰在使用它,以及數據的來源。
          IoVC模式的Hello Duke的UI及managedBean:
          greeting.xhtml
          <h:inputText id="name"/>

          demo.helloduke.UserBean.java:
          @ManagedBean(name="demo.helloduke.UserBean", scope=ManagedBeanScope.SESSION)
          public class UserBean {
              @Bind
              
          private String name;
          }

          @Bind標簽,提供了將ManagedBean的filed綁定到組件的attributes中的能力,默認情況下,@Bind根據所作用的filed的name來匹配UI中的元素的id,然后將field的值取出綁定到對應的UI中的組件上,上述代碼表示,將UserBean中的name屬性,綁定到與之對應的inputText組件的value中。

          下面列出了@Bind標簽的典型使用場景:

              @Bind
              
          private UIDataGrid grid;

              @Bind(id
          ="grid", attribute="width")
              
          private int width;

              @Bind(id
          ="grid", attribute="height")
              
          private int height;

              
          public void initGrid() {
                  
          this.width = 500;
                  
          this.height = 400;
              }

              
          public void reload() {
                  
          this.grid.reload();
              }

          使用@Bind標簽將組件的attributes與ManagedBean中的屬性一一綁定起來之后,在UI上如果組件發生變化,其變化了的屬性會反映到ManagedBean中,同樣,在ManagedBean中,如果更改了屬性值,UI組件也會發生相應的變化。
          一個使用IoVC模式的完整頁面與ManagedBean(其中涉及到的其他標簽,會在后面介紹到):
          運行效果:


          calc.xhtml
          <?xml version="1.0" encoding="UTF-8"?>
          <f:view xmlns:f="http://java.sun.com/jsf/core"
                  xmlns
          ="http://www.w3.org/1999/xhtml"
                  xmlns:h
          ="http://java.sun.com/jsf/html"
                  xmlns:w
          ="http://www.apusic.com/jsf/widget"
                  renderKitId="AJAX">
            <w:page title="View Binding Example">
            
          <h:form>
              
          <h:panelGrid columns="1">
                
          <h:inputText id="first"/>
                
          <h:inputText id="second"/>
                
          <h:outputText id="result"/>
              
          </h:panelGrid>
              
          <h:commandButton value="+" id="add"/>
              
          <h:commandButton value="-" id="subtract"/>
              
          <h:commandButton value="*" id="multiply"/>
              
          <h:commandButton value="/" id="divide"/>
            
          </h:form>
            
          <h:messages/>
            
          </w:page>
          </f:view>
          CalcBean.java:
          @ManagedBean(scope=ManagedBeanScope.SESSION)
          public class CalcBean
          {
              @Bind
              private double first = 10;

              @Bind
              private double second = 20;

              @Bind
              private double result;

              @Bind(id
          ="result", attribute="style")
              
          private String style;

              @Action
              
          public void add() {
                  result 
          = first + second;
                  style 
          = "color:red";
              }

              @Action
              
          public void subtract() {
                  result 
          = first - second;
                  style 
          = "color:green";
              }

              @Action
              
          public void multiply() {
                  result 
          = first * second;
                  style 
          = "color:blue";
              }

              @Action
              
          public void divide() {
                  result 
          = first / second;
                  style 
          = "color:black";
              }
          }




          posted @ 2008-02-24 23:03 張旭 閱讀(1354) | 評論 (6)編輯 收藏

          什么是IoVC

          什么是IoVC

              IoVC是Inversion of View Control的縮寫,意思是視圖反轉控制,是AOM的核心特性之一,IoVC實現了將對UI的控制力轉移到ManagedBean中,UI完全不關心誰會來使用它本身,也不需要關心在上面所展現的數據內容是什么,從而實現了UI與控制邏輯的完全分離,簡言之,IoVC是一種更高層次的MVC。

              初一看,IoVC好像也沒什么特別的,甚至有點概念炒作的嫌疑,但是真正使用它、理解它之后,你會發現,它所提供的編程模型為你的開發帶來了實質性的幫助。

          IoVC帶來了什么

              IoVC提供了“綁定”、“多語言支持”、“資源注入”、“邏輯事件”等特性,這些特性主要作用在ManagedBean上面,ManagedBean是位于UI與業務服務之間的協調者,基于這些特性,在ManagedBean中,一方面可以對UI實現完全的控制,另一方面,可以靈活自然的與業務服務進行交互。

          托管Bean的簡化

              傳統方式中,編寫一個ManagedBean,需要編寫faces-config.xml文件,例如編寫兩個ManagedBean,UserBean與DepartmentBean,其中UserBean需要引用DepartMentBean,需要采用下面的方式來聲明faces-config.xml文件:
            <managed-bean>
              
          <managed-bean-name>DepartmentBean</managed-bean-name>
              
          <managed-bean-scope>session</managed-bean-scope>
              
          <managed-bean-class>demo.DepartmentBean</managed-bean-class>
            
          </managed-bean>

            
          <managed-bean>
              
          <managed-bean-name>UserBean</managed-bean-name>
              
          <managed-bean-scope>session</managed-bean-scope>
              
          <managed-bean-class>demo.UserBean</managed-bean-class>
              
          <managed-property>
                
          <property-name>departmentBean</property-name>
                
          <property-class>demo.DepartmentBean</property-class>
                
          <value>#{DepartmentBean}</value>
              
          </managed-property>
            
          </managed-bean>

              IoVC提供了@ManagedBean、@ManagedProperty、@MapEntries、@ListEntries等關于ManagedBean定義的一整套完整的標簽,上面的定義,在IoVC中將會轉變為如下方式直接聲明在代碼中,無需維護faces-config.xml文件:
          @ManagedBean
          public class DepartmentBean
          {
              
          }

          @ManagedBean
          public class UserBean
          {
              @ManagedProperty(
          "#{DepartmentBean}")
              
          private DepartmentBean departmentBean;
              
          }

          關于IoVC剩余的幾個特性的支持的描述,我將會陸續寫一些文章來進行深入介紹。

          在把“IoVC是什么、IoVC能夠做什么”這些基本問題解釋清楚后,我計劃探討一下“IoVC是怎么實現的?”,以及“為什么有了IoVC之后,組件的無狀態就可以變成可能?”等問題。

          綁定(Binding)

            

          資源注入 (Injection)

            

          多語言支持

             

          邏輯事件

             

          “無狀態組件”的傳說

          posted @ 2008-02-24 01:15 張旭 閱讀(1811) | 評論 (3)編輯 收藏

          記AOM2.0M1發布

              以這樣一篇文章作為我Blog的開篇,也算是具有一些紀念意義吧。

              AOM從1.2Release是去年12月30日發布的,到現在已經2個多月了,這期間(包括AOM1.2Release發布之前),我們一直在進行AOM2.0的研發,經歷了幾次Preview版本之后,終于決定推出AOM2.0。

              這是一個跨越式的版本,2.0與1.x的差別,以致到了無法兼容1.x的程度,這是我們設計上的失誤,但是我欣慰的是在2.0將是一個基線式的版本,后續發展到3.x、4.x也會是兼容2.x的,這在我看來,也未嘗都是壞事。
              
              回顧在1.x中,組件的貧乏、過快的節奏、市場的壓力,使得我無法專注于整個架構體系的設計,在2.0開始的版本里面,從組件入手,使組件的開發、設計形成一套真正的體系化的東西,這在短期內看不到什么效果,因為所有組件的外觀并沒有得到變化。甚至看起來基本上沒有什么工作成果,但是我知道、AOM里面的人也知道,我們的組件內部再也不是東拼西湊的夾雜著js與html、css的混合體了,雖然在2.0M1中,我們只是重構了布局方面的組件,其他的組件都還是采用原有的方式,但是在后續版本中,所有的組件都會采用新的方式,會協同的很好。

              除了組件,2.0的東西還真的很多,今天在寫ReleaseNotes的時候,我竟不知從何下筆,關于2.0的其他特性,我不會做怎樣特別的介紹,我只是把我當時包括以后同老袁一起做這些事情的感受寫出來。

              AOM2.0M1我認為有突破的幾個方面:
             1. IoVC編程模型;
             2. 無需維護狀態(相信嗎?);
             3. 基于APT的組件快速開發模式;

              最震撼的,莫過于老袁的ELite,這是對我影響較大的一個事情(雖然我沒有參與),讓我明白了“科學家”與“程序員”的區別,這件事情我不在這里過多的說了,但我一定會從頭到尾把這件事情的來龍去脈講清楚。包括它的產生,構思與實現。

          posted @ 2008-02-22 22:25 張旭 閱讀(330) | 評論 (3)編輯 收藏

          主站蜘蛛池模板: 祁东县| 威海市| 太白县| 岐山县| 巫溪县| 静安区| 丹江口市| 沂水县| 沅江市| 泰安市| 湖南省| 来安县| 抚州市| 东台市| 临漳县| 师宗县| 翁牛特旗| 玉屏| 明光市| 泽库县| 将乐县| 修文县| 池州市| 南部县| 泸水县| 津南区| 桐庐县| 内黄县| 保康县| 乌什县| 邢台县| 文安县| 新疆| 焦作市| 恩施市| 公安县| 漯河市| 万载县| 邢台市| 民勤县| 保康县|