2015-08-28 58 views
0

我第一次尝试Java,这个错误很奇怪,我似乎是这个星球上唯一有问题的人。仅创建第一个JSF控制器。其他人被忽略

我有两个网页:

<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,我看到首页控制器创建......但我没有在about.xhtml上看到任何消息。即使在使用NetBeans的Debug时,Controller也不会被调用。

+1

show your home.xhtml and about.xhtml – Kukeltje

+0

我认为你很混淆JSF和MVC,JSF不需要控制器,你应该从一些教程开始 –

+2

'AboutController'不会被生成,直到你在任何JSF文件中使用它。 –

回答

-1

你包的声明是错误的。

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

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

(也可以在XHTML使用@ManagedBean(名称= “aboutController”)和参考将其与#{aboutController.someValue}

顺便说一句:JSF是所有关于控制器,通常控制器处于@RequestScope。你可以在那些2种@SessionScope豆将你的会议,但最终你只有1个会话。考虑删除其他SessionScope豆,并使用@RequestScope豆操纵@SessionScope bean中的数据。另外一个好的选择是使用@ ViewScope bean,如果你正在验证一些字段并显示带有错误字段值的错误消息。

+0

Java EE 6应该可以使用EJB'@ Named'和CDI'@ SessionScoped',而不是'@ ManagedBean'。事实上,有一种传言是“@ ManagedBean”将被弃用或消失。我的经验是'@ ViewScope'很脆弱。否则我同意你的看法。 –

+0

@DanielLyons没错。我停止使用JSF的'@ ManagedBean',而是仅使用CDI的'@ Named'。 –

+1

此答案的包声明部分是错误的。 – BalusC