在JSF中使用注释实现导航规则

时间:2014-01-29 00:03:56

标签: jsf-2

我刚刚开始使用JSF 2.0,我非常清楚可以使用xml文件执行此操作。但由于J2EE倾向于使用越来越多的注释,也许我可以使用它们。

所以我的问题是:

  1. 有可能吗?
  2. 如果是,怎么样?
  3. 编辑:

    我想要实现的是一个简单的登录页面。我有一个带有登录方法的ManagedBean用户:

    @ManagedBean
    public class User {
       //fields
       public String login() {
         if ( /*all is good*/)
            return "success"
         else 
            return "failure"
       }
    }
    

    现在在login.xhtml文件中,我有一个commandButton,在点击时调用登录方法

    <h:commandButton action="#{user.login}" value="#{msg.login}"></h:commandButton>
    

    (在我看来)隐式导航规则是限制性的原因是因为:假设我将上面的commandButton放入login2.xhtml,它总是 success.xhtml ,将在成功时调用和 failure.xhtml 否则,即使它不是我想要的。

    尽管可以使用 faces-config.xml 文件(带有导航规则标签)轻松解决这个问题,但我想使用注释(我不喜欢xml文件)。

2 个答案:

答案 0 :(得分:0)

您可能想看看ocpsoft优秀的rewrite库。除了导航规则之外,它还使您能够定义自定义URL路由以在JSF应用程序中获得漂亮的URL。

注释的内容大部分仅限于URL重写,但您也可以使用用Java编写的ConfigurationProvider来定义注释无法处理的任何内容。

答案 1 :(得分:0)

我仍然不明白为什么使用注释会给你买东西。据我所知,根据视图,您希望重定向到其他页面。既然你想把这些信息保存在bean中,你就可以这样做:

@ManagedBean
public class MyBean {
    public String login() {
        boolean success = authenticate();
        String callingView = FacesContext.getCurrentInstance()
                .getViewRoot().getViewId();
        if (success && callingView.contains("login2")) {
            return "success2?faces-redirect=true";

        } else if (success) {
            return "success?faces-redirect=true";
        }
        return "failure?faces-redirect=true";
    }
}

当然你可以取消使用faces-redirect=true,但我发现使用Post-Redirect-Get模式是一种很好的做法。