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

Jsf 2 在JSF中使用注释实现导航规则,jsf-2,Jsf 2,我刚刚开始使用JSF2.0,我非常清楚使用xml文件可以实现这一点。但是由于J2EE倾向于使用越来越多的注释,也许我可以利用它们 所以我的问题是: 可能吗? 如果是,如何进行? 编辑: 我想要实现的是一个简单的登录页面。我有一个使用登录方法的ManagedBean用户: 现在在login.xhtml文件中,我有一个commandButton,它在单击时调用login方法 <h:commandButton action="#{user.login}" value="#{msg.login}"

我刚刚开始使用JSF2.0,我非常清楚使用xml文件可以实现这一点。但是由于J2EE倾向于使用越来越多的注释,也许我可以利用它们

所以我的问题是:

可能吗? 如果是,如何进行? 编辑:

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

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

<h:commandButton action="#{user.login}" value="#{msg.login}"></h:commandButton>
在我看来,隐式导航规则具有限制性的原因是:假设我将上面的commandButton放入login2.xhtml中,则在success和failure.xhtml中调用success.xhtml,否则,即使这不是我想要的


尽管使用带有导航规则标记的faces-config.xml文件可以很容易地解决这个问题,但我还是希望使用注释,因为我不喜欢xml文件

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


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

我仍然不明白为什么使用注释会给您带来好处。我理解,根据视图的不同,您希望重定向到不同的页面。由于您希望将此信息保存在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模式是一种很好的做法。

隐式导航是从操作方法返回视图名称,或者只是简单地在类似于。不需要注释,这是两个独立的概念。我已经知道了。但是我认为这有点限制,因为我不能根据调用方法的bean来调度视图。你能在你的问题中给出一个例子吗?显然,由于是bean控制其方法返回的内容,因此调度视图当然依赖于bean。Jsf导航与注释无关。重写库允许您拥有更漂亮的URL或将特定视图与具体的托管bean绑定,但这不是简单的导航。是的,这不是我真正想要的。但是在查看JSEE文档之后,我认为您要么必须使用faces-config.xml,要么必须使用隐式导航谢谢。这显然是我想要的:将这些信息保存在bean中。但我不这么认为,我相信可以使用一些注释来代替。@user3173787您可能可以自己编写NavigationHandler类,但如果没有真正的收益,它会更复杂。
@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";
    }
}