﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-张旭的Blog</title><link>http://www.blogjava.net/jackyzhang/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:03:43 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:03:43 GMT</pubDate><ttl>60</ttl><item><title>IoVC的组件属性绑定----@Bind</title><link>http://www.blogjava.net/jackyzhang/archive/2008/02/24/181843.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Sun, 24 Feb 2008 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/jackyzhang/archive/2008/02/24/181843.html</guid><wfw:comment>http://www.blogjava.net/jackyzhang/comments/181843.html</wfw:comment><comments>http://www.blogjava.net/jackyzhang/archive/2008/02/24/181843.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/jackyzhang/comments/commentRss/181843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackyzhang/services/trackbacks/181843.html</trackback:ping><description><![CDATA[<h1>组件属性绑定</h1>
&nbsp;&nbsp;&nbsp; 我所接触到的基于JSF的Web应用中，位于UI界面上的一个界面元素或组件，想要显示数据，通常的写法是这样：<br />
greeting.xhtml<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:inputText&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="#{demo.helloduke.UserBean.name}"</span><span style="color: #0000ff;">/&gt;</span></div>
<br />
demo.helloduke.UserBean.java:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@ManagedBean(name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">demo.helloduke.UserBean</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;scope</span><span style="color: #000000;">=</span><span style="color: #000000;">ManagedBeanScope.SESSION)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;UserBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
这样的写法意味着，在greeting.xhtml中，需要知道UserBean的存在，并且需要知道UserBean的name属性是对应着这个inputText组件的value。这在很大程度上，限制了greeting.xhtml的作用范围，使这个UI完全没有机会被重用。很长一段时间，这都是困照着我的一个问题。<br />
<br />
Binding是IoVC包含的一个重要特性，它不仅可以使UI独立出来，而且Binding是采用后期绑定模式实现，为组件的无状态的实现提供了底层基础支撑。关于IoVC的实现方式，在这篇随笔中并不过多讨论。<br />
在IoVC的编程模式下，对UI上的界面元素的控制力被转移到了ManagedBean中，UI不需要关心谁在使用它，以及数据的来源。<br />
IoVC模式的Hello Duke的UI及managedBean:<br />
greeting.xhtml<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:inputText id="name"</span><span style="color: #0000ff;">/&gt;</span></div>
<br />
demo.helloduke.UserBean.java:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@ManagedBean(name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">demo.helloduke.UserBean</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;scope</span><span style="color: #000000;">=</span><span style="color: #000000;">ManagedBeanScope.SESSION)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;UserBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp; @Bind<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
</span><span style="color: #000000;">}</span></div>
<br />
@Bind标签，提供了将ManagedBean的filed绑定到组件的attributes中的能力，默认情况下，@Bind根据所作用的filed的name来匹配UI中的元素的id，然后将field的值取出绑定到对应的UI中的组件上，上述代码表示，将UserBean中的name属性，绑定到与之对应的inputText组件的value中。<br />
<br />
下面列出了@Bind标签的典型使用场景：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Bind<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;UIDataGrid&nbsp;grid;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bind(id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">grid</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;attribute</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">width</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;width;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bind(id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">grid</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;attribute</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">height</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;height;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initGrid()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.width&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">500</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.height&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">400</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;reload()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.grid.reload();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
使用@Bind标签将组件的attributes与ManagedBean中的属性一一绑定起来之后，在UI上如果组件发生变化，其变化了的属性会反映到ManagedBean中，同样，在ManagedBean中，如果更改了属性值，UI组件也会发生相应的变化。<br />
一个使用IoVC模式的完整页面与ManagedBean（其中涉及到的其他标签，会在后面介绍到）：<br />
运行效果：<br />
<img src="http://www.blogjava.net/images/blogjava_net/jackyzhang/calc.png" alt="" border="0" /><br />
<br />
calc.xhtml<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:view&nbsp;</span><span style="color: #ff0000;">xmlns:f</span><span style="color: #0000ff;">="http://java.sun.com/jsf/core"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff;">="http://www.w3.org/1999/xhtml"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:h</span><span style="color: #0000ff;">="http://java.sun.com/jsf/html"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:w</span><span style="color: #0000ff;">="http://www.apusic.com/jsf/widget"</span><span style="color: #ff0000;"><br />
</span><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderKitId</span><span style="color: #0000ff;">="AJAX"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">w:page&nbsp;</span><span style="color: #ff0000;">title</span><span style="color: #0000ff;">="View&nbsp;Binding&nbsp;Example"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:form</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:panelGrid&nbsp;</span><span style="color: #ff0000;">columns</span><span style="color: #0000ff;">="1"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:inputText&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="first"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:inputText&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="second"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:outputText&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="result"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:panelGrid</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:commandButton&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="+"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="add"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:commandButton&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="-"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="subtract"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:commandButton&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="*"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="multiply"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:commandButton&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="/"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="divide"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:form</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:messages</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">w:page</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:view</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
CalcBean.java:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@ManagedBean(scope</span><span style="color: #000000;">=</span><span style="color: #000000;">ManagedBeanScope.SESSION)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CalcBean<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bind<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;first&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bind<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;second&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bind<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;result;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bind(id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">result</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;attribute</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">style</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;style;<br />
<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; @Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;add()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;first&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">color:red</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;subtract()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;first&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">color:green</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;multiply()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;first&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">color:blue</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Action<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;divide()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;first&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">color:black</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/jackyzhang/aggbug/181843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackyzhang/" target="_blank">张旭</a> 2008-02-24 23:03 <a href="http://www.blogjava.net/jackyzhang/archive/2008/02/24/181843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是IoVC</title><link>http://www.blogjava.net/jackyzhang/archive/2008/02/24/IoVC.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Sat, 23 Feb 2008 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/jackyzhang/archive/2008/02/24/IoVC.html</guid><wfw:comment>http://www.blogjava.net/jackyzhang/comments/181688.html</wfw:comment><comments>http://www.blogjava.net/jackyzhang/archive/2008/02/24/IoVC.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jackyzhang/comments/commentRss/181688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackyzhang/services/trackbacks/181688.html</trackback:ping><description><![CDATA[<h1>什么是IoVC<br />
</h1>
&nbsp;&nbsp;&nbsp; IoVC是<font class="post">Inversion of View Control的缩写，意思是视图反转控制，是AOM的核心特性之一，IoVC实现了将对UI的控制力转移到ManagedBean中，</font>UI完全不关心谁会来使用它本身，也不需要关心在上面所展现的数据内容是什么，从而实现了UI与控制逻辑的完全分离，简言之，IoVC是一种更高层次的MVC。<br />
<br />
&nbsp;&nbsp;&nbsp; 初一看，IoVC好像也没什么特别的，甚至有点概念炒作的嫌疑，但是真正使用它、理解它之后，你会发现，它所提供的编程模型为你的开发带来了实质性的帮助。<br />
<br />
<h1>IoVC带来了什么<br />
</h1>
&nbsp;&nbsp;&nbsp; IoVC提供了&#8220;绑定&#8221;、&#8220;多语言支持&#8221;、&#8220;资源注入&#8221;、&#8220;逻辑事件&#8221;等特性，这些特性主要作用在ManagedBean上面，ManagedBean是位于UI与业务服务之间的协调者，基于这些特性，在ManagedBean中，一方面可以对UI实现完全的控制，另一方面，可以灵活自然的与业务服务进行交互。<br />
<br />
<h1>托管Bean的简化<br />
</h1>
&nbsp;&nbsp;&nbsp; 传统方式中，编写一个ManagedBean，需要编写faces-config.xml文件，例如编写两个ManagedBean，UserBean与DepartmentBean，其中UserBean需要引用DepartMentBean，需要采用下面的方式来声明faces-config.xml文件:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">DepartmentBean</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean-scope</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">session</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean-scope</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">demo.DepartmentBean</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">UserBean</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean-scope</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">session</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean-scope</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-bean-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">demo.UserBean</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">managed-property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">departmentBean</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">demo.DepartmentBean</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">#{DepartmentBean}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">managed-bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; IoVC提供了@ManagedBean、@ManagedProperty、@MapEntries、@ListEntries等关于ManagedBean定义的一整套完整的标签，上面的定义，在IoVC中将会转变为如下方式直接声明在代码中，无需维护faces-config.xml文件：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">@ManagedBean<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;DepartmentBean<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
}<br />
<br />
@ManagedBean<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;UserBean<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ManagedProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{DepartmentBean}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;DepartmentBean&nbsp;departmentBean;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
}</span></div>
<br />
关于IoVC剩余的几个特性的支持的描述，我将会陆续写一些文章来进行深入介绍。<br />
<br />
在把&#8220;IoVC是什么、IoVC能够做什么&#8221;这些基本问题解释清楚后，我计划探讨一下&#8220;IoVC是怎么实现的？&#8221;，以及&#8220;为什么有了IoVC之后，组件的无状态就可以变成可能？&#8221;等问题。<br />
<br />
<h1>绑定（Binding）</h1>
&nbsp;&nbsp; <br />
<br />
<h1>资源注入 （Injection）</h1>
&nbsp;&nbsp; <br />
<br />
<h1>多语言支持</h1>
&nbsp;&nbsp;&nbsp; <br />
<br />
<h1>逻辑事件</h1>
&nbsp;&nbsp;&nbsp; <br />
<h1>&#8220;无状态组件&#8221;的传说</h1>
<img src ="http://www.blogjava.net/jackyzhang/aggbug/181688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackyzhang/" target="_blank">张旭</a> 2008-02-24 01:15 <a href="http://www.blogjava.net/jackyzhang/archive/2008/02/24/IoVC.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>记AOM2.0M1发布</title><link>http://www.blogjava.net/jackyzhang/archive/2008/02/22/181523.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Fri, 22 Feb 2008 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/jackyzhang/archive/2008/02/22/181523.html</guid><wfw:comment>http://www.blogjava.net/jackyzhang/comments/181523.html</wfw:comment><comments>http://www.blogjava.net/jackyzhang/archive/2008/02/22/181523.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jackyzhang/comments/commentRss/181523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackyzhang/services/trackbacks/181523.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 以这样一篇文章作为我Blog的开篇，也算是具有一些纪念意义吧。<br />
<br />
&nbsp;&nbsp;&nbsp; AOM从1.2Release是去年12月30日发布的，到现在已经2个多月了，这期间（包括AOM1.2Release发布之前），我们一直在进行AOM2.0的研发，经历了几次Preview版本之后，终于决定推出AOM2.0。<br />
<br />
&nbsp;&nbsp;&nbsp; 这是一个跨越式的版本，2.0与1.x的差别，以致到了无法兼容1.x的程度，这是我们设计上的失误，但是我欣慰的是在2.0将是一个基线式的版本，后续发展到3.x、4.x也会是兼容2.x的，这在我看来，也未尝都是坏事。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; 回顾在1.x中，组件的贫乏、过快的节奏、市场的压力，使得我无法专注于整个架构体系的设计，在2.0开始的版本里面，从组件入手，使组件的开发、设计形成一套真正的体系化的东西，这在短期内看不到什么效果，因为所有组件的外观并没有得到变化。甚至看起来基本上没有什么工作成果，但是我知道、AOM里面的人也知道，我们的组件内部再也不是东拼西凑的夹杂着js与html、css的混合体了，虽然在2.0M1中，我们只是重构了布局方面的组件，其他的组件都还是采用原有的方式，但是在后续版本中，所有的组件都会采用新的方式，会协同的很好。<br />
<br />
&nbsp;&nbsp;&nbsp; 除了组件，2.0的东西还真的很多，今天在写ReleaseNotes的时候，我竟不知从何下笔，关于2.0的其他特性，我不会做怎样特别的介绍，我只是把我当时包括以后同老袁一起做这些事情的感受写出来。<br />
<br />
&nbsp;&nbsp;&nbsp; AOM2.0M1我认为有突破的几个方面：<br />
&nbsp;&nbsp; 1. IoVC编程模型；<br />
&nbsp;&nbsp; 2. 无需维护状态（相信吗？）；<br />
&nbsp;&nbsp; 3. 基于APT的组件快速开发模式；<br />
<br />
&nbsp;&nbsp;&nbsp; 最震撼的，莫过于老袁的ELite，这是对我影响较大的一个事情（虽然我没有参与），让我明白了&#8220;科学家&#8221;与&#8220;程序员&#8221;的区别，这件事情我不在这里过多的说了，但我一定会从头到尾把这件事情的来龙去脉讲清楚。包括它的产生，构思与实现。<br />
 <img src ="http://www.blogjava.net/jackyzhang/aggbug/181523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackyzhang/" target="_blank">张旭</a> 2008-02-22 22:25 <a href="http://www.blogjava.net/jackyzhang/archive/2008/02/22/181523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>