首先,我想说我已经在another forum发布了这个问题,但是直到现在我还没有得到任何答案,这对我来说是一个重要的问题,我我也在这里问。
HTML <script>
标记具有charset
属性,但我无法使用<h:outputScript>
标记指定此属性。我尝试使用preRenderComponent
系统事件并手动输入属性但它没有效果;该属性未呈现。有没有办法指定charset
属性,甚至是以编程方式?
答案 0 :(得分:2)
一直使用UTF-8。 Facelets默认为UTF-8。您应该注意配置编辑器/ IDE以将所有基于文本的资源保存为UTF-8。在Eclipse中,您需要转到 Window»Preferences 并输入过滤器文本编码。在已过滤的首选项(工作区,JSP文件等)的全部中,您可以从下拉列表中选择所需的编码。
您可能希望对现有文件进行少量编辑(添加/删除空间或其他内容)以强制Eclipse再次将其另存为UTF-8。
答案 1 :(得分:0)
如果您的javascript文件位于您的webapp引用的另一个JAR中,并且您无法将其转换为其他编码,则应使用过滤器为该特定文件设置内容类型。我注意到JSF中没有常见的设置。
另外,我发现在JSF中覆盖javax.faces.resource.Script
的默认渲染器是可能的,但我认为这不是一个好策略,所以如果有人找到更好的解决方案,请张贴!
public class SetContentEncodingFilter implements Filter {
private final Map<String, String> pathEncodingMap = new HashMap<>();
@Override
public void destroy() {
pathEncodingMap.clear();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI != null && pathEncodingMap.containsKey(requestURI)) {
String encoding = pathEncodingMap.get(requestURI);
response.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
Enumeration<String> parameterNames = config.getInitParameterNames();
while (parameterNames.hasMoreElements()) {
String path = parameterNames.nextElement();
String encoding = config.getInitParameter(path);
pathEncodingMap.put(config.getServletContext().getContextPath() + path, encoding);
}
}
}
在web.xml中声明过滤器:
<filter>
<filter-name>localizedResources</filter-name>
<filter-class>br.mpt.mp.recad.config.SetContentEncodingFilter</filter-class>
<init-param>
<param-name>/javax.faces.resource/jq/ui/i18n/datepicker-pt.js.xhtml</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>localizedResources</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
或者如果您愿意,可以使用Spring的org.springframework.web.filter.CharacterEncodingFilter
还有OmniFaces替代方案:CharacterEncodingFilter