2016-10-31 3 views
1

Предположим, у меня есть форму студента.xhtml, у которой есть радиолисты & dropdownmenu, населенный от @ManagedBean Student(). Как вы знаете, для заполнения формы из managedbean мне нужно иметь List<Object> полей в классе Student. Но я также хочу, чтобы мой класс Студента был чистым, он должен иметь поля, относящиеся только к себе, не возможные значения, которые он может получить (я имею в виду список <>). Поэтому я хочу отделить мой класс Student от @ManagedBean. Таким образом, у меня будет два класса в конце, один из которых - чистый класс Student и класс StudentBean, который контролирует представление.JSF-управляемые бобы и образцы дизайна

Итак, мой вопрос в том, что хорошая практика имеет два класса, как показано ниже, или я должен идти с одним классом? Метод двух классов дублирует поля, поэтому я не знаю, влияет ли это на производительность в плохом состоянии. Что вы предлагаете?

Не требуется BeanClassWithStudent Pattern;

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

}

Мои хотел раздельные классы; 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"); 
} 

}

+0

@ javaguy У меня его нет, это вопрос шаблона дизайна. –

+1

читайте это по адресу: http://stackoverflow.com/questions/7223055/making-distinctions-between-different-kinds-of-jsf-managed-beans/7223910#7223910 и http://stackoverflow.com/questions/13011392/jsf-service-layer и http://stackoverflow.com/questions/30639785/jsf-controller-service-and-dao, из которых это дубликат. – Kukeltje

+0

@Kukeltje Это не дубликат, это совершенно другой вопрос.Другие говорят о 2 отдельных классах bean, в то время как я говорю один класс контроллера и один класс чистого объекта. –

ответ

1

Это всегда лучше, чтобы поддерживать две отдельные Beans один для презентационного слоя (@ManagedBean), а другой (так называемый, как Бизнес/Entiry Bean) для (слой услуг) Бизнес-уровня т. е. не рекомендуется смешивать как компоненты уровня представления (управляемые) с бизнес-компонентами, а вам нужно отделять их так же, как и вы.

Поток запроса между J2EE уровней происходит следующим образом:

HTML/JSP -> ManagedBean -> Сервис -> DAO -> База данных

Вы должны преобразовать данные презентации боба для бизнес-компонента в классах Action, а затем передать это бизнес-объекту Bean Object на уровень Services. Сервисный уровень использует этот бизнес-компонент для взаимодействия с классами DAO, которые сохраняют или выполняют некоторые транзакции с базой данных.

Эта концепция применима не только для JSF, но и для всех других веб-фреймворков J2EE (например, Struts, Spring MVC и т. Д.).

Подробнее об этом here.

+0

спасибо за ответ. Ваш ответ, казалось, скрыть все до сложных приложений java ee. Если мы подумаем о малых предприятиях, могу ли я напрямую вызвать уровень сервиса из ManagedBean? Такие, как умеренно-небольшие веб-сайты? –

+0

Я обновил свой ответ с потоком запросов, он применим для всех предприятий (малый/средний/большой) – developer

+0

спасибо за ответ –

Смежные вопросы