struts乱码解决国庆没地方去所以就学习了一下struts,用struts做了一个新闻管理系统;但插入数据库中的中文总是出现乱码,经过一个上午的努力,终于把乱码问题给解决了,以下就是我查找与解决乱码的过程:1,既然显示在网页那的是乱码,首先得确定在数据库中的内容是否能正确显示,我用的数据库为MYSQL4.1,打开控制台,select * from news;果然,在数据库中所插入的内容都为乱码,然后我试下手动插入中文,出现错误,data too long.......,怎么可能?我用的类型为varchar(100),而插入的数据只为三个中文,不应该会出现数据过长的错误呀,后来想想可能是编码的问题,所以把原来的表删了,重建一个,并设置编码为GB2312CREATE 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.以为应该能正确显示中文了,添加->浏览,还是乱码! 应该是页面编码的确良问题!解决方法:写一个自己的ActionServletMyActionServletpublic 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添加->浏览;哈哈,中文终于能正确显示了!