如何在PrimeFaces应用程序中的JSF资源上设置字符编码?

时间:2013-02-14 08:31:36

标签: jsf servlets encoding primefaces websphere

我在 WebSphere 7 上使用 PrimeFaces 3.4 MyFaces 2.0.7 。我正在使用过滤器将响应编码设置为UTF-8:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
<filter-mapping>
    <filter-name>CharsetEncodingFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

在日志中,我看到在每个JSF资源集上调用过滤器,包括资源,例如:

http://localhost:9080/myapp/javax.faces.resource/myscript.js.xhtml?ln=mylib

但是,当我看到响应标头时,未设置字符集,只有Contet-Type设置为application/x-javascript。我的过滤器在web.xml中被声明为第一个,我唯一使用的是org.primefaces.webapp.filter.FileUploadFilter,它对字符编码没有任何作用。

JavaScript文件默认被视为UTF-8,因为消息显示正确,但我仍然希望正确设置字符集。

我该怎么做?过滤器一直在为我工作,为什么不在JSF / PrimeFaces?我错过了这种方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您的<filter> / <servlet>声明

有些混乱

Servlet可能

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Filter应为

<filter>
    <filter-name>Your filter</filter-name>
    <filter-class>com.yourpackage.YourFilterClass</filter-class>
</filter>
<filter-mapping>
    <filter-name>Your filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

此外,当您使用JSF时,标头会在您的视图中设置,很可能是*.xhtml个文件。您可以在那里明确设置字符编码:

<h:head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF8" />
</h:head>

修改

这是我对你的问题的误解。

使用<h:form enctype="multipart/form-data">时,Primefaces中似乎存在一个错误。 MultipartRequest对象使用平台的默认编码,而不是过滤器对请求对象的编码集。

this answer for analysis and a workaround。另一种解决方法是将UTF-8设置为服务器的默认编码。