在Tomcat';s servlet

在Tomcat';s servlet,tomcat,servlets,html-encode,Tomcat,Servlets,Html Encode,你好 我有一个Tomcat的jsp/servlet应用程序,它用多种语言将插入页面的文本保存在mysql上。 文本插入到jsp页面中的文本区域中。 为了保存它们,我调用了一个Javaservlet,它读取请求post参数并将其复制到db中。 Tomcat版本是7.0.63。 当我在servlet中读取以俄语和汉语编写的请求参数时,会出现问号。 我使用system out println读取它们,并且在mysql表上读取它们,该表具有相同的字符。 jsp页面使用UT-8(@page pageEnc

你好

我有一个Tomcat的jsp/servlet应用程序,它用多种语言将插入页面的文本保存在mysql上。 文本插入到jsp页面中的文本区域中。 为了保存它们,我调用了一个Javaservlet,它读取请求post参数并将其复制到db中。 Tomcat版本是7.0.63。 当我在servlet中读取以俄语和汉语编写的请求参数时,会出现问号。 我使用system out println读取它们,并且在mysql表上读取它们,该表具有相同的字符。 jsp页面使用UT-8(@page pageEncoding and meta http equiv=“Content Type”)编码,servlet请求(setCharacterEncoding)也使用UTF-8编码。 server.xml中的Tomcat连接器采用UTF-8编码(URIEncoding)。 我在ApacheHTTP服务器addDefaultCharsetUTF-8上添加了httpd.conf。 所有其他语言的编码都正确

我怎样才能解决这个问题

致以最良好的问候和良好的工作


Stefano Erani实现了规范Servlet(3.0)和JSP(2.2)。在这些规范中,有些地方编码是相关的,定义的默认编码是ISO-8859-1

如果您希望最终用户能够在您的webapp中以UTF-8格式输入文本,并正确接收文本以将其存储在数据库中,则必须采取一些步骤

存放
的html页面必须用UTF-8编码

如果页面是由Servlet生成的,则在调用
getWriter
之前必须调用 setContentType(“text/html;charset=UTF-8”); 或者只是: 响应。setCharacterEncoding(“UTF-8”)

正如Servlet规范所述:

如果servlet没有在 调用ServletResponse接口的getWriter方法或 响应已提交,使用默认的ISO-8859-1

您可以阅读规范第5.4节了解更多信息。例如,您可以基于区域设置设置一个econding

如果html由JSP页面生成,则响应字符编码的规则在JSP规范的第4.2节中确定:

初始响应字符编码设置为的字符集值 page指令的contentType属性。如果页面没有 提供此属性或该属性没有字符集值, 初始响应字符编码确定如下:

•对于XML语法的文档,它是UTF-8

•用于标准格式的JSP页面 语法,它是BOM指定的字符编码 page指令的pageEncoding属性,或通过JSP 配置元素页面编码,其URL模式与 页只有为请求的页指定的字符编码是无效的 使用;通过include指令包含的文件编码如下 没有考虑到。如果没有这样的规范,就没有 初始响应字符编码传递给 ServletResponse.setContentType()-ServletResponse对象的 使用默认值ISO-8859-1

因此,您可以将其设置为包括

在JSP页面上生成表单。请注意,如果JSP页面中的逐字文本上有UTF-8编码字符,那么页面编码也是必要的

为web应用程序中的所有页面设置公共属性的一种方便方法是使用jsp属性组,包括
web.xml

<jsp-config>
    <jsp-property-group>
        <description>Apply to all JSPs</description>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
        <default-content-type>text/html; charset=UTF-8</default-content-type>
    </jsp-property-group>
</jsp-config>
并在web.xml的开头声明过滤器(是的,顺序很重要),如下所示:

<filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>yourpackage.YourCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
您不能依赖使用
System.out.println
打印到控制台的文本,因为例如,在Windows中,控制台的默认编码是CP1252,这与ISO-8859-1几乎相同

因此,如果您在控制台上打印CP1252不支持的UTF-8字符,您将在控制台上看到乱码或问号。(要更改windows上控制台的编码,请参见以下示例:)

Webapp读取和写入UTF-8文本,但它不存储在数据库中

如果上述所有方法都有效,但仍然无法在数据库中存储UTF-8,那么这一定是数据库配置的问题

Mysql 8.0在默认情况下似乎可以在UTF-8中工作,但之前的版本5.7在默认情况下可以在Latin1(=ISO-8859-1)中工作,并且需要采取特殊步骤才能使用UTF-8。见:

另外,请确保使用与数据库版本兼容的最新可用JDBC驱动程序。

再见

两个问题: 1) doFilter方法必须添加到一个servlet中,我用俄语和汉语读取请求参数? 2) 在web.xml中,过滤器编码类必须是上述servlet? 我必须在其他servlet上执行相同的编码,因此我必须在web.xml中添加我应用过滤器的所有servlet

致以最良好的问候和良好的工作


Stefano Erani

这是否回答了您的问题?这个问题有ben marken的副本,但不是。引用的问题是关于在Tomcat中对GET参数进行编码。事实并非如此。doFilter必须位于实现javax.servlet.Filter接口的类中。2.顺序对于其他过滤器很重要,而不是servlet。必须有一个过滤器映射元素(我将其添加到了答案中),使用它您可以将过滤器映射到url模式或servlet名称,以便过滤器仅应用于该servlet。你可以在这里看到使用过滤器的例子:p.d:请注意,关于答案的讨论应该在答案的评论部分进行。根据你的指示和所示链接中的指示,我创建了实现过滤器的类,并将其放入web.xml映射中,而不是servlet应该使用的url模式。在xml中,我将过滤器标记及其过滤器映射放在文件的开头。只是尽管看到了(
<filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>yourpackage.YourCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
response.setContentType("text/html; charset=UTF-8");

PrintWriter writer = response.getWriter();
writer.println("<html><body>");
writer.println("UTF-8 encoded parameter: " + request.getParameter("yourparam");
writer.println("</body></html>");