SpringMvc 中文乱码问题

a88256730 2017-01-06 04:23:28
Jsp页面传值到Controller中为乱码。问题如下:
Jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/resources/css/admin/main.css"/>
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/resources/css/validate/main.css"/>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/jquery-3.1.1.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/jquery.validate.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/core/jquery.cms.validate.js"></script>
<script type="text/javascript">
$(function(){
$("#addForm").cmsvalidate();
});
</script>
</head>
<body>
<div id="content">
<h3 class="admin_link_bar">
<jsp:include page="inc.jsp"></jsp:include>
</h3>
<sf:form method="post" modelAttribute="userDTO" id="addForm">
<table width="800" cellspacing="0" cellPadding="0">
<thead><tr><td colspan="2">添加用户功能</td></tr></thead>
<tr>
<td class="rightTd" width="200px">用户名(必须是英文):</td>
<td class="leftTd"><sf:input path="username" size="30"/><sf:errors cssClass="errorContainer" path="username"/></td>
</tr>
<tr>
<td class="rightTd">显示名称(可以是中文):</td><td class="leftTd"><sf:input path="nickname" size="30"/></td>
</tr>


以上为Jsp页面部分代码,已经将编码格式统一为UTF-8,使用<sf:form modelAttribute="userDTO">标签传递userDTO对象到controller中。


web.xml中确认添加了转码的filter


<!-- 以下filter用于转码 -->
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>



controller中也能访问相应的方法:

@RequestMapping(value = "/add",method=RequestMethod.POST)
public String add(@Valid UserDTO userDTO,BindingResult br,Model model,HttpServletRequest req){
System.out.println(req.getCharacterEncoding());
String olds= userDTO.getNickname();
try {
String news =new String(olds.getBytes("ISO-8859-1"),"utf-8");
System.out.println(olds);
System.out.println(news);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "redirect:../../admin/user/users";
}


然后输出传递过来的中文值就为乱码。


调试过程如下:
首先输入以上三条代码,
结果分别为“utf-8”(说明web.xml的编码filter过滤器没问题),乱码字符(olds是从dto中取出的字符,还是有问题),正常中文(通过其他代码,查询到dto中的字符编码为ISO8859-1,因此将Iso8859-1转为utf-8就能正常显示了)。

综上所述,问题出在DTO的编码格式为IS08859-1,可以通过以上方式解决。但是项目中存在大量的中文输入问题,每次都转码很不现实。有没有什么方法统一的解决以上问题?
userDTO是通过页面层<sf:form modelAttribute="userDTO">标签生成的,对这个 modelAttribute="userDTO" 属性不是很了解,是不是这里出了什么问题?
欢迎大家讨论。
...全文
219 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
a88256730 2017-01-07
  • 打赏
  • 举报
回复
OK,问题解决了。 如果大家还有类似的问题,可以试试调整web.xml中filter的位置试试。 尽量将encoding filter的位置放在所有filter的前面。
JE_GE 2017-01-06
  • 打赏
  • 举报
回复
那就有点坑了,要看全部代码了
a88256730 2017-01-06
  • 打赏
  • 举报
回复
引用 1 楼 JE_GE 的回复:
后台不需要转码啊,拦截器处理了啊
拦截器处理之后还是有问题啊。 String olds= userDTO.getNickname(); System.out.println(olds);输出的还是乱码。 后来通过别的代码检查出来olds的编码格式是iso8859-1,我才用转码的方式进行测试的,测试的结果也没问题。 直接输入request的编码格式也是UTF-8. 不知道问题出在哪里了。
JE_GE 2017-01-06
  • 打赏
  • 举报
回复
后台不需要转码啊,拦截器处理了啊

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧