Jsp+servlet乱码处理的几种方式

乱码既不会凭空产生,也不会凭空消失,只会从一个地方转移到另一个地方,从一种形式转换成另一种形式。

下面是小编总结的几种在eclipse中的jsp上和servlet传值时可能出现乱码的情形和几种解决方式。

1.复制粘贴乱码

在复制javascript文件或是servlet文件到eclipse中时有时会产生乱码,其原因是复制的代码的编码方式和eclipse中的编码方式不同,不过一般只在有中文的地方才会有乱码。常见的中文编码方式有gbk,gb2312,gb18030,不过小编建议使用utf-8,因为utf-8更加通用,兼容性更好。eclipse中在出现乱码的文件的文件名上点击右键,选properties,修改编码方式即可。


但是已经成乱码的文字一般不会恢复原样,改了编码方式后,把代码全删了,保存,再复制一遍,保存,一般就OK了,也可以手动修改成乱码的文字。


2.servlet传值乱码

用jsp的form表单把值传到servlet后(一般传中文时可能有乱码),或是在servlet中设置的request中的属性(request.setAttribute("name",value);)和在session中设置的属性(request.getSession().setAttribute("name",value);)产生乱码(在页面上显示时是乱码)。这时可以在servlet的doGet或是doPost方法的最前面加上两句设置传值编码方式的语句。(用哪个方法在哪个方法里加)

加上上图绿色的两句话后乱码一般会消除。


3.设置过滤器

可以设置处理乱码的过滤器,这样就不用在每个servlet中都设置上述编码方式了。

(1)使用filter---针对doPost方式传值

创建一个类继承Filter接口,这里有一个示例,命名为EncodingFilter(名字随意起)

package com.iweb01.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        // TODO Auto-generated method stub
        arg0.setCharacterEncoding("utf-8");
        arg1.setCharacterEncoding("utf-8");
        arg2.doFilter(arg0, arg1);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

然后配置web.xml

<filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>com.iweb01.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

在web.xml中加上上述内容即可。

注意:这种方式只能对所有doPost方法的传值进行过滤,用doGet方法传的值还是有可能乱码。


(2)修改tomcat的server.xml---针对doGet方式传值

doGet方法的传值,如在使用ajax时,可能会有乱码。(从javascript函数向servlet传过去的是乱码)

doGet方式传值产生乱码的现象可以用这种方式避免。

找到tomcat的安装目录,进入conf文件夹,修改server.xml。

打开server.xml,找到如下位置,加上一句 URIEncoding="utf-8" 即可。








这样doGet方式的传值也不会乱码了。


附上检测乱码的方式

在javascript中可以使用alert();来把值输出看看是不是有乱码。

在jsp中可以使用out.println();或是用${ name }输出request或session中设置的属性值,看看有没有乱码。

在servlet中直接用System.out.println();输出属性和变量的值看哪里有乱码即可


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
乱码问题在servlet中是比较常见的。一般来说,乱码问题的根本原因是编码不一致导致的。解决方法有几种。一种是在servlet页面中添加response.setCharacterEncoding("utf-8")来指定编码。另一种是修改数据库连接,使用jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf8来指定编码。另外,在JSP页面中,可以使用<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK" %>来指定编码。其中,pageEncoding是jsp文件本身的编码,而contentType的charset是指服务器发送给客户端的内容编码。需要注意的是,在jsp编译成.java的第一阶段,会根据pageEncoding的设定将jsp翻译成统一的UTF-8的JAVA源码,如果设定错误或没有设定,就会出现中文乱码问题。在第二阶段,JAVAC会将JAVA源码编译成java byteCode,不论JSP编写时使用的是什么编码方案,经过这个阶段的结果都会是UTF-8的编码的java源码。因此,要解决servlet中文乱码问题,需要注意编码的一致性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Servlet中文乱码原因解析及解决方法](https://blog.csdn.net/cooling11/article/details/123191480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [解决Servlet中文乱码问题](https://blog.csdn.net/zixiao_love/article/details/102814170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值