JSF管理的bean和设计模式

JSF管理的bean和设计模式,jsf,design-patterns,model-view-controller,jsf-2,Jsf,Design Patterns,Model View Controller,Jsf 2,假设我有一个student.xhtml表单,其中radiolists&dropdownmenu是从它的@ManagedBean student()填充的。如你所知,为了从managedbean填充表单,我需要在Student类中有List字段。但我也希望我的学生类是纯粹的,这意味着它应该只有与自身相关的字段,而不是它可以得到的可能值(我指的是列表)。所以我想把我的学生课程与@ManagedBean分开。最后我将有两个类,一个是纯学生类,另一个是控制视图的StudentBean类 所以我的问题是,

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

所以我的问题是,像下面这样的两节课是一个好的实践,还是我应该上一节课?两个类方法复制字段,所以我不知道它是否会对性能造成不良影响。。你有什么建议

不需要与学生模式相关联

 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");
}
 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");
}
通缉学生控制员Bean

 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");
}
 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");
}
import java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.*;
@ManagedBean
公共类学生bean{
私有字符串名;
私有字符串lastName;
私人国家;
私人名单国家名单;
非公开名单;
@PostConstruct//从类字段生成DropDownList组合框和单选按钮
公共void init(){
生成国家();
生成语言();
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
公共字符串getCountry(){
返回国;
}
公共国家/地区(字符串国家/地区){
这个国家=国家;
}
公共列表getCountryList(){
返回国家列表;
}
公共列表getfavlangelist(){
回教传道者;
}
私人无效生成国家(){
countryList=新的ArrayList();
国家名单。添加(“土耳其”);
国家名单。添加(“法国”);
countryList.添加(“塞内加尔”);
国家列表。添加(“美国”);
}
私有void generateFlavLanguages(){
favLanguageList=newarraylist();
添加(“Java”);
favLanguageList.add(“Ruby”);
添加(“C++”);
favLanguageList.add(“Visual Basic”);
}

}最好维护两个独立的
Bean,一个用于表示层(
@ManagedBean
),另一个(称为业务/实体Bean)用于业务层(服务层),也就是说,将两个表示层(托管)混在一起不是一个好主意和业务bean相比,您需要像您这样分离它们

J2EE层之间的请求流如下所示:

HTML/JSP->ManagedBean->Service->DAO->数据库

您需要将表示bean数据转换为操作类中的业务bean,然后将其传递给业务bean对象到服务层。服务层使用这个业务Bean与DAO类进行交互,DAO类可以持久化,也可以对数据库执行一些事务

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


你可以找到关于这个概念的更多细节。

@javaguy我没有,这是一个设计模式问题。把这个读给:这是其中的一个duplicate@Kukeltje这不是重复,这是完全不同的问题。其他人说的是两个独立的bean类,而我说的是一个控制器类和一个纯对象类。。。imo(不仅是我的,因为它现在实际上被BalusC标记为副本)感谢您的回答。您的答案似乎掩盖了一切,包括最复杂的JavaEE应用程序。如果我们考虑小企业,我可以直接从ManagedBean调用服务层吗?比如中小型网站?我已经用请求流更新了我的答案,它适用于所有企业(中小型/大型),谢谢你的回答