JavaServer Faces (JSF) с помощью Spring

JavaServer Faces (JSF) с помощью Spring

1. обзор

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

В этой статье предполагается, что читатель имеет предварительное представление о JSF и Spring по отдельности. Статья основана наthe Mojarra implementation JSF.

2. Весной

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

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

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

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

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


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

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

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

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

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

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.. Теперь полная реализацияMainWebAppInitializer, следующим образом:

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 при запуске веб-приложения. Этот слушатель по умолчанию будет искать файл конфигурации пружины с именем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. Доступ к Spring Beans в JSF

На этом этапе наше веб-приложение JSF готово к доступу к нашему bean-компоненту 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. Now - чтобы подтвердить доступность компонента Spring из управляемого компонента, мы добавим методcreateNewUser():

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

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

4.2. Из компонента поддержки в JSF 2.2

Другой подход, действующий только в JSF2.2 и выше, заключается в использовании аннотации@Inject CDI. Это применимо к компонентам, управляемым 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, полностью обходя управляемый bean-компонент.

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

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

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

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

Исходный код, прилагаемый к этой статье, доступен по адресуGitHub.