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



在我的网站上,我希望能够通过链接更改Locale,但我无法随心所欲地使用它。问题是,我可以指定<每个页面上的f:metadata标签,带有以下内容,并且可以使用

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

然而,这是非常丑陋的,因为这个功能与每个页面无关,并且引用了页眉中的一个控制元素,我敢打赌,我会在某个时候错过同一页面上的元素。因此,我想将其转移到我的主页模板或页眉模板,而不是定义页面模板的正文元素的单个页面。我的模板结构如下,有一个主模板、一个页眉模板、左开内容部分(每个真实页面都需要填写(和一个页脚模板。但如果我移动这个(显然是<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>

干杯Tom

不可能将<f:metadata>放入模板中。它真的必须进入客户端页面。另请参见a.o.JSF 2 facelets<f: 元数据/>在模板和页面中。

您最好的选择是手动获取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;
        // ...
    }
    

相关内容

  • 没有找到相关文章

最新更新