Primefaces 5 — темы, загрузка иконок в spring проекте
Рассмотрим как подключить различные темы для primefaces при работе с Spring Web Flow.
Подключить библиотеки достаточно легко, нужно лишь прописать в maven эти зависимости.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<dependencies> <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> |
Здесь мы подключили весь набор тем и обратите внимание, что так же нужно указать репозиторий. Иначе будет ругаться на версию и ничего не скачает.
Затем в web.xml дописываем какая тема будет загружаться автоматически
1 2 3 4 |
<context-param> <param-name>primefaces.THEME</param-name> <param-value>glass-x</param-value> </context-param> |
Казалось бы всё, но в Spring-centric integration проектах нужно добавлять дополнительные настройки, про которые особо ничего не написано.
Проблема: не загружаются иконки компонентов Primefaces 5. Если посмотреть в код xhtml страницы, то можно увидеть эти строчки
1 |
<head><link type="text/css" rel="stylesheet" href="/app/javax.faces.resource/theme.css?ln=primefaces-aristo" /><link type="text/css" rel="stylesheet" href="/app/javax.faces.resource/primefaces.css?ln=primefaces&v=5.2.RC1" /><script type="text/javascript" src="/app/javax.faces.resource/jquery/jquery.js?ln=primefaces&v=5.2.RC1"></script><script type="text/javascript" src="/app/javax.faces.resource/primefaces.js?ln=primefaces&v=5.2.RC1"></script><script type="text/javascript" src="/app/javax.faces.resource/jquery/jquery-plugins.js?ln=primefaces&v=5.2.RC1"></script><script type="text/javascript">if(window.PrimeFaces){}</script></head> |
И при нажатии на ссылку primefaces.css получим 404 и соответственно все кнопки и другие элементы будут без иконок и подсветки. Всё дело в том, что браузер не может достучаться до библиотеки с картинками из нужной темы по указанному URL. Лечиться это настройкой dispatcher-servlet.xml для корректной обработки URL вида
1 |
href="/app/javax.faces.resource/primefaces.css?ln=primefaces&v=5.2.RC1" |
Листинг dispatcher-servlet.xml и webflow-config.xml соответственно:
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 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" > <import resource="webflow-config.xml"/> <mvc:resources mapping="/resources/**" location="/resources/"/> <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"> <property name="flowRegistry" ref="flowRegistry"/> <property name="order" value="2"/> </bean> <bean name="resourceHandlerJSF" class="org.springframework.faces.webflow.JsfResourceRequestHandler"/> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="order" value="1"/> <property name="mappings"> <value> /javax.faces.resource/**=resourceHandlerJSF </value> </property> </bean> <bean class="org.springframework.faces.webflow.JsfFlowHandlerAdapter"> <property name="flowExecutor" ref="flowExecutor"/> </bean> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.faces.mvc.JsfView"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".xhtml"/> </bean> <bean id="msg" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="/WEB-INF/locales/messages"/> <property name="defaultEncoding" value="UTF-8"/> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <property name="defaultLocale" value="ru"/> </bean> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="lang"/> </bean> </mvc:interceptor> </mvc:interceptors> </beans> |
webflow-config.xml
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 |
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/webflow-config" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:faces="http://www.springframework.org/schema/faces" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces.xsd http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config.xsd "> <flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" base-path="/WEB-INF/flows"> <flow-location-pattern value="*.xml" /> </flow-registry> <faces:flow-builder-services id="flowBuilderServices" development="true" /> <!-- A listener to create and release a FacesContext --> <beans:bean id="facesContextListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener"/> <flow-executor id="flowExecutor"> <flow-execution-listeners> <listener ref="facesContextListener"/> </flow-execution-listeners> </flow-executor> </beans:beans> |
Полный листинг web.xml
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 |
<?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"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/config/spring/applicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/config/spring/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> <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 --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <context-param> <param-name>primefaces.THEME</param-name> <param-value>glass-x</param-value> </context-param> </web-app> |
Ещё одно важное замечание, которое может сэкономить вам время и нервы — браузер кеширует информацию и возможно у вас уже загрузились картинки, но страница продолжит показывать компоненты primefaces без иконок. Либо очистите кэш, либо заходите, к примеру, в хроме в режиме инкогнито.
2