有关S2SH中乱码的简单解释

乱码其实是S2SH开发过程中经常遇到而又不太注意的东西,往往这一次解决了下次不知道什么情况下又会出现
记录一下自己最近一次解决乱码的过程,仅供参考
程序很简单,假设一个用户注册页面提交,后台struts的UserAction接收参数,再调用Dao的方法存储。整个S2SH工程配置均无问题,数据库mysql数据库查询数据发现中文乱码。

很简单的程序
1.register.jsp注册页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form method="post" action="u.action">
用户名:<input type="text" id="username" name="username"><br>
密码:<input type="password" id="password" name="password"><br>
确认密码:<input type="password" id="password2" name="password2"><br>
<input type="submit" value="注册提交">
</form>
</body>
</html>

2.UserAction的内容

@Component("u")
@Scope("prototype")
public class UserAction extends ActionSupport implements ModelDriven {

private UserService userService;
private UserDto userDto = new UserDto();
private User user ;

@Override
public String execute() throws Exception{
User u = new User();
u.setUsername(userDto.getUsername());
u.setPassword(userDto.getPassword());
System.out.println(">>>>>>>>>username="+userDto.getUsername());
userService.save(u);
return "success";
}
}

public Object getModel(){
return userDto;
}

public UserDto getUserDto() {
return userDto;
}

public void setUserDto(UserDto userDto) {
this.userDto = userDto;
}
public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
public UserService getUserService() {
return userService;
}
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}

3.UserDaoImpl的内容

@Component("userDao")
public class UserDaoImpl implements UserDao {

private HibernateTemplate hibernateTemplate;

public void save(User u){
hibernateTemplate.save(u);
}

public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}


针对这样的问题,采用断层分析
首先u.setUsername(userDto.getUsername())更改为u.setUsername("测试"));
在此进行页面提交,发现数据库中的中文显示正常,确认乱码原因与后台存储无关
然后在UserAction中输出接收到的参数,例如
System.out.println(">>>>>>>>>username="+userDto.getUsername());
输出值乱码,确认乱码来源


解决方法分为两种:
1.在struts.xml配置文件中增加

<constant name="struts.i18n.encoding" value="UTF-8" />

2.在web.xml中增加如下

<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


需要注意的事情
1.两者配置中的编码方式"UTF-8"需要和页面中pageEncoding="UTF-8"保持一致
2.两者配置选择一个即可,但是struts2.1.6存在struts的i18n配置不起作用的bug
所以请选择第二种配置,struts2.1.8已修正该bug,所以两种配置都可以
3.在web.xml的配置需要注意过滤器执行先后顺序
过滤器顺序不对会造成过滤器不起作用
OpenSessionInViewFilter
encodingFilter(页面编码要和转换的编码类型一致)
ActionContextCleanUp
StrutsPrepareAndExecuteFilter
的顺序,这一点需要注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值