JSP的6种乱码解决方案[通俗易懂]

JSP的6种乱码解决方案[通俗易懂]

大家好,又见面了,我是你们的朋友全栈君。

1.通过字节码组进行转换

代码语言:javascript代码运行次数:0运行复制 String num = request.getParameter("num");

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "utf-8");

String type = new String(request.getParameter("type").getBytes("ISO-8859-1"), "utf-8");2.查看jsp文件头是否设置了编码格式:

代码语言:javascript代码运行次数:0运行复制<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

3.查看项目的编码格式:设置为UTF-8 :project–》properties:

4.上面一般解决的是页面本身中文的乱码,如果还有问题,比如提交的表单乱码等问题,需要在请求头响应头设置编码:

代码语言:javascript代码运行次数:0运行复制//设置编码格式

req.setCharacterEncoding("UTF-8");

resp.setCharacterEncoding("UTF-8");5.最后还没解决乱码的话,设置tomcat服务器编码格式,默认情况下,tomcat使用的的编码方式:iso8859-1,打开setting.xml文件(在tomcat文件夹conf中)

找到如下代码:

代码语言:javascript代码运行次数:0运行复制这段代码规定了Tomcat监听HTTP请求的端口号等信息。

可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

代码语言:javascript代码运行次数:0运行复制6.JSP Filter(编码过滤器)

过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:

代码语言:javascript代码运行次数:0运行复制public void init(FilterConfig filterConfig){

web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象(见后文实例)。

}

public void doFilter (ServletRequest, ServletResponse, FilterChain){

该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。

}

public void destroy(){

Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

}在src/main/java里添加继承Filter类的TestFilter过滤器类。

TestFilter.java里的代码:

代码语言:javascript代码运行次数:0运行复制package com.wb.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import java.util.Map.Entry;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

public class TestFilter implements Filter {

@Override

public void destroy() {

System.out.println("过滤器销毁.......");

}

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

System.out.println("进行过滤器开发.......");

// 只要在这里加 先解决post请求乱码

request.setCharacterEncoding("utf-8");// 请求

response.setCharacterEncoding("utf-8");// 响应

response.setContentType("text/html;charset=utf-8");// 响应

// get提交乱码处理

chain.doFilter(new MyRequest((HttpServletRequest) request), response);

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("过滤器初始化.......");

}

class MyRequest extends HttpServletRequestWrapper {

HttpServletRequest request;

public MyRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

@Override

public String getParameter(String name) {

String value = request.getParameter(name);

// 先判断是否为空

if (value == null) {

return null;

}

// 再判断提交方法

if (!request.getMethod().equals("GET")) {

return value;

}

// get提交

try {

value = new String(value.getBytes("iso8859-1"), "utf-8");

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return value;

}

@Override

public String[] getParameterValues(String name) {

String[] oldValues = request.getParameterValues(name);

String[] newValues = null;

if (oldValues != null) {

newValues = new String[oldValues.length];

if (!request.getMethod().equals("GET")) {

return oldValues;

}

if (newValues != null) {

try {

for (int i = 0; i < oldValues.length; i++) {

String value = oldValues[i];

value = new String(value.getBytes("iso8859-1"),

"utf-8");

newValues[i] = value;

}

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

return newValues;

}

@Override

public Map getParameterMap() {

// 1.拿到客户端的值

Map oldMap = request.getParameterMap();

// 2.新map

Map newMap = new HashMap();

// 3.拿出oldMap

Set> entrySet = oldMap.entrySet();

for (Entry entry : entrySet) {

// 4.获取键

String key = entry.getKey();

// 5.获取值

String[] values = entry.getValue();

// 新的数组和原数组一样大

String[] newValues = new String[values.length];

// 6.判断值是否为空

if (values == null) {

newMap.put(key, new String[] {

});// 初始化

continue;

}

// 7.取出values里面每一个值进行转码

try {

for (int i = 0; i < values.length; i++) {

String value = values[i];

value = new String(value.getBytes("iso8859-1"), "utf-8");

// value = new String(value.getBytes("iso8859-1"),

// request.getCharacterEncoding());

newValues[i] = value;

}

newMap.put(key, newValues);

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return newMap;

}

}

}在web.xml配置过滤器:

代码语言:javascript代码运行次数:0运行复制

Set Character Encoding

com.wb.filter.TestFilter

encoding

UTF-8

Set Character Encoding

/*

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106676.html原文链接:https://javaforall.cn

相关创作