gpt4 book ai didi

jsf - JSF2/Facelets 中的私有(private)/范围变量 ?

转载 作者:行者123 更新时间:2023-12-04 06:22:52 26 4
gpt4 key购买 nike

我可能没有正确思考 JSF 中的可视化组件,但我想这是我的问题的一部分。我的问题是围绕 JSF 实现中声明的变量似乎缺乏范围。

所以,假设我有/resources/comp/myPanel.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<ui:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
</cc:interface>
<cc:implementation>
<f:loadBundle var="bundle" basename="panelOnly.bundle" />

<h:outputText value="#{bundle.myText}" />
</cc:implementation>
</ui:component>

并且有一个资源包被加载到该组件中,panelOnly/bundle.properties:
myText = This is a panel resource

然后我有一个放置 myPanel 组件 mainPage.xhtml 的页面:
<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:comp="http://java.sun.com/jsf/composite/comp">
<h:body>
<f:view>
<f:loadBundle basename="mainPage.bundle" var="bundle" />

<comp:myPanel />

<h:outputText value="#{bundle.myText}" />
</f:view>
</h:body>
</html>

并且有一个资源包被加载到主页中,mainPage/bundle.properties:
myText = This is a main page resource

现在,我假设我的页面应该呈现为:
This is a panel resource
This is a main page resource

但是,相反,我得到:
This is a panel resource
This is a panel resource

我认为这是因为我破坏了组件中“bundle”符号所指的内容,因此当 mainPage.xhtml 尝试解析该值时,它会查看组件的“bundle”对象而不是原始 mainPage 的对象。

迄今为止,我的解决方法是只在我的组件中使用唯一的命名变量,这些变量永远不会与我的主页上的变量发生冲突。但是如果有一种方法可以让 JSF 将我的组件中声明的任何内容识别为本地范围的变量,而不是破坏调用者的符号,我更愿意这样做。

我认为还有其他标签可以用来在#{cc.attrs...} 下制作局部范围的变量。如果您可以在答案中列举我的本地范围选项,那将非常有帮助。我怀疑我的 是一种特殊情况,并且可能没有针对该情况的解决方法,因为它不是在设计时考虑到 的。

谢谢!

附言我正在运行 Mojarra 2.1.1 (FCS 20110408)

(针对格式化和复制粘贴错误进行了编辑,2011 年 6 月 15 日)

最佳答案

不幸的是,这就是 <f:loadBundle>作品。这是整个 View 的一次性设置。以及任何后续的<f:loadBundle>同一 View 中的调用只会覆盖前一个。

你最好的办法是通过一个支持组件来管理它。

<cc:interface componentType="myPanel">


@FacesComponent(value="myPanel")
public class MyPanel extends UIComponentBase implements NamingContainer {

private ResourceBundle bundle;

public MyPanel() {
bundle = ResourceBundle.getBundle("panelOnly.bundle",
FacesContext.getCurrentInstance().getViewRoot().getLocale());
}

@Override
public String getFamily() {
return "javax.faces.NamingContainer";
}

public ResourceBundle getBundle() {
return bundle;
}

}

可以用作
<cc:implementation>
<h:outputText value="#{cc.bundle.myText}" />
</cc:implementation>

关于jsf - JSF2/Facelets 中的私有(private)/范围变量 <ui :component>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com