Jon*_*her 4 jsf facelets omnifaces
我有以下页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
xmlns:thehub="http://java.sun.com/jsf/composite/components/thehub"
template="/templates/masterTemplate.xhtml">
<f:metadata>
<f:viewParam
id="returnToViewParam"
name="returnTo"
value="#{loginMB.returnTo}"
required="true" />
<f:viewParam
id="oauth_verifierViewParam"
name="oauth_verifier"
value="#{loginMB.oauth_verifier}" />
<f:viewParam
id="oauth_tokenViewParam"
name="oauth_token"
value="#{loginMB.oauth_token}" />
<f:event
type="preRenderView"
listener="#{loginMB.preRenderView()}" />
</f:metadata>
<ui:define name="body">
<o:form
id="loginForm"
includeViewParams="true">
<div class="form-vertical well">
<h4>New Users</h4>
<h5>
<h:link outcome="signup">Click here to create an account</h:link>
</h5>
<hr />
<h4>Existing Users</h4>
<h:commandButton
id="googleLoginCommandLink"
styleClass="btn"
action="#{loginMB.redirect()}"
value="Google">
<f:param
name="returnTo"
value="#{param.returnTo}" />
</h:commandButton>
<div class="clearfix"></div>
</div>
</o:form>
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
以下bean:
@ManagedBean
@RequestScoped
public class LoginMB implements Serializable {
private static final long serialVersionUID = 1L;
private String returnTo;
public void redirect() {
log.debug("redirect() returnTo:{}", returnTo);
......getter/setters
}
Run Code Online (Sandbox Code Playgroud)
无论我做什么,一旦点击commandButton,我似乎无法返回到绑定.由于这是一个登录页面,我真的 不喜欢让LoginMB成为@ViewScoped bean.
建议吗?有没有更好的方法来处理这种情况?
编辑:
redirect()函数内部,returnTo为null你<f:metadata>在外面<ui:define>,因此完全被忽略了.添加<ui:insert name="metadata">到主模板并将其放在模板客户端的<f:metadata>内部<ui:define name="metadata">.
修复后,您可以安全地<f:param>从命令按钮中删除它.这项工作已经完成了<o:form includeViewParams="true">.如果你没有它,那么<f:param>确实是强制性的,你需要在同一形式的所有命令链接和按钮上进行复制.