﻿<?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-yunye 的 JavaBlog</title><link>http://www.blogjava.net/yunye/</link><description>@see  codemouse</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:05:11 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:05:11 GMT</pubDate><ttl>60</ttl><item><title>Java单例模式(1)</title><link>http://www.blogjava.net/yunye/archive/2008/06/05/206008.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Thu, 05 Jun 2008 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/06/05/206008.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/206008.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/06/05/206008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/206008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/206008.html</trackback:ping><description><![CDATA[单例对象（Singleton）是一种常用的设计模式。在Java应用中，单例对象能保证在一个JVM中，该对象只有一个实例存在。正是由于这个特 点，单例对象通常作为程序中的存放配置信息的载体，因为它能保证其他对象读到一致的信息。例如在某个服务器程序中，该服务器的配置信息可能存放在数据库或 文件中，这些配置数据由某个单例对象统一读取，服务进程中的其他对象如果要获取这些配置信息，只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下，尤其是多线程环境下的配置管理，但是随着应用场景的不同，也可能带来一些同步问题。 
<p>　　本文将探讨一下在多线程环境下，使用单例对象作配置信息管理时可能会带来的几个同步问题，并针对每个问题给出可选的解决办法。</p><p>　　<strong>问题描述</strong></p><p>　　在多线程环境下，单例对象的同步问题主要体现在两个方面，单例对象的初始化和单例对象的属性更新。</p><p>　　本文描述的方法有如下假设：</p><p>　　1. 单例对象的属性（或成员变量）的获取，是通过单例对象的初始化实现的。也就是说，在单例对象初始化时，会从文件或数据库中读取最新的配置信息。</p><p>　　2. 其他对象不能直接改变单例对象的属性，单例对象属性的变化来源于配置文件或配置数据库数据的变化。</p><p>　　<strong>1.1 单例对象的初始化</strong></p><p>　　首先，讨论一下单例对象的初始化同步。单例模式的通常处理方式是，在对象中有一个静态成员变量，其类型就是单例类型本身；如果该变量为null，则创建该单例类型的对象，并将该变量指向这个对象；如果该变量不为null，则直接使用该变量。</p><p>　　其过程如下面代码所示：</p><pre><strong>public class GlobalConfig {<br />    private static GlobalConfig instance = null;<br />    private Vector properties = null;<br />    private GlobalConfig() {<br />      //Load configuration information from DB or file<br />      //Set values for properties<br />    }<br />    public static GlobalConfig getInstance() {<br />      if (instance == null) {<br />        instance = new GlobalConfig();<br />      }<br />      return instance;<br />    }<br />    public Vector getProperties() {<br />      return properties;<br />    }<br />  }</strong></pre><br /><br /><br /><br />这种处理方式在单线程的模式下可以很好的运行；但是在多线程模式下，可能产生问题。如果第一个线程发现成员变量为null，准备创建对象；这是第二 个线程同时也发现成员变量为null，也会创建新对象。这就会造成在一个JVM中有多个单例类型的实例。如果这个单例类型的成员变量在运行过程中变化，会 造成多个单例类型实例的不一致，产生一些很奇怪的现象。例如，某服务进程通过检查单例对象的某个属性来停止多个线程服务，如果存在多个单例对象的实例，就 会造成部分线程服务停止，部分线程服务不能停止的情况。 
<p>　　<strong>1.2 单例对象的属性更新</strong></p><p>　　通常，为了实现配置信息的实时更新，会有一个线程不停检测配置文件或配置数据库的内容，一旦发现变化，就更新到单例对象的属性中。在更新这些信 息的时候，很可能还会有其他线程正在读取这些信息，造成意想不到的后果。还是以通过单例对象属性停止线程服务为例，如果更新属性时读写不同步，可能访问该 属性时这个属性正好为空（null），程序就会抛出异常。</p><p>　　<strong>解决方法</strong></p><p>　　<strong>2.1 单例对象的初始化同步</strong></p><p>　　对于初始化的同步，可以通过如下代码所采用的方式解决。</p><p></p><table cellspacing="1" cellpadding="0" width="80%" align="center" bgcolor="#cccccc" border="0"><tbody><tr><td style="PADDING-LEFT: 3px" bgcolor="#f2f2f2"><pre>  public class GlobalConfig {<br />    private static GlobalConfig instance = null;<br />    private Vector properties = null;<br />    private GlobalConfig() {<br />      //Load configuration information from DB or file<br />      //Set values for properties<br />    }<br />    private static synchronized void syncInit() {<br />      if (instance == null) {<br />        instance = new GlobalConfig();<br />      }<br />    }<br />    public static GlobalConfig getInstance() {<br />      if (instance == null) {<br />        syncInit();<br />      }<br />      return instance;<br />    }<br />    public Vector getProperties() {<br />      return properties;<br />    }<br />  }<br /></pre></td></tr></tbody></table><p>　　这种处理方式虽然引入了同步代码，但是因为这段同步代码只会在最开始的时候执行一次或多次，所以对整个系统的性能不会有影响。</p><strong>2.2 单例对象的属性更新同步</strong><p>　　为了解决第2个问题，有两种方法：</p><p>　　<strong>1，参照读者/写者的处理方式</strong></p><p>　　设置一个读计数器，每次读取配置信息前，将计数器加1，读完后将计数器减1.只有在读计数器为0时，才能更新数据，同时要阻塞所有读属性的调用。代码如下。</p><p></p><table cellspacing="1" cellpadding="0" width="80%" align="center" bgcolor="#cccccc" border="0"><tbody><tr><td style="PADDING-LEFT: 3px" bgcolor="#f2f2f2"><pre>  public class GlobalConfig {<br /> private static GlobalConfig instance;<br /> private Vector properties = null;<br /> private boolean isUpdating = false;<br /> private int readCount = 0;<br /> private GlobalConfig() {<br />   //Load configuration information from DB or file<br />      //Set values for properties<br /> }<br /> private static synchronized void syncInit() {<br />  if (instance == null) {<br />   instance = new GlobalConfig();<br />  }<br /> }<br /> public static GlobalConfig getInstance() {<br />  if (instance==null) {<br />   syncInit();<br />  }<br />  return instance;<br /> }<br /> public synchronized void update(String p_data) {<br />  syncUpdateIn();<br />  //Update properties<br /> }<br /> private synchronized void syncUpdateIn() {<br />  while (readCount &gt; 0) {<br />   try {<br />    wait();<br />   } catch (Exception e) {<br />   }<br />  }<br /> }<br /> private synchronized void syncReadIn() {<br />  readCount++;<br /> }<br /> private synchronized void syncReadOut() {<br />  readCount--;<br />  notifyAll();<br /> }<br /> public Vector getProperties() {<br />  syncReadIn();<br />  //Process data<br />  syncReadOut();<br />  return properties;<br /> }<br />  }</pre></td></tr></tbody></table><p>　<strong>　2，采用"影子实例"的办法</strong></p><p>　　具体说，就是在更新属性时，直接生成另一个单例对象实例，这个新生成的单例对象实例将从数据库或文件中读取最新的配置信息；然后将这些配置信息直接赋值给旧单例对象的属性。如下面代码所示。</p><p></p><table cellspacing="1" cellpadding="0" width="80%" align="center" bgcolor="#cccccc" border="0"><tbody><tr><td style="PADDING-LEFT: 3px" bgcolor="#f2f2f2"><pre>  public class GlobalConfig {<br />    private static GlobalConfig instance = null;<br />    private Vector properties = null;<br />    private GlobalConfig() {<br />      //Load configuration information from DB or file<br />      //Set values for properties<br />    }<br />    private static synchronized void syncInit() {<br />      if (instance = null) {<br />        instance = new GlobalConfig();<br />      }<br />    }<br />    public static GlobalConfig getInstance() {<br />      if (instance = null) {<br />        syncInit();<br />      }<br />      return instance;<br />    }<br />    public Vector getProperties() {<br />      return properties;<br />    }<br />    public void updateProperties() {<br />      //Load updated configuration information by new a GlobalConfig object<br />      GlobalConfig shadow = new GlobalConfig();<br />      properties = shadow.getProperties();<br />    }<br />  }</pre></td></tr></tbody></table><p>　　注意：在更新方法中，通过生成新的GlobalConfig的实例，从文件或数据库中得到最新配置信息，并存放到properties属性中。</p><p>　　上面两个方法比较起来，第二个方法更好，首先，编程更简单；其次，没有那么多的同步操作，对性能的影响也不大。</p><img src ="http://www.blogjava.net/yunye/aggbug/206008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-06-05 12:43 <a href="http://www.blogjava.net/yunye/archive/2008/06/05/206008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何获得&lt;logic:iterate/&gt;标签中一条记录的属性呢？</title><link>http://www.blogjava.net/yunye/archive/2008/04/15/193223.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Tue, 15 Apr 2008 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/04/15/193223.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/193223.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/04/15/193223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/193223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/193223.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下是得到职员列表的				JSP				页面。列出数据库中所有职员的信息。现在我想通过点击“删除”																																		&lt;				TD				&gt;				&lt;html:link href="/FileManage/deleteStaff.do"&gt;				删除				&lt...&nbsp;&nbsp;<a href='http://www.blogjava.net/yunye/archive/2008/04/15/193223.html'>阅读全文</a><img src ="http://www.blogjava.net/yunye/aggbug/193223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-04-15 22:11 <a href="http://www.blogjava.net/yunye/archive/2008/04/15/193223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求救Hibernate 问题，急，请帮我看下我的代码，好么！</title><link>http://www.blogjava.net/yunye/archive/2008/03/25/188583.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Tue, 25 Mar 2008 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/25/188583.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/188583.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/25/188583.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/188583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/188583.html</trackback:ping><description><![CDATA[
		<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'">
				</span> </p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; mso-char-indent-count: 1.5">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我想在</span>
				<span lang="EN-US">JSP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面中向数据库表</span>
				<span lang="EN-US">staff</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插入一条记录：页面能跳转到</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">addStaffSuccess.jsp</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">；</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">刷新页面时，添加的记录能在页面中显示出来，我还以为成功了，于是我想通过企业管理器打开数据库表看是不是数据库表更新了，发现数据库表不显示数据，我插入的是第二条记录，于是我让它返回首行，首行正常显示。我用查询分析器查询</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Staff</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">表的数据，一直是“正在执行批查询状态</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">………</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">”说明我对数据库的操作影响到了数据库，但是出了我不知道的异常或错误，但是又不报错，我不知道怎么去找原因。忘了，当我停止</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">tomcat</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">时，数据表正常显示，但插入的数据没有显示在表里，说明没有插入。难道是我没停止</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">tomcat</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">前，数据库一直在更新么？</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25pt; mso-char-indent-count: 2.5">
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">我用的环境是，</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">eclipse3.2+Myeclipse5.5 + MS SQL server2000+ tomcat5.5<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">我添加了</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">struts </span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">和</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> hibernate </span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">支持，各个持久化类和</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">DAO</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">类</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">,</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">是通过映射后</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">hibernate</span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">自动生成的。</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Action </span>
				<span style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">代码是我写的，不足道有错没，请指正。</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加后，返回原页面，显示了添加的信息：（<b style="mso-bidi-font-weight: normal">但数据库没更新，郁闷！</b>）</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</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'">数据库：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 36.75pt; mso-char-indent-count: 3.5">
				<span lang="EN-US">staff (staffid,//</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主键</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0">
				<span lang="EN-US">staffname,//not null</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0">
				<span lang="EN-US">password,//not null</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0">
				<span lang="EN-US">departmentname;// </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">允许空</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0">
				<span lang="EN-US">sex;//</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">允许空</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0">
				<span lang="EN-US">email;//</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">允许空</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0">
				<span lang="EN-US">mobile;//</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">允许空</span>
				<span lang="EN-US">)</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'">在</span>
				<span lang="EN-US"> StaffDAO </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面：（这是</span>
				<span lang="EN-US">hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射数据库表后自动生成的方法）</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">     </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">void</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> save(Staff transientInstance) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">log</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.debug(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"saving Staff instance"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">try</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>getSession().save(transientInstance);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
				</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">log</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.debug(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"save successful"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>} </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">catch</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> (</span>
				<u>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">RuntimeException</span>
				</u>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> re) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
				</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">log</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.error(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"save failed"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">, re);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">throw</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> re;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">在</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">AddStaffAction</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">里面：</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes">   </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> ActionForward execute(ActionMapping mapping, ActionForm form,</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>HttpServletRequest request, HttpServletResponse response) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">//</span>
				<span style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">获得表单信息；</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>AddStaffForm addStaffForm = (AddStaffForm) form;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">// </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">TODO</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Auto-generated method stub</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>String staffid = addStaffForm.getStaffid();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>String staffname = addStaffForm.getStaffname();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>String departmentname = addStaffForm.getDepartmentname();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>String sex = addStaffForm.getSex();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>String password = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> String(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"000000"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">//</span>
				<span style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">转换字符格式</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">try</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes"> </span>staffid = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> String(staffid.getBytes(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"ISO-8859-1"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">),</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"GB2312"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes"> </span>staffname = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> String(staffname.getBytes(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"ISO-8859-1"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">),</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"GB2312"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes"> </span>departmentname = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> String(departmentname.getBytes(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"ISO-8859-1"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">),</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"GB2312"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes"> </span>sex = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> String(sex.getBytes(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"ISO-8859-1"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">),</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"GB2312"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes"> </span>password = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> String(password.getBytes(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"ISO-8859-1"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">),</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"GB2312"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<span style="mso-tab-count: 3">         </span></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
						<span style="mso-spacerun: yes">    </span>} </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">catch</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> (UnsupportedEncodingException e) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">  </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">// </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">TODO</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Auto-generated catch block</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">   </span>e.printStackTrace();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
						<span style="mso-spacerun: yes">    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
						<span style="mso-spacerun: yes">    </span>Staff staff = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Staff();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">  </span>staff.setStaffid(staffid);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">  </span>staff.setStaffname(staffname);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">  </span>staff.setPassword(password);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">  </span>staff.setDepartmentname(departmentname);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
						<span style="mso-spacerun: yes">  </span>staff.setSex(sex);<span style="mso-tab-count: 3">         </span><span style="mso-spacerun: yes">                                                      </span></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
						<span style="mso-spacerun: yes">    </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">try</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 4">              </span>StaffDAO dao = </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> StaffDAO();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 4">              </span>
						<span style="mso-spacerun: yes">         </span>dao.save(staff);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>} </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">catch</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> (Exception e) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 4">              </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">// </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">TODO</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> Auto-generated catch block</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 4">              </span>e.printStackTrace();<span style="mso-tab-count: 4">            </span></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>} </span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes">                 </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">return</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"> mapping.<span style="BACKGROUND: silver; mso-highlight: silver">findForward</span>(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"addStaffSuccess"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);<span style="mso-tab-count: 3">        </span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1"></span>}<o:p></o:p></span>
		</p>
<img src ="http://www.blogjava.net/yunye/aggbug/188583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-25 20:58 <a href="http://www.blogjava.net/yunye/archive/2008/03/25/188583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp超级链接实现"目标另存为"功能 </title><link>http://www.blogjava.net/yunye/archive/2008/03/22/187838.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Fri, 21 Mar 2008 17:40:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/22/187838.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/187838.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/22/187838.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/187838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/187838.html</trackback:ping><description><![CDATA[
		<p>jsp:</p>
		<br clear="all" />
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img id="_2_91_Open_Image" onclick="this.style.display='none'; document.getElementById('_2_91_Open_Text').style.display='none'; document.getElementById('_2_91_Closed_Image').style.display='inline'; document.getElementById('_2_91_Closed_Text').style.display='inline';" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108866.gif" align="top" />
						<img id="_2_91_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_2_91_Closed_Text').style.display='none'; document.getElementById('_2_91_Open_Image').style.display='inline'; document.getElementById('_2_91_Open_Text').style.display='inline';" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108227.gif" align="top" />
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span>
						<span id="_2_91_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span>
						<span id="_2_91_Open_Text">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page language</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">java</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> contentType</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=GB18030</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<br />
										<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108422.gif" align="top" />    pageEncoding</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">GB18030</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;!</span>
						<span style="COLOR: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">html</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">head</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">meta </span>
						<span style="COLOR: #ff0000">http-equiv</span>
						<span style="COLOR: #0000ff">="Content-Type"</span>
						<span style="COLOR: #ff0000"> content</span>
						<span style="COLOR: #0000ff">="text/html; charset=GB18030"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">title</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">Insert title here</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">title</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">head</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">body</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">a </span>
						<span style="COLOR: #ff0000">href</span>
						<span style="COLOR: #0000ff">="/test/test.do"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">1322</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">a</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">body</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">html</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</div>
		</div>
		<p> action:</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">package</span>
						<span style="COLOR: #000000"> action;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> java.io.FileOutputStream;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> org.apache.struts.action.Action;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> org.apache.struts.action.ActionForm;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> org.apache.struts.action.ActionForward;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> org.apache.struts.action.ActionMapping;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108719.gif" align="top" /><br /><img id="_363_893_Open_Image" onclick="this.style.display='none'; document.getElementById('_363_893_Open_Text').style.display='none'; document.getElementById('_363_893_Closed_Image').style.display='inline'; document.getElementById('_363_893_Closed_Text').style.display='inline';" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108866.gif" align="top" /><img id="_363_893_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_363_893_Closed_Text').style.display='none'; document.getElementById('_363_893_Open_Image').style.display='inline'; document.getElementById('_363_893_Open_Text').style.display='inline';" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108227.gif" align="top" /></span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> TeAction </span>
						<span style="COLOR: #0000ff">extends</span>
						<span style="COLOR: #000000"> Action </span>
						<span id="_363_893_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span>
						<span id="_363_893_Open_Text">
								<span style="COLOR: #000000">{<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> ActionForward execute(ActionMapping mapping, ActionForm form,<br /><img id="_514_891_Open_Image" onclick="this.style.display='none'; document.getElementById('_514_891_Open_Text').style.display='none'; document.getElementById('_514_891_Closed_Image').style.display='inline'; document.getElementById('_514_891_Closed_Text').style.display='inline';" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108389.gif" align="top" /><img id="_514_891_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_514_891_Closed_Text').style.display='none'; document.getElementById('_514_891_Open_Image').style.display='inline'; document.getElementById('_514_891_Open_Text').style.display='inline';" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095109987.gif" align="top" />            HttpServletRequest request, HttpServletResponse response) </span>
								<span style="COLOR: #0000ff">throws</span>
								<span style="COLOR: #000000"> Exception </span>
								<span id="_514_891_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span>
								<span id="_514_891_Open_Text">
										<span style="COLOR: #000000">{<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> TODO Auto-generated method stub</span>
										<span style="COLOR: #008000">
												<br />
												<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />
										</span>
										<span style="COLOR: #000000">    <br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         StringBuilder sb </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> StringBuilder();<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         sb.append(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">);<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         response.addHeader(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">Content-Disposition</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">attachment; filename=test.txt</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">); <br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         response.setContentType(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">application/octet-stream</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">); <br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         response.setCharacterEncoding(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">GB2312</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">); <br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         response.getWriter().write(sb.toString()); <br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />         response.flushBuffer();<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" /><br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108832.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000">;<br /><img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095109659.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200707/20070706095108422.gif" align="top" />}</span>
						</span>
				</div>
		</div>
<img src ="http://www.blogjava.net/yunye/aggbug/187838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-22 01:40 <a href="http://www.blogjava.net/yunye/archive/2008/03/22/187838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在jsp客户端限制表单重复提交</title><link>http://www.blogjava.net/yunye/archive/2008/03/22/187836.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Fri, 21 Mar 2008 17:39:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/22/187836.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/187836.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/22/187836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/187836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/187836.html</trackback:ping><description><![CDATA[在客户端限制表单重复提交有两种方法：<br />         第一种：在javascript脚本中设置一个标志变量，来区分表单是否已经提交。如果已经提交，则弹出对话框告诉用户“重复提交”。<br />        第二种：在单击提交按钮以后将提交按钮设置为disabled状态，这样用户就无法再提交按钮，客户端也就无法重复提交。<br />        <span style="FONT-WEIGHT: bold">采用第一种方法：</span><p>1.新建一个ClientTest1.jsp文件，代码如下：</p><br clear="all" /><p></p><table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="550" align="center" bgcolor="#f3f3f3" border="1" heihgt=""><tbody><tr><td>&lt;%@ page language="java" contentType="text/html; charset=Gb2312"<br />    pageEncoding="GB2312"%&gt;<br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=Gb2312"&gt;<br />&lt;title&gt;客户端限制重复提交&lt;/title&gt;<br />&lt;script language="javascript"<br />    &lt;!--定义重复提交标志变量 --&gt;<br />    var repeatSubmitFlag = false;<br />    &lt;!-- 重复提交检查函数 --&gt;<br />    function checkSubmit()<br />    {<br />        if(repeatSubmitFlag) &lt;!-- 如果标志为true，则说明页面已经提交 --&gt;<br />        {<br />            window.alert('禁止重复提交！');<br />            return false;<br />        }<br />        else<br />        {<br />            repeatSubmitFlag = true;<br />            return true;<br />        }<br />    } <br />&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body bcolor="#ffffff"&gt;<br />    &lt;form name="form_client" action="http://www.dlmu.edu.cn" onsubmit="return checkSubmit();"&gt;<br />        &lt;input type="checkbox" name="check_1" checked=true/&gt;大连海事大学<br />        &lt;input type="submit" name="submitok"/&gt;<br />    &lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</td></tr></tbody></table><p><br />  2.如果重复提交表单就会弹出错误提示对话框<br /><br />    <span style="FONT-WEIGHT: bold">采用第二种方法：</span><br />1.新建一个ClientTest2.jsp文件，代码如下：</p><p></p><table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="550" align="center" bgcolor="#f3f3f3" border="1" heihgt=""><tbody><tr><td>&lt;%@ page language="java" contentType="text/html; charset=GB2312"<br />    pageEncoding="Gb2312"%&gt;<br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=Gb2312"&gt;<br />&lt;title&gt;客户端限制重复提交-2&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body bgcolor="#ffffff"&gt;<br />    &lt;form name="form_client" action="http://www.dlmu.edu.cn" <br />        onsubmit="window.document.form_client.submitok.disabled=true; return true;"&gt;<br />        &lt;input type="checkbox" name="check_1" checked="true"/&gt;大连海事大学<br />        &lt;input type="submit" name="submitok"/&gt;<br />    &lt;/form&gt; <br />&lt;/body&gt;<br />&lt;/html&gt;</td></tr></tbody></table><br />2.如果重复提交表单就会弹出错误提示对话框<img src ="http://www.blogjava.net/yunye/aggbug/187836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-22 01:39 <a href="http://www.blogjava.net/yunye/archive/2008/03/22/187836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在JSP中利用java文件操作大全</title><link>http://www.blogjava.net/yunye/archive/2008/03/22/187835.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Fri, 21 Mar 2008 17:37:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/22/187835.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/187835.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/22/187835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/187835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/187835.html</trackback:ping><description><![CDATA[
		<p>文件的建立/检查与删除</p>
		<br clear="all" />
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;文件的建立、检查与删除&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath("");<br />//out.println(path);<br />File f=new File(path,"File.txt");<br />//out.println(f);<br />//out.println(f.exists());<br /><br />if(f.exists()){//检查File.txt是否存在<br />f.delete();//删除File.txt文件<br />out.println(path + "\\File.txt 存在，已删除。");<br />}else{<br />f.createNewFile();//在当前目录下建立一个名为File.txt的文件<br />out.println(path + "\\File.txt 不存在，已建立。");//输出目前所在的目录路径<br />}<br />%&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />目录的建立/检查与删除</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;目录的建立/检查与删除&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath("");<br />path=path + "\\Sub";//将要建立的目录路径<br />File d=new File(path);//建立代表Sub目录的File对象，并得到它的一个引用<br />if(d.exists()){//检查Sub目录是否存在<br />d.delete();<br />out.println("Sub目录存在，已删除");<br />}else{<br />d.mkdir();//建立Sub目录<br />out.println("Sub目录不存在，已建立");<br />}<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />如何在JSP中处理虚拟目录</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;JSP中如何处理虚拟目录&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />取得虚拟目录对应的磁盘路径&lt;br&gt;<br />Web站点主目录的位置为&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("/")%&gt;&lt;/font&gt;&lt;br&gt;<br />JSP网页所在的目录位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("./")%&gt;&lt;/font&gt;&lt;br&gt;<br />JSP网页所在目录上一层目录的位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("../")%&gt;&lt;/font&gt;&lt;br&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />文件属性的取得</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.util.Date,java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;文件属性的取得&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath("/");<br />File f=new File(path,"ReadData.txt");<br />if(f.exists()){<br />%&gt;<br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt;<br />文件长度为：&lt;%=f.length()%&gt;<br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt;<br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt;<br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt;<br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt;<br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt;<br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt;<br />&lt;%<br />}else{<br />f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文件<br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt;<br />文件长度为：&lt;%=f.length()%&gt;<br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt;<br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt;<br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt;<br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt;<br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt;<br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt;<br />&lt;%<br />}<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>取出目录中文件的方法</p>
		<br clear="all" />
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;取出目录中文件的方法--列出目录中的文件&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath("/");<br />File d=new File(path);//建立当前目录中文件的File对象<br />File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组<br />out.println("&lt;font color=#ff0000&gt;" + path + "目录下的文件：&lt;/font&gt;&lt;br&gt;");<br />for(int i=0;i&lt;list.length;i++){<br />if(list&lt;I&gt;.isFile()){<br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;");<br />}<br />}<br />out.println("&lt;br&gt;&lt;font color=#ff0000&gt;" + path + "目录下的目录：&lt;/font&gt;&lt;br&gt;");<br />for(int i=0;i&lt;list.length;i++){<br />if(list&lt;I&gt;.isDirectory()){<br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;");<br />}<br />}<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />判断是否为空白文件</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;判断是否为空白文件&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath("/");<br />out.println(path);<br />FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader对象，并实例化为fr<br />//对FileReader类生成的对象使用read()方法，可以从字符流中读取下一个字符。<br />if(fr.read()==-1)//判断是否已读到文件的结尾<br />{<br />out.print("AtEnd.txt文件中没有数据&lt;br&gt;");<br />}else{<br />out.println("AtEnd.txt文件中有数据");<br />}<br />fr.close();<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />读取所有的文件数据</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*,java.lang.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;读取所有的文件数据&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath(".");<br />FileReader fr=new FileReader(path + "\\ReadData.txt");<br />//关键在于读取过程中，要判断所读取的字符是否已经到了文件的末尾，并且这个字符是不是文件中的断行符，即判断该字符值是否为13。<br />int c=fr.read();//从文件中读取一个字符<br />//判断是否已读到文件结尾<br />while(c!=-1){<br />out.print((char)c);//输出读到的数据<br />c=fr.read();//从文件中继续读取数据<br />if(c==13){//判断是否为断行字符<br />out.print("&lt;br&gt;");//输出分行标签<br />fr.skip(1);//略过一个字符<br />//c=fr.read();//读取一个字符<br />}<br />}<br />fr.close();<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>一行一行读取数据</p>
		<br clear="all" />
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;文件读取&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath("");//取得当前目录的路径<br />FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader对象，并实例化为fr<br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br<br />String Line=br.readLine();//从文件读取一行字符串<br />//判断读取到的字符串是否不为空<br />while(Line!=null){<br />out.println(Line + "&lt;br&gt;");//输出从文件中读取的数据<br />Line=br.readLine();//从文件中继续读取一行数据<br />}<br />br.close();//关闭BufferedReader对象<br />fr.close();//关闭文件<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /> </td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />略过文件中的字符不读取</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;略过字节不读取&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath(".");<br />FileReader fr=new FileReader(path + "\\ReadData.txt");<br />fr.skip(2);//跳过2个字节<br />int c=fr.read();//读取一个字节<br />while(c!=-1){<br />out.print((char)c);<br />c=fr.read();<br />}<br />fr.close();<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />将数据写入文件</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;将数据写入文件&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath(".");<br />FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter对象，并实例化fw<br />//将字符串写入文件<br />fw.write("大家好！");<br />fw.write("本书是《JSP编程技巧》");<br />fw.write("请多多指教！");<br />fw.write("email:stride@sina.com");<br />fw.close();<br /><br />FileReader fr=new FileReader(path + "\\WriteData.txt");<br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br<br />String Line=br.readLine();<br />//读取一行数据<br />out.println(Line + "&lt;br&gt;");<br />br.close();//关闭BufferedReader对象<br />fr.close();<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
		<p>将写入文件的数据分行</p>
		<br clear="all" />
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath(".");<br />FileWriter fw=new FileWriter(path + "\\WriteData.txt");<br />BufferedWriter bw=new BufferedWriter(fw);<br />bw.write("大家好！");<br />bw.write("本书是《JSP编程技巧》。");<br />bw.newLine();//断行<br />bw.write("请多多指教！");<br />bw.newLine();//断行<br />bw.write("email: stride@sina.com");<br />bw.flush();//将数据更新至文件<br />fw.close();//关闭文件流<br />out.println("写入文件内容为：&lt;br&gt;");<br />FileReader fr=new FileReader(path + "\\WriteData.txt");<br />BufferedReader br=new BufferedReader(fr);<br />String Line=br.readLine();//读取一行数据<br />while(Line!=null){<br />out.println(Line + "&lt;br&gt;");<br />Line=br.readLine();<br />}<br />fr.close();<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />如何将数据追加写入到文件</p>
		<p>
		</p>
		<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
				<tbody>
						<tr>
								<td>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.io.*"%&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />String path=request.getRealPath(".");<br />RandomAccessFile rf=new RandomAccessFile(path + "\\WriteData.txt","rw");//定义一个类RandomAccessFile的对象，并实例化<br />rf.seek(rf.length());//将指针移动到文件末尾<br />rf.writeBytes("\nAppend a line to the file!");<br />rf.close();//关闭文件流<br />out.println("写入文件内容为：&lt;br&gt;");<br />FileReader fr=new FileReader(path + "\\WriteData.txt");<br />BufferedReader br=new BufferedReader(fr);//读取文件的BufferedRead对象<br />String Line=br.readLine();<br />while(Line!=null){<br />out.println(Line + "&lt;br&gt;");<br />Line=br.readLine();<br />}<br />fr.close();//关闭文件<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; </td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/yunye/aggbug/187835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-22 01:37 <a href="http://www.blogjava.net/yunye/archive/2008/03/22/187835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#基础概念二十五问</title><link>http://www.blogjava.net/yunye/archive/2008/03/22/187834.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Fri, 21 Mar 2008 17:30:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/22/187834.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/187834.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/22/187834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/187834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/187834.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">1.静态变量和非静态变量的区别？</font>
		<p>    2.const 和 static readonly 区别？</p>
		<p>    3.extern 是什么意思？</p>
		<p>    4.abstract 是什么意思？</p>
		<p>    5.internal 修饰符起什么作用？</p>
		<p>    6.sealed 修饰符是干什么的？</p>
		<p>    7.override 和 overload 的区别？</p>
		<p>    8.什么是索引指示器？</p>
		<p>    9.new 修饰符是起什么作用？</p>
		<p>    10.this 关键字的含义？</p>
		<p>    11.可以使用抽象函数重写基类中的虚函数吗？</p>
		<p>    12.密封类可以有虚函数吗？</p>
		<p>    13.如果基类中的虚属性只有一个属性访问器，那么继承类重写该属性后可以有几个属性访问器？如果基类中有 get 和 set 两个呢？</p>
		<p>    14.abstract 可以和 virtual 一起使用吗？可以和 override 一起使用吗？</p>
		<p>    15.接口可以包含哪些成员？</p>
		<p>    16.类和结构的区别？</p>
		<p>    17.接口的多继承会带来哪些问题？</p>
		<p>    18.抽象类和接口的区别？</p>
		<p>    19.别名指示符是什么？</p>
		<p>    20.如何释放非托管资源？</p>
		<p>    21.P/Invoke是什么？</p>
		<p>    22.StringBuilder 和 String 的区别？</p>
		<p>    23.explicit 和 implicit 的含义？</p>
		<p>    24.params 有什么用？</p>
		<p>    25.什么是反射？</p>
		<p>    以下是我做的一份参考答案（<a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a> 语言范畴之内），如果有不准确、不全面的，欢迎各位朋友指正！</p>
		<p>    1.静态变量和非静态变量的区别？</p>
		<p>    答：</p>
		<p>    静态变量：</p>
		<p>    静态变量使用 static 修饰符进行声明</p>
		<p>    在所属类被装载时创建</p>
		<p>    通过类进行访问</p>
		<p>    所属类的所有实例的同一静态变量都是同一个值</p>
		<p>    非静态变量：</p>
		<p>    不带有 static 修饰符声明的变量称做非静态变量</p>
		<p>    在类被实例化时创建</p>
		<p>    通过对象进行访问</p>
		<p>    同一个类的不同实例的同一非静态变量可以是不同的值</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example01 { class Program { class Class1 { public static String staticStr = "Class"；public String notstaticStr = "Obj"；} static void Main（string[] args）</p>
		<p>    { //静态变量通过类进行访问，该类所有实例的同一静态变量都是同一个值Console.WriteLine（"Class1's staticStr： {0}"， Class1.staticStr）；</p>
		<p>    Class1 tmpObj1 = new Class1（）；tmpObj1.notstaticStr = "tmpObj1"；Class1 tmpObj2 = new Class1（）；tmpObj2.notstaticStr = "tmpObj2"；</p>
		<p>    //非静态变量通过对象进行访问，不同对象的同一非静态变量可以有不同的值Console.WriteLine（"tmpObj1's notstaticStr： {0}"， tmpObj1.notstaticStr）；Console.WriteLine（"tmpObj2's notstaticStr： {0}"， tmpObj2.notstaticStr）；</p>
		<p>    Console.ReadLine（）；}结果：Class1's staticStr： Class tmpObj1's notstaticStr： tmpObj1 tmpObj2's notstaticStr： tmpObj2</p>
		<p>    2.const 和 static readonly 区别？</p>
		<p>    答：</p>
		<p>    const</p>
		<p>    用 const 修饰符声明的成员叫常量，是在编译期初始化并嵌入到客户端程序</p>
		<p>    static readonly</p>
		<p>    用 static readonly 修饰符声明的成员依然是变量，只不过具有和常量类似的使用方法：通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化</p>
		<p>    示例：</p>
		<p>    测试类：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example02Lib { public class Class1 { public const String strConst = "Const"；public static readonly String strStaticReadonly = "StaticReadonly"；//public const String strConst = "Const Changed"；//public static readonly String strStaticReadonly = "StaticReadonly Changed"；}</p>
		<p>    客户端代码：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；using Example02Lib；</p>
		<p>    namespace Example02 { class Program { static void Main（string[] args）</p>
		<p>    { //修改Example02中Class1的strConst初始值后，只编译Example02Lib项目//然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录，执行Example02.exe //切不可在IDE里直接调试运行因为这会重新编译整个解决方案！！</p>
		<p>    //可以看到strConst的输出没有改变，而strStaticReadonly的输出已经改变//表明Const变量是在编译期初始化并嵌入到客户端程序，而StaticReadonly是在运行时初始化的Console.WriteLine（"strConst ： {0}"， Class1.strConst）；Console.WriteLine（"strStaticReadonly ： {0}"， Class1.strStaticReadonly）；</p>
		<p>    Console.ReadLine（）；}结果：strConst ： Const strStaticReadonly ： StaticReadonly</p>
		<p>    修改后的示例：</p>
		<p>    测试类：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example02Lib { public class Class1 { //public const String strConst = "Const"；//public static readonly String strStaticReadonly = "StaticReadonly"；public const String strConst = "Const Changed"；public static readonly String strStaticReadonly = "StaticReadonly Changed"；}结果</p>
		<p>    strConst ： Const strStaticReadonly ： StaticReadonly Changed</p>
		<p>    3.extern 是什么意思？</p>
		<p>    答：</p>
		<p>    extern 修饰符用于声明由程序集外部实现的成员函数</p>
		<p>    经常用于系统API函数的调用（通过 DllImport ）。注意，和DllImport一起使用时要加上 static 修饰符</p>
		<p>    也可以用于对于同一程序集不同版本组件的调用（用 extern 声明别名）</p>
		<p>    不能与 abstract 修饰符同时使用</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；using System.Runtime.InteropServices；</p>
		<p>    namespace Example03 { class Program { //注意DllImport是一个Attribute Property，在System.Runtime.InteropServices命名空间中定义//extern与DllImport一起使用时必须再加上一个static修饰符[DllImport（"User32.dll"）] public static extern int MessageBox（int Handle， string Message， string Caption， int Type）；</p>
		<p>    static int Main（）</p>
		<p>    { string myString；Console.Write（"Enter your message： "）；myString = Console.ReadLine（）；return MessageBox（0， myString， "My Message Box"， 0）；}结果：</p>
		<p>    4.abstract 是什么意思？</p>
		<p>    答：</p>
		<p>    abstract 修饰符可以用于类、方法、属性、事件和索引指示器（indexer），表示其为抽象成员</p>
		<p>    abstract 不可以和 static 、virtual 、override 一起使用</p>
		<p>    声明为 abstract 成员可以不包括实现代码，但只有类中还有未实现的抽象成员，该类就不可以被实例化，通常用于强制继承类必须实现某一成员</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example04 { #region 基类，抽象类public abstract class BaseClass { //抽象属性，同时具有get和set访问器表示继承类必须将该属性实现为可读写public abstract String Attribute { get；set；}</p>
		<p>    //抽象方法，传入一个字符串参数无返回值public abstract void Function（String value）；</p>
		<p>    //抽象事件，类型为系统预定义的代理（delegate）：EventHandler public abstract event EventHandler Event；</p>
		<p>    //抽象索引指示器，只具有get访问器表示继承类必须将该索引指示器实现为只读public abstract Char this[int Index] { get；} #endregion</p>
		<p>    #region 继承类public class DeriveClass ： BaseClass { private String attribute；</p>
		<p>    public override String Attribute { get { return attribute；} set { attribute = value；} public override void Function（String value）</p>
		<p>    { attribute = value；if （Event ！= null）</p>
		<p>    { Event（this， new EventArgs（））；} public override event EventHandler Event；public override Char this[int Index] { get { return attribute[Index]；} #endregion</p>
		<p>    class Program { static void OnFunction（object sender， EventArgs e）</p>
		<p>    { for （int i = 0； i &lt; （（DeriveClass）sender）。Attribute.Length； i++）</p>
		<p>    { Console.WriteLine（（（DeriveClass）sender）[i]）；} static void Main（string[] args）</p>
		<p>    { DeriveClass tmpObj = new DeriveClass（）；</p>
		<p>    tmpObj.Attribute = "1234567"；Console.WriteLine（tmpObj.Attribute）；</p>
		<p>    //将静态函数OnFunction与tmpObj对象的Event事件进行关联tmpObj.Event += new EventHandler（OnFunction）；</p>
		<p>    tmpObj.Function（"7654321"）；</p>
		<p>    Console.ReadLine（）；}结果：1234567 7 6 5 4 3 2 1</p>
		<p>    5.internal 修饰符起什么作用？</p>
		<p>    答：</p>
		<p>    internal 修饰符可以用于类型或成员，使用该修饰符声明的类型或成员只能在同一程集内访问</p>
		<p>    接口的成员不能使用 internal 修饰符</p>
		<p>    示例</p>
		<p>    Example05Lib 项目的 Class1</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example05Lib { public class Class1 { internal String strInternal = null；public String strPublic；}结果Example05Lib 项目的 Class2 类可以访问到 Class1 的 strInternal 成员</p>
		<p>    Example05 项目的 Program 类无法访问到 Class1 的 strInternal 成员</p>
		<p>    [NextPage]</p>
		<p>    6.sealed 修饰符是干什么的？</p>
		<p>    答：</p>
		<p>    sealed 修饰符表示密封</p>
		<p>    用于类时，表示该类不能再被继承，不能和 abstract 同时使用，因为这两个修饰符在含义上互相排斥</p>
		<p>    用于方法和属性时，表示该方法或属性不能再被继承，必须和 override 关键字一起使用，因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员</p>
		<p>    通常用于实现第三方类库时不想被客户端继承，或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱</p>
		<p>    恰当的利用 sealed 修饰符也可以提高一定的运行效率，因为不用考虑继承类会重写该成员</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example06 { class Program { class A { public virtual void F（）</p>
		<p>    { Console.WriteLine（"A.F"）；} public virtual void G（）</p>
		<p>    { Console.WriteLine（"A.G"）；} class B ： A { public sealed override void F（）</p>
		<p>    { Console.WriteLine（"B.F"）；} public override void G（）</p>
		<p>    { Console.WriteLine（"B.G"）；} class C ： B { public override void G（）</p>
		<p>    { Console.WriteLine（"C.G"）；} static void Main（string[] args）</p>
		<p>    { new A（）。F（）；new A（）。G（）；new B（）。F（）；new B（）。G（）；new C（）。F（）；new C（）。G（）；</p>
		<p>    Console.ReadLine（）；}结果：类 B 在继承类 A 时可以重写两个虚函数，如图所示：</p>
		<p>    由于类 B 中对 F 方法进行了密封， 类 C 在继承类 B 时只能重写一个函数，如图所示：</p>
		<p>    控制台输出结果，类 C 的方法 F 只能是输出 类B 中对该方法的实现：</p>
		<p>    A.F A.G B.F B.G B.F C.G</p>
		<p>    7.override 和 overload 的区别？</p>
		<p>    答：</p>
		<p>    override 表示重写，用于继承类对基类中虚成员的实现</p>
		<p>    overload 表示重载，用于同一个类中同名方法不同参数（包括类型不同或个数不同）的实现</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example07 { class Program { class BaseClass { public virtual void F（）</p>
		<p>    { Console.WriteLine（"BaseClass.F"）；} class DeriveClass ： BaseClass { public override void F（）</p>
		<p>    { base.F（）；Console.WriteLine（"DeriveClass.F"）；} public void Add（int Left， int Right）</p>
		<p>    { Console.WriteLine（"Add for Int： {0}"， Left + Right）；} public void Add（double Left， double Right）</p>
		<p>    { Console.WriteLine（"Add for int： {0}"， Left + Right）；} static void Main（string[] args）</p>
		<p>    { DeriveClass tmpObj = new DeriveClass（）；tmpObj.F（）；tmpObj.Add（1， 2）；tmpObj.Add（1.1， 2.2）；</p>
		<p>    Console.ReadLine（）；}结果：BaseClass.F DeriveClass.F Add for Int： 3 Add for int： 3.3</p>
		<p>    8.什么是索引指示器？</p>
		<p>    答：</p>
		<p>    实现索引指示器（indexer）的类可以象数组那样使用其实例后的对象，但与数组不同的是索引指示器的参数类型不仅限于int</p>
		<p>    简单来说，其本质就是一个含参数属性</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example08 { public class Point { private double x， y；public Point（double X， double Y）</p>
		<p>    { x = X；y = Y；} //重写ToString方法方便输出public override string ToString（）</p>
		<p>    { return String.Format（"X： {0} ， Y： {1}"， x， y）；} public class Points { Point[] points；public Points（Point[] Points）</p>
		<p>    { points = Points；} public int PointNumber { get { return points.Length；} //实现索引访问器public Point this[int Index] { get { return points[Index]；}</p>
		<p>    //感谢watson hua（http://huazhihao.cnblogs.com/）的指点//索引指示器的实质是含参属性，参数并不只限于int class WeatherOfWeek { public string this[int Index] { get { //注意case段使用return直接返回所以不需要break switch （Index）</p>
		<p>    { case 0：{ return "Today is cloudy！"；} case 5：{ return "Today is thundershower！"；} default：{ return "Today is fine！"；} public string this[string Day] { get { string TodayWeather = null；//switch的标准写法switch （Day）</p>
		<p>    { case "Sunday"：{ TodayWeather = "Today is cloudy！"；break；} case "Friday"：{ TodayWeather = "Today is thundershower！"；break；} default：{ TodayWeather = "Today is fine！"；break；} return TodayWeather；} class Program { static void Main（string[] args）</p>
		<p>    { Point[] tmpPoints = new Point[10]；for （int i = 0； i &lt; tmpPoints.Length； i++）</p>
		<p>    { tmpPoints[i] = new Point（i， Math.Sin（i））；}</p>
		<p>    Points tmpObj = new Points（tmpPoints）；for （int i = 0； i &lt; tmpObj.PointNumber； i++）</p>
		<p>    { Console.WriteLine（tmpObj[i]）；}</p>
		<p>    string[] Week = new string[] { "Sunday"， "Monday"， "Tuesday"， "Wednesday"， "Thursday"， "Friday"， "Staurday"}；WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek（）；for （int i = 0； i &lt; 6； i++）</p>
		<p>    { Console.WriteLine（tmpWeatherOfWeek[i]）；} foreach （string tmpDay in Week）</p>
		<p>    { Console.WriteLine（tmpWeatherOfWeek[tmpDay]）；}</p>
		<p>    Console.ReadLine（）；}结果：X： 0 ， Y： 0 X： 1 ， Y： 0.841470984807897 X： 2 ， Y： 0.909297426825682 X： 3 ， Y： 0.141120008059867 X： 4 ， Y： -0.756802495307928 X： 5 ， Y： -0.958924274663138 X： 6 ， Y： -0.279415498198926 X： 7 ， Y： 0.656986598718789 X： 8 ， Y： 0.989358246623382 X： 9 ， Y： 0.412118485241757 Today is cloudy！</p>
		<p>    Today is fine！</p>
		<p>    Today is thundershower！</p>
		<p>    Today is cloudy！</p>
		<p>    Today is fine！</p>
		<p>    Today is thundershower！</p>
		<p>    Today is fine！</p>
		<p>    9.new 修饰符是起什么作用？</p>
		<p>    答：</p>
		<p>    new 修饰符与 new 操作符是两个概念</p>
		<p>    new 修饰符用于声明类或类的成员，表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型</p>
		<p>    new 修饰符只能用于继承类，一般用于弥补基类设计的不足</p>
		<p>    new 修饰符和 override 修饰符不可同时用在一个成员上，因为这两个修饰符在含义上互相排斥</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example09 { class BaseClass { //基类设计者声明了一个PI的公共变量，方便进行运算public static double PI = 3.1415；} class DervieClass ： BaseClass { //继承类发现该变量的值不能满足运算精度，于是可以通过new修饰符显示隐藏基类中的声明public new static double PI = 3.1415926；} class Program { static void Main（string[] args）</p>
		<p>    { Console.WriteLine（BaseClass.PI）；Console.WriteLine（DervieClass.PI）；</p>
		<p>    Console.ReadLine（）；}结果：3.1415 3.1415926</p>
		<p>    10.this 关键字的含义？</p>
		<p>    答：</p>
		<p>    this 是一个保留字，仅限于构造函数和方法成员中使用</p>
		<p>    在类的构造函数中出现表示对正在构造的对象本身的引用，在类的方法中出现表示对调用该方法的对象的引用，在结构的构造上函数中出现表示对正在构造的结构的引用，在结构的方法中出现表示对调用该方法的结果的引用</p>
		<p>    this 保留字不能用于静态成员的实现里，因为这时对象或结构并未实例化</p>
		<p>    在 <a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a> 系统中，this 实际上是一个常量，所以不能使用 this++ 这样的运算</p>
		<p>    this 保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example10 { class Class1 { private double c；private string value；</p>
		<p>    public double C { get { return c；} public Class1（double c）</p>
		<p>    { //限定同名的隐藏成员this.c = c；} public Class1（Class1 value）</p>
		<p>    { //用对象本身实例化自己没有意义if （this ！= value）</p>
		<p>    { c = value.C；} public override string ToString（）</p>
		<p>    { //将对象本身做为参数return string.Format（"{0} Celsius = {1} Fahrenheit"， c， UnitTransClass.C2F（this））；}</p>
		<p>    //由于好奇，在这做了一个效率测试，想看看到底哪种方式访问成员变量更快，结论：区别不大……</p>
		<p>    public string Test1（）</p>
		<p>    { long vTickCount = Environment.TickCount；for （int i = 0； i &lt; 10000000； i++）</p>
		<p>    this.value = i.ToString（）；return string.Format（"Have this.： {0} MSEL"， Environment.TickCount - vTickCount）；} public string Test2（）</p>
		<p>    { long vTickCount = Environment.TickCount；for （int i = 0； i &lt; 10000000； i++）</p>
		<p>    value = i.ToString（）；return string.Format（"Don't have this.： {0} MSEL"， Environment.TickCount - vTickCount）；} class UnitTransClass { public static double C2F（Class1 value）</p>
		<p>    { //摄氏到华氏的转换公式return 1.8 * value.C + 32；} class Program { static void Main（string[] args）</p>
		<p>    { Class1 tmpObj = new Class1（37.5）；</p>
		<p>    Console.WriteLine（tmpObj）；</p>
		<p>    Console.WriteLine（tmpObj.Test1（））；Console.WriteLine（tmpObj.Test2（））；</p>
		<p>    Console.ReadLine（）；}结果：37.5 Celsius = 99.5 Fahrenheit Have this.： 4375 MSEL Don't have this.： 4406 MSEL</p>
		<p>       [NextPage]</p>
		<p>    11.可以使用抽象函数重写基类中的虚函数吗？</p>
		<p>    答：</p>
		<p>    可以，但需使用 new 修饰符显式声明，表示隐藏了基类中该函数的实现</p>
		<p>    示例：</p>
		<p>    class BaseClass { public virtual void F（）</p>
		<p>    { Console.WriteLine（"BaseClass.F"）；} abstract class  DeriveClass ： BaseClass { public new abstract void F（）；}</p>
		<p>    12.密封类可以有虚函数吗？</p>
		<p>    答：</p>
		<p>    可以，基类中的虚函数将隐式的转化为非虚函数，但密封类本身不能再增加新的虚函数</p>
		<p>    示例：</p>
		<p>    class BaseClass { public virtual void F（）</p>
		<p>    { Console.WriteLine（"BaseClass.F"）；} sealed class DeriveClass ： BaseClass { //基类中的虚函数F被隐式的转化为非虚函数</p>
		<p>    //密封类中不能再声明新的虚函数G //public virtual void G（）</p>
		<p>    //{ //    Console.WriteLine（"DeriveClass.G"）；//} }</p>
		<p>    13.如果基类中的虚属性只有一个属性访问器，那么继承类重写该属性后可以有几个属性访问器？如果基类中有 get 和 set 两个呢？</p>
		<p>    答：</p>
		<p>    如果基类中的虚属性只有一个属性访问器，那么继承类重写该属性后也应只有一个。如果基类中有 get 和 set 两个属性访问器，那么继承类中可以只有一个也可以同时有两个属性访问器</p>
		<p>    14.abstract 可以和 virtual 一起使用吗？可以和 override 一起使用吗？</p>
		<p>    答：</p>
		<p>    abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用</p>
		<p>    15.接口可以包含哪些成员？</p>
		<p>    答：</p>
		<p>    接口可以包含属性、方法、索引指示器和事件，但不能包含常量、域、操作符、构造函数和析构函数，而且也不能包含任何静态成员</p>
		<p>    16.类和结构的区别？</p>
		<p>    答：类：</p>
		<p>    类是引用类型在堆上分配，类的实例进行赋值只是复制了引用，都指向同一段实际对象分配的内存</p>
		<p>    类有构造和析构函数</p>
		<p>    类可以继承和被继承</p>
		<p>    结构：</p>
		<p>    结构是值类型在栈上分配（虽然栈的访问速度比较堆要快，但栈的资源有限放），结构的赋值将分配产生一个新的对象。</p>
		<p>    结构没有构造函数，但可以添加。结构没有析构函数</p>
		<p>    结构不可以继承自另一个结构或被继承，但和类一样可以继承自接口</p>
		<p>    示例：</p>
		<p>    根据以上比较，我们可以得出一些轻量级的对象最好使用结构，但数据量大或有复杂处理逻辑对象最好使用类。</p>
		<p>    如：Geoemtry（GIS 里的一个概论，在 OGC 标准里有定义） 最好使用类，而 Geometry 中点的成员最好使用结构</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example16 { interface IPoint { double X { get；set；} double Y { get；set；} double Z { get；set；} //结构也可以从接口继承struct Point： IPoint { private double x， y， z；//结构也可以增加构造函数public Point（double X， double Y， double Z）</p>
		<p>    { this.x = X；this.y = Y；this.z = Z；} public double X { get { return x； } set { x = value； } } public double Y { get { return x； } set { x = value； } } public double Z { get { return x； } set { x = value； } } //在此简化了点状Geometry的设计，实际产品中还包含Project（坐标变换）等复杂操作class PointGeometry { private Point value；</p>
		<p>    public PointGeometry（double X， double Y， double Z）</p>
		<p>    { value = new Point（X， Y， Z）；} public PointGeometry（Point value）</p>
		<p>    { //结构的赋值将分配新的内存this.value = value；} public double X { get { return value.X； } set { this.value.X = value； } } public double Y { get { return value.Y； } set { this.value.Y = value； } } public double Z { get { return value.Z； } set { this.value.Z = value； } } public static PointGeometry operator +（PointGeometry Left， PointGeometry Rigth）</p>
		<p>    { return new PointGeometry（Left.X + Rigth.X， Left.Y + Rigth.Y， Left.Z + Rigth.Z）；} public override string ToString（）</p>
		<p>    { return string.Format（"X： {0}， Y： {1}， Z： {2}"， value.X， value.Y， value.Z）；} class Program { static void Main（string[] args）</p>
		<p>    { Point tmpPoint = new Point（1， 2， 3）；</p>
		<p>    PointGeometry tmpPG1 = new PointGeometry（tmpPoint）；PointGeometry tmpPG2 = new PointGeometry（tmpPoint）；tmpPG2.X = 4；tmpPG2.Y = 5；tmpPG2.Z = 6；</p>
		<p>    //由于结构是值类型，tmpPG1 和 tmpPG2 的坐标并不一样Console.WriteLine（tmpPG1）；Console.WriteLine（tmpPG2）；</p>
		<p>    //由于类是引用类型，对tmpPG1坐标修改后影响到了tmpPG3 PointGeometry tmpPG3 = tmpPG1；tmpPG1.X = 7；tmpPG1.Y = 8；tmpPG1.Z = 9；Console.WriteLine（tmpPG1）；Console.WriteLine（tmpPG3）；</p>
		<p>    Console.ReadLine（）；}结果：X： 1， Y： 2， Z： 3 X： 4， Y： 5， Z： 6 X： 7， Y： 8， Z： 9</p>
		<p>     [NextPage]<br /><br />     17.接口的多继承会带来哪些问题？</p>
		<p>    答：</p>
		<p>    <a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a> 中的接口与类不同，可以使用多继承，即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员，就产生了二义性（这也正是 C# 中类取消了多继承的原因之一），这时在实现时最好使用显式的声明</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example17 { class Program { //一个完整的接口声明示例interface IExample { //属性string P { get；set；} //方法string F（int Value）；//事件event EventHandler E；//索引指示器string this[int Index] { get；set；} interface IA { int Count { get； set；} } interface IB { int Count（）；} //IC接口从IA和IB多重继承interface IC ： IA， IB { } class C ： IC { private int count = 100；//显式声明实现IA接口中的Count属性int IA.Count { get { return 100； } set { count = value； } } //显式声明实现IB接口中的Count方法int IB.Count（）</p>
		<p>    { return count * count；} static void Main（string[] args）</p>
		<p>    { C tmpObj = new C（）；</p>
		<p>    //调用时也要显式转换Console.WriteLine（"Count property： {0}"， （（IA）tmpObj）。Count）；Console.WriteLine（"Count function： {0}"， （（IB）tmpObj）。Count（））；</p>
		<p>    Console.ReadLine（）；}结果：Count property： 100 Count function： 10000</p>
		<p>    18.抽象类和接口的区别？</p>
		<p>    答：</p>
		<p>    抽象类（abstract class）可以包含功能定义和实现，接口（interface）只能包含功能定义</p>
		<p>    抽象类是从一系列相关对象中抽象出来的概念， 因此反映的是事物的内部共性；接口是为了满足外部调用而定义的一个功能约定， 因此反映的是事物的外部特性</p>
		<p>    分析对象，提炼内部共性形成抽象类，用以表示对象本质，即“是什么”</p>
		<p>    为外部提供调用或功能需要扩充时优先使用接口</p>
		<p>    19.别名指示符是什么？</p>
		<p>    答：</p>
		<p>    通过别名指示符我们可以为某个类型起一个别名</p>
		<p>    主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间</p>
		<p>    别名指示符只在一个单元文件内起作用</p>
		<p>    示例：</p>
		<p>    Class1.cs：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01 { class Class1 { public override string ToString（）</p>
		<p>    { return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1"；} Class2.cs</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02 { class Class1 { public override string ToString（）</p>
		<p>    { return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1"；}主单元（Program.cs）：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    //使用别名指示符解决同名类型的冲突using Lib01Class1 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01.Class1；using Lib02Class2 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02.Class1；</p>
		<p>    namespace Example19 { class Program { static void Main（string[] args）</p>
		<p>    { Lib01Class1 tmpObj1 = new Lib01Class1（）；Lib02Class2 tmpObj2 = new Lib02Class2（）；</p>
		<p>    Console.WriteLine（tmpObj1）；Console.WriteLine（tmpObj2）；</p>
		<p>    Console.ReadLine（）；}结果：com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1 com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1</p>
		<p>    20.如何释放非托管资源？</p>
		<p>    答：</p>
		<p>    。NET 平台在内存管理方面提供了GC（Garbage Collection），负责自动释放托管资源和内存回收的工作，但它无法对非托管资源进行释放，这时我们必须自己提供方法来释放对象内分配的非托管资源，比如你在对象的实现代码中使用了一个COM对象</p>
		<p>    最简单的办法，可以通过实现protected void Finalize（）（析构函数会在编译时变成这个东东）来释放非托管资源，因为GC在释放对象时会检查该对象是否实现了 Finalize（） 方法，如果是则调用它。但，据说这样会降低效率……</p>
		<p>    有一种更好的，那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法，而不是傻傻的等着GC来释放我们的对象（何况效率又那么低）</p>
		<p>    System 命名空间内有一个 IDisposable 接口，拿来做这事非常合适，就省得我们自己再声明一个接口了</p>
		<p>    另外补充一句，这种实现并不一定要使用了非托管资源后才用，如果你设计的类会在运行时有大些的实例（象 GIS 中的Geometry），为了优化程序性能，你也可以通过实现该接口让客户调用端在确认不需要这些对象时手工释放它们</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example20 { class Program { class Class1 ： IDisposable { //析构函数，编译后变成 protected void Finalize（），GC会在回收对象前会调用调用该方法~Class1（）</p>
		<p>    { Dispose（false）；}</p>
		<p>    //通过实现该接口，客户可以显式地释放对象，而不需要等待GC来释放资源，据说那样会降低效率void IDisposable.Dispose（）</p>
		<p>    { Dispose（true）；}</p>
		<p>    //将释放非托管资源设计成一个虚函数，提供在继承类中释放基类的资源的能力protected virtual void ReleaseUnmanageResources（）</p>
		<p>    { //Do something……</p>
		<p>    }</p>
		<p>    //私有函数用以释放非托管资源private void Dispose（bool disposing）</p>
		<p>    { ReleaseUnmanageResources（）；</p>
		<p>    //为true时表示是客户显式调用了释放函数，需通知GC不要再调用对象的Finalize方法//为false时肯定是GC调用了对象的Finalize方法，所以没有必要再告诉GC你不要调用我的Finalize方法啦if （disposing）</p>
		<p>    { GC.SuppressFinalize（this）；} static void Main（string[] args）</p>
		<p>    { //tmpObj1没有手工释放资源，就等着GC来慢慢的释放它吧Class1 tmpObj1 = new Class1（）；</p>
		<p>    //tmpObj2调用了Dispose方法，传说比等着GC来释放它效率要调一些//个人认为是因为要逐个对象的查看其元数据，以确认是否实现了Dispose方法吧//当然最重要的是我们可以自己确定释放的时间以节省内存，优化程序运行效率Class1 tmpObj2 = new Class1（）；（（IDisposable）tmpObj2）。Dispose（）；}</p>
		<p>    21.P/Invoke是什么？</p>
		<p>    答：</p>
		<p>    在受控代码与非受控代码进行交互时会产生一个事务（transition） ，这通常发生在使用平台调用服务（Platform Invocation Services），即P/Invoke</p>
		<p>    如调用系统的 API 或与 COM 对象打交道，通过 System.Runtime.InteropServices 命名空间</p>
		<p>    虽然使用 Interop 非常方便，但据估计每次调用事务都要执行 10 到 40 条指令，算起来开销也不少，所以我们要尽量少调用事务</p>
		<p>    如果非用不可，建议本着一次调用执行多个动作，而不是多次调用每次只执行少量动作的原则</p>
		<p>    [NextPage]<br /><br />   22.StringBuilder 和 String 的区别？</p>
		<p>    答：</p>
		<p>    String 虽然是一个引用类型，但在赋值操作时会产生一个新的对象，而 StringBuilder 则不会</p>
		<p>    所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder，不要使用 String</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example22 { class Program { static void Main（string[] args）</p>
		<p>    { const int cycle = 100000；</p>
		<p>    long vTickCount = Environment.TickCount；String str = null；for （int i = 0； i &lt; cycle； i++）</p>
		<p>    str += i.ToString（）；Console.WriteLine（"String： {0} MSEL"， Environment.TickCount - vTickCount）；</p>
		<p>    vTickCount = Environment.TickCount；//看到这个变量名我就生气，奇怪为什么大家都使它呢？ ：）</p>
		<p>    StringBuilder sb = new StringBuilder（）；for （int i = 0； i &lt; cycle； i++）</p>
		<p>    sb.Append（i）；Console.WriteLine（"StringBuilder： {0} MSEL"， Environment.TickCount - vTickCount）；</p>
		<p>    Console.ReadLine（）；}结果：String： 102047 MSEL StringBuilder： 46 MSEL</p>
		<p>    23.explicit 和 implicit 的含义？</p>
		<p>    答：</p>
		<p>    explicit 和 implicit 属于转换运算符，如用这两者可以让我们自定义的类型支持相互<a class="channel_keylink" href="http://cisco.chinaitlab.com/List_7.html" target="_blank">交换</a></p>
		<p>    explicti 表示显式转换，如从 A -&gt; B 必须进行强制类型转换（B = （B）A）</p>
		<p>    implicit 表示隐式转换，如从 B -&gt; A 只需直接赋值（A = B）</p>
		<p>    隐式转换可以让我们的代码看上去更漂亮、更简洁易懂，所以最好多使用 implicit 运算符。不过！如果对象本身在转换时会损失一些信息（如精度），那么我们只能使用 explicit 运算符，以便在编译期就能警告客户调用端</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example23 { class Program { //本例灵感来源于大话西游经典台词“神仙？妖怪？”——主要是我实在想不出什么好例子了class Immortal { public string name；public Immortal（string Name）</p>
		<p>    { name = Name；} public static implicit operator Monster（Immortal value）</p>
		<p>    { return new Monster（value.name + "：神仙变妖怪？偷偷下凡即可……"）；} class Monster { public string name；public Monster（string Name）</p>
		<p>    { name = Name；} public static explicit operator Immortal（Monster value）</p>
		<p>    { return new Immortal（value.name + "：妖怪想当神仙？再去修炼五百年！"）；} static void Main（string[] args）</p>
		<p>    { Immortal tmpImmortal = new Immortal（"紫霞仙子"）；//隐式转换Monster tmpObj1 = tmpImmortal；Console.WriteLine（tmpObj1.name）；</p>
		<p>    Monster tmpMonster = new Monster（"孙悟空"）；//显式转换Immortal tmpObj2 = （Immortal）tmpMonster；Console.WriteLine（tmpObj2.name）；</p>
		<p>    Console.ReadLine（）；}结果：紫霞仙子：神仙变妖怪？偷偷下凡即可……</p>
		<p>    孙悟空：妖怪想当神仙？再去修炼五百年！</p>
		<p>    24.params 有什么用？</p>
		<p>    答：</p>
		<p>    params 关键字在方法成员的参数列表中使用，为该方法提供了参数个数可变的能力</p>
		<p>    它在只能出现一次并且不能在其后再有参数定义，之前可以</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace ConsoleApplication1 { class App { //第一个参数必须是整型，但后面的参数个数是可变的。</p>
		<p>    //而且由于定的是object数组，所有的数据类型都可以做为参数传入public static void UseParams（int id， params object[] list）</p>
		<p>    { Console.WriteLine（id）；for （int i = 0； i &lt; list.Length； i++）</p>
		<p>    { Console.WriteLine（list[i]）；}</p>
		<p>    static void Main（）</p>
		<p>    { //可变参数部分传入了三个参数，都是字符串类型UseParams（1， "a"， "b"， "c"）；//可变参数部分传入了四个参数，分别为字符串、整数、浮点数和双精度浮点数数组UseParams（2， "d"， 100， 33.33， new double[] { 1.1， 2.2 }）；</p>
		<p>    Console.ReadLine（）；}结果：1 a b c 2 d 100 33.33 System.Double[]</p>
		<p>    25.什么是反射？</p>
		<p>    答：</p>
		<p>    反射，Reflection，通过它我们可以在运行时获得各种信息，如程序集、模块、类型、字段、属性、方法和事件</p>
		<p>    通过对类型动态实例化后，还可以对其执行操作</p>
		<p>    一般用于插件式框架程序和设计模式的实现，当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情（前面好象见过一位高人用反射调用一个官方类库中未说明的函数……）</p>
		<p>    示例：</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    namespace Example25Lib { public class Class1 { private string name；private int age；</p>
		<p>    //如果显式的声明了无参数构造函数，客户端只需要用程序集的CreateInstance即可实例化该类//在此特意不实现，以便在客户调用端体现构造函数的反射实现//public Class1（）</p>
		<p>    //{ //} public Class1（string Name， int Age）</p>
		<p>    { name = Name；age = Age；} public void ChangeName（string NewName）</p>
		<p>    { name = NewName；} public void ChangeAge（int NewAge）</p>
		<p>    { age = NewAge；} public override string ToString（）</p>
		<p>    { return string.Format（"Name： {0}， Age： {1}"， name， age）；}反射实例化对象并调用其方法，属性和事件的反射调用略去</p>
		<p>    using System；using System.Collections.Generic；using System.Text；</p>
		<p>    //注意添加该反射的命名空间using System.Reflection；</p>
		<p>    namespace Example25 { class Program { static void Main（string[] args）</p>
		<p>    { //加载程序集Assembly tmpAss = Assembly.LoadFile（AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll"）；</p>
		<p>    //遍历程序集内所有的类型，并实例化Type[] tmpTypes = tmpAss.GetTypes（）；foreach （Type tmpType in tmpTypes）</p>
		<p>    { //获取第一个类型的构造函数信息ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors（）；foreach （ConstructorInfo tmpConsInfo in tmpConsInfos）</p>
		<p>    { //为构造函数生成调用的参数集合ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters（）；object[] tmpParams = new object[tmpParamInfos.Length]；for （int i = 0； i &lt; tmpParamInfos.Length； i++）</p>
		<p>    { tmpParams[i] = tmpAss.CreateInstance（tmpParamInfos[i].ParameterType.FullName）；if （tmpParamInfos[i].ParameterType.FullName == "System.String"）</p>
		<p>    { tmpParams[i] = "Clark"；}</p>
		<p>    //实例化对象object tmpObj = tmpConsInfo.Invoke（tmpParams）；Console.WriteLine（tmpObj）；</p>
		<p>    //获取所有方法并执行foreach （MethodInfo tmpMethod in tmpType.GetMethods（））</p>
		<p>    { //为方法的调用创建参数集合tmpParamInfos = tmpMethod.GetParameters（）；tmpParams = new object[tmpParamInfos.Length]；for （int i = 0； i &lt; tmpParamInfos.Length； i++）</p>
		<p>    { tmpParams[i] = tmpAss.CreateInstance（tmpParamInfos[i].ParameterType.FullName）；if （tmpParamInfos[i].ParameterType.FullName == "System.String"）</p>
		<p>    { tmpParams[i] = "Clark Zheng"；} if （tmpParamInfos[i].ParameterType.FullName == "System.Int32"）</p>
		<p>    { tmpParams[i] = 27；} tmpMethod.Invoke（tmpObj， tmpParams）；}</p>
		<p>    //调用完方法后再次打印对象，比较结果Console.WriteLine（tmpObj）；}</p>
<img src ="http://www.blogjava.net/yunye/aggbug/187834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-22 01:30 <a href="http://www.blogjava.net/yunye/archive/2008/03/22/187834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奋斗</title><link>http://www.blogjava.net/yunye/archive/2008/03/22/187832.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Fri, 21 Mar 2008 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/22/187832.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/187832.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/22/187832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/187832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/187832.html</trackback:ping><description><![CDATA[     “<br />        有时觉得奋斗真好，可以勇敢的抬头，任阳光在脸上绽放；奋斗真好，可以不计利益损失，按照自己的意愿生活，大有一片我的生活我作主的豪迈；奋斗真好，就算输得一塌糊涂，可是还有青春这张王牌给我们绝处逢生的喜悦；奋斗真好，可以潇洒的爱，可以痛快的哭，可以一贫如洗，也可以一步登天；奋斗真好，还有长长久久的明天可以去拼搏…… <br />       ”<img src ="http://www.blogjava.net/yunye/aggbug/187832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-22 01:06 <a href="http://www.blogjava.net/yunye/archive/2008/03/22/187832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts使用Tiles辅助开发(转载)</title><link>http://www.blogjava.net/yunye/archive/2008/03/18/186998.html</link><dc:creator>yunye</dc:creator><author>yunye</author><pubDate>Tue, 18 Mar 2008 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/yunye/archive/2008/03/18/186998.html</guid><wfw:comment>http://www.blogjava.net/yunye/comments/186998.html</wfw:comment><comments>http://www.blogjava.net/yunye/archive/2008/03/18/186998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yunye/comments/commentRss/186998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yunye/services/trackbacks/186998.html</trackback:ping><description><![CDATA[Jplateau（原作）&nbsp;<a href="http://www.javaresearch.org/article/8134.htm">来自：http://www.javaresearch.org/article/8134.htm</a><br />
<br />
对于在页面的布局管理以及可重用方面，Tiles做得很优秀，使我们在开发过程中思路非常流畅，特别是在用struts开发项目过程中，如果使用tiels来辅助开发，往往能带到事半功倍的效果。<br />
<br />
如果要看Tiles的详细文档，请访问<a href="http://www.lifl.fr/~dumoulin/tiles/">http://www.lifl.fr/~dumoulin/tiles/</a><br />
<br />
在此我想从使用方式上说一下自己的经验：<br />
<br />
往往我们的一个项目中，大部分的页面的布局都是一样的，这其中如果我们把一样风格的页面归为一类的话，这样的分类就不会很多了。（不同的项目这样的分类多少为有区别，要看页面风格规划的是否高效）<br />
<br />
假设我们提出一类页面（如产品管理）的风格，布局如下：<br />
<img src="http://www.csdn.net/Develop/ArticleImages/19/19985/CSDN_Dev_Image_2003-7-241402590.gif"  alt="" />&nbsp;<br />
那么我们可以在tiles-defs.xml中定义这样一个总的类型，如下：<br />
<br />
tiles-defs.xml&nbsp;&nbsp;放在/yourwebapp/WEB-INF/下<br />
<br />
<div class="codeStyle">
<ol>
    <li>&lt;?xml&nbsp;version=<font color="#ff33ff">"1.0"</font>&nbsp;encoding=<font color="#ff33ff">"ISO-8859-1"</font>&nbsp;?&gt;
    <li>&nbsp;&lt;!DOCTYPE&nbsp;tiles-definitions&nbsp;PUBLIC
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Tiles&nbsp;Configuration&nbsp;1.1//EN"</font>
    <li><font color="#ff33ff">"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"</font>&gt;
    <li>&lt;tiles-definitions&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!―布局类型一&nbsp;--&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;definition&nbsp;name=<font color="#ff33ff">"mainLayout"</font>&nbsp;path=<font color="#ff33ff">"/homepage.jsp"</font>&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"top"</font>&nbsp;&nbsp;value=<font color="#ff33ff">"/header.jsp"</font>&nbsp;/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"menu"</font>&nbsp;&nbsp;&nbsp;&nbsp;value=<font color="#ff33ff">"/menu.jsp"</font>/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"main"</font>&nbsp;value=<font color="#ff33ff">"/main.jsp"</font>&nbsp;/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"footer"</font>&nbsp;value=<font color="#ff33ff">"/footer.jsp"</font>&nbsp;/&gt;&nbsp;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&lt;/definition&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!―布局类型二&nbsp;--&gt;
    <li>&nbsp;&nbsp;&lt;definition&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;
    <li>&nbsp;&nbsp;&lt;/definition&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;
    <li>&lt;/tiles-definitions&gt; </li>
</ol>
</div>
<br />
<br />
以上定义了一种布局类型，假设命名为A布局，下面要列举两个属于该类型风格的页面的布局方法添加产品页面，最终我们要关心的时addProducts.jsp这个页面，但是我们如何使用A布局的布局风格呢？<br />
<br />
如下：<br />
<br />
&#8230;&#8230;接上tiles-defs.xml&#8230;&#8230;<br />
<br />
<div class="codeStyle">
<ol>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!―布局类型A布局一&nbsp;--&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;definition&nbsp;name=<font color="#ff33ff">"mainLayout"</font>&nbsp;path=<font color="#ff33ff">"/homepage.jsp"</font>&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"top"</font>&nbsp;&nbsp;value=<font color="#ff33ff">"/header.jsp"</font>&nbsp;/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"menu"</font>&nbsp;&nbsp;&nbsp;&nbsp;value=<font color="#ff33ff">"/menu.jsp"</font>/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"main"</font>&nbsp;value=<font color="#ff33ff">"/main.jsp"</font>&nbsp;/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=<font color="#ff33ff">"footer"</font>&nbsp;value=<font color="#ff33ff">"/footer.jsp"</font>&nbsp;/&gt;&nbsp;&nbsp;&nbsp;
    <li>&lt;/definition&gt;
    <li>
    <li>&lt;!―布局类型A布局&#8220;子类1:添加商品&#8221;一&nbsp;--&gt;
    <li>&lt;definition&nbsp;name=&#8221;mainLayout_products_add&#8221;&nbsp;<strong><font color="#0000ff">extends</font></strong>=&#8221;&nbsp;mainLayout&#8221;&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=&#8221;main&#8221;&nbsp;value=&#8221;/addProducts.jsp&#8221;/&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!―相当于把布局A中main的内容换成我们需要的，其他保留&nbsp;--&gt;
    <li>&lt;/definition&gt;
    <li>&lt;!―布局类型A布局&#8220;子类2:查询商品&#8221;一&nbsp;--&gt;
    <li>&lt;definition&nbsp;name=&#8221;mainLayout_products_search&#8221;&nbsp;<strong><font color="#0000ff">extends</font></strong>=&#8221;&nbsp;mainLayout&#8221;&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;put&nbsp;name=&#8221;main&#8221;&nbsp;value=&#8221;/searchProducts.jsp&#8221;/&gt;
    <li>&lt;!―相当于把布局A中main的内容换成我们需要的，其他保留&nbsp;--&gt;
    <li>&lt;/definition&gt;
    <li>&#8230;&#8230;
    <li>&#8230;&#8230; </li>
</ol>
</div>
<br />
<br />
以上只是以一种布局类型来说明，其他的布局类型（如：布局B，布局C。。。。。）都用相通的方法扩展，没有什么难的地方。<br />
<br />
下面简要说一些tiles在struts-config.xml中的配置，在struts1.1种tiles是利用struts的扩展机制来完成装载的，代码很简单如下：<br />
<br />
<div class="codeStyle">
<ol>
    <li><em><font color="#339900">//struts-config.xml</font></em>
    <li>&nbsp;&nbsp;&#8230;&#8230;
    <li>&nbsp;&nbsp;&lt;plug-in&nbsp;className=<font color="#ff33ff">"org.apache.struts.tiles.TilesPlugin"</font>&nbsp;&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property&nbsp;property=<font color="#ff33ff">"definitions-config"</font>&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=<font color="#ff33ff">"/WEB-INF/tiles-defs.xml"</font>&nbsp;/&gt;
    <li>&nbsp;&nbsp;&lt;/plug-in&gt; </li>
</ol>
</div>
<br />
<br />
如果你些多个tiles配置文件，那么用&#8220;，&#8221;号隔开。<br />
下面在举一个使用tiles以后action&nbsp;mapping&nbsp;的写法<br />
<br />
如我们要进行添加商品的请求，在添加页面里要先进行商品类型的装载：<br />
<br />
addProductAction.do――〉ProductAction――〉addProducts.jsp<br />
ProductAction完成商品类型的集合返回client端<br />
<div class="codeStyle">
<ol>
    <li><em><font color="#339900">//Struts-config.xml</font></em>
    <li>&#8230;&#8230;&#8230;&#8230;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;path=&#8221;/&nbsp;addProductAction&#8221;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#8221;com.***.&nbsp;ProductAction&#8221;&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!―成功以后返回布局A子类1--&nbsp;&gt;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name=&#8221;&#8221;&nbsp;path=&#8221;&nbsp;mainLayout_products_add&#8221;&gt;
    <li>&lt;/action&gt;
    <li>&#8230;&#8230;&#8230;&#8230; </li>
</ol>
</div>
<br />
<br />
好了，以上对一个操作的流程采用tiles以后的写法进行了简要的说明，具体Tiles的文档请参看上面给出的连接。<br />
<br />
Struts发布包里也有tilse的文档和例子。<br />
<img src ="http://www.blogjava.net/yunye/aggbug/186998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yunye/" target="_blank">yunye</a> 2008-03-18 14:37 <a href="http://www.blogjava.net/yunye/archive/2008/03/18/186998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>