JSF 管理的 Bean 和设计模式

JSF-Managed Beans and Design Patterns

让我们假设,我有一个 student.xhtml 表单,其中包含从其 @ManagedBean Student() 填充的广播列表和下拉菜单。如您所知,为了从 managedbean 填充表单,我需要在 Student class 中包含 List<Object> 字段。但我也希望我的 Student class 是纯粹的,这意味着它应该具有仅与其自身相关的字段,而不是它可以获得的可能值(我的意思是列表<>)。所以我想把我的 Student class 和 @ManagedBean 分开。所以我将在末尾有两个 classes,一个是纯 Student class 和控制视图的 StudentBean class。

所以我的问题是,像下面这样有两个 class 是好的做法还是我应该使用一个 class?两个 classes 方法重复字段,所以我不知道它是否会严重影响性能。你有什么建议?

不需要 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");
}

}

我想要单独的classes; 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");
}

}

最好维护两个单独的 Beans,一个用于表示层 (@ManagedBean),另一个(称为 Business/Entiry Bean)用于业务层(服务)层)即,将表示层(托管)bean 与业务 bean 混合在一起不是一个好主意,而是您需要像以前那样将它们分开。

J2EE 层之间的请求流如下:

HTML/JSP -> ManagedBean -> Service -> DAO -> Database

您需要在 Action 类 中将表示 bean 数据转换为业务 bean,然后将其传递给业务 Bean 对象到服务层。服务层使用此业务 Bean 与 DAO 类 交互,DAO 持久化或与数据库进行一些事务。

这个概念不仅适用于 JSF,还适用于所有其他 J2EE web 框架(如 Struts、Spring MVC 等)。

您可以找到有关此概念的更多详细信息here