6

我从<f:metadata>、<f:viewParam> 和 <f:viewAction> 可以用来做什么开始?

我有一个预渲染视图事件监听器:

<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()}"  /> 
4

2 回答 2

10

基于方法返回值的导航仅由实现ActionSource2接口的组件执行,并为其提供一个属性MethodExpression,例如组件的action属性,该属性在Apply Request Values阶段UICommand排队并在Invoke Application阶段调用。

<f:event listener>仅仅是一个组件系统事件监听器方法,而不是一个动作方法。您需要手动执行导航,如下所示:

public void performWeakLogin() {
    // ...

    FacesContext fc = FacesContext.getCurrentInstance();
    fc.getApplication().getNavigationHandler().handleNavigation(fc, null, "mainPortal");
}

或者,您也可以在给定的 URL 上发送重定向,这对于您不想在内部导航但在外部导航的情况更有用:

public void performWeakLogin() throws IOException {
    // ...

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/stdPortal/stdPages/mainPortal.xhtml");
}

与具体问题无关, servlet 过滤器是执行基于请求的授权/身份验证工作的更好场所。

也可以看看:

于 2013-04-19T14:06:21.627 回答
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();
于 2013-12-17T09:27:43.030 回答