【问题标题】:JSF-Managed Beans and Design Patterns [duplicate]JSF 管理的 Bean 和设计模式 [重复]
【发布时间】:2017-03-13 22:52:07
【问题描述】:

假设,我有一个 student.xhtml 表单,其中包含从其@ManagedBean Student() 填充的 radiolists&dropdownmenu。如您所知,为了从 managedbean 填充表单,我需要在 Student 类中有 List<Object> 字段。但我也希望我的 Student 类是纯粹的,这意味着它应该具有仅与自身相关的字段,而不是它可以获得的可能值(我的意思是 List)。所以我想将我的Student 课程与@ManagedBean 分开。所以我最后会有两个类,一个是纯学生类和控制视图的 StudentBean 类。

所以我的问题是,有两个像下面这样的课程是好的做法,还是我应该上一个课程?两个类方法重复字段,所以我不知道它是否会在很大程度上影响性能。你有什么建议?

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

}

我想要单独的班级; 学生.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");
}

}

【问题讨论】:

标签: jsf design-patterns model-view-controller jsf-2


【解决方案1】:

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

J2EE 层之间的请求流程如下:

HTML/JSP -> ManagedBean -> 服务 -> DAO -> 数据库

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

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

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

【讨论】:

  • 感谢您的回答。您的回答似乎涵盖了最复杂的 java ee 应用程序的所有内容。如果我们为小型企业考虑,我可以直接从 ManagedBean 调用服务层吗?比如中小型网站?
  • 我已经用请求流更新了我的答案,它适用于所有企业(小型/中型/大型)
  • 谢谢您的回答
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2017-06-14
  • 2017-07-17
  • 2013-04-22
  • 2011-05-16
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多