在Tomcat';s servlet
你好 我有一个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。 所有其他语言的编码都正确 我怎样才能解决这个问题 致以最良好的问候和良好的工作在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
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>");