当f:view有许多定义的资源库合同时会发生什么?

7
我们尝试使用JSF 2.2中的<f:view contracts="xxx" />功能,同时使用许多合同,如“contract1、contract2”。 在我们的合同1中,我们有一个文件style1.css,而在我们的合同2中,则是style2.css。我们通过<h:outputStylesheet />标签将它们都包含在我们的视图中。 如果我只在视图中使用contracts="contract1",JSF日志会显示缺少style2.css,这是合理的。 如果我使用contracts="contract1,contract2",JSF会导入style1.cssstyle2.css,但使用了错误的url(它使用&con=contract1而不是&con=contract2来获取资源)。 这是一个bug吗?还是正常情况?我找不到关于同时使用多个合同的任何文档说明。

我还没有阅读这方面的规范,但从逻辑上讲,所有合同(“主题”)应该由完全相同的资源文件组成。基本上,不是资源发生变化,而是资源内容发生变化。答案就是将这两个文件重命名为相同的名称style.css - BalusC
但是如果每个合约都必须定义所有资源,那么允许同时存在多个合约的意义何在?如果我设置 contracts="c1,c2",并且 c1 和 c2 都定义了所有资源,那么它们中的一个总是会被另一个所覆盖,对吗? - Xavier Portebois
嗯,你可能是对的。我刚刚阅读了关于这个问题的规范,但规范本身似乎没有提到在<f:view contracts>中使用多个合同的事情。 - BalusC
1个回答

4
这是正常的行为,就像我在Apress Pro JSF and HTML 5教材中发现的那样。摘录如下:
“可以将多个合同映射到单个映射中。在这种情况下,它将按顺序查找所需的模板,一旦找到模板,它将停止处理其他模板。”
至于为什么允许这样做,如果它只会选择第一个合适的选项,我同意你的观点,毕竟这可能是没有意义的。
参考资料:

那么,这意味着JSF会寻找第一个资源,尝试找到匹配的合同,然后只使用这个合同来处理所有接下来的资源?确实毫无意义 :-/ - Xavier Portebois
2
我会将此报告给JavaServer Faces规范团队,网址为https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC。我认为这个规范在这里有问题。如果找不到资源(很容易检查),它应该继续搜索下一个合同,如果有的话。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接