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。
让我们假设,我有一个 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。