为页面绑定LiteBean
使用IoVC的第一步是为页面绑定一个或多个LiteBean。LiteBean是对JSF中ManagedBean的扩展,在OperaMasks2.0中,LiteBean正是通过
@ManagedBean 标注来定义的。OperaMasks2.0为LiteBean提供了多种便于对视图进行绑定与控制的标注。在IoVC的语境下,
LiteBean是控制行为的发起者。
OperaMasks2.0提供了两种绑定形式,通过
WEB-INF/operamasks.xml部署配置文件进行绑定和通过<om:useBean>标签进行绑定。
通过配置WEB-INF/operamasks.xml可以将对业务模型的引用完全从展现层页面中消除,
OperaMasks2.0支持在绑定映射中使用模式匹配,从而达到一劳永逸,也不失灵活性。事实上, 所有通过Apusic
Studio创建的支持OperaMasks的Web模块,其WEB-INF中都包含一个默认的operamasks.xml
配置文件,其中包含一条默认的绑定映射规则:
<operamasks-config xmlns="http://www.operamasks.org/IoVC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.operamasks.org/IoVC http://www.operamasks.org/schema/operamasks.xsd ">
<view-mapping>
<url-pattern>*</url-pattern>
<model-bean>#{~view}Bean</model-bean>
</view-mapping>
</operamasks-config> 这个默认规则允许用户在完全不关心绑定规则的前提下获得IoVC支持,
这是OperaMasks2.0中“约定优于配置”思想的一个体现。当然,OperaMasks2.0也允许用户在
operamasks.xml中添加更多绑定规则或对默认绑定规则进行修改。
针对 operamasks.xml 的绑定策略如下:
Rule 1:可以在配置文件中以通配符的形式进行定义。如:
<view-mapping>
<url-pattern>*</url-pattern>
<model-bean>#{~view}Bean</model-bean>
</view-mapping>上述配置含义为:使用首字母小写的页面文件名(不包括文件后缀)加上“Bean”作为该页面的绑定 LiteBean
名称。例如myPage.xhtml页面文件,对应的LiteBean类名为myPageBean。
如果页面中包含"_",如:my_page.xhtml,则对应的 LiteBean 名称为:my_pageBean。
如果页面中包含"-",如:my-page.xhtml,由于"-"是非法的Java
identifier,会忽略"-",那么,此时的 LiteBean 名称为:myPageBean。
如果将上述配置中的 view 改成 View,即首字母大写:
<view-mapping>
<url-pattern>*</url-pattern>
<model-bean>#{~View}Bean</model-bean>
</view-mapping>上述配置含义为:使用首字母大写的页面文件名(不包括文件后缀)加上“Bean”作为该页面的绑定
LiteBean 名称。例如myPage.xhtml页面文件,对应的LiteBean类名为MyPageBean。
Rule 2:可以在通配符中指定页面文件的目录结构,和LiteBean的前缀。如:
<view-mapping>
<url-pattern>/abc/*</url-pattern>
<model-bean>def.#{@view}Bean</model-bean>
</view-mapping>这就意味着:/abc/myPage.xhtml,对应的 ManagedBean
名称为:def.myPageBean。
Rule 3:精确绑定规则会覆盖通用绑定规则。 即:使用通配符定义的通用绑定规则具有最低的优先级,如果一个页面符合使用精确指定
LiteBean名称进行的绑定定义, 将会覆盖使用通配规则的绑定定义。
Rule 4:重复定义的 url-pattern 或 model-bean 在不违反 Rule 3
的前提下,采用添加形式,而不是覆盖。也就是说,如果在 operamasks.xml
对同一个url-pattern或同一个model-bean
绑定了多次,则所有绑定都生效,导致某个页面会绑定到多个LiteBean,或者某个LiteBean被绑到不同的页面。
但精确绑定规则仍然会覆盖通用绑定规则。
Rule
5:在同一条<view-mapping>中,允许存在多个<url-pattern>和多个<model-
bean>,这时绑定的结果是其中每个<url-pattern>分别绑定了所有的<model-bean>。如:
<view-mapping>
<url-pattern>/test1.xhtml</url-pattern>
<url-pattern>/test2.xhtml</url-pattern>
<model-bean>test1Bean</model-bean>
<model-bean>test2Bean</model-bean>
</view-mapping>绑定结果是,test1.xhtml绑定了test1Bean和test2Bean,test2.xhtml也绑定了test1Bean和test2Bean
Rule 6:<model-bean>标签支持以下匹配模式:
#{~view} :此模式会被替换为包含路径的页面名称。即为 /test/abc.xhtml 进行绑定时,以上模式会被替换为
test.abc
#{~View} :此模式会被替换为包含路径的的首字大写页面名称。即为 /test/abc.xhtml
进行绑定时,以上模式会被替换为 test.Abc
#{view} : 此模式会被替换为不包含路径的页面名。即为 /test/abc.xhtml 进行绑定时,以上模式会被替换为
abc
#{View} : 此模式会被替换为不包含路径的首字大写页面名。即为 /test/abc.xhtml
进行绑定时,以上模式会被替换为 Abc
同时需要注意的是:一个页面,通过 operamasks.xml 中配置的规则,和某个 LiteBean
进行绑定,此页面必须要单独运行这种绑定关系才起作用。如果此页面没有单独运行,而是被一个
<ajax:updater>引入到其它的页面中(frame设置为false),那么,与此页面绑定的LiteBean不会正常工作。
为了方便轻量级用户或某些特殊场景,OperaMasks2.0也支持在页面代码中使用<om:useBean>标签来指定页面绑定的LiteBean。例如:
<om:useBean value="EmployeeBean,demo.CompanyBean" />
通过<om:useBean>将页面和LiteBean进行绑定,与通过 operamasks.xml 进行页面与
LiteBean 的绑定,其实质是一样的。
一个使用<om:useBean>的典型场景是,当一个页面使用<ajax:updater>引入了另一个页面时,
由于被引入的页面没有独立的ViewId,它必须使用<om:useBean>标签来绑定LiteBean