随笔 - 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 张旭 阅读(1344) | 评论 (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 张旭 阅读(1801) | 评论 (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 张旭 阅读(321) | 评论 (3)编辑 收藏