IoVC实例分析:Hello Duke!
本文用一个非常简单的例子“helloDuke",介绍IoVC编程模型的一种实际场景。
在IoVC编程模型下的HelloDuke版本,功能没做任何增减,依然如下图所示:

但由于在程序中用到了IoVC思想,及facelets技术,因此,整个程序的目录结构更改如下:
helloDuke
--duke.gif
--greeting.xhtml
--sameName.xhtml
--WEB-INF
--web.xml
--faces-config.xml
--operamasks.xml
--classes
--helloduke
--GreetingBean.class
下面就让我们来完成此应用。
首先,我们来看一下老版本的greeting.jsp是怎样的:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<h:form>
<h2>Hello, my name is Duke. What is yours?</h2>
<h:graphicImage url="duke.gif"></h:graphicImage>
<h:outputText value="#{userBean.result}"/><br>
<h:inputText value="#{userBean.name}"></h:inputText>
<h:commandButton value="sayHello" action="#{userBean.sayHello}"/>
</h:form>
</f:view>
那么,在AOM 2.0(即Apusic OperaMasks 2.0)版本下,并且在IoVC编程思想下,greeting.xhtml又是怎样的呢?
<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="helloDuke">
<w:form>
<h2>Hello, my name is Duke. What is yours?</h2>
<img src="duke.gif" />
<hutputText id="result"/><br/>
<w:textField id="name"/>
<w:button id="sayHello" />
</w:form>
</w:page>
</f:view>
我们的注意力不要被<w:>还是<h:>所影响,我们先假设这两者都是等价的。我们主要观察<h:outputText>、<w:textField> 以及<w:button> 这三个主要UI控件的写法。我们可以看到,在新版本中,<h:outputText> 和<w:textField>并没有指定value,而<w:button>也没有指定action,但这三者都有不同的id,并且,整个页面全部都是展现层相关信息,没有任何代码片断或 EL 表达式的引入。
那么,这三者的值以及动作事件,又是怎样和后台的JavaBean关联起来的呢?
首先,我们也是先熟悉一下老版本中的UserBean(在新版本中,它的名称改为GreetingBean)。
package helloduke;
public class UserBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getResult() {
if(this.name == null || "".equals(name.trim())) return "Please input your name.";
else return "Hello " + name;
}
public Object sayHello() {
if("duke".equalsIgnoreCase(name)) return "duke";
return null;
}
}
那么,在新版本中,上述逻辑变成怎样的呢?如下所示:
package helloduke;
@ManagedBean(name="GreetingBean", scope=ManagedBeanScope.SESSION)
public class GreetingBean {
@Bind(id="result")
private String result;
@Bind(id="name")
private String name;
@Action(id="sayHello")
public Object sayHello(){
if("duke".equalsIgnoreCase(name)) return "/sameName.xhtml"; return null;
}
@BeforeRender
private void settingValues(boolean isPostBack){
if(this.name == null || "".equals(name.trim())) {
result = "Please input your name.";
}
else {
result = "Hello " + name;
}
}
}
我们可以观察到,在result属性上,有一个@Bind(id="result")的annotation声明;同样,在name上,也有@Bind(id="name") 的声明,而在sayHello方法上,则有@Action(id="sayHello") 的声明。至此,我们恍然大悟:通过这样一些声明,<h:outputText>的值自动和result属性关联,<w:textField>的值自动和name属性关联,而<w:button> 的Action事件,则和sayHello方法关联。
等一下,这里有个问题:针对result属性和name属性,在AOM 2.0下,连setter/getter方法都没有?是的,完全可以忽略。
那么,result的值是在哪里设置的?请注意settingValues方法,它有一个@BeforeRender的声明,意思就是说:当页面在渲染前,请调用此方法。这就相当于一个回调函数,因此,对result属性的设置,我们就可以在此处进行处理。
好像一切都很完美,但是,还有一个问题,greeting.xhtml页面,是怎样和GreetingBean对应起来的?目前,你可以假设认为:这是通过命名规则获得的,但这部分内容已经超过本文所要介绍的范围, 请允许我在下一篇文章中介绍。


评论
有空可以看看我的
http://www.javaeye.com/topic/199389
Kingdee没有IBM和BEA那么强势,会在JDK层次做自己产品的功能扩展,所以Apuisc在对J2EE标准的实现上更加中规中矩,完全符合最新的J2EE 5.0标准,保持最大的兼容性。
Apusic 可以自由下载用用,比Tomcat稍大,启动速度也跟Tomcat差不多,配置较简单,但是是支持J2EE 5.0的完整实现。有对EJB3.0和JSF感兴趣的朋友强烈推荐用用。
Kingdee没有IBM和BEA那么强势,会在JDK层次做自己产品的功能扩展,所以Apuisc在对J2EE标准的实现上更加中规中矩,完全符合最新的J2EE 5.0标准,保持最大的兼容性。
Apusic 可以自由下载用用,比Tomcat稍大,启动速度也跟Tomcat差不多,配置较简单,但是是支持J2EE 5.0的完整实现。有对EJB3.0和JSF感兴趣的朋友强烈推荐用用。
008-03-27 17:22:07 ERROR [apusic.web.helloduke./helloduke] ?行Servlet??生??。
com.sun.facelets.FaceletException: Error Parsing /greeting.xhtml: Error Traced[line: 10] The prefix "h" for element "h:outputText" is not bound.
需要注意的是,AOM有些特性是依赖应用服务器底层支持的,譬如,将一个 EJB3 对象自动转换成一个 ManagedBean,并能够在EJB对象中进行视图的绑定,这需要对应用服务器的实现进行适当的调整。针对这样一些高级特性, 无疑需要更改应用服务器的代码。 我们从不否认AOM是由金蝶中间件公司力推的技术,那么,在这样一些高级特性上, 也只有Apusic应用服务器能够支持(Apusic应用服务器是金蝶中间件公司的产品,AOM开发团队自然可以影响到 Apusic 应用服务器的发展,但 AOM开发团队目前却无法影响到其它应用服务器的技术特性)。
幸运的是,这些只有Apusic应用服务器才能够支持的高级技术特性并不常见,绝大部分的 AOM 的技术特性,都能够无缝的在各个应用服务器中获得支持。
AOM开发团队的开放心态永远不变!
一个框架为什么要绑定到一个服务器上。。。埃
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 4216 次
- 性别:

- 来自: 深圳

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
IoVC实例分析:Hello Duke ...
广告都做到这里来了阿呵呵有空可以看看我的http://www.javaeye.c ...
-- by Joo -
OperaMasks 2.0特性之三: ...
JSF目前验证是基于java 5以前的技术,这种基于文件配置的方式,我更喜欢st ...
-- by hantsy -
OperaMasks 2.0特性之二: ...
有3个问题:1. 在你前面的博客文章中提到过OperaMasks提倡的是"约定优 ...
-- by Quake Wang -
OperaMasks 2.0特性之一: ...
可惜你们的AOM不支持HIBERNATE 而且文档确实少了点!
-- by vieri122 -
OperaMasks 2.0特性之一: ...
views层用的xml过于怪异。采用用grails的html+tag(有逻辑), ...
-- by jamesqiu






评论排行榜