在模板中正确使用 <f:metadata><f:viewParam...

Using <f:metadata><f:viewParam... correctly within templates

在我的网站上,我希望能够通过 Link 更改区域设置,但我无法按照自己的意愿使用它。问题是我可以在每个页面上使用以下内容指定一个 <f:metadata 标签并且有效

<ui:define name="metadata">
 <f:metadata>
        <f:viewParam name="locale" value="#{changeLocaleController.locale}"/>...

然而,这非常难看,因为此功能与每个页面无关,而是引用页面中的控件元素 header,我敢打赌我有时会错过同一页面上的元素。所以我想将其转移到我的主页模板或 header 模板,而不是定义我的页面模板的 body 元素的单个页面。我的模板结构如下,一个主模板,一个 header 模板,一个左开的内容部分(每个实际页面都需要填写这个)和一个页脚模板。但是如果我移动它(显然然后 <ui:define name="metadata">)然后如果我出于我不明白的原因点击 link 什么也不会发生。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ...>
<ui:insert name="metadata" /><
<h:head>
    some css etc
</h:head>

<h:body>
    <ui:insert name="header">
        <ui:include src="header.xhtml" />
    </ui:insert>

    <ui:insert name="content" />

    <ui:insert name="footer">
        <ui:include src="footer.xhtml" />
    </ui:insert>
</h:body>

所以基本上我想将上面的标记部分从内容部分移到整个模板或 header 部分,但这不起作用。这有可能吗?

在我的 header 部分,我有 link 到不同语言的

<h:link>
  <f:param name="locale" value="#{language.locale}" />some image
</h:link>

干杯 汤姆

无法将 <f:metadata> 放入模板中。它确实必须进入客户端页面。另见 a.o。 JSF 2 facelets <f:metadata/> in template and page.

您最好的选择是通过以下方式之一手动获取 bean 中的请求参数:

  1. 通过@ManagedProperty("#{param.xxx}").

    @ManagedBean
    @RequestScoped
    public class ChangeLocaleController {
    
        @ManagedProperty("#{param.locale}")
        private String locale;
    
        // ...
    }
    
  2. 或通过ExternalContext#getRequestParameterMap().

    @ManagedBean
    @RequestScoped
    public class ChangeLocaleController {
    
        @PostConstruct
        public void init() {
            String locale = FacesContext.getCurrentInstance()
                .getExternalContext().getRequestParameterMap().get("locale");
    
            // ...
        }
    }
    
  3. 或者,如果您使用的是 CDI,则通过 OmniFaces @Param

    @Named
    @RequestScoped
    public class ChangeLocaleController {
    
        @Inject @Param
        private String locale;
    
        // ...
    }