我正尝试在JSF中整合Font Awesome。
<h:outputStylesheet library="font-awesome" name="css/font-awesome.min.css" />
但是浏览器无法找到字体文件,它们显示为空白方块:
![enter image description here](https://istack.dev59.com/kRG5p.webp)
![enter image description here](https://istack.dev59.com/xFVVu.webp)
我正尝试在JSF中整合Font Awesome。
<h:outputStylesheet library="font-awesome" name="css/font-awesome.min.css" />
但是浏览器无法找到字体文件,它们显示为空白方块:
Font Awesome CSS文件默认通过相对路径../
引用那些字体文件,如下所示:
@font-face {
font-family: 'FontAwesome';
src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),
url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),
url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),
url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),
url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');
font-weight: normal;
font-style: normal;
}
这将会失败,如果CSS文件本身在不同的路径上请求。如果你在<h:outputStylesheet>
指定了library
属性,JSF就会这样做。此外,JSF将使用特殊的/javax.faces.resource/*
前缀模式来处理这些资源,以便专门调用JSF资源处理程序,从而实现自定义自由度。详细信息可以在What is the JSF resource library for and how should it be used?中找到。
提供以下的文件夹结构:
WebContent
|-- resources
| `-- font-awesome
| |-- css
| | |-- font-awesome.css
| | `-- font-awesome.min.css
| `-- fonts
| |-- fontawesome-webfont.eot
| |-- fontawesome-webfont.svg
| |-- fontawesome-webfont.ttf
| |-- fontawesome-webfont.woff
| `-- fontawesome-webfont.woff2
:
并且 Font Awesome CSS 被包含如下:
<h:outputStylesheet library="font-awesome" name="css/font-awesome.min.css" />
接下来你需要按照以下方式编辑CSS文件,使用EL中的#{resource}
映射来引用适当的库和资源名称中/resources
文件夹中的字体文件(由于库名称已成为查询字符串参数,因此你还需要将?
替换为&
,如果不使用库名称则不必这样做)。
@font-face {
font-family: 'FontAwesome';
src: url("#{resource['font-awesome:fonts/fontawesome-webfont.eot']}&v=4.3.0");
src: url("#{resource['font-awesome:fonts/fontawesome-webfont.eot']}&#iefix&v=4.3.0") format('embedded-opentype'),
url("#{resource['font-awesome:fonts/fontawesome-webfont.woff2']}&v=4.3.0") format('woff2'),
url("#{resource['font-awesome:fonts/fontawesome-webfont.woff']}&v=4.3.0") format('woff'),
url("#{resource['font-awesome:fonts/fontawesome-webfont.ttf']}&v=4.3.0") format('truetype'),
url("#{resource['font-awesome:fonts/fontawesome-webfont.svg']}&v=4.3.0#fontawesomeregular") format('svg');
font-weight: normal;
font-style: normal;
}
编辑CSS文件后请务必重新启动服务器。在JSF资源处理程序第一次读取CSS文件时,仅检测某个CSS文件中EL表达式的出现一次,并在整个应用程序中记住。
如果您在服务器日志中看到像下面这样的针对那些字体文件的JSF1091警告:
警告:JSF1091:找不到文件[some font file]的MIME类型。要解决此问题,请将mime-type映射添加到应用程序的web.xml中。
然后您需要通过向web.xml
添加以下mime映射来采取相应措施:
<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>svg</extension>
<mime-type>image/svg+xml</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>
如果您使用JSF实用库OmniFaces,而不是通过#{resource}
映射编辑CSS文件的替代方法是安装OmniFacesUnmappedResourceHandler
并根据其文档重新配置FacesServlet
映射。您只需要确保不再通过library
引用字体CSS文件即可:<h:outputStylesheet name="font-awesome/css/font-awesome.min.css" />
v=4.7.0
。 - Faizan Mubasher此外,primefaces>5.11
已经默认集成了Font Awesome
只需要将以下context-param
添加到您的web.xml
中:
<context-param>
<param-name>primefaces.FONT_AWESOME</param-name>
<param-value>true</param-value>
</context-param>
Font Awesome
。<p:submenu label="Time" icon="fa fa-clock-o">
参考文献:
@font-face {
font-family: 'FontAwesome';
src: url('../resources/font-awesome-4.5.0/fonts/fontawesome-webfont.eot?v=4.5.0');
src: url('../resources/font-awesome-4.5.0/fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),
url('../resources/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),
url('../resources/font-awesome-4.5.0/fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),
url('../resources/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),
url('../resources/font-awesome-4.5.0/fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular')
format('svg');
font-weight: normal;
font-style: normal;
}
和 BalusC 的答案一样,只是有些改动。注意:我正在集成 Metronic 主题。
*/@font-face{font-family:'FontAwesome';
src:url("#{resource['global:plugins/font-awesome/fonts/fontawesome-webfont.eot']}&v=4.4.0");
src:url("#{resource['global:plugins/font-awesome/fonts/fontawesome-webfont.eot']}&#iefix&v=4.4.0") format('embedded-opentype'),
url("#{resource['global:plugins/font-awesome/fonts/fontawesome-webfont.woff2']}&v=4.4.0") format('woff2'),
url("#{resource['global:plugins/font-awesome/fonts/fontawesome-webfont.woff']}&v=4.4.0") format('woff'),
url("#{resource['global:plugins/font-awesome/fonts/fontawesome-webfont.ttf']}&v=4.4.0") format('truetype'),
url("#{resource['global:plugins/font-awesome/fonts/fontawesome-webfont.svg']}&v=4.4.0#fontawesomeregular") format('svg');font-weight:normal;font-style:normal}
对于 simple-line-icons.min.css
同样适用。
正如 BalusC 所说,通过添加他的答案中的行来更改 web.xml
。
http://localhost:8080/Students_manager/javax.faces.resource/fontawesome-webfont.svg.xhtml?ln=font-awesome/fonts&v=4.2.0#fontawesomeregular
对我来说它运行良好,但我仍在寻找另一种解决方案,因为我应该有一个动态路径而不是静态的,比如"http://localhost:8080/Students_manager/..."