JavaServer Faces (JSF) с Spring

1. Общ преглед

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

Тази статия предполага, че читателят е разбрал предварително JSF и Spring отделно. Статията се основава на внедряването на JSF от Mojarra.

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. По-долу е реализацията 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. лица-config.xml

Сега конфигурираме SpringBeanFacesELResolver във файла face-config.xml :

org.springframework.web.jsf.el.SpringBeanFacesELResolver

Разделителят на EL е компонент, който може да се включи, поддържан от JSF рамката, което ни позволява да персонализираме поведението на JSF времето за изпълнение при оценяване на изразите на Expression Language (EL). Този EL преобразувател ще позволи на JSF по време на изпълнение достъп до Spring компоненти чрез EL изрази, определени в JSF.

4. Достъп до Spring Beans в JSF

На този етап нашето JSF уеб приложение е подготвено за достъп до нашия Spring bean или от JSF подкрепящ бин, или от JSF страница.

4.1. От резервен боб JSF 2.0

Пролетният боб вече може да бъде достъпен от 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 }

Имайте предвид, че getter и setter са задължителни при използване на @ManagedProperty.

Сега - за да утвърдим достъпността на Spring bean от управляван bean, ще добавим метода createNewUser () :

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

Същността на метода използва userDao Spring bean и достъп до неговата функционалност.

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 страница:

За да изобразите страницата, стартирайте сървъра и отворете:

//localhost:8080/jsf/index.jsf

Също така можем да използваме EL в JSF изгледа за достъп до Spring bean. За да го тествате е достатъчно да промените реда номер 7 от въведената по-рано JSF страница на:

Here, we call the createUser method directly on the Spring DAO, passing the bind value of the userName to the method from within the JSF page, circumventing the managed bean all together.

5. Conclusion

We examined a basic integration between the Spring and JSF contexts, where we’re able to access a Spring bean in a JSF bean and page.

It’s worth noting that while the JSF runtime provides the pluggable architecture that enables the Spring framework to provide integration components, the annotations from the Spring framework cannot be used in a JSF context and vice versa.

Това означава, че няма да можете да използвате пояснения като @Autowired или @Component и т.н. в JSF управляван боб или да използвате @ManagedBean анотация върху пролет, управляван от боб. Можете обаче да използвате пояснението @Inject както в управляван боб JSF 2.2+, така и в боб Spring (защото Spring поддържа JSR-330).

Изходният код, придружаващ тази статия, е достъпен на GitHub.