我从What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
开始我有一个预呈现视图事件监听器:
<f:metadata>
<f:event type="preRenderView" listener="#{loginBean.performWeakLogin()}" />
</f:metadata>
调用以下方法:
public String performWeakLogin() {
FacesContext facesContext = FacesContext.getCurrentInstance();
String parameter_value = (String) facesContext.getExternalContext().getRequestParameterMap().get("txtName");
if (parameter_value != null && parameter_value.equalsIgnoreCase("pippo")) {
try {
return "mainPortal";
} catch (IOException ex) {
return null;
}
} else {
return null;
}
}
以及以下导航规则:
<navigation-rule>
<from-view-id>/stdPortal/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>mainPortal</from-outcome>
<to-view-id>/stdPortal/stdPages/mainPortal.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
但是,它不执行导航。当我使用命令按钮时,它可以工作,如下所示:
<p:commandButton ... action="#{loginBean.performWeakLogin()}" />
答案 0 :(得分:9)
基于方法返回值的导航仅由实现ActionSource2
接口的组件执行,并为其提供MethodExpression
属性,例如action
属性UICommand
组件,在应用请求值阶段排队,并在调用应用程序阶段期间调用。
<f:event listener>
只是一个component system event侦听器方法,而不是一个操作方法。您需要手动执行导航,如下所示:
public void performWeakLogin() {
// ...
FacesContext fc = FacesContext.getCurrentInstance();
fc.getApplication().getNavigationHandler().handleNavigation(fc, null, "mainPortal");
}
或者,您也可以发送给定网址的重定向,这对于您不希望在内部导航但外部导航的情况更有用:
public void performWeakLogin() throws IOException {
// ...
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.redirect(ec.getRequestContextPath() + "/stdPortal/stdPages/mainPortal.xhtml");
}
无关,servlet filter是执行基于请求的授权/身份验证工作的更好地方。
答案 1 :(得分:1)
我将JBoss 7与JSF 2.1一起使用。 BalusC的解决方案是重定向到JBoss默认错误页面,即使我已经在web.xml中设置了默认错误页面
<error-page>
<error-code>404</error-code>
<location>/myapp/404.xhtml</location>
</error-page>
要重定向到我自己的错误页面,我使用响应发送错误:
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse();
try {
response.sendError(404);
} catch (IOException ioe) {
ioe.printStackTrace();
}
facesContext.responseComplete();