OFBiz对视图模板使用装饰器screen widget。这里单词“装饰器”来它基于的自设计模式——装饰器模式,这里装饰器在要包装的对象周围包装它自己。这种设计模式本身很适合我们模板的需要,因为一个装饰器将作为一个带有“插槽”的模板,在其中我们能插入(包含,在screen widget术语中)内容。也就是说,装饰器用内容块包围来包装自己。
1.创建XHTML装饰器screen
插入一个新的screen widget 名为xhtml-decorator的screen widget到文件 LearningScreens.xml中:
---------------------------------------------------
<screen name="xhtml-decorator">
<section>
<widgets>
<include-screen name="header"/>
<decorator-section-include name="body"/>
<include-screen name="footer"/>
</widgets>
</section>
</screen>
---------------------------------------------------
注意这跟CompoundedScreen很像,除了所有的内容被 <decorator-section-include>元素替换掉了。 <decorator-section-include>就像一个命名的内容插槽。该元素告诉装饰器在header和footer之间插入名为body的内容片断。
实际上内容片断可被命名意味着:在一个包含不同内容片断的装饰器中,我们能有多个插槽。简而言之,一个装饰器窗口可指定命名的内容插槽,相同命名的内容片断可插入包含进其中。现在,在下面的例子中试试一个单一插槽的装饰器吧。
2.使用XHTML装饰器screen
在文件LearningScreens.xml中,编辑screen widget CompoundedScreen来使用screen widget xhtml-decorator:
---------------------------------------------------
<screen name="CompoundedScreen">
<section>
<widgets>
<decorator-screen name="xhtml-decorator">
<decorator-section name="body">
<include-screen name="SimplestScreen" />
<include-screen name="AnotherSimpleScreen" />
</decorator-section>
</decorator-screen>
</widgets>
</section>
</screen>
---------------------------------------------------
<decorator-screen>元素指出:我们想要应用xhtml-decorator装饰器screen到包含在<decorator-screen>元素中的内容。
为了让 <decorator-screen>元素拥有任何效果,需要用 <decorator-section> 元素指定命名的内容片断。尽管上面例子中仅展示一个,但可有多个命名的内容片断。命名的内容片断取代装饰器中命名的内容插槽。
上面例子中的命名内容片断body是一个两个简单screens的复合体。这两个简单screens将插入到装饰器的命名内容插槽body中。
3.查看结果
发送OFBiz http请求CompoundedScreen到web应用learning http://localhost:8080/learning/control/CompoundedScreen。查看页面源代码来确认和我们在叫做候选模板的部分中看到的相同的格式良好的XHTML文档。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Begin Screen component://learning/widget/learning/LearningScreens.xml#CompoundedScreen -->
<!-- Begin Screen component://learning/widget/learning/LearningScreens.xml#xhtml-decorator -->
<!-- Begin Screen component://learning/widget/learning/LearningScreens.xml#header -->
<!-- Begin Template component://learning/webapp/learning/includes/header.ftl -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>OFBiz XHTML Document</title>
</head>
<body><!-- End Template component://learning/webapp/learning/includes/header.ftl -->
<!-- End Screen component://learning/widget/learning/LearningScreens.xml#header -->
<!-- Begin Screen component://learning/widget/learning/LearningScreens.xml#SimplestScreen -->
Simplest Screen possible in OFBiz!
<!-- End Screen component://learning/widget/learning/LearningScreens.xml#SimplestScreen -->
<!-- Begin Screen component://learning/widget/learning/LearningScreens.xml#AnotherSimpleScreen -->
Just Another Simple Screen.
<!-- End Screen component://learning/widget/learning/LearningScreens.xml#AnotherSimpleScreen -->
<!-- Begin Screen component://learning/widget/learning/LearningScreens.xml#footer -->
<!-- Begin Template component://learning/webapp/learning/includes/footer.ftl -->
</body>
</html><!-- End Template component://learning/webapp/learning/includes/footer.ftl -->
<!-- End Screen component://learning/widget/learning/LearningScreens.xml#footer -->
<!-- End Screen component://learning/widget/learning/LearningScreens.xml#xhtml-decorator -->
<!-- End Screen component://learning/widget/learning/LearningScreens.xml#CompoundedScreen -->
页面源码显示了我们第一个格式良好版本的CompoundedScreen中相同内容。我们使用了一个单一装饰器(xhtml-decorator)来取代两个<include-screen>元素,它们负责创建我们的格式良好的XHTML文档中的头部和底部。