仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 379|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA编程:Mysql与JSP网页中文乱码成绩的办理计划...

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

别的的字集符也有相似的区分



自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。
金色的骷髅 该用户已被删除
沙发
发表于 2015-1-20 22:07:19 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
活着的死人 该用户已被删除
板凳
发表于 2015-1-30 06:39:42 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
小女巫 该用户已被删除
地板
发表于 2015-2-6 07:45:49 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
不帅 该用户已被删除
5#
发表于 2015-2-7 18:03:25 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
第二个灵魂 该用户已被删除
6#
发表于 2015-2-15 22:06:01 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
莫相离 该用户已被删除
7#
发表于 2015-3-4 14:41:08 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-9 18:08:49 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
老尸 该用户已被删除
9#
发表于 2015-3-13 11:38:00 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
山那边是海 该用户已被删除
10#
发表于 2015-3-17 00:10:22 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
小魔女 该用户已被删除
11#
发表于 2015-3-23 08:38:50 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 17:32

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表