Как использовать Font Awesome с webjars.org с JSF

Я пытаюсь использовать значки Font Awesome в своем приложении JSF. Я добился определенного успеха, следуя инструкциям по началу работы и добавив следующее в раздел <h:head> моего представления:

<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css"
      rel="stylesheet" />

Это дает мне красивый домашний значок, когда я использую класс icon-home:

введите здесь описание изображения

Однако я не хочу зависеть от загрузочного сервера для предоставления ресурсов Font Awesome, поэтому я пытаюсь связать их со своей войной и настроить свои представления для использования связанных ресурсов.

Я использую готовый файл JAR, созданный проект webjars. Мой pom имеет следующую зависимость:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>font-awesome</artifactId>
    <version>3.2.1</version>
</dependency>

Это помещает JAR в каталог WEB-INF/lib моей WAR. Соответствующие части структуры JAR:

META-INF
  - MANIFEST.MF
  + maven
  - resources
    - webjars
      - font-awesome
        - 3.2.1
          - css
            - font-awesome.css
            - *other css files*
          - font
            - *font files*

Я попытался включить значки в свой проект следующим образом:

<h:outputStylesheet library="webjars" 
                    name="font-awesome/3.2.1/css/font-awesome.css"  />

Однако это отображает ранее работающую домашнюю иконку как:

введите здесь описание изображения

И мой браузер (Chrome) показывает в консоли следующие ошибки (domain/port/context-root изменены для защиты невинных ;):

GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.woff?v=3.2.1 404 (Not Found) 
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.ttf?v=3.2.1 404 (Not Found) 
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.svg 404 (Not Found)

Таким образом, похоже, что хотя файл css разрешен правильно, файлы, содержащие шрифты, на которые ссылается файл css, не могут быть найдены. Я проверил эти ссылки в файле css, и они:

src: url('../font/fontawesome-webfont.eot?v=3.2.1');
src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');

Эти пути относятся к ресурсу css, поэтому я подумал, что у JSF не должно возникнуть проблем с его поиском. Теперь я не уверен, что делать.

Любые указатели были бы замечательными! Ваше здоровье.


person Ryan Bennetts    schedule 19.09.2013    source источник


Ответы (5)


В этих URL-адресах отсутствует сопоставление JSF и имя библиотеки. Если вы сопоставили свой FacesServlet с *.xhtml, то эти URL-адреса на самом деле должны были быть:

GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.woff.xhtml?ln=webjars&v=3.2.1
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.ttf.xhtml?ln=webjars&v=3.2.1
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.svg.xhtml?ln=webjars

По сути, вы должны использовать #{resource} в файле CSS для печати правильного URL-адреса ресурса JSF:

src: url("#{resource['webjars:font-awesome/3.2.1/font/fontawesome-webfont.eot']}&v=3.2.1");
src: url("#{resource['webjars:font-awesome/3.2.1/font/fontawesome-webfont.eot']}&#iefix&v=3.2.1");

Однако, поскольку исходный код фактически находится вне вашего контроля (вы не можете его редактировать), нет другого способа самостоятельно управлять обработкой ресурсов. Служебная библиотека JSF OmniFaces предоставляет UnmappedResourceHandler из коробки для точной цели. С помощью следующих шагов ваша проблема должна быть решена:

  1. Установите OmniFaces, он также доступен в Maven.

    <dependency>
        <groupId>org.omnifaces</groupId>
        <artifactId>omnifaces</artifactId>
        <version><!-- Check omnifaces.org for current version. --></version>
    </dependency>
    
  2. Зарегистрируйте UnmappedResourceHandler в faces-config.xml следующим образом:

    <application>
        <resource-handler>org.omnifaces.resourcehandler.UnmappedResourceHandler</resource-handler>
    </application>
    
  3. Добавьте сопоставление /javax.faces.resource/* с FacesServlet, предполагая, что имя сервлета facesServlet и у вас уже есть сопоставление с *.xhtml:

    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>/javax.faces.resource/*</url-pattern>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    
  4. Переместите имя библиотеки <h:outputStylesheet> в имя ресурса.

    <h:outputStylesheet name="webjars/font-awesome/3.2.1/css/font-awesome.css" />
    
  5. Выгода.

person BalusC    schedule 19.09.2013
comment
Не уверен, что уместно разместить это здесь, но это решение работает нормально, но в конечном итоге ломает ‹ace:dataExporter/› (что, как я полагаю, также сломает ‹p:dataExporter/›. Я предполагаю, что они полагаются на несопоставленные ресурсы для экспорта файлов для скачивания?В журналах появляются такие сообщения: Предупреждение: JSF1091: Не удалось найти тип mime для файла s01a3dc15-c480-4769-a71a-bc08f191416f. - person wsaxton; 20.02.2015
comment
@wsaxton: Какая версия OmniFaces? Начиная с версии 1.8 существует хак для распознавания динамических ресурсов PF, чтобы он мог соответствующим образом делегировать. - person BalusC; 20.02.2015
comment
Я использую 1.8. Есть ли другой способ сделать это тогда? (Кстати, я задал этот вопрос в другом посте, если вы хотите ответить там: stackoverflow.com/questions/28637732/) - person wsaxton; 22.02.2015
comment
@balusc: ответ можно упростить, см. мой ответ ниже. Может быть, вы можете отредактировать этот - person Kukeltje; 22.02.2015
comment
Если вам интересно, почему это не работает с версией шрифта awesome 5.8.1, я вам скажу: путь внутри банки теперь другой. Вы должны использовать webjars/font-awesome/5.8.1/css/fontawesome.css в качестве пути. @BalusC - вы ответили почти на все вопросы, которые я задаю себе о JSF :) Большое спасибо. - person Gábor Lipták; 25.04.2019
comment
Хм. Собственно у меня проблема с версией 5.8.1. Если я попытаюсь включить webjars/font-awesome/5.8.1/css/all.min.css, шрифты не будут найдены. Так, например, я получаю эту ошибку: GET xxxx/yyy/webfonts/fa-solid-900 .woff net::ERR_ABORTED 404. @BalusC, у вас есть идеи, как это исправить, не меняя css внутри jar? - person Gábor Lipták; 25.04.2019
comment
@BalusC Я понял. Мне нужно включить webjars/font-awesome/5.8.1/css/all-jsf.css, тогда все заработает. Круто, что отличный разработчик шрифтов думает о людях JSF :) - person Gábor Lipták; 25.04.2019

Ответ выше как бы устарел. Начиная с некоторых выпусков, версия font-awesome для webjar включает в себя конкретную jsf-версию css, поэтому настраивать нечего. Добавьте банку в свой проект либо через maven

<dependency>
   <groupId>org.webjars</groupId>
   <artifactId>font-awesome</artifactId>
   <version>4.6.3</version>
</dependency>

или напрямую, и это просто работает. Просто убедитесь, что вы включили правильный css

<h:outputStylesheet library="webjars" name="font-awesome/4.6.3/css/font-awesome-jsf.css" />

Обратите внимание на -jsf в имени!!! Таким образом, вы всегда можете иметь последнюю версию в своем приложении и не зависеть от PF, выпускающего что-то новое.

person Kukeltje    schedule 22.02.2015
comment
Были некоторые изменения в версии 5.xx удивительных шрифтов, и у меня работает ‹h:outputStylesheet library=webjars name=font-awesome/5.9.0/css/all-jsf.css /›. - person JuliuszJ; 31.07.2019

В дополнение к ответу BalusC рекомендуется добавить следующие mime-mapping к web.xml

<!-- web fonts -->
<mime-mapping>
    <extension>eot</extension>
    <mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>otf</extension>
    <mime-type>font/opentype</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>ttf</extension>
    <mime-type>application/x-font-ttf</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>woff</extension>
    <mime-type>application/x-font-woff</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>woff2</extension>
    <mime-type>application/x-font-woff2</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>ico</extension>
    <mime-type>image/x-icon</mime-type>
</mime-mapping>
person Hatem Alimam    schedule 19.06.2014

В дополнение к ответам BalusC и Hatem Alimam это также может быть полезно, если добавить:

<context-param>
   <param-name>primefaces.FONT_AWESOME</param-name>
   <param-value>true</param-value>
</context-param>

По этой ссылке

person Danny P    schedule 12.05.2015
comment
да, Primefaces теперь поддерживает fontawesome из коробки, начиная с версии 5.2. Это подход, который я сейчас использую. - person Ryan Bennetts; 14.05.2015
comment
Но при таком подходе вы всегда будете за самыми последними версиями с потрясающими шрифтами. Добавление вашего собственного и использование его в моем ответе гарантирует самую последнюю - person Kukeltje; 25.02.2016

Для Primefaces 6.2 у меня это тоже сработало.

    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>font-awesome</artifactId>
        <version>5.5.0</version>
    </dependency>

и в xhtml-файле:

<h:outputScript library="webjars" name="font-awesome/5.5.0/js/all.js"/>

имейте в виду, что вам нужно изменить использование с 4 на 5, например, с fa fa-plus на fas fa-plus, в зависимости от веб-страницы - https://fontawesome.com/icons/plus?style=solid

person Betlista    schedule 26.11.2018
comment
Или используйте вариант css: <h:outputStylesheet library="webjars" name="font-awesome/5.5.0/css/all-jsf.css" /> - person Kai; 05.04.2019