仅创建了第一个JSF控制器。其他人都被忽视了

时间:2015-08-28 15:28:43

标签: jsf jsf-2

我第一次尝试Java并且这个错误很奇怪,我似乎是唯一一个在这个星球上遇到问题的人。

我有两个网页:

<h:link outcome="index">Home</h:link>
<h:link outcome="about">About</h:link>

我有两个控制器,按照我在包Controller中创建它们的顺序显示如下:

HomeController.java

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class HomeController implements Serializable{

    public HomeController() {
        System.out.println("Home Controller Created......");
    }
}

AboutController.java:

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class AboutController implements Serializable{

    public AboutController() {
        System.out.println("About Controller Created......");
    }
}

如果我访问home.xhtml,我会看到 Home Controller Created ...... ,但我在about.xhtml上看不到任何消息。即使我使用NetBeans Debug,控制器也不会被调用。

1 个答案:

答案 0 :(得分:-1)

您的包裹声明错误。

首先: 在使用JSF时使用javax.faces包,因此您的@SessionScope包是错误的。 其次:

您需要使用@ManagedBean而不是@Named。 JSF首先引用它,自动为您创建SessionScope bean。不要在构造函数中放置任何东西,因为JSF可以在需要时创建bean,如果构造失败(Nullpointer等),那么你就有问题了。 JSF样式是使用@PostConstruct注释在构造之后初始化数据。 如果你的xhtml中有<h:outputText value="#{aboutcontroller.someValue},那么AboutBean就会创建一次/ session。

(您也可以使用@ManagedBean(name =&#34; aboutController&#34;)并使用#{aboutController.someValue}在xhtml中引用它

顺便说一下:JSF是关于控制器的,通常控制器都在@RequestScope中。您可以在2个@SessionScope bean中划分会话,但最后只有1个会话。考虑删除其他SessionScope bean,并使用@RequestScope bean来操作@SessionScope bean中的数据。另一个好的选择是使用@ViewScope bean,如果您正在验证某些字段并显示错误字段值的错误消息。