我使用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。
答案 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>