使用<f:metadata> <f:viewparam ... correct =“”within =“”templates

时间:2016-08-06 14:41:15

标签: jsf jsf-2.2

=“”

在我的网站上我想要能够通过链接更改Locale但我无法按照我的意愿使用它。问题是我可以在每个页面上使用以下内容指定&lt; f:metadata标记,并且该标记有效

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

然而,这很难看,因为这个功能与每个页面无关,并且引用了页面标题中的控制元素,我打赌我会错过同一页面上的元素。所以我想将它转移到我的主页面模板或标题模板,而不是定义我的页面模板的body元素的单个页面。我的模板结构如下所示,包含一个主模板,一个标题模板,一个左开内容部分(每个真实页面需要填充此内容)和一个页脚模板。但是,如果我移动它(显然然后<ui:define name="metadata">),如果我点击链接是因为我不明白的原因,没有任何反应。

<?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>

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

在我的标题部分,我有

指向不同语言的链接
<h:link>
  <f:param name="locale" value="#{language.locale}" />some image
</h:link>

干杯 汤姆

1 个答案:

答案 0 :(得分:1)

无法将<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;
    
        // ...
    }