JSF имеет простой
контейнер Inosion-of-Control (IoC), называемый JSF
Managed Bean Facility (MBF). Хотя он имеет подробный синтаксис XML и не так надежен, как
Spring BeanFactory ,
PicoContainer или
JBoss Microcontainer , MBF имеет основы контейнера IoC и предлагает такие функции, как
внедрение зависимостей .
Когда POJO управляется MBF JSF, его обычно называют управляемым компонентом. Но если вы собираетесь создать поддерживаемый веб-приложение / портлет JSF, необходимо различать различные виды управляемых компонентов. Эта практика также сохранит четкое разделение проблем, которые JSF обеспечивает путем реализации шаблона проектирования Model-View-Controller (MVC):
Тип управляемых бобов | кличка | Типичная сфера |
---|---|---|
Модель Managed-Bean | Модель боб | сессия |
Описание: этот тип управляемого компонента участвует в «модели» модели проектирования MVC. Когда вы видите слово «модель» — подумайте ДАННЫЕ. Компонент JSF-модели должен быть POJO, который следует шаблону проектирования JavaBean с инкапсулирующими свойствами getter / setters. Наиболее распространенный вариант использования модельного компонента — это объект базы данных или просто представление набора строк из набора результатов запроса базы данных. |
||
Бэк-бин | поддержка боб | запрос |
Описание. Этот тип управляемого компонента участвует в «представлении» модели проектирования MVC. Назначение базового компонента — поддерживать логику пользовательского интерфейса и имеет отношение 1 :: 1 с представлением JSF или формой JSF в составе Facelet. Хотя обычно он имеет свойства стиля JavaBean со связанными получателями / установщиками, это свойства представления, а не модели данных базового приложения. У компонентов поддержки JSF также могут быть методы JSF actionListener и valueChangeListener. |
||
Контроллер Управляемый Бин | Контроллер-бобы | запрос |
Описание: этот тип управляемого компонента участвует в «контроллере» модели проектирования MVC. Цель bean-компонента контроллера — выполнить некоторую бизнес-логику и вернуть результат навигации в обработчик навигации JSF. Контроллер JSF обычно имеет методы действия JSF (а не методы actionListener). |
||
Поддержка Managed-Bean | Поддержка боб | сеанс / приложение |
Описание: этот тип bean-компонента «поддерживает» одно или несколько представлений в «представлении» модели проектирования MVC. Типичным вариантом использования является предоставление ArrayList <SelectItem> для JSF h: selectOneMenu раскрывающиеся списки, которые появляются в более чем одном представлении JSF. Если данные в раскрывающихся списках относятся к конкретному пользователю, то компонент будет оставаться в области сеанса. Однако если данные применяются ко всем пользователям (например, раскрывающимся спискам провинций), то компонент будет оставаться в области приложения, чтобы его можно было кэшировать для всех пользователей. |
||
Утилита Managed-Bean | полезности фасоли | заявление |
Описание: этот тип компонента предоставляет некоторый тип «служебной» функции для одного или нескольких представлений JSF. Хорошим примером этого может быть bean-компонент FileUpload, который можно повторно использовать в нескольких веб-приложениях. |
Теперь … Одним из главных преимуществ в проведении таких четких различий является слабая связь . Что ты спрашиваешь? Что ж, давайте сначала посмотрим на пример тесной связи, где проблемы MVC могут быть разбиты / перепутаны в один управляемый компонент:
public class ModelAndBackingAndControllerBean {
private String fullName; // model-bean property
private boolean privacyRendered; // backing-bean property
// model-bean getter
public String getFullName() {
return fullName;
}
// model-bean setter
public void setFullName(String fullName) {
this.fullName = fullName;
}
// backing-bean getter
public boolean isPrivacyRendered() {
return privacyRendered;
}
// backing-bean setter
public void setPrivacyRendered(boolean privacyRendered) {
this.privacyRendered = privacyRendered;
}
// backing-bean actionListener for UI support logic
public void togglePrivacySection(ActionEvent actionEvent) {
privacyRendered = !privacyRendered;
}
// controller-bean business logic
public String submit() {
System.out.println("fullName=" + fullName);
return "success";
}
}
Проблема здесь заключается в том, что компонент должен оставаться в области видимости из-за свойства bean-компонента. Кроме того, что если мы захотим провести какое-то модульное тестирование с данными фиктивной модели? Не могу этого сделать. Таким образом, чтобы исправить эти проблемы и обеспечить слабую связь, у нас было бы три отдельных класса Java:
public class ModelBean {
private String fullName;
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getFullName() {
return fullName;
}
}
public class BackingBean {
private boolean privacyRendered;
public void setPrivacyRendered(boolean privacyRendered) {
this.privacyRendered = privacyRendered;
}
public boolean isPrivacyRendered() {
return privacyRendered;
}
public void togglePrivacySection(ActionEvent actionEvent) {
privacyRendered = !privacyRendered;
}
}
public class ControllerBean {
private ModelBean modelBean;
public ModelBean getModelBean() {
return modelBean;
}
public void setModelBean(ModelBean modelBean) {
// Dependency injected from the JSF managed-bean facility
this.modelBean = modelBean;
}
public String submit() {
System.out.println("fullName=" + getModelBean().getFullName());
return "success";
}
}
Теперь, когда бобы находятся в разных классах, все они могут храниться в соответствующих областях. Bean-компонент модели может храниться в области сеанса, а bean-компонент и контроллер-bean может храниться в области запроса, что позволяет экономить ресурсы памяти на сервере.
Наконец, мы можем использовать функции внедрения зависимостей JSF MBF для внедрения bean-компонента модели в bean-компонент контроллера. Это можно увидеть в следующем примере WEB-INF /face-config.xml, где используется привязка языка выражений (EL) # {modelBean}:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>modelBean</managed-bean-name>
<managed-bean-class>myproject.ModelBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>backingBean</managed-bean-name>
<managed-bean-class>myproject.BackingBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>controllerBean</managed-bean-name>
<managed-bean-class>myproject.ControllerBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>modelBean</property-name>
<value>#{modelBean}</value>
</managed-property>
</managed-bean>
</faces-config>