Spring Web Flow — пример приложения Hello World
Spring Web Flow — Hello World example. Быстрый старт.
Рассмотрим базовые настройки и создание простого потока для демонстрации примера создания приложения с Spring Web Flow + JSF + PrimeFaces.
Используемые технологии:
- Spring WEB Flow 2.4.1
- Spring Framework 4.1.5
- JSF 2.2
- PrimeFaces 5.2.RC1
- Maven 3.2.5
- IntelliJ IDEA 14.1.4
- JDK 1.8
1. Структура проекта
Как видно из скриншота, здесь базовые xml от спринг и веб-приложения, а так же один поток и два представления.
2. Настройки pom.xml Maven
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ru.javastudy</groupId> <artifactId>swftutorial</artifactId> <version>1.0</version> <properties> <webflow-version>2.4.1.RELEASE</webflow-version> <spring-framework-version>4.1.5.RELEASE</spring-framework-version> <springsecurity-version>4.0.0.RELEASE</springsecurity-version> <slf4j-version>1.7.12</slf4j-version> <mojarra-version>2.2.10</mojarra-version> <primefaces-version>5.2.RC1</primefaces-version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring-framework-version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--JSF (include "jsf-api" and "jsf-impl")--> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.2.10</version> </dependency> <dependency> <groupId>org.springframework.webflow</groupId> <artifactId>spring-faces</artifactId> <version>${webflow-version}</version> </dependency> <dependency> <groupId>org.springframework.webflow</groupId> <artifactId>spring-js</artifactId> <version>${webflow-version}</version> </dependency> <dependency> <groupId>org.springframework.webflow</groupId> <artifactId>spring-webflow</artifactId> <version>${webflow-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-framework-version}</version> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>${primefaces-version}</version> </dependency> <dependency> <groupId>org.primefaces.themes</groupId> <artifactId>all-themes</artifactId> <version>1.0.10</version> </dependency> </dependencies> <repositories> <repository> <id>prime-repo</id> <name>PrimeFaces Maven Repository</name> <url>http://repository.primefaces.org</url> <layout>default</layout> </repository> </repositories> </project> |
Описание зависимостей maven можно посмотреть в отдельной статье.
3. Подключение поддержки фреймворков
Для того чтобы подключить фреймворк Spring, JSF и PrimeFaces с помощью IntelliJ IDEA, необходимо нажать правой кнопкой на корневую папку с названием приложения и выбрать Add Framework Support.. Далее отмечаем Spring и JSF. Если зависимости, указанные в maven, были подкачены успешно, то идея предложит использовать библиотеки фреймворков подгруженных maven.
4. Настройка web.xml — дескриптор веб-развертывания
Конфигурация web.xml вместе с поддержкой JSF приведена ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/applicationContext.xml</param-value> </context-param> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- JSF 2 --> <!-- Use JSF view templates saved as *.xhtml, for use with Facelets --> <!-- Использовать шаблоны представлений JSF, сохраненные как *.xhtml, вместе с Facelets --> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <!-- Enables special Facelets debug output during development --> <!-- Использовать шаблоны представлений JSF, сохраненные как *.xhtml, вместе с Facelets --> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <!-- Causes Facelets to refresh templates during development --> <!-- Заставить Facelets обновлять шаблоны во время разработки --> <context-param> <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name> <param-value>1</param-value> </context-param> <!-- Just here so the JSF implementation can initialize, *not* used at runtime --> <!-- Нужен для того, чтобы реализация JSF могла быть инициализирована; *не* используется во время выполнения --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Just here so the JSF implementation can initialize --> <!-- Нужен для того, чтобы реализация JSF могла быть инициализирована --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> |
Более подробные объяснения конфигурации web.xml для Spring Web Flow и JSF приведены в отдельной статье.
5. Настройка webflow.xml — файл конфигурации Spring Web Flow
Как настроить webflow.xml (иногда webflow-config.xml) Spring Web Flow можно посмотреть в следующем листинге:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/webflow-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:faces="http://www.springframework.org/schema/faces" xsi:schemaLocation="http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.4.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.4.xsd"> <!-- Executes flows: the central entry point into the Spring Web Flow system --> <flow-executor id="flowExecutor"> <flow-execution-listeners> <listener ref="facesContextListener"/> </flow-execution-listeners> </flow-executor> <!-- The registry of executable flow definitions --> <flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" base-path="/WEB-INF/flows"> <flow-location-pattern value="/**/flow.xml" /> </flow-registry> <!-- Configures the Spring Web Flow JSF integration --> <faces:flow-builder-services id="flowBuilderServices"/> <!-- A listener to create and release a FacesContext --> <beans:bean id="facesContextListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener"/> </beans:beans> |
6. Настройка dispatcher-servlet.xml — файл конфигурации сервлета диспетчера для Spring MVC
Технология Spring Web Flow тесно интегрирована с Spring MVC, поэтому конфигурация сервлета диспетчера dispatcher-servlet.xml (иногда servlet-context.xml) настраивается для Spring MVC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:faces="http://www.springframework.org/schema/faces" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces.xsd"> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <beans:import resource="webflow.xml" /> <!-- Enables the Spring MVC @Controller programming model --> <annotation-driven /> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources location="/" mapping="/resources/**"/> <!-- Enable processing of JSF 2 resource requests. For example: /ch18/app/javax.faces.resource/jsf.js?ln=javax.faces --> <faces:resources/> <!-- Maps request paths to flows in the flowRegistry --> <beans:bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> <beans:property name="flowRegistry" ref="flowRegistry" /> </beans:bean> <!-- Resolves views selected for rendering by @Controllers to .xhtml resources in the /WEB-INF/ directory --> <beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <beans:property name="viewClass" value="org.springframework.faces.mvc.JsfView" /> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".xhtml" /> </beans:bean> <!-- Dispatches requests mapped to flows to FlowHandler implementations --> <beans:bean class="org.springframework.faces.webflow.JsfFlowHandlerAdapter"> <beans:property name="flowExecutor" ref="flowExecutor" /> </beans:bean> <!-- Message Source --> <beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource" p:basenames="WEB-INF/i18n/messages,WEB-INF/i18n/application" p:fallbackToSystemLocale="false"/> </beans:beans> |
Более подробное описание настройки сервлета диспетчера Spring MVC описано в отдельной статье.
7. Создание простейшего потока и запуск приложения Spring Web Flow Hello World
После базовых настроек можно переходить к созданию потока и запуску приложения. Отмечу, что здесь специально приведен очень легкий пример, чтобы не сбивать начинающего пользователя обилием переходов, настроек, подключением классов Java и т.п.. Т.е. просто поток и пару переходов. В следующих статьях приложение будет расширено и будут пошагово демонстрироваться возможности Spring Web Flow.
Примечание
- Для того чтобы было понятно о чем идет речь, рекомендую прочитать руководство по Spring Web Flow на русском языке.
Для начала создаем файл описания потока flow.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="UTF-8"?> <flow xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.4.xsd" start-state="start"> <view-state id="start" view="start.xhtml"> <transition on="next" to="contactListView"/> </view-state> <view-state id="contactListView" view="contactListView.xhtml"> <transition on="end" to="end"/> <transition on="back" to="start"/> </view-state> <end-state id="end"/> </flow> |
На что здесь обратить внимание?
start-state=»start» — говорит о том, что при входе в поток будет происходить поиск по id=»start». А дальше выполнено то, что указано под этим айдишником.
1 2 3 |
<view-state id="start" view="start.xhtml"> <transition on="next" to="contactListView"/> </view-state> |
Здесь описано состояние потока, в котором отображается представление JSF start.xhtml, а так же описан переход к состоянию contactListView при событии next.
Далее два простейших представления:
start.xhtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core"> <f:view> <h:head> <!--без тега не подгрузятся темы PrimeFaces!--> </h:head> <h:form> <p:outputLabel value="Hello, world"/> <p:commandButton value="next" action="next" title="transition on=next"/> </h:form> </f:view> </html> |
contactListView.xhtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core"> <f:view> <h:form> <h:outputLabel value="Second Page" /> <p:commandButton value="end" title="to end-state" action="end"/> <p:commandButton value="back" title="transition on=back" action="back"/> </h:form> </f:view> </html> |
Здесь всё просто — при нажатии кнопки с названием next, будет выполнен action=»next». Это будет перехвачено состоянием потока и произойдет переход, указанный в transition on=»next» к второму представлению.
Замечание
- В начале можно было увидеть, что заданы зависимости для тем PrimeFaces, но здесь они еще не включены. Обратите внимание, что без тега <h:head> </h:head> ресурсы (пакет resources) вообще не будут грузиться! Для того, чтобы подключить тему PrimeFaces, нужно в web.xml добавить
1234<context-param><param-name>primefaces.THEME</param-name><param-value>bluesky</param-value></context-param>
На второй странице добавлена кнопка, завершающая поток при переходе в состоянии end-state. Обратите внимание как меняется URL в браузере при нажатии кнопок next, back, end.
После нажатия на кнопку next переходим к второму представлению
Исходные коды
6
One thought on “Spring Web Flow — пример приложения Hello World”
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Здравствуйте, я создал Spring-компонент и контроллер. Проблема заключается в том, что в представлении, которое возвращает контроллер, не доступны spring-компоненты. Подскажите, пожалуйста, в чем может быть дело?