Рубрики
Без рубрики

JavaServer Faces (JSF) с пружиной

Краткое введение в настройку JSF и Spring Framework. В нем показано, как получить доступ к Spring beans со страниц JSF и управляемых компонентов JSF.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы рассмотрим рецепт доступа к компонентам, определенным в Spring, из управляемого компонента JSF и страницы JSF для делегирования выполнения бизнес-логики компонентам Spring.

Эта статья предполагает, что читатель имеет предварительное представление как о JSF, так и о Spring отдельно. Статья основана на реализации Mojarra JSF.

2. Весной

Давайте весной определим следующий боб. Компонент UserManagementDAO добавляет имя пользователя в хранилище в памяти, и оно определяется следующим интерфейсом:

public interface UserManagementDAO {
    boolean createUser(String newUserData);
}

Реализация компонента настраивается с помощью следующей конфигурации Java:

public class SpringCoreConfig {
    @Bean
    public UserManagementDAO userManagementDAO() {
        return new UserManagementDAOImpl();
    }
}

Или используя следующую конфигурацию XML:


Мы определяем компонент в XML и регистрируем CommonAnnotationBeanPostProcessor , чтобы гарантировать, что @PostConstruct аннотация будет подобрана.

3. Конфигурация

В следующих разделах объясняются элементы конфигурации, позволяющие интегрировать контексты Spring и JSF.

3.1. Конфигурация Java Без web.xml

Реализуя WebApplicationInitializer , мы можем программно настроить ServletContext. Ниже приведена реализация on Startup() внутри класса Main WebAppInitializer :

public void onStartup(ServletContext sc) throws ServletException {
    AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
    root.register(SpringCoreConfig.class);
    sc.addListener(new ContextLoaderListener(root));
}

AnnotationConfigWebApplicationContext загружает контекст Spring’g и добавляет компоненты, зарегистрировав класс SpringCoreConfig .

Аналогично, в реализации Mojarra есть класс FacesInitializer , который настраивает FacesServlet. Для использования этой конфигурации достаточно расширить FacesInitializer. Полная реализация Главного веб-инициализатора, теперь выглядит следующим образом:

public class MainWebAppInitializer extends FacesInitializer implements WebApplicationInitializer {
    public void onStartup(ServletContext sc) throws ServletException {
        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(SpringCoreConfig.class);
        sc.addListener(new ContextLoaderListener(root));
    }
}

3.2. С web.xml

Мы начнем с настройки ContextLoaderListener в web.xml файл заявления:


    
        org.springframework.web.context.ContextLoaderListener
    

Этот прослушиватель отвечает за запуск контекста приложения Spring при запуске веб-приложения. Этот прослушиватель будет искать файл конфигурации spring с именем applicationContext.xml по умолчанию.

3.3. faces-config.xml

Теперь мы настраиваем SpringBeanFacesELResolver в face-config.xml файл:

org.springframework.web.jsf.el.SpringBeanFacesELResolver

Распознаватель EL-это подключаемый компонент, поддерживаемый платформой JSF, позволяющий нам настраивать поведение среды выполнения JSF при оценке выражений языка выражений (EL). Этот распознаватель EL позволит среде выполнения JSF получить доступ к компонентам Spring с помощью выражений EL, определенных в JSF.

4. Доступ к весенним бобам в JSF

На данный момент наше веб-приложение JSF настроено для доступа к нашему компоненту Spring либо из резервного компонента JSF, либо со страницы JSF.

4.1. Из бэк-бина JSF 2.0

Теперь к компоненту Spring можно получить доступ из компонента поддержки JSF. В зависимости от версии JSF, которую вы используете, существует два возможных метода. В JSF 2.0 вы используете аннотацию @ManagedProperty в управляемом компоненте JSF.

@ManagedBean(name = "registration")
@RequestScoped
public class RegistrationBean implements Serializable {
    @ManagedProperty(value = "#{userManagementDAO}")
    transient private IUserManagementDAO theUserDao;

    private String userName;
    // getters and setters
}

Обратите внимание, что геттер и сеттер являются обязательными при использовании свойства @ManagedProperty.
Теперь – чтобы подтвердить доступность компонента Spring из управляемого компонента, мы добавим метод createNewUser()
:

public void createNewUser() {
    FacesContext context = FacesContext.getCurrentInstance();
    boolean operationStatus = userDao.createUser(userName);
    context.isValidationFailed();
    if (operationStatus) {
        operationMessage = "User " + userName + " created";
    }
}

Суть метода заключается в использовании компонента UserDao Spring и доступе к его функциональности.

4.2. Из бэк-бина в JSF 2.2

Другой подход, допустимый только в JSF2.2 и выше, заключается в использовании аннотации CDI @Inject . Это применимо к управляемым компонентам JSF (с аннотацией @ManagedBean ) и управляемым компонентам CDI (с аннотацией @Named ).

Действительно, с аннотацией CDI это единственный допустимый метод введения компонента:

@Named( "registration")
@RequestScoped
public class RegistrationBean implements Serializable {
    @Inject
    UserManagementDAO theUserDao;
}

При таком подходе геттер и сеттер не нужны. Также обратите внимание, что выражение EL отсутствует.

4.3. С точки зрения JSF

Метод createNewUser() будет запущен со следующей страницы JSF:


    
        
        
        
        
        
    

Чтобы отобразить страницу, запустите сервер и перейдите к:

http://localhost:8080/jsf/index.jsf

Мы также можем использовать EL в представлении JSF для доступа к компоненту Spring. Чтобы проверить это, достаточно изменить номер строки 7 с ранее введенной страницы JSF на:

Здесь мы вызываем метод CreateUser непосредственно в Spring DAO, передавая значение привязки userName методу из страницы JSF, обходя все вместе управляемый компонент.

5. Заключение

Мы рассмотрели базовую интеграцию между контекстами Spring и JSF, где мы можем получить доступ к компоненту Spring в компоненте и странице JSF.

Стоит отметить, что, хотя среда выполнения JSF предоставляет подключаемую архитектуру, которая позволяет Spring framework предоставлять компоненты интеграции, аннотации из Spring framework нельзя использовать в контексте JSF и наоборот.

Это означает, что вы не сможете использовать аннотации, такие как @Autowired или @Component и т. Д. в управляемом компоненте JSF или используйте аннотацию @ManagedBean в управляемом компоненте Spring. Однако вы можете использовать аннотацию @Inject как в управляемом компоненте JSF 2.2+, так и в компоненте Spring (поскольку Spring поддерживает JSR-330).

Исходный код, сопровождающий эту статью, доступен по адресу GitHub .