2011-12-11 79 views
2

實體何時或在何處創建?
當XHTML頁面通過託管bean加載並訪問實體時,它們是否被創建?
或者它們是否在託管bean中自動創建?
我們是否需要從託管bean的構造函數手動創建它?何時/何地在Java EE Web應用程序上創建實體?

請參閱下面的代碼

該實體將是(一些必要的代碼可能不會被複制。):

public class PersonalInfo implements Serializable { 
    @Size(max = 50) 
    @Column(name = "FIRST_NAME", length = 50) 
    private String firstName; 

    // some getters and setters 
} 

網頁將是:

<h:form> 
    <h:outputText value="first name"/> 
    <h:inputText value="#{personalInforController.personalInfo.firstName}" /> 

    <h:commandButton value="hit me" 
     action="#{personalInforController.create}" 
     immediate="true"/> 
</h:form> 

和後臺豆將是:

@Named(value = "personalInfoController") 
@SessionScoped 
public class PersonalInforController { 
    @EJB 
    PersonalInfoFacade ejbFacade; 
    PersonalInfo personalInfo; 
    String defaultPage = "index"; 

    public String create() { 
     try { 
      ejbFacade.create(personalInfo); 
      return "prepareCreate"; 
     } catch (Exception e) { 
      return "success"; 
     } 
    } 
} 

回答

4

在給出的示例代碼中,create行爲確實似乎無法工作。在此之前,實體必須由支持bean創建。

如果它是一個簡單的實體,構造函數或@PostConstruct方法都可以工作。例如:

@Named(value = "personalInfoController") 
@SessionScoped 
public class PersonalInforController { 

    @EJB 
    PersonalInfoFacade ejbFacade; 
    PersonalInfo personalInfo; 
    String defaultPage = "index"; 

    @PostConstruct 
    public void init() { 
     personalInfo = new PersonalInfo(); 
    } 

    public String create() { 
    try { 
     ejbFacade.create(personalInfo); 
     return "prepareCreate"; 
    } catch (Exception e) { 
     return "success"; 
    } 
} 

關於代碼的一些說明。將bean聲明爲@SessionScoped非常可疑,並且很可能是錯誤的。如果personalInfo正在兩個選項卡或窗口中編輯,您將處於受傷的世界。我建議製作你的bean @ViewScoped(對於CDI,Seam3提供了一個單獨的擴展,如果你不能/不會使用這個擴展名,可以考慮使用@ManagedBean而不是@Named)。

另外,您可能希望將您的實例變量聲明爲私有,並給ejbFacade一個更好的名稱(例如,personalInfoFacade)。我也懷疑在命令按鈕上是否需要immediate,並且由於outputText顯然是給定inputText的標籤,所以您可能需要考慮使用outputLabel和for屬性。

+0

非常感謝您的澄清!好的,所以我們需要從構造函數或用atPostConstruct裝飾的方法手動創建它。由於NetBeans自動生成的代碼,我只是有點困惑。無論如何,再次感謝。感謝幫助! –

相關問題