我第一次尝试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
,控制器也不会被调用。
答案 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,如果您正在验证某些字段并显示错误字段值的错误消息。