2015-08-28 54 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