在我的网站上,我希望能够通过链接更改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中的请求参数,方法如下:
-
通过
@ManagedProperty("#{param.xxx}")
。@ManagedBean @RequestScoped public class ChangeLocaleController { @ManagedProperty("#{param.locale}") private String locale; // ... }
-
或通过
ExternalContext#getRequestParameterMap()
。@ManagedBean @RequestScoped public class ChangeLocaleController { @PostConstruct public void init() { String locale = FacesContext.getCurrentInstance() .getExternalContext().getRequestParameterMap().get("locale"); // ... } }
-
或者,如果您使用CDI,请通过OmniFaces
@Param
。@Named @RequestScoped public class ChangeLocaleController { @Inject @Param private String locale; // ... }