|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。js|mysql|办理|网页|成绩|中文|中文乱码自从之前进修JSP入手下手,中文乱码成绩就一向不休,苦不胜言。此次在项目入手下手之前,我们要办理的第一个成绩就是把mysql的中文乱码成绩弄定。经由多天的勉力,终究乐成的办理了中文乱码成绩,特写在这里,以备后用。
软件及情况:WindowsXP(2000),j2sdk1.4.2,Tomcat5.0.25,mysql4.1,EMSMysqlManager2(便利建表,版本2.8.5.1),驱动为mysql-connector-java-3.1.4-beta-bin.jar。
方针:在该情况下,完成中文的一般显现,读取与拔出数据库。
注:我只在此情况下测试经由过程,其余体系及分歧版本未测试
要点:一致字符集(JSP页面编码,mysql建库时字符集选择,毗连数据库URL,request设定等)
上面我以GBK为例解说。假如要利用utf-8,只需在响应的GBK处换成utf-8便可
---------------------------步骤1以GBK字符集建库建表-------------------------------------
我利用EMS来建mysql的数据库及表,由于它是图形界面,便利操纵(就像SQLSERVER2000中的企业办理器一样)。
建库时,从EMS菜单当选createDatabase...新建一个数据库,CharacterSet选gbk_bin(另外一个gbk_chinese_ci不晓得与这个有甚么区分,我找材料也没有找到。假如你晓得,请告知我,我增补在这里)。不要把工具栏上有一个加号和数据库容貌的图标当做新建数据库了,谁人新注册一个已存在的数据库。
前面建表时,也要选择一样的字符集。
建好后,此时不要用EMS向内里拔出数据,不然你看到的中文仍然是乱码。
---------------------------步骤2毗连数据库的URL后加些参数-------------------------------
假定我新建的数据库是testdb,那末我毗连数据库的url应当为:
jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk
此时要注重:假如我是把这个url写在JAVA代码中,就间接如许写。但假如是在xml设置文件中(如struts-config.xml,web.xml等),要把个中的&改成&才行,不然会堕落。也就是:
jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk
---------------------------步骤3每一个JSP页面都要声明该中笔墨符集----------------------------
在每一个JSP页面的最下面都加上一句
<%@pagelanguage="java"contentType="text/html;charset=GBK"%>
如许才干包管JSP页面中的中文显现一般
---------------------------步骤4加一个传送参数时设定request字符集的filter类-----------------------
由于收集中字符在传送的时分,都是一致以iso-8859-1的编码传送,以是我们必需对request从头设定字符集,才干一般显现中文。假如接纳filter类来完成,我们不必在每次取中文参数时都要从头设定。
filter类的内容:
/*
*====================================================================
*
*JavaWebStudio开源项目
*
*Struts_dbv0.1
*
*====================================================================
*/
packagecom.strutsLogin.util;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
/**
*中文过滤器
*/
publicclassSetCharacterEncodingFilterimplementsFilter{
//-----------------------------------------------------InstanceVariables
/**
*Thedefaultcharacterencodingtosetforrequeststhatpassthrough
*thisfilter.
*/
protectedStringencoding=null;
/**
*Thefilterconfigurationobjectweareassociatedwith.Ifthisvalue
*isnull,thisfilterinstanceisnotcurrentlyconfigured.
*/
protectedFilterConfigfilterConfig=null;
/**
*Shouldacharacterencodingspecifiedbytheclientbeignored?
*/
protectedbooleanignore=true;
//---------------------------------------------------------PublicMethods
/**
*Takethisfilteroutofservice.
*/
publicvoiddestroy(){
this.encoding=null;
this.filterConfig=null;
}
/**
*Selectandset(ifspecified)thecharacterencodingtobeusedto
*interpretrequestparametersforthisrequest.
*
*@paramrequestTheservletrequestweareprocessing
*@paramresultTheservletresponsewearecreating
*@paramchainThefilterchainweareprocessing
*
*@exceptionIOExceptionifaninput/outputerroroccurs
*@exceptionServletExceptionifaservleterroroccurs
*/
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)
throwsIOException,ServletException{
//Conditionallyselectandsetthecharacterencodingtobeused
if(ignore||(request.getCharacterEncoding()==null)){
Stringencoding=selectEncoding(request);
if(encoding!=null)
request.setCharacterEncoding(encoding);
}
//Passcontrolontothenextfilter
chain.doFilter(request,response);
}
/**
*Placethisfilterintoservice.
*
*@paramfilterConfigThefilterconfigurationobject
*/
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
Stringvalue=filterConfig.getInitParameter("ignore");
if(value==null)
this.ignore=true;
elseif(value.equalsIgnoreCase("true"))
this.ignore=true;
elseif(value.equalsIgnoreCase("yes"))
this.ignore=true;
else
this.ignore=false;
}
//------------------------------------------------------ProtectedMethods
/**
*Selectanappropriatecharacterencodingtobeused,basedonthe
*characteristicsofthecurrentrequestand/orfilterinitialization
*parameters.Ifnocharacterencodingshouldbeset,return
*<code>null</code>.
*<p>
*Thedefaultimplementationunconditionallyreturnsthevalueconfigured
*bythe<strong>encoding</strong>initializationparameterforthis
*filter.
*
*@paramrequestTheservletrequestweareprocessing
*/
protectedStringselectEncoding(ServletRequestrequest){
return(this.encoding);
}
}//EOC
该代码来自于www.javawebstudio.com,特此感激!
然后我们在web.xml中加一些设置,就能够了,设置以下:
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>javawebstudio.struts_db.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
放在web.xml的符合地位。一样平常在最初,<jsp-config>标签之前(假如有的话)
经由以上步骤,JSP和mysql的中文显现及拔出就都一般了。在STRUTS中也一般。
可是,此时假如你用EMS或mysql的命令行把持台来看表中的数据,却发明它们都是????。这是怎样回事呢?
不必忧虑,只需我们运转上面的这几行命令,就可以看到一般的中文了!
SETcharacter_set_client=gbk;
SETcharacter_set_connection=gbk;
SETcharacter_set_database=gbk;
SETcharacter_set_results=gbk;
SETcharacter_set_server=gbk;
SETcollation_connection=gbk_bin;
SETcollation_database=gbk_bin;
SETcollation_server=gbk_bin;
假如你用的是mysql的命令行,则间接输出就好。
假如是EMS,则在工具栏中有一个ShowSQLEditor按钮,点一下,把下面的命令输出,再按一个"execute"的按钮,就好了!
并且在这类情形下,你能够乃至能够用中文名来建数据库,表名和字段名!!!!
----------------------------------------------------------------------------------------------------
可是有一点要出格注重!
像GBK,UTF-8如许的名字,在mysql与JAVA中有分歧的划定,写的时分要分外注重,不然会堕落。
好比GBK,在JAVA中要写成GBK,但在mysql中要写成gbk(毗连数据库的URL)
好比UTF-8,在JAVA中要写成UTF-8,但在Mysql中要写成utf8
别的的字集符也有相似的区分
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 |
|