精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-27
在本系列教程中,我们将通过一个小例子:Calculator,来体会一下Apusic OperaMasks 2.0的特性。
本文中,将围绕的例子如下图所示:
现在,就让我们开始体验一下Apusic OperaMasks 2.0的神奇。
首先,让我们打开Apusic Studio,先画出这样一个页面:
这个页面的代码如下:
<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:w="http://www.apusic.com/jsf/widget" xmlns:layout="http://www.apusic.com/jsf/layout" renderKitId="AJAX" xmlns:h="http://java.sun.com/jsf/html"> <w:page title="Calculator"> <w:form id="calc"> <layout:panelGrid columns="3"> <h:outputLabel for="first"/> <w:textField id="first"/> <h:message for="first"/> <h:outputLabel for="second"/> <w:textField id="second"/> <h:message for="second"/> <h:outputLabel for="result"/> <h:outputText id="result"/> </layout:panelGrid> <br/> <layout:panelGrid columns="4"> <w:button id="add"/> <w:button id="subtract"/> <w:button id="multiply"/> <w:button id="divide"/> </layout:panelGrid> </w:form> </w:page> </f:view>
此页面的解释:在页面的上半部分,放了两个<w:textField>,其id分别是“first”及“second”,还有一个 <h:outputText>,其id为“result”,页面下半部分放了四个<w:button>,其id分别是“add”、“subtract”、“multiply”及“divide”。OK,我们现在来运行一下这个页面,效果如下:
和我们的预期差不多。下面,让我们来做一下后台的Lite Bean(在AOM 2.0中,将Managed Bean扩展成Lite Bean,详细资料请参考AOM 2.0参考手册),如果你用的是Apusic Studio,那么,在你新建这个页面的时候,这个Lite Bean已经自动帮助你生成了。
这个LiteBean的基本代码如下:
@ManagedBean(scope = ManagedBeanScope.REQUEST) public class CalcBean { @Bind private double first = 22.0; @Bind private double second = 7.0; @Bind private double result; @Action public void add() { result = first + second; } @Action public void subtract() { result = first - second; } @Action public void multiply() { result = first * second; } @Action public void divide() { result = first / second; } }
上述代码的解释如下:首先,我们声明了3个成员变量,分别是:first、second和result,请注意,他们的命名,和页面中相关控件的id是一样的,并且,它们都有一个@Bind 的annotation。同时,我们也声明了四个方法,分别是:add、subtract、multiply和divide,同样的,它们的命名也和页面中的四个<w:button>的id保持一致,而且,它们也都有@Action 的annotation声明。
现在,让我们运行一下这个页面,我们来看看,会发生什么情况?
哇,一切都OK了!我们要的功能已经全部具备了!
这是怎么回事?印象中,我们好像并没有指定输入参数的label是什么吧,好像也没有指定四个button的value和action啊,AOM是怎么猜到我们想要让它做什么的?
记得一位朋友在向我介绍Ruby on Rails时,对RoR的两个特性赞不绝口,一个是Ruby这种动态语言(AOM 2.0中的ELite绝不逊色于Ruby),另一个就是“约定优于配置”(Convention Over Configuration) 这个原则。事实上,AOM 2.0 也将“约定优于配置”这条原则发挥得淋漓尽致。以上述代码为例:在页面中有个 <h:outputLabel for="first"/>,但我们并没有指定它的确切值,那么,AOM会认为,此label的值默认就是这个id,且首字母大写;<w:textField id="first"/>并没有指定它的value,那么,AOM会自动到后台的 CalcBean 中,找出所有带有@Bind标注且名称为 first 的属性,该textField 的值就对应此属性;对于<w:button id="add"/>,AOM会找出所有带有@Action标注且名称为add的方法,该button的Action就是此方法。
看上去很美,但是,这样一来,是否意味着我的代码会受到很多限制呢?譬如,我不想让成员变量名称为first,那么,我该怎么办呢?
假如你希望将CalcBean中first属性的名称更改为first2,你可以这样做:
@Bind(id="first") private double first2 = 22.0;
假如你希望方法名不是add,改成plus,那么,你可以这样:
@Action(id="add") public void plus() { result = first + second; }
假如你希望将Add按钮的名称改为“Plus”,那么,你可以这样:
<w:button id="add" value="Plus"/>
等等,将业务数据与展现层绑在一起,这不是违反了IoVC的原则吗? 是,你说的对,那我们换个更好的做法,你可以这样:
@Bind(id="add", attribute="value") private String addLabel = "Plus";
好像还有一点不对劲,仅仅为了显示一个Label,我有必要在CalcBean中再增加一个属性吗?你说的对,但这是咱们第二篇文章要介绍的内容了。
好了,我们只是简单的体会了一下AOM 2.0的一些新特性。文中所描述的计算器这个示例,在AOM 2.0中,只需要简单的十几行代码就轻松搞掂了。是不是非常省事?我记得我的老师袁红岗先生曾经跟我说过:聪明的程序员都是懒惰的。无疑,AOM 2.0是为“懒人”准备的,尤其是那些“懒惰的”、聪明的程序员们。
更多技术文章,请见:http://www.operamasks.org/
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-04-01
为啥后面要加个s?
|
|
返回顶楼 | |
发表时间:2008-04-02
大家都写过这样的代码,在类中声明一个成员变量:private int i;那么,大家知道,这里i的值是0;为什么是大家“都”知道呢,这种情况就类似一种约定。
约定优于配置,view层没有指定value,这样由服务器为其填充,这也是符合IoVC原则的,后端对view层具备控制力的表现。 |
|
返回顶楼 | |
发表时间:2008-04-02
又来了,打着“约定优于配置”的旗号。他们真正理解“约定优于配置”的含义了吗?
我其实不想来吹毛求疵。AOM能做出来还是不错的,但是老往自己身上贴金,就露怯了。 |
|
返回顶楼 | |
发表时间:2008-04-05
也许是很神奇,但这么多陌生的标签真让人头晕呀。我还是喜欢比较纯粹的html代码....
|
|
返回顶楼 | |
发表时间:2008-04-07
用时间,弄弄grails和wicket,更值
|
|
返回顶楼 | |
发表时间:2008-04-07
views层用的xml过于怪异。
采用用grails的html+tag(有逻辑),或者干脆wicket更纯净的html(无逻辑),会更让人觉得舒服。 |
|
返回顶楼 | |
发表时间:2008-04-08
可惜你们的AOM不支持HIBERNATE 而且文档确实少了点!
|
|
返回顶楼 | |
浏览 3386 次