对于中文转换问题,我们一般的做法是指定页面统一用一种编码格式,如UTF-8或GB2312.这样一般的请求都不会出现乱码,
在Struts中要记得在FORMBEAN的validate方法中进行字符转换,转成与页面一致的编码格式,如
public
ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) ... {
// TODO Auto-generated method stub
ActionErrors errors = new ActionErrors();
if(receiverId==null)...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}
if(senderId == null)...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}
try ...{
if(title==null || title.equals("")) ...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}else...{
title = new String(title.getBytes("ISO-8859-1"),"GB2312");
}
if(content!=null )...{
if(content.length()>2000)...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}
else
content = new String(content.getBytes("ISO-8859-1"),"GB2312");
}
} catch (UnsupportedEncodingException e) ...{
// TODO Auto-generated catch block
errors.add("message",new ActionMessage(Constants.MSG_CONVERT_ERROR));
e.printStackTrace();
}
if(reply!=null)...{
try ...{
reply = new String(reply.getBytes("ISO-8859-1"),"GB2312");
} catch (UnsupportedEncodingException e) ...{
// TODO Auto-generated catch block
errors.add("message",new ActionMessage(Constants.MSG_CONVERT_ERROR));
}
}
return errors;
}
HttpServletRequest request) ... {
// TODO Auto-generated method stub
ActionErrors errors = new ActionErrors();
if(receiverId==null)...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}
if(senderId == null)...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}
try ...{
if(title==null || title.equals("")) ...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}else...{
title = new String(title.getBytes("ISO-8859-1"),"GB2312");
}
if(content!=null )...{
if(content.length()>2000)...{
errors.add("message",new ActionMessage(Constants.MSG_MAIL_SEND_FAILED));
}
else
content = new String(content.getBytes("ISO-8859-1"),"GB2312");
}
} catch (UnsupportedEncodingException e) ...{
// TODO Auto-generated catch block
errors.add("message",new ActionMessage(Constants.MSG_CONVERT_ERROR));
e.printStackTrace();
}
if(reply!=null)...{
try ...{
reply = new String(reply.getBytes("ISO-8859-1"),"GB2312");
} catch (UnsupportedEncodingException e) ...{
// TODO Auto-generated catch block
errors.add("message",new ActionMessage(Constants.MSG_CONVERT_ERROR));
}
}
return errors;
}
但是同样的做法,如果页面用ajaxAnywhere请求到后台,这样转换仍然要出乱码,原来是ajaxAnywhere的AAFilter.class中自动将请求字符转换成UTF-8---
public
void
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException
... {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
if(!AAUtils.isAjaxRequest(servletRequest))
...{
filterChain.doFilter(servletRequest, response);
return;
}
request.setCharacterEncoding("UTF-8");
response.setContentType("text/xml;charset=utf-8");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0L);
response.setHeader("Pragma", "no-cache");
BufferResponseWrapper bufferResponseWrapper = new BufferResponseWrapper(response);
java.util.Set refreshZones = new HashSet();
AAUtils.setZonesToRefresh(request, refreshZones);
AAUtils.getRefreshZonesFromURL(request);
try
...{
filterChain.doFilter(request, bufferResponseWrapper);
bufferResponseWrapper = execHandler(request, bufferResponseWrapper);
if(bufferResponseWrapper.getRedirect() != null)
XMLHandler.sendRedirect(bufferResponseWrapper);
else
XMLHandler.sendZones(bufferResponseWrapper, refreshZones);
}
catch(Throwable e)
...{
XMLHandler.handleError(response, e);
}
}
throws IOException, ServletException
... {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
if(!AAUtils.isAjaxRequest(servletRequest))
...{
filterChain.doFilter(servletRequest, response);
return;
}
request.setCharacterEncoding("UTF-8");
response.setContentType("text/xml;charset=utf-8");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0L);
response.setHeader("Pragma", "no-cache");
BufferResponseWrapper bufferResponseWrapper = new BufferResponseWrapper(response);
java.util.Set refreshZones = new HashSet();
AAUtils.setZonesToRefresh(request, refreshZones);
AAUtils.getRefreshZonesFromURL(request);
try
...{
filterChain.doFilter(request, bufferResponseWrapper);
bufferResponseWrapper = execHandler(request, bufferResponseWrapper);
if(bufferResponseWrapper.getRedirect() != null)
XMLHandler.sendRedirect(bufferResponseWrapper);
else
XMLHandler.sendZones(bufferResponseWrapper, refreshZones);
}
catch(Throwable e)
...{
XMLHandler.handleError(response, e);
}
}
所以如果你正在使用GB2312的话,就要小心了....要自己再进行一次字符转换, 用formbean 的话,最好将一般请求用的formbean 与 ajaxAnywhere请求用的formbean 分开 , 然后分别写validate方法,分别进行字符转化.~~~