JSP:无法弄清楚如何为GlassFish 3.1.2响应设置UTF-8

时间:2014-11-07 00:15:28

标签: java jsp encoding utf-8 glassfish

我使用GlassFish 3.1.2并在访问JSP页面时看到以下警告:

  

PWC4011:无法将请求字符编码设置为UTF-8   context / myapp,因为已经读取了请求参数,   或ServletRequest.getReader()已被调用

我的JSP文件以:

开头
<%@page pageEncoding="UTF-8"%>

我的WEB-INF/glassfish-web.xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
    <parameter-encoding default-charset="UTF-8"/>

    <jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
    </jsp-config>

</glassfish-web-app>

我的WEB-INF/web.xml文件是:

   <?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5">

我相信在JSP页面中第一个setCharacterEncoding()实例之前执行request.getAttribute()代码时,会触发警告(根据here),例如

request.setCharacterEncoding("UTF-8");
personName = request.getAttribute("personName");

但我不知道如何解决这个问题。

我的web.xml使用servlet 2.5,我认为它是JSP 2.1(我知道JSP 1.x不支持UTF-8,但我认为 JSP 2.1支持UTF-8 )。我尝试将web.xml文件升级为

开头
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

但这只是导致GlassFish以

开头的严重错误
  

[#| 2014-11-06T16:11:09.772-0800 |严重| glassfish3.1.2 | javax.enterprise.system.tools.deployment.org.glassfish.deployment.common | _ThreadID = 1; _ThreadName = Thread- 2; | DPL8015:   部署描述符文件中的无效部署描述符   归档[myapp]中的WEB-INF / web.xml。第25行第23栏 -   cvc-complex-type.2.4.a:找到无效的内容   元素&#39;显示名称&#39;。之一   &#39; {&#34; http://java.sun.com/xml/ns/javaee&#34;:servlet的类,   &#34; http://java.sun.com/xml/ns/javaee&#34;:JSP的文件,   &#34; http://java.sun.com/xml/ns/javaee&#34;:INIT-PARAM,   &#34; http://java.sun.com/xml/ns/javaee&#34;:负载上启动时,   &#34; http://java.sun.com/xml/ns/javaee&#34;:启用,   &#34; http://java.sun.com/xml/ns/javaee&#34;:异步支持,   &#34; http://java.sun.com/xml/ns/javaee&#34;:运行如,   &#34; http://java.sun.com/xml/ns/javaee&#34;:安全角色引用,   &#34; http://java.sun.com/xml/ns/javaee&#34;:多部分配置}&#39;预计。|#]

每当我进行更改时,我都会确保重新启动GlassFish服务器。我假设GlassFish会自动检测到glassfish-web.xml的存在,但是如果我需要在某处为GlassFish配置它以实现此文件存在,请告诉我。

我已经遵循了我在网上找到的所有建议。需要一些帮助来解决这个问题。任何建议都非常感激。

更新1

我注意到如果我从JSP页面删除request.setCharacterEncoding("UTF-8");以便以下

request.setCharacterEncoding("UTF-8");
personName = request.getAttribute("personName");

变得只是

personName = request.getAttribute("personName");

警告消失了。这是否意味着request.setCharacterEncoding("UTF-8");应该只在发出request.getParameter()之前存在于Java servlet中,而不是在JSP页面中存在?

更新2

我仍然在GlassFish server.log文件中看到编码警告,虽然这次它不是来自我的网络应用程序:

  

[#| 2014-11-10T10:02:57.234-0800 |警告| glassfish3.1.2 | org.apache.catalina.connector.Request | _ThreadID = 57; _ThreadName =螺纹-2; | PWC4011:   无法从上下文将请求字符编码设置为UTF-8,   因为已经读取了请求参数,或者   ServletRequest.getReader()已被称为|#]

不确定这是来自何处或如何修复,但我将通过添加GlassFish管理控制台-Dfile.encoding=UTF8中的选项来修改GlassFish JVM编码:Configurations>server-config>JVM Settings>JVM Options,以及重启服务器。

我还添加了此处显示的字符集过滤器:How to get UTF-8 working in Java webapps?。虽然它是为Tomcat制作的,但我希望它仍适用于GlassFish。

1 个答案:

答案 0 :(得分:1)

解决方案: 创建/编辑文件glassfish-web.xml(文件夹WEB-INF):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" 
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
    <class-loader delegate="true"/>
    <!-- Change the default character encoding from ISO-8859-1 to UTF-8 -->
    <parameter-encoding default-charset="UTF-8"/>
    <jsp-config>
        <property name="keepgenerated" value="true">
            <description>Keep a copy of the generated servlet class' java code.</description>
        </property>
    </jsp-config>
</glassfish-web-app>