JSF管理的bean和设计模式
假设我有一个student.xhtml表单,其中radiolists&dropdownmenu是从它的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类 所以我的问题是,
@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调用服务层吗?比如中小型网站?我已经用请求流更新了我的答案,它适用于所有企业(中小型/大型),谢谢你的回答