﻿<?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-raekwon</title><link>http://www.blogjava.net/raekwon/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:08:43 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:08:43 GMT</pubDate><ttl>60</ttl><item><title>struts的中文乱码问题</title><link>http://www.blogjava.net/raekwon/archive/2006/10/16/75329.html</link><dc:creator>raekwon</dc:creator><author>raekwon</author><pubDate>Sun, 15 Oct 2006 16:46:00 GMT</pubDate><guid>http://www.blogjava.net/raekwon/archive/2006/10/16/75329.html</guid><wfw:comment>http://www.blogjava.net/raekwon/comments/75329.html</wfw:comment><comments>http://www.blogjava.net/raekwon/archive/2006/10/16/75329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raekwon/comments/commentRss/75329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raekwon/services/trackbacks/75329.html</trackback:ping><description><![CDATA[
		<p>
				<span class="myp111">
						<font id="zoom" size="2">本篇我们来讨论一下struts的国际化编程问题，即所谓的i18n编程问题，这一篇我们讨论其基础部分。与这个问题紧密相关的是在各java论坛中被频繁提及的中文乱码问题，因为，英、美编程人员较少涉及到中文乱码问题，因此，这方面的英文资料也是非常奇缺的，同时也很少找到这方面比较完整的中文资料，本文也尝试对中文乱码问题做一些探讨。要解决上述问题，需要有一定的字符集方面的知识，下面，我们就先介绍字符集的有关情况： <br /><br /><strong>一、从ASCII到Unicode（UTF-8）</strong><br /><br />电子计算机技术是从美国开始发展起来的，因为美国使用的文字为英文，美国规定的计算机信息交换用的字符编码集是人们熟知的扩展ASCII码，它以8bit字节为单位存储，ASCII的0-31及127为控制符，32-126为可见字符，包括所有的英文字母，阿拉伯数字和其他一些常见符号，128-255的ASCII码则没有定义。 <br /><br />ASCII对英语国家是够用了，但对其他西欧国家却不够用，因此，人们将ASCII扩展到0-255的范围，形成了ISO-8859-1字符集。值得一提的是，因为考虑到程序中处理的信息大多是西文信息，因此有些WEB容器（如：Tomcat4.x）在处理所接收到的request字符串时，如果您没指定request的编码方式则系统就缺省地采用ISO-8859-1，明白这一点对理解后面的问题会有帮助。 <br /><br />相比西方的拼音文字，东方的文字（如中文）的字符数要大得多，根本不可能在一个字节内将它们表示出来，因此，它们以两个字节为单位存储，以中文国标字符集GB2312为例，它的第一个字节为128-255。系统可以据此判断，若第一个字节大于127，则把与该字节后紧接着的一个字节结合起来共两个字节组成一个中文字符。这种由多个字节存储一个字符的字符集叫多字节字符集（MultiByte Charsets），对应的象ASCII这种用一个字节存储一个字符的字符集叫单字节字符集（SingleByte Charsets）。在GB2312字符集中，ASCII字符仍然用一个字节存储，换句话说该ASCII是该字符集的子集。 <br /><br />GB2312只包含数千个常用汉字，往往不能满足实际需要，因此，人们对它进行扩展，这就有了我们现在广泛使用的GBK字符集，GBK是现阶段Windows及其他一些中文操作系统的缺省字符集。它包含2万多个字符，除了保持和GB2312兼容外，还包含繁体中文字，日文字符和朝鲜字符。值得注意的是GBK只是一个规范而不是国家标准，新的国家标准是GB18030-2000，它是比GBK包含字符更多的字符集。 <br /><br />我国的台湾地区使用的文字是繁体字，其字符集是BIG5，而日本采用的字符集则是SJIS。它们的编码方法与GB2312类似，它们的ASCII字符部分是兼容的，但扩展部分的编码则是不兼容的，比如这几种字符集中都有"中文"这两个字符，但他们在各自的字符集中的编码并不相同，这就是用GB2312写成的网页用BIG5浏览时，看到的是乱糟糟的信息的原因。 <br /><br />可见，在字符集的世界里，呈现给我们的是一个群雄割据的局面，各字符集拥有一块自己的地盘。这给各国和各地区交换信息带来了很大的困难，同时，也给国际化（本地化）编程造成了很大的麻烦。 <br /><br />常言道："分久必合"，随着国际标准ISO10646定义的通用字符集（Universal Character Set即UCS）的出现，使这种局面发生了彻底的改观。UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息。UCS 包含了用于表达所有已知语言的字符。不仅包括拉丁语、希腊语、 斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语和乔治亚语的描述、还包括中文、 日文和韩文这样的象形文字、 以及平假名、片假名、 孟加拉语、 旁遮普语果鲁穆奇字符(Gurmukhi)、 泰米尔语、印.埃纳德语(Kannada)、Malayalam、泰国语、 老挝语、 汉语拼音(Bopomofo)、Hangul、 Devangari、Gujarati、Oriya、Telugu 以及其他数也数不清的语。对于还没有加入的语言， 由于正在研究怎样在计算机中最好地编码它们， 因而最终它们都将被加入。 <br /><br />ISO 10646 定义了一个 31 位的字符集。 然而， 在这巨大的编码空间中， 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD)。 这个 UCS 的 16位子集称为 基本多语言面 (Basic Multilingual Plane, BMP)。 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字)， 且只有专家在历史和科学领域里才会用到它们。 <br /><br />UCS 不仅给每个字符分配一个代码， 而且赋予了一个正式的名字。 表示一个 UCS 值的十六进制数， 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A"。 UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的， U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的。这里要注意的是它是以16bit为单位存储，即便对字母"A"也是用16bit，这是与前面介绍的所有字符集不同的地方。 <br /><br />历史上，在国际标准化组织研究ISO10646标准的同时，另一个由多语言软件制造商组成的协会也在从事创立单一字符集的工作，这就是现在人们熟知的Unicode。幸运的是，1991年前后ISO10646和Unicode的参与者都认识到，世界上不需要两个不同的单一字符集。他们合并双方的工作成果，并为创立单一编码表而协同工作。两个项目仍都存在并独立地公布各自的标准，都同意保持ISO10646和Unicode的码表兼容，并紧密地共同调整任何未来的扩展。这与当年在PC机上的操作系统MS-dos与PC-dos的情形有些相象。后面，我们将视ISO10646和Unicode为同一个东西。 <br /><br />有了Unicode，字符集问题接近了完美的解决，但不要高兴得过早。由于历史的原因：一些操作系统如：Unix、Linux等都是基于ASCII设计的。此外，还有一些数据库管理系统软件如：Oracle等也是围绕ASCII来设计的(从其8i的白皮书上介绍的设置系统字符集和字段的字符集中可以间接地看到这一点)。在这些系统中直接用Unicode会导致严重的问题。用这些编码的字符串会包含一些特殊的字符， 比如 '\0' 或 '/'， 它们在 文件名和其他 C 库函数参数里都有特别的含义。 另外， 大多数使用 ASCII 文件的 UNIX 下的工具， 如果不进行重大修改是无法读取 16 位的字符的。 基于这些原因， 在文件名, 文本文件, 环境变量等地方，直接使用Unicode是不合适的。 <br /><br />在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 （Unicode Transformation Form 8-bit form）编码没有这些问题。 <br /><br />UTF-8 有以下一些特性： <br /><br />UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容)。 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的。 <br /><br />所有 &gt;U+007F 的 UCS 字符被编码为一个多个字节的串， 每个字节都有标记位集。 因此，ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分。 <br /><br />表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节。 多字节串的其余字节都在 0x80 到 0xBF 范围里。 这使得重新同步非常容易， 并使编码无国界，且很少受丢失字节的影响。 </font>
				</span>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<p>
				<span class="myp111">
						<font size="2">
						</font>
				</span>
		</p>
		<p>
				<font size="2">
						<span class="myp111">UTF-8 编码字符理论上可以最多到 6 个字节长， 然而 16 位 BMP 字符最多只用到 3 字节长。 <br /><br />字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到。 <br /><br />通过，UTF-8这种形式，Unicode终于可以广泛的在各种情况下使用了。在讨论struts的国际化编程之前，我们先来看看我们以前在jsp编程中是怎样处理中文问题以及我们经常遇到的：</span>
				</font>
		</p>
		<p>
				<span class="myp111">
						<font size="2">
						</font>
				</span>
		</p>
		<p>
				<span class="myp111">
						<font size="2">
						</font>
				</span>
		</p>
		<p>
				<span class="myp111">
						<span class="myp111">
								<font id="zoom">
										<font size="2">
												<strong>二、中文字符乱码的原因及解决办法</strong>
												<br />
												<br />java的内核是Unicode的，也就是说，在程序处理字符时是用Unicode来表示字符的，但是文件和流的保存方式是使用字节流的。在java的基本数据类型中，char是Unicode的，而byte是字节，因此，在不同的环节java要对字节流和char进行转换。这种转换发生时如果字符集的编码选择不当，就会出现乱码问题。 <br /><br />我们常见的乱码大致有如下几种情形： <br />1、汉字变成了问号"？" <br />2、有的汉字显示正确，有的则显示错误 <br />3、显示乱码（有些是汉字但并不是你预期的） <br />4、读写数据库出现乱码 <br /><br />下面我们逐一对它们出现的原因做一些解释： <br /><br />首先，我们讨论汉字变成问号的问题。 <br /><br />Java中byte与char相互转换的方法在sun.io包中。其中，byte到char的常用转换方法是： <br />public static ByteToCharConverter getConverter(String encoding); <br /><br />为了便于大家理解，我们先来做一个小实验：比如，汉字"你"的GBK编码为0xc4e3，其Unicode编码是\u4f60。我们的实验是这样的，先有一个页面比如名为a_gbk.jsp输入汉字"你"，提交给页面b_gbk.jsp。在b_gbk.jsp文件中以某种编码方式得到"你"的字节数组，再将该数组以某种编码方式转换成char，如果得到的char值是0x4f60则转换是正确的。 <br /><br />a_gbk.jsp的代码如下： <br /><br /><ccid_nobr></ccid_nobr></font>
								</font>
						</span>
				</span>
		</p>
		<p>
		</p>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
										<pre>
												<ccid_code>
												</ccid_code>
												<font size="2">&lt;%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %&gt;&lt;table width="611" border="0" align="center" cellpadding="0" cellspacing="0"&gt;  &lt;tr&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;    &lt;td class="bigword"&gt;&amp;nbsp;&lt;/td&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td width="100"&gt;&amp;nbsp;&lt;/td&gt;    &lt;td class="bigword"&gt;Input&lt;/td&gt;    &lt;td width="100"&gt;&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;    &lt;td class="bigword"&gt;&amp;nbsp;&lt;/td&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;&lt;table width="611" border="0" align="center" cellpadding="0" cellspacing="0"&gt;  &lt;tr&gt;    &lt;td&gt;&lt;form method="post" action="b_gbk.jsp"&gt;        &lt;table width="611" border="0" cellpadding="0" cellspacing="0"&gt;          &lt;tr&gt;            &lt;td width="100" align="right"&gt;&lt;/td&gt;            &lt;td&gt;&lt;input name="ClsID" type="text" class="word" id="ClsID" maxlength="2" &gt;              *&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td width="100" align="right"&gt;&amp;nbsp;&lt;/td&gt;            &lt;td&gt;&lt;input name="btn" type="submit" value="OK"&gt;             &lt;/td&gt;          &lt;/tr&gt;        &lt;/table&gt;      &lt;/form&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;</font>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />
				<br />
				<font size="2">b_gbk.jsp的代码如下： <br /><br /></font>
		</p>
		<ccid_nobr>
		</ccid_nobr>
		<p>
		</p>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
										<pre>
												<ccid_code>
												</ccid_code>
												<font size="2">&lt;%@ page contentType="text/html; charset=GBK" import="sun.io.*,java.util.*" %&gt;&lt;%String a=(String)request.getParameter("ClsID");byte b[]=a.getBytes("ISO8859-1");for(int j=0;j&lt;b.length;j++){  out.println(Integer.toHexString(b[j])+"&lt;br&gt;");}ByteToCharConverter convertor=ByteToCharConverter.getConverter("GBK");char[] c=convertor.convertAll(b);out.println("b length:"+b.length+"&lt;br&gt;");out.println("c length:"+c.length+"&lt;br&gt;");for(int i=0;i&lt;c.length;i++){       out.println(Integer.toHexString(c[i])+"&lt;br&gt;");}String a1=new String(a.getBytes("ISO8859-1"),"GBK");%&gt;&lt;%="a是:"+a%&gt;&lt;br&gt;&lt;%="a1是:"+a1%&gt;</font>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />
				<br />
				<font size="2">在浏览器中打开a_gbk.jsp并输入一个"你"字，点击OK按钮提交表单，则会出现如图1所示的结果： <br /><br /><img height="238" alt="" src="http://tech.ccidnet.com/pub/attachment/2004/9/340196.jpg" width="258" _fcksavedurl="http://tech.ccidnet.com/pub/attachment/2004/9/340196.jpg" /><br /><br />图1 <br /><br />从图1可以看出，在b_gbk.jsp中这样将byte转换为char是正确的，即得到的char是\u4f60。这里要注意的是：byte b[]=a.getBytes("ISO8859-1");中的编码是ISO8859-1，这就是我们前面提到的有些web容器在您没有指定request的字符集时它就采用缺省的ISO8859-1。 <br /><br />从图1中我们还看到表达式<!--{PS..0}-->中的a并没有正确地显示"你"而是变成"??"这是什么原因呢？这里的a是作为一个String被显示的，我们来看看我们常用的String构造函数： <br /><br />String(byte[] bytes,String encoding); <br /><br />在国标平台上，该函数会认为bytes是按GBK编码的，如果后一个参数省略，它也会认为是encoding是GBK。 <br /><br />对前一个参数就相当于将b_gbk.jsp文件的这句byte b[]=a.getBytes("ISO8859-1");中的ISO8859-1改为GBK，这样显然在GBK字符集中找不到相应的目的编码，它给出的结果是0x3f、0x3f。因此，就会显示为"??"，这也就是造成乱码的第一种现象的原因。我们的例子是演示的从byte到char的转换过程，相反的过程也会造成同样的问题，限于篇幅，就不在此讨论了，大家自己可以做类似的实验来验证。 <br /><br />解决该问题的方法就是象例子中a1那样，在获取byte数组时，指定编码为ISO8859-1。 <br /><br />接下来，我们讨论有些汉字能正常显示，有些不能正常显示的问题。 <br /><br />如果我们将String a1=new String(a.getBytes("ISO8859-1"),"GBK");中的GBK改为GB2312则象朱镕基的"镕"字就不能正常显示，这是因为该字是GBK中的字符而在GB2312中不存在。 <br /><br />解决上述两种问题的方法就是象a1那样构造String，也就是人们常说的同时也是常用的转码的方法。采用这种方法会在程序中到处出现这种语句，特别是在Struts中，Struts有一个回写表单的功能，在回写时也要做这种转换，这样的语句差不多要多一倍。因此，这是个比较笨拙的方法，有没有简捷一些的方法呢？其实是有的，只要在取得request的字符串前加上request.setCharacterEncoding("GBK");这句，指定request的字符集。则<!--{PS..1}-->中的a就能正常显示，a1反而不能正常显示。此时要将byte b[]=a.getBytes("ISO8859-1");中的ISO8859-1变成GBK，从byte到char的转换才是正确的，这就是此时a能正常显示而a1反而不能正常显示的原因。如果此时要a1正常显示则必须将String a1=new String(a.getBytes("ISO8859-1"),"GBK");中的ISO8859-1改为GBK。 <br /><br />很显然，使用request.setCharacterEncoding("GBK");只能解决GBK字符问题，要解决i18n问题则要使用UTF-8来取代GBK。我们接着做上述实验，将a_gbk.jsp和b_gbk.jsp分别另存为a.jsp和b.jsp将文件中的GBK改为UTF-8，更改后的代码分别如下： <br /><br />a.jsp代码： <br /><br /></font>
		</p>
		<ccid_nobr>
		</ccid_nobr>
		<p>
		</p>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
										<pre>
												<ccid_code>
												</ccid_code>
												<font size="2">&lt;%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %&gt;&lt;table width="611" border="0" align="center" cellpadding="0" cellspacing="0"&gt;  &lt;tr&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;    &lt;td class="bigword"&gt;&amp;nbsp;&lt;/td&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td width="100"&gt;&amp;nbsp;&lt;/td&gt;    &lt;td class="bigword"&gt;Input&lt;/td&gt;    &lt;td width="100"&gt;&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;    &lt;td class="bigword"&gt;&amp;nbsp;&lt;/td&gt;    &lt;td&gt;&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;&lt;table width="611" border="0" align="center" cellpadding="0" cellspacing="0"&gt;  &lt;tr&gt;    &lt;td&gt;&lt;form method="post" action="b.jsp"&gt;        &lt;table width="611" border="0" cellpadding="0" cellspacing="0"&gt;          &lt;tr&gt;            &lt;td width="100" align="right"&gt;&lt;/td&gt;            &lt;td&gt;&lt;input name="ClsID" type="text" class="word" id="ClsID" maxlength="2" &gt;              *&lt;/td&gt;          &lt;/tr&gt;          &lt;tr&gt;            &lt;td width="100" align="right"&gt;&amp;nbsp;&lt;/td&gt;            &lt;td&gt;&lt;input name="btn" type="submit" value="OK"&gt;             &lt;/td&gt;          &lt;/tr&gt;        &lt;/table&gt;      &lt;/form&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;b.jsp代码：&lt;ccid_nobr&gt;&lt;table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"&gt;&lt;tr&gt;    &lt;td bgcolor="e6e6e6" class="code" style="font-size:9pt"&gt;    &lt;pre&gt;&lt;ccid_code&gt;  &lt;%@ page contentType="text/html; charset=UTF-8" import="sun.io.*,java.util.*" %&gt;&lt;%request.setCharacterEncoding("UTF-8");String a=(String)request.getParameter("ClsID");byte b[]=a.getBytes("UTF-8");for(int j=0;j&lt;b.length;j++){  out.println(Integer.toHexString(b[j])+"&lt;br&gt;");}ByteToCharConverter convertor=ByteToCharConverter.getConverter("UTF-8");char[] c=convertor.convertAll(b);out.println("b length:"+b.length+"&lt;br&gt;");out.println("c length:"+c.length+"&lt;br&gt;");for(int i=0;i&lt;c.length;i++){  out.println(Integer.toHexString(c[i])+"&lt;br&gt;");}String a1=new String(a.getBytes("UTF-8"),"UTF-8");%&gt;&lt;%="a是:"+a%&gt;&lt;br&gt;&lt;%="a1是:"+a1%&gt;</font>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />
				<br />
				<font size="2">再在a.jsp中输入"你"字，你会发现显示结果中，一个汉字是用三个byte表示的，它们的值分别是0xe4、0xbd、0xa0，也就是说用UTF-8来表示汉字，每个汉字要比GBK多占用一个byte，这也是使用UTF-8要多付出的一点代价吧。 <br /><br />现在，我们讨论一下第三个问题，即显示乱码，有些莫名其妙的汉字并不是你预期的结果。 <br /><br />在上例中将String a1=new String(a.getBytes("UTF-8"),"UTF-8");改为String a1=new String(a.getBytes("UTF-8"),"GBK");再输入"你"字，则a1会显示成"浣?"，您只要看一看"浣"的UTF-8码和GBK码就会知道其中的奥秘了。 <br /><br />下面，我们讨论一下最后一个问题，就是读写数据库时出现乱码。 <br /><br />现在一些常用的数据库都支持数据库encoding，也就是说在创建数据库时可以指定它自己的字符集设置，数据库数据以指定的编码形式存储。当应用程序访问数据库时，在入口和出口处都会有encoding转换。如果，在应用程序中字符本来已变成了乱码，当然也就无法正确地转换为数据库的字符集了。数据库的encoding可根据需要来设置，比如要支持简、繁体中文、日、韩、英语选GBK，如果还要支持其他语言最好选UTF-8。 <br /><br />本篇文章对字符集及中文乱码问题做了一下探讨，为实现国际化编程的实践打下一个基础。下一篇文章，我们将介绍struts中实现国际化编程的具体步骤，并将我们前面介绍的登录例子进行国际化 </font>
		</p>
<img src ="http://www.blogjava.net/raekwon/aggbug/75329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raekwon/" target="_blank">raekwon</a> 2006-10-16 00:46 <a href="http://www.blogjava.net/raekwon/archive/2006/10/16/75329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Structs - 标签库</title><link>http://www.blogjava.net/raekwon/archive/2006/10/16/75327.html</link><dc:creator>raekwon</dc:creator><author>raekwon</author><pubDate>Sun, 15 Oct 2006 16:43:00 GMT</pubDate><guid>http://www.blogjava.net/raekwon/archive/2006/10/16/75327.html</guid><wfw:comment>http://www.blogjava.net/raekwon/comments/75327.html</wfw:comment><comments>http://www.blogjava.net/raekwon/archive/2006/10/16/75327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raekwon/comments/commentRss/75327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raekwon/services/trackbacks/75327.html</trackback:ping><description><![CDATA[
		<a href="http://pepsixp.blogdriver.com/pepsixp/362134.html" _fcksavedurl="http://pepsixp.blogdriver.com/pepsixp/362134.html">
				<font color="#002c99">http://pepsixp.blogdriver.com/pepsixp/362134.html</font>
		</a> <img src ="http://www.blogjava.net/raekwon/aggbug/75327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raekwon/" target="_blank">raekwon</a> 2006-10-16 00:43 <a href="http://www.blogjava.net/raekwon/archive/2006/10/16/75327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Hibernate开发中须注意的地方</title><link>http://www.blogjava.net/raekwon/archive/2006/10/16/75326.html</link><dc:creator>raekwon</dc:creator><author>raekwon</author><pubDate>Sun, 15 Oct 2006 16:42:00 GMT</pubDate><guid>http://www.blogjava.net/raekwon/archive/2006/10/16/75326.html</guid><wfw:comment>http://www.blogjava.net/raekwon/comments/75326.html</wfw:comment><comments>http://www.blogjava.net/raekwon/archive/2006/10/16/75326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raekwon/comments/commentRss/75326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raekwon/services/trackbacks/75326.html</trackback:ping><description><![CDATA[
		<font size="2">   </font>
		<p>
				<font size="2">
						<strong>1</strong>。 Struts的中文问题</font>
		</p>
		<p>
				<font size="2">(1)ApplicationResources.properties文件的中文错误显示问题：这个文件是用来自定义Struts中的信息的，由于国外的软件或者是开源框架一般是采用ISO-8859-1编码方式，所以中文显示会有问题，因此，需要把这个文件的编码方式转换成unicode。运行JAVA控制台： </font>
		</p>
		<p>
				<font size="2">native2ascii -encoding gbk  ApplicationResources.properties ApplicationResources_zh_CN.properties</font>
		</p>
		<p>
				<font size="2">然后把ApplicationResources.properties 文件删除。</font>
		</p>
		<p>
				<font size="2">(2)从ActionForm读取的中文是乱码：</font>
		</p>
		<p>
				<font size="2">可以把这个ActionForm中相应的某个属性的SET方法改成如下：</font>
		</p>
		<p>
				<font size="2">try {<br />   this.title = new String(title.getBytes("ISO8859-1"),"GBK");<br />  } catch (UnsupportedEncodingException e) {<br />   // TODO 自动生成 catch 块<br />   e.printStackTrace();<br />  }</font>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<p>
				<font size="2">
						<strong>2</strong>。Hibernate的问题</font>
		</p>
		<p>
				<font size="2">由于hibernate会与数据库打交道，所以一般也是与访问数据库时有问题，以下以MYSQL为例</font>
		</p>
		<p>
				<font size="2">(1)读写数据库出现中文乱码，解决方法：</font>
		</p>
		<p>
				<font size="2">在相应的hibernate.cfg.xml文件中添加</font>
		</p>
		<p>
				<font size="2">&lt;property name="connection.useUnicode"&gt;true&lt;/property&gt;<br /> &lt;property name="connection.characterEncoding"&gt;UTF-8&lt;/property&gt;</font>
		</p>
		<p>
				<font size="2">(2)不能够添加数据到数据库，这个问题是由于MYSQL数据表类型不是MYISAM类型造成的，只要把表的类型改成MYISAM就可以了</font>
		</p>
		<p>
				<font size="2">先写这些，以后在开发过程中遇到问题再接着写。</font>
		</p>
<img src ="http://www.blogjava.net/raekwon/aggbug/75326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raekwon/" target="_blank">raekwon</a> 2006-10-16 00:42 <a href="http://www.blogjava.net/raekwon/archive/2006/10/16/75326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate的HQL</title><link>http://www.blogjava.net/raekwon/archive/2006/10/16/75325.html</link><dc:creator>raekwon</dc:creator><author>raekwon</author><pubDate>Sun, 15 Oct 2006 16:40:00 GMT</pubDate><guid>http://www.blogjava.net/raekwon/archive/2006/10/16/75325.html</guid><wfw:comment>http://www.blogjava.net/raekwon/comments/75325.html</wfw:comment><comments>http://www.blogjava.net/raekwon/archive/2006/10/16/75325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raekwon/comments/commentRss/75325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raekwon/services/trackbacks/75325.html</trackback:ping><description><![CDATA[
		<a href="http://www.zhuoda.org/Jason/15269.html" _fcksavedurl="http://www.zhuoda.org/Jason/15269.html">http://www.zhuoda.org/Jason/15269.html</a> <img src ="http://www.blogjava.net/raekwon/aggbug/75325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raekwon/" target="_blank">raekwon</a> 2006-10-16 00:40 <a href="http://www.blogjava.net/raekwon/archive/2006/10/16/75325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java代码编写的30条建议[转]</title><link>http://www.blogjava.net/raekwon/archive/2006/10/16/75323.html</link><dc:creator>raekwon</dc:creator><author>raekwon</author><pubDate>Sun, 15 Oct 2006 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/raekwon/archive/2006/10/16/75323.html</guid><wfw:comment>http://www.blogjava.net/raekwon/comments/75323.html</wfw:comment><comments>http://www.blogjava.net/raekwon/archive/2006/10/16/75323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raekwon/comments/commentRss/75323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raekwon/services/trackbacks/75323.html</trackback:ping><description><![CDATA[
		<div class="content">1)  类名首字母应该大写。字段、方法以及对象（句柄）的首字母应小写。对于所有标识符，其中包含的所有单词都应紧靠在一起，而且大写中间单词的首字母。例如：  <br />ThisIsAClassName  <br />thisIsMethodOrFieldName  <br />若在定义中出现了常数初始化字符，则大写static  final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。  <br />Java包（Package）属于一种特殊情况：它们全都是小写字母，即便中间的单词亦是如此。对于域名扩展名称，如com，org，net或者edu等，全部都应小写（这也是Java  1.1和Java  1.2的区别之一）。  <br /><br />(2)  为了常规用途而创建一个类时，请采取"经典形式"，并包含对下述元素的定义：  <br /><br />equals()  <br />hashCode()  <br />toString()  <br />clone()（implement  Cloneable）  <br />implement  Serializable  <br /><br />(3)  对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那个类的代码。为使用一个项目中的类，我们没必要删除测试代码。若进行了任何形式的改动，可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。  <br /><br />(4)  应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接口部分。理想情况下，方法应简明扼要。若长度很大，可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用（有些时候，方法必须非常大，但它们仍应只做同样的一件事情）。  <br /><br />(5)  设计一个类时，请设身处地为客户程序员考虑一下（类的使用方法应该是非常明确的）。然后，再设身处地为管理代码的人考虑一下（预计有可能进行哪些形式的修改，想想用什么方法可把它们变得更简单）。  <br />(6)  使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一些建议：  <br />■一个复杂的开关语句：考虑采用"多形"机制  <br />■数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现  <br />■许多成员变量在特征上有很大的差别：考虑使用几个类  <br /><br />(7)  让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"（一个方法、类或者一个字段等等），就永远不能把它拿出。若强行拿出，就可能破坏其他人现有的代码，使他们不得不重新编写和设计。若只公布自己必须公布的，就可放心大胆地改变其他任何东西。在多线程环境中，隐私是特别重要的一个因素--只有private字段才能在非同步使用的情况下受到保护。  <br /><br />(8)  谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新手，往往喜欢先写一个顺序执行的程序，再把它嵌入一个或两个巨大的对象里。根据编程原理，对象表达的应该是应用程序的概念，而非应用程序本身。  <br /><br />(9)  若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内部。  <br /><br />(10)  任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部类，从而改善编码及维护工作（参见第14章14.1.2小节的"用内部类改进代码"）。  <br /><br />(11)  尽可能细致地加上注释，并用javadoc注释文档语法生成自己的程序文档。  <br /><br />(12)  避免使用"魔术数字"，这些数字很难与代码很好地配合。如以后需要修改它，无疑会成为一场噩梦，因为根本不知道"100"到底是指"数组大小"还是"其他全然不同的东西"。所以，我们应创建一个常数，并为其使用具有说服力的描述性名称，并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。  <br /><br />(13)  涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来，调用者就不会以为那个对象已正确地创建，从而盲目地继续。  <br /><br />(14)  当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将清除代码置于一个良好定义的方法里，采用类似于cleanup()这样的名字，明确表明自己的用途。除此以外，可在类内放置一个boolean（布尔）标记，指出对象是否已被清除。在类的finalize()方法里，请确定对象已被清除，并已丢弃了从RuntimeException继承的一个类（如果还没有的话），从而指出一个编程错误。在采取象这样的方案之前，请确定finalize()能够在自己的系统中工作（可能需要调用System.runFinalizersOnExit(true)，从而确保这一行为）。  <br /><br />(15)  在一个特定的作用域内，若一个对象必须清除（非由垃圾收集机制处理），请采用下述方法：初始化对象；若成功，则立即进入一个含有finally从句的try块，开始清除工作<br /><br />16)  若在初始化过程中需要覆盖（取消）finalize()，请记住调用super.finalize()（若Object属于我们的直接超类，则无此必要）。在对finalize()进行覆盖的过程中，对super.finalize()的调用应属于最后一个行动，而不应是第一个行动，这样可确保在需要基础类组件的时候它们依然有效。  <br /><br />(17)  创建大小固定的对象集合时，请将它们传输至一个数组（若准备从一个方法里返回这个集合，更应如此操作）。这样一来，我们就可享受到数组在编译期进行类型检查的好处。此外，为使用它们，数组的接收者也许并不需要将对象"造型"到数组里。  <br /><br />(18)  尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个基础类，那么第一个选择应是将其变成一个interface（接口）。只有在不得不使用方法定义或者成员变量的时候，才需要将其变成一个abstract（抽象）类。接口主要描述了客户希望做什么事情，而一个类则致力于（或允许）具体的实施细节。  <br /><br />(19)  在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法，因为那些方法可能被其他人覆盖或取消，从而在构建过程中产生不可预知的结果（参见第7章的详细说明）。  <br /><br />(20)  对象不应只是简单地容纳一些数据；它们的行为也应得到良好的定义。  <br /><br />(21)  在现成类的基础上创建新类时，请首先选择"新建"或"创作"。只有自己的设计要求必须继承时，才应考虑这方面的问题。若在本来允许新建的场合使用了继承，则整个设计会变得没有必要地复杂。  <br /><br />(22)  用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色，这是绝对应该避免的：应直接使用一个"颜色"字段。  <br /><br />(23)  为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字都仅对应一个类。否则，编译器可能先找到同名的另一个类，并报告出错消息。若怀疑自己碰到了类路径问题，请试试在类路径的每一个起点，搜索一下同名的.class文件。  <br /><br />(24)  在Java  1.1  AWT中使用事件"适配器"时，特别容易碰到一个陷阱。若覆盖了某个适配器方法，同时拼写方法没有特别讲究，最后的结果就是新添加一个方法，而不是覆盖现成方法。然而，由于这样做是完全合法的，所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。  <br /><br />(25)  用合理的设计方案消除"伪功能"。也就是说，假若只需要创建类的一个对象，就不要提前限制自己使用应用程序，并加上一条"只生成其中一个"注释。请考虑将其封装成一个"独生子"的形式。若在主程序里有大量散乱的代码，用于创建自己的对象，请考虑采纳一种创造性的方案，将些代码封装起来。  <br /><br />(26)  警惕"分析瘫痪"。请记住，无论如何都要提前了解整个项目的状况，再去考察其中的细节。由于把握了全局，可快速认识自己未知的一些因素，防止在考察细节的时候陷入"死逻辑"中。  <br /><br />(27)  警惕"过早优化"。首先让它运行起来，再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候，才应进行优化。除非用专门的工具分析瓶颈，否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解，而且难于维护。  <br /><br />(28)  请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序，但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己，还是对后来的人，它们都是相当重要的。如对此仍有怀疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，这样或许能将你说服。  <br /><br />(29)  如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家，但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作，看看是否能找出你一度熟视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些关键性的问题，避免产品发行后再解决问题而造成的金钱及精力方面的损失。  <br /><br />(30)  良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法，以后的工作就轻松多了，再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报（甚至无可估量）。而且由于自己倾注了大量心血，最终获得一个出色的设计方案，成功的快感也是令人心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失</div>
<img src ="http://www.blogjava.net/raekwon/aggbug/75323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raekwon/" target="_blank">raekwon</a> 2006-10-16 00:33 <a href="http://www.blogjava.net/raekwon/archive/2006/10/16/75323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inner Class</title><link>http://www.blogjava.net/raekwon/archive/2006/09/28/72425.html</link><dc:creator>raekwon</dc:creator><author>raekwon</author><pubDate>Wed, 27 Sep 2006 18:04:00 GMT</pubDate><guid>http://www.blogjava.net/raekwon/archive/2006/09/28/72425.html</guid><wfw:comment>http://www.blogjava.net/raekwon/comments/72425.html</wfw:comment><comments>http://www.blogjava.net/raekwon/archive/2006/09/28/72425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raekwon/comments/commentRss/72425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raekwon/services/trackbacks/72425.html</trackback:ping><description><![CDATA[
		<font size="3">
				<span lang="EN-US">
						<font face="Times New Roman">
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span lang="EN-US">
														<font face="Times New Roman">Inner Class </font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">即嵌套类，也即</span>
												<span lang="EN-US">
														<font face="Times New Roman">C++</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">和</span>
												<span lang="EN-US">
														<font face="Times New Roman">C#</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">中的</span>
												<span lang="EN-US">
														<font face="Times New Roman">Nested Class</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">。但</span>
												<span lang="EN-US">
														<font face="Times New Roman">Java </font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">的</span>
												<span lang="EN-US">
														<font face="Times New Roman">Inner Class </font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">与</span>
												<font face="Times New Roman">
														<span lang="EN-US">C++</span>
												</font>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">和</span>
												<span lang="EN-US">
														<font face="Times New Roman">C#</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Times New Roman; mso-hansi-font-family: Times New Roman">最大的不同之处在于，嵌套类包含一个指向其容器类的引用，可以访问容器类的成员。以下代码演示了这一点：</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">public class Container { 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>String Name; 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>class InnerClass 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>{ 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>InnerClass(){}; 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>public void func() 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>{ 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">            </span>System.out.println(Name); 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>} 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>} 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
										<span lang="EN-US">
												<font face="Times New Roman" size="3">public Container(String name){</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-tab-count: 1">       </span>Name=name; 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>InnerClass a=new InnerClass(); 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>} 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>public static void main(String [] arg) 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>{ 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>Container a=new Container(“ContainerA"); 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span lang="EN-US">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>InnerClass b=a.new InnerClass();<span style="mso-spacerun: yes">   </span>//</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意此处</span>
												<span lang="EN-US">
														<p>
														</p>
														<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														</p>
												</span>
										</font>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span lang="EN-US">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">        </span>InnerClass c=(new Container(“ContainerB")).new InnerClass(); //</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本质上等价于上一句</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-tab-count: 2">              </span>a.func();</font>
												</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-tab-count: 2">              </span>c.func(); 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-spacerun: yes">    </span>} 
<p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></font>
												</font>
										</span>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font face="Times New Roman" size="3">}</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
										<font size="3">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意其中独特的</span>
												<span lang="EN-US">
														<font face="Times New Roman">new</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语法，在静态函数要创建一个</span>
												<span lang="EN-US">
														<font face="Times New Roman">Inner Class</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，必须有一个其容器类的实例。如果直接</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">创建</span>
												<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">
														<p>
														</p>
														<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														</p>
												</span>
										</font>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
										<span lang="EN-US">
												<font face="Times New Roman" size="3">InnerClass b=new InnerClass();</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
												<font size="3">则会导致编译出错。</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
										<font size="3">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而在</span>
												<span lang="EN-US">
														<font face="Times New Roman">Container</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的构造函数中，创建</span>
												<span lang="EN-US">
														<font face="Times New Roman">InnerClass</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，自动将</span>
												<span lang="EN-US">
														<font face="Times New Roman">this</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为</span>
												<span lang="EN-US">
														<font face="Times New Roman">InnerClass</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的引用。</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span>
												<span lang="EN-US">
														<font face="Times New Roman">Inner Class </font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中使用容器类的成员，不需指定实例，自动指向创建它的容器类。</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span lang="EN-US">
														<span style="mso-tab-count: 1">
																<font face="Times New Roman">       </font>
														</span>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是一个很有用的语法特征，编译器替我们省了许多事。</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span lang="EN-US">
														<span style="mso-tab-count: 1">
																<font face="Times New Roman">       </font>
														</span>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本例的输出是：</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-tab-count: 1">       </span>ContainerA</font>
												</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<font size="3">
														<font face="Times New Roman">
																<span style="mso-tab-count: 1">       </span>ContainerB</font>
												</font>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<span lang="EN-US">
												<span style="mso-tab-count: 1">
														<font face="Times New Roman" size="3">       </font>
												</span>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
										<font size="3">
												<span lang="EN-US">
														<span style="mso-tab-count: 1">
																<font face="Times New Roman">       </font>
														</span>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还可以看到，</span>
												<span lang="EN-US">
														<font face="Times New Roman">Inner Class </font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以访问容器类的任何成员，不管是</span>
												<span lang="EN-US">
														<font face="Times New Roman">public</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
												<span lang="EN-US">
														<font face="Times New Roman">private</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
												<span lang="EN-US">
														<font face="Times New Roman">protected</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的成员全是透明的。反之则不然，容器类只能访问</span>
												<span lang="EN-US">
														<font face="Times New Roman">Inner Class</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
												<span lang="EN-US">
														<font face="Times New Roman">public</font>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成员。</span>
										</font>
								</p>
								<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
								</p>
						</font>
				</span>
		</font>
<img src ="http://www.blogjava.net/raekwon/aggbug/72425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raekwon/" target="_blank">raekwon</a> 2006-09-28 02:04 <a href="http://www.blogjava.net/raekwon/archive/2006/09/28/72425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>