为页面绑定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

[上一页] [下一页]