struts乱码解决
国庆没地方去所以就学习了一下struts,用struts做了一个新闻管理系统;
但插入数据库中的中文总是出现乱码,经过一个上午的努力,终于把乱码问题给解决了,以下就是我查找与解决乱码的过程:
1,既然显示在网页那的是乱码,首先得确定在数据库中的内容是否能正确显示,我用的数据库为MYSQL4.1,
打开控制台,select * from news;果然,在数据库中所插入的内容都为乱码,然后我试下手动插入中文,
出现错误,data too long.......,怎么可能?我用的类型为varchar(100),而插入的数据只为三个中文,不应该会出现数据过长的错误呀,
后来想想可能是编码的问题,所以把原来的表删了,重建一个,并设置编码为GB2312
CREATE TABLE NEWS(
ID INT PRIMARY KEY,
TITLE VARCHAR(100) NOT NULL,
CONTENT VARCHAR(400) NOT NULL,
AUTHOR VARCHAR(40) NOT NULL,
TIME DATE NOT NULL,
KEYWORD VARCHAR(20) NOT NULL,
TYPE INT NOT NULL
)CHARSET=GB2312;
然后重新插入,OK可以正确的插入中文了,数据库方面的问题解决;
2.然后在网页那重新插入中文,同样还是乱码!!
以下是我的添加新闻的类:
package newsBean;
import java.util.Vector;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.DynaValidatorForm;
/**
* @author sxwailyc
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class NewsAddAction extends Action {
/* (非 Javadoc)
* @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO 自动生成方法存根
DynaValidatorForm newsForm =(DynaValidatorForm)form;
String title=(String)newsForm.get("title");
System.out.println(title);
String content=(String)newsForm.get("content");
String author =(String)newsForm.get("author");
String keyword =(String)newsForm.get("keyword");
Integer newsType= (Integer)newsForm.get("newsType");
HttpSession session=request.getSession();
Vector newsList=new Vector();
ServletContext context=servlet.getServletContext();
DataSource dataSource=(DataSource)context.getAttribute(Constants.DATASOURCE_KEY);
DB db=new DB(dataSource);
String PageForward=null;
News news=new News();
news.setTitle(title);
news.setContent(content);
news.setAuthor(author);
news.setKeyword(keyword);
news.setType(newsType.intValue());
ActionMessages errors = new ActionMessages();
if(news.Insert(db)){
newsList =News.SearchNewsTitle(db);
session.setAttribute(Constants.NEWS_LIST_KEY,newsList);
PageForward="toAdminMain";
}
else{
errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("errors.insertFail"));
if(!errors.isEmpty()){
saveErrors(request,errors);
}
PageForward="toWrong";
}
db.close();
return mapping.findForward(PageForward);
}
}
首先考虑到在从提交表单的页面传递过来的数据是否是乱码呢?
在这里加了一句String title=(String)newsForm.get("title");System.out.println(title);
果然,在这里打印出来的title居然是乱码!!!!!苦恼!就是这个问题,弄了一个多钟,
最后重新检查一下提表单的JSP页面,原来在表单那的<form method="post"> 少写了post!!!
导制表单递数据时出现乱码,添加method="post";重新system.out.println("title");
中文正确显示!!
3.以为应该能正确显示中文了,添加->浏览,还是乱码!
应该是页面编码的确良问题!
解决方法:
写一个自己的ActionServlet
MyActionServlet
public class MyActionServlet extends ActionServlet {
/* (非 Javadoc)
* @see org.apache.struts.action.ActionServlet#process(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// TODO 自动生成方法存根
request.setCharacterEncoding("GB2312");//设置编码为GB2312
response.setCharacterEncoding("GB2312");
System.out.println("设置成功");
super.process(request, response);
}
}
在web.xml中配置一下
<servlet>
<servlet-name>actionServlet</servlet-name>
<servlet-class>newsBean.MyActionServlet</servlet-class>
</servlet>
4.这下应试没问题了吧,添加->浏览.又是乱码,再重新检查一遍,都没问题呀!!
最后想想,会不会是数据源那的编码问题,在struts_config.xml那设置数据库编码
<set-property property="url"
value="jdbc:mysql://localhost:3306/sample?useUnicode=true&characterEncoding=GB2312"/>
重启tomcat
添加->浏览;
哈哈,中文终于能正确显示了!