2016-10-31 33 views
1

我們假設,我有一個student.xhtml表單,它有&下拉菜單,其中包含@ManagedBean Student()。如你所知,爲了從managedbean填充表單,我需要在Student類中有List<Object>字段。但我也希望我的學生類是純粹的意思,它應該只有與自身相關的字段,不是它可以獲得的可能值(我的意思是列表<>)。所以我想單獨從@ManagedBean我的Student類。所以我將在最後有兩個類是純的學生類和控制視圖的StudentBean類。JSF託管的豆類和設計模式

所以我的問題是,是不是很好的做法有兩個類像下面或我應該去一個類?兩類方法重複字段,所以我不知道它是否影響性能在很大程度上..你有什麼建議?

不想要BeanClassWithStudent模式;

import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.*; 

    @ManagedBean 
    public class Student { 

private String firstName; 
private String lastName; 
private String country; 
private String favLanguage; 

private List<String> countryList; 
private List<String> favLanguageList; 

@PostConstruct // generate DropDownList Combobox and radiobuttons From class fields 
public void init() { 
    generateCountries(); 
    generateFavLanguages(); 
} 

public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public String getCountry() { 
    return country; 
} 
public void setCountry(String country) { 
    this.country = country; 
} 
public String getFavLanguage() { 
    return favLanguage; 
} 

public void setFavLanguage(String favLanguage) { 
    this.favLanguage = favLanguage; 
} 
public List<String> getCountryList() { 
    return countryList; 
} 

public List<String> getFavLanguageList() { 
    return favLanguageList; 
} 

private void generateCountries(){ 
    countryList = new ArrayList<>(); 
    countryList.add("Turkey"); 
    countryList.add("France"); 
    countryList.add("Senegal"); 
    countryList.add("USA"); 
} 

private void generateFavLanguages(){ 
    favLanguageList = new ArrayList<>(); 
    favLanguageList.add("Java"); 
    favLanguageList.add("Ruby"); 
    favLanguageList.add("C++"); 
    favLanguageList.add("Visual Basic"); 
} 

}

我想單獨的類; Student.class

public class Student { 

private String firstName; 
private String lastName; 
private String country; 

public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public String getCountry() { 
    return country; 
} 
public void setCountry(String country) { 
    this.country = country; 
} 

通緝StudentControllerBean;

import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.*; 

    @ManagedBean 
    public class StudentBean { 

private String firstName; 
private String lastName; 
private String country; 

private List<String> countryList; 
private List<String> favLanguageList; 

@PostConstruct // generate DropDownList Combobox and radiobuttons From class fields 
public void init() { 
    generateCountries(); 
    generateFavLanguages(); 
} 

public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public String getCountry() { 
    return country; 
} 
public void setCountry(String country) { 
    this.country = country; 
} 
public List<String> getCountryList() { 
    return countryList; 
} 

public List<String> getFavLanguageList() { 
    return favLanguageList; 
} 

private void generateCountries(){ 
    countryList = new ArrayList<>(); 
    countryList.add("Turkey"); 
    countryList.add("France"); 
    countryList.add("Senegal"); 
    countryList.add("USA"); 
} 

private void generateFavLanguages(){ 
    favLanguageList = new ArrayList<>(); 
    favLanguageList.add("Java"); 
    favLanguageList.add("Ruby"); 
    favLanguageList.add("C++"); 
    favLanguageList.add("Visual Basic"); 
} 

}

+0

@javaguy我沒有任何,這是一個設計模式的問題。 –

+1

閱讀此:http://stackoverflow.com/questions/7223055/making-distinctions-between-different-kinds-of-jsf-managed-beans/7223910#7223910和http://stackoverflow.com/questions/13011392/jsf-service-layer和http://stackoverflow.com/questions/30639785/jsf-controller-service-and-dao其中這是一個重複的 – Kukeltje

+0

@Kukeltje它不是重複的,它是完全不同的問題。其他人正在談論2個單獨的bean類,而我正在談論一個控制器類和一個純對象類。 –

回答

1

它始終是更好地維護兩個單獨Beans一個爲業務層(服務層)表示層(@ManagedBean),另一個(被稱爲商業/ Entiry豆)即將表示層(託管)bean與業務bean混合在一起不是一個好主意,而需要像將它們分開一樣來分開它們。

的J2EE各層之間的請求流去如下:

HTML/JSP - > ManagedBean - >服務 - > DAO - >數據庫

你需要演示bean的數據轉換到Action類中的Business Bean,然後將它傳遞給Business Bean Object到Services層。服務層使用此業務Bean與DAO類進行交互,後者持久存在或與數據庫進行一些交易。

這個概念不僅適用於JSF,也適用於所有其他的J2EE web框架(如Struts,Spring MVC等)。

你可以在這個概念上找到更多細節here

+0

感謝您的答案。您的回答似乎涵蓋了頂級複雜的Java EE應用程序的所有內容。如果我們認爲小企業,我可以直接從ManagedBean調用服務層嗎?比如中小型網站? –

+0

我已經用請求流更新了我的答案,它適用於所有企業(小/中/大) – developer

+0

謝謝你的回答 –