﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-风之殇</title><link>http://www.blogjava.net/momoJava/</link><description>它的殇情在于人人都知道有它存在,确不明白它存在的意义... ...</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 07:35:09 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 07:35:09 GMT</pubDate><ttl>60</ttl><item><title>Java中文问题及最优解决方案（本地化）</title><link>http://www.blogjava.net/momoJava/articles/175092.html</link><dc:creator>风之殇</dc:creator><author>风之殇</author><pubDate>Mon, 14 Jan 2008 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/momoJava/articles/175092.html</guid><wfw:comment>http://www.blogjava.net/momoJava/comments/175092.html</wfw:comment><comments>http://www.blogjava.net/momoJava/articles/175092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/momoJava/comments/commentRss/175092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/momoJava/services/trackbacks/175092.html</trackback:ping><description><![CDATA[
		<span id="BlogViewId" be:sortmode="Normal" be:sortkey="" be:firsthandle="cns!AADDE4734A6787F!135" be:lasthandle="cns!AADDE4734A6787F!107">
				<font size="2">　Abstract：本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程，通过此过程的解析透视出了Java编程中中文问题产生的根本原因，最后给出了建议的最优化的解决Java中文问题的方法。  </font>
				<p>
						<font size="2">　　<strong>1、中文问题的来源 </strong></font>
				</p>
				<p>
						<font size="2">    计算机最初的操作系统支持的编码是单字节的字符编码，于是，在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展，为了适应世界其它民族的语言（当然包括我们的汉字），人们提出了UNICODE编码，它采用双字节编码，兼容英文字符和其它民族的双字节字符编码，所以，目前，大多数国际***的软件内部均采用UNICODE编码，在软件运行时，它获得本地支持系统（多数时间是操作系统）默认支持的编码格式，然后再将软件内部的 UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此，我这里说的JDK是指国际版的JDK，我们大多数程序员使用的是国际化的JDK版本，以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码语言，为了能让计算机处理中文，我们自己制定的gb2312、 GBK、GBK2K等标准以适应计算机处理的需求。所以，大部分的操作系统为了适应我们处理中文的需求，均定制有中文操作系统，它们采用的是GBK, GB2312编码格式以正确显示我们的汉字。如：中文Win2K默认采用的是GBK编码显示，在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的，即，所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码，注意：GBK是在GB2312基础上扩充来的。</font>
				</p>
				<p>
						<font size="2">    由于Java语言内部采用UNICODE编码，所以在JAVA程序运行时，就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题，这个转换过程有着一系列的步骤，如果其中任何一步出错，则显示出来的汉字就会出是乱码，这就是我们常见的JAVA中文问题。</font>
				</p>
				<p>
						<font size="2">    同时，Java是一个跨平台的编程语言，也即我们编写的程序不仅能在中文windows上运行，也能在中文Linux等系统上运行，同时也要求能在英文等系统上运行（我们经常看到有人把在中文win2k上编写的JAVA程序，移植到英文Linux上运行）。这种移植操作也会带来中文问题。</font>
				</p>
				<p>
						<font size="2">    还有，有人使用英文的操作系统和英文的IE等浏览器，来运行带中文字符的程序和浏览中文网页，它们本身就不支持中文，也会带来中文问题。</font>
				</p>
				<p>
						<font size="2">    几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递，而不是按中文编码传递，所以，传递中文参数时也会有问题，从而带来乱码现象。</font>
				</p>
				<p>
						<font size="2">    总之，以上几个方面是JAVA中的中文问题的主要来源，我们把以上原因造成的程序不能正确运行而产生的问题称作：JAVA中文问题。</font>
				</p>
				<p>
						<font size="2">　<strong>　2、JAVA编码转换的详细过程 </strong></font>
				</p>
				<p>
						<font size="2">    我们常见的JAVA程序包括以下类别：<br />     *直接在console上运行的类(包括可视化界面的类)<br />     *JSP代码类（注：JSP是Servlets类的变型）<br />     *Servelets类<br />     *EJB类<br />     *其它不可以直接运行的支持类</font>
				</p>
				<p>
						<font size="2">    这些类文件中，都有可能含有中文字符串，并且我们常用前三类JAVA程序和用户直接交互，用于输出和输入字符，如：我们在JSP和Servlet中得到客户端送来的字符，这些字符也包括中文字符。无论这些JAVA类的作用如何，这些JAVA程序的生命周期都是这样的：</font>
				</p>
				<p>
						<font size="2">    *编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java扩展名保存在操作系统中，例如我们在中文win2k中用记事本编辑一个java源程序；<br />     *编程人员用JDK中的javac.exe来编译这些源代码，形成.class类(JSP文件是由容器调用JDK来编译的)；<br />     *直接运行这些类或将这些类布署到WEB容器中去运行，并输出结果。<br />    那么，在这些过程中，JDK和JVM是如何将这些文件如何编码和解码并运行的呢？</font>
				</p>
				<p>
						<font size="2">这里，我们以中文win2k操作系统为例说明JAVA类是如何来编码和被解码的。 </font>
				</p>
				<p>
						<font size="2">
						</font>
				</p>
				<p>
						<font size="2">    <strong>第一步，</strong>我们在中文win2k中用编辑软件如记事本编写一个Java源程序文件(包括以上五类JAVA 程序)，程序文件在保存时默认采用了操作系统默认支持GBK编码格式(操作系统默认支持的格式为file.encoding格式)形成了一个.java文件，也即，java程序在被编译前，我们的JAVA源程序文件是采用操作系统默认支持的file.encoding编码格式保存的，java源程序中含有中文信息字符和英文程序代码；要查看系统的file.encoding参数，可以用以下代码：<br />　　public class ShowSystemDefaultEncoding {<br />　　public static void main(String[] args) {<br />　　String encoding = System.getProperty("file.encoding");<br />　　System.out.println(encoding);<br />　　}}</font>
				</p>
				<p>
						<font size="2">   <strong> 第二步，</strong>我们用JDK的javac.exe文件编译我们的Java源程序，由于JDK是国际版的，在编译的时候，如果我们没有用-encoding参数指定我们的 JAVA源程序的编码格式，则javac.exe首先获得我们操作系统默认采用的编码格式，也即在编译java程序时，若我们不指定源程序文件的编码格式，JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式，如WIN2k，它的值为GBK)，然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的 UNICODE格式放入内存中。然后，javac把转换后的unicode格式的文件进行编译成.class类文件，此时.class文件是 UNICODE编码的，它暂放在内存中，紧接着，JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的. class文件。对我们来说，我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件，它内部包含我们源程序中的中文字符串，只不过此时它己经由file.encoding格式转化为UNICODE格式了。</font>
				</p>
				<p>
						<font size="2">    这一步中，对于JSP源程序文件是不同的，对于JSP，这个过程是这样的：即WEB容器调用JSP编译器，JSP编译器先查看JSP文件中是否设置有文件编码格式，如果JSP文件中没有设置JSP文件的编码格式，则JSP编译器调用JDK先把JSP文件用JVM默认的字符编码格式(也即WEB容器所在的操作系统的默认的file.encoding)转化为临时的Servlet类，然后再把它编译成UNICODE格式的class类，并保存在临时文件夹中。如：在中文win2k上，WEB容器就把JSP文件从GBK编码格式转化为UNICODE格式，然后编译成临时保存的Servlet类，以响应用户的请求。</font>
				</p>
				<p>
						<font size="2">    <strong>第三步，运行第二步编译出来的类，分为三种情况：</strong></font>
				</p>
				<p>
						<font size="2">    A、 直接在console上运行的类<br />    B、 EJB类和不可以直接运行的支持类(如JavaBean类)<br />    C、 JSP代码和Servlet类<br />    D、 JAVA程序和数据库之间<br />    下面我们分这四种情况来看。<br />   <strong> A、直接在console上运行的类</strong></font>
				</p>
				<p>
						<font size="2">    这种情况，运行该类首先需要JVM支持，即操作系统中必须安装有JRE。运行过程是这样的：首先java启动JVM，此时JVM读出操作系统中保存的 class文件并把内容读入内存中，此时内存中为UNICODE格式的class类，然后JVM运行它，如果此时此类需要接收用户输入，则类会默认用 file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存（用户可以设置输入流的编码格式）。程序运行后，产生的字符串（UNICODE编码的）再回交给JVM，最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。</font>
				</p>
				<p>
						<font size="2">    对于这种直接在console上运行的类，它的转化过程可用图1更加明确的表示出来：</font>
				</p>
				<p>
						<font size="2">图1</font>
				</p>
				<p align="center">
						<font size="2">
								<img src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/pic/0430java_1.gif" />
						</font>
				</p>
				<p align="left">
						<font size="2">以上每一步的转化都需要正确的编码格式转化，才能最终不出现乱码现象。<br /><br />    </font>
						<font size="2">
								<strong>B、EJB类和不可以直接运行的支持类(如JavaBean类)<br /><br /></strong>    由于EJB类和不可以直接运行的支持类，它们一般不与用户直接交互输入和输出，它们常常与其它的类进行交互输入和输出，所以它们在第二步被编译后，就形成了内容是UNICODE编码的类保存在操作系统中了，以后只要它与其它的类之间的交互在参数传递过程中没有丢失，则它就会正确的运行。<br />这种EJB类和不可以直接运行的支持类, 它的转化过程可用图2更加明确的表示出来： </font>
				</p>
				<p>
						<font size="2">
						</font>
				</p>
				<p>
						<font size="2">图2</font>
				</p>
				<p align="center">
						<font size="2">
								<img src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/pic/0430java_2.gif" />
						</font>
				</p>
				<p>
						<br />
						<font size="2">   <strong> C、JSP代码和Servlet类</strong></font>
				</p>
				<p>
						<font size="2">    经过第二步后，JSP文件也被转化为Servlets类文件，只不过它不像标准的Servlets一校存在于classes目录中，它存在于WEB容器的临时目录中，故这一步中我们也把它做为Servlets来看。</font>
				</p>
				<p>
						<font size="2">    对于Servlets，客户端请求它时，WEB容器调用它的JVM来运行Servlet，首先，JVM把Servlet的class类从系统中读出并装入内存中，内存中是以UNICODE编码的Servlet类的代码，然后JVM在内存中运行该Servlet类，如果Servlet在运行的过程中，需要接受从客户端传来的字符如：表单输入的值和URL中传入的值，此时如果程序中没有设定接受参数时采用的编码格式，则WEB容器会默认采用ISO-8859- 1编码格式来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中。Servlet运行后生成输出，输出的字符串是 UNICODE格式的，紧接着，容器将Servlet运行产生的UNICODE格式的串（如html语法，用户输出的串等）直接发送到客户端浏览器上并输出给用户，如果此时指定了发送时输出的编码格式，则按指定的编码格式输出到浏览器上，如果没有指定，则默认按ISO-8859-1编码发送到客户的浏览器上。这种JSP代码和Servlet类，它的转化过程可用图3更加明确地表示出来：</font>
				</p>
				<p>
						<font size="2">图3</font>
				</p>
				<p align="center">
						<font size="2">
								<img src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/pic/0430java_3.gif" />
						</font>
				</p>
				<p align="left">
						<strong>
								<font size="2">D、Java程序和数据库之间</font>
						</strong>
				</p>
				<p>
						<font size="2">
						</font>
				</p>
				<p>
						<font size="2">    对于几乎所有数据库的JDBC驱动程序，默认的在JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的，所以，我们的程序在向数据库内存储包含中文的数据时，JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式，然后传递到数据库中，在数据库保存数据时，它默认即以ISO-8859-1保存，所以，这是为什么我们常常在数据库中读出的中文数据是乱码。<br />    对于JAVA程序和数据库之间的数据传递，我们可以用图4清晰地表示出来</font>
				</p>
				<p>
						<font size="2">                                                                    图4<img src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/pic/0430java_4.gif" /></font>
				</p>
				<p>
						<br />
						<font size="2">
								<strong>    3、分析常见的JAVA中文问题几个必须清楚的原则<br /></strong>
								<br />    首先，经过上面的详细分析，我们可以清晰地看到，任何JAVA程序的生命期中，其编码转换的关键过程是在于：最初编译成class文件的转码和最终向用户输出的转码过程。<br />    其次，我们必须了解JAVA在编译时支持的、常用的编码格式有以下几种：<br />    *ISO-8859-1，8-bit, 同8859_1,ISO-8859-1,ISO_8859_1等编码<br />    *Cp1252，美国英语编码，同ANSI标准编码<br />    *UTF-8，同unicode编码<br />    *GB2312，同gb2312-80,gb2312-1980等编码<br />    *GBK , 同MS936，它是gb2312的扩充<br />    及其它的编码，如韩文、日文、繁体中文等。同时，我们要注意这些编码间的兼容关体系如下：<br />    unicode和UTF-8编码是一一对应的关系。GB2312可以认为是GBK的子集，即GBK编码是在gb2312上扩展来的。同时，GBK编码包含了20902个汉字，编码范围为：0x8140-0xfefe，所有的字符可以一一对应到UNICODE2.0中来。</font>
				</p>
				<p>
						<font size="2">    再次，对于放在操作系统中的.java源程序文件，在编译时，我们可以指定它内容的编码格式，具体来说用-encoding来指定。注意：如果源程序中含有中文字符，而你用-encoding指定为其它的编码字符，显然是要出错的。用-encoding指定源文件的编码方式为GBK或gb2312，无论我们在什么系统上编译含有中文字符的JAVA源程序都不会有问题，它都会正确地将中文转化为UNICODE存储在class文件中。<br />    <br />    然后，我们必须清楚，几乎所有的WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的，同时，几乎所有的浏览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以，虽然我们的Java源文件在出入口的地方指定了正确的编码方式，但其在容器内部运行时还是以ISO-8859- 1来处理的。<br /></font>
				</p>
		</span>
		<br />
		<!--StartFragment -->
		<font size="2"> </font>
		<span id="BlogViewId" be:sortmode="Normal" be:sortkey="" be:firsthandle="cns!AADDE4734A6787F!135" be:lasthandle="cns!AADDE4734A6787F!107">
				<font size="2">
						<strong>4、中文问题的分类及其建议最优解决办法</strong>
				</font>
				<p>
						<font size="2">    了解以上JAVA处理文件的原理之后，我们就可以提出了一套建议最优的解决汉字问题的办法。<br />    我们的目标是：我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的</font>
						<a href="http://www.pconline.com.cn/pcedu/soft/st/">
								<u>
										<font color="#0000ff" size="2">操作系统</font>
								</u>
						</a>
						<font size="2">中正确运行，或拿到其它操作系统中编译后能正确运行，能正确地传递中文和英文参数，能正确地和</font>
						<a href="http://www.pconline.com.cn/pcedu/empolder/db/">
								<u>
										<font color="#0000ff" size="2">数据库</font>
								</u>
						</a>
						<font size="2">交流中英文字符串。<br />    我们的具体思路是：在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。</font>
				</p>
				<p>
						<font size="2">    <strong>具体解决办法如下：</strong></font>
				</p>
				<p>
						<font size="2">  <strong>  1、 针对直接在console上运行的类</strong><br />    对于这种情况，我们建议在程序编写时，如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出，程序中应该采用字符流来处理输入和输出，具体来说，应用以下面向字符型节点流类型：<br />    对文件：FileReader，FileWrieter <br />        其字节型节点流类型为：FileInputStream，FileOutputStream<br />    对内存（数组）：CharArrayReader，CharArrayWriter<br />        其字节型节点流类型为：ByteArrayInputStream，ByteArrayOutputStream<br />    对内存（字符串）：StringReader，StringWriter<br />    对管道：PipedReader，PipedWriter<br />        其字节型节点流类型为：PipedInputStream，PipedOutputStream<br />    同时，应该用以下面向字符型处理流来处理输入和输出：<br />    BufferedWriter，BufferedReader<br />        其字节型的处理流为：BufferedInputeStream，BufferedOutputStream<br />    InputStreamReader，OutputStreamWriter<br />    其字节型的处理流为：DataInputStream，DataOutputStream<br />    其中InputStreamReader和InputStreamWriter用于将字节流按照指定的字符编码集转换到字符流，如：<br />    InputStreamReader in = new InputStreamReader(System.in，"GB2312")；<br />    OutputStreamWriter out = new OutputStreamWriter (System.out，"GB2312")；<br />    例如：采用如下的示例JAVA编码就达到了要求：</font>
				</p>
				<p>
						<font size="2">    //Read.java<br />    import java.io.*;<br />    public class Read {<br />    public static void main(String[] args) throws IOException {<br />    String str = "\n中文测试，这是内部硬编码的串"+"\ntest english character";<br />    String strin= "";<br />    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //设置输入接口按中文编码<br />    BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //设置输出接口按中文编码<br />    stdout.write("请输入:");<br />    stdout.flush();<br />    strin = stdin.readLine();<br />    stdout.write("这是从用户输入的串："+strin);<br />    stdout.write(str);<br />    stdout.flush();<br />    }}<br />    同时，在编译程序时，我们用以下方式来进行：<br />    javac -encoding gb2312 Read.java<br />    其运行结果如图5所示：<br /></font>
				</p>
				<p align="center">
						<font size="2">
								<img style="CURSOR: pointer" src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0405/pic/040508_java1.gif" _counted="undefined" />
						</font>
				</p>
				<p>
						<font size="2">    图5<br /><strong>2、 针对EJB类和不可以直接运行的支持类(如JavaBean类)</strong></font>
				</p>
				<p>
						<font size="2">    由于这种类它们本身被其它的类调用，不直接与用户交互，故对这种类来说，我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串（具体如上面一节中一样），同时，在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。</font>
				</p>
				<p>
						<br />
						<strong>
								<font size="2">    3、 针对Servlet类</font>
						</strong>
				</p>
				<p>
						<font size="2">    针对Servlet，我们建议用以下方法：（我建议将.java文件设置为UTF8编码的。当然如果是用Eclipse的话，只要设置下就是了。对于数据库，我以为编码最好设置为UTF8,便于国际化 。尽可能的使用UTF8码，  千里草）</font>
				</p>
				<p>
						<font size="2">    在编译Servlet类的源程序时，用-encoding指定编码为GBK或GB2312，且在向用户输出时的编码部分用response对象的 setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式，同样在接收用户输入时，我们用 request.setCharacterEncoding("GB2312")；这样无论我们的servlet类移植到什么操作系统中，只有客户端的浏览器支持中文显示，就可以正确显示。如下是一个正确的示例：</font>
				</p>
				<p>
						<font size="2">    //HelloWorld.java<br />    package hello;<br />    import java.io.*;<br />    import javax.servlet.*;<br />    import javax.servlet.http.*;<br />    public class HelloWorld extends HttpServlet<br />    {<br />    public void init() throws ServletException { }<br />    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException<br />    {<br />    request.setCharacterEncoding("GB2312"); //设置输入编码格式<br />    response.setContentType("text/html;charset=GB2312"); //设置输出编码格式<br />    PrintWriter out = response.getWriter(); //建议使用PrintWriter输出<br />    out.println("&lt;hr&gt;");<br />    out.println("Hello World! This is created by Servlet!测试中文!");<br />    out.println("&lt;hr&gt;");<br />    }<br />    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException<br />    {<br />    request.setCharacterEncoding("GB2312"); //设置输入编码格式<br />    response.setContentType("text/html;charset=GB2312"); //设置输出编码格式<br />    String name = request.getParameter("name");<br />    String id = request.getParameter("id");<br />    if(name==null) name="";<br />    if(id==null) id="";<br />    PrintWriter out = response.getWriter(); //建议使用PrintWriter输出<br />    out.println("&lt;hr&gt;");<br />    out.println("你传入的中文字串是：" + name);<br />    out.println("&lt;hr&gt;你输入的id是：" + id);<br />    out.println("&lt;hr&gt;");<br />    }<br />    public void destroy() { }<br />    }<br />        请用javac -encoding gb2312 HelloWorld.java来编译此程序。<br />        测试此Servlet的程序如下所示：<br />    &lt;%@page contentType="text/html; charset=gb2312"%&gt;<br />    &lt;%request.setCharacterEncoding("GB2312");%&gt;<br />    &lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;/title&gt;<br />    &lt;Script language="JavaScript"&gt;<br />    function Submit() {<br />    //通过URL传递中文字符串值给Servlet<br />    document.base.action = "./HelloWorld?name=中文";<br />    document.base.method = "POST";<br />    document.base.submit();<br />    }<br />    &lt;/Script&gt;<br />    &lt;/head&gt;</font>
				</p>
				<p>
						<font size="2">&lt;body bgcolor="#FFFFFF" text="#000000" topmargin="5"&gt;<br />    &lt;form name="base" method = "POST" target="_self"&gt;<br />    &lt;input name="id" type="text" value="" size="30"&gt;<br />    &lt;a href = "JavaScript:Submit()"&gt;传给Servlet&lt;/a&gt;<br />    &lt;/form&gt;&lt;/body&gt;&lt;/html&gt;<br />    其运行结果如图6所示：<br /></font>
				</p>
				<p>
						<font size="2">
						</font>
				</p>
				<p align="center">
						<font size="2">
								<img src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0405/pic/040508_java2.gif" />
						</font>
				</p>
				<p>
						<font size="2">    图6<br /> <strong>   4、 JAVA程序和数据库之间</strong></font>
				</p>
				<p>
						<font size="2">    为避免JAVA程序和数据库之间数据传递出现乱码现象，我们建议采用以下最优方法来处理：<br />    1、 对于JAVA程序的处理方法按我们指定的方法处理。<br />    2、 把数据库默认支持的编码格式改为GBK或GB2312的。</font>
				</p>
				<p>
						<font size="2">    如：在mysql中，我们可以在配置文件my.ini中加入以下语句实现：<br />    在[mysqld]区增加：<br />    default-character-set=gbk<br />    并增加：<br />    [client]<br />    default-character-set=gbk<br />    在SQL Server2K中，我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。</font>
				</p>
				<p>
						<strong>
								<font size="2">    5、 针对JSP代码</font>
						</strong>
				</p>
				<p>
						<font size="2">    由于JSP是在运行时，由WEB容器进行动态编译的，如果我们没有指定JSP源文件的编码格式，则JSP编译器会获得服务器操作系统的 file.encoding值来对JSP文件编译的，它在移植时最容易出问题，如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行，尽管客户端都是一样的，那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的（在中文wink中的file.encoding和在英文 Linux中file.encoding是不同的，且英文Linux的file.encoding对中文不支持，所以编译出来的JSP类就会有问题）。</font>
						<a href="http://www.pconline.com.cn/pcedu/soft/lan/jywgl/">
								<u>
										<font color="#0000ff" size="2">网络</font>
								</u>
						</a>
						<font size="2">上讨论的大多数是此类问题，多是因为JSP文件移植平台时不能正确显示的问题，对于这类问题，我们了解了JAVA中程序编码转换的原理，解决起来就容易多了。我们建议的解决办法如下：</font>
				</p>
				<p>
						<font size="2">    1、我们要保证JSP向客户端输出时是采用中文编码方式输出的，即无论如何我们首先在我们的JSP源代编中加入以下一行：</font>
				</p>
				<p>
						<font size="2">    &lt;</font>
						<a href="mailto:%@page">
								<u>
										<font color="#0000ff" size="2">%@page</font>
								</u>
						</a>
						<font size="2"> contentType="text/html; charset=gb2312"%&gt;<br />    2、为了让JSP能正确获得传入的参数，我们在JSP源文件头加入下面一句：<br />    &lt;%request.setCharacterEncoding("GB2312");%&gt;<br />    3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件，我们需要在JSP源文件中指定我们的JSP源文件的编码格式，具体来说，我们在JSP源文件头上加入下面的一句即可：<br />    &lt;</font>
						<a href="mailto:%@page">
								<u>
										<font color="#0000ff" size="2">%@page</font>
								</u>
						</a>
						<font size="2"> pageEncoding="GB2312"%&gt;或&lt;</font>
						<a href="mailto:%@page">
								<u>
										<font color="#0000ff" size="2">%@page</font>
								</u>
						</a>
						<font size="2"> pageEncoding="GBK"%&gt;<br />    这是JSP规范2.0新增加的指令。<br />    我们建议使用此方法来解JSP文件中的中文问题，下面的代码是一个正确做法的JSP文件的测试程序：</font>
				</p>
				<p>
						<font size="2">//testchinese.jsp<br />    &lt;%@page pageEncoding="GB2312"%&gt;<br />    &lt;%@page contentType="text/html; charset=gb2312"%&gt;<br />    &lt;%request.setCharacterEncoding("GB2312");%&gt;<br />    &lt;%<br />    String action = request.getParameter("ACTION");<br />    String name = "";<br />    String str = "";<br />    if(action!=null &amp;&amp; action.equals("SENT"))<br />    {<br />    name = request.getParameter("name");<br />    str = request.getParameter("str");<br />    }<br />    %&gt;<br />    &lt;html&gt;<br />    &lt;head&gt;<br />    &lt;title&gt;&lt;/title&gt;<br />    &lt;Script language="JavaScript"&gt;<br />    function Submit()<br />    {<br />    document.base.action = "?ACTION=SENT&amp;str=传入的中文";<br />    document.base.method = "POST";<br />    document.base.submit();<br />    }<br />    &lt;/Script&gt;<br />    &lt;/head&gt;<br />    &lt;body bgcolor="#FFFFFF" text="#000000" topmargin="5"&gt;<br />    &lt;form name="base" method = "POST" target="_self"&gt;<br />    &lt;input type="text" name="name" value="" size="30"&gt;<br />    &lt;a href = "JavaScript:Submit()"&gt;提交&lt;/a&gt;<br />    &lt;/form&gt;<br />    &lt;%<br />    if(action!=null &amp;&amp; action.equals("SENT"))<br />    {<br />    out.println("&lt;br&gt;你输入的字符为："+name);<br />    out.println("&lt;br&gt;你通过URL传入的字符为："+str);<br />    }<br />    %&gt;<br />    &lt;/body&gt;<br />    &lt;/html&gt;<br />    如图7是此程序运行的结果示意图：<br /></font>
				</p>
				<p>
						<font size="2">
						</font>
				</p>
				<p align="center">
						<font size="2">
								<img src="http://www.pconline.com.cn/pcedu/empolder/gj/java/0405/pic/040508_java3.gif" />
						</font>
				</p>
				<p>
						<font size="2">    图7</font>
				</p>
				<p>
						<strong>
								<font size="2">    5、总结</font>
						</strong>
				</p>
				<p>
						<font size="2">    在上面的详细分析中，我们清晰地给出了JAVA在处理源程序过程中的详细转换过程，为我们正确解决JAVA编程中的中文问题提供了基础。同时，我们给出了认为是最优的解决JAVA中文问题的办法。</font>
				</p>
		</span>
		<!--StartFragment -->
		<font size="2">
				<span id="BlogViewId" be:sortmode="Normal" be:sortkey="" be:firsthandle="cns!AADDE4734A6787F!135" be:lasthandle="cns!AADDE4734A6787F!107">
						<strong>
								<font color="#000000">
										<u>我的补充（需要特别注意）： 在表单（form ）提交时，如果提交的方法为get，那么request.setCharacterEncoding() 是不起作用的。此时在服务器端得到的字符编码仍然是ISO8859-1，而不是你设置的编码。所以一般我们在提交数据时，尽量使用post方法，此时 request.setCharacterEncoding()方法起效。<br /></u>
								</font>
						</strong>
				</span>
				<br />
				<!--StartFragment --> 如果非要使用get方法传form则要转换一下才行： <br />  -----   <br />  &lt;%@   page   contentType="text/html;charset=gb2312"%&gt;   <br />  &lt;%!   <br />          public   String   getStr(String   str){   <br />  try{   <br />  String   temp_p=str;   <br />  byte[]   temp_t=temp_p.getBytes("ISO8859-1");   <br />  String   temp=new   String(temp_t);   <br />  return   temp;   <br />  }   <br />  catch(Exception   e){   <br />  }   <br />  return   "null";   <br />    }   <br />    %&gt;   <br />  然后把String   userId=request.getParameter("userId");改成   <br />  String   userId=getStr(request.getParameter("userId"));   <br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />我来说一下tomcat如何实现JSP的你就明白了。<br />预备知识：<br />　1.字节和unicode<br />　　Java内核是unicode的，就连class文件也是，但是很多媒体，包括文件/流的保存方式<br />　　是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的，而byte是字节.<br />　　Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度，<br />　　可以用来告诉你，你用的Convertor。其中两个很常用的静态函数是<br />　　 public static ByteToCharConverter getDefault() ;<br />　　 public static ByteToCharConverter getConverter(String encoding);<br />　　如果你不指定converter，则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用<br />　　8859_1<br />　　<br />　　我们来就一个简单的例子：<br />　　　　　"你"的gb码是：0xC4E3 ,unicode是0x4F60<br />　　　　　你用:<br />　　　　　--encoding="gb2312";<br />　　　　　--byte b[]={(byte)'\u00c4',(byte)'\u00E3'};<br />　　　　　--convertor=ByteToCharConverter.getConverter(encoding);<br />　　　　　--char [] c=converter.convertAll(b);<br />　　　　　--for(int i=0;i&lt;c.length;c++)<br />　　　　　--{<br />　　　　　-- System.out.println(Integer.toHexString(c[i]));<br />　　　　　--}<br />　　　　　--打印出来是0x4F60<br />　　　　　--但是如果使用8859_1的编码，打印出来是<br />　　　　　--0x00C4,0x00E3<br />　　　　　----例１<br />　　　　 反过来：<br />　　　　  --encoding="gb2312";<br />　　　　  --char c[]={'\u4F60'};<br />　　　　　--convertor=ByteToCharConverter.getConverter(encoding);<br />　　　　　--byte [] b=converter.convertAll(c);<br />　　　　　--for(int i=0;i&lt;b.length;c++)<br />　　　　　--{<br />　　　　　-- System.out.println(Integer.toHexString(b[i]));<br />　　　　　--}<br />　　　　　　--打印出来是：0xC4,0xE3<br />　　　　　　----例２<br />　　　　　　--如果用8859_1就是0x3F，?号，表示无法转化　　　　　　--<br />　　　　　 很多中文问题就是从这两个最简单的类派生出来的。而却有很多类　　<br />　　不直接支持把Encoding输入，这给我们带来诸多不便。很多程序难得用encoding<br />　　了，直接用default的encoding，这就给我们移植带来了很多困难<br />　　--<br />　　2.UTF-8<br />　　--UTF-8是和Unicode一一对应的，其实现很简单<br />　　--<br />　　-- 7位的Unicode: 0 _ _ _ _ _ _ _<br />　　--11位的Unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _<br />　　--16位的Unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _<br />　　--21位的Unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _<br />　　--大多数情况是只使用到16位以下的Unicode:<br />　　--"你"的gb码是：0xC4E3 ,unicode是0x4F60<br />　　--我们还是用上面的例子<br />　　--　　--例１：0xC4E3的二进制：<br />　　--　　--　　　 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1<br />　　--　　--　　　 由于只有两位我们按照两位的编码来排，但是我们发现这行不通，<br />　　--　　--　　　 因为第７位不是0因此，返回"?"<br />　　--　　--　　　 <br />　　--　　--例２：0x4F60的二进制：<br />　　--　　--　　　 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 <br />　　--　　--　　　 我们用UTF-8补齐，变成：<br />　　--　　--　　　 11100100 10111101 10100000<br />　　--　　--　　　 E4--BD-- A0<br />　　--　　--　　　 于是返回0xE4,0xBD,0xA0<br />　　--　　--<br />　　3.String和byte[]<br />　　--String其实核心是char[],然而要把byte转化成String，必须经过编码。<br />　　--String.length()其实就是char数组的长度，如果使用不同的编码，很可<br />　　--能会错分，造成散字和乱码。<br />　　--例：<br />　　----byte [] b={(byte)'\u00c4',(byte)'\u00e3'};<br />　　----String str=new String(b,encoding);　　----<br />　　----如果encoding=8859_1，会有两个字，但是encoding=gb2312只有一个字　　----<br />　　--这个问题在处理分页是经常发生<br />　　4.Reader,Writer/InputStream,OutputStream<br />　　--Reader和Writer核心是char，InputStream和OutputStream核心是byte。<br />　　--但是Reader和Writer的主要目的是要把Char读/写InputStream/OutputStream<br />--一个reader的例子：<br />--文件test.txt只有一个"你"字，0xC4,0xE3--<br />--String encoding=;<br />--InputStreamReader reader=new InputStreamReader(<br />----new FileInputStream("text.txt"),encoding);<br />--char []c=new char[10];<br />--int length=reader.read(c);<br />--for(int i=0;i&lt;c.length;i++)<br />----System.out.println(c[i]);<br />　　--如果encoding是gb2312，则只有一个字符，如果encoding=8859_1，则有两个字符<br />　　--------<br />--<br />--<br />　　<br />　　 ----<br />　2.我们要对Java的编译器有所了解：<br />　--javac -encoding<br />　 我们常常没有用到ENCODING这个参数。其实Encoding这个参数对于跨平台的操作是很重要的。<br />　 如果没有指定Encoding，则按照系统的默认Encoding,gb平台上是gb2312，英文平台上是ISO8859_1。　 <br />　--Java的编译器实际上是调用sun.tools.javac.Main的类，对文件进行编译，这个类　--<br />　有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。<br />　编译器就是根据这个变量来读取java文件的，然后把用UTF-8形式编译成class文件。<br />　一个例子：<br />　--public void test()<br />　--{<br />　----String str="你";<br />　----FileWriter write=new FileWriter("test.txt");<br />　----write.write(str);<br />　----write.close();<br />　--}<br />　----例３<br />--如果用gb2312编译，你会找到E4 BD A0的字段<br />--<br />--如果用8859_1编译，<br />--00C4 00E3的二进制：<br />--00000000 11000100 00000000 11100011--<br />--因为每个字符都大于7位，因此用11位编码：<br />--11000001 10000100 11000011 10100011 <br />--C1-- 84--　C3--　 A3<br />--你会找到C1 84 C3 A3 --<br />　　　　<br />　　但是我们往往忽略掉这个参数，因此这样往往会有跨平台的问题：<br />　　--　　例３在中文平台上编译，生成ZhClass<br />　　--　　例３在英文平台上编译，输出EnClass<br />　　--1.　 ZhClass在中文平台上执行OK,但是在英文平台上不行<br />　　--2.　 EnClass在英文平台上执行OK,但是在中文平台上不行<br />　　原因：<br />　--1.在中文平台上编译后，其实str在运行态的char[]是0x4F60,　----<br />　--在中文平台上运行，FileWriter的缺省编码是gb2312,因此<br />　--CharToByteConverter会自动用调用gb2312的converter,把str转化<br />　--成byte输入到FileOutputStream中，于是0xC4,0xE3放进了文件。<br />　--但是如果是在英文平台下，CharToByteConverter的缺省值是8859_1,<br />　--FileWriter会自动调用8859_1去转化str,但是他无法解释，因此他会<br />　--输出"?"　----<br />　--2.　在英文平台上编译后，其实str在运行态的char[]是0x00C4 0x00E3,　----<br />　--在中文平台上运行，中文无法识别，因此会出现??<br />　--　　在英文平台上，0x00C4--&gt;0xC4,0x00E3-&gt;0xE3，因此0xC4,0xE3被放进了<br />　--文件<br />----<br />1.对于JSP正文的解释：<br />--Tomcat首先看一下你的叶面中有没有"&lt;</font>
		<a href="mailto:%@page">
				<font size="2">%@page</font>
		</a>
		<font size="2"> include的符号。有，则在相同<br />--地方设定response.setContentType(..);按照encoding的来读，没有他按照8859_1<br />--读取文件，然后用UTF-8写成.java文件，然后用sun.tools.Main去读取这个文件，<br />--（当然它使用UTF-8去读），然后编译成class文件<br />--setContentType改变的是out的属性，out变量缺省的encoding是8859_1<br />2.对Parameter的解释<br />--很不幸Parameter只有ISO8859_1的解释，这个质料可以在servlet的实现代码中找到。<br />3.对include的解释<br />格式的，但是很不幸，由于那个写"org.apache.jasper.compiler.Parser"的人<br />在数组JspUtil.ValidAttribute[]忘记加了一个参数：encoding,因此导致不支<br />持这种方式。你完全可以编译源代码，加上对encoding的支持<br />总结：<br />如果你在NT底下，最简单的方法就是欺骗java,不加任何Encoding变量：<br />&lt;html&gt;<br />你好&lt;%=request.getParameter("value")%&gt;<br />&lt;/html&gt;<br /></font>
		<a href="http://localhost/test/test.jsp?value">
				<font size="2">http://localhost/test/test.jsp?value</font>
		</a>
		<font size="2">=你<br />结果:你好你<br />但这种方法局限性较大，比如对上传的文章分段，这样的做法是死定的，最好的<br />解决方案是用这种方案：<br />&lt;%@ page contentType="text/html;charset=gb2312" %&gt;<br />&lt;html&gt;<br />你好&lt;%=new String(request.getParameter("value").getBytes("8859_1"),"gb2312")%&gt;<br />&lt;/html&gt; </font>
		<div>
				<div>
						<br />
						<font size="2">&lt;select name="account.accountId" &gt;<br />    &lt;OPTION value="&lt;%=account.getAccountId()%&gt;"&gt;我的日志&lt;/OPTION&gt;<br />    &lt;OPTION value=""&gt;所有日志&lt;/OPTION&gt;<br />    &lt;OPTION &lt;%=s%&gt; value="&lt;%=a.getAccountId()%&gt;"&gt;&lt;%=a.getAccountName()%&gt;&lt;/OPTION&gt;<br />   &lt;/select&gt;</font>
				</div>
		</div>
<img src ="http://www.blogjava.net/momoJava/aggbug/175092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/momoJava/" target="_blank">风之殇</a> 2008-01-14 10:25 <a href="http://www.blogjava.net/momoJava/articles/175092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(二)Spring的IOC容器管理</title><link>http://www.blogjava.net/momoJava/articles/159976.html</link><dc:creator>风之殇</dc:creator><author>风之殇</author><pubDate>Thu, 15 Nov 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/momoJava/articles/159976.html</guid><wfw:comment>http://www.blogjava.net/momoJava/comments/159976.html</wfw:comment><comments>http://www.blogjava.net/momoJava/articles/159976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/momoJava/comments/commentRss/159976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/momoJava/services/trackbacks/159976.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">一  .  对于Spring的容器管理,首先得知道什么是容器管理.<br /><br />          java是一门面向对象的语言,在代码里,粗略的讲一个对象的体现就是一个类(class)的实例.也可以说就是一个JavaBean.在一个实际工程中,像这样的对象或实例会存在很多,并且每个对象的状态,作用范围,以及它们之间的关系(在Spring中为依赖)是很复杂的,所以要管理它们也是很大的开销.而在spring中,对与它们的管理就是容器管理.你可以看作容器就是这些bean的集合. 管理的方面主要有bean的创建,周期(作用域)和初始属性(注入),以及bean之间相互依赖的关系等.用比较专业的话就是------管理对象对其进行实例化、配置以及组装.<br />                   <img height="296" alt="SpringConrainer.jpg" src="http://www.blogjava.net/images/blogjava_net/momojava/SpringConrainer.jpg" width="498" border="0" /><br />                                                                                                                                                      Spring IoC 容器</font>
		</p>
		<p>
				<font size="2">二 .  容器的运作.<br />                  在Spring包的有两个很重要的东西,<font face="Courier New">org.springframework.beans</font>及<tt class="literal">org.springframework.context</tt>包,这两个包是IOC的基础包,自然也是运行IOC容器的关键.而其中关键的关键就是分别在两个包里的<font face="Courier New">BeanFactory</font>和<font face="Courier New">ApplicationContext,其中BeanFactory</font>提供了配制框架及基本功能,  而</font>
				<font face="Courier New" size="2">ApplicationContext则是它的扩展,这个扩展是针对企业级别的,当中加入很多了企业级的支持,功能得到了进一步增强，比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicartionContext).<br />    1 . 实例化容器:<br />       在项目工程中用于实例化容器的类一般都是ApplicationContext以及他的扩展WebApplicationContext,当然BeanFactory也能用.<br />       在代码中一般是:</font>
		</p>
		<pre class="programlisting">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 223px; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />//1.<br /><span style="COLOR: #000000"> Resource resource </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileSystemResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">beans.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BeanFactory factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> XmlBeanFactory(resource);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />//2.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ClassPathResource resource </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ClassPathResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">beans.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BeanFactory factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> XmlBeanFactory(resource);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />//3.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ApplicationContext context </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ClassPathXmlApplicationContext(<br /><img id="Codehighlighter1_332_389_Open_Image" onclick="this.style.display='none'; Codehighlighter1_332_389_Open_Text.style.display='none'; Codehighlighter1_332_389_Closed_Image.style.display='inline'; Codehighlighter1_332_389_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_332_389_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_332_389_Closed_Text.style.display='none'; Codehighlighter1_332_389_Open_Image.style.display='inline'; Codehighlighter1_332_389_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String[]</span><span id="Codehighlighter1_332_389_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">applicationContext.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">applicationContext-part2.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> of course, an ApplicationContext is just a BeanFactory</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BeanFactory factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (BeanFactory) context;  <br />//4.                   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ApplicationContext context = new FileSystemXmlApplicationContext("src\\beans.xml<font face="Times New Roman" size="2">");</font></span></div>
		</pre>
		<p class="programlisting">
				<font face="Times New Roman">           <font size="2">  实际的项目中,上述的实例化方法一般都是用于非Web工程(c/s)或者测试代码中而在web工程内一般用的是ApplicationContext,实例化它只是在web配置文件(web.xml)里写入配置信息: <br /></font>               </font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> &lt;!--         必须                --&gt;<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">context</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">contextConfigLocation</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;/</span><span style="COLOR: #000000">WEB</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">INF</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">daoContext.xml </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">WEB</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">INF</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">applicationContext.xml</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">context</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />    &lt;!--         下面的listener 和 servlet 是两个相同效果的配置 ,只能选其一,只是listener 不能在与Servlet 2.2兼容的web容器中使用,<br />                  但在都可用的情况下,官方推崇首选 listener    --&gt;<br /><br /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">org.springframework.web.context.ContextLoaderListener</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">listener</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> or use the ContextLoaderServlet instead of the above listener     --&gt;<br /><br /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">context</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">org.springframework.web.context.ContextLoaderServlet</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">load</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">on</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">startup</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">load</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">on</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">startup</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
		<p class="programlisting">         <font size="2">2</font><font size="2"><font face="Courier New">. 容器的使用:<br /></font>            一般这是在代码级创建了IOC容器后(就是上述的(1)),或者是获得了容器的"引用"后用(这里其实是beanFactory和ApplicationContext的实现类的引用 如:);</font></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 46px; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">InputStream is </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> FileInputStream(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">beans.xml</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BeanFactory factory </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> XmlBeanFactory(is);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p class="programlisting">   </p>
		<ol>
				<li>
						<tt class="methodname">
								<font size="3">boolean containsBean(String)</font>
						</tt>：如果<tt class="interfacename"><font size="3">BeanFactory</font></tt>包含给定名称的bean定义(或bean实例)，则返回true</li>
				<li>
						<tt class="methodname">
								<font size="3">Object getBean(String)</font>
						</tt>：返回以给定名字注册的bean实例。根据bean的配置情况，如果为singleton模式将返回一个共享的实例，否则将返回一个新建的实例。如果没有找到指定的bean，该方法可能会抛出<tt class="exceptionname"><font size="3">BeansException</font></tt>异常(实际上将抛出<tt class="exceptionname"><font size="3">NoSuchBeanDefinitionException</font></tt>异常)，在对bean进行实例化和预处理时也可能抛出异常</li>
				<li>
						<tt class="methodname">
								<font size="3">Object getBean(String, Class)</font>
						</tt>：返回以给定名称注册的bean实例，并转换为给定class类型的实例，如果转换失败，相应的异常(<tt class="exceptionname"><font size="3">BeanNotOfRequiredTypeException</font></tt>)将被抛出。上面的<tt class="methodname"><font size="3">getBean(String)</font></tt>方法也适用该规则。</li>
				<li>
						<tt class="methodname">
								<font size="3">Class getType(String name)</font>
						</tt>：返回给定名称的bean的<tt class="classname"><font size="3">Class</font></tt>。如果没有找到指定的bean实例，则抛出<tt class="exceptionname"><font size="3">NoSuchBeanDefinitionException</font></tt>异常。</li>
				<li>
						<tt class="methodname">
								<font size="3">boolean isSingleton(String)</font>
						</tt>：判断给定名称的bean定义(或bean实例)是否为singleton模式，如果bean没找到，则抛出<tt class="exceptionname"><font size="3">NoSuchBeanDefinitionException</font></tt>异常。</li>
				<li>
						<tt class="methodname">
								<font size="3">String[] getAliases(String)</font>
						</tt>：返回给定bean名称的所有别名。</li>
		</ol>
		<p>     上面六点,都是在BeanFactory中的基本和一些简单的用法,但在将其扩展后了的ApplicationContext中加入了企业级的功能,比如国际化,资源访问等,这些我将在学习Spring<br />      XML格式的元数据配置中学习.<br /></p>
		<p>    三  .  配置元数据<br />           我自己的理解: 配置元数据的作用就是Spring管理Bean对象关系和资源文件的"规章制度",它是告诉IOC容器如何去组织对象和对象之间的关系是怎样的.<br />           目前,Spring支持三种配置元数据格式：XML格式、Java属性文件格式或使用Spring公共API编程实现。很显然,XML是现在最方便和容易编写的配置元数据.<br />        <font size="2">在Spring的XMl配置元数据格式为:<br />           </font></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;?</span>
				<span style="COLOR: #000000">xml version</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">1.0</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> encoding</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">UTF-8</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">?&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">beans xmlns</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">http://www.springframework.org/schema/beans</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       xmlns:xsi</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">http://www.w3.org/2001/XMLSchema-instance</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       xsi:schemaLocation</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">http:</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">www.springframework.org/schema/beans </span>
				<span style="COLOR: #008000; TEXT-DECORATION: underline">http://www.springframework.org/schema/beans/spring-beans-2.0.xsd</span>
				<span style="COLOR: #008000">"&gt;</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"XXX</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"XXX</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;!--</span>
				<span style="COLOR: #000000"> collaborators and configuration </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000"> bean go here </span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"XXX</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">="XXX</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;!--</span>
				<span style="COLOR: #000000"> collaborators and configuration </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000"> bean go here </span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #000000">&lt;!--</span>
				<span style="COLOR: #000000"> more bean definitions go here</span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">beans</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<p>              到此,理解了什么是Spring,以及它在工程中的基本框架,下面着重学习的就是它的依赖注入和AOP技术的运用,学习是如何在XML元数据中进行配置.<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p>
<img src ="http://www.blogjava.net/momoJava/aggbug/159976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/momoJava/" target="_blank">风之殇</a> 2007-11-15 16:43 <a href="http://www.blogjava.net/momoJava/articles/159976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>时尚的</title><link>http://www.blogjava.net/momoJava/archive/2007/11/12/159541.html</link><dc:creator>风之殇</dc:creator><author>风之殇</author><pubDate>Mon, 12 Nov 2007 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/momoJava/archive/2007/11/12/159541.html</guid><wfw:comment>http://www.blogjava.net/momoJava/comments/159541.html</wfw:comment><comments>http://www.blogjava.net/momoJava/archive/2007/11/12/159541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/momoJava/comments/commentRss/159541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/momoJava/services/trackbacks/159541.html</trackback:ping><description><![CDATA[             都说 用C语言的程序员是厉害的;用Delphi的程序员是聪明的;用.net的程序员是务实的;那Java呢?<br />             我说: 用Java的程序员是时尚的.<br />             虽然Java没C那么高深和[偏向底层;虽然java没Delphi开发的那么迅速;虽然Java没有.net那么的贴近windows; 但是:它有很强的移植性,纯粹的面向对象,以及适应企业的分布式开发.而且在短短的十几年间它发展的如此迅速,随着学习和用它的人越来越多,它的发展更加的快速和全面,所以我所用Java的程序员是时尚的.嘿嘿,瞎说一阵,希望大家不要见意啊.^_^ <img height="19" src="http://www.blogjava.net/Emoticons/74_74.gif" width="19" border="0" /><img src ="http://www.blogjava.net/momoJava/aggbug/159541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/momoJava/" target="_blank">风之殇</a> 2007-11-12 13:36 <a href="http://www.blogjava.net/momoJava/archive/2007/11/12/159541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>