在模板中正确使用 <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 中的请求参数:
通过@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;
// ...
}
在我的网站上,我希望能够通过 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 中的请求参数:
通过
@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; // ... }