﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-</title><link>http://www.blogjava.net/jackstudio/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 22 Jun 2026 23:19:09 GMT</lastBuildDate><pubDate>Mon, 22 Jun 2026 23:19:09 GMT</pubDate><ttl>60</ttl><item><title>操作必须使用一个可更新的查询”的解决办法 </title><link>http://www.blogjava.net/jackstudio/archive/2007/02/08/98885.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 08 Feb 2007 15:30:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2007/02/08/98885.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/98885.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2007/02/08/98885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/98885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/98885.html</trackback:ping><description><![CDATA[
		<br />
		<br />有几个主要的错误原因： <br />这个错误发生在当你的程序试图执行更新数据库或其它类似操作时。这是因为 <br />ADO由于以下的几个原因而不能够写数据库造成的。 <br /><br />1。一般的原因都是匿名用户帐号(IUSR_MACHINE)对该数据库文件没有写权限。 <br />要解决这个问题，在管理器中调整数据库文件的属性，让匿名用户有正确的权限。 <br />当使用ACCESS数据库时，不仅要给文件写的权限，还要给该目录写的权限，因为 <br />Jet需要在该目录建立一个.ldb文件[NTFS硬盘格式才会出现,FAT格式的不会出现权限问题]。<br />或是在IIS中设置一个有读取写入权限的匿名帐户.<br /><br />2。第二个原因是数据库没有使用正确的模式打开。应该使用下面的方法打开。 
<div class="code">SQL = "UPDATE Products Set UnitPrice = 2;" <br />Set Conn = Server.CreateObject("ADODB.Connection") <br />Conn.Mode = 3 ''3 = adModeReadWrite <br />Conn.Open "myDSN" <br />Conn.Execute(SQL) <br />Conn.Close</div><br />注意默认的Mode是设置0(adModeUnknown),它是允许更新的。 <br /><br />3。还有可能是在ODBC管理器中将该DSN的只读选项选中。 <br /><br />4。你是在同时更新两个表中的字段，也会出现这个错误信息，解决办法是分开来更新 <br />这两个表中各自字段。 <br /><br />5。当你使用了一个从低版本中（如ACCESS2.0,ACCESS7.0）载入到高版本(ACCESS 2000) <br />中的查询时，在执行这个查询是会出现该错误。 <br /><br />如果是winXP系统<br />在文件夹选项里面默认<span style="COLOR: brown">使用简单共享(推荐)</span>，把这个选项去掉，<br />再在文件夹上右键点击，就会出现安全这个选项卡，<br />原来默认的没有，然后在安全选项卡里面可以设置用户的写入权限了<br />右击数据库&gt;安全&gt;everyone&gt;将需要的勾上<br /><br /><div style="OVERFLOW-X: auto; WIDTH: 100%"><a href="http://uir.photo.hexun.com/13258399_d.html" target="_blank"><img alt="查看更多精彩图片" src="http://photo4.hexun.com/p/2006/1230/66291/b_DC24ED4DE0C577548685A879ADEED6C4.jpg" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=510){this.width=510;this.height=image.height*510/image.width;}}" border="0" /></a> </div><br />遇到类似的问题还有: 
<div class="code">Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005' <br />[Microsoft][ODBC Microsoft Access Driver] 无法从指定的数据表中删除。</div><img src ="http://www.blogjava.net/jackstudio/aggbug/98885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2007-02-08 23:30 <a href="http://www.blogjava.net/jackstudio/archive/2007/02/08/98885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：Windows2003服务器安全 －系统权限与安全配置</title><link>http://www.blogjava.net/jackstudio/archive/2007/02/02/97625.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 02 Feb 2007 11:52:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2007/02/02/97625.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/97625.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2007/02/02/97625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/97625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/97625.html</trackback:ping><description><![CDATA[
		<font color="#006699">
				<strong>Windows2003服务器安全 －系统权限与安全配置<br /><br />转载：<a href="http://www.yuzhiguo.com/articleview.asp?id=100">http://www.yuzhiguo.com/articleview.asp?id=100</a><br /><br /></strong>
		</font>
		<font color="#000000">系统设置网上有一句话是“最小的权限+最少的服务=最大的安全”。此句基本上是个人都看过，但我好像<br /><br />没有看到过一篇讲的比较详细稍具全面的文章，下面就以我个人经验作一次教学尝试！<br /><br />最小的权限如何实现？<br /><br />NTFS系统权限设置 在使用之前将每个硬盘根加上 Administrators 用户为全部权限(可选加入SYSTEM用户)<br /><br />删除其它用户，进入系统盘:权限如下<br /><br />C:\WINDOWS Administrators SYSTEM用户全部权限 Users 用户默认权限不作修改<br /><br />其它目录删除Everyone用户，切记C:\Documents and Settings下All Users\Default User目录及其子目录<br /><br />如C:\Documents and Settings\All Users\Application Data 目录默认配置保留了Everyone用户权限<br /><br />C:\WINDOWS 目录下面的权限也得注意,如 C:\WINDOWS\PCHealth、C:\windows\Installer也是保留了Everyone权限.<br /><br />删除C:\WINDOWS\Web\printers目录，此目录的存在会造成IIS里加入一个.printers的扩展名，可溢出攻击<br /><br />默认IIS错误页面已基本上没多少人使用了。建议删除C:\WINDOWS\Help\iisHelp目录<br /><br />删除C:\WINDOWS\system32\inetsrv\iisadmpwd，此目录为管理IIS密码之用，如一些因密码不同步造成500<br /><br />错误的时候使用 OWA 或 Iisadmpwd 修改同步密码，但在这里可以删掉，下面讲到的设置将会杜绝因系统<br /><br />设置造成的密码不同步问题。<br /><br />打开C:\Windows 搜索<br /><br />net.exe;cmd.exe;tftp.exe;netstat.exe;regedit.exe;at.exe;attrib.exe;cacls.exe;format.com;<br /><br />regsvr32.exe;xcopy.exe;wscript.exe;cscript.exe;ftp.exe;telnet.exe;arp.exe;edlin.exe;<br /><br />ping.exe;route.exe;finger.exe;posix.exe;rsh.exe;atsvc.exe;qbasic.exe;runonce.exe;syskey.exe<br /><br />修改权限，删除所有的用户只保存Administrators 和SYSTEM为所有权限<br /><br />关闭445端口<br /><br />HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\netBT\Parameters<br /><br />新建 “DWORD值”值名为 “SMBDeviceEnabled” 数据为默认值“0”<br /><br />禁止建立空连接<br /><br />HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa<br /><br />新建 “DWORD值”值名为 “RestrictAnonymous” 数据值为“1” [2003默认为1] <br /><br />禁止系统自动启动服务器共享<br /><br />HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters<br /><br />新建 “DWORD值”值名为 “AutoShareServer” 数据值为“0”<br /><br />禁止系统自动启动管理共享<br /><br />HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters<br /><br />新建 “DWORD值”值名为 “AutoShareWks” 数据值为“0”<br /><br />通过修改注册表防止小规模DDOS攻击<br /><br />HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters<br /><br />新建 “DWORD值”值名为 “SynAttackProtect” 数据值为“1”<br /><br />禁止dump file的产生<br /><br />dump文件在系统崩溃和蓝屏的时候是一份很有用的查找问题的资料。然而，它也能够给黑客提供一些敏感<br /><br />信息比如一些应用程序的密码等。控制面板&gt;系统属性&gt;高级&gt;启动和故障恢复把 写入调试信息 改成无。<br /><br />关闭华医生Dr.Watson<br /><br />在开始-运行中输入“drwtsn32”，或者开始-程序-附件-系统工具-系统信息-工具-Dr Watson，调出系统<br /><br />里的华医生Dr.Watson ，只保留“转储全部线程上下文”选项，否则一旦程序出错，硬盘会读很久，并占<br /><br />用大量空间。如果以前有此情况，请查找user.dmp文件，删除后可节省几十MB空间。<br /><br />本地安全策略配置<br /><br />开始 &gt; 程序 &gt; 管理工具 &gt; 本地安全策略<br /><br />账户策略 &gt; 密码策略 &gt; 密码最短使用期限 改成0天[即密码不过期，上面我讲到不会造成IIS密码不同步] <br /><br />账户策略 &gt; 账户锁定策略 &gt; 账户锁定阈值 5 次 账户锁定时间 10分钟 [个人推荐配置] <br /><br />本地策略 &gt; 审核策略 &gt; <br /><br />账户管理 成功 失败<br /><br />登录事件 成功 失败<br /><br />对象访问 失败<br /><br />策略更改 成功 失败<br /><br />特权使用 失败<br /><br />系统事件 成功 失败<br /><br />目录服务访问 失败<br /><br />账户登录事件 成功 失败<br /><br />本地策略 &gt; 安全选项 &gt; 清除虚拟内存页面文件 更改为"已启用" <br /><br />         &gt; 不显示上次的用户名 更改为"已启用"<br /><br />         &gt; 不需要按CTRL+ALT+DEL 更改为"已启用"<br /><br />         &gt; 不允许 SAM 账户的匿名枚举 更改为"已启用"<br /><br />         &gt; 不允许 SAM 账户和共享的匿名枚举 更改为"已启用"<br /><br />         &gt; 重命名来宾账户 更改成一个复杂的账户名<br /><br />         &gt; 重命名系统管理员账号 更改一个自己用的账号 [同时可建立一个无用户组的Administrat账户] <br /><br />组策略编辑器<br /><br />运行 gpedit.msc 计算机配置 &gt; 管理模板 &gt; 系统 显示“关闭事件跟踪程序” 更改为已禁用 <br /><br />删除不安全组件<br /><br />WScript.Shell 、Shell.application 这两个组件一般一些ASP木马或一些恶意程序都会使用到。<br /><br />方案一：<br /><br />regsvr32 /u wshom.ocx 卸载WScript.Shell 组件 <br /><br />regsvr32 /u shell32.dll 卸载Shell.application 组件<br /><br />如果按照上面讲到的设置，可不必删除这两个文件<br /><br />方案二：<br /><br />删除注册表 HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8} 对应 WScript.Shell<br /><br />删除注册表 HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000} 对应 Shell.application<br /><br />用户管理<br /><br />建立另一个备用管理员账号，防止特殊情况发生。<br /><br />安装有终端服务与SQL服务的服务器停用TsInternetUser, SQLDebugger这两个账号<br /><br />用户组说明<br /><br />在将来要使用到的IIS中，IIS用户一般使用Guests组，也可以再重新建立一个独立的专供IIS使用的组，但<br /><br />要将这个组赋予C:\Windows 目录为读取权限[单一读取] 个人不建议使用单独目录，太小家子气。</font>
<img src ="http://www.blogjava.net/jackstudio/aggbug/97625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2007-02-02 19:52 <a href="http://www.blogjava.net/jackstudio/archive/2007/02/02/97625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用SQL SERVER 触发器+作业</title><link>http://www.blogjava.net/jackstudio/archive/2007/01/20/95009.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 19 Jan 2007 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2007/01/20/95009.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/95009.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2007/01/20/95009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/95009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/95009.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="82%" border="0">
				<tbody>
						<tr>
								<td height="40"> </td>
						</tr>
						<tr>
								<td>
										<div>前一段给客户做了一个，客户管理系统，系统里设计到了用户的积分问题。</div>
										<div>积分要求是：</div>
										<div>1、用户每消费一元，积分自动加1</div>
										<div>2、从用户注册日开始，每过 一天，用户的积分自动加1。</div>
										<div>3、有特殊原因，管理员可以通过后台给用户加分或减分。</div>
										<div>4、积分可以用来兑奖，兑奖后，自动减去相应的积分。</div>
										<div> </div>
										<div>涉及到4个表：</div>
										<div>1、clubuser用户表，2、consumelog记录用户的消费日志，3、scoreadd管理员为用户加的分。4、prizelog用户兑换过的奖品。</div>
										<div> </div>
										<div>原来的系统实现是：</div>
										<div>要求1：</div>
										<div>他们的消费记录通常是导入的，每次导入后，需要重新计算一下所有用户的积分。</div>
										<div>要求2：</div>
										<div>用APPLICATION保存最后更新用户积分的时间，然后和当天判断，如果是不是当天，就给用户加分，设置APPLICATION为当天，如果是，就不进行操作。</div>
										<div>要求3：</div>
										<div>管理员为某个用户加过分以后，重新计算一下这个用户的积分。</div>
										<div>要求4：</div>
										<div>用户兑奖后，要重新计算一下他的积分。</div>
										<div> </div>
										<div>感觉不是他合理：</div>
										<div>1、导入后计算所有用户的积分不合理，因为，计算积分是很麻烦的，要把用户的消费积分，在网积分，管理员加的积分全部加起来，然后减去消费积分得出来，写入用户表。如果用户多了，消费记录多了，算起来要好几分钟。</div>
										<div>2、每次都要判断APPLCATION的状态，感觉不合理。</div>
										<div>3，4也不是太合理，都要重新计算用户的积分，感觉不合理。</div>
										<div> </div>
										<div>所以做了调整。</div>
										<div> </div>
										<div>1、3、4分别在表，consumelog,scoreadd,prizelog表中写触发器</div>
										<div>2、建立一个作业，在每天0:00:00的时候为所有用户加1分。</div>
										<div> </div>
										<div>实现细节：</div>
										<div>1、表 consumelog 触发器 </div>
										<div>添加记录</div>
										<div>CREATE TRIGGER  addscore ON [dbo].[consumelog] <br />FOR INSERT<br />AS<br />declare @num as int<br />declare @uid as int<br />select @num=cmoney,@uid=userid from [inserted]<br />update clubuser set <a href="mailto:score=score+@num/2"><font color="#004377">score=score+@num/2</font></a> where <a href="mailto:id=@uid"><font color="#004377">id=@uid</font></a></div>
										<div>删除记录</div>
										<div>CREATE TRIGGER decscore ON [dbo].[consumelog] <br />FOR DELETE <br />AS<br />declare @num as int<br />declare @uid as int<br />select @num=cmoney,@uid=userid from [deleteed]<br />update clubuser set <a href="mailto:score=score-@num"><font color="#004377">score=score-@num</font></a> where <a href="mailto:id=@uid"><font color="#004377">id=@uid</font></a><br /></div>
										<div>3、scoreadd触发器</div>
										<div>添加记录</div>
										<div>CREATE TRIGGER  otheraddscore ON [dbo].[scoreadd] <br />FOR INSERT<br />AS<br />declare @num int<br />declare @uid int<br />select @num=score,@uid=userid from [inserted]<br />update clubuser set <a href="mailto:score=score+@num"><font color="#004377">score=score+@num</font></a> where <a href="mailto:id=@uid"><font color="#004377">id=@uid</font></a><br />（这个表不存在删除）</div>
										<div> </div>
										<div>4、prizelog触发器</div>
										<div>添加记录</div>
										<div>CREATE TRIGGER prizedecscore ON [dbo].[prizelog] <br />FOR INSERT<br />AS<br />declare @num int<br />declare @uid int<br />declare @prid int<br />select @prid=prizeid,@uid=userid from [inserted]<br />select @num=Score from prize where <a href="mailto:id=@prid"><font color="#004377">id=@prid</font></a><br />update clubuser set <a href="mailto:score=score-@num"><font color="#004377">score=score-@num</font></a> where <a href="mailto:id=@uid"><font color="#004377">id=@uid</font></a></div>
										<div> </div>
										<div>删除记录</div>
										<div>CREATE TRIGGER prizeaddscore ON [dbo].[prizelog] <br />FOR Delete<br />AS<br />declare @num int<br />declare @uid int<br />declare @prid int<br />select @prid=prizeid,@uid=userid from [deleted]<br />if @@rowcount&gt;0<br /> begin<br />   select @num=score from prize where <a href="mailto:id=@prid"><font color="#004377">id=@prid</font></a><br />   update clubuser set <a href="mailto:score=score+@num"><font color="#004377">score=score+@num</font></a> where <a href="mailto:id=@uid"><font color="#004377">id=@uid</font></a><br /> end</div>
										<div> </div>
										<div>2、作业的建立</div>
										<div>SQL SERVER--》管理--》SQL SERVER代理--》作业--》新建作业</div>
										<div>常规 --名称：”每天添加金色俱乐部会员积分“</div>
										<div>步骤--》新建...--》名称 ”添加分数'--》类型：TSQL--》数据库：你要操作的数据库--》命令：</div>
										<div>update clubuser set score=score+1</div>
										<div>调度 --》名称--》调度类型--》反复出现--》每天1次--&gt;时间：0：00：00</div>
										<img alt="" src="http://storage.msn.com/x1pxOYwqu4SjF6YqO-J-kDM2f7oiuKl1LzRkm8lNt1vAdYXJiH_jSMIxBHBQu6zeJbORFuJODhGe3OxEBqUCMtAUc9qnUjhfkbeSE7Aq30PtaYWrV2wS_ReOvHpAwJgBHXfBmRK6rpVMZhU9xm5Yhpy8A" />
										<div> </div>
										<div>点 确定保存。</div>
										<div> </div>
										<div>在 作业列表中就有一个 作业，名称是 每天添加金色俱乐部会员积分</div>
										<div>启动该作业前要先启动SQL SERVERAGENT，并设置为随系统启动，OK了。</div>
										<img alt="" src="http://storage.msn.com/x1pxOYwqu4SjF6YqO-J-kDM2f7oiuKl1LzRkm8lNt1vAdZnYiqMrk3Y1h1tb_gkrFvZCLSXkuhbcddNLu1qo30zAcX8oRV55Duds8VRnWxjAC6_cndMzGBDFXJC2igbMRHQTtWol7kKX0d_9IbvxpgViQ" />
										<div> </div>
										<div>这样做以后，只需要添加消费记录，加分记录，领取奖品的记录就可以了，不用每次操作都要考虑分数了。</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jackstudio/aggbug/95009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2007-01-20 00:48 <a href="http://www.blogjava.net/jackstudio/archive/2007/01/20/95009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种排序算法java实现 </title><link>http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 15 Dec 2006 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/87971.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/87971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/87971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 各种排序算法java实现 插入排序:				package				 org.rut.util.algorithm.support;				import				 org.rut.util.algorithm.SortUtil;				/** */										/**																						 * 						@author			...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/87971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-15 16:06 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串中的变量调用</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 15 Dec 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/87964.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/87964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/87964.html</trackback:ping><description><![CDATA[[PHP][Basic]字符串中的变量调用 <br />描述<br />单引号：无法在单引号中调用到变量值。 <br />双引号：当用双引号或者定界符指定字符串时，其中的变量会被解析。 <br />如果遇到美元符号（$），解析器会尽可能多地取得后面的字符以组成一个合法的变量名；如果想明示指定名字的结束，用花括号把变量名括起来。 <br />复杂（花括号{}）语法可以在字符串中包含任何在名字空间的值：仅仅用和在字符串之外同样的方法写一个表达式，然后用 { 和 } 把它包含进来。 <br />因为不能转义“{”，花括号语法仅在$紧跟在 { 后面时被识别（用“{\$”或者“\{$”来得到一个字面上的“{$”）。 <br />花括号语法同样也可以解析数组索引或者对象属性：对于数组索引，右方括号（]）标志着索引的结束。对象属性则和简单变量适用同样的规则。 <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">php <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">* <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />* description: 字符串中的变量解析示例 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />* @author Sandy Lee <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 简单变量调用 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$fruit</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">apple</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">We have an $food</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt;We have an apple) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">We have some ${food}s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt;We have some apples) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">We have some {$food}s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt;We have some apples) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />// 数组调用 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$fruits</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">strawberry</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">red</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">banana</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">yellow</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is $fruits[banana].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt;A banana is yellow.) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is {$fruits['banana']}.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt;A banana is yellow.) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is {$fruits[banana]}.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt;A banana is yellow.)        </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A banana is $fruits['banana'].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (=&gt; wrong!) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$arr</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">arr: {$arr['a']['a2']}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; arr: a-2) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />// 类的调用 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> foo <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$foo</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$arr</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> foo() <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    { <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">foo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Foo</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">arr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-1</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">b-2</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    } <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />} <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #800080">$c</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> foo(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo: $c-&gt;foo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; foo: Foo) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo: {$c-&gt;foo}s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; foo: Foos) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo arr: {$c-&gt;arr['a']['a2']}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">(=&gt; foo arr: a-2) </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.blogjava.net/jackstudio/aggbug/87964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-15 15:52 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/15/87964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP截取中文字符串，UTF-8、GBK</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Dec 2006 21:11:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/86638.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/86638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/86638.html</trackback:ping><description><![CDATA[ function substring($str, $start, $len) {<br />    $tmpstr = "";<br />    $strlen = $start + $len;<br />    for($i = 0; $i &lt; $strlen; $i++) {<br />        if(ord(substr($str, $i, 1)) &gt; 0xa0) {<br />            $tmpstr .= substr($str, $i, 2);<br />            $i++;<br />        } else<br />            $tmpstr .= substr($str, $i, 1);<br />    }<br />    return $tmpstr;<br />}<img src ="http://www.blogjava.net/jackstudio/aggbug/86638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-10 05:11 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/10/86638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP连接MySQL出现乱码的一些个人看法</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Dec 2006 21:08:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/86637.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/86637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/86637.html</trackback:ping><description><![CDATA[
		<table height="30" cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td class="hjj22">转载：<a href="http://www.52net.com/html/2006/0428/63042.html">http://www.52net.com/html/2006/0428/63042.html</a><br />作者：不祥<br /><br /><br />PHP连接MySQL的过程中如果出现乱码很多人会说，用"Set names '??'"就能解决问题，但很多时候还是会出现各种怪现象，比如说页面能正常存取，但是phpmyadmin不能正常存取等现象。小弟经过验证，产生了一些个人看法，欢迎大家讨论和指正。<br /><br />MySQL数据库操作过程中出现了三种字符集：<br />1、页面字符集（也就是 content="TEXT/HTML; CHARSET=GBK"）<br />2、连接字符集（也就是 "Set names 'GBK'"）<br />3、字段字符集（无论是库还是表的字符集，将最终反映到字段上）<br />一、实验：<br />1、情况一<br />数据库字段字符集：utf-8<br />连接字符集：没有显式设置，默认为latin1<br />页面字符集：gbk<br /><br />存入过程：<br />1)页面用GBK表示的SQL向服务器提交存入请求；<br />2)默认情况下（不用Set Names '??'）服务器用latin1打开连接；<br />3)服务器误认为当前的SQL语句是用latin1表示的；<br />4)服务器将GBK字符当作latin1字符，错误的运用“latin1转UTF-8函数”将字符转换后存入UTF-8字段中；<br />5)（ 错误的latin1(其实是GBK) =&gt; 错误的UTF-8）<br />6)如果用phpmyadmin打开该表（用utf8连接）将会看到该字段为乱码；<br /><br />读取过程：<br />1)默认情况下（不用Set Names '??'）服务器用latin1打开连接；<br />2)服务器将UTF-8字段中的值转换为latin1返回给客户端；<br />3)（错误的UTF-8 =&gt; 错误的latin1(其实是GBK)）该过程为存入过程5的逆过程。（刚好错错得对了）<br />4)将服务器误认为是latin1的GBK编码按页面字符集正常显示；<br /><br />用示意图来表示就是：<br /><br /><!--c1--><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   存入过程：<br />   ----------------------<br />   页面    连接     存储<br />   ----------------------<br />   GBK =&gt; latin1 =&gt; utf-8<br />          ---------------<br />   ------------- |<br />         |       +------- 该过程得到的utf-8是一串不知所云的乱码，但MySQL固执的认为这串码为UTF-8<br />         |<br />         +------ MySQL将GBK误认为是latin1<br /><br />   读取过程：<br />   ----------------------<br />   页面    连接     存储<br />   ----------------------<br />   GBK &lt;= latin1 &lt;= utf-8<br />          ---------------<br />   ------------- |<br />         |       +------- 正是这串乱码经过逆过程转换回正确的GBK编码，只是MySQL认为是latin1而已<br />         |<br />         +------ MySQL将误认为是latin1的GBK编码传回了页面，刚好得到正确的编码。<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2-->2、情况二<br />数据库字段字符集：utf-8<br />连接字符集：gbk<br />页面字符集：gbk<br /><br />文字描述略。<br /><br /><br />示意图:<br /><br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   存入过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK =&gt; GBK =&gt; utf-8<br />          ------------<br />   ------------- |<br />         |       +------- 该过程得到的utf-8是由GBK转换而来的，是正确的utf-8编码<br />         |<br />         +------ 页面字符集等于连接字符集，MySQL认为页面传递给它的是GBK编码，它的想法正好符合事实。<br /><br /><br />   读取过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK &lt;= GBK &lt;= utf-8<br />              ---------------<br />   ------------- |<br />         |       +------- 用“utf-8转GBK函数”将正确的utf-8编码转换回GBK<br />         |<br />         +------ 页面字符集等于连接字符集，显示没有任何问题。<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br />3、情况三<br />数据库字段字符集：gbk<br />连接字符集：没有显式设置，默认为latin1<br />页面字符集：gbk<br /><br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   存入过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK =&gt; latin1 =&gt; GBK<br />          ------------<br />   ------------- |<br />         |       +------- 字符被“latin1转GBK函数”转换的成了乱码，但MySQL认为它是GBK，所以工具无法正常显示。<br />         |<br />         +------ MySQL认为页面传递给它的是latin1编码，它将在后续过程中画蛇添足地将正确的GBK转换为乱码。<br /><br /><br />   读取过程：<br />   ----------------------<br />   页面   连接   存储<br />   ----------------------<br />   GBK &lt;= latin1 &lt;= GBK<br />          ---------------<br />   ------------- |<br />         |       +------- “GBK转latin1函数”将乱码转换为GBK，但MySQL却认为它们是latin1<br />         |<br />         +------ 错误的latin1编码其实是正确的GBK编码，页面显示正常，但工具显示不正常。<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br /><br />二、字符集之间的转换<br />笔者试着将GBK字符误当作latin1转换为错误的utf-8能成功，逆过程中将乱码转换回latin1得到的刚好是正确的GBK<br /><br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   $str = "中文测试";<br />   $str_tran = iconv('latin1', 'utf-8', $str);<br />   echo $str_tran; // 显示乱码，既不是GBK也不是utf-8和latin1<br /><br /><br />   echo "&lt;br&gt;-----------&lt;br&gt;";<br /><br /><br />   $str_re_tran = iconv('utf-8', 'latin1', $str_tran);<br />   echo $str_re_tran;  // 显示 “中文测试”<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br /><br />而将GBK字符误当作utf-8转换为错误的GBK编码则出现错误<br /><!--c1--></span><table cellspacing="1" cellpadding="3" width="95%" align="center" border="0"><tbody><tr><td><strong>CODE</strong></td></tr><tr><td id="CODE"><!--ec1-->   $str = "中文测试";<br />   #$str_tran = iconv('utf-8', 'gbk', $str);    // 错误！！！<!--c2--></td></tr></tbody></table><span class="postcolor"><!--ec2--><br /><br />可见一种编码是否能被当作另一种编码被转换为第三种编码，取决于编码的固有属性，上面我们举的第一个例子只是碰巧GBK编码能被误当作latin1被转换为utf-8。如果是如下情况，则数据库肯定不能正常存取数据。<br />GBK =&gt; utf-8 =&gt; GBK（未实验）<br />三、结论<br />页面能正常存取但phpmyadmin不能正常存取，从严格意义上来说应该是一种错误，页面是否能正常存取取决于连接字符集是否能正常的被转换为存储字符集。<br />要保证页面能正常存取，并且工具也能正常使用，一般保持页面字符集等于或兼容连接字符集就可以了。</span></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jackstudio/aggbug/86637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-10 05:08 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/10/86637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts,ajax乱码解决方案 </title><link>http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Dec 2006 18:38:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/86629.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/86629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/86629.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">转载：<a href="/errorfun/archive/2006/12/09/86584.html">http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html</a><br />作者：errorfun<br /><br /><br />乱码问题好像跟我们中国程序员特别有缘，一直困扰着我们，从开始的<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">JSP</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">乱码问题，</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">STRUTS</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">乱码问题，到现在的</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">AJAX</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">乱码问题，无一不是搞得许多程序员焦头烂额的，整天骂</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">XXX</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">产品对中文支持不了，UTF-8无法使用中文啊什么的，其实这里面被骂的产品中其实</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">99</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">％以上是对中文支持非常好的，而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行，怎么可能对中文支持不了呢，下面就开始一一帮大家解决这些问题。</font></span></font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />
						<br />1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">、编码</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />      －－</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">想要解决好中文问题，对编码肯定是不能一概不懂了，编码是解决中文乱码问题的根本。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />      </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">编码比较常用的有：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GBK</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，除了</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">iso-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">之外的其它三个编码都能很好的支持中文，但它们都兼容</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的编码（就是说无论编码怎么改变，只要是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">中的字符，永远不会出现乱码）。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />      </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">这四种编码中，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">是中国规定的汉字编码，也可以说是简体中文的字符集编码</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GBK </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的扩展</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">,</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">除了兼容</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">外，它还能显示繁体中文，还有日文的假名</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">;</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">而</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UTF-8</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">虽然也支持中文，但却</span>
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">与</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">码不兼容（编码值不同）</span>
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">使用的是可变长的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UNICODE</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">编码，编码可能是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">位</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">16</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">进制（即</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">中的字符，其编码也是相同的）也有可能是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">2</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">位或</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">3</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">位的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">16</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">进制。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">的优点是：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">1</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">、</span>
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">与</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">CPU</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">字节顺序无关</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">可以在不同平台之间交流。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">2</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">、容错能力高</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">任何一个字节损坏后</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">最多只会导致一个编码码位损失</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">不会链锁错误</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">(</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">如</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">码错一个字节就会整行乱码</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">)</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">，所以在国际化处理中基本都是建议使用</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">作为编码。<br /></font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
								<br />2、文件的编码<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br />      －－虽然说只要设置了正确的编码就可以使字符正确显示了，但如果忽略了文件保存时的编码的话，那可是会让你走进迷雾中的。<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br />      文件编码最常使用的有两种：ANSI和UTF-8，光看名字估计你都可以猜到了，ANSI就是我们保存文件时使用的默认编码，而UTF-8则需自己设置。对于编码的改变，我使用的工具是NOTEPAD和ECLIPSE，NOTEPAD使用最简单，只要打开文件后在另存为中选择相应的编码就行了，而且它对编码的支持非常好;而在ECLIPSE中，只要稍微设置一下就行了，打开首选项，然后选择：常规-&gt;内容类型(ContentType)，在右边选中你想改变保存编码的文件类型，然后在下方的缺省编码中改变其值，最后点击更新（UPDATE）按钮即可。<br /></span></span></o:p>
				</span>
		</p>
		<p align="center">
				<img src="http://errorfun.bokee.com/inc/eclipse.png" />
		</p>
		<p align="left">
				<br />
				<br />而在其它的编辑器中，默认保存的内容都是GB2312或者GBK（NOTEPAD中对应ANSI）.而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点，可以知道，如果文件使用了UTF-8，那么字符编码就必须使用UTF-8，否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。（JS和JSP都是这个道理）<br /><br />3、JSP,STRUTS等的中文乱码解决方案<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br />     其实解决的方法只有一个：</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体"></font></span></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000"> request.setCharacterEncoding(encoding);</span>
		</div>
		<p align="left">   方法只有一种，但处理方式就多种多样了，初学者会在JSP页面上直接使用，而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了，网上有很多教程。偷懒一点的，到TOMCAT中复制就行了。在TOMCAT的目录下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 这个类，放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">filter-mapping</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">filter-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">Set Character Encoding</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">filter-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">servlet-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">servlet-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">filter-mapping</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p align="left">像上面这样配置的话(可能也是网上大多教程的做法，想当年也是害苦了我)，可能你只有JSP的乱码解决了，要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">init-param</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">param-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">encoding</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">param-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">param-value</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">UTF-8</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">param-value</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">init-param</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p align="left">当然，最重要的是要记得根据前面所说的方法，改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。<br />而在JSP内容中，还是使用如网上教程所说的那种技俩，在所有页面的页首加入：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #808080">&lt;%</span>
				<span style="COLOR: #000000">@ page language</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">"java" contentType</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">text</span>
				<span style="COLOR: #808080">/</span>
				<span style="COLOR: #000000">html; charset</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">UTF</span>
				<span style="COLOR: #808080">-</span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">8</span>
				<span style="COLOR: #000000">"<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pageEncoding</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">"UTF</span>
				<span style="COLOR: #808080">-</span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">8</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #808080">%&gt;</span>
		</div>
		<br />至此，相信JSP,ACTION都不太可能出现乱码了。<br /><br />4、资源文件的乱码解决方案<br />      资源文件谁都知道是国际化支持不可或缺的一部分，如果资源文件都出现乱码了那还了得？其实资源文件的乱码是很好解决的，其原因也是因为使用了UTF-8做为JSP编码后，没有相应地改变资源文件的文件编码造成的，所以只要对资源文件保存的编码进行更正后，乱码问题也就解决了。当然，你的中文要使用 native2ascii 命令进行正确的转换。<br /><br />5、调用JS时，JS内容乱码的解决方案。<br />     其实JS的乱码还是跟文件的编码有关系的，如果JS中有中文的话，那JS文件保存的编码就必须跟调用此JS的页面编码相同，否则，你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的（也是建立在前面的辛苦之下的）。<br /><br />6、AJAX提交数据乱码，返回数据乱码的解决方案<br />     随着AJAX的流行，乱码问题也开始困扰着许多刚开始使用它的程序员，幸好我之前对JSP乱码有过一点研究，在遇到AJAX后，并没有给我带来多大的困扰，在此将我的一些心得共享给大家。<br />     万变不离其宗，AJAX的乱码问题自然跟编码有关了，其实很多人跟我一样想到了对文件编码进行设置，并且在接数据时设置了requet的编码，在返回的数据时设置了response的编码一切都以为会很顺利，可是这一切都是徒劳无功的，讨厌的乱码再一次出现在你眼前。在你试了N多种方法，包括JS自身的escape,unescape方法后，你发现乱码仍然猖狂地出现在屏幕上。<br />    其实在试过这N多方法后，很多人都没发现，解决的方法其实很简单，而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码<br /><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体"><p></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font size="2"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">xmlhttp.open( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">post</span><span style="COLOR: #000000">"</span></font><font size="2"><span style="COLOR: #000000">, url, async );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />xmlhttp.setRequestHeader( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Type</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html</span><span style="COLOR: #000000">"</span></font><span style="COLOR: #000000"><font size="2"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />xmlhttp.send( params );</font></span></div><br />通过前面的说明，不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响，setRequestHeader并是万年不变的，也没人想过去改它，而问题就正好出在这个地方。回想一个JSP页面内容的编码设置，其中有这么一节： 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font size="2"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">contentType</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html; charset=UTF-8</span><span style="COLOR: #000000">"</span></font></div><br />现在知道问题了吧，所以我们要把第二句代码改为： 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font size="2"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">xmlhttp.setRequestHeader( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Type</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html;charset=UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></font></div></font></span><font size="2"><br /><font face="宋体">最后别忘了在返回数据时也设置上： </font><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face="宋体"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></font><span style="COLOR: #000000">response.setContentType( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />response.setCharacterEncoding( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );</span></div><br />是不是很简单，一点都不麻烦呢？<br />如果要问为什么的话，其实我们可以把xmlhttp看成是一个临时页面，它由浏览器动态生成，主要作用是在后台获得请求的数据（可以看成是一个高级的iframe）。所以对于普通页面设置的编码，对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知，jsp的最后形态就是servlet，而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">response.setContentType( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />response.setCharacterEncoding( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );</span></div><br />而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存（这跟之后生成的CLASS有关系）。所以在servlet设置response的编码也是理所当然的了。<br /><br />一口气把自己一年以来遇到的乱码问题和解决的方案写出来了，希望对你有所帮助。</font><img src ="http://www.blogjava.net/jackstudio/aggbug/86629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-10 02:38 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：我对女性做工程师的一点看法</title><link>http://www.blogjava.net/jackstudio/archive/2006/12/03/85116.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 02 Dec 2006 19:35:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/03/85116.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/85116.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/03/85116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/85116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/85116.html</trackback:ping><description><![CDATA[
		<br />去年 10 月，我跟开复去南京大学做演讲谈 Google 的技术，讲座结束之后，有一位女同学提了个问题让我很惊讶。<br /><br />她说： "我是学计算机软件的，蛮喜欢的。但是女生学这行不太好吧？你看我该不该找个时机改行？"<br /><br />我问： "你为什么会觉得女生不适合学软件？" <br /><br />"女生三十岁以后， 体力和智力下降， 会跟不上男同事。"<br /><br />这是我第一次听到如此具体的性别歧视，挺吃惊。做为一位女性软件工程师， 我平时难免听到了一些对于女性做工程师和对女性能力的疑问，我觉得这些话最大的危险是影响到人的自信。 <br /><br />我在北京出生，五岁时我父母到美国留学，于是把我也带了去。 我父亲是数学博士，母亲从小就用心辅导我，所以我小时候数学特别好。十岁的时候我就开始在附近的大学选微积分课， 随后又跳了三级，十五岁进入了加州理工大学 (<a href="http://www.caltech.edu/" target="_blank">California Institute of Technology</a>)。 现在说起来简单，但当时我的经历经常遭到别人的反对，说我年龄太小、学不好之类的话，或者说女性不适合学计算机。 我当时觉得这些话大都很可笑，没有在意，当然也要特别感谢我父母没拿它当回事。后来我顺利的完成了所有的学业，用事实证明了我走的路， 那些所谓的“预言”也就不攻自破了。<br /><br />后来我在美国另一家大软件公司做了五年的工程师， 随后来 Google ，在这里已经工作了两年半。 在 Google， 我第一次有了很多杰出的女性榜样。我们公司有<a href="http://www.google.com/intl/en/corporate/execs.html" target="_blank">六位女性副总裁</a>, 两位女性董事会成员，当然还有许多女性工程师总监、女性工程师等等...... 目前我的老板 (manager) 就是一位女性主管经理。她是我的第一个女老板， 我从她身上学了很多女性擅长的本领，比如如何让别人采取你的观点，同时又不伤害他们的感情等等（她也是中国人）。<br /><br />Google 意识到女性员工在很多问题上可以给公司一些新的视角。 创始人 Larry Page 去年对我们的人事部门订了要求，要求新招的软件工程师里应该有 25% 是女性，当然这是不能以降低录取标准为前提的。所以我们下了更多功夫去寻找女工程师，邀请她们来面试。 这可不是口头说说而已 – Larry 专门调了三分之一的人事部员工去招聘女工程师。结果去年我们的女工程师比例在 6 个月内由 13 %上升到 19 %。 Google 每几个月还会邀请中学和小学朋友来参观公司、与员工谈话，对于其中的女孩子，Google 一直鼓励她们要好好学习科学和电脑。 <br /><br />Google 还要求在我们应聘面试的过程中至少要有一名女性面试官，如果申请者被发现有性别歧视，那不管这个人有多聪明也不会被录取。我曾经有过这方面的亲身经历。两年前，我和一位男同事共同面试一个男性应聘者。当时我考了他一道难题，但那位应聘者回答时，只对我的男同事讲话， 几乎不睬理我。45 分钟的面试中， 我感觉越来越不舒服。 事后，我把我的顾虑写进了面试反馈。另一位女性面试官也表示了同感。结果，虽然这位应聘者其它方面都表现的很好，他还是被拒绝了录取。<br /><br />其实从很多细节上可以看出 Google 对女性员工的重视。软件公司庆祝业绩时，常常会发 T 恤，Google 也不例外。别的公司因为男员工比较多，常常只订男尺寸，造成我家里存了很多大的只能当睡衣的 T 恤。但是 Google 每次总会订女生的大、中、小号。每个小组庆祝阶段性成果的时候，也会挑男女员工都喜欢的活动，比如听现场相声等，而不仅仅是看跑车赛或棒球。<br /><br />我虽然在 Google 很幸运有许多优秀的女性软件工程师和同事， 但有时侯会觉得也许其它公司的女性没有公司这样支持她们。我想利用这个机会鼓励国内和海外的女性软件工程师，相信自己，让那些对女性的怀疑消失！<br /><br />三八妇女节快乐！<br /><br /><img alt="" src="http://googlechinablog.com/uploaded_images/womenengineerandalan-799160.jpg" border="0" /><br />在 Party 上的三位 Google 女工程师和公司高级工程副总裁 Alan Eustace<br />从左到右：王忻 （作者），Maureen, 郑韶敏, Alan Eustace<br /><br /><br />转载 GOOGLE黑板报  <br />地址：<a href="http://googlechinablog.com/2006/03/blog-post_08.html">http://googlechinablog.com/2006/03/blog-post_08.html</a><img src ="http://www.blogjava.net/jackstudio/aggbug/85116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-03 03:35 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/03/85116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.</title><link>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 09 Nov 2006 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/80060.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/80060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/80060.html</trackback:ping><description><![CDATA[
		<p>spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.<br />看一下ContextLoaderListener的源码,这是一个ServletContextListener<br />/**<br />  * Initialize the root web application context.<br />  */<br /> public void contextInitialized(ServletContextEvent event) {<br />  this.contextLoader = createContextLoader();<br />  this.contextLoader.initWebApplicationContext(event.getServletContext());<br /> }<br /> <br />  /**<br />  * Create the ContextLoader to use. Can be overridden in subclasses.<br />  * @return the new ContextLoader<br />  */<br /> protected ContextLoader createContextLoader() {<br />  return new ContextLoader();<br /> }</p>
		<p> contextLoader的源码<br /> public WebApplicationContext initWebApplicationContext(ServletContext servletContext)<br />   throws BeansException {</p>
		<p>  long startTime = System.currentTimeMillis();<br />  if (logger.isInfoEnabled()) {<br />   logger.info("Root WebApplicationContext: initialization started");<br />  }<br />  servletContext.log("Loading Spring root WebApplicationContext");</p>
		<p>  try {<br />   // Determine parent for root web application context, if any.<br />   ApplicationContext parent = loadParentContext(servletContext);</p>
		<p>   WebApplicationContext wac = createWebApplicationContext(servletContext, parent);<br />   servletContext.setAttribute(<br />     WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);</p>
		<p>   if (logger.isInfoEnabled()) {<br />    logger.info("Using context class [" + wac.getClass().getName() +<br />      "] for root WebApplicationContext");<br />   }<br />   if (logger.isDebugEnabled()) {<br />    logger.debug("Published root WebApplicationContext [" + wac +<br />      "] as ServletContext attribute with name [" +<br />      WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");<br />   }</p>
		<p>   if (logger.isInfoEnabled()) {<br />    long elapsedTime = System.currentTimeMillis() - startTime;<br />    logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");<br />   }</p>
		<p>   return wac;<br />  }<br />  catch (RuntimeException ex) {<br />   logger.error("Context initialization failed", ex);<br />   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);<br />   throw ex;<br />  }<br />  catch (Error err) {<br />   logger.error("Context initialization failed", err);<br />   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);<br />   throw err;<br />  }<br /> }<br /> 注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,这里面放了WebApplicationContext,需要使用时从ServletContext取出<br /> 可以使用WebApplicationContextUtils得到WebApplicationContext<br /> public static WebApplicationContext getWebApplicationContext(ServletContext sc) {<br />  Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);<br />  if (attr == null) {<br />   return null;<br />  }<br />  if (attr instanceof RuntimeException) {<br />   throw (RuntimeException) attr;<br />  }<br />  if (attr instanceof Error) {<br />   throw (Error) attr;<br />  }<br />  if (!(attr instanceof WebApplicationContext)) {<br />   throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);<br />  }<br />  return (WebApplicationContext) attr;<br /> }<br /> 关键的问题在于struts如何启动的spring的,ContextLoaderPlugIn的源码<br /> <br /> // Publish the context as a servlet context attribute.<br />  String attrName = getServletContextAttributeName();<br />  getServletContext().setAttribute(attrName, wac);<br /> <br /> public String getServletContextAttributeName() {<br />  return SERVLET_CONTEXT_PREFIX + getModulePrefix();<br /> }<br /> 不同加载的Key竟然不同,原因就是WebApplicationContext放在那里的问题,可spring调用的时候会根据WebApplicationContext里面定义的那个名字去找的,问题出在这里</p>
		<p>
				<br /> 在struts-config.xml中配置<br />    &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />      &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />    &lt;/plug-in&gt;</p>
		<p>    &lt;controller&gt;<br />        &lt;set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" /&gt;<br />    &lt;/controller&gt;</p>
		<p>
				<br /> 原理是这样的,Struts虽然只能有一个ActionServlet实例,但是对于不同的子应用分别能有自己的RequestProcessor实例每个RequestProcessor实例分别对应不同的struts配置文件。<br />   子应用的ProcessorClass类必须重写一般就是继承RequestProcessor类，然后再其配置文件的controller元素中的&lt;processorClass&gt;属性中作出修改。那么当<br />  getRequestProcessor(getModuleConfig(request)).process(request,response);就能根据request选择相应的moduleconfig,再根据其&lt;processorClass&gt;属性选择相应的RequestProcessor子类来处理相应的请求了。</p>
		<p> </p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/80060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-11-09 10:40 <a href="http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用ServletContextListener在服务器启动和关闭时创建和关闭缓存</title><link>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 09 Nov 2006 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/80058.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/80058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/80058.html</trackback:ping><description><![CDATA[
		<div class="con_sample">
				<p>ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志，转发请求。每一个 Web 应用程序含有一个Context，被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享，所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存，所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。</p>
		</div>
		<div class="con_all">
				<p>
				</p>
				<p>ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志，转发请求。每一个 Web 应用程序含有一个Context，被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享，所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存，所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。 </p>
				<p>ServletContextListener 是 ServletContext 的监听者，如果 ServletContext 发生变化，如服务器启动时 ServletContext 被创建，服务器关闭时 ServletContext 将要被销毁。 </p>
				<p>在JSP文件中，application 是 ServletContext 的实例，由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。 </p>
				<p>我们使用缓存的思路大概是： </p>
				<ol>
						<li>
								<p>服务器启动时，ServletContextListener 的 contextInitialized()方法被调用，所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类，用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。 </p>
						</li>
						<li>
								<p>程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP，使用a pplication.getAttribute()。如果是 Servlet，使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数)，你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存，也可以在下一步保存。 </p>
						</li>
						<li>
								<p>服务器将要关闭时，ServletContextListener 的 contextDestroyed()方法被调用，所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库，更新原来的内容。 </p>
						</li>
				</ol>
				<pre>import User; //my own class<br />import DatabaseManager; // my own class<br />import javax.servlet.ServletContext;<br />import javax.servlet.ServletContextListener;<br /><br />public class MyContextListener<br /><br />	implements ServletContextListener {<br />	private ServletContext context = null;<br /><br />	public void contextInitialized(ServletContextEvent event) {<br />		context = event.getServletContext();<br />		User user = DatabaseManager.getUserById(1);<br />		context.setAttribute("user1", user);<br />	}<br /><br />	public void contextDestroyed(ServletContextEvent event) {<br />		User user = (User)context.getAttribute("user1");<br />		DatabaseManager.updateUserData(user);<br />		this.context = null;<br />	}<br />}<br /></pre>
				<h3 class="para">布署 ServletContextListener</h3>
				<p>你实现(implements)了 ServletContextListener 编译后，把它放在正确的WEB-INF/classes目录下，更改WEB-INF目录下的 web.xml文件，在web-app节点里添加 </p>
				<pre>&lt;listener&gt;<br />	&lt;listener-class&gt;MyServletContextListener&lt;/listener-class&gt;<br />&lt;/listener&gt;<br /></pre> 来自：<a href="http://www.ideawu.net/ideablog/">idea's blog</a></div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/80058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-11-09 10:39 <a href="http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分页类,调用很简单. ........</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 26 Oct 2006 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/77425.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/77425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/77425.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: asp-----																Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->						  1												&lt;						% 						  2														...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/77425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-26 16:27 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/26/77425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB轻松进阶</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 23 Oct 2006 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76764.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76764.html</trackback:ping><description><![CDATA[转载：<a href="http://dev.21tx.com/java/ejb/">http://dev.21tx.com/java/ejb/</a><br /><br /><strong>编写第一个EJB应用程序 <br /><br /></strong>　　 搞清了基本的分布式对象应用程序机理，下面我们就来实地做一个简单的EJB应用程序，一步一步找着做，你会发现——它真的不难！ <br /><br />　　 EJB中的Beans有两种，一种是会话Bean（SessionBean），一种是实体Bean（EntityBean）。其中，SessionBean又分为有状态（Stateful）和无状态（Stateless）两种，EntityBean又分为容器管理（Container Managed）和自管理（Bean Managed）两种。我们要做的第一个EJB应用程序是：写一个无状态会话Bean（Stateless SessionBean）。 <br /><br /><strong>这个程序的功能是： </strong>实现一个远程加密、解密演示系统，用户把一段明文发到<a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a>端，服务器端执行一定的加密算法（按先后顺序倒排）得到密文，然后把加密完成后的密文发到客户端显示给用户；用户还可发一段加密后的密文到服务器端，服务器端执行一定的解密算法（倒排）得到明文，然后回传显示给用户。 <br /><br /><strong>注： </strong>这里使用的是<a href="http://dev.21tx.com/os/windows/" target="_blank"><font color="#3366cc">Windows</font></a>平台，并且假定<a href="http://dev.21tx.com/java/base/jdk/" target="_blank"><font color="#3366cc">JDK</font></a>已经装好，并且认为你至少是编过一个<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>程序的程序员。 <br /><br /><strong>第一步 <a href="http://dl.21tx.com/" target="_blank"><font color="#3366cc">下载</font></a>、安装<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a>开发工具箱 </strong><br /><br />　　 编写EJB应用程序必须下载相关的工具箱才行，作为学习试验之用，不须采用很高档的<a href="http://dev.21tx.com/java/as/" target="_blank"><font color="#3366cc">应用服务器</font></a>（比如：<a href="http://dev.21tx.com/web/" target="_blank"><font color="#3366cc">Web</font></a>Logic、WebSphere等），只需采用SUN公司提供的免费开发包就可以了，下载地址为：ftp://202.116.77.69/development/Java/j2sdkee1.2/j2sdkee-img_java ejb/2_1-win.exe。 <br /><br />　　 下载后执行这个应用程序，即可完成J2EESDK的本地安装（假定安装在C:\j2sdkee1.3目录）。安装之后还不能立刻用，需要把C:\j2sdkee1.3\lib\j2ee.jar加到系统的ClassPath变量中去，装过JDK的朋友对此肯定不会陌生。做完这些后，最终系统的ClassPath应该至少有.;C:\j2sdk1.4.0-beta3\lib\tools.jar; C:\j2sdk1.4.0-beta3\lib\dt.jar;C:\j2sdkee1.3\lib\j2ee.jar这几项。 <br /><br />　　 然后，把C:\j2sdkee1.3\bin目录加到系统的Path变量中，也就是说，系统的Path变量至少应该有%PATH%;C:\j2sdkee1.3\bin;C:\j2sdk1.4.0-beta3\bin这几项。 <br /><br />以上两步其实和配置<a href="http://dev.21tx.com/java/j2se/" target="_blank"><font color="#3366cc">J2SE</font></a>的方法类似，配过JDK的朋友一定不陌生。<br /><br /><strong>第二步 建立应用程序目录结构 </strong><br /><br />　　 如你所知的，Java程序中目录结构是很重要的，因为Java中的包（package）是与目录相关的，同时，目录结构不同，程序打包生成（jar）的结构也不同，所以必须引起重视。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16262.gif" border="1" /></p>　　 我们编写的第一个EJB应用程序的目录结构如图二所示，由上可见，所有的java程序都放在securitybeans目录下（它们都属于一个名为securitybeans的package）。客户代码主要由<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>和html文件组成：musecurityjsp.html文件为静态网页，主要用于显示系统的首页，提供用户输入明文/密文的界面，并负责把用户输入的内容提交给下一个页面（SecuriryProcessPage.jsp）；SecurityProcessPage.jsp文件为用JSP（Java Server Pages）编写的动态网页，主要用于生成EJB对象实例，并向EJB对象发送加密/解密请求，并在页面上显示加密/解密结果供用户浏览。<br /><br /><br /><strong> 编写EJB代码 <br /><br /></strong>　　 由前述的目录结构可知，EJB代码包括三个<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>文件。 <br /><br />　　 1、Security.java是一个接口，它定义了基本的加密、解密调用接口。注意，由于Security接口可生成EJB对象，所以它必须继承自EJBObject接口。其源代码如下： <br /><br />文件“Security.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.EJBObject; <br /><br />public interface Security extends EJBObject <br /><br />{ <br /><br />public String encrypt( String strSource ) throws RemoteException; <br /><br />public String decrypt( String strTarget ) throws RemoteException; <br /><br />}/* Security */ <br /><br />　　 2、SecurityHome接口可生成EJBHome对象，它负责直接与客户打交道，接收客户的请求，返回处理结果。在EJB规范中，SecurityHome必须继承自EJBHome接口。其源代码如下： <br /><br />文件“SecurityHome.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.EJBHome; <br /><br />import javax.ejb.CreateException; <br /><br />public interface SecurityHome extends EJBHome <br /><br />{ <br /><br />Security create() throws CreateException, RemoteException; <br /><br />}/* EJBHome */ <br /><br />　　 3、SecurityBean类才是真正做“正事”的类，它负责对SecurityHome对象传来的字符串执行加密、解密算法，将得到的结果返回给SecurityHome对象。它是一个Stateless SessionBean，按照EJB规范，必须实现SessionBean接口。其源代码如下： <br /><br />文件“ScurityBean.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.SessionBean; <br /><br />import javax.ejb.SessionContext; <br /><br />public class SecurityBean implements SessionBean <br /><br />{ <br /><br />public String encrypt( String strSource ) <br /><br />{ <br /><br />String strTarget = ""; <br /><br />for ( int i = strSource.length() - 1; i &gt;= 0; i -- ) <br /><br />{ <br /><br />strTarget += strSource.charAt( i ); <br /><br />}//for <br /><br /><br />return strTarget; <br /><br />}//encrypt() <br /><br /><br />public String decrypt( String strTarget ) <br /><br />{ <br /><br />String strSource = ""; <br /><br /><br />for ( int i = strTarget.length() - 1; i &gt;= 0; i -- ) <br /><br />{ <br /><br />strSource += strTarget.charAt( i ); <br /><br />}//for <br /><br /><br />return strSource; <br /><br />}//decrypt() <br /><br /><br />public void ejbActivate() {}//ejbActivate() <br /><br />public void ejbRemove() {}//ejbRemove() <br /><br />public void ejbPassivate() {}//ejbPassivate() <br /><br />public void setSessionContext( SessionContext sc ) {}//setSessionContext() <br /><br />public void ejbCreate() {}//ejbCreate() <br /><br />public void ejbLoad() {}//ejbLoad() <br /><br />public void ejbStore() {}//ejbStore() <br /><br />}/* SecurityBean */ <br /><br />　　 SecurityBean中的ejbActivate()、ejbPassivate()等方法都是SessionBean接口中的方法，由于本程序中这里不需要有实际内容，因此直接实现它就可以了。<br /><br /><br /><strong>编写客户代码 <br /><br /></strong>　　 便完了EJB代码，下面我们来写客户代码。 <br /><br />　　 1、mysecurity<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>.html文件用于显示一个静态的网页，它提供了用户录入明文/密文的界面，使用户能够录入自己的内容然后提交给<a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a>端。其源代码如下： <br /><br />文件mysecurityjsp.html <br /><br />&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; TITLE &gt;EJB示例：数据加密、解密演示系统&lt; /TITLE &gt; <br />&lt; /HEAD &gt; <br />&lt; BODY BACKGROUND="bg.gif" &gt; <br /><br />&lt; CENTER &gt; <br /><br />&lt; H1 &gt;数据加密解密演示系统&lt; IMG SRC="duke.gif" &gt;&lt; /H1 &gt; <br />&lt; BR &gt;&lt; BR &gt;&lt; BR &gt; <br />&lt; FORM METHOD="GET" ACTION="SecurityJSPAlias" &gt; <br />&lt; TABLE WIDTH="700" HEIGHT="300" BORDER="1" &gt; <br />&lt; TR &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; H2 &gt;——加密请求窗——&lt; /H2 &gt; <br />&lt; P &gt; <br />请输入明文： <br />&lt; P &gt; <br />&lt; INPUT TYPE="TEXT" NAME="SOURCECONTENT" &gt;&lt; /INPUT &gt; <br />&lt; P &gt; <br />&lt; INPUT TYPE="SUBMIT" VALUE=" 提 交 " &gt; <br />&lt; INPUT TYPE="RESET" VALUE=" 重 置 " &gt; <br />&lt; /TD &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; H2 &gt;——解密请求窗——&lt; /H2 &gt; <br />&lt; P &gt; <br />请输入密文： <br />&lt; P &gt; <br />&lt; INPUT TYPE="TEXT" NAME="TARGETCONTENT" &gt;&lt; /INPUT &gt; <br />&lt; P &gt; <br />&lt; INPUT TYPE="SUBMIT" VALUE=" 提 交 " &gt; <br />&lt; INPUT TYPE="RESET" VALUE=" 重 置 " &gt; <br />&lt; /TD &gt; <br />&lt; /TR &gt; <br />&lt; /TABLE &gt; <br />&lt; /FORM &gt; <br /><br />&lt; /CENTER &gt; <br /><br />&lt; /BODY &gt; <br />&lt; /HTML &gt; <br /><br />　　 2、SecurityProcessPage.jsp文件是用JSP编写的动态网页，它用于处理mysecurityjsp.html提交过来的内容，并查找、生成EJBHome对象，发送加密/解密请求，并将结果传回客户端。其源代码如下： <br /><br />文件“SecurityProcessPage.jsp” <br /><br />&lt; %@ page language="<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>" info="数据加密解密信息处理系统" % &gt; <br />&lt; %@ page import="java.rmi.*" % &gt; <br />&lt; %@ page import="javax.naming.*" % &gt; <br />&lt; %@ page import="javax.rmi.PortableRemoteObject" % &gt; <br />&lt; %@ page import="securitybeans.*" % &gt; <br /><br />&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; TITLE &gt;EJB示例：数据加密、解密演示系统&lt; /TITLE &gt; <br />&lt; /HEAD &gt; <br />&lt; % <br />SecurityHome shMain = null; <br />Try <br />{ <br />shMain = ( SecurityHome )PortableRemoteObject.narrow( new InitialContext().lookup( "mysecurity" ), SecurityHome.class ); <br />}//try <br />catch( NamingException ne ) <br />{ <br />ne.printStackTrace(); <br />}//catch <br />Security security = shMain.create(); <br />% &gt; <br />&lt; BODY BACKGROUND="bg.gif" &gt; <br />&lt; CENTER &gt; <br />&lt; H1 &gt;数据加密解密演示系统&lt; IMG SRC="duke.gif" &gt;&lt; /H1 &gt;&lt; BR &gt;&lt; BR &gt;&lt; BR &gt; <br />&lt; TABLE WIDTH="700" HEIGHT="300" BORDER="1" &gt; <br />&lt; TR &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; % <br />if ( request.getParameter( "SOURCECONTENT" ) != null ) <br />{ <br />% &gt; <br />加密生成的密文为：&lt; BR &gt; <br />&lt; %= security.encrypt( request.getParameter( "SOURCECONTENT" ) ) % &gt; <br />&lt; % <br />}//if <br />% &gt; <br />&lt; /TD &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; % <br />if ( request.getParameter( "TARGETCONTENT" ) != null ) <br />{ <br />% &gt; <br />解密生成的明文为：&lt; BR &gt; <br />&lt; %= security.encrypt( request.getParameter( "TARGETCONTENT" ) ) % &gt; <br />&lt; % <br />}//if <br />% &gt; <br />&lt; /TD &gt; <br />&lt; /TR &gt; <br />&lt; /TABLE &gt; <br />&lt; /CENTER &gt; <br />&lt; /BODY &gt; <br />&lt; /HTML &gt; <br /><br /><br /><strong>运行第一个EJB应用程序 <br /><br /></strong>　　 一个完整的EJB应用程序已经写完了，但是事情还远没有完结。要使一个EJB应用程序能够运行，还有很多事情要做。并且，可能这些事情的工作量并不比编程序本身小多少。 <br /><br /><strong>第一步 编译EJB代码 </strong><br /><br />　　 html和<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>代码是不需编译的，但securitybeans目录下的三个.<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>文件必须编译成.class文件才可运行。由于三个Java文件属于一个包，所以要进行联编。 <br /><br /><strong>第二步 启动<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a><a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a></strong><br /><br />　　 打开一个DOS Shell窗口，键入j2ee –verbose，稍候片刻，当屏幕出现提示“J2EE server startup complete”时，表示j2eesdk自带的J2EE服务器启动成功了。 <br /><br /><strong>第三步 打开配置工具 </strong><br /><br />　　 打开一个DOS Shell窗口（如果你现每次打开一个新的DOS Shell窗口麻烦，可以在前一步中键入start j2ee –verbose，即可自动弹出一个新的窗口，而原窗口不变），键入deploytool，稍候片刻，即可启动j2eesdk自带的配置工具。Deploytool的启动画面如图三所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16253.jpg" width="500" /><br />图三 deploytool的启动画面</p><strong>新建一个Application </strong><p align="center"><strong><img src="http://image.21tx.com/image/20050421/16239.jpg" width="500" /><br /></strong>图四 新建一个Application </p><br />　　 点击deploytool的File菜单－&gt;New－&gt;Application，在弹出的对话框中选中SecurityApp所在的目录，并在Display Name中输入任意一个你想在界面上看到的这个应用程序的名称（比如：SecurityApp）。 <br /><br /><strong>第五步 新建一个Ent<a href="http://dev.21tx.com/corp/solution/erp/" target="_blank"><font color="#3366cc">ERP</font></a>rise Bean </strong><br /><br />　　 下面就将进入比较关键的部分！ <br /><br />　　 点击deploytool的File菜单－&gt;New－&gt;Enterprise Bean，将弹出一个New Enterprise Bean Wizard。点击Next按钮略过第一个界面，在第二个界面中输入JAR Display Name为“SecurityJar”，并点击Edit按钮，在弹出的对话框中将securitybeans目录下的三个.<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>编译后生成的.class文件加入到SecurityJar的内容中去，如图五所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16248.jpg" /><br />图五 将.class文件添加到SecurityJar中</p><br />　　 点击Next到第三个界面，注意： <br /><br />1. 选中Session为Stateless（缺省为Stateful）； <br /><br />2. 输入Enterprise Bean Name为SecurityBean； <br /><br />3. 选择Enterprise Bean Class为securitybeans.SecurityBean； <br /><br />4. 选择Remote Home Interface为securitybeans.SecurityHome； <br /><br />5. 选择Remote Interface为securitybeans.Security。 <br /><br />　　 至此关键的步骤就完成了，以下几个界面你大可以放心的“Next”了。至最后一个界面点击Finish按钮，即完成了一个Enterprise Bean的添加工作。 <br /><br /><br /><strong>新建一个</strong><a href="http://dev.21tx.com/web/" target="_blank"><font color="#3366cc"><strong>Web</strong></font></a><strong> Component <br /><br />这个步骤与上一步骤类似 </strong><br /><br />　　 点击deploytool的File菜单－&gt;New－&gt;Web Component，将弹出一个New Web Component Wizard。点击Next按钮略过第一个界面，在第二个界面中输入WAR Display Name为“SecurityWar”，并点击Edit按钮，在弹出的对话框中将ClientCode目录下的几个客户代码文件加入到SecurityWar的内容中去，如图六所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16219.jpg" /><br />图六 将ClientCode目录下的文件添加到SecurityJar中 </p><br />　　 点击Next进入第三个界面，选择the type of web component you are creating为<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>。点击Next进入第四个界面，注意： <br /><br />1、 选中JSP FileName为SecurityProcessPage.jsp； <br /><br />2、 输入Web Component Name为SecurityProcessPage。 <br /><br />　　 两次点击Next按钮进入第五个界面，点击Add按钮，给该Web Component添加一个别名为SecurityAlias。 <br /><br />　　 至此主要的步骤就完成了，以下几个界面只需放心点击Next按钮即可，至最后一个界面，点击Finish按钮，即完成了一个Web Component的添加工作。 <br /><br /><strong>第七步 修改JNDI和RootContext </strong><br /><br />　　 添加完了两个主要的组件之后，还要修改两个配置，才能最后完成EJB的配置。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16227.jpg" /><br />图七 SecurityApp的JNDI Names标签页的设置 </p><br />　　 在deploytool主界面左边的树形结构中点击SecurityApp节点，主界面的右边就会显示出四个标签页。在这四个标签页中，JNDI Names标签页需加上mysecurity为JNDI Name，如图七所示；WebContext标签页中需加上SecurityRoot为SecurityWar的ContextRoot，如图八所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16230.jpg" /><br />图八 SecurityApp的Web Context标签页的设置 </p><br /><strong>第八步 校验<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a>应用程序 </strong><br /><br />　　 完成以上七个步骤后，整个EJB的配置工作就基本完成了，下面只需简单两个步骤就大功告成，不过也要做好功亏一篑的准备！ <br /><br />　　 在deploytool主界面左边的树形结构中点击SecurityApp节点，再点击deploytool的Tools菜单－&gt;Verifier…菜单项，在弹出窗口中点击OK按钮，deploytool将自动对EJB应用程序进行测试校验，检查有没有配置错误。稍候片刻，如果提示“There were no failed tests.”，则恭喜你大功告成。如果提示有错，则需要返回去仔细重新检查一步步配置，看看有没有地方疏漏了。配置错误可是很容易出的哟，你要有思想准备。<br /><br /><br /><br /><strong>发布</strong><a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc"><strong>J2EE</strong></font></a><strong>应用程序 <br /><br /></strong>　　 如果通过了第八步，则第九步就完全是例行公事了。 <br /><br />　　 点击deploytool的Tools菜单－&gt;Deploy…菜单项，会弹出一个发布向导对话框窗口，只管放心点击Next到最后一个界面，至最后一个界面点击“Finish”按钮，等待Deployment Progress至最后完成，如图九所示，就彻底搞定了！ <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16207.jpg" /><br />图九 发布完成后的Deployment Progress </p><br /><strong>第十步 欣赏程序运行效果 </strong><br /><br />　　 接下来打开一个浏览器窗口，输入http://localhost:8000/SecurityRoot，就可以欣赏到你第一个EJB应用程序的运行效果了。 <br /><br />　　 第一个页面如图十所示，显示的是一个数据录入页面，用户可录入一些想要加密/解密的内容，点击提交按钮就可到下一个页面。 <br /><br />　　 第二个页面如图十一所示，显示的是对用户请求内容的加密/解密处理结果。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16211.jpg" width="500" /><br />图十 运行效果第一个页面（加密/解密请求窗） <br /><br /><img src="http://image.21tx.com/image/20050421/16215.jpg" width="500" /><br />图十一 运行效果第二个页面（加密/解密结果显示页） </p><br />　　 万事开头难，有了第一个EJB应用程序运行通过的体验，以后就好办了。希望本文能为你开个好头！ <br /><br /><img src ="http://www.blogjava.net/jackstudio/aggbug/76764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-23 15:24 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于数据库优化</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/23/76763.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 23 Oct 2006 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/23/76763.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76763.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/23/76763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76763.html</trackback:ping><description><![CDATA[
		<p>大家都在讨论关于数据库优化方面的东东，刚好参与开发了一个数据仓库方面的项目，以下的一点东西算是数据库优化方面的学习+实战的一些心得体会了，拿出来大家共享。欢迎批评指正阿！</p>
		<p>SQL语句： <br />是对数据库(数据)进行操作的惟一途径； <br />消耗了70%~90%的数据库资源；独立于程序设计逻辑，相对于对程序源代码的优化，对SQL语句的优化在时间成本和风险上的代价都很低； <br />可以有不同的写法；易学，难精通。</p>
		<p>SQL优化： <br />固定的SQL书写习惯，相同的查询尽量保持相同，存储过程的效率较高。 <br />应该编写与其格式一致的语句，包括字母的大小写、标点符号、换行的位置等都要一致</p>
		<p>ORACLE优化器： <br />在任何可能的时候都会对表达式进行评估，并且把特定的语法结构转换成等价的结构，这么做的原因是 <br />要么结果表达式能够比源表达式具有更快的速度 <br />要么源表达式只是结果表达式的一个等价语义结构 <br />不同的SQL结构有时具有同样的操作（例如：= ANY (subquery) and IN (subquery)），ORACLE会把他们映射到一个单一的语义结构。</p>
		<p>1 常量优化： <br />常量的计算是在语句被优化时一次性完成，而不是在每次执行时。下面是检索月薪大于2000的的表达式： <br />sal &gt; 24000/12 <br />sal &gt; 2000 <br />sal*12 &gt; 24000 <br />如果SQL语句包括第一种情况，优化器会简单地把它转变成第二种。 <br />优化器不会简化跨越比较符的表达式，例如第三条语句，鉴于此，应尽量写用常量跟字段比较检索的表达式，而不要将字段置于表达式当中。否则没有办法优化，比如如果sal上有索引，第一和第二就可以使用，第三就难以使用。</p>
		<p>2 操作符优化： <br />优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。 <br />例如：优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH' <br />优化器只能转换涉及到可变长数据类型的表达式，前一个例子中，如果ENAME字段的类型是CHAR(10)， 那么优化器将不做任何转换。 <br />一般来讲LIKE比较难以优化。</p>
		<p>其中： <br />~~ IN 操作符优化： <br />优化器把使用IN比较符的检索表达式替换为等价的使用“=”和“OR”操作符的检索表达式。 <br />例如，优化器会把表达式ename IN ('SMITH','KING','JONES')替换为 <br />ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES‘</p>
		<p>~~ ANY和SOME 操作符优化: <br />优化器将跟随值列表的ANY和SOME检索条件用等价的同等操作符和“OR”组成的表达式替换。 <br />例如，优化器将如下所示的第一条语句用第二条语句替换： <br />sal &gt; ANY (:first_sal, :second_sal) <br />sal &gt; :first_sal OR sal &gt; :second_sal <br />优化器将跟随子查询的ANY和SOME检索条件转换成由“EXISTS”和一个相应的子查询组成的检索表达式。 <br />例如，优化器将如下所示的第一条语句用第二条语句替换： <br />x &gt; ANY (SELECT sal FROM emp WHERE job = 'ANALYST') <br />EXISTS (SELECT sal FROM emp WHERE job = 'ANALYST' AND x &gt; sal)</p>
		<p>~~ ALL操作符优化: <br />优化器将跟随值列表的ALL操作符用等价的“=”和“AND”组成的表达式替换。例如： <br />sal &gt; ALL (:first_sal, :second_sal)表达式会被替换为： <br />sal &gt; :first_sal AND sal &gt; :second_sal <br />对于跟随子查询的ALL表达式，优化器用ANY和另外一个合适的比较符组成的表达式替换。例如 <br />x &gt; ALL (SELECT sal FROM emp WHERE deptno = 10) 替换为： <br />NOT (x &lt;= ANY (SELECT sal FROM emp WHERE deptno = 10)) <br />接下来优化器会把第二个表达式适用ANY表达式的转换规则转换为下面的表达式： <br />NOT EXISTS (SELECT sal FROM emp WHERE deptno = 10 AND x &lt;= sal)</p>
		<p>~~ BETWEEN 操作符优化: <br />优化器总是用“&gt;=”和“&lt;=”比较符来等价的代替BETWEEN操作符。 <br />例如：优化器会把表达式sal BETWEEN 2000 AND 3000用sal &gt;= 2000 AND sal &lt;= 3000来代替。</p>
		<p>~~ NOT 操作符优化: <br />优化器总是试图简化检索条件以消除“NOT”逻辑操作符的影响，这将涉及到“NOT”操作符的消除以及代以相应的比较运算符。 <br />例如，优化器将下面的第一条语句用第二条语句代替： <br />NOT deptno = (SELECT deptno FROM emp WHERE ename = 'TAYLOR') <br />deptno &lt;&gt; (SELECT deptno FROM emp WHERE ename = 'TAYLOR') <br />通常情况下一个含有NOT操作符的语句有很多不同的写法，优化器的转换原则是使“NOT”操作符后边的子句尽可能的简单，即使可能会使结果表达式包含了更多的“NOT”操作符。 <br />例如，优化器将如下所示的第一条语句用第二条语句代替： <br />NOT (sal &lt; 1000 OR comm IS NULL) <br />NOT sal &lt; 1000 AND comm IS NOT NULL sal &gt;= 1000 AND comm IS NOT NULL</p>
		<p>如何编写高效的SQL: <br />当然要考虑sql常量的优化和操作符的优化啦，另外，还需要：</p>
		<p>1 合理的索引设计： <br />例：表record有620000行，试看在不同的索引下，下面几个SQL的运行情况： <br />语句A <br />SELECT count(*) FROM record <br />WHERE date &gt;'19991201' and date &lt; '19991214‘ and amount &gt;2000</p>
		<p>语句B <br />SELECT count(*) FROM record <br />WHERE date &gt;'19990901' and place IN ('BJ','SH')</p>
		<p>语句C <br />SELECT date,sum(amount) FROM record <br />group by date <br />1 在date上建有一个非聚集索引 <br />A：(25秒) <br />B：(27秒) <br />C：(55秒) <br />分析： <br />date上有大量的重复值，在非聚集索引下，数据在物理上随机存放在数据页上，在范围查找时，必须执行一次表扫描才能找到这一范围内的全部行。 <br />2 在date上的一个聚集索引 <br />A：（14秒） <br />B：（14秒） <br />C：（28秒） <br />分析： <br />在聚集索引下，数据在物理上按顺序在数据页上，重复值也排列在一起，因而在范围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范围扫描，提高了查询速度。 <br />3 在place，date，amount上的组合索引 <br />A：（26秒） <br />C：（27秒） <br />B：（&lt; 1秒） <br />分析： <br />这是一个不很合理的组合索引，因为它的前导列是place，第一和第二条SQL没有引用place，因此也没有利用上索引；第三个SQL使用了place，且引用的所有列都包含在组合索引中，形成了索引覆盖，所以它的速度是非常快的。 <br />4 在date，place，amount上的组合索引 <br />A： (&lt; 1秒) <br />B：（&lt; 1秒） <br />C：（11秒） <br />分析： <br />这是一个合理的组合索引。它将date作为前导列，使每个SQL都可以利用索引，并且在第一和第三个SQL中形成了索引覆盖，因而性能达到了最优。</p>
		<p>总结1 <br />缺省情况下建立的索引是非聚集索引，但有时它并不是最佳的；合理的索引设计要建立在对各种查询的分析和预测上。一般来说： <br />有大量重复值、且经常有范围查询（between, &gt;,&lt; ，&gt;=,&lt; =）和order by、group by发生的列，考虑建立聚集索引； <br />经 常同时存取多列，且每列都含有重复值可考虑建立组合索引；在条件表达式中经常用到的不同值较多的列上建立检索，在不同值少的列上不要建立索引。比如在雇员 表的“性别”列上只有“男”与“女”两个不同值，因此就无必要建立索引。如果建立索引不但不会提高查询效率，反而会严重降低更新速度。 <br />组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。</p>
		<p>2 避免使用不兼容的数据类型： <br />例如float和INt、char和varchar、bINary和varbINary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: <br />SELECT name FROM employee WHERE salary ＞ 60000 <br />在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。</p>
		<p>3 IS NULL 与IS NOT NULL： <br />不 能用null作索引，任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下，只要这些列中有一列含有null，该列就会从索引中排 除。也就是说如果某列存在空值，即使对该列建索引也不会提高性能。任何在WHERE子句中使用is null或is not null的语句优化器是不允 许使用索引的。</p>
		<p>4 IN和EXISTS： <br />EXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。 <br />例子： <br />语句1 <br />SELECT dname, deptno FROM dept <br />WHERE deptno NOT IN <br />(SELECT deptno FROM emp); <br />语句2 <br />SELECT dname, deptno FROM dept <br />WHERE NOT EXISTS <br />(SELECT deptno FROM emp <br />WHERE dept.deptno = emp.deptno); <br />明显的，2要比1的执行性能好很多 <br />因为1中对emp进行了full table scan,这是很浪费时间的操作。而且1中没有用到emp的INdex， <br />因为没有WHERE子句。而2中的语句对emp进行的是range scan。</p>
		<p>5 IN、OR子句常会使用工作表，使索引失效： <br />如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。</p>
		<p>6 避免或简化排序： <br />应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时，优化器就避免了排序的步骤。以下是一些影响因素： <br />索引中不包括一个或几个待排序的列； <br />group by或order by子句中列的次序与索引的次序不一样； <br />排序的列来自不同的表。 <br />为了避免不必要的排序，就要正确地增建索引，合理地合并数据库表（尽管有时可能影响表的规范化，但相对于效率的提高是值得的）。如果排序不可避免，那么应当试图简化它，如缩小排序的列的范围等。</p>
		<p>7 消除对大型表行数据的顺序存取： <br />在 嵌套查询中，对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略，一个嵌套3层的查询，如果每层都查询1000行，那么这个查询就要查询 10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如，两个表：学生表（学号、姓名、年龄??）和选课表（学号、课程号、成绩）。如果两个 表要做连接，就要在“学号”这个连接字段上建立索引。 <br />还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引，但某些形式的WHERE子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作： <br />SELECT ＊ FROM orders WHERE (customer_num=104 AND order_num&gt;1001) OR order_num=1008 <br />虽然在customer_num和order_num上建有索引，但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合，所以应该改为如下语句： <br />SELECT ＊ FROM orders WHERE customer_num=104 AND order_num&gt;1001 <br />UNION <br />SELECT ＊ FROM orders WHERE order_num=1008 <br />这样就能利用索引路径处理查询。</p>
		<p>8 避免相关子查询： <br />一个列的标签同时在主查询和WHERE子句中的查询中出现，那么很可能当主查询中的列值改变之后，子查询必须重新查询一次。查询嵌套层次越多，效率越低，因此应当尽量避免子查询。如果子查询不可避免，那么要在子查询中过滤掉尽可能多的行。</p>
		<p>9 避免困难的正规表达式： <br />MATCHES和LIKE关键字支持通配符匹配，技术上叫正规表达式。但这种匹配特别耗费时间。例如：SELECT ＊ FROM customer WHERE zipcode LIKE “98_ _ _” <br />即使在zipcode字段上建立了索引，在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT ＊ FROM customer WHERE zipcode &gt;“98000”，在执行查询时就会利用索引来查询，显然会大大提高速度。 <br />另外，还要避免非开始的子串。例如语句：SELECT ＊ FROM customer WHERE zipcode[2，3] &gt;“80”，在WHERE子句中采用了非开始子串，因而这个语句也不会使用索引。</p>
		<p>10 不充份的连接条件： <br />例：表card有7896行，在card_no上有一个非聚集索引，表account有191122行，在account_no上有一个非聚集索引，试看在不同的表连接条件下，两个SQL的执行情况： <br />SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no <br />（20秒） <br />将SQL改为： <br />SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no and a.account_no=b.account_no <br />（&lt; 1秒） <br />分析： <br />在第一个连接条件下，最佳查询方案是将account作外层表，card作内层表，利用card上的索引，其I/O次数可由以下公式估算为： <br />外层表account上的22541页+（外层表account的191122行*内层表card上对应外层表第一行所要查找的3页）=595907次I/O <br />在第二个连接条件下，最佳查询方案是将card作外层表，account作内层表，利用account上的索引，其I/O次数可由以下公式估算为： <br />外层表card上的1944页+（外层表card的7896行*内层表account上对应外层表每一行所要查找的4页）= 33528次I/O <br />可见，只有充份的连接条件，真正的最佳方案才会被执行。 <br />多表操作在被实际执行前，查询优化器会根据连接条件，列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表；内外表的选择可由公式：外层表中的匹配行数*内层表中每一次查找的次数确定，乘积最小为最佳方案。 <br />不可优化的WHERE子句 <br />例1 <br />下列SQL条件语句中的列都建有恰当的索引，但执行速度却非常慢： <br />SELECT * FROM record WHERE substrINg(card_no,1,4)='5378' <br />(13秒) <br />SELECT * FROM record WHERE amount/30&lt; 1000 <br />（11秒） <br />SELECT * FROM record WHERE convert(char(10),date,112)='19991201' <br />（10秒） <br />分析： <br />WHERE子句中对列的任何操作结果都是在SQL运行时逐列计算得到的，因此它不得不进行表搜索，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么就可以被SQL优化器优化，使用索引，避免表搜索，因此将SQL重写成下面这样： <br />SELECT * FROM record WHERE card_no like '5378%' <br />（&lt; 1秒） <br />SELECT * FROM record WHERE amount&lt; 1000*30 <br />（&lt; 1秒） <br />SELECT * FROM record WHERE date= '1999/12/01' <br />（&lt; 1秒）</p>
		<p>11 存储过程中，采用临时表优化查询： <br />例 <br />1．从parven表中按vendor_num的次序读数据： <br />SELECT part_num，vendor_num，price FROM parven ORDER BY vendor_num <br />INTO temp pv_by_vn <br />这个语句顺序读parven（50页），写一个临时表（50页），并排序。假定排序的开销为200页，总共是300页。 <br />2．把临时表和vendor表连接，把结果输出到一个临时表，并按part_num排序： <br />SELECT pv_by_vn，＊ vendor.vendor_num FROM pv_by_vn，vendor <br />WHERE pv_by_vn.vendor_num=vendor.vendor_num <br />ORDER BY pv_by_vn.part_num <br />INTO TMP pvvn_by_pn <br />DROP TABLE pv_by_vn <br />这 个查询读取pv_by_vn(50页)，它通过索引存取vendor表1.5万次，但由于按vendor_num次序排列，实际上只是通过索引顺序地读 vendor表（40＋2=42页），输出的表每页约95行，共160页。写并存取这些页引发5＊160=800次的读写，索引共读写892页。 <br />3．把输出和part连接得到最后的结果： <br />SELECT pvvn_by_pn.＊，part.part_desc FROM pvvn_by_pn，part <br />WHERE pvvn_by_pn.part_num=part.part_num <br />DROP TABLE pvvn_by_pn <br />这样，查询顺序地读pvvn_by_pn(160页)，通过索引读part表1.5万次，由于建有索引，所以实际上进行1772次磁盘读写，优化比例为30∶1。</p>
		<p>好了，搞定。 <br />其实sql的优化，各种数据库之间都是互通的<br /><br /><br /></p>
		<p>影响SQL server性能的关键三个方面(转贴)</p>
		<p>关键词：Sql Server</p>
		<p>转贴自:http://202.200.129.193/ <br />1 逻辑数据库和表的设计 <br />数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为</p>
		<p>优化数据库和应用程序打下良好的基础。</p>
		<p>标准化的数据库逻辑设计包括用多的、有相互关系的窄表来代替很多列的长数据表。下面是一些使用标准化</p>
		<p>表的一些好处。</p>
		<p>A:由于表窄，因此可以使排序和建立索引更为迅速</p>
		<p>B:由于多表，所以多镞的索引成为可能</p>
		<p>C:更窄更紧凑的索引</p>
		<p>D:每个表中可以有少一些的索引，因此可以提高insert update delete等的速度，因为这些操作在索引</p>
		<p>多的情况下会对系统性能产生很大的影响</p>
		<p>E:更少的空值和更少的多余值，增加了数据库的紧凑性</p>
		<p>由于标准化，所以会增加了在获取数据时引用表的数目和其间的连接关系的复杂性。太多的表和复杂的连接关系会降低服务器的性能，因此在这两者之间需要综合考虑。 <br />定义具有相关关系的主键和外来键时应该注意的事项主要是：用于连接多表的主键和参考的键要有相同的数据类型。</p>
		<p>2 索引的设计 <br />A:尽量避免表扫描 <br />检查你的查询语句的where子句，因为这是优化器重要关注的地方。包含在where里面的每一列（column)都是可能的侯选索引，为能达到最优的性能，考虑在下面给出的例子：对于在where子句中给出了column1这个列。 <br />下面的两个条件可以提高索引的优化查询性能！ <br />第一：在表中的column1列上有一个单索引 <br />第二：在表中有多索引，但是column1是第一个索引的列 <br />避免定义多索引而column1是第二个或后面的索引，这样的索引不能优化服务器性能 <br />例如：下面的例子用了pubs数据库。 <br />SELECT au_id, au_lname, au_fname FROM authors <br />WHERE au_lname = 'White' <br />按下面几个列上建立的索引将会是对优化器有用的索引 <br />?au_lname <br />?au_lname, au_fname <br />而在下面几个列上建立的索引将不会对优化器起到好的作用 <br />?au_address <br />?au_fname, au_lname <br />考虑使用窄的索引在一个或两个列上，窄索引比多索引和复合索引更能有效。用窄的索引，在每一页上 <br />将会有更多的行和更少的索引级别（相对与多索引和复合索引而言），这将推进系统性能。 <br />对于多列索引，SQL Server维持一个在所有列的索引上的密度统计（用于联合）和在第一个索引上的 <br />histogram（柱状图）统计。根据统计结果，如果在复合索引上的第一个索引很少被选择使用，那么优化器对很多查询请求将不会使用索引。 <br />有用的索引会提高select语句的性能，包括insert,uodate,delete。 <br />但是，由于改变一个表的内容，将会影响索引。每一个insert,update,delete语句将会使性能下降一些。实验表明，不要在一个单表上用大量的索引，不要在共享的列上（指在多表中用了参考约束）使用重叠的索引。 <br />在某一列上检查唯一的数据的个数，比较它与表中数据的行数做一个比较。这就是数据的选择性，这比较结果将会帮助你决定是否将某一列作为侯选的索引列，如果需要，建哪一种索引。你可以用下面的查询语句返回某一列的不同值的数目。 <br />select count(distinct cloumn_name) from table_name <br />假设column_name是一个10000行的表，则看column_name返回值来决定是否应该使用，及应该使用什么索引。 <br />Unique values Index</p>
		<p>5000 Nonclustered index <br />20 Clustered index <br />3 No index</p>
		<p>镞索引和非镞索引的选择</p>
		<p>&lt;1:&gt;镞索引是行的物理顺序和索引的顺序是一致的。页级，低层等索引的各个级别上都包含实际的数据页。一个表只能是有一个镞索引。由于update,delete语句要求相对多一些的读操作，因此镞索引常常能加速这样的操作。在至少有一个索引的表中，你应该有一个镞索引。 <br />在下面的几个情况下，你可以考虑用镞索引： <br />例如： 某列包括的不同值的个数是有限的（但是不是极少的） <br />顾客表的州名列有50个左右的不同州名的缩写值，可以使用镞索引。 <br />例如： 对返回一定范围内值的列可以使用镞索引，比如用between,&gt;,&gt;=,&lt;,&lt;=等等来对列进行操作的列上。 <br />select * from sales where ord_date between '5/1/93' and '6/1/93' <br />例如： 对查询时返回大量结果的列可以使用镞索引。 <br />SELECT * FROM phonebook WHERE last_name = 'Smith'</p>
		<p>当有大量的行正在被插入表中时，要避免在本表一个自然增长（例如，identity列）的列上建立镞索引。如果你建立了镞的索引，那么insert的性能就会大大降低。因为每一个插入的行必须到表的最后，表的最后一个数据页。 <br />当一个数据正在被插入（这时这个数据页是被锁定的），所有的其他插入行必须等待直到当前的插入已经结束。 <br />一个索引的叶级页中包括实际的数据页，并且在硬盘上的数据页的次序是跟镞索引的逻辑次序一样的。</p>
		<p>&lt;2:&gt;一个非镞的索引就是行的物理次序与索引的次序是不同的。一个非镞索引的叶级包含了指向行数据页的指针。 <br />在一个表中可以有多个非镞索引，你可以在以下几个情况下考虑使用非镞索引。 <br />在有很多不同值的列上可以考虑使用非镞索引 <br />例如：一个part_id列在一个part表中 <br />select * from employee where emp_id = 'pcm9809f' <br />查询语句中用order by 子句的列上可以考虑使用镞索引</p>
		<p>3 查询语句的设计</p>
		<p>SQL Server优化器通过分析查询语句，自动对查询进行优化并决定最有效的执行方案。优化器分析查询语句来决定那个子句可以被优化，并针对可以被优化查询的子句来选择有用的索引。最后优化器比较所有可能的执行方案并选择最有效的一个方案出来。 <br />在执行一个查询时，用一个where子句来限制必须处理的行数，除非完全需要，否则应该避免在一个表中无限制地读并处理所有的行。 <br />例如下面的例子， <br />select qty from sales where stor_id=7131 <br />是很有效的比下面这个无限制的查询 <br />select qty from sales <br />避免给客户的最后数据选择返回大量的结果集。允许SQL Server运行满足它目的的函数限制结果集的大小是更有效的。 <br />这能减少网络I/O并能提高多用户的相关并发时的应用程序性能。因为优化器关注的焦点就是where子句的查询，以利用有用的索引。在表中的每一个索引都可能成为包括在where子句中的侯选索引。为了最好的性能可以遵照下面的用于一个给定列column1的索引。 <br />第一：在表中的column1列上有一个单索引 <br />第二：在表中有多索引，但是column1是第一个索引的列不要在where子句中使用没有column1列索引的查询语句，并避免在where子句用一个多索引的非第一个索引的索引。 <br />这时多索引是没有用的。 <br />For example, given a multicolumn index on the au_lname, au_fname columns of the authors table in <br />the pubs database, <br />下面这个query语句利用了au_lname上的索引 <br />SELECT au_id, au_lname, au_fname FROM authors <br />WHERE au_lname = 'White' <br />AND au_fname = 'Johnson' <br />SELECT au_id, au_lname, au_fname FROM authors <br />WHERE au_lname = 'White' <br />下面这个查询没有利用索引，因为他使用了多索引的非第一个索引的索引 <br />SELECT au_id, au_lname, au_fname FROM authors <br />WHERE au_fname = 'Johnson'</p>
		<p>
				<br />
				<br />
		</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/76763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-23 15:23 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/23/76763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail 深入浅出</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 23 Oct 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76762.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JavaMail 深入浅出																																    我干软件开发也有一点的年头了,回头想想,也经历了不少的酸甜苦辣,为解决了复杂的问题快乐过.也为不分昼夜的加班赶工程郁闷过.不过这些都没能减少我对计算机的热情,我对程序的喜好.以前对JavaMail也有一些学习性的认识,不过一直没在实际的项目中应用过.直到最近的一个项目,需要Java...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/76762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-23 15:10 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH的整合开发</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/19/76123.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 19 Oct 2006 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/19/76123.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76123.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/19/76123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76123.html</trackback:ping><description><![CDATA[
		<p>一，数据表（因为是一个小例子，所以只有一个表，毕竟这不是一个讲怎么配置hibernate级联的例子。）<br />CREATE TABLE `members` (<br />`id` int(7) NOT NULL auto_increment,<br />`name` varchar(20) NOT NULL default '',<br />`password` varchar(20) default NULL,<br />`sex` varchar(10) default NULL,<br />`mail` varchar(50) default NULL,<br />PRIMARY KEY (`id`),<br />UNIQUE KEY `name` (`name`)<br />) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8<br />二，hibernate持久化类及映射文件、数据库操作封装DAO<br />package com.yang.product.booksonline.dao;</p>
		<p>/**<br />* Members <br />*/</p>
		<p>public class Members implements java.io.Serializable {</p>
		<p>
				<br />  // Fields   </p>
		<p>  private Integer id;<br />  private String name;<br />  private String password;<br />  private String sex;<br />  private String mail;</p>
		<p>
				<br />  // Constructors</p>
		<p>  /** default constructor */<br />  public Members() {<br />  }</p>
		<p>     /** minimal constructor */<br />  public Members(String name) {<br />    this.name = name;<br />  }<br />  <br />  /** full constructor */<br />  public Members(String name, String password, String sex, String mail) {<br />    this.name = name;<br />    this.password = password;<br />    this.sex = sex;<br />    this.mail = mail;<br />  }</p>
		<p>  <br />  // Property accessors</p>
		<p>  public Integer getId() {<br />    return this.id;<br />  }<br />  <br />  public void setId(Integer id) {<br />    this.id = id;<br />  }</p>
		<p>  public String getName() {<br />    return this.name;<br />  }<br />  <br />  public void setName(String name) {<br />    this.name = name;<br />  }</p>
		<p>  public String getPassword() {<br />    return this.password;<br />  }<br />  <br />  public void setPassword(String password) {<br />    this.password = password;<br />  }</p>
		<p>  public String getSex() {<br />    return this.sex;<br />  }<br />  <br />  public void setSex(String sex) {<br />    this.sex = sex;<br />  }</p>
		<p>  public String getMail() {<br />    return this.mail;<br />  }<br />  <br />  public void setMail(String mail) {<br />    this.mail = mail;<br />  }<br />}</p>
		<p>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>"&gt;<br />&lt;hibernate-mapping&gt;<br />  &lt;class name="com.yang.product.booksonline.dao.Members" table="members" catalog="books"&gt;<br />    &lt;id name="id" type="integer"&gt;<br />        &lt;column name="id" /&gt;<br />        &lt;generator class="native" /&gt;<br />    &lt;/id&gt;<br />    &lt;property name="name" type="string"&gt;<br />        &lt;column name="name" length="20" not-null="true" unique="true" /&gt;<br />    &lt;/property&gt;<br />    &lt;property name="password" type="string"&gt;<br />        &lt;column name="password" length="20" /&gt;<br />    &lt;/property&gt;<br />    &lt;property name="sex" type="string"&gt;<br />        &lt;column name="sex" length="10" /&gt;<br />    &lt;/property&gt;<br />    &lt;property name="mail" type="string"&gt;<br />        &lt;column name="mail" length="50" /&gt;<br />    &lt;/property&gt;<br />  &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;</p>
		<p>package com.yang.product.booksonline.dao;</p>
		<p>import java.util.List;<br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.hibernate.LockMode;<br />import org.hibernate.criterion.Example;<br />import org.springframework.context.ApplicationContext;<br />import org.springframework.orm.hibernate3.support.HibernateDaoSupport;</p>
		<p>/**<br />* Data access object (DAO) for domain model class Members.<br />* @see com.yang.product.booksonline.dao.Members<br />* @author lanxincao<br />*/<br />public class MembersDAO extends HibernateDaoSupport {</p>
		<p>  private static final Log log = LogFactory.getLog(MembersDAO.class);</p>
		<p>     protected void initDao() {<br />           //do nothing<br />     }<br />  <br />  public void save(Members transientInstance) {<br />    log.debug("saving Members instance");<br />    try {<br />        getHibernateTemplate().saveOrUpdate(transientInstance);<br />        log.debug("save successful");<br />    } catch (RuntimeException re) {<br />        log.error("save failed", re);<br />        throw re;<br />    }<br />  }<br />  <br />     public void delete(Members persistentInstance) {<br />    log.debug("deleting Members instance");<br />    try {<br />        getHibernateTemplate().delete(persistentInstance);<br />        log.debug("delete successful");<br />    } catch (RuntimeException re) {<br />        log.error("delete failed", re);<br />        throw re;<br />    }<br />  }<br />  <br />  public Members findById( java.lang.Integer id) {<br />    log.debug("getting Members instance with id: " + id);<br />    try {<br />        Members instance = (Members) getHibernateTemplate()<br />            .get("com.yang.product.booksonline.dao.Members", id);<br />        return instance;<br />    } catch (RuntimeException re) {<br />        log.error("get failed", re);<br />        throw re;<br />    }<br />  }<br />  <br />  <br />  public List findByExample(Members instance) {<br />    log.debug("finding Members instance by example");<br />    try {<br />        List results = getSession()<br />            .createCriteria("com.yang.product.booksonline.dao.Members")<br />            .add(Example.create(instance))<br />        .list();<br />        log.debug("find by example successful, result size: " + results.size());<br />        return results;<br />    } catch (RuntimeException re) {<br />        log.error("find by example failed", re);<br />        throw re;<br />    }<br />  }   <br />  <br />  public Members merge(Members detachedInstance) {<br />    log.debug("merging Members instance");<br />    try {<br />        Members result = (Members) getHibernateTemplate()<br />            .merge(detachedInstance);<br />        log.debug("merge successful");<br />        return result;<br />    } catch (RuntimeException re) {<br />        log.error("merge failed", re);<br />        throw re;<br />    }<br />  }</p>
		<p>  public void attachDirty(Members instance) {<br />    log.debug("attaching dirty Members instance");<br />    try {<br />        getHibernateTemplate().saveOrUpdate(instance);<br />        log.debug("attach successful");<br />    } catch (RuntimeException re) {<br />        log.error("attach failed", re);<br />        throw re;<br />    }<br />  }<br />  <br />  public void attachClean(Members instance) {<br />    log.debug("attaching clean Members instance");<br />    try {<br />        getHibernateTemplate().lock(instance, LockMode.NONE);<br />        log.debug("attach successful");<br />    } catch (RuntimeException re) {<br />        log.error("attach failed", re);<br />        throw re;<br />    }<br />  }<br />  <br />  public List findByMembersName(String name){<br />       log.debug("finding by members' name.");<br />       try {<br />             return getHibernateTemplate().find("from Members as members where members.name = ?"<br />                         ,new String[]{name});<br />       } catch (RuntimeException re) {<br />             log.error("finding by members' name failed",re);<br />             throw re;<br />       }<br />  }</p>
		<p>     public static MembersDAO getFromApplicationContext(ApplicationContext ctx) {<br />       return (MembersDAO) ctx.getBean("MembersDAO");<br />     }<br />}</p>
		<p>三，spring配置<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</p>
		<p>&lt;beans&gt;</p>
		<p>
				<br />     &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />           &lt;property name="driverClassName"&gt;<br />                 &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br />           &lt;/property&gt;<br />           &lt;property name="url"&gt;<br />                 &lt;value&gt;jdbc:mysql://localhost:3306/books&lt;/value&gt;<br />           &lt;/property&gt;<br />           &lt;property name="username"&gt;<br />                 &lt;value&gt;root&lt;/value&gt;<br />           &lt;/property&gt;<br />           &lt;property name="password"&gt;<br />                 &lt;value&gt;snrdcqmq&lt;/value&gt;<br />           &lt;/property&gt;<br />     &lt;/bean&gt;<br />     &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />           &lt;property name="dataSource"&gt;<br />                 &lt;ref bean="dataSource" /&gt;<br />           &lt;/property&gt;<br />           &lt;property name="hibernateProperties"&gt;<br />                 &lt;props&gt;<br />                       &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />                 &lt;/props&gt;<br />           &lt;/property&gt;<br />           &lt;property name="mappingResources"&gt;<br />                 &lt;list&gt;<br />                       &lt;value&gt;com/yang/product/booksonline/dao/Members.hbm.xml&lt;/value&gt;<br />                 &lt;/list&gt;<br />           &lt;/property&gt;<br />     &lt;/bean&gt;<br />     &lt;bean id="MembersDAO" class="com.yang.product.booksonline.dao.MembersDAO"&gt;<br />           &lt;property name="sessionFactory"&gt;<br />                 &lt;ref bean="sessionFactory" /&gt;<br />           &lt;/property&gt;<br />     &lt;/bean&gt;<br />     <br />     &lt;bean name="/members" class="com.yang.product.booksonline.action.MembersAction"&gt;<br />           &lt;property name="membersDAO"&gt;<br />                 &lt;ref bean="MembersDAO"/&gt;<br />           &lt;/property&gt;<br />     &lt;/bean&gt;<br />&lt;/beans&gt;<br />四，struts配置及action类<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "<a href="http://struts.apache.org/dtds/struts-config_1_2.dtd">http://struts.apache.org/dtds/struts-config_1_2.dtd</a>"&gt;</p>
		<p>&lt;struts-config&gt;<br />&lt;data-sources /&gt;<br />&lt;form-beans &gt;<br />  &lt;form-bean name="membersForm" type="org.apache.struts.validator.DynaValidatorForm"&gt;<br />    &lt;form-property name="sex" type="java.lang.String" /&gt;<br />    &lt;form-property name="password" type="java.lang.String" /&gt;<br />    &lt;form-property name="mail" type="java.lang.String" /&gt;<br />    &lt;form-property name="name" type="java.lang.String" /&gt;<br />  &lt;/form-bean&gt;</p>
		<p>&lt;/form-beans&gt;</p>
		<p>&lt;global-exceptions /&gt;<br />&lt;global-forwards /&gt;<br />&lt;action-mappings &gt;<br />  &lt;action<br />    attribute="membersForm"<br />    name="membersForm"<br />    parameter="action"<br />    path="/members"<br />    scope="request"<br />    type="org.springframework.web.struts.DelegatingActionProxy" &gt;<br />    &lt;forward name="loginSuccess" path="/index.jsp" /&gt;<br />    &lt;forward name="registerSuccess" path="/index.jsp" /&gt;<br />    &lt;forward name="logoutSuccess" path="/index.jsp" /&gt;<br />  &lt;/action&gt;</p>
		<p>
				<br />&lt;/action-mappings&gt;</p>
		<p>&lt;message-resources parameter="com.yang.product.booksonline.ApplicationResources" /&gt;<br />&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;<br />  &lt;set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /&gt;<br />  &lt;set-property property="stopOnFirstError" value="true" /&gt;<br />&lt;/plug-in&gt;<br />&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />  &lt;set-property property="contextConfigLocation" value="/WEB-INF/springContext.xml" /&gt;<br />&lt;/plug-in&gt;</p>
		<p>&lt;/struts-config&gt;</p>
		<p>package com.yang.product.booksonline.action;</p>
		<p>import java.util.List;</p>
		<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
		<p>import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.action.DynaActionForm;<br />import org.apache.struts.actions.DispatchAction;</p>
		<p>import com.yang.product.booksonline.dao.Members;<br />import com.yang.product.booksonline.dao.MembersDAO;</p>
		<p>/** <br />* XDoclet definition:<br />* @struts.action path="/members" name="membersForm" parameter="action" scope="request" validate="true"<br />*/<br />public class MembersAction extends DispatchAction {<br />     private MembersDAO membersDAO;</p>
		<p>     public MembersDAO getMembersDAO() {<br />           return membersDAO;<br />     }</p>
		<p>     public void setMembersDAO(MembersDAO membersDAO) {<br />           this.membersDAO = membersDAO;<br />     }<br />     <br />     public ActionForward login (ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {<br />//            String url = request.getParameter("url");<br />           String name = (String)((DynaActionForm)form).get("name");<br />           String password = (String)((DynaActionForm)form).get("password");<br />           List members = membersDAO.findByMembersName(name);<br />           if (members != null &amp;&amp; members.size() &gt;0) {<br />                 Members member = (Members)members.get(0);<br />                 if (password.equals(member.getPassword())) {<br />                       request.getSession().setAttribute("member",name);<br />                       //return new ActionForward(url);<br />                       return mapping.findForward("loginSuccess");<br />                 } else {<br />                       return null;<br />                 }<br />           } else {<br />                 return null;<br />           }<br />     }</p>
		<p>     public ActionForward logout (ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {<br />           request.getSession().removeAttribute("member");<br />           return mapping.findForward("logoutSuccess");<br />     }</p>
		<p>     public ActionForward register (ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {<br />           String name = (String)((DynaActionForm)form).get("name");<br />           String password = (String)((DynaActionForm)form).get("password");<br />           String sex = (String)((DynaActionForm)form).get("sex");<br />           String mail = (String)((DynaActionForm)form).get("mail");<br />           List members = membersDAO.findByMembersName(name);<br />           if (members != null &amp;&amp; members.size() &gt;0) {<br />                 return null;<br />           } else {<br />                 Members member = new Members();<br />                 member.setName(name);<br />                 member.setPassword(password);<br />                 member.setSex(sex);<br />                 member.setMail(mail);<br />                 membersDAO.save(member);<br />                 return mapping.findForward("registerSuccess");<br />           }<br />     }<br />}</p>
		<p>注意到，这里使用了dispatchaction。<br />五，三个jsp部分内容<br />index.jsp<br />&lt;body&gt;<br />&lt;logic:notPresent name="member" scope="session"&gt;<br />     Welcome,you have not &lt;html:link href="login.jsp"&gt;login&lt;/html:link&gt;. &lt;br&gt;<br />&lt;/logic:notPresent&gt;<br />&lt;logic:present name="member" scope="session"&gt;<br />     Welcome,&lt;bean:write name="member" scope="session"/&gt;.&lt;html:link href="members.do?action=logout"&gt;Logout&lt;/html:link&gt;<br />&lt;/logic:present&gt;<br />&lt;/body&gt;<br />login.jsp<br />&lt;body&gt;<br />  If you haven't registered the system,please &lt;html:link href="register.jsp"&gt;register&lt;/html:link&gt;<br />  &lt;html:form action="/members.do?action=login" method="post" focus="name"&gt;<br />    &lt;table border="0"&gt;<br />    &lt;tr&gt;<br />      &lt;td&gt;&lt;bean:message key="members.form.name.label"/&gt;:&lt;/td&gt;<br />      &lt;td&gt;&lt;html:text property="name" /&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt;<br />      &lt;td&gt;&lt;bean:message key="members.form.password.label"/&gt;:&lt;/td&gt;<br />      &lt;td&gt;&lt;html:password property="password" /&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt;<br />      &lt;td colspan="2" align="center"&gt;&lt;html:submit&gt;&lt;bean:message key="members.form.login.label"/&gt;&lt;/html:submit&gt;&lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;/table&gt;<br />  &lt;/html:form&gt;<br />&lt;/body&gt;<br />register.jsp<br />&lt;body&gt;<br />  Welcome to register the books online. &lt;br&gt;<br />  &lt;html:form action="/members.do?action=register" method="POST"&gt;<br />  &lt;bean:message key="members.form.name.label"/&gt;:&lt;html:text property="name"/&gt;&lt;br&gt;<br />  &lt;bean:message key="members.form.password.label"/&gt;:&lt;html:password property="password"/&gt;&lt;br&gt;<br />  &lt;bean:message key="members.form.sex.label"/&gt;:<br />  &lt;html:select property="sex"&gt;<br />       &lt;html:option key="members.form.sex.male" value="male" /&gt;<br />       &lt;html:option key="members.form.sex.female" value="female" /&gt;<br />  &lt;/html:select&gt;&lt;br&gt;<br />  &lt;bean:message key="members.form.mail.label"/&gt;:&lt;html:text property="mail"/&gt;&lt;br&gt;<br />  &lt;html:submit&gt;&lt;bean:message key="members.form.register.label"/&gt;&lt;/html:submit&gt;<br />  &lt;/html:form&gt;<br />&lt;/body&gt;</p>
		<p>注意：在开发过程中，本想加上输入验证的，因为前面己经有了这方面的例子，为了不重复，这里就有意去掉了这部分，但要运行这个例子，还是你自己加上validation.xml、validator-rules.xml两个文件，不然会出错。</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/76123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-19 12:03 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/19/76123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一条sql语句删除表中所有除ID 不同之外的记录，只留一条。</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/18/75983.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 18 Oct 2006 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/18/75983.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/75983.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/18/75983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/75983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/75983.html</trackback:ping><description><![CDATA[
		<p>表：<br />CREATE TABLE Company_Info<br />(<br />   id  smallint IDENTITY(1,1) ,<br />   username varchar(50) null,<br />   password varchar(50) null,<br />   PRIMARY KEY(id) <br />)<br /><br />思路<br /></p>
		<p>------------显示哪些人相同，相同的数量是多少？</p>
		<p>select convert(int,SQRT(count(*))) as countU ,a.username from Company_Info a left join Company_Info b on </p>
		<p>a.username=b.username and a.password=b.password</p>
		<p>group by a.username having SQRT(count(*)) &gt;1</p>
		<p> </p>
		<p>----------取出所有相同的记录到一个表MyRepeat</p>
		<p>
				<br />select c.* into MyRepeat from Company_Info c where c.username in(<br />select a.username from Company_Info a left join Company_Info b on <br />a.username=b.username and a.password=b.password<br />group by a.username having SQRT(count(*)) &gt;1)</p>
		<p> </p>
		<p> </p>
		<p>-----------在表MyRepeat中找出每个相同记录的除最大id之外</p>
		<p>
				<br />select a.id from MyRepeat a where id not in(select max(b.id) from MyRepeat b group by b.username)--得出所有需要删除的id<br /><br />-----------<br />最后得出<br /><br /></p>
		<p>delete Company_Info where id in (select h.id from (select c.* from Company_Info c where c.username in(select a.username from Company_Info a left join Company_Info b on a.username=b.username and a.password=b.password group by a.username having SQRT(count(*)) &gt;1) ) h where h.id not in( select max(l.id) from (select k.id,username from (select f.* from Company_Info f where f.username in(select g.username from Company_Info g left join Company_Info o on g.username=o.username and g.password=o.password group by g.username having SQRT(count(*)) &gt;1)) k ) l group by l.username))</p>
		<p> </p>
		<p>
				<br />
				<br />
				<br /> </p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/75983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-18 17:04 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/18/75983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Spring , Struts结合学习</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 21 Sep 2006 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/71106.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/71106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/71106.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于Spring , Struts结合学习。		一、前言		刚刚接触了日本一个项目，用的框架名称是Northland Framework，主要用到以下部分		Struts、Spring、iBATIS、Velocity。Struts、Spring如何结合在一起？						二、				Spring				提供了三种整合				Struts				的方法：		...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/71106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-21 15:04 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/21/71106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅论taglib设计 </title><link>http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Sep 2006 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68675.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68675.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="http://www.cnblogs.com/xchunyu/archive/2004/09/28/47472.html">浅论taglib设计</a>
		</h2>
		<p>
				<strong>[概述]<br /></strong>
				<br />Taglib是JSP比较高级的技术。做为JSP开发人员来讲，不了解taglib是可以接受的。因为JSP的风格或者JAVA的风格就是一种简洁的美。如果技术太过复杂或者繁琐，就会在技术的汪洋中失去自我。<br /><br />但是，当我们的项目变得越来越大，或者团队有了一些技术积累之后，很自然就会有将我们的开发工作提高一个层次的需要。当我们面对一些非常类似的界面或者程序单元的时候，我们会想到把这样的工作成果直接用于下一个项目。这样的问题可以由taglib来解决。<br /><br />到此还没有真正说明一下taglib是什么。只要你从事过JSP的开发工作，你就已经使用过taglib了。只不过是在不知不觉中使用的。你一定不会忘记 &lt;jsp:include /&gt;标记。实际上这就是一个taglib。Taglib直译做标记库，是JSP定义给开发人员可以使用自行定义的标记体系。也就是说，开发人员可以在JSP中使用自己定义的特殊标记。而该标记可以用作特定的用途。比如显示一个每个页都需要的公司版权信息。就可以不用复制粘贴相同的代码到每个页去了。<br /><br />但是taglib可以完成的工作远远不止这些。由于每个自定义标记一定是一个完全的JAVA类，我们可以定义非常丰富的一组行为，并且可以通过自定义的attribute来控制它。<br /><br /><strong>[实例]</strong><br /><br />我习惯用实例来说明问题。大家也许都对用户会话状态的检查不陌生。当用户登录到系统后，我们希望自动保持用户的登录状态。而这个过程在每个需要认证用户才能访问的程序单元都需要实现。通常我们需要访问预定义的session服务器变量，当这个变量不满足某值时即判定改用户为非法访问或者会话状态丢失。<br /><br />我们来看一下使用taglib如何实现。我们需要编写一个仅处理该逻辑的标记。实现的最简单的逻辑：检查用户状态session值，不满足某值时即将用户转向一个预先设置的报错页。<br /><br />以下是源码(CheckSessionTag.java)：<br />(省略了细节)</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: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia" size="2">
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">public class CheckSessionTag extends TagSupport<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    public </span>
										<span style="COLOR: #0000ff">int</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000"> doEndTag()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">try</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            String member_id </font>
						</span>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (String) pageContext.getSession().getAttribute(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">member_id</span>
										<span style="COLOR: #000000">"</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000">(member_id </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">||</span>
										<span style="COLOR: #000000"> member_id.equals(</span>
										<span style="COLOR: #000000">""</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">))<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />                pageContext.forward(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/home/check_session_fail.jsp</span>
										<span style="COLOR: #000000">"</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">catch</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">(Exception e)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> 报告异常过程省略.</span>
								</font>
						</font>
						<span style="COLOR: #008000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								</font>
						</span>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">        }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">return</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<font face="Georgia" size="2"> EVAL_PAGE;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />}</font>
						</span>
				</div>
		</div>
		<p>
				<br />
				<br />
				<strong>[分析]</strong>
				<br />
				<br />在以上源码中，我们在使tag自动检查用户session变量中的"member_id"值，如果该值为空，则立即判定用户没有访问权限，则立即将流程导向一个预先设定的报错页：/home/check_session_fail.jsp.<br /><br />类CheckSessionTag派生自：TagSupport(javax.servlet.jsp.tagext.TagSupport). 是一个从JAVA 1.3就开始支持的类库，位于servlet.jar包。java文档给出的描述是：<br /><br />A base class for defining new tag handlers implementing Tag. The TagSupport class is a utility class intended to be used as the base class for new tag handlers. The TagSupport class implements the Tag and IterationTag interfaces and adds additional convenience methods including getter methods for the properties in Tag. TagSupport has one static method that is included to facilitate coordination among cooperating tags. Many tag handlers will extend TagSupport and only redefine a few methods.<br />(该类为所有taglib的基类。该类定义了实现标记的一系列接口。)<br /><br />在实例CheckSessionTag类中，我们仅仅重写了doEndTag方法。没有向其容器：jsp页输出任何东西。但是该类在实际应用中是切实可行的。<br /><br />以下是在一个成品项目中的某jsp中截取的片断：<br />&lt;logic:checkSession /&gt;<br /><br />当我们直接使用输入url的方式访问本页时，我们被立即带到了报告：用户会话状态丢失或者未经登录的页。<br />这就省却了我们习以为常的一项工作：以前我们必须复制相同的scriplet到每个jsp页。（实际上，也可以使用类似intercept filter的模式来处理此需求）。这使我们的开发工作变得reusable, flexiable, 和extendable。可以想象，如果我们想改变检查session的逻辑，则可以仅仅通过改变CheckSessionTag内部的逻辑就可以通盘改变。并且我们可以通过给logic:checkSession标记加上类似target=admin的attribute来限定只有管理员才可以访问的区域。这就是形成组件化开发的基本过程。<br /><br />如何实施呢? <br /><br /><br /><strong>[实施过程]</strong><br /><br />我们需要做一系列工作来将taglib引入我们的工程。<br /><br />web.xml<br />为了使jsp解析器可以识别我们的taglib必须将其配置在web.xml内。web.xml位于/WEB-INF目录内。<br />使用特定语法来配置我们的taglib:<br />web.xml(片断)</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: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">web-app</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<img src="http://www.cnblogs.com/Images/dot.gif" />
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">taglib</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">taglib-uri</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">/WEB-INF/logic.tld</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">taglib-uri</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">taglib-location</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">/WEB-INF/logic.tld</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">taglib-location</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">taglib</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<img src="http://www.cnblogs.com/Images/dot.gif" />
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">web-app</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</div>
		</div>
		<p>该语法告诉容器到什么地方去寻找所有logic:开头的tag.<br /><br />tld是taglib defination的缩写。即taglib定义。该文件定义了我们使用的标记，Java类如何加载，并且该标记如何工作。让我们来看一段实际的tld:<br />logic.tld(片断)</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: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia">
								<font size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
										<span style="COLOR: #0000ff">&lt;?</span>
										<span style="COLOR: #ff00ff">xml version="1.0" encoding="ISO-8859-1"</span>
										<span style="COLOR: #0000ff">?&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								</font>
						</span>
						<span style="COLOR: #0000ff">
								<font face="Georgia" size="2">&lt;!</font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #ff00ff">DOCTYPE taglib<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2/EN"<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
										<br />
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								</font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">taglib</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tlib-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">1.0</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tlib-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">jsp-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">1.2</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">jsp-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">short-name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">logic</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">short-name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">uri</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">/taglibs/logic</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">uri</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
										<br />
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">checkSession</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">mbajob.common.tags.logic.CheckSessionTag</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">empty</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
				</div>
		</div>
		<p>
				<br />我们注意到taglib标记内.<br />1． short-name: 标记的prefix名。<br />2． uri: 识别该taglib的名称。<br /><br />tag标记：<br />1． name: 标记名（prefix:之后）<br />2． tag-class：类名（包含包名）<br />3． body-content: 标记内容模式，如果该标记没有内容则为empty.<br /><br />将logic.tld放置在/WEB-INF下，此时确保编译好的CheckSessionTag类可以被容器访问到。即可完成配置。必须注意的是，不同的jsp容器的配置可能有差别。本文的配置是基于Resin 2.1.11<br /><br /><strong>[应用]</strong><br /><br />建立一个jsp页。在源码的开头加入如下的预编译指令：(page)<br />&lt;%@ taglib prefix="logic" uri="/WEB-INF/logic.tld" %&gt;<br /><br />此指令告诉编译器到哪里去寻找所有以logic:开头的标记的定义。<br /><br />接下来在任意位置加入标记：&lt;logic:checkSession /&gt;即可以工作了。当标记被实例化后，即自动执行doEndTag过程，检查session服务器变量值，之后将页过程跳转。<br /><br /><br /><strong>[深入一些：attribute]</strong><br /><br />有时候我们希望可以对标记进行一些定制。依旧拿checkSession做例：现在我们要限制两类用户访问系统：某<br />些部分仅允许具有管理员权限的用户访问。这样我们设想可以在&lt;logic:checkSession target=admin /&gt;进行进一步定义。这需要在CheckSessionTag类中增加一些额外的逻辑。检查的过程很简单，取决于你的安全系统的分析，但是，我们写了target attribute如何是类可以得到该数据，这是一个关键的问题。<br /><br />为了实现对tag增加可用的attribute, 需要做如下工作：<br />1． 为类增加相应的成员及相应读写器：<br />CheckSessionTag.java(片断): </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: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia" size="2">
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000">public class CheckSessionTag extends TagSupport<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     private String target;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     public </span>
										<span style="COLOR: #0000ff">void</span>
								</font>
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000"> setTarget(String t)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">this</span>
										<span style="COLOR: #000000">.target </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000"> t;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     public String getTarget()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">this</span>
								</font>
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000">.target;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    public </span>
										<span style="COLOR: #0000ff">int</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<font face="Georgia" size="2"> doEndTag()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        <img src="http://www.cnblogs.com/Images/dot.gif" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    }</font>
						</span>
				</div>
		</div>
		<p>
				<br />2． 更改logic.tld:</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: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia" size="2">
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000">
												<img src="http://www.cnblogs.com/Images/dot.gif" />.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">checkSession</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">mbajob.common.tags.logic.CheckSessionTag</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">empty</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">attribute</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />          </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">title</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />          </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">required</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">true</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">required</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">attribute</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
				</div>
		</div>
		<p>为tag标记增加arrtibute节点，语法如下：<br /><br />name: attribute名<br />required: 是否为必须的attribute<br /><br />幸运的是，jsp内置地将attribute解释为java类的成员，我们无需显式地获取该值，即可直接使用。也就是说，我们只要在tag内指定了target=admin, 那么，CheckSessionTag在活着的时候就自动获取该值，可以在逻辑中直接使用。<br /><br />这样，我们就可以给tag增加任意的attribute.<br /><br /><br /><strong>[入门以后]</strong><br /><br />到此为止，我么就可以写一些类似的简单的tag了。根据不同的需求，完成不同的逻辑。当我们开发一个新的tag的时候，我们在logic.tld里增加一个tag子标记。设置好相应的类型。如果需要，我们可以把我们已经写好的tag们完全的移植到第二个项目中使用，仅仅做很少的更改。而更改也仅仅限于对java源代码。<br /><br />在我和我的团队的实际经验中，taglib最多的应用还是在设计一系列特殊的UI. 例如类似于选择省市多级行政区域的选择器。为了放置在HTML中嵌入过多scriplet和脚本，我们的做法通常是将其写在组装好的tag里；为了形成整个应用一致的外观，我们设计了一套用于组装页构图的框架；为了向jsp输出集合数据，我们设计了可以绑定数据的呈现器。经过很长一个时期的工作，我们发现我们的项目中jsp页内仅有很少的html, 而完全是有taglib组成的。最终，我们的taglib按照layout, logic, element, form分类，已经形成了比较大的规模。我们甚至完成了apache的struts框架完成的一部分工作。甚至做得更灵活。所有这些工作中积累的思想甚至影响到我在.NET平台下的技术思路。<br /><br />为了不使篇幅太长，我不准备在本文再做深入的探索。仅仅介绍taglib入门级的一些东西。有时间的话，可能会再次写一些高级一些的taglib的设计方法。<br /><br /><br /><strong>[与ASP.NET Web Custom Control]</strong><br /><br />不能说taglib与ASP.NET Web Custom Control有什么可比性。但是我习惯将二者放到一起看。因为因为在某些实际项目中，我确实从二者之间找到一些共性。甚至有时候创作一些组件的时候实现是完全相同的。<br />1． 二者都定义了当标记输出开始标记和结束标记时的过程。<br />2． 二者都可以跨应用使用。<br />3． 可以使用相同的HTML和脚本。<br /><br />但比较起来，ASP.NET Web Custom Control更高级一些。可以在容器中直接以对象的形式访问。并且可以定义方法，事件。意即可以完全控制一个控件。<br /><br />而taglib同样有优点，例如可以嵌套使用，开发成本低等。最关键的是，taglib具有做为java产品的精细，小巧和活泼。他们分别是有着不同风格的优秀技术。<br /><br />参考文档<br />taglib最佳实践(IBM <em>developerWorks中文站</em>)<br /><a href="http://www-900.ibm.com/developerWorks/cn/java/j-jsp07233/">http://www-900.ibm.com/developerWorks/cn/java/j-jsp07233/</a><br /></p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/68675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-09 10:47 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用OSCache提升J2EE系统运行性能 </title><link>http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Sep 2006 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68664.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68664.html</trackback:ping><description><![CDATA[
		<h4>作者简介</h4>
		<br />
		<p>肖菁，软件工程师，IBM developerWorks/Bea dev2dev/sun 技术开发者撰稿人，主要研究J2EE、web services以及他们在websphere、weblogic平台上的实现，拥有IBM的 Developing With Websphere Studio证书。您可以通过<a href="mailto:guilaida@163.com"><u><font color="#0000ff">guilaida@163.com</font></u></a>和作者取得联系，或者查看作者的<a href="http://guilaida.go.nease.net/"><u><font color="#0000ff">主页</font></u></a>获取更多信息。</p>
		<h4>文章摘要</h4>
		<br />
		<p>Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。通过应用OSCache，我们不但可以实现通常的Cache功能，还能够改善系统的稳定性。</p>
		<h4>1 面临的问题</h4>
		<br />
		<h4>1.1 需要处理的特殊动态内容</h4>
		<br />
		<p>在信息系统建设过程中我们通常会遇到这样的问题：</p>
		<p>
				<b>
						<font color="#000000">1. 基础数据的变更问题</font>
				</b>
		</p>
		<p>信息系统中需要处理的基础数据的内容短时间内是不会发生变化的，但是在一个相对长一些的时间里，它却可能是动态增加或者减少的。</p>
		<p>举个例子：电子商务中关于送货区域的定义，可能短时间内不会发生变化，但是随着电子商务企业业务的扩大，系统中需要处理的送货区域就可能增加。所以我们的系统中不得不在每次向客户展示送货区域信息的时候都和数据库（假设送货区域信息保存在数据库中，这也是通常采用的处理方法）进行交互。</p>
		<p>
				<b>
						<font color="#000000">2. 统计报表（不仅限于统计报表）的问题</font>
				</b>
		</p>
		<p>一般来说，统计报表是一个周期性的工作，可能是半个月、一个月或者更长的时间才会需要更新一次，然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件，这些图形内容、文件的生成通常需要消耗很多的系统资源，给系统运行造成很大的负担。</p>
		<h4>1.2 问题的共同点</h4>
		<br />
		<p>通过比较分析，不难发现这两类问题有一些共同点：</p>
		<p>1、被处理的内容短时间不变，所以短时间内可以作为静态内容进行处理</p>
		<p>2、在一个不太长的时间内，被处理的内容可能或者必定产生变化，所以必须将他们作为动态内容进行处理</p>
		<p>3、在合理的时间区段内可以忽略被处理内容变化后带来的影响</p>
		<p>4、对这些内容的处理动作比较消耗系统性能，影响系统响应时间</p>
		<h4>1.3 解决方法</h4>
		<br />
		<p>缓存技术可以帮助我们很好的解决这个问题：</p>
		<p>1、缓存信息</p>
		<p>当上述的基础数据或者统计报表第一次被访问时，被处理的内容被当作动态信息，基础数库从数据库中获得，统计报表也会被生成符合要求的图形、文件，然后这些信息都会被放入缓存信息中。</p>
		<p>2、响应信息由缓存提供</p>
		<p>当上述的基础数据或者统计报表继续被访问时，系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则，如果符合缓存信息存在而且符合缓存规则，给出的响应将来自于缓存信息，如果没有或者缓存信息已经不符合设定的要求，系统将重复上一步的动作。</p>
		<p>很显然，上面的步骤2中，多数情况下，当用户请求到达时，被处理的内容将来自于缓存，所以大大的减少了与数据库的交互，或者不再需要为每个请求都生成一次报表图形或者文件，这部分工作的减少对于降低系统性能消耗、提高系统稳定性和并发处理能力是非常有益的。</p>
		<h4>2 OSCache简介</h4>
		<br />
		<p>OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件，它的出现解决了我们面临的问题。 OSCache目前最新的稳定版本是2.0，本文中的例子都是基于这个版本的，如果大家运行例子的过程中发生问题，请首先确认是否采用了正确的软件版本。</p>
		<h4>2.1 主要特征</h4>
		<br />
		<p>1. 兼容多种支持JSP的web服务器</p>
		<p>已经通过兼容测试的web服务器包括OrionServer (1.4.0或者以上版本) 、Macromedia JRun (3.0或者以上版本) 、BEA Weblogic (7.x或者以上版本) 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho Resin (1.2.3或者以上版本)、Tomcat (4.0或者以上版本) ，其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的。</p>
		<p>2. 可选的缓存区</p>
		<p>你可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源（需要自己提供适配器）作为缓存区。</p>
		<ul>
				<li>使用内存作为缓存区将可以提供更好的性能 
</li>
				<li>使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容 
</li>
				<li>同时使用内存和硬盘作为缓存区则可以减少对内存的占用 </li>
		</ul>
		<p>3. 灵活的缓存系统</p>
		<p>OSCache支持对部分页面内容或者对页面级的响应内容进行缓存，编程者可以根据不同的需求、不同的环境选择不同的缓存级别。</p>
		<p>4. 容错</p>
		<p>在一般的web应用中，如果某个页面需要和数据库打交道，而当客户请求到达时，web应用和数据库之间无法进行交互，那么将返回给用户"系统出错"或者类似的提示信息，如果使用了OSCache的话，你可以使用缓存提供给用户，给自己赢得维护系统或者采取其他补救的时间。</p>
		<p>其它特性还包括对集群的支持、缓存主动刷新等特性，大家可以参考OpenSymphony网站上的其他资源获取更多的信息。</p>
		<h4>3 OSCache组件的安装</h4>
		<br />
		<p>OSCache是一个基于web应用的组件，他的安装工作主要是对web应用进行配置，大概的步骤如下：</p>
		<p>1. 下载、解压缩OSCache</p>
		<p>请到OSCache的主页http://www.opensymphony.com/oscache/download.html下载Oscache的最新版本，作者下载的是OSCache的最新稳定版本2.0。</p>
		<p>将下载后的。Zip文件解压缩到c:\oscache（后面的章节中将使用%OSCache_Home%来表示这个目录）目录下</p>
		<p>2. 新建立一个web应用</p>
		<p>3. 将主要组件%OSCache_Home%\oscache.jar放入WEB-INF\lib目录</p>
		<p>4. commons-logging.jar、commons-collections.jar的处理</p>
		<ul>
				<li>OSCache组件用Jakarta Commons Logging来处理日志信息，所以需要commons-logging.jar的支持，请将%OSCache_Home%\lib\core\commons-logging.jar放入classpath（通常意味着将这个文件放入WEB-INF\lib目录） 
</li>
				<li>如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar放入classpath，如果使用JDK1.4或者以上版本，则不需要了 </li>
		</ul>
		<p>5. 将oscache.properties、oscache.tld放入WEB-INF\class目录</p>
		<ul>
				<li>%OSCache_Home%\oscache.properties包含了对OSCache运行特征值的设置信息 
</li>
				<li>%OSCache_Home%\oscache.tld包含了OSCache提供的标签库的定义内容 </li>
		</ul>
		<p>6. 修改web.xml文件</p>
		<p>在web.xml文件中增加下面的内容，增加对OSCache提供的taglib的支持：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;taglib&gt;
&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;
&lt;taglib-location&gt;/WEB-INF/classes/ oscache.tld&lt;/taglib-location&gt;
&lt;/taglib&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<h4>4 开始使用OSCache中的缓存组件</h4>
		<br />
		<p>OSCache中按照缓存范围的不同分为两种不同的方式：一种是缓存JSP页面中部分或者全部内容，一种是基于整个页面文件的缓存。</p>
		<h4>4.1 JSP部分内容缓存</h4>
		<br />
		<h4>4.1.1 Cache-OSCache提供的缓存标签</h4>
		<br />
		<p>这是OSCache提供的标签库中最重要的一个标签，包括在标签中的内容将应用缓存机制进行处理，处理的方式将取决于编程者对cache标签属性的设置。</p>
		<p>第一次请求到达时，标签中的内容被处理并且缓存起来，当下一个请求到达时，缓存系统会检查这部分内容的缓存是否已经失效，主要是以下几项：</p>
		<ul>
				<li>1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 
</li>
				<li>2. cron属性规定的时间比缓存信息的开始时间更晚 
</li>
				<li>3. 标签中缓存的内容在缓存后又被重新刷新过 
</li>
				<li>4. 其他缓存超期设定 </li>
		</ul>
		<p>如果符合上面四项中的任何一项，被缓存的内容视为已经失效，这时被缓存的内容将被重新处理并且返回处理过后的信息，如果被缓存的内容没有失效，那么返回给用户的将是缓存中的信息。</p>
		<p>cache标签的属性说明:</p>
		<p>
				<font color="#000000">
						<b>key</b> - 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。</font>
		</p>
		<p>你可以在同一个页面中使用很多cache标签而不指定他的key属性，这种情况下系统使用该页面的URI和后面的请求字符串，另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。</p>
		<p>
				<font color="#000000">
						<b>scope</b> - 缓存发生作用的范围，可以是application或者session</font>
		</p>
		<p>
				<font color="#000000">
						<b>time</b> - 缓存内容的时间段，单位是秒，默认是3600秒，也就是一个小时，如果设定一个负值，那么这部分被缓存的内容将永远不过期。 </font>
		</p>
		<p>
				<font color="#000000">
						<b>duration</b> - 指定缓存内容失效的时间，是相对time的另一个选择，可以使用简单日期格式或者符合USO-8601的日期格式。如：duration='PT5M' duration='5s'等</font>
		</p>
		<p>
				<font color="#000000">
						<b>refresh</b> - false 或者true。</font>
		</p>
		<p>如果refresh属性设置为true，不管其他的属性是否符合条件，这部分被缓存的内容都将被更新，这给编程者一种选择，决定什么时候必须刷新。 </p>
		<p>
				<font color="#000000">
						<b>mode</b> - 如果编程者不希望被缓存的内容增加到给用户的响应中，可以设置mode属性为"silent"</font>
		</p>
		<p>其它可用的属性还包括：cron 、groups、language、refreshpolicyclass、refreshpolicyparam。</p>
		<p>上面的这些属性可以单独使用，也可以根据需要组合使用，下面的例子将讲解这些常用属性的使用方式。</p>
		<h4>4.1.2 Cache标签实例分析:</h4>
		<br />
		<p>1. 最简单的cache标签用法</p>
		<p>使用默认的关键字来标识cache内容，超时时间是默认的3600秒</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache&gt;
&lt;%
//自己的JSP代码内容
%&gt;
&lt;/cache:cache&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2. 用自己指定的字符串标识缓存内容，并且设定作用范围为session。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache key="foobar" scope="session"&gt;
&lt;%
//自己的JSP代码内容
%&gt;
&lt;/cache:cache&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>3.动态设定key值，使用自己指定的time属性设定缓存内容的超时时间，使用动态refresh值决定是否强制内容刷新。</p>
		<p>因为OSCache使用key值来标识缓存内容，使用相同的key值将会被认为使用相同的的缓存内容，所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache key="&lt;%= product.getId() %&gt;" time="1800" refresh="&lt;%= needRefresh %&gt;"&gt;
&lt;%
//自己的JSP代码内容
%&gt;
&lt;/cache:cache&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>4. 设置time属性为负数使缓存内容永不过期</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache time="-1"&gt;
&lt;%
//自己的JSP代码内容
%&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>5. 使用duration属性设置超期时间</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache  duration='PT5M'&gt;
&lt;%
//自己的JSP代码内容
%&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>6. 使用mode属性使被缓存的内容不加入给客户的响应中</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache  mode='silent'&gt;
&lt;%
//自己的JSP代码内容
%&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<h4>4.2 用CashFilter实现页面级缓存</h4>
		<br />
		<p>在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存，主要用于对web应用中的某些动态页面进行缓存，尤其是那些需要生成pdf格式文件/报表、图片文件等的页面，不仅减少了数据库的交互、减少数据库服务器的压力，而且对于减少web服务器的性能消耗有很显著的效果。</p>
		<p>这种功能的实现是通过在web.xml中进行配置来决定缓存哪一个或者一组页面，而且还可以设置缓存的相关属性，这种基于配置文件的实现方式对于J2EE来说应该是一种标准的实现方式了。</p>
		<p>[注] 只有客户访问时返回http头信息中代码为200（也就是访问已经成功）的页面信息才能够被缓存</p>
		<p>1. 缓存单个文件</p>
		<p>修改web.xml，增加如下内容，确定对/testContent.jsp页面进行缓存。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;filter&gt;
      &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;!-对/testContent.jsp页面内容进行缓存--&gt;
      &lt;url-pattern&gt;/testContent.jsp&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2. 缓存URL pattern</p>
		<p>修改web.xml，增加如下内容，确定对*.jsp页面进行缓存。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;filter&gt;
      &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;!-对所有jsp页面内容进行缓存--&gt;
      &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>3. 自己设定缓存属性</p>
		<p>在页面级缓存的情况下，可以通过设置CacheFilter的初始属性来决定缓存的一些特性：time属性设置缓存的时间段，默认为3600秒，可以根据自己的需要只有的设置，而scope属性设置，默认为application，可选项包括application、session</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;filter&gt;
      &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
	&lt;init-param&gt;
         &lt;param-name&gt;time&lt;/param-name&gt;
         &lt;param-value&gt;600&lt;/param-value&gt;
      &lt;/init-param&gt;
      &lt;init-param&gt;
         &lt;param-name&gt;scope&lt;/param-name&gt;
         &lt;param-value&gt;session&lt;/param-value&gt;
      &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;!-对所有jsp页面内容进行缓存--&gt;
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<h4>5 性能测试结果</h4>
		<br />
		<h4>5.1 测试环境</h4>
		<br />
		<p>系统平台：windows 2000 高级服务器/ P3 800 /512M内存</p>
		<p>web服务器：websphere 5.0</p>
		<p>数据库服务器：mysql 4.0.18-nt</p>
		<p>性能测试用工具：apache Jmeter</p>
		<h4>5.2 测试计划</h4>
		<br />
		<p>这次性能测试对比方为使用缓存和不使用缓存两种，他们的访问代码都是一样的：通过数据源从本地mysql数据库中获取person表的所有记录，然后显示在页面上。</p>
		<p>测试中将模仿10个用户，每个用户发起5次请求，然后统计所有访问花费的时间。</p>
		<h4>5.3 测试结果</h4>
		<br />
		<p>使用缓存后的测试结果 不使用缓存时的测试结果 
</p>
		<p>所有请求花费的总时间(毫秒) 20569 22870 
</p>
		<p>性能测试的详细结果请大家查看下载内容中的《不使用cache时的系统性能测试结果.txt》和《使用cache后系统性能测试结果.txt》</p>
		<h4>6 总结</h4>
		<br />
		<p>在J2EE系统中，我们经常需要处理一些特殊的动态内容，这些内容在一个时间段内的变更非常有限，但是又不得不将他们确定为动态内容进行输出，而且非常消耗数据库系统资源或者web服务器的资源，这时我们就可以采用Cache----一种用于提高系统响应速度、改善系统运行性能的技术----来优化我们的系统。尤其是在Web应用中，这种处理可以很显著的改善系统运行性能。</p>
		<p>本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。它提供了在J2EE系统中实现缓存需要的丰富的功能。通过应用OSCache，我们不但可以实现通常的Cache功能、自由的设定cache的相关特性比如缓存时间段/缓存内容等，提升系统性能，而且还能有效的改善系统的稳定性。除此之外，OSCache组件还提供了更多的特性比如集群、容错、灵活的缓存区选择等。</p>
		<p>作者根据自己的使用经验给大家提供了一些简单的例子，他们部分演示了如何使用OSCache组件提供的丰富特性，OSCache提供的特性远不止这些，需要大家在今后的时间里深入的研究，同时也希望大家通过E-mail和作者贡献研究成果。</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/68664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-09 10:06 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache使用经验总结</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 08 Sep 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68569.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68569.html</trackback:ping><description><![CDATA[
		<p>OSCache使用经验总结<br />                              OSCache使用经验总结<br />OSCache的使用主要有4种：<br />POJO 缓存<br />HTTP Response 缓存<br />JSP Tag Library 缓存<br />O/R Data Access 缓存</p>
		<p>1、POJO 缓存<br />这种方式的缓存直接调用OSCache的API进行，主要用于处理页面内容会根据参数动态改变，可以将参数设置为key值来保存数据：<br />首先，声明成员变量：<br /> // OSCache Adminitrator instance<br /> private static GeneralCacheAdministrator cacheAdmin = null;<br />其次，进行初始化：<br /> public RingArtistAction() {<br />  cacheAdmin = new GeneralCacheAdministrator();<br /> }<br />将POJO进行缓存：<br />  // Cache data key and refresh period<br />  String key = sex + ":" + place;<br />  int refreshPeriod = Constants.getIntegerValue(Constants.OSCACHE_REFRESH_PERIOD).intValue();<br />  try {<br />      // Get from the cache<br />   artists = (Map) cacheAdmin.getFromCache(key, refreshPeriod);<br />  } catch (NeedsRefreshException nre) {<br />      try {<br />          // Get the value (probably from the database)<br />    int count = getArtistCount(sex, place, errors);<br />    artists = getArtistData(sex, place, count, errors);<br />          // Store in the cache<br />    cacheAdmin.putInCache(key, artists);<br />      } catch (Exception ex) {<br />          // We have the current content if we want fail-over.<br />    artists = (Map) nre.getCacheContent();<br />          // It is essential that cancelUpdate is called if the<br />          // cached content is not rebuilt<br />    cacheAdmin.cancelUpdate(key);<br />    ex.printStackTrace();<br />      }<br />  }<br />  <br />2、HTTP Response 缓存<br />这种方式的缓存用来处理整个页面的内容固定，不会根据参数动态改变：<br />首先在web.xml中配置CacheFilter：<br /> &lt;filter&gt;<br />  &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />  &lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />  &lt;init-param&gt;<br />   &lt;param-name&gt;time&lt;/param-name&gt;<br />   &lt;param-value&gt;86400&lt;/param-value&gt;<br />  &lt;/init-param&gt;<br />  &lt;init-param&gt;<br />   &lt;param-name&gt;scope&lt;/param-name&gt;<br />   &lt;param-value&gt;application&lt;/param-value&gt;<br />  &lt;/init-param&gt;<br /> &lt;/filter&gt;<br />将所有需要缓存的页面加入filter-mapping：<br /> &lt;filter-mapping&gt;<br />  &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br /> &lt;/filter-mapping&gt;<br />注意，只有返回状态为200（HttpServletResponse.SC_OK）的内容才会被缓存</p>
		<p>3、JSP Tag 缓存<br />JSP Tag缓存主要用于缓存JSP页面的局部内容：<br />  &lt;cache:cache key="especialcategory" cron="* 5 * * *"&gt;<br />  &lt;jsp:include page="/ringcategory.do" flush="true" &gt;<br />    &lt;jsp:param name="ringType" value="1"/&gt;<br />  &lt;/jsp:include&gt;<br />  &lt;/cache:cache&gt;</p>
		<p>4、O/R Data Access 缓存<br />请阅读参考资料的内容获取详情。</p>
		<p>参考资料：<br />Taking the load off: OSCache helps databases cope：<a href="http://www.theserverside.com/articles/article.tss?l=OSCacheHelpsDatabases">http://www.theserverside.com/articles/article.tss?l=OSCacheHelpsDatabases</a></p>
		<p> </p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/68569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-08 17:57 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oscache 使用1</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 08 Sep 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68568.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68568.html</trackback:ping><description><![CDATA[https://oscache.dev.java.net/files/documents/629/13962/oscache-2.1.1-full.zip<br />OSCache各版本下载页面：http://www.opensymphony.com/oscache/download.action<br /><p><strong>○用二分钟配置：</strong><br /><br />将下载的<u>oscache-2.1.1-full.zip</u>解压，你会看到oscache-2.1.1.jar 及一些目录 docs、etc、lib、src。<br />现在将 etc目录下oscache.properties 、oscache.tld 及 oscache-2.1.1.jar 文件复制到你的应用服务器目录下<br /><br />使用tomcat，jdk1.4 配置例：<br />         D:\Tomcat 5.0\webapps\ROOT\WEB-INF\lib\oscache-2.1.1.jar <br />         D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\oscache.properties<br />         D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\oscache.tld<br /><br />oscache.properties 文件配置参数说明：<br />cache.memory<br />值为true 或 false ，默认为在内存中作缓存，<br />如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）<br />cache.capacity<br />缓存元素个数<br />cache.persistence.class<br />持久化缓存类，如此类打开，则必须设置cache.path信息<br />cache.cluster 相关<br />为集群设置信息。如<br />cache.cluster.multicast.ip为广播IP地址<br />cache.cluster.properties为集群属性<br /><br />再将 D:\Tomcat 5.0\webapps\ROOT\WEB-INF\web.xml 文件中添加如下代码<br />&lt;taglib&gt;<br />&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br />&lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt; </p><p>就是这么简单，OSCache就配置好了。</p><p><strong>○再用二分钟测试一下</strong>：</p><p>编写jsp文件<br />======================cache1.jsp 内容如下=================<br />&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />&lt;%@ page import="java.util.*" %&gt;<br />&lt;%@ taglib uri="oscache" prefix="cache" %&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />没有缓存的日期: &lt;%= new Date() %&gt;&lt;p&gt;<br />&lt;!--自动刷新--&gt;<br />&lt;cache:cache time="30"&gt;<br />每30秒刷新缓存一次的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br />&lt;/cache:cache&gt;<br /><br />&lt;!--手动刷新--&gt;<br />&lt;cache:cache key="testcache"&gt;<br />手动刷新缓存的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br />&lt;/cache:cache&gt;<br />&lt;a href="http://dev.csdn.net/article/"cache2.jsp"&gt;手动刷新&lt;/a&gt;<br" />&lt;/body&gt;<br />&lt;/html&gt;<br />=========================================================<br /><br />====================cache2.jsp 执行手动刷新页面如下===========<br />&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />&lt;%@ taglib uri="oscache" prefix="cache" %&gt;<br />&lt;html&gt;<br />&lt;body&gt;缓存已刷新...&lt;p&gt;<br /><br />&lt;cache:flush key="testcache" scope="application"/&gt;<br /><br />&lt;a href="http://dev.csdn.net/article/"cache1.jsp"&gt;返回&lt;/a&gt;<br" />&lt;/body&gt;<br />&lt;/html&gt;<br />==========================================================        </p><p><strong>其他： 缓存过滤器 CacheFilter</strong><br />可以让你所有.jsp页面自动缓存。<br /><br />你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br />&lt;filter&gt;<br />&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;time&lt;/param-name&gt;<br />&lt;param-value&gt;60&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;scope&lt;/param-name&gt;<br />&lt;param-value&gt;session&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session<br /><br />注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br />而不对其他请求（如500,404,400）作缓存处理 </p><p>此文完。。谢谢观看。</p><img src ="http://www.blogjava.net/jackstudio/aggbug/68568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-08 17:57 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smarty的程序设计部分</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Tue, 05 Sep 2006 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/67864.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/67864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/67864.html</trackback:ping><description><![CDATA[
		<font color="#0000bb">smarty的程序设计部分：</font>
		<p>
				<font color="#0000bb">在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍，这一节主要来介绍一下如何在smarty中开始我们程</font>
		</p>
		<p>
				<font color="#0000bb">序设计。</font>
		</p>
		<font color="#0000bb">
				<p>
						<br />PHP代码: <br />    首先来介绍一下在上一节中我们使用的过的.php文件中的一些元素。同样，我们拿上一节中最开始的那个index.php文件来说明一下： <br />     <br />   ================================================ <br />     index.php <br />   ================================================ <br />   &lt;?php <br />     /********************************************* <br />      * <br />      * 文件名： index.php <br />      * 作  用： 显示实例程序 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#0066a7">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      include_once("./comm/Smarty.class.php"); //包含smarty类文件 </p>
				<p>      $smarty = new Smarty();  //建立smarty实例对象$smarty <br />      $smarty-&gt;templates("./templates"); //设置模板目录 <br />      $smarty-&gt;templates_c("./templates_c"); //设置编译目录 </p>
				<p>
						<br />      //****大家注意，这里我是我新加入的****// <br />      $smarty-&gt;cache("./cache"); //设置缓存目录 <br />      $smarty-&gt;cache_lifetime = 60 * 60 * 24;  //设置缓存时间 <br />      $smarty-&gt;caching = true;      //设置缓存方式 <br />       <br />      //---------------------------------------------------- <br />      //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />      //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />      //---------------------------------------------------- <br />      $smarty-&gt;left_delimiter = "&lt;{"; <br />      $smarty-&gt;right_delimiter = "}&gt;"; </p>
				<p>      $smarty-&gt;assign("name", "李晓军"); //进行模板变量替换 <br />       <br />      //编译并显示位于./templates下的index.tpl模板 <br />      $smarty-&gt;display("index.tpl"); <br />   ?&gt; <br />        <br />       我们可以看到，smarty的程序部分实际就是符合php语言规范的一组代码，我们依次来解释一下： <br />         1。/**/语句： <br />            包含的部分为程序篇头注释。主要的内容应该为对程序的作用，版权与作者及编写时间做一个简单的介绍，这在smarty中不是必 </p>
				<p>需的，但从程序的风格来讲，这是一个好的风格。 <br />     <br />     2。include_once语句： <br />        它将安装到网站的smarty文件包含到当前文件中，注意包含的路径一定要写正确。 </p>
				<p>     3。$smarty = new Smarty(): <br />        这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。 </p>
				<p>     4。$smarty-&gt;templates(""): <br />            这一句指明$smarty对象使用tpl模板时的路径，它是一个目录，在没有这一句时，Smarty默认的模板路径为当前目录的templates </p>
				<p>目录，实际在写程序时，我们要将这一句写明，这也是一种好的程序风格。 <br />     5。$smarty-&gt;templates_c(""): <br />        这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言，而这个目录，就是它编译 </p>
				<p>模板的目录，这里要注意，如果站点位于*nix服务器上，请确保teamplates_c里定义的这个目录具有可写可读权限，默认情况下它的编译目录 </p>
				<p>是当前目录下的templates_c，出于同样的理由我们将其明确的写出来。 <br />    <br />         6。$smarty-&gt;left_delimiter与$smarty-&gt;right_delimiter: <br />        指明在查找模板变量时的左右分割符。默认情况下为"{"与"}"，但在实际中因为我们要在模板中使用&lt;script&gt;,Script中的函数定 </p>
				<p>义难免会使用{}，虽然它有自己的解决办法，但习惯上我们将它重新定义为"&lt;{"与"}&gt;"或是"&lt;!--{"与"}--&gt;"或其它标志符，注意，如果在这里 </p>
				<p>定义了左右分割符后，在模板文件中相应的要使每一个变量使用与定义相同的符号，例如在这里指定为"&lt;{"与"}&gt;"，tpl模板中也要相应的将 </p>
				<p>{$name}变成&lt;{$name}&gt;,这样程序才可以正确的找到模板变量。 <br />     </p>
				<p>     7。$smarty-&gt;cache("./cache"): <br />        告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存，这里就是设置缓存的目录。默认情 </p>
				<p>况下为当前目录下的cache目录，与templates_c目录相当，在*nix系统中我们要确保它的可读可写性。 <br />     <br />     8. $smarty-&gt;cache_lifetime = 60 * 60 * 24: <br />         <br />        这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的 </p>
				<p>取值为-1时表示建立起的缓存从不过期，为0时表示在程序每次执行时缓存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。 </p>
				<p>     9. $smarty-&gt;caching = 1: <br />        这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值，0：Smarty默认值，表示不对模板进行缓存；1：表示 </p>
				<p>Smarty将使用当前定义的cache_lifetime来决定是否结束cache；2：表示Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使 </p>
				<p>用true与false来表示是否进行缓存。 </p>
				<p>     10. $smarty-&gt;assign("name", "李晓军")： <br />        该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量，var指出要将模板变量替换的变量名；其 </p>
				<p>第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法，assign是Smarty的核心函数之一，所有对模板变 </p>
				<p>量的替换都要使用它。 </p>
				<p>     11. $smarty-&gt;display("index.tpl"): <br />         该函数原形为display(string varname),作用为显示一个模板。简单的讲，它将分析处理过的模板显示出来，这里的模板文件不 </p>
				<p>用加路径，只要使用一个文件名就可以了，它路径我们已经在$smarty-&gt;templates(string path)中定义过了。 </p>
				<p>       程序执行完后我们可以打开当前目录下的templates_c与cache目录，就会发现在下边多出一些%%的目录，这些目录就是Smarty的编译与 </p>
				<p>缓存目录，它由程序自动生成，不要直接对这些生成的文件进行修改。 <br />       以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下，在后边的例子中你可以看到将它们将被多次的使用。 <br />     <br />     <br />    接下来介绍一个section循环块与foreach循环块，本来它应该属于模板部分，但是由于它们是smarty的精华所在，而且与smarty程序设计 </p>
				<p>部分联系非常紧密，所以就在本节单独拿出来讲一下。 </p>
				<p>   1. foreach：用于循环简单数组，它是一个选择性的section循环，它的定义格式为: <br />     <br />    {foreach from=$array item=array_id} <br />    {foreachelse} <br />    {/foreach} <br />    其中，from 指出要循环的数组变量，item为要循环的变量名称，循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当 </p>
				<p>程序中传递过来的数组为空时的处理，下面是一个简单的例子： <br />  =========================================== <br />    example6.tpl <br />  =========================================== <br />  &lt;html&gt; <br />    &lt;head&gt;&lt;title&gt;这是一个foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />    &lt;body&gt; <br />       这里将输出一个数组：&lt;br&gt; <br />       {foreach from=$newsArray item=newsID} <br />         新闻编号：{$newsID}&lt;br&gt; <br />     新闻内容：{$newsTitle}&lt;br&gt;&lt;hr&gt; <br />       {foreachelse} <br />         对不起，数据库中没有新闻输出！ <br />       {/foreach} <br />    &lt;/body&gt; <br />  &lt;/html&gt; </p>
				<p>  ========================================== <br />  example6.php <br />  ========================================== <br />六。smarty的程序设计部分：</p>
				<p>在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍，这一节主要来介绍一下如何在smarty中开始我们程</p>
				<p>序设计。</p>
				<p>
						<br />PHP代码: <br />    首先来介绍一下在上一节中我们使用的过的.php文件中的一些元素。同样，我们拿上一节中最开始的那个index.php文件来说明一下： <br />     <br />   ================================================ <br />     index.php <br />   ================================================ <br />   &lt;?php <br />     /********************************************* <br />      * <br />      * 文件名： index.php <br />      * 作  用： 显示实例程序 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#0066a7">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      include_once("./comm/Smarty.class.php"); //包含smarty类文件 </p>
				<p>      $smarty = new Smarty();  //建立smarty实例对象$smarty <br />      $smarty-&gt;templates("./templates"); //设置模板目录 <br />      $smarty-&gt;templates_c("./templates_c"); //设置编译目录 </p>
				<p>
						<br />      //****大家注意，这里我是我新加入的****// <br />      $smarty-&gt;cache("./cache"); //设置缓存目录 <br />      $smarty-&gt;cache_lifetime = 60 * 60 * 24;  //设置缓存时间 <br />      $smarty-&gt;caching = true;      //设置缓存方式 <br />       <br />      //---------------------------------------------------- <br />      //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />      //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />      //---------------------------------------------------- <br />      $smarty-&gt;left_delimiter = "&lt;{"; <br />      $smarty-&gt;right_delimiter = "}&gt;"; </p>
				<p>      $smarty-&gt;assign("name", "李晓军"); //进行模板变量替换 <br />       <br />      //编译并显示位于./templates下的index.tpl模板 <br />      $smarty-&gt;display("index.tpl"); <br />   ?&gt; <br />        <br />       我们可以看到，smarty的程序部分实际就是符合php语言规范的一组代码，我们依次来解释一下： <br />         1。/**/语句： <br />            包含的部分为程序篇头注释。主要的内容应该为对程序的作用，版权与作者及编写时间做一个简单的介绍，这在smarty中不是必 </p>
				<p>需的，但从程序的风格来讲，这是一个好的风格。 <br />     <br />     2。include_once语句： <br />        它将安装到网站的smarty文件包含到当前文件中，注意包含的路径一定要写正确。 </p>
				<p>     3。$smarty = new Smarty(): <br />        这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。 </p>
				<p>     4。$smarty-&gt;templates(""): <br />            这一句指明$smarty对象使用tpl模板时的路径，它是一个目录，在没有这一句时，Smarty默认的模板路径为当前目录的templates </p>
				<p>目录，实际在写程序时，我们要将这一句写明，这也是一种好的程序风格。 <br />     5。$smarty-&gt;templates_c(""): <br />        这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言，而这个目录，就是它编译 </p>
				<p>模板的目录，这里要注意，如果站点位于*nix服务器上，请确保teamplates_c里定义的这个目录具有可写可读权限，默认情况下它的编译目录 </p>
				<p>是当前目录下的templates_c，出于同样的理由我们将其明确的写出来。 <br />    <br />         6。$smarty-&gt;left_delimiter与$smarty-&gt;right_delimiter: <br />        指明在查找模板变量时的左右分割符。默认情况下为"{"与"}"，但在实际中因为我们要在模板中使用&lt;script&gt;,Script中的函数定 </p>
				<p>义难免会使用{}，虽然它有自己的解决办法，但习惯上我们将它重新定义为"&lt;{"与"}&gt;"或是"&lt;!--{"与"}--&gt;"或其它标志符，注意，如果在这里 </p>
				<p>定义了左右分割符后，在模板文件中相应的要使每一个变量使用与定义相同的符号，例如在这里指定为"&lt;{"与"}&gt;"，tpl模板中也要相应的将 </p>
				<p>{$name}变成&lt;{$name}&gt;,这样程序才可以正确的找到模板变量。 <br />     </p>
				<p>     7。$smarty-&gt;cache("./cache"): <br />        告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存，这里就是设置缓存的目录。默认情 </p>
				<p>况下为当前目录下的cache目录，与templates_c目录相当，在*nix系统中我们要确保它的可读可写性。 <br />     <br />     8. $smarty-&gt;cache_lifetime = 60 * 60 * 24: <br />         <br />        这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的 </p>
				<p>取值为-1时表示建立起的缓存从不过期，为0时表示在程序每次执行时缓存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。 </p>
				<p>     9. $smarty-&gt;caching = 1: <br />        这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值，0：Smarty默认值，表示不对模板进行缓存；1：表示 </p>
				<p>Smarty将使用当前定义的cache_lifetime来决定是否结束cache；2：表示Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使 </p>
				<p>用true与false来表示是否进行缓存。 </p>
				<p>     10. $smarty-&gt;assign("name", "李晓军")： <br />        该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量，var指出要将模板变量替换的变量名；其 </p>
				<p>第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法，assign是Smarty的核心函数之一，所有对模板变 </p>
				<p>量的替换都要使用它。 </p>
				<p>     11. $smarty-&gt;display("index.tpl"): <br />         该函数原形为display(string varname),作用为显示一个模板。简单的讲，它将分析处理过的模板显示出来，这里的模板文件不 </p>
				<p>用加路径，只要使用一个文件名就可以了，它路径我们已经在$smarty-&gt;templates(string path)中定义过了。 </p>
				<p>       程序执行完后我们可以打开当前目录下的templates_c与cache目录，就会发现在下边多出一些%%的目录，这些目录就是Smarty的编译与 </p>
				<p>缓存目录，它由程序自动生成，不要直接对这些生成的文件进行修改。 <br />       以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下，在后边的例子中你可以看到将它们将被多次的使用。 <br />     <br />     <br />    接下来介绍一个section循环块与foreach循环块，本来它应该属于模板部分，但是由于它们是smarty的精华所在，而且与smarty程序设计 </p>
				<p>部分联系非常紧密，所以就在本节单独拿出来讲一下。 </p>
				<p>   1. foreach：用于循环简单数组，它是一个选择性的section循环，它的定义格式为: <br />     <br />    {foreach from=$array item=array_id} <br />    {foreachelse} <br />    {/foreach} <br />    其中，from 指出要循环的数组变量，item为要循环的变量名称，循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当 </p>
				<p>程序中传递过来的数组为空时的处理，下面是一个简单的例子： <br />  =========================================== <br />    example6.tpl <br />  =========================================== <br />  &lt;html&gt; <br />    &lt;head&gt;&lt;title&gt;这是一个foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />    &lt;body&gt; <br />       这里将输出一个数组：&lt;br&gt; <br />       {foreach from=$newsArray item=newsID} <br />         新闻编号：{$newsID}&lt;br&gt; <br />     新闻内容：{$newsTitle}&lt;br&gt;&lt;hr&gt; <br />       {foreachelse} <br />         对不起，数据库中没有新闻输出！ <br />       {/foreach} <br />    &lt;/body&gt; <br />  &lt;/html&gt; </p>
				<p>  ========================================== <br />  example6.php <br />  ========================================== </p>
				<p>  &lt;?php <br /><br />     </p>
		</font>
		<font color="#ff8000">/********************************************* <br />      * <br />      * 文件名： example6.php <br />      * 作  用： 显示实例程序2 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#000080">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      </font>
		<font color="#007700">include_once(</font>
		<font color="#dd0000">"./comm/Smarty.class.php"</font>
		<font color="#007700">); <br /><br />      </font>
		<font color="#0000bb">$smarty </font>
		<font color="#007700">= new </font>
		<font color="#0000bb">Smarty</font>
		<font color="#007700">();   <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">templates</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"./templates"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">templates_c</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"./templates_c"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">cache</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"./cache"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">cache_lifetime  </font>
		<font color="#007700">= </font>
		<font color="#0000bb">0</font>
		<font color="#007700">; <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">caching         </font>
		<font color="#007700">= </font>
		<font color="#0000bb">true</font>
		<font color="#007700">; <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">left_delimiter  </font>
		<font color="#007700">= </font>
		<font color="#dd0000">"{"</font>
		<font color="#007700">; <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">right_delimiter </font>
		<font color="#007700">= </font>
		<font color="#dd0000">"}"</font>
		<font color="#007700">; <br />       <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">1</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第1条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">2</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第2条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">3</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第3条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">4</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第4条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">5</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第5条新闻"</font>
		<font color="#007700">); <br />      </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">[] = array(</font>
		<font color="#dd0000">"newsID"</font>
		<font color="#007700">=&gt;</font>
		<font color="#0000bb">6</font>
		<font color="#007700">, </font>
		<font color="#dd0000">"newsTitle"</font>
		<font color="#007700">=&gt;</font>
		<font color="#dd0000">"第6条新闻"</font>
		<font color="#007700">); <br /><br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">assign</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"newsArray"</font>
		<font color="#007700">, </font>
		<font color="#0000bb">$array</font>
		<font color="#007700">); <br /><br />      </font>
		<font color="#ff8000">//编译并显示位于./templates下的index.tpl模板 <br />      </font>
		<font color="#0000bb">$smarty</font>
		<font color="#007700">-&gt;</font>
		<font color="#0000bb">display</font>
		<font color="#007700">(</font>
		<font color="#dd0000">"example6.tpl"</font>
		<font color="#007700">); <br />   </font>
		<font color="#0000bb">?&gt; <br />   ================================================= <br />   example6.php 输出文件 <br />   ================================================= <br />   &lt;html&gt; <br />     &lt;head&gt;&lt;title&gt;foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />     &lt;body&gt; <br />        这里将输出一个数组：&lt;br&gt; </font>
		<blockquote>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：1&lt;br&gt; <br />    新闻内容：第1条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：2&lt;br&gt; <br />    新闻内容：第2条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：3&lt;br&gt; <br />    新闻内容：第3条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：4&lt;br&gt; <br />    新闻内容：第4条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：5&lt;br&gt; <br />    新闻内容：第5条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：6&lt;br&gt; <br />    新闻内容：第6条新闻&lt;br&gt;&lt;hr&gt; <br />     &lt;/body&gt; <br />   &lt;/html&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   foreach还可以用foreachelse来匹配，用foreachelse来表示当传递给foreach的数组为空值时程序要执行的操作，具体的使用方法，请参考 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">手册的说明。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   2. section: <br />     section的产生是为解决foreach的不足的，与foreach一样，它用于设计模板内的循环块，它较为复杂，可极大程序上满足程序需要，所 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">以在程序中我习惯使用它而不使用foreach,基本原形为： </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">     {section name = name loop = $varName[, start = $start, step = $step, max = $max, show = true]} </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">     name: section的名称，不用加$ <br />     $loop: 要循环的变量，在程序中要使用assign对这个变量进行操作。 <br />     $start: 开始循环的下标，循环下标默认由0开始 <br />     $step:  每次循环时下标的增数 <br />     $max:   最大循环下标 <br />     $show:  boolean类型，决定是否对这个块进行显示，默认为true </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">     这里有个名词需要说明： <br />         循环下标：实际它的英文名称为index，是索引的意思，这里我将它译成"下标"，主要是为了好理解。它表示在显示这个循环块时当 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">前的循环索引，默认从0开始，受$start的影响，如果将$start设为5，它也将从5开始计数，在模板设计部分我们使用过它，这是当前 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">{section}的一个属性，调用方式为Smarty.section.sectionName.index,这里的sectionName指的是函数原型中的name属性。 <br />    {section}块具有的属性值，分别为： <br />      1. index:      上边我们介绍的"循环下标"，默认为0 <br />      2. index_prev: 当前下标的前一个值，默认为-1 <br />      3. index_next: 当前下标的下一个值，默认为1 <br />      4. first:      是否为第一下循环 <br />      5. last:       是否为最后一个循环 <br />      6. iteration:  循环次数 <br />      7. rownum:     当前的行号，iteration的另一个别名 <br />      8. loop:       最后一个循环号，可用在section块后统计section的循环次数 <br />      9. total: 循环次数，可用在section块后统计循环次数 <br />      10. show: 在函数的声明中有它，用于判断section是否显示 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      它们的具体属性大家可以参考手册，在程序中可灵活使用它的这些属性，模板部分我就使用过index属性，大家可以回过头去看看。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      同样，{section}也可以配合使用{sectionelse}，用来表示传入的数组变量为空时对模板进行的处理。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      我们把上边的那个例子使用{section}来替代{foreach}来实现现样的功能，注意，在这个例子中我只将tpl模板中的{foreach}用 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">{section}来实现，php程序文件中没有任何改动，同时加了{sectionelse}处理块： </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">  =========================================== <br />    example7.tpl <br />  =========================================== <br />  &lt;html&gt; <br />    &lt;head&gt;&lt;title&gt;这是一个foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />    &lt;body&gt; <br />       这里将输出一个数组：&lt;br&gt; <br />       {section name=loop, loop=$News} <br />         新闻编号：{$News[loop].newsID}&lt;br&gt; <br />         新闻标题：{$News[loop].newsTitle}&lt;br&gt;&lt;hr&gt; <br />       {sectionelse} <br />         对不起，没有任何新闻输入！ <br />       {/section} <br />    &lt;/body&gt; <br />  &lt;/html&gt; <br />   <br />  ========================================== <br />  example6.php <br />  ========================================== <br />  &lt;?php <br />     /********************************************* <br />      * <br />      * 文件名： example7.php <br />      * 作  用： 显示实例程序2 <br />      * <br />      * 作  者： 大师兄 <br />      * Email：  <a href="mailto:teacherli@163.com"><font color="#0066a7">teacherli@163.com</font></a><br />      * <br />      *********************************************/ <br />      include_once("./comm/Smarty.class.php"); </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      $smarty = new Smarty();   <br />      $smarty-&gt;templates("./templates"); <br />      $smarty-&gt;templates_c("./templates_c"); <br />      $smarty-&gt;cache("./cache"); <br />      $smarty-&gt;cache_lifetime  = 0; <br />      $smarty-&gt;caching         = true; <br />      $smarty-&gt;left_delimiter  = "{"; <br />      $smarty-&gt;right_delimiter = "}"; <br />       <br />      $array[] = array("newsID"=&gt;1, "newsTitle"=&gt;"第1条新闻"); <br />      $array[] = array("newsID"=&gt;2, "newsTitle"=&gt;"第2条新闻"); <br />      $array[] = array("newsID"=&gt;3, "newsTitle"=&gt;"第3条新闻"); <br />      $array[] = array("newsID"=&gt;4, "newsTitle"=&gt;"第4条新闻"); <br />      $array[] = array("newsID"=&gt;5, "newsTitle"=&gt;"第5条新闻"); <br />      $array[] = array("newsID"=&gt;6, "newsTitle"=&gt;"第6条新闻"); </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      $smarty-&gt;assign("newsArray", $array); </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">      //编译并显示位于./templates下的index.tpl模板 <br />      $smarty-&gt;display("example6.tpl"); <br />   ?&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   ================================================= <br />   example7.php 输出文件 <br />   ================================================= <br />   &lt;html&gt; <br />     &lt;head&gt;&lt;title&gt;foreach使用的例子&lt;/title&gt;&lt;/head&gt; <br />     &lt;body&gt; <br />        这里将输出一个数组：&lt;br&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：1&lt;br&gt; <br />    新闻内容：第1条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：2&lt;br&gt; <br />    新闻内容：第2条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：3&lt;br&gt; <br />    新闻内容：第3条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：4&lt;br&gt; <br />    新闻内容：第4条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：5&lt;br&gt; <br />    新闻内容：第5条新闻&lt;br&gt;&lt;hr&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">    新闻编号：6&lt;br&gt; <br />    新闻内容：第6条新闻&lt;br&gt;&lt;hr&gt; <br />     &lt;/body&gt; <br />   &lt;/html&gt; </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   这里的{section}块的对于变量的命名方式感觉有些别扭，不过没关系，你只要记住模板变量使用： <br />   $loopName[name].var这种模式就行了，loopName为loop处赋予的变量名，[name]为name处赋予的字符串，.后为为你要在程序数组中设定要 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">与值相对应的下标名称就行了。 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">   <br />   好了，smarty学习指南---程序设计篇就写到这里，对于一般的应用，这些知识已经够用了，其它的一些高级技巧大家请参看手册中的例子 </font>
						</font>
				</p>
				<p>
						<font color="#000000">
								<font color="#0000bb">，下一节将讲讲Smarty在实际应用中的例子，将分别以php内置的mysql语句，phplib中的DB类，ADODB，Pear中DB类来分别讲一下各个类库在同一个例子中的实现。 <br /></font>
						</font>
				</p>
		</blockquote>
<img src ="http://www.blogjava.net/jackstudio/aggbug/67864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-05 18:14 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/05/67864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smarty，PHP模板引擎 </title><link>http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Tue, 05 Sep 2006 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/67860.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/67860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/67860.html</trackback:ping><description><![CDATA[关键词： <br /> smarty，PHP模板引擎 <br /><br /><br />一、什么是smarty? <br /> smarty是一个使用PHP写出来的模板PHP模板引擎，它提供了逻辑与外在内容的分离，简单的讲，目的就是要使用PHP程序员同美工分 <br />离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计，美工重新修改页面不会影响到程序的程序逻辑，这在多人合作的项目 <br />中显的尤为重要。 <br /><br />二、smarty优点： <br /> 1. 速度：采用smarty编写的程序可以获得最大速度的提高，这一点是相对于其它的模板引擎技术而言的。 <br />  <br /> 2. 编译型：采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件，这个文件采用了PHP与HTML混合的方式，在下一次访 <br />问模板时将WEB请求直接转换到这个文件中，而不再进行模板重新编译（在源程序没有改动的情况下） <br />  <br /> 3. 缓存技术：smarty选用的一种缓存技术，它可以将用户最终看到的HTML文件缓存成一个静态的HTML页，当设定smarty的cache属性为 <br />  true时，在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来，这相当于调用一个静态的HTML文件。 <br /><br /> 4. 插件技术：smarty可以自定义插件。插件实际就是一些自定义的函数。 <br />  <br /> 5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。 <br /><br /><br />三、不适合使用smarty的地方： <br />  <br /> 1. 需要实时更新的内容。例如像股票显示，它需要经常对数据进行更新，这类型的程序使用smarty返而会使模板处理速度变慢。 <br />  <br /> 2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目，使用smarty返而会丧失php开发迅速的优点。 <br /><br />四、安装smarty类： <br />  <br /> 安装smarty的环境：php版本4.06以上版本。 <br /><br /> 安装smarty方法非常简单，从http://samrty.php.net中下载smarty.tar.gz,解压后找到LIB目录,在当前站点中建立目录comm,将LIB中所有文件 <br />  拷入comm目录,完成基本安装. <br />  <br /> 其它高级安装使用方法请看手册. <br /><br />五、smarty在模板中的使用： <br />  <br />  本节通过几个实例来讲一讲smarty的使用。smarty模板通常使用.tpl来标识，有些人为了美工方便，将扩展名直接写成.html，也是可以 <br />的。本文中采用smarty标准写法:以.tpl来表示为一个smarty模板。 <br /><br /> 实例1： <br /><br />  先来看一个简单的例子。 <br />  ===================================================== <br />  index.tpl <br />  ===================================================== <br />  <br />  {* 显示是smarty变量识符里的用*包含的文字为注释内容 *} <br />  {include file="header.tpl"}{*页面头*} <br /> 大家好，我叫{$name}, 欢迎大家阅读我的smarty学习材料。 <br />  {include file="foot.tpl"}{*页面尾*} <br /><br /> 上边的这个例子是一个tpl模板，其中： <br /> 1. {**}是模板页的注释，它在smarty对模板进行解析时不进行任何输出，仅供模板设计师对模板进行注释。 <br /> 2. {include file="xxx.tpl"}使用此句将一个模板文件包含到当前页面中，例子中将在网站中公用事的head.tpl与foot.tpl进行了包含，你可以 <br /> 这样想，使用这一句将xxx.tpl中的内容全部复制在当前语句处。当然，你不使用这一句也可以，将XXX.tpl中的内容复制到当前语句处 <br />  也是完全可以了。 <br /><br /> 3.{$name}: 模板变量，smarty中的核心组成，采用smarty定义的左边界符{与右边界符}包含着、以PHP变量形式给出，在smarty程序中将使用 <br /> $smarty-&gt;assign("name", "李晓军")；将模板中的$name替换成“李晓军”三个字。 <br />  <br />  整个实例源程序如下： <br />  ============================= <br />  header.tpl <br />  ============================= <br />  &lt;html&gt; <br />  &lt;head&gt; <br /> &lt;title&gt;大师兄smarty教程&lt;/title&gt; <br />  &lt;/head&gt; <br />  &lt;body&gt; <br />  <br /><br />  =============================== <br />  foot.tpl <br />  =============================== <br />  &lt;hr&gt; <br /> &lt;center&gt; CopyRight(C) by 大师兄 2004年8月 Email: teacherli@163.com &lt;/center&gt; <br />  &lt;hr&gt; <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br />  ===================================================== <br />  index.tpl <br />  ===================================================== <br />  <br />  {* 显示是smarty变量识符里的用*包含的文字为注释内容 *} <br />  {include file="header.tpl"}{*页面头*} <br /> 大家好，我叫{$name}, 欢迎大家阅读我的smarty学习材料。 <br />  {include file="foot.tpl"}{*页面尾*} <br /><br /> ================================================ <br /> index.php <br /> ================================================ <br /> &lt;?php <br /> /********************************************* <br />  * <br />  * 文件名： index.php <br />  * 作用： 显示实例程序 <br />  * <br />  * 作者： 大师兄 <br />  * Email：teacherli@163.com <br />  * <br />  *********************************************/ <br />  include_once("./comm/Smarty.class.php"); //包含smarty类文件 <br /><br />  $smarty = new Smarty();//建立smarty实例对象$smarty <br />  $smarty-&gt;templates("./templates"); //设置模板目录 <br />  $smarty-&gt;templates_c("./templates_c"); //设置编译目录 <br />  <br />  //---------------------------------------------------- <br />  //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />  //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />  //---------------------------------------------------- <br />  $smarty-&gt;left_delimiter = "{"; <br />  $smarty-&gt;right_delimiter = "}"; <br /><br />  $smarty-&gt;assign("name", "李晓军"); //进行模板变量替换 <br />  <br />  //编译并显示位于./templates下的index.tpl模板 <br />  $smarty-&gt;display("index.tpl"); <br /> ?&gt; <br />  <br /> 最终执行这个程序时将显示为： <br /> ================================ <br /> 执行index.php <br /> ================================ <br /> &lt;html&gt; <br />  &lt;head&gt; <br /> &lt;title&gt;大师兄smarty教程&lt;/title&gt; <br />  &lt;/head&gt; <br />  &lt;body&gt; <br /> 大家好，我叫李晓军, 欢迎大家阅读我的smarty学习材料。 <br /> &lt;hr&gt; <br /> &lt;center&gt; CopyRight(C) by 大师兄 2004年8月 Email: teacherli@163.com &lt;/center&gt; <br />  &lt;hr&gt; <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br /><br /><br />实例2： <br />  这个例子是综合使用smarty模板参数的一个例子，这些参数用来控制模板的输出，我只选其中几个，其它的参数你去看参考吧。 <br /><br />  ================================================ <br />  exmple2.tpl <br />  ================================================ <br />  &lt;html&gt; <br />  &lt;head&gt;&lt;title&gt;大师兄smarty示例2&lt;/title&gt;&lt;/head&gt; <br />  &lt;body&gt; <br />  1. 第一句首字母要大写：{$str1|capitalize}&lt;br&gt; <br />  2. 第二句模板变量 + 李晓军：{$str2|cat:"李晓军"}&lt;br&gt; <br />  3. 第三句输出当前日期：{$str3|date_format:"%Y年%m月%d日"} <br />  4. 第四句.php程序中不处理，它显示默认值：{$str4|default:"没有值！"} <br />  5。第五句要让它缩进8个空白字母位，并使用"*"取替这8个空白字符：&lt;br&gt; <br /> {$str5|indent:8:"*"}}&lt;br&gt; <br />  6. 第六句把TEACHerLI@163.com全部变为小写：{$str6|lower}&lt;br&gt; <br />  7. 第七句把变量中的teacherli替换成：李晓军：{$str7|replace:"teacherli":"李晓军"}&lt;br&gt; <br />8. 第八句为组合使用变量修改器：{$str8|capitalize|cat:"这里是新加的时间："|date_format:"%Y年%m月%d日"|lower} <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br />  =============================================== <br />  example2 .php <br />  =============================================== <br />  &lt;?php <br /> /********************************************* <br />  * <br />  * 文件名： example2.php <br />  * 作用： 显示实例程序2 <br />  * <br />  * 作者： 大师兄 <br />  * Email：teacherli@163.com <br />  * <br />  *********************************************/ <br />  include_once("./Smarty.class.php"); //包含smarty类文件 <br /><br />  $smarty = new Smarty();//建立smarty实例对象$smarty <br />  $smarty-&gt;templates("./templates"); //设置模板目录 <br />  $smarty-&gt;templates_c("./templates_c"); //设置编译目录 <br />  <br />  //---------------------------------------------------- <br />  //左右边界符，默认为{}，但实际应用当中容易与JavaScript <br />  //相冲突，所以建议设成&lt;{}&gt;或其它。 <br />  //---------------------------------------------------- <br />  $smarty-&gt;left_delimiter = "{"; <br />  $smarty-&gt;right_delimiter = "}"; <br /><br />  $smarty-&gt;assign("str1", "my name is xiao jun, li."); //将str1替换成My Name Is Xiao Jun, Li. <br />  $smarty-&gt;assign("str2", "我的名字叫："); //输出: 我的名字叫:李晓军 <br />  $smarty-&gt;assign("str3", "公元"); //输出公元2004年8月21日（我的当前时间） <br />  //$smarty-&gt;assign("str4", ""); //第四句不处理时会显示默认值，如果使用前面这一句则替换为"" <br />  $smarty-&gt;assign("str5", "前边8个*"); //第五句输出：********前边8个* <br />  $smarty-&gt;assign("str6", "TEACHerLI@163.com"); //这里将输出teacherli@163.com <br />  $smarty-&gt;assign("str7", "this is teacherli"); //在模板中显示为：this is 李晓军 <br />  $smarty-&gt;assign("str8", "HERE IS COMBINING:"); <br /><br />  //编译并显示位于./templates下的index.tpl模板 <br />  $smarty-&gt;display("example2.tpl"); <br /> ?&gt; <br />  <br />  最终输出效果： <br />  ====================================================== <br />  example2.php输出效果： <br />  ====================================================== <br />  &lt;html&gt; <br />  &lt;head&gt;&lt;title&gt;大师兄smarty示例2&lt;/title&gt;&lt;/head&gt; <br />  &lt;body&gt; <br />  1. 第一句首字母要大写：My Name Is Xiao Jun, Li.&lt;br&gt; <br />  2. 第二句模板变量 + 李晓军：我的名字叫：李晓军&lt;br&gt; <br />  3. 第三句输出当前日期：公元2004年8月21日&lt;br&gt; <br />  4. 第四句.php程序中不处理，它显示默认值：没有值！&lt;br&gt; <br />  5。第五句要让它缩进8个空白字母位，并使用"*"取替这8个空白字符：&lt;br&gt; <br /> ********前边8个*&lt;br&gt; <br />  6. 第六句把TEACHerLI@163.com全部变为小写：teacherli@163.com&lt;br&gt; <br />  7. 第七句把变量中的teacherli替换成：李晓军：this is 李晓军&lt;br&gt; <br />8. 第八句为组合使用变量修改器：Here is Combining:这里是新加的时间：2004年8月21日 <br />  &lt;/body&gt; <br />  &lt;/html&gt; <br /><br /> 在模板中的这些参数被称为变量修改器（variable modifiers），使用这些参数可对模板进行一系列的修改控制。变量修改器 <br /> 使用"|"和调节器名称应用修改器， 使用":"分开修改器参数。变量修改器可以组合使用，像第八句一样，实际使用中可以灵活应用。 <br /><img src ="http://www.blogjava.net/jackstudio/aggbug/67860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-05 17:48 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/05/67860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式语法</title><link>http://www.blogjava.net/jackstudio/archive/2006/08/10/62767.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 10 Aug 2006 04:25:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/08/10/62767.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/62767.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/08/10/62767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/62767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/62767.html</trackback:ping><description><![CDATA[
		<table class="banner" cellspacing="0" width="100%">
				<tbody>
						<tr>
								<td class="bannerleft" nowrap=""> </td>
								<td class="bannerright" nowrap="">
								</td>
						</tr>
				</tbody>
		</table>
		<!--End Head-->
		<h2>正则表达式语法</h2>
		<p>一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为<i>元字符</i>）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。</p>
		<p>这里有一些可能会遇到的正则表达式示例：</p>
		<table cellspacing="0" cols="3" rules="all" border="1" frame="box">
				<tbody>
						<tr valign="top">
								<th width="30%">JScript</th>
								<th width="30%">VBScript</th>
								<th width="40%">匹配</th>
						</tr>
						<tr valign="top">
								<td width="30%">/^\[ \t]*$/</td>
								<td width="30%">"^\[ \t]*$"</td>
								<td width="40%">匹配一个空白行。</td>
						</tr>
						<tr valign="top">
								<td width="30%">/\d{2}-\d{5}/</td>
								<td width="30%">"\d{2}-\d{5}"</td>
								<td width="40%">验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。</td>
						</tr>
						<tr valign="top">
								<td width="30%">/&lt;(.*)&gt;.*&lt;\/\1&gt;/</td>
								<td width="30%">"&lt;(.*)&gt;.*&lt;\/\1&gt;"</td>
								<td width="40%">匹配一个 HTML 标记。</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>下表是元字符及其在正则表达式上下文中的行为的一个完整列表：</p>
		<table cellspacing="0" cols="2" rules="all" border="1" frame="box">
				<tbody>
						<tr valign="top">
								<th width="16%">字符</th>
								<th width="84%">描述</th>
						</tr>
						<tr valign="top">
								<td width="16%">\</td>
								<td width="84%">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。</td>
						</tr>
						<tr valign="top">
								<td width="16%">^</td>
								<td width="84%">匹配输入字符串的开始位置。如果设置了 <b>RegExp</b> 对象的 <b>Multiline</b> 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</td>
						</tr>
						<tr valign="top">
								<td width="16%">$</td>
								<td width="84%">匹配输入字符串的结束位置。如果设置了<b>RegExp</b> 对象的 <b>Multiline</b> 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</td>
						</tr>
						<tr valign="top">
								<td width="16%">*</td>
								<td width="84%">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。</td>
						</tr>
						<tr valign="top">
								<td width="16%">+</td>
								<td width="84%">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</td>
						</tr>
						<tr valign="top">
								<td width="16%">?</td>
								<td width="84%">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</td>
						</tr>
						<tr valign="top">
								<td width="16%">{<i>n</i>}</td>
								<td width="84%">
										<i>n</i> 是一个非负整数。匹配确定的 <i>n</i> 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</td>
						</tr>
						<tr valign="top">
								<td width="16%">{<i>n</i>,}</td>
								<td width="84%">
										<i>n</i> 是一个非负整数。至少匹配<i>n</i> 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</td>
						</tr>
						<tr valign="top">
								<td width="16%">{<i>n</i>,<i>m</i>}</td>
								<td width="84%">
										<i>m</i> 和 <i>n</i> 均为非负整数，其中<i>n</i> &lt;= <i>m</i>。最少匹配 <i>n</i> 次且最多匹配 <i>m</i> 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</td>
						</tr>
						<tr valign="top">
								<td width="16%">?</td>
								<td width="84%">当该字符紧跟在任何一个其他限制符 (*, +, ?, {<i>n</i>}, {<i>n</i>,}, {<i>n</i>,<i>m</i>}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。</td>
						</tr>
						<tr valign="top">
								<td width="16%">.</td>
								<td width="84%">匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</td>
						</tr>
						<tr valign="top">
								<td width="16%">(<i>pattern</i>)</td>
								<td width="84%">匹配<i>pattern</i> 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 <b>SubMatches</b> 集合，在JScript 中则使用 <b>$0</b>…<b>$9</b> 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</td>
						</tr>
						<tr valign="top">
								<td width="16%">(?:<i>pattern</i>)</td>
								<td width="84%">匹配 <i>pattern</i> 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</td>
						</tr>
						<tr valign="top">
								<td width="16%">(?=<i>pattern</i>)</td>
								<td width="84%">正向预查，在任何匹配 <i>pattern</i> 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td>
						</tr>
						<tr valign="top">
								<td width="16%">(?!<i>pattern</i>)</td>
								<td width="84%">负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching <i>pattern</i> 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 </td>
						</tr>
						<tr valign="top">
								<td width="16%">
										<i>x</i>|<i>y</i></td>
								<td width="84%">匹配 <i>x</i> 或 <i>y</i>。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">[<i>xyz</i>]</td>
								<td width="84%">字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">[^<i>xyz</i>]</td>
								<td width="84%">负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">[<i>a-z</i>]</td>
								<td width="84%">字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">[^<i>a-z</i>]</td>
								<td width="84%">负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\b</td>
								<td width="84%">匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\B</td>
								<td width="84%">匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\c<i>x</i></td>
								<td width="84%">匹配由<i>x</i>指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 <i>x</i> 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\d</td>
								<td width="84%">匹配一个数字字符。等价于 [0-9]。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\D</td>
								<td width="84%">匹配一个非数字字符。等价于 [^0-9]。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\f</td>
								<td width="84%">匹配一个换页符。等价于 \x0c 和 \cL。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\n</td>
								<td width="84%">匹配一个换行符。等价于 \x0a 和 \cJ。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\r</td>
								<td width="84%">匹配一个回车符。等价于 \x0d 和 \cM。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\s</td>
								<td width="84%">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\S</td>
								<td width="84%">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\t</td>
								<td width="84%">匹配一个制表符。等价于 \x09 和 \cI。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\v</td>
								<td width="84%">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\w</td>
								<td width="84%">匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\W</td>
								<td width="84%">匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\x<i>n</i></td>
								<td width="84%">匹配 <i>n</i>，其中 <i>n</i> 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.</td>
						</tr>
						<tr valign="top">
								<td width="16%">\<i>num</i></td>
								<td width="84%">匹配 <i>num</i>，其中 <i>num</i> 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 </td>
						</tr>
						<tr valign="top">
								<td width="16%">\<i>n</i></td>
								<td width="84%">标识一个八进制转义值或一个后向引用。如果 \<i>n</i> 之前至少 <i>n</i> 个获取的子表达式，则 <i>n</i> 为后向引用。否则，如果 <i>n</i> 为八进制数字 (0-7)，则 <i>n</i> 为一个八进制转义值。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\<i>nm</i></td>
								<td width="84%">标识一个八进制转义值或一个后向引用。如果 \<i>nm</i> 之前至少有is preceded by at least <i>nm</i> 个获取得子表达式，则 <i>nm</i> 为后向引用。如果 \<i>nm</i> 之前至少有 <i>n</i> 个获取，则 <i>n</i> 为一个后跟文字 <i>m </i>的后向引用。如果前面的条件都不满足，若  <i>n</i> 和 <i>m</i> 均为八进制数字 (0-7)，则 \<i>nm</i> 将匹配八进制转义值 <i>nm</i>。</td>
						</tr>
						<tr valign="top">
								<td width="16%">\<i>nml</i></td>
								<td width="84%">如果 <i>n</i> 为八进制数字 (0-3)，且 <i>m</i> 和 <i>l</i> 均为八进制数字 (0-7)，则匹配八进制转义值 <i>nml。</i></td>
						</tr>
						<tr valign="top">
								<td width="16%">\u<i>n</i></td>
								<td width="84%">匹配 <i>n</i>，其中 <i>n</i> 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.blogjava.net/jackstudio/aggbug/62767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-08-10 12:25 <a href="http://www.blogjava.net/jackstudio/archive/2006/08/10/62767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php常见问题</title><link>http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 10 Aug 2006 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/62766.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/62766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/62766.html</trackback:ping><description><![CDATA[
		<p>1:为什么我得不到变量</p>
		<p>　　我在一网页向另一网页POST数据name，为什么输出$name时却得不到任何值?</p>
		<p>在PHP4.2以后的版本中register_global默认为off<br />　　若想取得从另一页面提交的变量:</p>
		<p>　　方法一:在PHP.ini中找到register_global，并把它设置为on.<br />　　方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()).<br />　　方法三:一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等，这种方法虽然麻烦，但比较安全.</p>
		<p>　　2：调试你的程序</p>
		<p>　　在运行时必须知道某个变量为何值。我是这样做的，建立一文件debug.php,其内容如下:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　Ob_Start();<br />　　Session_Start();<br />　　Echo "&lt;pre&gt;";</p>
		<p>　　Echo "本页得到的_GET变量有:";<br />　　Print_R($_GET);</p>
		<p>　　Echo "本页得到的_POST变量有:";<br />　　Print_R($_POST);</p>
		<p>　　Echo "本页得到的_COOKIE变量有:";<br />　　Print_R($_COOKIE);</p>
		<p>　　Echo "本页得到的_SESSION变量有:";<br />　　Print_R($_SESSION);</p>
		<p>　　Echo "&lt;/pre&gt;";<br />　　?&gt;</p>
		<p>　　然后在php.ini中设置：include_path = "c:/php"，并将debug.php放在此文件夹,以后就可以在每个网页里包含此文件，查看得到的变量名和值.</p>
		<p>　　3：如何使用session</p>
		<p>　　凡是与session有关的,之前必须调用函数session_start();</p>
		<p>　　为session付值很简单,如:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　Session_start();<br />　　$Name = "这是一个Session例子";<br />　　Session_Register("Name");//注意,不要写成：Session_Register("$Name");<br />　　Echo $_SESSION["Name"];<br />　　//之后$_SESSION["Name"]为"这是一个Session例子"<br />　　?&gt;</p>
		<p>　　在php4.2之后,可以为session直接付值:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　Session_Start();<br />　　$_SESSION["name"]="value";<br />　　?&gt;</p>
		<p>　　取消session可以这样:</p>
		<p>
				<br />PHP代码: </p>
		<p>
				<br />　　&lt;?php<br />　　session_start();<br />　　session_unset();<br />　　session_destroy();<br />　　?&gt;</p>
		<p>　　取消某个session变量在php4.2以上还有BUG.</p>
		<p>　　注意:</p>
		<p>　　1:在调用Session_Start()之前不能有任何输出.例如下面是错误的.<br />　　==========================================<br />　　1行<br />　　2行 3行 Session_Start();//之前在第一行已经有输出<br />　　4行 .....<br />　　5行 ?&gt;<br />　　==========================================</p>
		<p>　　提示1:</p>
		<p>　　凡是出现" ........headers already sent.......... ",就是Session_Start()之前向浏览器输出信息.去掉输出就正常,（COOKIE也会出现这种错误,错误原因一样）</p>
		<p>　　提示2:</p>
		<p>　　如果你的Session_Start()放在循环语句里,并且很难确定之前哪里向浏览器输出信息,可以用下面这种方法:<br />　　1行 &lt;?PHP Ob_Start(); ?&gt;<br />　　........这里是你的程序......</p>
		<p>　　2:这是什么错误</p>
		<p>　　Warning: session_start(): open(/tmp\sess_7d190aa36b4c5ec13a5c1649cc2da23f, O_RDWR) failed:....<br />因为你没有指定session文件的存放路径.</p>
		<p>　　解决方法:<br />　　(1)在c盘建立文件夹tmp<br />　　(2)打开php.ini,找到session.save_path,修改为session.save_path= "c:/tmp"</p>
		<p>4:为什么我向另一网页传送变量时,只得到前半部分,以空格开头的则全部丢失</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　$Var="hello php";//修改为$Var="     hello php";试试得到什么结果<br />　　$post= "receive.php?Name=".$Var;<br />　　header("location:$post");<br />　　?&gt;</p>
		<p>　　receive.php的内容:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　Echo "&lt;pre&gt;";<br />　　Echo   $_GET["Name"];<br />　　Echo "&lt;/pre&gt;";<br />　　?&gt;</p>
		<p>　　正确的方法是:</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　$Var="hello php";<br />　　$post= "receive.php?Name=".urlencode($Var);<br />　　header("location:$post");<br />　　?&gt;</p>
		<p>　　在接收页面你不需要使用Urldecode(),变量会自动编码.<br />5:如何截取指定长度汉字而不会出现以"?&gt;"结尾,超出部分以"..."代替</p>
		<p>　　一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字，包括标点.</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$str="这个字符好长呀,^_^";<br />　　$Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符...<br />　　Echo   "$Short_Str";<br />　　Function csubstr($str,$start,$len) <br />　　{ <br />　　$strlen=strlen($str); <br />　　$clen=0; <br />　　for($i=0;$i&lt;$strlen;$i++,$clen++) <br />　　{ <br />　　if ($clen&gt;=$start+$len) <br />　　break; <br />　　if(ord(substr($str,$i,1))&gt;0xa0) <br />　　{ <br />　　if ($clen&gt;=$start) <br />　　$tmpstr.=substr($str,$i,2); <br />　　$i++; <br />　　} <br />　　else <br />　　{ <br />　　if ($clen&gt;=$start) <br />　　$tmpstr.=substr($str,$i,1); <br />　　} <br />　　} </p>
		<p>　　return $tmpstr; <br />　　} <br />　　Function showShort($str,$len) <br />　　{ <br />　　$tempstr = csubstr($str,0,$len); <br />　　if ($str&lt;&gt;$tempstr) <br />　　$tempstr .= "..."; //要以什么结尾,修改这里就可以.</p>
		<p>　　return $tempstr; <br />　　}</p>
		<p>
				<br />　　6:规范你的SQL语句</p>
		<p>　　在表格，字段前面加上"`",这样就不会因为误用关键字而出现错误，当然我并不推荐你使用关键字.</p>
		<p>　　例如<br />　　$Sql="INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', '2003-07-11 00:00:00')"</p>
		<p>　　"`"怎么输入? 在TAB键上面.</p>
		<p>
				<br />　　7:如何使Html/PHP格式的字符串不被解释,而是照原样显示</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$str="&lt;h1&gt;PHP&lt;/h1&gt;";<br />　　Echo "被解释过的: ".$str."&lt;br&gt;经过处理的:";<br />　　Echo   htmlentities(nl2br($str));<br />　　?&gt;</p>
		<p>
				<br />　　8:怎么在函数里取得函数外的变量值</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$a="PHP";<br />　　foo();<br />　　Function foo()<br />　　{<br />　　 global $a;//删除这里看看是什么结果<br />　　 Echo "$a";<br />　　}<br />　　?&gt;</p>
		<p>9:我怎么知道系统默认支持什么函数</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php <br />　　$arr = get_defined_functions(); <br />　　Function php() {<br />　　}<br />　　echo   "&lt;pre&gt;"; <br />　　Echo   "这里显示系统所支持的所有函数,和自定以函数php\n";<br />　　print_r($arr); <br />　　echo   "&lt;/pre&gt;"; <br />　　?&gt;  </p>
		<p>
				<br />　　10:如何比较两个日期相差几天</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?PHP<br />　　$Date_1="2003-7-15";//也可以是:$Date_1="2003-7-15 23:29:14";<br />　　$Date_2="1982-10-1";<br />　　$d1=strtotime($Date_1);<br />　　$d2=strtotime($Date_2);<br />　　$Days=round(($d1-$d2)/3600/24);<br />　　Echo   "偶已经奋斗了 $Days 天^_^";<br />　　?&gt;</p>
		<p>
				<br />　　11:为什么我升级PHP后,原来的程序出现满屏的 Notice: Undefined variable:</p>
		<p>　　这是警告的意思,由于变量未定义引起的.<br />　　打开php.ini,找到最下面的error_reporting,修改为error_reporting = E_ALL &amp; ~E_NOTICE</p>
		<p>　　对于Parse error错误<br />　　error_reporting(0)无法关闭.<br />　　如果你想关闭任何错误提示,打开php.ini,找到display_errors,设置为display_errors = Off.以后任何错误都不会提示.</p>
		<p>　　那什么是error_reporting?</p>
		<p>
				<br />　　12:我想在每个文件最前，最后面都加上一文件.但一个一个添加很麻烦</p>
		<p>　　1:打开php.ini文件<br />　　设置 include_path= "c:"</p>
		<p>　　2:写两个文件 <br />　　auto_prepend_file.php 和 auto_append_file.php 保存在c盘,他们将自动依附在每个php文件的头部和尾部.</p>
		<p>　　3:在php.ini中找到:<br />　　Automatically add files before or after any PHP document.<br />　　auto_prepend_file = auto_prepend_file.php;依附在头部<br />　　auto_append_file = auto_append_file.php;依附在尾部</p>
		<p>　　以后你每个php文件就相当于</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php <br />　　Include "auto_prepend_file.php" ;</p>
		<p>　　.......//这里是你的程序</p>
		<p>　　Include "auto_append_file.php";<br />　　?&gt;</p>
		<p>
				<br />　　13:如何利用PHP上传文件</p>
		<p>　　PHP代码: </p>
		<p>　　&lt;html&gt;&lt;head&gt;<br />　　&lt;title&gt;上载文件表单&lt;/title&gt;&lt;/head&gt; <br />　　&lt;body&gt; <br />　　&lt;form enctype="multipart/form-data" action="" method="post"&gt; <br />　　请选择文件： &lt;br&gt;<br />　　&lt;input name="upload_file" type="file"&gt;&lt;br&gt;<br />　　&lt;input type="submit" value="上传文件"&gt; <br />　　&lt;/form&gt; <br />　　&lt;/body&gt;<br />　　&lt;/html&gt; </p>
		<p>
				<br />&lt;?<br />　　$upload_file=$_FILES['upload_file']['tmp_name'];<br />　　$upload_file_name=$_FILES['upload_file']['name'];</p>
		<p>　　if($upload_file){<br />　　$file_size_max = 1000*1000;// 1M限制文件上传最大容量(bytes)<br />　　$store_dir = "d:/";// 上传文件的储存位置<br />　　$accept_overwrite = 1;//是否允许覆盖相同文件<br />　　// 检查文件大小<br />　　if ($upload_file_size &gt; $file_size_max) {<br />　　echo "对不起，你的文件容量大于规定";<br />　　exit;<br />　　}</p>
		<p>　　// 检查读写文件<br />　　if (file_exists($store_dir . $upload_file_name) &amp;&amp; !$accept_overwrite) {<br />　　Echo   "存在相同文件名的文件";<br />　　exit;<br />　　}</p>
		<p>　　//复制文件到指定目录<br />　　if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {<br />　　echo "复制文件失败";<br />　　exit;<br />　　}</p>
		<p>　　}</p>
		<p>　　Echo   "&lt;p&gt;你上传了文件:";<br />　　echo  $_FILES['upload_file']['name'];<br />　　echo "&lt;br&gt;";<br />　　//客户端机器文件的原名称。 </p>
		<p>　　Echo   "文件的 MIME 类型为:";<br />　　echo $_FILES['upload_file']['type'];<br />　　//文件的 MIME 类型，需要浏览器提供该信息的支持，例如“image/gif”。 <br />　　echo "&lt;br&gt;";</p>
		<p>　　Echo   "上传文件大小:";<br />　　echo $_FILES['upload_file']['size'];<br />　　//已上传文件的大小，单位为字节。 <br />　　echo "&lt;br&gt;";</p>
		<p>　　Echo   "文件上传后被临时储存为:";<br />　　echo $_FILES['upload_file']['tmp_name'];<br />　　//文件被上传后在服务端储存的临时文件名。 <br />　　echo "&lt;br&gt;";</p>
		<p>
				<br />　　$Erroe=$_FILES['upload_file']['error'];<br />　　switch($Erroe){<br />        　　case 0:<br />            　Echo   "上传成功"; break;<br />        　　case 1:<br />            　Echo   "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;<br />        　　case 2:<br />            　Echo   "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。";    break;<br />        　　case 3:<br />            　Echo   "文件只有部分被上传";break;<br />        　　case 4:<br />            　Echo   "没有文件被上传";break;<br />　　}<br />　　?&gt;</p>
		<p>
				<br />　　14:如何配置GD库</p>
		<p>　　下面是我的配置过程<br />　　1:用dos命令(也可以手动操作,拷贝dlls文件夹里所有dll文件到system32目录下) copy c:\php\dlls\*.dll c:\windows\system32\ <br />　　2:打开php.ini<br />　　设置extension_dir = "c:/php/extensions/";<br />　　3:<br />　　extension=php_gd2.dll;把extension前面的逗号去掉，如果没有php_gd2.dll，php_gd.dll也一样,保证确实存在这一文件c:/php/extensions/php_gd2.dll<br />　　4:运行下面程序进行测试</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;?php<br />　　Ob_end_flush();<br />　　//注意,在此之前不能向浏览器输出任何信息,要注意是否设置了 auto_prepend_file.<br />　　header ("Content-type: image/png");<br />　　$im = @imagecreate (200, 100)<br />    　or die ("无法创建图像");<br />　　$background_color = imagecolorallocate ($im, 0,0, 0);<br />　　$text_color = imagecolorallocate ($im, 230, 140, 150);<br />　　imagestring ($im, 3, 30, 50,  "A Simple Text String", $text_color);<br />　　imagepng ($im);<br />　　?&gt;</p>
		<p>　　点击这里查看结果</p>
		<p>
				<br />　　15:什么是UBB代码</p>
		<p>　　UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外一个BBS程序，国内也有不少地方使用这个程序)采用的一种特殊的TAG.<br />　　即使禁止使用 HTML，你也可以用 UBBCode? 来实现.也许你更希望使用 UBBCode? 而不是 HTML, 即使论坛允许使用 HTML, 因为使用起来代码较少也更安全.</p>
		<p>[回顾]:上集介绍了"调试程序","如何使用session","规范SQL语句"等15个问题（Php高手带路--问题汇总解答[1]）。本集继续作出16条常见问题的解答。</p>
		<p>16:我想修改MySQL的用户,密码<br />　　首先要声明一点，大部分情况下，修改MySQL是需要有mysql里的root权限的， </p>
		<p>　　所以一般用户无法更改密码，除非请求管理员.</p>
		<p>　　方法一 </p>
		<p>　　使用phpmyadmin，这是最简单的了，修改mysql库的user表， </p>
		<p>　　不过别忘了使用PASSWORD函数。</p>
		<p>　　方法二 </p>
		<p>　　使用mysqladmin，这是前面声明的一个特例。 </p>
		<p>　　mysqladmin -u root -p password mypasswd </p>
		<p>　　输入这个命令后，需要输入root的原密码，然后root的密码将改为mypasswd。 </p>
		<p>　　把命令里的root改为你的用户名，你就可以改你自己的密码了。 </p>
		<p>　　当然如果你的mysqladmin连接不上mysql server，或者你没有办法执行mysqladmin， </p>
		<p>　　那么这种方法就是无效的。 </p>
		<p>　　而且mysqladmin无法把密码清空。 <br />　　下面的方法都在mysql提示符下使用，且必须有mysql的root权限： </p>
		<p>　　方法三 </p>
		<p>　　mysql&gt; INSERT INTO mysql.user (Host,User,Password) </p>
		<p>　　VALUES('%','jeffrey',PASSWORD('biscuit')); </p>
		<p>　　mysql&gt; FLUSH PRIVILEGES </p>
		<p>　　确切地说这是在增加一个用户，用户名为jeffrey，密码为biscuit。 </p>
		<p>　　在《mysql中文参考手册》里有这个例子，所以我也就写出来了。 </p>
		<p>　　注意要使用PASSWORD函数，然后还要使用FLUSH PRIVILEGES。</p>
		<p>方法四 </p>
		<p>　　和方法三一样，只是使用了REPLACE语句 </p>
		<p>　　mysql&gt; REPLACE INTO mysql.user (Host,User,Password) </p>
		<p>　　VALUES('%','jeffrey',PASSWORD('biscuit')); </p>
		<p>　　mysql&gt; FLUSH PRIVILEGES </p>
		<p>　　方法五 </p>
		<p>　　使用SET PASSWORD语句， </p>
		<p>　　mysql&gt; SET PASSWORD FOR <a href="mailto:jeffrey@&quot;%">jeffrey@"%</a>" = PASSWORD('biscuit'); </p>
		<p>　　你也必须使用PASSWORD()函数， </p>
		<p>　　但是不需要使用FLUSH PRIVILEGES。</p>
		<p>　　方法六 </p>
		<p>　　使用GRANT ... IDENTIFIED BY语句 </p>
		<p>　　mysql&gt; GRANT USAGE ON *.* TO <a href="mailto:jeffrey@&quot;%">jeffrey@"%</a>" IDENTIFIED BY 'biscuit'; </p>
		<p>
				<br />　　这里PASSWORD()函数是不必要的，也不需要使用FLUSH PRIVILEGES。 <br />　　注意： PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。 </p>
		<p>
				<br />17:我想知道他是通过哪个网站连接到本页<br />　　PHP代码:</p>
		<p>　　&lt;?php</p>
		<p>　　//必须通过超级连接进入才有输出</p>
		<p>　　Echo $_SERVER['HTTP_REFERER'];</p>
		<p>　　?&gt;</p>
		<p>18:数据放入数据库和取出来显示在页面需要注意什么<br />　　入库时</p>
		<p>　　$str=addslashes($str);</p>
		<p>　　$sql="insert into `tab` (`content`) values('$str')";</p>
		<p>　　出库时</p>
		<p>　　$str=stripslashes($str);</p>
		<p>　　显示时</p>
		<p>　　$str=htmlspecialchars(nl2br($str)) ; <br />　　&lt;?php</p>
		<p>　　//$content来自数据库</p>
		<p>　　$content=nl2br(htmlspecialchars($content));</p>
		<p>　　$content=str_replace(" ","&amp;nbsp;",$content);</p>
		<p>　　$content=str_replace("\n","&lt;br&gt;\n",$content);</p>
		<p>　　?&gt;</p>
		<p>19:如何读取当前地址栏信息<br />　　PHP代码:</p>
		<p>　　&lt;?php </p>
		<p>　　$s="<a href="http://{$_SERVER['HTTP_HOST']}:{$_SERVER[&quot;SERVER_PORT&quot;]}{$_SERVER['SCRIPT_NAME'">http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME'</a>]}"; </p>
		<p>　　$se=''; <br />　　foreach ($_GET as $key =&gt; $value) { <br />　　$se.=$key."=".$value."&amp;"; <br />　　} <br />　　$se=Preg_Replace("/(.*)&amp;$/","$1",$se); <br />　　$se?$se="?".$se:"";<br />　　echo $s."?$se"; <br />　　?&gt; </p>
		<p>
				<br />20:我点击后退按钮,为什么之前填写的东西不见<br />　　这是因为你使用了session.</p>
		<p>　　解决办法:<br />　　PHP代码:</p>
		<p>　　&lt;?php session_cache_limiter('private, must-revalidate');session_start(); <br />　　.....................?&gt;</p>
		<p>21:怎么在图片里显示IP地址</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;? Header("Content-type: image/png"); </p>
		<p>　　$img = ImageCreate(180,50); <br />　　$ip = $_SERVER['REMOTE_ADDR'];</p>
		<p>　　 ImageColorTransparent($img,$bgcolor); </p>
		<p>　　$bgColor = ImageColorAllocate($img, 0x2c,0x6D,0xAF); // 背景颜色</p>
		<p>　　$shadow = ImageColorAllocate($img, 250,0,0); // 阴影颜色</p>
		<p>　　$textColor = ImageColorAllocate($img, oxff,oxff,oxff); // 字体颜色 </p>
		<p>　　ImageTTFText($img,10,0,78,30,$shadow,"d:/windows/fonts/Tahoma.ttf",$ip); <br />//显示背景 </p>
		<p>　　ImageTTFText($img,10,0,25,28,$textColor,"d:/windows/fonts/Tahoma.ttf","your ip is".$ip);</p>
		<p> // 显示IP 　　　</p>
		<p>　　ImagePng($img); 　　　</p>
		<p>　　imagecreatefrompng($img); <br />　　ImageDestroy($img);　　　　　　</p>
		<p>　　?&gt;</p>
		<p>22:如何取得用户的真实IP</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;? function iptype1 () {</p>
		<p>　　 if (getenv("HTTP_CLIENT_IP"))</p>
		<p>　　 { <br />　　return getenv("HTTP_CLIENT_IP"); </p>
		<p>　　} </p>
		<p>　　else </p>
		<p>　　{ </p>
		<p>　　return "none"; <br />　　} </p>
		<p>　　} </p>
		<p>　　function iptype2 () { </p>
		<p>　　if (getenv("HTTP_X_FORWARDED_FOR")) </p>
		<p>　　{</p>
		<p>　　 return <br />　　getenv("HTTP_X_FORWARDED_FOR"); </p>
		<p>　　} </p>
		<p>　　else { </p>
		<p>　　return "none"; <br />　　} </p>
		<p>　　} </p>
		<p>function iptype3 () { </p>
		<p>　　if (getenv("REMOTE_ADDR")) </p>
		<p>　　{</p>
		<p>　　 return getenv("REMOTE_ADDR"); <br />　　}</p>
		<p>　　 else { </p>
		<p>　　return "none";</p>
		<p>　　 }</p>
		<p>　　 } </p>
		<p>　　function ip() {</p>
		<p>　　 $ip1 = iptype1();</p>
		<p>　　 $ip2 = iptype2(); </p>
		<p>　　$ip3 = iptype3(); </p>
		<p>　　if (isset($ip1) &amp;&amp; $ip1 != "none" &amp;&amp; $ip1 != "unknown") </p>
		<p>　　{ </p>
		<p>　　return $ip1; </p>
		<p>　　}</p>
		<p>　　 elseif (isset($ip2) &amp;&amp; $ip2 != "none" &amp;&amp; $ip2 != "unknown") <br />　　{ </p>
		<p>　　return $ip2; </p>
		<p>　　} </p>
		<p>　　elseif (isset($ip3) &amp;&amp; $ip3 != "none" &amp;&amp; $ip3 != "unknown")</p>
		<p>　　 { </p>
		<p>　　return $ip3; </p>
		<p>　　}</p>
		<p>　　 else </p>
		<p>　　{ return "none"; } </p>
		<p>　　}</p>
		<p>　　 Echo ip(); </p>
		<p>　　?&gt; </p>
		<p>
				<br />23:如何从数据库读取三天内的所有记录<br />　　首先表格里要有一个DATETIME字段记录时间,</p>
		<p>　　格式为'2003-7-15 16:50:00'<br />　　SELECT * FROM `xltxlm` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) &lt;= 3;</p>
		<p>
				<br />24:如何远程链接Mysql数据库</p>
		<p>　　在增加用户的mysql表里有一个host字段，修改为"%",或者指定允许连接的ip地址,这样，你就可以远程调用了。<br />　　$link=mysql_connect("192.168.1.80:3306","root","");</p>
		<p>
				<br />25:正则到底怎么用</p>
		<p>正则表达式中的特殊字符</p>
		<p>26:用Apache后,主页出现乱码 </p>
		<p>　　方法一: </p>
		<p>　　AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset off <br />　　方法二: </p>
		<p>　　AddDefaultCharset GB2312</p>
		<p>
				<br />27:为什么单引号,双引号在接受页面变成(\'\")<br />　　解决方法:</p>
		<p>　　方法一:在php.ini中设置:magic_quotes_gpc = Off</p>
		<p>　　方法二: $str=stripcslashes($str)</p>
		<p>
				<br />28:怎么让程序一直运行下去,而不是超过30秒就停止<br />　　set_time_limit(60)//最长运行时间一分钟</p>
		<p>　　set_time_limit(0)//运行到程序自己结束,或手动停止</p>
		<p>
				<br />29:计算当前在线人数<br />　　例子一:用文本实现<br />　　PHP代码:</p>
		<p>　　&lt;?php </p>
		<p>　　//首先你要有读写文件的权限</p>
		<p>　　//本程序可以直接运行,第一次报错,以后就可以</p>
		<p>　　 $online_log = "count.dat"; //保存人数的文件,</p>
		<p>　　 $timeout = 30;//30秒内没动作者,认为掉线 </p>
		<p>　　 $entries = file($online_log); <br />　　 $temp = array(); </p>
		<p>
				<br />for ($i=0;$i&lt;count($entries);$i++) { </p>
		<p>　　 $entry = explode(",",trim($entries[$i])); </p>
		<p>　　 if (($entry[0] != getenv('REMOTE_ADDR')) &amp;&amp; ($entry[1] &gt; time())) <br />{ </p>
		<p>　　 array_push($temp,$entry[0].",".$entry[1]."\n"); //取出其他浏览者的信息,并去掉超时者,保存进$temp</p>
		<p>　　 } </p>
		<p>　　 } <br />　　 array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."\n"); <br />//更新浏览者的时间</p>
		<p>　　 $users_online = count($temp); //计算在线人数<br />　　 $entries = implode("",$temp); </p>
		<p>　　 //写入文件</p>
		<p>　　 $fp = fopen($online_log,"w"); </p>
		<p>　　 flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作</p>
		<p>　　 fputs($fp,$entries); </p>
		<p>　　 flock($fp,LOCK_UN); </p>
		<p>　　 fclose($fp); <br />　　 echo "当前有".$users_online."人在线"; <br />　　?&gt; </p>
		<p>
				<br />30:什么是模板,怎么用<br />　　我用的是phplib模板</p>
		<p>　　下面是其中几个函数的使用<br />　　$T-&gt;Set_File("随便定义","模板文件.tpl"); <br />　　$T-&gt;Set_Block("在set_file中定义的","&lt;!-- 来自模板 --&gt;","随便定义"); </p>
		<p>　　$T-&gt;Parse("在Set_Block中定义的","&lt;!-- 来自模板 --&gt;",true); </p>
		<p>　　$T-&gt;Parse("随便输出结果","在Set_File中定义的"); <br />　　设置循环格式为:<br />　　&lt;!--(多于一个空格) BEGIN $handle(多于一个空格)--&gt;<br />　　如何将模板生成静态网页</p>
		<p>
				<br />　　PHP代码:</p>
		<p>　　&lt;?php</p>
		<p>　　//这里使用phplib模板</p>
		<p>　　............</p>
		<p>　　............</p>
		<p>　　$tpl-&gt;parse("output","html");</p>
		<p>　　$output = $tpl-&gt;get("output");// $output 为整个网页内容</p>
		<p>
				<br />　　function wfile($file,$content,$mode='w') {</p>
		<p>　　$oldmask = umask(0);</p>
		<p>　　$fp = fopen($file, $mode);</p>
		<p>　　if (!$fp) return false;</p>
		<p>　　fwrite($fp,$content);</p>
		<p>　　fclose($fp);</p>
		<p>　　umask($oldmask);</p>
		<p>　　return true;</p>
		<p>　　}</p>
		<p>　　// 写到文件里</p>
		<p>　　Wfile($FILE,$output);</p>
		<p>　　header("location:$FILE");//重定向到生成的网页</p>
		<p>　　}</p>
		<p>　　?&gt; <br />　　phplib下载地址 smarty下载地址 </p>
		<p>
				<br />31:怎么用php解释字符　　　</p>
		<p>　　比如:输入2+2*(1+2),自动输出8　　可以用eval函数</p>
		<p>　　PHP代码:</p>
		<p>　　&lt;form method=post action=""&gt;</p>
		<p>　　&lt;input type="text" name="str"&gt;&lt;input type="submit"&gt;</p>
		<p>　　&lt;/form&gt;</p>
		<p>　　&lt;?php</p>
		<p>　　$str=$_POST['str'];</p>
		<p>　　eval("\$o=$str;");</p>
		<p>　　Echo "$o";</p>
		<p>　　?&gt;</p>
		<p>
				<br />　　到此，php的问题解答就为大家介绍完毕，希望能对各位有所帮助。<br /></p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/62766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-08-10 12:19 <a href="http://www.blogjava.net/jackstudio/archive/2006/08/10/62766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHPliB类详解</title><link>http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 10 Aug 2006 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/62765.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/62765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/62765.html</trackback:ping><description><![CDATA[
		<strong>转载：<a href="http://bbs.cnaust.com/archiver/?tid-4849.html">http://bbs.cnaust.com/archiver/?tid-4849.html</a><br /><br />PHPliB类详解<br /><br /></strong>自已的BLOG空间打不开了，放些资料在这。<br /><br /><br />&lt;?php  <br />/*  <br />* PHPlib模板7.4中文版(不足之处还请各位指正)  <br />* (C) Copyright 1999-2000 NetUSE GmbH  <br />* Kristian Koehntopp  <br />* 彭赞群注释于2004年6月,QQ:9537075 TEL:13787877670  <br />* Email:mylovepzq@163.com  <br />*/  <br /><br /><br />/*这里是定义类Template*/  <br />class Template  <br />{   <br />/* 如果设置了，则输出参数 */  <br />var $classname = "Template";  <br />var $debug = false; //是否调试  <br />var $root = ".";//root为模板文件的存放目录  <br />var $file = array(); //包含了所有的模板文件名和模板名的数组  <br />var $varkeys = array(); //存放文本元素的键名  <br />var $varvals = array(); //存放文本元素的值  <br />var $unknowns = "remove";   <br />/* "remove" =&gt; 删除未定义的变量 "comment" =&gt; 将未定义的变量变成注释 "keep" =&gt; 保留未定义的变量 */  <br />var $halt_on_error = "yes";  <br />/* "yes" =&gt; 退出 "report" =&gt; 报告错误，继续运行* "no" =&gt; 忽略错误*/  <br />var $last_error = "";  <br />/* 上一次的错误保存在这里 */  <br />/* public: 构造函数  <br />* root: 模板目录  <br />* unknowns: 如何处理未知的变量(译者：变量定义为{ name })  <br />*/  <br /><br /><br />/*这里是定义函数Template*/  <br />function Template($root = ".", $unknowns = "remove")   <br />{   <br />if ($this-&gt;debug &amp; 4)   <br />{   <br />echo "&lt;p&gt;&lt;b&gt;模板:&lt;/b&gt; root = $root, unknowns = $unknowns&lt;/p&gt;\n";  <br />}  <br />$this-&gt;set_root($root);//默认将文件目录设置为相同的目录  <br />$this-&gt;set_unknowns($unknowns);//unknowns默认设置为"remove"  <br />}  <br /><br /><br />/*这里是函数set_root*/  <br />function set_root($root)  <br />{   <br />if ($this-&gt;debug &amp; 4)   <br />{   <br />echo "&lt;p&gt;&lt;b&gt;设置根目录:&lt;/b&gt; root = $root&lt;/p&gt;\n";  <br />}  <br />if (!is_dir($root))  <br />{   <br />$this-&gt;halt("设置根目录: $root 不是一个无效的目录.");  <br />return false;  <br />}  <br />$this-&gt;root = $root;  <br />return true;  <br />}  <br /><br /><br />//这里是函数set_unknowns,即对未知变量的处理  <br />function set_unknowns($unknowns = "remove")  <br />{   <br />if ($this-&gt;debug &amp; 4)  <br />{   <br />echo "&lt;p&gt;&lt;b&gt;未知的:&lt;/b&gt; 未知 = $unknowns&lt;/p&gt;\n";  <br />}  <br />$this-&gt;unknowns = $unknowns;  <br />}  <br /><br /><br />/*这里是函数set_file.......................................................*/  <br />//该方法在数组file中根据$varname提供的键名加入值  <br />function set_file($varname, $filename = "")  <br />{   <br />if (!is_array($varname))//如果varname是数组  <br />{   <br />if ($this-&gt;debug &amp; 4)  <br />{   <br />echo "&lt;p&gt;&lt;b&gt;设置文件:&lt;/b&gt; (with scalar) varname = $varname, filename = $filename&lt;/p&gt;\n";  <br />}  <br />if ($filename == "")//如果文件名为空,输出错误  <br />{   <br />$this-&gt;halt("设置文件:变量名 $varname 文件名是空的.");  <br />return false;  <br />}  <br />$this-&gt;file[$varname] = $this-&gt;filename($filename);  <br />}   <br />else  <br />{   <br />reset($varname);//将varname的键名作为file数组的键名  <br />//将键名对应的值作为file数组的值  <br />while(list($v, $f) = each($varname))  <br />{   <br />if ($this-&gt;debug &amp; 4)  <br />{   <br />echo "&lt;p&gt;&lt;b&gt;set_file:&lt;/b&gt; (with array) varname = $v, filename = $f&lt;/p&gt;\n";  <br />}  <br />if ($f == "")  <br />{   <br />$this-&gt;halt("set_file: For varname $v filename is empty.");  <br />return false;  <br />}  <br />$this-&gt;file[$v] = $this-&gt;filename($f);  <br />}  <br />}  <br />return true;  <br />}  <br /><br /><br />//该方法取出某个父模板文件中的一个子模板  <br />//将其作为块来加载  <br />//并用另外一个模板变量取代之  <br />/* public: set_file(array $filelist)  <br />* comment: 设置多个模板文件  <br />* filelist: （句柄，文件名）数组  <br />* public: set_file(string $handle, string $filename)  <br />* comment: 设置一个模板文件  <br />* handle: 文件的句柄  <br />* filename: 模板文件名  <br />*/  <br />function set_block($parent, $varname, $name = "") {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;set_block:&lt;/b&gt; parent = $parent, varname = $varname, name = $name&lt;/p&gt;\n";  <br />}  <br />if (!$this-&gt;loadfile($parent)) {   <br />$this-&gt;halt("set_block: unable to load $parent.");  <br />return false;  <br />}  <br />if ($name == "") {   <br />$name = $varname;//如果没有指定模板变量的值就用子模板名作为模板变量名  <br />}  <br /><br />$str = $this-&gt;get_var($parent);  <br />$reg = "/[ \t]*&lt;!--\s+BEGIN $varname\s+--&gt;\s*?\n?(\s*.*?\n?)\s*&lt;!--\s+END $varname\s+--&gt;\s*?\n?/sm";  <br />preg_match_all($reg, $str, $m);  <br />$str = preg_replace($reg, "{ " . "$name }", $str);  <br />$this-&gt;set_var($varname, $m[1][0]);  <br />$this-&gt;set_var($parent, $str);  <br />return true;  <br />}  <br /><br /><br />//该方法向Varname和varkeys数组中添加新的键一值对  <br />/* public: set_var(array $values)  <br />* values: (变量名，值)数组  <br />* public: set_var(string $varname, string $value)  <br />* varname: 将被定义的变量名  <br />* value: 变量的值  <br />*/  <br />function set_var($varname, $value = "", $append = false) {   <br />if (!is_array($varname))//如果不是阵列  <br />{   <br />if (!empty($varname)) //如果是空的  <br />{   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;set_var:&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $varname, htmlentities($value));  <br />}  <br />$this-&gt;varkeys[$varname] = "/".$this-&gt;varname($varname)."/";  <br />if ($append &amp;&amp; isset($this-&gt;varvals[$varname])) {   <br />$this-&gt;varvals[$varname] .= $value;  <br />} else {   <br />$this-&gt;varvals[$varname] = $value;  <br />}  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (!empty($k)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;set_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $k, htmlentities($v));  <br />}  <br />$this-&gt;varkeys[$k] = "/".$this-&gt;varname($k)."/";  <br />if ($append &amp;&amp; isset($this-&gt;varvals[$k])) {   <br />$this-&gt;varvals[$k] .= $v;  <br />} else {   <br />$this-&gt;varvals[$k] = $v;  <br />}  <br />}  <br />}  <br />}  <br />}  <br /><br /><br />//定义函数clear_var  <br />function clear_var($varname) {   <br />if (!is_array($varname))//如果varname不是阵列  <br />{   <br />if (!empty($varname)) //如果是空的  <br />{   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;clear_var:&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $varname);  <br />}  <br />$this-&gt;set_var($varname, "");  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (!empty($v)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;clear_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $v);  <br />}  <br />$this-&gt;set_var($v, "");  <br />}  <br />}  <br />}  <br />}  <br /><br /><br />/*这里是函数unset_var,删除变量的定义*/  <br />function unset_var($varname) {   <br />if (!is_array($varname)) {   <br />if (!empty($varname)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;unset_var:&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $varname);  <br />}  <br />unset($this-&gt;varkeys[$varname]);  <br />unset($this-&gt;varvals[$varname]);  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (!empty($v)) {   <br />if ($this-&gt;debug &amp; 1) {   <br />printf("&lt;b&gt;unset_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt;&lt;br&gt;\n", $v);  <br />}  <br />unset($this-&gt;varkeys[$v]);  <br />unset($this-&gt;varvals[$v]);  <br />}  <br />}  <br />}  <br />}  <br /><br /><br />//将模板文件中的变化内容替换成确定内容的操作,实现数据和显示的分离  <br />function subst($varname) {   <br />$varvals_quoted = array();  <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;subst:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br />if (!$this-&gt;loadfile($varname)) //装载模板文件,如果出错就停止  <br />{   <br />$this-&gt;halt("subst: unable to load $varname.");  <br />return false;  <br />}  <br /><br />reset($this-&gt;varvals);  <br />while(list($k, $v) = each($this-&gt;varvals)) {   <br />$varvals_quoted[$k] = preg_replace(array(’/\\\\/’, ’/\$/’), array(’\\\\\\’, ’\\\\$’), $v);  <br />}  <br /><br />//读入文件内容到字符串中并在下行对已知键值进行替换并返回结果  <br />$str = $this-&gt;get_var($varname);  <br />$str = preg_replace($this-&gt;varkeys, $varvals_quoted, $str);  <br />return $str;  <br />}  <br /><br /><br />//同subst,只是直接输出结果  <br />function psubst($varname) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;psubst:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br />print $this-&gt;subst($varname);  <br /><br />return false;  <br />}  <br /><br /><br />//将varname代表的一个或多个文件中的内容完成替换  <br />//存放在target为键值的varvals数组无素中或追加到其后  <br />//返回值和sub相同  <br />function parse($target, $varname, $append = false) {   <br />if (!is_array($varname)) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;parse:&lt;/b&gt; (with scalar) target = $target, varname = $varname, append = $append&lt;/p&gt;\n";  <br />}  <br />$str = $this-&gt;subst($varname);  <br />if ($append) {   <br />$this-&gt;set_var($target, $this-&gt;get_var($target) . $str);  <br />} else {   <br />$this-&gt;set_var($target, $str);  <br />}  <br />} else {   <br />reset($varname);  <br />while(list($i, $v) = each($varname)) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;parse:&lt;/b&gt; (with array) target = $target, i = $i, varname = $v, append = $append&lt;/p&gt;\n";  <br />}  <br />$str = $this-&gt;subst($v);  <br />if ($append) {   <br />$this-&gt;set_var($target, $this-&gt;get_var($target) . $str);  <br />} else {   <br />$this-&gt;set_var($target, $str);  <br />}  <br />}  <br />}  <br /><br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;parse:&lt;/b&gt; completed&lt;/p&gt;\n";  <br />}  <br />return $str;  <br />}  <br /><br /><br />//同parse方法,只是该方法将结果输出  <br />function pparse($target, $varname, $append = false) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;pparse:&lt;/b&gt; passing parameters to parse...&lt;/p&gt;\n";  <br />}  <br />print $this-&gt;finish($this-&gt;parse($target, $varname, $append));  <br />return false;  <br />}  <br /><br /><br />//返回所有的键一值对中的值所组成的数组  <br />function get_vars() {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;get_vars:&lt;/b&gt; constructing array of vars...&lt;/p&gt;\n";  <br />}  <br />reset($this-&gt;varkeys);  <br />while(list($k, $v) = each($this-&gt;varkeys)) {   <br />$result[$k] = $this-&gt;get_var($k);  <br />}  <br />return $result;  <br />}  <br /><br /><br />//根据键名返回对应的键一值勤对应的值  <br />function get_var($varname) {   <br />if (!is_array($varname)) //如果不是阵列  <br />{   <br />if (isset($this-&gt;varvals[$varname])) //如果变量不存在  <br />{   <br />$str = $this-&gt;varvals[$varname];  <br />} else {   <br />$str = "";  <br />}  <br />if ($this-&gt;debug &amp; 2) {   <br />printf ("&lt;b&gt;get_var&lt;/b&gt; (with scalar) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $varname, htmlentities($str));  <br />}  <br />return $str;  <br />} else {   <br />reset($varname);  <br />while(list($k, $v) = each($varname)) {   <br />if (isset($this-&gt;varvals[$v])) {   <br />$str = $this-&gt;varvals[$v];  <br />} else {   <br />$str = "";  <br />}  <br />if ($this-&gt;debug &amp; 2) {   <br />printf ("&lt;b&gt;get_var:&lt;/b&gt; (with array) &lt;b&gt;%s&lt;/b&gt; = ’%s’&lt;br&gt;\n", $v, htmlentities($str));  <br />}  <br />$result[$v] = $str;  <br />}  <br />return $result;  <br />}  <br />}  <br /><br /><br />//如果加载文件失败,返回错误并停止  <br />function get_undefined($varname) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;get_undefined:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br />if (!$this-&gt;loadfile($varname)) {   <br />$this-&gt;halt("get_undefined: unable to load $varname.");  <br />return false;  <br />}  <br /><br />preg_match_all("/{ ([^ \t\r\n }]+) }/", $this-&gt;get_var($varname), $m);  <br />$m = $m[1];  <br />//如果无法找到匹配的文本,返回错误  <br />if (!is_array($m)) {   <br />return false;  <br />}  <br />//如果能找到大括号中的非空字符,则将其值作为键值,组成一个新的数组  <br />reset($m);  <br />while(list($k, $v) = each($m)) {   <br />if (!isset($this-&gt;varkeys[$v])) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;get_undefined:&lt;/b&gt; undefined: $v&lt;/p&gt;\n";  <br />}  <br />$result[$v] = $v;  <br />}  <br />}  <br />//如是该数组不为空就返回该数组,否则就返回错误  <br />if (count($result)) {   <br />return $result;  <br />} else {   <br />return false;  <br />}  <br />}  <br /><br /><br />//完成对str的最后的处理工作,利用类的属性unknowns来确定对模板中无法处理的动态部分的处理方法  <br />function finish($str) {   <br />switch ($this-&gt;unknowns) {   <br />case "keep": //保持不变  <br />break;  <br /><br />case "remove": //删除所有的非控制符  <br />$str = preg_replace(’/{ [^ \t\r\n }]+ }/’, "", $str);  <br />break;  <br /><br />case "comment"://将大括号中的HTML注释  <br />$str = preg_replace(’/{ ([^ \t\r\n }]+) }/’, "&lt;!-- Template variable \\1 undefined --&gt;", $str);  <br />break;  <br />}  <br /><br />return $str;  <br />}  <br /><br /><br />//将参数变量对诮的数组中的值处理后输出  <br />function p($varname) {   <br />print $this-&gt;finish($this-&gt;get_var($varname));  <br />}  <br /><br /><br />//将参数变量对应的数组中的值处理后返回  <br />function get($varname) {   <br />return $this-&gt;finish($this-&gt;get_var($varname));  <br />}  <br /><br /><br />//检查并补充给定的文件名  <br /><br />function filename($filename) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;filename:&lt;/b&gt; filename = $filename&lt;/p&gt;\n";  <br />}  <br />if (substr($filename, 0, 1) != "/")   <br />//如果文件名不是以斜杠开头,则表示是相对路径,将其补充为完整的绝对路径   <br />{   <br />$filename = $this-&gt;root."/".$filename;  <br />}  <br />//如果文件不存在  <br />if (!file_exists($filename)) {   <br />$this-&gt;halt("filename: file $filename does not exist.");  <br />}  <br />return $filename;//返回文件名  <br />}  <br /><br /><br />//对变量名进行处理,将正则表达式中的敏感字符变为转义字符,并在变量名两端加上大括号  <br />function varname($varname) {   <br />return preg_quote("{ ".$varname." }");  <br />}  <br /><br /><br />//该方法根据varname加载文件到键一值对中  <br />function loadfile($varname) {   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;loadfile:&lt;/b&gt; varname = $varname&lt;/p&gt;\n";  <br />}  <br /><br />if (!isset($this-&gt;file[$varname])) //如果没有指定就返加错误  <br />{   <br />// $varname does not reference a file so return  <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;loadfile:&lt;/b&gt; varname $varname does not reference a file&lt;/p&gt;\n";  <br />}  <br />return true;  <br />}  <br /><br />if (isset($this-&gt;varvals[$varname]))//如果已经加载了varname为名柄的文件,直接返回真值  <br />{   <br />if ($this-&gt;debug &amp; 4) {   <br />echo "&lt;p&gt;&lt;b&gt;loadfile:&lt;/b&gt; varname $varname is already loaded&lt;/p&gt;\n";  <br />}  <br />return true;  <br />}  <br />$filename = $this-&gt;file[$varname];//句柄有效则取出对应的文件名  <br />$str = implode("", @file($filename));//将文件的每一行连接成一个字符串  <br />if (empty($str)) //字符串空说明文件空或者不存在,返回错误  <br />{   <br />$this-&gt;halt("loadfile: While loading $varname, $filename does not exist or is empty.");  <br />return false;  <br />}  <br />if ($this-&gt;debug &amp; 4) {   <br />printf("&lt;b&gt;loadfile:&lt;/b&gt; loaded $filename into $varname&lt;br&gt;\n");  <br />}  <br />$this-&gt;set_var($varname, $str);//如果文件不为空,用$varname作为句柄,str为变量名  <br />//向键值对中添加新的键值  <br /><br />return true;  <br />}  <br /><br />//将分析结果保存到文件中去  <br />  function savetofile ($dir,$varname){   <br />   $data=$this-&gt;finish($this-&gt;get_var($varname));  <br />   $fp=fopen($dir,"w+");  <br />   fwrite($fp,$data);  <br />  }  <br /><br /><br />  //清除已赋值数组  <br />   function renew(){   <br />    $this-&gt;varkeys=array();  <br />    $this-&gt;varvals=array();  <br />    $this-&gt;file=array();  <br />    }  <br /><br /><br />//出错提示并终止程序运行  <br />function halt($msg) {   <br />$this-&gt;last_error = $msg;  <br /><br />if ($this-&gt;halt_on_error != "no") {   <br />$this-&gt;haltmsg($msg);  <br />}  <br /><br />if ($this-&gt;halt_on_error == "yes") {   <br />die("&lt;b&gt;终止.&lt;/b&gt;");  <br />}  <br /><br />return false;  <br />}  <br /><br /><br />//出错提示  <br />function haltmsg($msg) {   <br />printf("&lt;b&gt;模板错误:&lt;/b&gt; %s&lt;br&gt;\n", $msg);  <br />}  <br /><br />}  <br />?&gt;<br /><br /><br /><br /><br /><strong>SOLO</strong><div class="subtable altbg2 t_msg">PHPLIB Template类的使用的.诚然,网络上已经很多相关的话题了,但据我观察,中文的资料实在不多,且大多是讲的太笼统,没能全面阐述它的用法,即使看了还是一知半解.所以本文就期望通过对它的比较全面的介绍,让你能达到入门的水平. <br />何谓"模板"技术<br /><br />我们的最初观察是将界面和实现代码分离开来,这样做的目的是将美工和程序员的工作分离开来.PHP的一个优点是可以把PHP代码嵌入HTML里面,这样你就不必再把大段HTML代码用函数print()输出来.<br />print("&lt;table border=0 cellspacing=1 cellpadding=2 width=100%&gt;"); <br />print("&lt;tr&gt;"); <br />print("&lt;td&gt;"); <br />print("我爱你 kiki"); <br />print("&lt;/td&gt;"); <br />print("&lt;/tr&gt;"); <br />print("&lt;/table&gt;"); <br />这段代码对界面维护来说是相当困难的,除非程序员做这样事情且他对样式表,HTML非常精通.取而代之的我们用<br />&lt;table border=0 cellspacing=1 cellpadding=2 width=100%&gt; <br />    &lt;tr&gt; <br />        &lt;td&gt; <br />            &lt;?php print("我爱你 kiki ");?&gt; <br />        &lt;/td&gt; <br />    &lt;/tr&gt; <br />&lt;/table&gt; <br />这样,做美工设计的只要不碰PHP代码,就可以很方便地改变这个表格的样式,如果使用dreamweaver等所见即所的工具,将会更加方便.<br /><br />现在的一个问题是,如果美工正在修改的话,程序员仍需要把这个文件取回来,才能改变里面的PHP代码,修改完后再交给美工,这样循环往复,往往要花费大量的时间和精力,如果你所在公司是采取这种模式的话,恐怕老板为了节省时间,会把很多界面设计也交给程序员来做,毕竟他不会让你们任何一个闲座着等待.作为程序员的你此时可能会梦想:如果程序员只要负责写程序代码,不理会令人烦躁的界面,那就太好了.<br /><br />或许Fast Template诞生那刻起(我不敢确定它是最早的PHP模板处理类,但用起来确实很方便),你的梦想就几近实现.策划们把东西交给你,当然里面的元素都写好了的,形如以下tpl.html<br />&lt;table border=0 cellspacing=1 cellpadding=2 width=100%&gt; <br />    &lt;tr&gt; <br />        &lt;td&gt; <br />            我爱你{MY_LOVE} <br />        &lt;/td&gt; <br />    &lt;/tr&gt; <br />&lt;/table&gt; <br />你只需要在程序里给这些元素(MY_LOVE)赋值就行了tpl.php<br />    $tpl-&gt;assign("MY_LOVE", "kiki"); <br />你基本上不用管这些元素的样式(比如字体,宽度,高度等),所在位置,甚至这些元素将来可能不再使用了.与此同时,美工那边把元素放进一个HTML页面里(这个页面就是我们所说的"模板"),他也不用担心会不小心把你的程序给搞坏了.然后做完后交给一个专门负责程序和美工结合的人(当然在国内也是程序员做这样事情),他很可能只需要很小的几个修改就可以把两者结合的很好.这样对你,对美工,都大大提高了工作效率,老板自然也会很高兴啦.<br /><br />所以我这里所说的"模板"技术,就是可以将程序和美工分离的技术,注意不是逻辑抽象层与表现层的分离.一来,那样将会让人不知所云,因为"逻辑抽象"这四个字就已经太抽象了,且表现层并只是美工所做的模板.所以,很多人试图把Fast Template,PHPLIB Template两个与Smarty相比较,在我看来,这是明显不对的.<br /><br />PHPLIB Template类也是一个用PHP代码处理模板的一个类.也是本文要将要阐述的一个模板类.同上面讲的一样,它能把模板中的"元素"替换为你为它设定的值",且处理的很很好,也容易扩展,由于使用了preg_函数,所以速度也比较快.很多人都会提出一个意见:使用模板会让你的代码运行的更慢,确实是这样的,如果你使用嵌入式写法,会快一些,如果把PHP连同HTML全部写入PHP里(用 print("&lt;html标签&gt;"); ),可能会更快.但如果综合考虑整个项目的开发效率,以及后期维护性的话,这些代价是可以承受的,而且慢也不会慢哪里去,真正的问题所在可能是你的模板实在是太大了.当然,你也可以改进这个模板类,让它运行的更快.<br /><br />提起PHPLIB Template,很多人自然会联想起Fast Template来,我也不例外,因为两者很多地方都很相近.对此,很多人都做了比较,在这里我就不再详述了,或许王晨的这篇文章值得一看: 在PHP世界中选择最合适的模板<br /><br /><br />获取<br /><br />可以从这里下载 [url]http://www.sanisoft.com/phplib/download.phpPHPLIB[/url] ,然后从压缩包中php目录下取出template.inc,就可以供我们使用了.<br /><br />文档<br /><br />英文文档 [url]http://www.sanisoft.com/phplib/manual/template.php[/url] <br />我翻译的中文文档(仅做参考) [url]http://www.4kiki.net/php_lib_template/[/url] <br />还有网上的很多资源,可以通过google搜索得到.<br /><br />从类里面注释可以知道,最新版本是2002/07/11 22:29:51的1.12版,所以,你或许需要修改一些东西,在你懂的前提下.我们还可以下载它的PEAR集成版本([url]http://pear.php.net/package/HTML_Template_PHPLIB/download)[/url] , 不过你的PHP版本需要在4.3.0以上.<br /><br /><br /><br /><br /><div class="subtable altbg1"><span class="right">2005-11-8 23:19</span><b>SOLO</b></div><div class="subtable altbg2 t_msg">一个封装很好的类对使用者(可能不是开发者本人)来说,最大的好处就是,你无需知道类内部是怎么运作的,只需知道如何利用它提供的接口做你想做的事情即可.所以,本文不打算具体讲述PHPLIB Template(以下简称Template)是如何将"元素"转换成"值"的,你需要了解的是"它能这样做",而不是"它为什么能这样做". <br />好了,下面我们就开始它的第一个应用了.<br /><br />先在我们要测试的网站的目录下建两个文件夹inc和template.目录inc下放引用文件,比如类库,函数库等,这里我们就把template.inc放如该目录下.tempate下放模板文件,我们先建一个模板文件first.html,内容如下<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第一个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />真想对你说：我爱你 {lover} ，但我却不敢说，因为我知道你爱的人是 {man}. <br />&lt;P&gt; <br />&lt;font color="#0000FF"&gt;{author}&lt;/font&gt; 于 {date} <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br />用inc,template命名文件目录,都是我的个人习惯,你完全可以采取不同的方式.我用扩展名为.html的名称命名模板文件,是为了方便美工用frontpage或者dreamweaver修改,但这完全取决于你自己的习惯.<br /><br />first.html模板中的{lover},{man},{author}可以称为"模板变量",用花括号({})把变量名称括住即组成一个模板变量.模板变量就是模板元素的一种。你可能会担心它的命名问题,其实除了空格(" "),回车换行("\r", "\n"),tab(\t)外它都被视为是正确的.所以<br />{your-lover}<br />也是正确的.这点有时可能会令你很痛苦,因为模板里的有些javascript代码可能无意间变没有了,比如<br />if(a&gt;b){document.write("i love u");}<br />中的<br />{document.write("i love u");}<br />也被视为一个变量了.上面的代码在你选的模板处理方式下,可能会变成if(a&gt;b){},从而导致javascript错误.为什么会"变没"了呢?稍后将做解释.<br /><br />上面我们定义的三个变量{lover},{man},{author}的原因是,我们想随时改变它们的值.下面我们就来做这个工作.新建first.php文件,内容如下:<br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template", "keep"); //注1 <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "first.html"); //注2 <br /><br />//给文件中的模板变量赋值 <br />$tpl-&gt;set_var("lover", "kiki"); //注3 <br />$tpl-&gt;set_var("man", "ccterran"); //注4 <br />$tpl-&gt;set_var("author", "iwind"); //注5 <br /><br />//完成替换 <br />$tpl-&gt;parse("mains", "main"); //注6 <br /><br />//输出替换的结果 <br />$tpl-&gt;p("mains"); //注7 <br /><br />?&gt; <br />浏览器中浏览这个文件,你就会发现输出<br /><br /><br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br /><br />iwind 于 {date} <br /><br /><br />这一切正如我们所期望的(除了{date}).注1<br />$tpl = new Template("template", "keep"); <br />是创建一个Template类的实例对象.它有两个参数,都是可选的.<br /><br />第一个参数是模板所在目录,如果不设置则为"."(即当前目录),由于我们刚才把模板文件first.html放到template下了,所以这里为template.注意它一般使用相对路径,如果你用相对于根目录(比如 /phplib/test/template)的路径,就会出现<br />Template Error: set_root: /phplib/test/template is not a directory. <br />Halted. <br />的错误.<br /><br />第二个参数是指定模板类对"未完成处理"变量的处理方式,所谓"未完成处理"指的是模板变量未赋值,块未完成替换工作(下面一节将讲到它),它有三个值可选,分别为"keep","comment","remove":<br />如果设为"keep",这些变量将原封不动的保留下来.<br />如果设为"comment",那么会在报错的同时,将未完成处理的变量全部转换成HTML的注释.<br />如果设为"remove",未完成处理的变量便会被删除(这也是默认的情况).<br /><br />所以在上面的例子中,我指定的是"keep",于是{date}因为未赋值,所以还保留着.而缺省的情况下是"remove",所以,如果我这样创建实例对象<br />$tpl = new Template("template", "remove");<br />或者<br />$tpl = new Template("template");<br />的话,输出就变成了<br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br /><br />iwind 于<br /><br /><br /><br />可以看出{date}被删除了.如果是<br />$tpl = new Template("template", "comment");<br /><br />它的结果将是<br /><br /><br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br /><br />iwind 于<br /><br /><br />看起来和"remove"方式一样,但查看源文件,我们会发现<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第一个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />真想对你说：我爱你 kiki ，但我却不敢说，因为我知道你爱的人是 ccterran. <br />&lt;P&gt; <br />&lt;font color="#0000FF"&gt;iwind&lt;/font&gt; 于 &lt;!-- Template variable date undefined --&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />其中有&lt;!-- Template variable date undefined --&gt;的错误信息,告诉我们date变量未定义(赋值).<br /><br />用"comment"或许对程序的调试很有帮助.<br /><br />我们再回头看看<br />if(a&gt;b){document.write("i love u");} <br />中<br />{document.write("i love u");} <br />会"变没"的问题,是因为模板类视之为模板变量,但你没有给它指定值(当然会没有),且你没有指定"keep"方式来处理未定义变量,所以它就被"remove"了.<br /><br />所以在模板使用过程中应该多多注意这些问题.<br /><br />注2是将一个模板文件加载进来,事实上你可以一次加载多个模板(在第四节将讲到这个问题).你可以想象<br />$tpl-&gt;set_file("main", "first.html"); <br />把"first.html"内容给变量"main"(尽管很多人称之为"句柄",但本文决定不谈"句柄"),所以"main"的值就变成模板的内容了,包含着那些模板变量.<br /><br />注3,注4,注5,是给模板变量赋值.值是什么,你自然可以随便定.比如你还可以<br />$tpl-&gt;set_var("lover", "kiki1"); <br />$tpl-&gt;set_var("man", "ccterran1"); <br />$tpl-&gt;set_var("author", "iwind_php"); <br />你也可以一次完成给一列的变量赋值.这样<br />$tpl-&gt;set_var( <br />array("lover"=&gt;"kiki", "man"=&gt;"ccterran", "author"=&gt;"iwind") <br />); <br />如果你想设置一个变量的值为空的话,可以<br />$tpl-&gt;set_var("man", ""); <br />或者<br />$tpl-&gt;set_var("man"); <br /><br />注6,是执行将上面$tpl-&gt;set_var给模板变量指定的值替换掉模板中的模板变量这个操作,第一个参数即为模板分析的结果,也可以视为一个变量.<br /><br />当然注7的 $tpl-&gt;p("mains"); 就将模板分析的结果如你所愿的输出啦.<br /><br />喏,恭喜你,你的第一个模板类应用就完成了.你可能不小心弄错了哪个地方,模板类默认情况下会自动打印出错误提示的,根据这些提示,你就很容易就可以找出问题所在,在第6节将会具体讲到.<br /><br /><br /><strong>SOLO</strong><div class="subtable altbg2 t_msg">PHPLIB Template入门系列 - 3 块的应用 <br />在上一节中,我们知道模板元素的一种:模板变量,并知道如何在程序中给它赋值,使之呈现我们想要的东西.这对一般的简单网页来说,或许就已经够用了.现在我们设想一稍微复杂的一种情况,在template目录下新建一个second.html模板文件,内容为:<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; &lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;li&gt;张三 的成绩是 82 <br />&lt;li&gt;李四 的成绩是 90 <br />&lt;li&gt;王儿 的成绩是 60 <br />&lt;li&gt;麻子 的成绩是 77 <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br />上面的列表中列出了"张三","李四","王二","麻子"四人的成绩.假设要用PHP代码嵌入HTML的方式输出的话,你可能是这样写的:<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;?php <br />$result = mysql_query("SELECT username,score FROM my_tbl"); <br />?&gt; <br />&lt;UL&gt; <br />&lt;?php <br />while ($row = mysql_fetch_array($result)) <br />{ <br />?&gt; <br />&lt;li&gt;&lt;?=$row["username"]?&gt; 的成绩是 &lt;?=$row["score"]?&gt; <br />&lt;?php <br />} <br />?&gt; <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />这样写很适合PHP新手,但你很快发现你或者美工改这个列表样式的时候需要多么的小心翼翼,特别是美工,如果他不懂你写得PHP代码,那么他会终日生在恐惧之中!因为稍微的不小心,可能就会带来程序的运行错误.而且如果他想把这个列表从一个地方移到另一个地方,也是相当不容易的.于是作为程序员的你不得不把美工（虽然你做的可能性更大）修饰过的页面重新审查一次，无形中就造成费时费力。<br /><br />现在好了,有了Template模板类,你可以把你的代码从模板中抽取出来了.你可能会这样修改second.html模板:<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;li&gt;{username1} 的成绩是 {score1} <br />&lt;li&gt;{username2} 的成绩是 {score2} <br />&lt;li&gt;{username3} 的成绩是 {score3} <br />&lt;li&gt;{username4} 的成绩是 {score4} <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />显然,你采取了一个良好的命名方式,用1,2,3..来表示每一行数据,然后你在你的程序里循环给这些变量赋值,也是不难的,比如:(second.php)<br /><br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "first.html"); <br /><br />//连接数据库，选择数据库略 <br />省略..... <br /><br />//查询结果 <br />$result = mysql_query("SELECT username,score FROM my_tbl"); <br /><br />//给文件中的模板变量赋值 <br />$i=0; <br />while ($row = $idb-&gt;fetch_array($result)) <br />{ <br />$i++; <br />$tpl-&gt;set_var("username" . $i, $row["username"]); <br />$tpl-&gt;set_var("score" . $i, $row["score"]); <br />} <br /><br />//完成替换 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;pparse("mains", "main"); <br /><br />?&gt; <br /><br />这样你也能得到正确结果.在特殊情况下你或许需要这样做.但Template提供了一个更方便的"大的模板变量",那就是块.我之所以称之为"大的模板变量",是因为它也可以视为可以包含其他模板变量的变量.形式如<br />&lt;UL&gt; <br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />&lt;/UL&gt; <br /><br />即用&lt;!-- BEGIN 块名称 --&gt;和&lt;!-- END 块名称 --&gt;定义了一个名为list的块,(注意:我在这里为了方便理解,只称之为块名称).这个块里面又包含一些HTML代码(&lt;li&gt;等等)以及模板变量({username},{score}).<br /><br />在讲述如何用块输出列表之前,我们先谈一下块的定义格式.<br /><br />首先&lt;!-- BEGIN list --&gt;和&lt;!-- END list --&gt; 都要各自为一行,亦即下面的块的定义是错误的<br />1,<br />同行的 &lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />2,<br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; 同行的 <br /><br />&lt;!--和--&gt;都是固定的,也就是说只能是两个中划线("-"),且它们与BEGIN list之间都至少有一个空(空格或tab),看下面的例子<br />&lt;!--BEGIN list --&gt; <br />&lt;!-- BEGIN list--&gt; <br />它们都是错误的块的定义方法,因为第一个&lt;!--与BEGIN之间至少应该有一个空,第二个--&gt;与list之间至少有一个空.<br /><br />BEGIN/END和list之间也应该有一个空格,注意是有且仅有一个空格,不能多也不能少.<br /><br />块的名称建议你只使用字符,数字,下划线以及它们的组合.<br /><br />BEGIN和END两个词语都应该是大写的。<br /><br />好了,下面开始探讨如何是这个块变成一个列表.我们可以这样<br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "second.html"); <br /><br />//加载块list <br />$tpl-&gt;set_block("main", "list", "lists"); <br /><br />//连接数据库，选择数据库略 <br />省略..... <br /><br />//查询结果 <br />$result = mysql_query("SELECT username,score FROM my_tbl"); <br /><br />//给文件中的模板变量赋值 <br />while ($row = $idb-&gt;fetch_array($result)) <br />{ <br />$tpl-&gt;set_var("username", $row["username"]); <br />$tpl-&gt;set_var("score", $row["score"]); <br />$tpl-&gt;parse("lists", "list", true); <br />} <br /><br />//完成替换 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;pparse("mains", "main"); <br /><br />?&gt; <br /><br />记住把你的数据库连接写在我省略的部分,就可以打印正确的结果,一如<br /><br />下面是一个列表 <br /><br />张三 的成绩是 82 <br />李四 的成绩是 90 <br />王儿 的成绩是 60 <br />麻子 的成绩是 77 <br /><br /><br /><br />可以看到在PHP代码里有两个东西 <br />$tpl-&gt;set_block("main", "list", "lists"); //代码1 <br />$tpl-&gt;parse("lists", "list", true); <br />就不可思议的将整个块循环输出了.代码1用来加载模板main中的块list,并给其一个名字lists,list就是模板中的一个大变量,它的内容就是&lt;li&gt;{username} 的成绩是 {score}即:<br />"list" = "&lt;li&gt;{username} 的成绩是 {score}" <br />之所以用lists命名,是为了程序的可读性,也就是说我很容易就知道XXXs是XXX块的名称.<br /><br />使用set_block后，模板中的块内容<br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />就被lists代替了.于是我们的模板就变成了<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; 我的第二个模板文件 &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />{lists} <br />&lt;/UL&gt; <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />块变成了一个变量(lists)!下面只要将lists变量替换成我们想要的就行了.<br /><br />代码二所处的循环<br />while ($row = $idb-&gt;fetch_array($result)) <br />{ <br />$tpl-&gt;set_var("username", $row["username"]); <br />$tpl-&gt;set_var("score", $row["score"]); <br />$tpl-&gt;parse("lists", "list", true); //代码2 <br />} <br />每一次循环,两个set_var分别给username,score赋值,然后"list"就变成了<br />"list" = "&lt;li&gt;具体的名字 的成绩是 具体的分数"<br />代码2就是将list分析后的内容赋给lists,这样就完成了整个块的分析.<br /><br />parse第三个参数可以设置list中的值是直接存在lists里面,还是附加在原有值之后.我们这里设置为true,说明是附加在原有值之后,才得以每个list的值都会显示出来.反之设为false的话,后面的值会覆盖掉以前的值.最终的结果会是<br /><br /><br />下面是一个列表 <br /><br />麻子 的成绩是 77 <br /><br /><br />综上所述,Template模板类的替换方式是:<br />1,用set_block将模板中的list块(或者你命名的其他块)替换成变量lists.<br />2,用set_var给list块中的变量赋值<br />3,把赋值并执行替换后的list内容依次给lists<br />4,完成分析<br /><br /><div class="subtable altbg1"><span class="right">2005-11-8 23:20</span><b>SOLO</b></div><div class="subtable altbg2 t_msg">在PHP程序里,我们常常会把"公用代码"或"公用部分"写进一个文件里,前者象我们的系统配置文件,比如config.php,或者公共函数都写入一个functions.php文件里;后者象一个站点都需要用到的页面头部,尾部.这样做的好处是可以很方便的维护站点,而如果这个公用部分要有所改动,无需再去改每一个页面,大大减少了我们的工作量. <br />以前你或许用require,include(require_once,include_once)引进一个公用的页面头部,确实方便而有效,现在我们用Template模板类也可以实现了,并且可以很方便的把一个页面随意插入另一个模板的任意地方.如果你想也把要插进的页面做成含有变量的模板的话,那么你会发现模板类会把这个工作处理的很好.<br /><br />在template目录下新建三个文件third.html,header.html,footer.html.内容分为如下<br />third.html <br />&lt;!-- 这是页面头部 --&gt; <br />{header} <br />&lt;BODY&gt; <br />下面是一个列表 <br />&lt;UL&gt; <br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt;{username} 的成绩是 {score} <br />&lt;!-- END list --&gt; <br />&lt;/UL&gt; <br />&lt;!-- 这是页面脚部 --&gt; <br />{footer} <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />header.html<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;TITLE&gt; {title} &lt;/TITLE&gt; <br />&lt;/HEAD&gt; <br /><br />footer.html<br />&lt;P&gt;author &amp;copy; iwind <br /><br />你也看到了，我们前几节的例子中都是用<br />$tpl-&gt;set_file("main", "模板文件名"); <br />来加载模板文件的。只所以命名为"main",是因为我们想给它一个意义：主模板。这里的third.html就可以称之为“主模板”，而欲嵌入主模板third.html的{header}变量所在位置的模板文件header.html,则可以称为"子模板".同样footer.html也是一个"子模板",我们想把它放到主模板里的{footer}位置.一个主模板内可以随意嵌入不限内容,尺寸大小,格式等的任何多个子模板. <br /><br />下面我们开始我们的PHP程序.<br /><br />先是创建一个类的实例对象<br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//读进三个模板文件的内容,分别给变量"main", "my_header", "my_footer" <br />$tpl-&gt;set_file("main", "third.html"); <br />$tpl-&gt;set_file("my_header", "header.html"); <br />$tpl-&gt;set_file("my_footer", "footer.html"); <br /><br />//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer <br />$tpl-&gt;parse("header", "my_header"); <br />$tpl-&gt;parse("footer", "my_footer"); <br /><br />//然后完成主模板内变量的替换,并输出主模板分析后的内容 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;p("mains"); <br /><br />于是,我们便可以通过查看源文件确信header.html,footer.html两个子模板文件的内容已经被加进主模板里了.<br /><br />&lt;!-- 这是页面头部 --&gt; <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&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 />下面是一个列表 <br />&lt;UL&gt; <br />&lt;!-- BEGIN list --&gt; <br />&lt;li&gt; 的成绩是 <br />&lt;!-- END list --&gt; <br />&lt;/UL&gt; <br />&lt;!-- 这是页面脚部 --&gt; <br />&lt;P&gt;author &amp;copy; iwind <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />你会发现,所有的变量都没了,包括我们未赋值的{title},{username},{score}.这是因为我们在创建对象时,第二个参数未设置,而自动采用了"remove"<br />$tpl = new Template("template"); <br />和<br />$tpl = new Template("template", "remove"); <br />的效果是一样的.<br /><br />如果我们想给这些变量也赋值,那么方法和单个模板里变量的分析方法是一样的.<br />//读模板内容进变量 <br />$tpl-&gt;set_file("main", "third.html"); <br />$tpl-&gt;set_file("my_header", "header.html"); <br />$tpl-&gt;set_file("my_footer", "footer.html"); <br /><br />//设置子模板header.html里的变量title的值 <br />$tpl-&gt;set_var("title", "这个是网页标题"); <br /><br />//以下分析主模板里的块的内容 <br />//设置块 <br />$tpl-&gt;set_block("main", "list", "lists"); <br />$array = array("张三" =&gt; 82, "李四" =&gt; 90, "王二" =&gt; 60, "麻子" =&gt; 77); <br />foreach ($array as $username=&gt;$score) <br />{ <br />    $tpl-&gt;set_var("username", $username); <br />    $tpl-&gt;set_var("score", $score); <br />    $tpl-&gt;parse("lists", "list", true); <br />} <br /><br />所有程序为<br />&lt;?php <br />//包含进模板类 template.inc <br />require "inc/template.inc"; <br /><br />//创建一个实例 <br />$tpl = new Template("template"); <br /><br />//将整个文件读进来 <br />$tpl-&gt;set_file("main", "third.html"); <br />$tpl-&gt;set_file("my_header", "header.html"); <br />$tpl-&gt;set_file("my_footer", "footer.html"); <br /><br />//设置header.html里的变量title的值 <br />$tpl-&gt;set_var("title", "这个是网页标题"); <br /><br />//设置块 <br />$tpl-&gt;set_block("main", "list", "lists"); <br />$array = array("张三" =&gt; 82, "李四" =&gt; 90, "王二" =&gt; 60, "麻子" =&gt; 77); <br />foreach ($array as $username=&gt;$score) <br />{ <br />$tpl-&gt;set_var("username", $username); <br />$tpl-&gt;set_var("score", $score); <br />$tpl-&gt;parse("lists", "list", true); <br />} <br /><br />//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer <br />$tpl-&gt;parse("header", "my_header"); <br />$tpl-&gt;parse("footer", "my_footer"); <br /><br />//完成主模板内变量的替换 <br />$tpl-&gt;parse("mains", "main"); <br /><br />//输出 <br />$tpl-&gt;p("mains"); <br /><br />?&gt; <br /><br />输出的结果为<br />&lt;!-- 这是页面头部 --&gt; <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&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 />下面是一个列表 <br />&lt;UL&gt; <br /><br />&lt;li&gt;张三 的成绩是 82 <br />&lt;li&gt;李四 的成绩是 90 <br />&lt;li&gt;王二 的成绩是 60 <br />&lt;li&gt;麻子 的成绩是 77 <br />&lt;/UL&gt; <br />&lt;!-- 这是页面脚部 --&gt; <br />&lt;P&gt;author &amp;copy; iwind <br />&lt;/BODY&gt; <br />&lt;/HTML&gt; <br /><br />一切都是我们所期望的.<br /><br />在这个程序里,我们用<br />$tpl-&gt;set_block("main", "list", "lists"); <br />加载一个块.其实它的第一个参数为该块所在父变量,如果这个块在header.html里,那么恐怕要这样写了<br />$tpl-&gt;set_block("my_header", "list", "lists"); <br />但分析方法还是一样的.<br /><br />从以往和这节中的例子,我们可以看出来,定义一个模板变量{var}值的方法是用<br />$tpl-&gt;set_var("var_name", "var_value"); <br />但把一个变量的值给另一个变量就需要用parse.<br />$tpl-&gt;parse("target_name", "from_name", true); <br />或者<br />$tpl-&gt;parse("target_name", "from_name", false); <br />使用parse就先执行from_name大变量的模板变量的替换,然后再把所得结果赋给target_name.<br /><br />一个变量{varname}无论在模板的何处(块里面,子模板里),定义的方法都是一样的.<br /><br />子模板里还可以嵌入新的子模板,称之为"多重嵌套",分析的方法都是一样的,只是一般用不到.块也可以多重嵌套,而且非常有用,使得模板可以设计的可以很清晰,这就是我们下一节的内容了.</div></div></div></div><img src ="http://www.blogjava.net/jackstudio/aggbug/62765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-08-10 12:17 <a href="http://www.blogjava.net/jackstudio/archive/2006/08/10/62765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>电影</title><link>http://www.blogjava.net/jackstudio/archive/2006/06/30/55887.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 30 Jun 2006 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/30/55887.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/55887.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/30/55887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/55887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/55887.html</trackback:ping><description><![CDATA[        <a href="http://jx.yorton.tv/YT%5FFREE/Movie.aspx" target="_blank"><strong><font color="#006bad">http://jx.yorton.tv/YT%5FFREE/Movie.aspx</font></strong></a><br />        <a href="http://www.w1111.com/" target="_blank"><strong><font color="#006bad">http://www.w1111.com/</font></strong></a><br />        <a href="http://www.tk4479.com/" target="_blank"><strong><font color="#006bad">http://www.tk4479.com/</font></strong></a><br />        <a href="http://www.97315.com/index.htm" target="_blank"><strong><font color="#006bad">http://www.97315.com/index.htm</font></strong></a><br />      <br />        <a href="http://kan51.cn/" target="_blank"><strong><font color="#006bad">http://kan51.cn</font></strong></a><br />        <a href="http://www.topdy.com/" target="_blank"><strong><font color="#006bad">http://www.topdy.com/</font></strong></a><br />        <a href="http://www.mmdy.cn/default.htm" target="_blank"><strong><font color="#006bad">http://www.mmdy.cn/default.htm</font></strong></a><br />        <a href="http://39dvd.com/" target="_blank"><strong><font color="#006bad">http://39dvd.com/</font></strong></a><br />        <a href="http://xwxc.anyp.cn/050708192700828.aspx" target="_blank"><strong><font color="#006bad">http://xwxc.anyp.cn/050708192700828.aspx</font></strong></a><br /><br />        <a href="http://www.3716.com.cn/movie/index.asp" target="_blank"><strong><font color="#006bad">http://www.3716.com.cn/movie/index.asp</font></strong></a><br /><br />        <a href="http://www.yswang.com/" target="_blank"><strong><font color="#006bad">http://www.yswang.com/</font></strong></a><br /><br />        <a href="http://vod.xwagri.com/default.asp" target="_blank"><strong><font color="#006bad">http://vod.xwagri.com/default.asp</font></strong></a><br /><br />        <a href="http://218.203.188.24/main.asp" target="_blank"><strong><font color="#006bad">http://218.203.188.24/main.asp</font></strong></a><img src ="http://www.blogjava.net/jackstudio/aggbug/55887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-30 10:50 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/30/55887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>css 重用，子选择器，组选择器</title><link>http://www.blogjava.net/jackstudio/archive/2006/06/30/55871.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 30 Jun 2006 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/30/55871.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/55871.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/30/55871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/55871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/55871.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重用:<br />经常会用到一些基本的式样叠加，比如字体的颜色和加粗。网页中可能同时出现三种情况：1.字体为红色  2.字体加粗 3.字体红色加粗<br />这时我们只需要定义前两个css：<br />.red{color:red;}<br />.b{font-weight:bold;}<br />第三种情况时用&lt;div class="red b"&gt;&lt;/div&gt;</span>
				</span>
		</p>
		<a name="more">
		</a>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<br />子选择器:<br />相对来说，简化html文件的代码更加重要，因此在css中使用子选择器非常有益，同时也使css代码更加容易理解。比如下面的代码：<br />&lt;div id="sub_nav"&gt; <br />&lt;ul&gt; <br />&lt;li&gt; &lt;a href="#"&gt;Item 1&lt;/a&gt;&lt;/li&gt;&gt; <br />&lt;li&gt; &lt;a href="#"&gt;Item 2&lt;/a&gt;&lt;/li&gt; <br />&lt;li&gt; &lt;a href="#"&gt;Item 3&lt;/a&gt;&lt;/li&gt;<br />&lt;/ul&gt; <br />&lt;/div&gt;<br />如果div li a都有各自的式样,采用子选择器,可以省略代码中li 和a 的class属性，从而简化代码：<br />#sub_nav { /* Some styling */ } <br />#sub_nav li { /* Some styling */ } <br />#sub_nav a { /* Some styling */ }<br />组选择器：<br />当一些元素类型、class或者id都有共同的一些属性，你就可以使用组选择器来避免多次的重复定义。这可以节省不少字节。 <br />例如：定义所有标题的字体、颜色和margin，你可以这样写：<br />h1,h2,h3,h4,h5,h6 { <br />font-family:"Lucida Grande",Lucida,Arial,Helvetica,sans-serif; <br />color:#333; <br />margin:1em 0; <br />} <br />如果在使用时，有个别元素需要定义独立样式，你可以再加上新的定义，可以覆盖老的定义，例如：<br />h1 { font-size:2em; } <br />h2 { font-size:1.6em; }<br />重用、子选择器和组选择器的灵活使用可以非常有效的减少代码，同时非常有利的增加代码的可读性，具体的应用需要在具体编写过程中体会。</span>
		</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/55871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-30 10:30 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/30/55871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asp 生成静态页面的类.</title><link>http://www.blogjava.net/jackstudio/archive/2006/06/26/55087.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 26 Jun 2006 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/26/55087.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/55087.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/26/55087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/55087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/55087.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">  1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">  2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">author : jack</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  3</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">date   : 2005-11-12</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">email  : jieck422@163.com</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  5</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">文件存放解决办法：</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  6</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">把文件全部存放在saveFolder中，每个文件夹存放数量saveCount为2000个文件，用记录集的id整除saveCount（id\saveCount）</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  7</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">所得整数定为该文件所在目录，文件名就是该id号。例如：saveFolder="F:\test",saveCount=2000，在表中有一记录，其id为47（47\2000=0）,该</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  8</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">文件生成后存放的目录为F:\test\0\47.shtml</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  9</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">dim</span>
				<span style="COLOR: #000000"> ID,myconn,zhli<br /></span>
				<span style="COLOR: #008080"> 10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">''''''''''''''''''''''''''''''''''''''在此添加过滤器</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 11</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">ID</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">request.querystring(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">id</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> myconn</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> GetConnection<br /></span>
				<span style="COLOR: #008080"> 13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> myconn.openRS(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">select a.E_name,a.E_date,a.E_zhouqi,a.E_changban,a.E_begindate,a.E_enddate,a.E_address,a.E_zhanguan,a.E_content,case a.E_xingzhi when 0 then '国际展会' when 1 then '国内展会' else '国内展会' end as xiangzhi,a.E_company,a.E_chengban,a.E_beizhu,b.[name],b.Phone,b.Fax,b.Email,b.Qymc from zhanhui a,qiang_qyml b where a.Exhib_ID=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">ID</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> and a.gsid=b.id</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">then</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />myconn.errMassege </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">记录集为空，请检查ID是否正确！^_^</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />response.end<br /></span>
				<span style="COLOR: #008080"> 16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> zhli</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> ZhanHui_listinfo<br /></span>
				<span style="COLOR: #008080"> 18</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.letModAddress</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">F:\test\li.shtml</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 19</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.letSaveFolder</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">F:\test\</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 20</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.letSaveCount</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">2000</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 21</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.letContent</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">zhli.readContent<br /></span>
				<span style="COLOR: #008080"> 22</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_name$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 23</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_date$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 24</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_zhouqi$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 25</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_changban$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 26</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_begindate$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 27</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_enddate$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 28</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_address$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">6</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 29</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_zhanguan$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">7</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 30</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_content$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">8</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 31</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_xingzhi$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">9</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 32</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_company$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">10</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 33</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_chengban$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">11</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 34</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$E_beizhu$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">12</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 35</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$linkman$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">13</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 36</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$linkphone$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">14</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 37</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$linkfax$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">15</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 38</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$linkemail$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">16</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 39</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.replaceContent </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">{$companyname$}</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,myconn.rs(</span>
				<span style="COLOR: #000000">17</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 40</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />zhli.asp2html zhli.makefilename(ID),zhli.getContent<br /></span>
				<span style="COLOR: #008080"> 41</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">end</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 42</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 43</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />class ZhanHui_listinfo<br /></span>
				<span style="COLOR: #008080"> 44</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">文件生成类</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 45</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> modAddress,saveFolder,fso,ts,content,saveCount<br /></span>
				<span style="COLOR: #008080"> 46</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">modAddress---------摸班地址</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 47</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">saveFolder---------存放目录</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 48</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">content------------模版内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 49</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">saveCount----------存放数量</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 50</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">sub</span>
				<span style="COLOR: #000000"> class_initialize()</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">类初始化</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 51</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> fso</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">Server.CreateObject(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">SCRIPTING.FILESYSTEMOBJECT</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 52</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end sub</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 53</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 54</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">property</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">let</span>
				<span style="COLOR: #000000"> letSaveCount(str)<br /></span>
				<span style="COLOR: #008080"> 55</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> saveCount</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">str<br /></span>
				<span style="COLOR: #008080"> 56</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end property</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 57</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 58</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">let saveFolder</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 59</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">property</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">let</span>
				<span style="COLOR: #000000"> letSaveFolder(str)<br /></span>
				<span style="COLOR: #008080"> 60</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> saveFolder</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">str<br /></span>
				<span style="COLOR: #008080"> 61</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end property</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 62</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 63</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">let modAddress</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 64</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">property</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">let</span>
				<span style="COLOR: #000000"> letModAddress(str)<br /></span>
				<span style="COLOR: #008080"> 65</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> modAddress</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">str<br /></span>
				<span style="COLOR: #008080"> 66</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end property</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 67</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 68</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">let Content</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 69</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">property</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">let</span>
				<span style="COLOR: #000000"> letContent(str)<br /></span>
				<span style="COLOR: #008080"> 70</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> content</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">str<br /></span>
				<span style="COLOR: #008080"> 71</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end property</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 72</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">get Content</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 73</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">property</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">get</span>
				<span style="COLOR: #000000"> getContent<br /></span>
				<span style="COLOR: #008080"> 74</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> getContent</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">content<br /></span>
				<span style="COLOR: #008080"> 75</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end property</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 76</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 77</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> makefilename(ID)</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">文件名以及路径</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 78</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> foldername</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">ID</span>
				<span style="COLOR: #000000">\</span>
				<span style="COLOR: #000000">saveCount<br /></span>
				<span style="COLOR: #008080"> 79</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">not</span>
				<span style="COLOR: #000000"> fso.FolderExists(saveFolder</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">foldername) </span>
				<span style="COLOR: #0000ff">then</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 80</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> fso.createfolder(saveFolder</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">foldername)<br /></span>
				<span style="COLOR: #008080"> 81</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 82</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> makefilename</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">saveFolder</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">foldername</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">\</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">ID</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">.shtml</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 83</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end function</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 84</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 85</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> readContent()</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">读取摸班内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 86</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> readts</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">fso.OpenTextFile(modAddress,</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 87</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> readcontent</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">readts.ReadAll()<br /></span>
				<span style="COLOR: #008080"> 88</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> readts.close<br /></span>
				<span style="COLOR: #008080"> 89</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end function</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 90</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 91</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> replaceContent(strOne,strTwo)</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">替换内容</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 92</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> content</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">replace</span>
				<span style="COLOR: #000000">(content,strOne,strTwo)<br /></span>
				<span style="COLOR: #008080"> 93</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end function</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 94</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 95</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">sub</span>
				<span style="COLOR: #000000"> asp2html(filename,filecontent)</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">生成shtml文件</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 96</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> writets</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">fso.CreateTextFile(filename,</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080"> 97</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> writets.Write(filecontent)<br /></span>
				<span style="COLOR: #008080"> 98</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> writets.close<br /></span>
				<span style="COLOR: #008080"> 99</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end sub</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">100</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">101</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">end</span>
				<span style="COLOR: #000000"> class<br /></span>
				<span style="COLOR: #008080">102</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">103</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />class GetConnection<br /></span>
				<span style="COLOR: #008080">104</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">  连接数据库类</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">105</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">  调用方法：</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">106</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">  dim myconn</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">107</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'</span>
				<span style="COLOR: #008000">  set myconn=new GetConnection</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">108</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />'<br /></span>
				<span style="COLOR: #008080">109</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> conn,connStr<br /></span>
				<span style="COLOR: #008080">110</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> rs<br /></span>
				<span style="COLOR: #008080">111</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">sub</span>
				<span style="COLOR: #000000"> class_initialize()</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">类初始化</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">112</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> connStr</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Provider=SQLOLEDB.1; Data Source=(local); Initial Catalog=myDATABASE; User ID=sa; Password=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">113</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">在此修改数据库连接</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">114</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> conn</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">Server.CreateObject(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ADODB.Connection</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">115</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> conn.open connStr<br /></span>
				<span style="COLOR: #008080">116</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end sub</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">117</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">118</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> openRS(sql)<br /></span>
				<span style="COLOR: #008080">119</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> rs</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">conn.execute(sql)<br /></span>
				<span style="COLOR: #008080">120</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> rs.eof </span>
				<span style="COLOR: #0000ff">and</span>
				<span style="COLOR: #000000"> rs.bof </span>
				<span style="COLOR: #0000ff">then</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">121</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> openRS</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">122</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">123</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> openRS</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">124</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">125</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end function</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">126</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">127</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">sub</span>
				<span style="COLOR: #000000"> errMassege(mm) <br /></span>
				<span style="COLOR: #008080">128</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> response.write(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;center&gt;&lt;p&gt;&lt;font size=7 color=red&gt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">mm</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;/font&gt;&lt;/p&gt;&lt;center&gt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">) <br /></span>
				<span style="COLOR: #008080">129</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end sub</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">130</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">131</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">sub</span>
				<span style="COLOR: #000000"> class_terminate()</span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000">销毁类</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">132</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000"> conn.close<br /></span>
				<span style="COLOR: #008080">133</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">set</span>
				<span style="COLOR: #000000"> conn</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">nothing</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">134</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">end sub</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">135</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">136</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">end</span>
				<span style="COLOR: #000000"> class<br /></span>
				<span style="COLOR: #008080">137</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">138</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/55087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-26 11:00 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/26/55087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>法国，你出了什么问题？</title><link>http://www.blogjava.net/jackstudio/archive/2006/06/19/53727.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 19 Jun 2006 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/19/53727.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/53727.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/19/53727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/53727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/53727.html</trackback:ping><description><![CDATA[法国又平了，亨利的进球是让人高兴，可是还是逃不出平局的命运，小组出线有点悬了，<br />对法国来说这最后的希望就是战胜多哥，但是光是战胜多哥也不一定能出线，还必须要两个或两个以上的<br />静胜球，对法国人来说这真的有难度了。想想辉煌时的法国也有3：0战胜桑巴，现在却弱到。。。。。。。。。。。。<br />可怜的法国，拿破伦征服世界的野心哪里去了，难道冥冥中已经注定世界杯不在属于法国了？甚至连门票都不发了？<br /><br /><img src ="http://www.blogjava.net/jackstudio/aggbug/53727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-19 11:22 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/19/53727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正规表达式java.util.regex包 </title><link>http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 17 Jun 2006 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/53484.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/53484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/53484.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="96%" border="0">
				<tbody>
						<tr>
								<td bgcolor="#e8f0f1">
										<strong>  [转]正规表达式java.util.regex包</strong>
								</td>
						</tr>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<div align="right">
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
										<span class="oblog_text">  来源：<a href="http://www.52blog.net/user1/53795/archives/2006/653150.shtml">http://www.52blog.net/user1/53795/archives/2006/653150.shtml</a><p>现在JDK1.4里有了自己的正则表达式API包，JAVA程序员可以免去找第三方提供的正则表达式库的周折了，我们现在就马上来了解一下这个SUN提供的迟来恩物- -对我来说确实如此。<br /><br /><strong>1.简介：</strong><br />java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。<br />它包括两个类：Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。<br />Matcher 一个Matcher对象是一个状态机器，它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式，然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。<br />以下我们就分别来看看这两个类： </p><p><strong>2.Pattern类：</strong><br />Pattern的方法如下： static Pattern compile(String regex) <br />将给定的正则表达式编译并赋予给Pattern类 <br />static Pattern compile(String regex, int flags) <br />同上，但增加flag参数的指定，可选的flag参数包括：CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE， CANON EQ <br />int flags() <br />返回当前Pattern的匹配flag参数. <br />Matcher matcher(CharSequence input) <br />生成一个给定命名的Matcher对象 <br />static boolean matches(String regex, CharSequence input) <br />编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况，也就是只进行一次匹配工作，因为这种情况下并不需要生成一个Matcher实例。 <br />String pattern() <br />返回该Patter对象所编译的正则表达式。 <br />String[] split(CharSequence input) <br />将目标字符串按照Pattern里所包含的正则表达式为模进行分割。 <br />String[] split(CharSequence input, int limit) <br />作用同上，增加参数limit目的在于要指定分割的段数，如将limi设为2，那么目标字符串将根据正则表达式分为割为两段。 </p><p>一个正则表达式，也就是一串有特定意义的字符，必须首先要编译成为一个Pattern类的实例，这个Pattern对象将会使用matcher()方法来生成一个Matcher实例，接着便可以使用该 Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作，多个Matcher是可以共用一个Pattern对象的。 </p><p>现在我们先来看一个简单的例子，再通过分析它来了解怎样生成一个Pattern对象并且编译一个正则表达式，最后根据这个正则表达式将目标字符串进行分割： <br />import java.util.regex.*; <br />public class Replacement{ <br />public static void main(String[] args) throws Exception { <br />// 生成一个Pattern,同时编译一个正则表达式 <br />Pattern p = Pattern.compile("[/]+"); <br />//用Pattern的split()方法把字符串按"/"分割 <br />String[] result = p.split( <br />"Kevin has seen《LEON》seveal times,because it is a good film." <br />+"/ 凯文已经看过《这个杀手不太冷》几次了，因为它是一部" <br />+"好电影。/名词:凯文。"); <br />for (int i=0; i&lt;result.length; i++) <br />System.out.println(result[i]); <br />} <br />} </p><p>输出结果为： </p><p>Kevin has seen《LEON》seveal times,because it is a good film. <br />凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。 <br />名词:凯文。 </p><p>很明显，该程序将字符串按"/"进行了分段，我们以下再使用 split(CharSequence input, int limit)方法来指定分段的段数，程序改动为： <br />tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。/名词:凯文。"，2); </p><p>这里面的参数"2"表明将目标语句分为两段。 </p><p>输出结果则为： </p><p>Kevin has seen《LEON》seveal times,because it is a good film. <br />凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。/名词:凯文。 </p><p>由上面的例子，我们可以比较出java.util.regex包在构造Pattern对象以及编译指定的正则表达式的实现手法与我们在上一篇中所介绍的Jakarta-ORO 包在完成同样工作时的差别，Jakarta-ORO 包要先构造一个PatternCompiler类对象接着生成一个Pattern对象，再将正则表达式用该PatternCompiler类的compile()方法来将所需的正则表达式编译赋予Pattern类： </p><p>PatternCompiler orocom=new Perl5Compiler(); </p><p>Pattern pattern=orocom.compile("REGULAR EXPRESSIONS"); </p><p>PatternMatcher matcher=new Perl5Matcher(); </p><p>但是在java.util.regex包里，我们仅需生成一个Pattern类，直接使用它的compile()方法就可以达到同样的效果: <br />Pattern p = Pattern.compile("[/]+"); </p><p>因此似乎java.util.regex的构造法比Jakarta-ORO更为简洁并容易理解。 </p><p><strong>3.Matcher类： <br /></strong>Matcher方法如下： Matcher appendReplacement(StringBuffer sb, String replacement) <br />将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。 <br />StringBuffer appendTail(StringBuffer sb) <br />将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 <br />int end() <br />返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置 。 <br />int end(int group) <br />返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。 <br />boolean find() <br />尝试在目标字符串里查找下一个匹配子串。 <br />boolean find(int start) <br />重设Matcher对象，并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。 <br />String group() <br />返回当前查找而获得的与组匹配的所有子串内容 <br />String group(int group) <br />返回当前查找而获得的与指定的组匹配的子串内容 <br />int groupCount() <br />返回当前查找所获得的匹配组的数量。 <br />boolean lookingAt() <br />检测目标字符串是否以匹配的子串起始。 <br />boolean matches() <br />尝试对整个目标字符展开匹配检测，也就是只有整个目标字符串完全匹配时才返回真值。 <br />Pattern pattern() <br />返回该Matcher对象的现有匹配模式，也就是对应的Pattern 对象。 <br />String replaceAll(String replacement) <br />将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。 <br />String replaceFirst(String replacement) <br />将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。 <br />Matcher reset() <br />重设该Matcher对象。 <br />Matcher reset(CharSequence input) <br />重设该Matcher对象并且指定一个新的目标字符串。 <br />int start() <br />返回当前查找所获子串的开始字符在原目标字符串中的位置。 <br />int start(int group) <br />返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。 </p><p><br />（光看方法的解释是不是很不好理解？不要急，待会结合例子就比较容易明白了） </p><p>一个Matcher实例是被用来对目标字符串进行基于既有模式（也就是一个给定的Pattern所编译的正则表达式）进行匹配查找的，所有往Matcher的输入都是通过CharSequence接口提供的，这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。 </p><p>我们分别来看看各方法的使用： </p><p>★matches()/lookingAt ()/find()： <br />一个Matcher对象是由一个Pattern对象调用其matcher()方法而生成的，一旦该Matcher对象生成,它就可以进行三种不同的匹配查找操作： </p><p>matches()方法尝试对整个目标字符展开匹配检测，也就是只有整个目标字符串完全匹配时才返回真值。 <br />lookingAt ()方法将检测目标字符串是否以匹配的子串起始。 <br />find()方法尝试在目标字符串里查找下一个匹配子串。 </p><p>以上三个方法都将返回一个布尔值来表明成功与否。 </p><p>★replaceAll ()/appendReplacement()/appendTail()： <br />Matcher类同时提供了四个将匹配子串替换成指定字符串的方法： </p><p>replaceAll() <br />replaceFirst() <br />appendReplacement() <br />appendTail() </p><p>replaceAll()与replaceFirst()的用法都比较简单，请看上面方法的解释。我们主要重点了解一下appendReplacement()和appendTail()方法。 </p><p>appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里，而appendTail(StringBuffer sb) 方法则将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 </p><p>例如，有字符串fatcatfatcatfat,假设既有正则表达式模式为"cat"，第一次匹配后调用appendReplacement(sb,"dog"),那么这时StringBuffer sb的内容为fatdog，也就是fatcat中的cat被替换为dog并且与匹配子串前的内容加到sb里，而第二次匹配后调用appendReplacement(sb,"dog")，那么sb的内容就变为fatdogfatdog，如果最后再调用一次appendTail（sb）,那么sb最终的内容将是fatdogfatdogfat。 </p><p>还是有点模糊？那么我们来看个简单的程序： <br />//该例将把句子里的"Kelvin"改为"Kevin" <br />import java.util.regex.*; <br />public class MatcherTest{ <br />public static void main(String[] args) <br />throws Exception { <br />//生成Pattern对象并且编译一个简单的正则表达式"Kelvin" <br />Pattern p = Pattern.compile("Kevin"); <br />//用Pattern类的matcher()方法生成一个Matcher对象 <br />Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company"); <br />StringBuffer sb = new StringBuffer(); <br />int i=0; <br />//使用find()方法查找第一个匹配的对象 <br />boolean result = m.find(); <br />//使用循环将句子里所有的kelvin找出并替换再将内容加到sb里 <br />while(result) { <br />i++; <br />m.appendReplacement(sb, "Kevin"); <br />System.out.println("第"+i+"次匹配后sb的内容是："+sb); <br />//继续查找下一个匹配对象 <br />result = m.find(); <br />} <br />//最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里； <br />m.appendTail(sb); <br />System.out.println("调用m.appendTail(sb)后sb的最终内容是:"+ sb.toString()); <br />} <br />} </p><p>最终输出结果为： <br />第1次匹配后sb的内容是：Kevin <br />第2次匹配后sb的内容是：Kevin Li and Kevin <br />第3次匹配后sb的内容是：Kevin Li and Kevin Chan are both working in Kevin <br />第4次匹配后sb的内容是：Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin <br />调用m.appendTail(sb)后sb的最终内容是：Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company. </p><p>看了上面这个例程是否对appendReplacement()，appendTail()两个方法的使用更清楚呢，如果还是不太肯定最好自己动手写几行代码测试一下。 </p><p>★group()/group(int group)/groupCount()： <br />该系列方法与我们在上篇介绍的Jakarta-ORO中的MatchResult .group()方法类似(有关Jakarta-ORO请参考上篇的内容)，都是要返回与组匹配的子串内容，下面代码将很好解释其用法： <br />import java.util.regex.*; </p><p>public class GroupTest{ <br />public static void main(String[] args) <br />throws Exception { <br />Pattern p = Pattern.compile("(ca)(t)"); <br />Matcher m = p.matcher("one cat,two cats in the yard"); <br />StringBuffer sb = new StringBuffer(); <br />boolean result = m.find(); <br />System.out.println("该次查找获得匹配组的数量为："+m.groupCount()); <br />for(int i=1;i&lt;=m.groupCount();i++){ <br />System.out.println("第"+i+"组的子串内容为： "+m.group(i)); <br />} <br />} <br />} </p><p>输出为： <br />该次查找获得匹配组的数量为：2 <br />第1组的子串内容为：ca <br />第2组的子串内容为：t </p><p>Matcher对象的其他方法因比较好理解且由于篇幅有限，请读者自己编程验证。 </p><p><strong>4．一个检验Email地址的小程序： <br /></strong>最后我们来看一个检验Email地址的例程，该程序是用来检验一个输入的EMAIL地址里所包含的字符是否合法，虽然这不是一个完整的EMAIL地址检验程序，它不能检验所有可能出现的情况，但在必要时您可以在其基础上增加所需功能。 <br />import java.util.regex.*; <br />public class Email { <br />public static void main(String[] args) throws Exception { <br />String input = args[0]; <br />//检测输入的EMAIL地址是否以 非法符号"."或"@"作为起始字符 <br />Pattern p = Pattern.compile("^\\.|^\\@"); <br />Matcher m = p.matcher(input); <br />if (m.find()){ <br />System.err.println("EMAIL地址不能以'.'或'@'作为起始字符"); <br />} <br />//检测是否以"www."为起始 <br />p = Pattern.compile("^www\\."); <br />m = p.matcher(input); <br />if (m.find()) { <br />System.out.println("EMAIL地址不能以'www.'起始"); <br />} <br />//检测是否包含非法字符 <br />p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+"); <br />m = p.matcher(input); <br />StringBuffer sb = new StringBuffer(); <br />boolean result = m.find(); <br />boolean deletedIllegalChars = false; <br />while(result) { <br />//如果找到了非法字符那么就设下标记 <br />deletedIllegalChars = true; <br />//如果里面包含非法字符如冒号双引号等，那么就把他们消去，加到SB里面 <br />m.appendReplacement(sb, ""); <br />result = m.find(); <br />} <br />m.appendTail(sb); <br />input = sb.toString(); <br />if (deletedIllegalChars) { <br />System.out.println("输入的EMAIL地址里包含有冒号、逗号等非法字符，请修改"); <br />System.out.println("您现在的输入为: "+args[0]); <br />System.out.println("修改后合法的地址应类似: "+input); <br />} <br />} <br />} </p><p>例如，我们在命令行输入：java Email www.kevin@163.net </p><p>那么输出结果将会是：EMAIL地址不能以'www.'起始 </p><p>如果输入的EMAIL为@kevin@163.net </p><p>则输出为：EMAIL地址不能以'.'或'@'作为起始字符 </p><p>当输入为：cgjmail#$%@163.net </p><p>那么输出就是： </p><p>输入的EMAIL地址里包含有冒号、逗号等非法字符，请修改 <br />您现在的输入为: cgjmail#$%@163.net <br />修改后合法的地址应类似: cgjmail@163.net </p><p><strong>5．总结：<br /></strong>本文介绍了jdk1.4.0-beta3里正则表达式库--java.util.regex中的类以及其方法，如果结合与上一篇中所介绍的Jakarta-ORO API作比较，读者会更容易掌握该API的使用，当然该库的性能将在未来的日子里不断扩展，希望获得最新信息的读者最好到及时到SUN的网站去了解。 </p><p><strong>6．结束语：<br /></strong>本来计划再多写一篇介绍一下需付费的正则表达式库中较具代表性的作品，但觉得既然有了免费且优秀的正则表达式库可以使用，何必还要去找需付费的呢，相信很多读者也是这么想的:，所以有兴趣了解更多其他的第三方正则表达式库的朋友可以自己到网上查找或者到我在参考资料里提供的网址去看看。</p></span>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jackstudio/aggbug/53484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-17 16:21 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在myeclipse中配置weblogic[转]</title><link>http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 02 Jun 2006 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49893.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49893.html</trackback:ping><description><![CDATA[
		<font color="#555555">安装WebLogic8.1 <br />安装WebLogic比较容易，在这里就不再累述了，大家可以参阅相关文档。现在着重讲一下WebLogic的配置，因为后面在配置MyEclipse时将用到这里的有关信息。 <br />(1)运行开始\程序\BEA WebLogic PlatFORM 8.1\Configuration Wizard。 <br />(2)选择Create a new WebLogic configuration，下一步。 <br />(3)选择Basic WebLogic Server Domain，下一步。 <br />(4)选择Custom，下一步。 <br />(5)在Name处输入admin，Listen Address处选择localhost，以下两个Port均采用默认值，下一步。 <br />(6)选择Skip跳过Multiple Servers，Clusters，and Machines Options，下一步。 <br />(7)选择Skip跳过JDBC连接池的配置（注：JDBC连接池的配置可以在启动WebLogic后到控制台上进行，大家可以参阅相关文档），下一步。 <br />(选择Skip跳过JMS的配置（同样留到控制台上做），下一步。 <br />(9)继续跳过，下一步。 <br />(10)选择Yes，下一步。 <br />(11)在User页点击Add，随意添加一个用户user，密码12345678，下一步。 <br />(12)将用户user分配到Administrators组（还可以同时分配到其它组，方法是选中待加入的组，然后勾中user前的复选框即可），下一步。 <br />(13)直接点击下一步跳过。 <br />(14)设置用户user的权限，选中Admin，勾中user前的复选框（要指定其它权限依次类推），下一步。 <br />(15)采用默认设置，直接点击下一步跳过。 <br />(16)同样采用默认设置，直接点击下一步跳过。 <br />(17)配置JDK，采用WebLogic的默认值，直接点击下一步跳过。 <br />(1最后在Configuration Name处输入dev，然后点击Create生成配置，完毕点击Done关闭Configuration Wizard对话框。 <br />5.配置MyEclipse的WebLogic服务器 <br />MyEclipse默认的应用服务器为JBoss3，这里我们使用WebLogic8.1。启动Eclipse，选择“窗口\首选项”菜单，打开首选项对话框。展开MyEclipse下的Application Servers结点，点击JBoss 3，选中右面的Disable单选按钮，停用JBoss 3。然后点击WebLogic 8，选中右边的Enable单选按钮，启用WebLogic服务器。同时下面的配置如下： <br />(1)BEA home directory：D:\BEA。假定WebLogic安装在D:\BEA文件夹中。 <br />(2)WebLogic installation directory：D:\BEA\weblogic81。 <br />(3)Admin username：user。 <br />(4)Admin password：12345678。 <br />(5)Execution domain root：D:\BEA\user_projects\dev。 <br />(6)Execution domain name：dev。 <br />(7)Execution server name：admin。 <br />(8)Hostname:PortNumber：localhost:7001。 <br />(9)Security policy file：D:\BEA\weblogic81\server\lib\weblogic.policy。 <br />(10)JAAS login configuration file：省略。 <br />接着展开WebLogic 8结点，点击JDK，在右边的WLS JDK name处选择WebLogic 8的默认JDK。这里组合框中缺省为j2re1.4.2_03，即之前单独安装的jre。单击Add按钮，弹出WebLogic &gt; Add JVM对话框，在JRE名称处随便输入一个名字，如jre1.4.1_02。然后在JRE主目录处选择WebLogic安装文件夹中的JDK文件夹，如D:\BEA\jdk141_02，程序会自动填充Javadoc URL文本框和JRE系统库列表框。单击确定按钮关闭对话框。这时候就可以在WLS JDK name组合框中选择jre1.4.1_02了。之后还要在下面的Optional Java VM arguments，如-ms64m -mx64m -Djava.library.path="D:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false <br />最后点击Paths，在右边的Prepend to classpath列表框中，通过Add JAR/ZIP按钮，加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\server\lib\webservices.jar。如果用到数据库，还需把数据库的驱动类库加进来，这里我们用WebLogic自带的SQL Server数据库驱动库D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar。 <br />至此，MyEclipse中WebLogic8的配置工作就算完成了。下面可以看看在Eclipse中能否启动WebLogic了？自从安装了MyEclipse之后，Eclipse工具栏中就会有一个Run/Stop Servers下拉按钮。点击该按钮的下拉部分，选择“WebLogic 8\Start”菜单，即开始启动WebLogic了。通过查看下面的控制台消息，就可以知道启动是否成功，或有什么异常发生。停止WebLogic可选择“WebLogic\Stop”菜单。 </font>
		<br />
		<br />
<img src ="http://www.blogjava.net/jackstudio/aggbug/49893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-02 11:31 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts1.1基于dbcp下的mysql数据库的数据源配置</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49324.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49324.html</trackback:ping><description><![CDATA[首先要有四个文件在lib\目录下。<br />分别是<br />1.commons-dbcp-1.2.1.jar<br />2.commons-pool-1.2.jar<br />3.struts-legacy.jar<br />4.mysqldriver.jar<br /><br /><br /><a class="" title="" href="/Files/jackstudio/lib.rar" target="_blank">点这里全部下载</a><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">sources</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">source type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.commons.dbcp.BasicDataSource</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">driverClassName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.gjt.mm.mysql.Driver</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jdbc:mysql://localhost/userinfo?useUnicode=true&amp;amp;characterEncoding=GB2312</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">username</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">password</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maxActive</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maxWait</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">defaultAutoCommit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">defaultReadOnly</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">validationQuery</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SELECT COUNT(*) FROM myuserinfo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">source</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">sources</span><span style="COLOR: #000000">&gt;</span></div><img src ="http://www.blogjava.net/jackstudio/aggbug/49324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 20:09 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java/JSP中文乱码问题解决心得</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49296.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49296.html</trackback:ping><description><![CDATA[
		<div class="postcontent">
				<h3 class="title">Java/JSP中文乱码问题解决心得</h3>
				<p>作者信息：liqian  liqianbnu@126.com   http://202.112.88.39/liqian/<br />文章原始出处：http://202.112.88.39/liqian/000271.html</p>
				<p>自从接触Java和JSP以来，就不断与Java的中文乱码问题打交道，现在终于得到了彻底的解决，现将我们的解决心得与大家共享。</p>
				<p>
						<b>一、Java中文问题的由来</b>
				</p>
				<p>Java的内核和class文件是基于unicode的，这使Java程序具有良好的跨平台性，但也带来了一些中文乱码问题的麻烦。原因主要有两方面，Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。</p>
				<p>首先Java（包括JSP）源文件中很可能包含有中文，而Java和JSP源文件的保存方式是基于字节流的，如果Java和JSP编译成class文件过程中，使用的编码方式与源文件的编码不一致，就会出现乱码。基于这种乱码，建议在Java文件中尽量不要写中文（注释部分不参与编译，写中文没关系），如果必须写的话，尽量手动带参数－ecoding GBK或－ecoding gb2312编译；对于JSP，在文件头加上&lt;%@ page contentType="text/html;charset=GBK"%&gt;或&lt;%@ page contentType="text/html;charset=gb2312"%&gt;基本上就能解决这类乱码问题。</p>
				<p>本文要重点讨论的是第二类乱码，即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介，如数据库，文件，流等的存储方式都是基于字节流的，Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换，具体情况如下：</p>
				<p>从页面form提交数据到java程序 byte－&gt;char<br />从java程序到页面显示 char—&gt;byte</p>
				<p>从数据库到java程序 byte—&gt;char<br />从java程序到数据库 char—&gt;byte</p>
				<p>从文件到java程序 byte－&gt;char<br />从java程序到文件 char－&gt;byte</p>
				<p>从流到java程序 byte－&gt;char<br />从java程序到流 char－&gt;byte</p>
				<p>如果在以上转换过程中使用的编码方式与字节原有的编码不一致，很可能就会出现乱码。</p>
				<p>
						<b>二、解决方法</b>
						<br />
						<br />前面已经提到了Java程序与其他媒介交互时字符和字节的转换过程，如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致，下面分别论述（Java或JSP自身产生的乱码请参看第一部分）。</p>
				<p>
						<b>1、JSP与页面参数之间的乱码</b>
						<br />JSP获取页面参数时一般采用系统默认的编码方式，如果页面参数的编码类型和系统默认的编码类型不一致，很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前，强制指定request获取参数的编码方式：request.setCharacterEncoding("GBK")或request.setCharacterEncoding("gb2312")。<br />如果在JSP将变量输出到页面时出现了乱码，可以通过设置response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解决。<br />如果不想在每个文件里都写这样两句话，更简洁的办法是使用Servlet规范中的过虑器指定编码，过滤器的在web.xml中的典型配置和主要代码如下：<br />web.xml:</p>
				<p>&lt;filter&gt;<br />&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br />&lt;filter-class&gt;net.vschool.web.CharacterEncodingFilter&lt;/filter-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;encoding&lt;/param-name&gt;<br />&lt;param-value&gt;GBK&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;</p>
				<p>CharacterEncodingFilter.java:</p>
				<p>public class CharacterEncodingFilter implements Filter <br />{</p>
				<p>protected String encoding = null; </p>
				<p>public void init(FilterConfig filterConfig) throws ServletException <br />{<br />this.encoding = filterConfig.getInitParameter("encoding");<br />}</p>
				<p>public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException <br />{<br />request.setCharacterEncoding(encoding);<br />response.setContentType("text/html;charset="+encoding);<br />chain.doFilter(request, response);<br />}</p>
				<p>}</p>
				<p>
						<br />
						<b>2、Java与数据库之间的乱码</b>
						<br />大部分数据库都支持以unicode编码方式，所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode，如Microsoft的SQLServer驱动。其他大部分数据库驱动，可以在驱动的url参数中指定，如如mm的mysql驱动：jdbc:mysql://localhost/WEBCLDB?useUnicode=true&amp;characterEncoding=GBK。</p>
				<p>
						<b>3、Java与文件/流之间的乱码</b>
						<br />Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字节流的，常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter，省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式，如果文件内容与系统编码方式不一致，可能会出现乱码。在这种情况下，建议使用FileReader和FileWriter的父类：InputStreamReader/OutputStreamWriter，它们也是基于字符的，但在构造函数中可以指定编码类型：InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。 </p>
				<p>
						<b>4、其他</b>
						<br />上面提到的方法应该能解决大部分乱码问题，如果在其他地方还出现乱码，可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中，你必须知道原来字节或转换后的字节的编码方式，转换时采用的编码必须与这个编码方式保持一致。我们以前使用Resin服务器，使用smartUpload组件上传文件，上传文件同时传递的中文参数获取没有乱码问题。当在Linux中把Resin设置成服务后，上传文件同时的中文参数获取出现了乱码。这个问题困扰了我们很久，后来我们分析smartUpload组件的源文件，因为文件上传采用的是字节流的方式，里面包含的参数名称和值也是字节流的方式传递的。smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来，问题就出现在smartUpload将字节流转换成字符串时采用了系统默认的编码，而将Resin设置成服务后，系统默认的编码可能发生了改变，因此出现了乱码。后来，我们更改了smartUpload的源文件，增加了一个属性charset和setCharset(String)方法，将upload()方法中提取参数语句：<br />String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );<br />改成了<br />String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );<br />终于解决了这个乱码问题。</p>
				<p>
						<b>三、后记</b>
						<br />接触Java和JSP已经有一年多了，这一年来最大的收获是越来越喜欢上了Java，开始把问题当作乐事去研究，没有了以前的恐惧心理，我相信我会继续坚持下去。这一年来，从网上学习了很多同行的宝贵经验，在此表示感谢。这是我第一篇自己总结的Java学习心得，由于水平有限，本文中偏颇和错误之处，欢迎指正。如果对你有些价值，在保留作者信息和文章原始出处的前提下可以随处转载。<br />撰写该文之前已参考了很多关于Java中文问题的文章，其中影响比较大的有owen1944在“Java研究组织”中发表的《这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享！》等。本文谈到的解决方法已应用到<a href="http://www.webcl.net.cn/" target="_blank"><font color="#8d8c8c">“基于网络的协作学习系统－WebCL”</font></a>等项目中，并通过资源绑定的方式实现了该平台中文文两个版本的即时切换。Google根据浏览器自动选择语言，一个页面同时显示多种语言的国际化应用和车东的<a href="http://www.chedong.com/tech/hello_unicode.html" target="_blank"><font color="#8d8c8c">《Java中文处理学习笔记——Hello Unicode》</font></a>一文引起了我极大的兴趣，日后想将继续探讨Java的国际化问题，欢迎大家一起讨论。<br /></p>
		</div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/49296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 16:54 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Myeclipse的困扰。。。。</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49283.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49283.html</trackback:ping><description><![CDATA[前几天用下了Myeclipse4.1.1来小试了一下。发现了一个不知道是不是bug的问题。<br /><br />Myeclipse4.1.1内置的struts1.1中&lt;html:errors /&gt;不能正常工作。<br /><br />我的resourses如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"># Resources </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> parameter </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">com.jackstudio.struts.ApplicationResources</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># Project P</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">MyEclipseTest<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />userNameIsNull</span><span style="COLOR: #000000">=&lt;</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">userName is require</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />whyNot</span><span style="COLOR: #000000">=&lt;</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">whyNot</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />okgood</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">the userName is right<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />errors.footer</span><span style="COLOR: #000000">=&lt;/</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">tr</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">table</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">fieldset</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />errors.header</span><span style="COLOR: #000000">=&lt;</span><span style="COLOR: #000000">fieldset</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">table</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">tr</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">img src</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://localhost:8080/MyEclipseTest/ico_tj_24.gif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;</span></div><br />首先我用Myeclipse4.1.1内置的struts1.1。代码如下；<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">        </span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">ActionErrors errors </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActionErrors();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            errors.add(ActionMessages.GLOBAL_MESSAGE, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActionMessage(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userNameIsNull</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            request.setAttribute(Globals.ERROR_KEY, errors);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">html:errors </span><span style="COLOR: #000000">/&gt;</span></div><br />这样的情况运行的结果是：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">org.apache.jasper.JasperException: org.apache.struts.action.ActionMessage<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:</span><span style="COLOR: #000000">372</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:</span><span style="COLOR: #000000">292</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:</span><span style="COLOR: #000000">236</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    javax.servlet.http.HttpServlet.service(HttpServlet.java:</span><span style="COLOR: #000000">802</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />当我用孙mm提供的（随书提供）struts，相同的代码却可以运行。<br />经过仔细查找，发现问题是出在了struts.jar这个文件里面。两者的大小根本都一样了（呵呵），于是用孙mm提供的struts.jar覆盖了MyEclipse里面的struts.jar,呵呵，问题解决了。<br />MyEclipse每建立一个struts项目都是从<br />{MyEclipse}\eclipse\plugins\com.genuitec.eclipse.cross.easystruts.eclipse_4.1.1\data\1.1\lib下读取struts.jar包的。所以替换了它就可以一劳永逸了。<br /><img src ="http://www.blogjava.net/jackstudio/aggbug/49283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 16:18 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>margin， padding，border之间的区别</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49204.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49204.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49204.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49204.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49204.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49204.html</trackback:ping><description><![CDATA[
		<p>边界<strong><code>margin</code></strong>和补白<strong><code>padding</code></strong>（依据国内出版社的翻译惯例，margin被翻译成边界，padding被翻译成补白，译者依照习惯翻译。但译者认为，margin翻译成外边距，padding翻译成内边距更为直白和形象。你可以依据自己的习惯来适应这两种不同的译法。——译者注）是隔开元素最常用的两个属性。边界是元素外边的距离，而补白则是元素内部的距离。</p>
		<p>为<code>h2</code>改进代码如下：</p>
		<pre>
				<code>h2 {</code>
				<code class="m1">font-size: 1.5em;</code>
				<code class="m1">
						<strong>background-color: #ccc;</strong>
				</code>
				<code class="m1">
						<strong>margin: 1em;</strong>
				</code>
				<code class="m1">
						<strong>padding: 3em;</strong>
				</code>
				<code>}</code>
		</pre>
		<p>你可以看到二级标题外围有一个字符的宽度，还很臃肿，因为在二级标题内部有3个字符宽度的补白。</p>
		<p>元素的四边可以设置不同的值。<strong><code>margin-top</code></strong>、 <strong><code>margin-right</code></strong>、<strong><code>margin-bottom</code></strong>、 <strong><code>margin-left</code></strong>、<strong><code>padding-top</code></strong>、<strong><code>padding-right</code></strong>、<strong><code>padding-bottom</code></strong>和<strong><code>padding-left</code></strong>是无需解释的属性（看看英文字面意思啦）。</p>
		<h2>盒状模型</h2>
		<p>边界、补白和边框（见<a href="http://book.chinaz.com/CSS/CSS1/cssbeginner/margins/borders.php">下一页</a>）是人尽皆知的盒状模型的组成所有部分。盒状模型是这样工作的：中间是元素盒子（在脑海中想像一下情形），从里到外依次包围着补白盒子、边框盒子和边界盒子。很显然地，如下所示：</p>
		<div style="PADDING-RIGHT: 1em; PADDING-LEFT: 1em; PADDING-BOTTOM: 1em; MARGIN: 0px 2em 1em; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccf">Margin box（边界盒） 
<div style="PADDING-RIGHT: 1em; PADDING-LEFT: 1em; PADDING-BOTTOM: 1em; PADDING-TOP: 0px; BACKGROUND-COLOR: #66f">Border box（边框盒） 
<div style="PADDING-RIGHT: 1em; PADDING-LEFT: 1em; PADDING-BOTTOM: 1em; PADDING-TOP: 0px; BACKGROUND-COLOR: #99f">Padding box（补白盒） 
<div style="BACKGROUND-COLOR: white">Element box（元素盒） </div></div></div></div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/49204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 11:20 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSS和DOM属性用法速查手册 </title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49197.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49197.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49197.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49197.html</trackback:ping><description><![CDATA[!important　增加特定规则的重要性。　 <br />:active　设置当链接处于激活状态时　a　元素的样式。　 <br />:first-letter　在对象的第一个字符上应用一个或多个样式。　 <br />:first-line　在对象的第一行上应用一个或多个样式。　 <br />:hover　设置当用户将鼠标指针悬停在链接上时　a　元素的样式。　 <br />:link　设置当链接最近没有访问过时　a　元素的样式。　 <br />:visited　设置当链接最近访问过时　a　元素的样式。　 <br />@charset　设置外部样式表的字符集。　 <br />@font-face　设置要嵌入　HTML　文档的字体。　 <br />@import　导入一个外部样式表。　 <br />@media　设置　styleSheet　对象中一组规则的媒体类型。　 <br />@page　设置　styleSheet　中页面框的尺寸、方向和边距。　 <br />abbr　设置或获取对象的缩写文本。　 <br />accelerator　设置或获取表明对象是否包含快捷键的字符串。　 <br />accept　设置或获取以逗号分隔的内容类型列表。　 <br />acceptCharset　设置或获取处理表单的服务器必须接受的输入数据所用的字符编码方式列表。　 <br />accessKey　设置或获取对象的快捷键。　 <br />action　设置或获取表单内容要发送处理的　URL。　 <br />activeElement　获取当父　document　拥有焦点时获得焦点的对象。　 <br />additive　设置或获取表明动画是否附加到其它动画的值。　 <br />align　设置或获取对象针对其邻接文本如何排列。　 <br />align　设置或获取标题或标志的排列。　 <br />align　设置或获取表格排列。　 <br />align　设置或获取对象相对于显示或表格的排列方式。　 <br />aLink　设置或获取元素中所有激活链接的颜色。　 <br />alinkColor　设置或获取元素中所有激活链接的颜色。　 <br />allowTransparency　设置或获取对象是否可为透明。　 <br />alt　设置或获取用于替代图像的文本。　 <br />altHTML　设置可选的若对象装载失败时要执行的替换　HTML　脚本。　 <br />altKey　设置或获取　Alt　键的状态。　 <br />altLeft　设置或获取左　Alt　键的状态。　 <br />appCodeName　获取浏览器的代码名称。　 <br />APPLICATION　表明对象的内容是否为　HTML　应用程序(HTA)，从而免除浏览器的安全模型。　 <br />appMinorVersion　获取应用程序的次版本值。　 <br />appName　获取浏览器的名称。　 <br />appVersion　获取浏览器运行的平台和版本。　 <br />archive　设置或获取可用于实现对象的你自己的　archive　功能的字符串。　 <br />ATOMICSELECTION　指定元素及其内容是否必须以一不可见单位统一选择。　 <br />autocomplete　设置或获取对象的自动完成状态。　 <br />availHeight　获取系统屏幕的工作区域高度，排除　Microsoft?　Windows?　任务栏。　 <br />availWidth　获取系统屏幕的工作区域宽度，排除　Windows　任务栏。　 <br />axis　设置或获取以逗号分隔的与对象关联的概念分类列表。　 <br />background　设置或获取对象最多五个独立的背景属性。　 <br />background　设置或获取页面上文本和图像后平铺的背景图片。　 <br />background　设置或获取对象中文本和图像后平铺的背景图片。　 <br />backgroundAttachment　设置或获取背景图像如何附加到文档内的对象中。　 <br />backgroundColor　设置或获取对象内容后的颜色。　 <br />backgroundImage　设置或获取对象的背景图像。　 <br />backgroundPosition　设置或获取对象背景的位置。　 <br />backgroundPositionX　设置或获取　backgroundPosition　属性的　x　坐标。　 <br />backgroundPositionY　设置或获取　backgroundPosition　属性的　y　坐标。　 <br />backgroundRepeat　设置或获取对象的　backgroundImage　属性如何平铺。　 <br />balance　设置或获取表明背景声音的音量如何分配在左右扬声器的值。　 <br />Banner　使用　event　对象获取高级流重定向器(ASX)文件中项目的　Banner　内容。　 <br />BannerAbstract　获取　ASX　文件项的　BannerAbstract　内容。　 <br />BaseHref　获取可找到对象标签的　URL　字符串。这通常是对象所在文档的　href，或者由　base　元素设置的值。　 <br />behavior　设置或获取文本如何在字幕中滚动。　 <br />behavior　设置或获取　DHTML　行为的位置。　 <br />BGCOLOR　设置对象后面的背景颜色。　 <br />bgColor　不推荐。设置或获取对象后面的背景颜色。　 <br />bgColor　不推荐。设置或获取表明对象后面的背景颜色的值。　 <br />bgProperties　设置或获取背景图片的属性。　 <br />blockDirection　获取表明块元素内容的绕排方向的值，是由左至右，还是由右至左。　 <br />border　设置或获取绘制对象周围边框的属性。　 <br />border　设置或获取框架间的空间，包括　3D　边框。　 <br />border　设置或获取绘制对象周围边框的宽度。　 <br />borderBottom　设置或获取对象下边框的属性。　 <br />borderBottomColor　设置或获取对象下边框的颜色。　 <br />borderBottomStyle　设置或获取对象下边框的样式。　 <br />borderBottomWidth　设置或获取对象下边框的宽度。　 <br />borderCollapse　设置或获取表明表格行和单元格边框是组合为单一边框还是像标准　HTML　那样分离。　 <br />borderColor　设置或获取对象的边框颜色。　 <br />borderColor　设置或获取对象的边框颜色。　 <br />borderColorDark　设置或获取用于绘制对象　3D　边框的两种颜色的一种。　 <br />borderColorLight　设置或获取用于绘制对象　3D　边框的两种颜色的一种。　 <br />borderLeft　设置或获取对象左边框的属性。　 <br />borderLeftColor　设置或获取对象左边框的颜色。　 <br />borderLeftStyle　设置或获取对象左边框的样式。　 <br />borderLeftWidth　设置或获取对象左边框的宽度。　 <br />borderRight　设置或获取对象右边框的属性。　 <br />borderRightColor　设置或获取对象右边框的颜色。　 <br />borderRightStyle　设置或获取对象右边框的样式。　 <br />borderRightWidth　设置或获取对象右边框的宽度。　 <br />borderStyle　设置或获取对象上下左右边框的样式。　 <br />borderTop　设置或获取对象上边框的属性。　 <br />borderTopColor　设置或获取对象上边框的颜色。　 <br />borderTopStyle　设置或获取对象上边框的样式。　 <br />borderTopWidth　设置或获取对象上边框的宽度。　 <br />borderWidth　设置或获取对象上下左右边框的宽度。　 <br />bottom　设置或获取围绕对象内容的矩形下边坐标。　 <br />bottom　设置或获取对象相对于文档层次中下个定位对象的底部的位置。　 <br />bottomMargin　设置或获取整个页面主体的底部边距。　 <br />boundingHeight　获取绑定　TextRange　对象的矩形的高度。　 <br />boundingLeft　获取绑定　TextRange　对象的矩形左边缘和包含　TextRange　对象的左侧之间的距离。　 <br />boundingTop　获取绑定　TextRange　对象的上边缘和包含　TextRange　对象的顶边之间的距离。　 <br />boundingWidth　获取绑定　TextRange　对象的矩形的宽度。　 <br />browserLanguage　获取浏览器的当前语言。　 <br />bufferDepth　设置或获取用于画面外位图缓冲颜色的每像素位数。　 <br />button　设置或获取用户所按的鼠标按钮。　 <br />cancelBubble　设置或获取当前事件是否要在事件句柄中向上冒泡。　 <br />canHaveChildren　获取表明对象是否可以包含子对象的值。　 <br />canHaveHTML　获取表明对象是否可以包含丰富的　HTML　标签的值。　 <br />caption　获取表格的　caption　对象。　 <br />cellIndex　获取对象于所在行的　cells　集合中的位置。　 <br />cellPadding　设置或获取介于单元格边框和单元格内容之间的空间总量。　 <br />cellSpacing　设置或获取表格中单元格之间的空间总量。　 <br />ch　设置或获取可用于实现对象的你自己的　ch　功能的字符串。　 <br />charset　设置或获取用于解码对象的字符集。　 <br />checked　设置或获取复选框或单选钮的状态。　 <br />chOff　设置或获取可用于实现对象的你自己的　chOff　功能的字符串。　 <br />cite　设置或获取关于　对象的参考信息。　 <br />classid　设置或获取对象的类标识符。　 <br />className　设置或获取对象的类。　 <br />clear　设置或获取对象是否允许在其左侧、右侧或两边放置浮动对象，以防下段文本显示在浮动对象上。　 <br />clear　设置或获取当在文档中插入换行符后浮动对象在哪边不能定位。　 <br />clientHeight　获取对象的高度，不计算任何边距、边框、滚动条，但包括该对象的补白。　 <br />clientLeft　获取　offsetLeft　属性和客户区域的实际左边之间的距离。　 <br />clientTop　获取　offsetTop　属性和客户区域的实际顶端之间的距离。　 <br />clientWidth　获取对象的宽度，不计算任何边距、边框、滚动条，但包括该对象的补白。　 <br />clientX　设置或获取鼠标指针位置相对于窗口客户区域的　x　坐标，其中客户区域不包括窗口自身的控件和滚动条。　 <br />clientY　设置或获取鼠标指针位置相对于窗口客户区域的　y　坐标，其中客户区域不包括窗口自身的控件和滚动条。　 <br />clip　设置或获取定位对象的哪个部分可见。　 <br />clipBottom　获取对象剪裁区域的底边坐标。　 <br />clipLeft　获取对象剪裁区域的左边坐标。　 <br />clipRight　获取对象剪裁区域的右边坐标。　 <br />clipTop　获取对象剪裁区域的顶边坐标。　 <br />closed　获取引用窗口是否已关闭。　 <br />code　设置或获取包含已编译的　Java　类的文件的　URL。　 <br />codeBase　设置或获取组件的　URL。　 <br />codeType　设置或获取于对相关联代码的　Internet　媒体类型。　 <br />color　设置或获取　mpc　行为的容器文本颜色。　 <br />color　设置或获取对象所使用的颜色。　 <br />color　设置或获取对象文本的颜色。　 <br />colorDepth　获取用于目标设置或缓冲区的颜色每像素位数。　 <br />cols　设置或获取对象的宽度。　 <br />cols　设置或获取表格的列数。　 <br />cols　设置或获取对象的框架宽度。　 <br />colSpan　设置或获取对象应该跨越的表格列数。　 <br />compact　设置或获取表明列表是否应该通过删除列表对象间的额外空白来压缩的　Boolean　值。　 <br />compatMode　设置或获取表明此对象是否应用标准兼容模式的值。　 <br />complete　获取对象是否已完全装入。　 <br />content　设置或获取与　HTTP-EQUIV　或　NAME　关联的资源信息。　 <br />contentEditable　设置或获取表明用户是否可编辑对象内容的字符串。　 <br />contentOverflow　获取表明文档处理当前　LayoutRect　对象后是否包含附加的内容。　 <br />contentWindow　获取指定的　frame　或　iframe　的　window　对象。　 <br />cookie　设置或获取　cookie　的字符串值。　 <br />cookieEnabled　获取客户端的永久　cookie　是否在浏览器中启用。永久　cookie　是储存在客户端计算机上的。　 <br />coords　设置或获取对象的坐标。　 <br />Count　获取可用块格式化标签的数量。　 <br />cpuClass　获取指示　CPU　等级的字符串。　 <br />cssText　设置或获取样式规则的永久表述。　 <br />ctrlKey　设置或获取　Ctrl　键的状态。　 <br />ctrlLeft　设置或获取左　Ctrl　键的状态。　 <br />cursor　设置或获取当鼠标指针指向对象时所使用的鼠标指针。　 <br />data　设置或获取引用对象数据的　URL。　 <br />data　设置或获取　TextNode　对象的值。　 <br />dataFld　设置或获取由　dataSrc　属性指定的绑定到指定对象的给定数据源的字段。　 <br />dataFld　设置或获取　oncellchange　事件影响的数据列。　 <br />DATAFLD　设置用于数据绑定的给定数据源的字段。　 <br />dataFormatAs　设置或获取如何渲染提供给对象的数据。　 <br />DATAFORMATAS　设置或获取将提供给对象的数据渲染为文本还是　HTML。　 <br />dataPageSize　设置或获取绑定到数据源的表格中显示的记录数。　 <br />dataSrc　设置或获取用于数据绑定的数据源。　 <br />DATASRC　设置用于数据绑定的数据源。　 <br />dateTime　设置或获取修改对象的日期和时间。　 <br />declare　设置或获取可用于实现对象的你自己的　declare　功能的字符串。　 <br />defaultCharset　从当前的区域语言中获取缺省字符集。　 <br />defaultChecked　设置或获取复选框或单选钮的状态。　 <br />defaultSelected　设置或获取选项的状态。　 <br />defaultStatus　设置或获取要在窗口底部的状态栏上显示的缺省信息。　 <br />defaultValue　设置或获取对象的初始内容。　 <br />defer　设置或获取脚本的状态。　 <br />designMode　设置或获取表明文档是否可被编辑的值。　 <br />deviceXDPI　设置或获取系统屏幕水平每英寸点数(DPI)的数值。　 <br />deviceYDPI　设置或获取系统屏幕垂直每英寸点数(DPI)的数值。　 <br />dialogArguments　设置或获取传递给模式对话框窗口的变量或变量数组。　 <br />dialogHeight　设置或获取模式对话框的高度。　 <br />dialogLeft　设置或获取模式对话框的左坐标。　 <br />dialogTop　设置或获取模式对话框的顶坐标。　 <br />dialogWidth　设置或获取模式对话框的宽度。　 <br />dir　设置或获取对象的阅读顺序。　 <br />direction　设置或获取文本滚动的方向。　 <br />direction　设置或获取对象的阅读顺序。　 <br />disabled　设置或获取控件的状态。　 <br />disabled　设置或获取是否已为对象应用样式表。　 <br />disabled　获取表明用户是否可与该对象交互的值。　 <br />disabled　设置或获取可用于实现对象的你自己的　disabled　功能的字符串。　 <br />display　设置或获取对象是否要渲染。　 <br />doctype　获取与当前文档关联的文档类型声明。　 <br />document　获取给定弹出窗口中的　HTML　文档。　 <br />documentElement　获取对文档根结点的引用。　 <br />domain　设置或获取文档的安全域名。　 <br />dropEffect　设置或获取拖曳操作的类型和要显示的光标类型。　 <br />dynsrc　设置或获取要在窗口中显示的视频剪辑或　VRML　世界。　 <br />effectAllowed　设置或获取数据传送操作可应用于该对象的源元素。　 <br />encoding　设置或获取表单的　MIME　编码。　 <br />enctype　设置或获取表单的多用途网际邮件扩展(MIME)编码。　 <br />event　设置或获取脚本编写用于的事件。　 <br />expando　设置或获取表明是否可对象内创建任意变量的值。　 <br />face　设置或获取当前的字样家族。　 <br />fgColor　设置或获取文档的前景(文本)颜色。　 <br />FieldDelim　指定用于标明数据字段结束的字符。　 <br />fileCreatedDate　获取文件创建的日期。　 <br />fileModifiedDate　获取文件上次修改的日期。　 <br />fileSize　获取文件大小。　 <br />fileUpdatedDate　获取文件上次更新的日期。　 <br />filter　设置或获取应用于对象的滤镜或滤镜集合。　 <br />firstChild　获取对象的　childNodes　集合的第一个子对象的引用。　 <br />font　设置或获取对象最多六个独立的字体属性。　 <br />fontFamily　设置或获取对象文本所使用的字体名称。　 <br />fontSize　设置或获取对象文本使用的字体大小。　 <br />fontSmoothingEnabled　获取用户是否在控制面板的显示设置中启用了圆整屏幕字体边角的选项。　 <br />fontStyle　设置或获取对象的字体样式，如斜体、常规或倾斜。　 <br />fontVariant　设置或获取对象文本是否以小型大写字母显示。　 <br />fontWeight　设置或获取对象的字体宽度。　 <br />form　获取对象所嵌入的表单的引用。　 <br />frame　设置或获取表格周围的边框显示的方式。　 <br />frameBorder　设置或获取是否显示框架的边框。　 <br />frameElement　获取　frame　或　iframe　对象所在父文档的窗口。　 <br />frameSpacing　设置或获取框架间附加空间总量。　 <br />fromElement　设置或获取事件发生时激活或鼠标将要离开的对象。　 <br />galleryImg　设置或获取对于当前图像我的图片支持图像工具栏是否可见。　 <br />hash　设置或获取　href　属性中在井号“#”后面的分段。　 <br />hasLayout　获取表明对象是否有布局的值。　 <br />headers　设置或获取为对象提供信息的标题单元格。　 <br />height　获取屏幕的垂直分辨率。　 <br />height　设置或获取对象的高度。　 <br />height　设置或获取对象的高度。　 <br />hidden　设置或获取表明嵌入对象是否可见的值。　 <br />hideFocus　设置或获取表明对象是否显式标明焦点的值。　 <br />host　设置或获取　location　或　URL　的　hostname　和　port　号码。　 <br />hostname　设置或获取　location　或　URL　的主机名称部分。　 <br />href　设置或获取链接样式表的　URL。　 <br />href　设置或获取目标　URL　或锚点。　 <br />href　设置或获取相对链接基于的　URL。　 <br />href　设置或获取整个　URL　为字符串。　 <br />hreflang　设置或获取对象的语言代码。　 <br />hspace　设置或获取对象的水平边距。　 <br />htmlFor　设置或获取绑定到事件脚本的对象。　 <br />htmlFor　设置或获取给定标签对象指定到的对象。　 <br />htmlText　获取　HTML　源文件为合法的　HTML　片段。　 <br />httpEquiv　设置或获取用于将　META　标签的内容绑定到　HTTP　响应头的信息。　 <br />id　获取标识对象的字符串。　 <br />imeMode　设置或获取输入方法编辑器(IME)的状态。　 <br />implementation　获取当前文档的　implementation　对象。　 <br />indeterminate　设置或获取用户是否已经更改了复选框的状态。　 <br />index　设置或获取列表框中选项的依序位置。　 <br />innerHTML　设置或获取位于对象起始和结束标签内的　HTML。　 <br />innerText　设置或获取位于对象起始和结束标签内的文本。　 <br />isContentEditable　获取表明用户是否可编辑对象内容的值。　 <br />isDisabled　获取表明用户是否可与该对象交互的值。　 <br />isMap　设置或获取图像是否为服务器端图像映射。　 <br />isMultiLine　获取表明对象的内容是包含一行还是多行的值。　 <br />isOpen　获取表明弹出窗口是否已打开的值。　 <br />isTextEdit　获取是否可使用该对象创建一个　TextRange　对象。　 <br />keyCode　设置或获取与导致事件的按键关联的　Unicode　按键代码。　 <br />label　设置或获取选项组的标签。　 <br />label　设置或获取可用于实现对象的你自己的　label　功能的字符串。　 <br />lang　设置或获取要使用的语言。　 <br />language　设置或获取当前脚本编写用的语言。　 <br />lastChild　获取该对象　childNodes　集合中最后一个子对象的引用。　 <br />lastModified　获取页面上次修改的日期，若页面提供的话。　 <br />layoutFlow　设置或获取对象内容的方向和绕排方向。　 <br />layoutGrid　设置或获取指定文本字符版面的组合文档格线属性。　 <br />layoutGridChar　设置或获取用于渲染元素文本内容的字符网格大小。　 <br />layoutGridLine　设置或获取用于渲染元素文本内容的网格线值。　 <br />layoutGridMode　设置或获取文本布局网格是否使用二维。　 <br />layoutGridType　设置或获取用于渲染元素文本内容的网格类型。　 <br />left　设置或获取对象相对于文档层次中下个定位对象的左边界的位置。　 <br />left　设置或获取围绕对象内容的矩形左边坐标。　 <br />leftMargin　设置或获取页面的整个主体的左边距，而不是缺省的边距。　 <br />length　设置或获取集合中对象的数目。　 <br />length　获取　TextNode　对象中的字符数目。　 <br />length　获取历史列表中的元素数目。　 <br />letterSpacing　设置或获取对象的字符间附加空间的总和。　 <br />lineBreak　设置或获取日本文本的换行规则。　 <br />lineHeight　设置或获取对象两行间的距离。　 <br />link　设置或获取对象文档链接的颜色。　 <br />linkColor　设置或获取对象文档链接的颜色。　 <br />listStyle　设置或获取对象最多三个独立的　listStyle　属性。　 <br />listStyleImage　设置或获取要为对象应用的列表项目符号的图像。　 <br />listStylePosition　设置或获取相对于对象内容如何绘制项目符号。　 <br />listStyleType　设置或获取对象预定义的项目符号类型。　 <br />logicalXDPI　获取系统屏幕水平每英寸点数(DPI)的常规数值。　 <br />logicalYDPI　获取系统屏幕垂直每英寸点数(DPI)的常规数值。　 <br />longDesc　设置或获取对象长描述的统一资源标识符(URI)。　 <br />loop　设置或获取字幕播放的次数。　 <br />loop　设置或获取声音或视频剪辑激活后循环播放的次数。　 <br />lowsrc　设置或获取要显示的较低分辨率图像。　 <br />margin　设置或获取对象的上下左右边距。　 <br />marginBottom　设置或获取对象的下边距宽度。　 <br />marginHeight　设置或获取显示框架中文本之前的上下边距高度。　 <br />marginLeft　设置或获取对象的左边距宽度。　 <br />marginRight　设置或获取对象的右边距宽度。　 <br />marginTop　设置或获取对象的上边距宽度。　 <br />marginWidth　设置或获取显示框架中文本之前的左右边距宽度。　 <br />maxLength　设置或获取用户可在文本控件中输入的最多字符数。　 <br />media　设置或获取媒体类型。　 <br />menuArguments　返回快捷菜单执行所在的窗口对象。　 <br />method　设置或获取如何将表单数据发送到服务器。　 <br />Methods　设置或获取该对象支持的　HTTP　方式清单。　 <br />minHeight　设置或获取元素的最小高度。　 <br />MoreInfo　通过　event　对象获取高级流重定向器(ASX)文件中项目横幅的　MoreInfo　内容。　 <br />multiple　设置或获取表明列表中是否可选中多个项目的　Boolean　值。　 <br />name　设置或获取框架的名称。　 <br />name　设置或获取　meta　对象的　CONTENT　标签属性中指定的值。　 <br />name　设置或获取对象的名称。　 <br />name　获取命名空间的名称。　 <br />name　设置或获取元素的输入参数的名称。　 <br />name　设置或获取表明窗口名称的值。　 <br />nameProp　获取由对象的　href　或　src　属性指定的文件名。　 <br />nextPage　获取打印模板中下页的位置。　 <br />nextSibling　获取对此对象的下一个兄弟对象的引用。　 <br />nodeName　获取特定结点类型的名称。　 <br />nodeType　获取所需结点的类型。　 <br />nodeValue　设置或获取结点的值。　 <br />noHref　设置或获取在此区域内单击是否引起操作。　 <br />noResize　设置或获取用户是否可缩放框架。　 <br />noShade　设置或获取水平线是否要绘制　3D　阴影。　 <br />noWrap　设置或获取浏览器是否执行自动换行 
<p><br />DOM属性用法速查手册</p><p></p><p>--------------------------------------------------------------------------------</p><p>object　返回包含的对象。　 <br />offscreenBuffering　设置或获取对象在对用户可见之前是否要先在屏幕外绘制。　 <br />offsetHeight　获取对象相对于版面或由父坐标　offsetParent　属性指定的父坐标的高度。　 <br />offsetLeft　获取对象相对于版面或由　offsetParent　属性指定的父坐标的计算左侧位置。　 <br />offsetParent　获取定义对象　offsetTop　和　offsetLeft　属性的容器对象的引用。　 <br />offsetTop　获取对象相对于版面或由　offsetTop　属性指定的父坐标的计算顶端位置。　 <br />offsetWidth　获取对象相对于版面或由父坐标　offsetParent　属性指定的父坐标的宽度。　 <br />offsetX　设置或获取鼠标指针位置相对于触发事件的对象的　x　坐标。　 <br />offsetY　设置或获取鼠标指针位置相对于触发事件的对象的　y　坐标。　 <br />onLine　获取表明系统是否处于全局脱机模式的值。　 <br />opener　设置或获取创建当前窗口的窗口的引用。　 <br />outerHTML　设置或获取对象及其内容的　HTML　形式。　 <br />outerText　设置或获取对象的文本。　 <br />overflow　设置或获取表明当内容超出对象高度或宽度时如何管理对象内容的值。　 <br />overflowX　设置或获取当内容超出对象宽度时如何管理对象内容。　 <br />overflowY　设置或获取当内容超出对象高度时如何管理对象内容。　 <br />ownerDocument　设置或获取结点关联的　document　对象。　 <br />owningElement　获取　HTML　层次中的下个对象。　 <br />padding　设置或获取要在对象和其边距或若存在的边框的话就是对象和其边框之间要插入的全部空间。　 <br />paddingBottom　设置或获取要在对象下边框和内容之间插入的空间总量。　 <br />paddingLeft　设置或获取要在对象左边框和内容之间插入的空间总量。　 <br />paddingRight　设置或获取要在对象右边框和内容之间插入的空间总量。　 <br />paddingTop　设置或获取对象上边框和内容之间插入的空间总量。　 <br />pageBreakAfter　设置或获取表明对象后发生换页的字符串。　 <br />pageBreakBefore　设置或获取表明对象前发生换页的字符串。　 <br />palette　获取用于嵌入文档的调色板。　 <br />parent　获取对象层次中的父窗口。　 <br />parentElement　获取对象层次中的父对象。　 <br />parentNode　获取文档层次中的父对象。　 <br />parentStyleSheet　获取导入到当前样式表的样式表。　 <br />parentTextEdit　获取文档层次中可用于创建包含原始对象的　TextRange　的容器对象。　 <br />parentWindow　获取容器对象所在窗口的引用。　 <br />pathname　设置或获取对象指定的文件名或路径。　 <br />pixelBottom　设置或获取对象的下方位置。　 <br />pixelHeight　设置或获取对象的高度。　 <br />pixelLeft　设置或获取对象的左侧位置。　 <br />pixelRight　设置或获取对象的右侧位置。　 <br />pixelTop　设置或获取对象的上方位置。　 <br />pixelWidth　设置或获取对象的宽度。　 <br />platform　获取用户的操作系统名称。　 <br />pluginspage　获取用于查看嵌入文档的插件　URL。　 <br />port　设置或获取与　URL　关联的端口号码。　 <br />posBottom　设置或获取以　bottom　标签属性指定的单位的对象下方位置。　 <br />posHeight　设置或获取以　height　标签属性指定的单位的对象高度。　 <br />position　设置或获取对象所使用的定位方式。　 <br />posLeft　设置或获取以　left　标签属性指定的单位的对象左侧位置。　 <br />posRight　设置或获取以　right　标签属性指定的单位的对象右侧位置。　 <br />posTop　设置或获取以　top　标签属性指定的单位的对象上方位置。　 <br />posWidth　设置或获取以　width　标签属性指定的单位的对象宽度。　 <br />previousSibling　获取对此对象的上一个兄弟对象的引用。　 <br />profile　设置或获取对象的属性和及这些属性的合法值所定义的一个或多个　URI。　 <br />propertyName　设置或获取对象上发生更改的属性名称。　 <br />protocol　设置或获取　URL　的协议部分。　 <br />pseudoClass　获取标识　@page　规则应用到的页面的伪类的字符串。　 <br />qualifier　设置或获取由数据源对象提供的数据成员的名称。　 <br />readOnly　获取规则或样式表是定义在页面上还是导入的。　 <br />readOnly　设置或获取表明对象内容是否为只读的值。　 <br />readyState　获取对象的当前状态。　 <br />readyState　获取对象的当前状态。　 <br />readyState　获取对象的当前状态。　 <br />reason　设置或获取数据源对象的数据传输结果。　 <br />recordNumber　获取数据集中生成对象的原始记录。　 <br />recordset　从数据源对象设置或获取对缺省数据集的引用。　 <br />referrer　获取将用户引入当前页面的位置　URL。　 <br />rel　设置或获取对象和链接目的的关系。　 <br />repeat　获取　onkeydown　事件是否正在重复。　 <br />returnValue　设置或获取从模式对话框返回的值。　 <br />returnValue　设置或获取事件的返回值。　 <br />rev　设置或获取对象和链接目的的关系。　 <br />right　设置或获取围绕对象内容的矩形右边坐标。　 <br />right　设置或获取对象相对于文档层次中下个已定位的对象的右边界的位置。　 <br />rightMargin　设置或获取页面的整个主体的右边距，而不是缺省的边距。　 <br />rowIndex　获取对象在表格的　rows　集合中的位置。　 <br />rows　设置或获取对象中包含的水平行数。　 <br />rows　设置或获取对象的框架高度。　 <br />rowSpan　设置或获取单元格要跨越表格的多少行。　 <br />rubyAlign　设置或获取由　rt　对象指定的注音文本的位置。　 <br />rubyOverhang　设置或获取由　rt　对象指定的注音文本的位置。　 <br />rubyPosition　设置或获取由　rt　对象指定的注音文本的位置。　 <br />rules　设置或获取要显示哪些分隔线(内部边框)。　 <br />saveType　当　oncontentsave　触发时获取剪贴板类型。　 <br />scheme　设置或获取用于解释为对象指定的属性值的方案。　 <br />scope　设置或获取对象的信息所应用的标格单元格组。　 <br />scopeName　获取为该元素定义的命名空间。　 <br />screenLeft　获取浏览器客户区左上角相对于屏幕左上角的　x　坐标。　 <br />screenTop　获取浏览器客户区左上角相对于屏幕左上角的　y　坐标。　 <br />screenX　设置或获取获取鼠标指针位置相对于用户屏幕的　x　坐标。　 <br />screenY　设置或获取鼠标指针位置相对于用户屏幕的　y　坐标。　 <br />scroll　设置或获取滚动是否关闭。　 <br />scrollAmount　设置或获取介于每个字幕绘制序列之间的文本滚动像素数。　 <br />scrollbar3dLightColor　设置或获取滚动条上滚动按钮和滚动滑块的左上颜色。　 <br />scrollbarArrowColor　设置或获取滚动箭头标识的颜色。　 <br />scrollbarBaseColor　设置或获取滚动条的主要颜色，其中包含滚动按钮和滚动滑块。　 <br />scrollbarDarkShadowColor　设置或获取滚动条上滑槽的颜色。　 <br />scrollbarFaceColor　设置或获取滚动条和滚动条的滚动箭头的颜色。　 <br />scrollbarHighlightColor　设置或获取滚动框和滚动条滚动箭头的左上边缘颜色。　 <br />scrollbarShadowColor　设置或获取滚动框和滚动条滚动箭头的右下边缘颜色。　 <br />scrollbarTrackColor　设置或获取滚动条轨迹元素的颜色。　 <br />scrollDelay　设置或获取字幕滚动的速度。　 <br />scrollHeight　获取对象的滚动高度。　 <br />scrolling　设置或获取框架是否可被滚动。　 <br />scrollLeft　设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。　 <br />scrollTop　设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。　 <br />scrollWidth　获取对象的滚动宽度。　 <br />search　设置或获取　href　属性中跟在问号后面的部分。　 <br />sectionRowIndex　获取对象位于　tBody,　tHead,　tFoot　或　rows　集合中的位置。　 <br />SECURITY　获取表明　frame　或　iframe　的源文件是否应用了特定的安全限制的值。　 <br />selected　设置或获取列表框中的选项是否为缺省项目。　 <br />selectedIndex　设置或获取选中选项位于　select　对象中的位置。　 <br />selector　获取标识　@page　规则应用到的页的字符串。　 <br />selectorText　获取标识相应的样式表规则应用到的元素的字符串。　 <br />self　获取对当前窗口或框架的引用。　 <br />shape　设置或获取对象的形状。　 <br />shiftKey　设置或获取　Shift　键的状态。　 <br />shiftLeft　设置或获取左　Shift　键的状态。　 <br />size　设置或获取该对象的字体大小。　 <br />size　设置或获取　hr　对象的高度。　 <br />size　设置或获取控件的大小。　 <br />size　设置或获取列表中的行数。　 <br />sourceIndex　获取对象在源序中的依次位置，即对象出现在　document　的　all　集合中的顺序。　 <br />span　设置或获取组中的列数。　 <br />specified　获取是否指定了该属性。　 <br />src　设置或获取要播放的声音的　URL。　 <br />src　获取包含有源代码或数据的外部文件的　URL。　 <br />src　设置或获取要由对象装入的　URL。　 <br />srcElement　设置或获取触发事件的对象。　 <br />srcFilter　设置或获取触发　onfilterchange　事件的滤镜对象。　 <br />srcUrn　获取触发事件的行为的统一资源名称(URN)。　 <br />standby　设置或获取可用于实现对象的你自己的　standby　功能的字符串。　 <br />start　设置或获取编号列表的起始编号。　 <br />start　设置或获取视频剪辑文件应该开始播放的时间。　 <br />status　设置或获取位于窗口底部状态栏的信息。　 <br />status　设置或获取表明控件是否选中的值。　 <br />STYLE　为该设置元素设置内嵌样式。　 <br />styleFloat　设置或获取文本要绕排到对象的哪一侧。　 <br />summary　设置或获取对象的描述和/或结构。　 <br />systemLanguage　获取操作系统适用的缺省语言。　 <br />tabIndex　设置或获取定义对象的　Tab　顺序的索引。　 <br />tableLayout　设置或获取表明表格布局是否固定的字符串。　 <br />tabStop　设置或获取元素行为是否可收到焦点并参与　Tab　序列。　 <br />tagName　获取对象的标签名称。　 <br />tagUrn　设置或获取在命名空间声明中指定的统一资源名称(URN)。　 <br />target　设置或获取目标内容要显示于哪个窗口或框架。　 <br />text　设置或获取范围内包含的文本。　 <br />text　设置或获取文档主体的文本(前景)颜色。　 <br />text　设置或获取对象文本的字符串形式。　 <br />text　设置或获取由　option　标签指定的字符串。　 <br />textAlign　设置或获取对象中的文本是左对齐、右对齐、居中对齐还是两端对齐。　 <br />textAlignLast　设置或获取如何排列对象的最后一行或仅有的一行。　 <br />textAutospace　设置或获取自动留空和文本的窄空间宽度调整。　 <br />textDecoration　设置或获取对象中的文本是否有闪烁、删除线、上划线或下划线的样式。　 <br />textDecorationBlink　设置或获取表明对象的　textDecoration　属性是否含有有“blink”的　Boolean　值。　 <br />textDecorationLineThrough　设置或获取表明对象内的文本是否有删除线的　Boolean　值。　 <br />textDecorationNone　设置或获取表明对象的　textDecoration　属性是否设置为　none　的　Boolean　值。　 <br />textDecorationOverline　设置或获取表明对象中的文本是否有上划线的　Boolean　值。　 <br />textDecorationUnderline　设置或获取对象中的文本是否有下划线的　Boolean　值。　 <br />textIndent　设置或获取对象中文本的缩进。　 <br />textJustify　设置或获取对象内的文本所使用的对齐类型。　 <br />textKashidaSpace　设置或获取对象内文本对齐行时所使用空白扩展的　kashida　扩展的倍率。　 <br />textOverflow　设置或获取表明是否显示省略号以表明文本溢出的值。　 <br />textTransform　设置或获取对象中文本的渲染方式。　 <br />textUnderlinePosition　设置或获取对象的　textDecoration　属性中设置的下划线的位置。　 <br />tFoot　获取表格的　tFoot　对象。　 <br />tHead　获取表格的　tHead　对象。　 <br />title　设置或获取样式表的标题。　 <br />title　设置或获取对象的咨询信息(工具提示)。　 <br />toElement　设置或获取用户要将鼠标指针移动指向的对象的引用。　 <br />top　设置或获取对象相对于文档层次中下个定位对象的上边界的位置。　 <br />top　获取最顶层的祖先窗口。　 <br />top　设置或获取围绕对象内容的矩形上边坐标。　 <br />topMargin　设置或获取页面的上边距。　 <br />trueSpeed　设置或获取字幕的位置是否使用　scrollDelay　和　scrollAmount　属性计算，已过的实际时间来自于时钟计时。　 <br />type　设置或获取列表的样式。　 <br />type　获取选中区的类型。　 <br />type　获取样式表编写所用的样式表(CSS)语言。　 <br />type　获取按钮的分类和缺省行为。　 <br />type　从　event　对象中获取事件名称。　 <br />type　设置或获取对象的　MIME　类型。　 <br />type　获取样式表编写所用的样式表(CSS)语言。　 <br />type　获取或初始设置对象所代表的　input　控件类型。　 <br />type　设置或获取关联的脚本引擎的　MIME　类型。　 <br />type　根据　MULTIPLE　属性的值获取　select　控件的类型。　 <br />type　获取控件类型。　 <br />type　设置或获取　value　标签属性指明的资源内容类型。　 <br />typeDetail　获取选中区类型的名称。　 <br />unicodeBidi　设置或获取关于双向法则的嵌入级别。　 <br />uniqueID　获取为对象自动生成的唯一标识符。　 <br />units　设置或获取　embed　对象的高度和宽度单位。　 <br />UNSELECTABLE　指定该元素不可被选中。　 <br />updateInterval　设置或获取屏幕的更新间隔。　 <br />URL　设置或获取当前文档的　URL。　 <br />URLUnencoded　获取文档的　URL，去除所有字符编码。　 <br />urn　设置或获取目标文档的　URN。　 <br />useMap　设置或获取用于客户端图像映射的　URL，通常带有一个书签扩展(#name)。　 <br />userAgent　获取等同于　HTTP　用户代理请求头的字符串。　 <br />userLanguage　获取操作系统的自然语言设置。　 <br />vAlign　设置或获取标题是表格的上面还是下面。　 <br />vAlign　设置或获取文本和其它内容在对象内的垂直方向上如何排列。　 <br />value　获取或设置　textArea　元素字段中的文本。　 <br />value　获取控件的缺省或选中值。　 <br />value　设置或获取列表项目的值。　 <br />value　设置或获取当表单控件提交时返回给服务器的值。　 <br />value　设置或获取控件对象的显示值。当控件对象提交时此值将返回给服务器。　 <br />value　设置或获取元素的输入参数值。　 <br />value　当文本通过用户输入设置后获取　input　对象的文件名。　 <br />value　设置或获取对象的值。　 <br />valueType　设置或获取　value　标签属性的数据类型。　 <br />vcard_name　设置或获取对象的　vCard　值，以便用于自动完成框。　 <br />version　设置或获取管理当前文档的文档类型定义(DTD)版本。　 <br />verticalAlign　设置或获取对象的垂直排列。　 <br />viewInheritStyle　设置或获取表明文档片段是否继承主文档中设置的　CSS　样式的值。　 <br />viewLink　设置或获取给主元素提供内容的　document　对象。　 <br />viewMasterTab　设置或获取表明　viewlink　的主元素是否包含在主文档的　Tab　序列中的值。　 <br />visibility　设置或获取对象的内容是否显示。　 <br />vLink　设置或获取对象中已访问链接的颜色。　 <br />vlinkColor　设置或获取用户已访问过的链接颜色。　 <br />volume　设置或获取声音的音量设置。　 <br />vspace　设置或获取对象的垂直边距。　 <br />wheelDelta　设置或获取滚轮按钮滚动的距离和方向。　 <br />whiteSpace　设置或获取对象中是否自动换行。　 <br />width　获取屏幕的垂直分辨率。　 <br />width　设置或获取对象的计算宽度。　 <br />width　设置或获取对象的宽度。　 <br />width　设置或获取对象的宽度。　 <br />width　设置或获取可用于实现对象的你自己的　width　功能的字符串。　 <br />wordBreak　设置或获取单词内的换行行为，特别是对象中出现多语言的情况。　 <br />wordSpacing　设置或获取对象中单词间的附加空间总量。　 <br />wordWrap　设置或获取当内容超过其容器边界时是否断词。　 <br />wrap　设置或获取如何处理对象中的自动换行。　 <br />writingMode　设置或获取对象内容的方向和绕排。　 <br />x　设置或获取鼠标指针位置相对于父文档的　x　像素坐标。　 <br />XMLDocument　获取对由对象引出的的　XML　文档对象模型(DOM)的引用。　 <br />XMLNS　声明　HTML　文档中自定义标签的命名空间。　 <br />XSLDocument　获取对　XSL　文档的顶层结点的引用。　 <br />y　设置或获取鼠标指针位置相对于父文档的　y　像素坐标。　 <br />zIndex　设置或获取定位对象的堆叠次序。　 <br />zoom　设置或获取对象的放大比例</p><img src ="http://www.blogjava.net/jackstudio/aggbug/49197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 11:04 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取得 HTML 中的元素时应该注意</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49167.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49167.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49167.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49167.html</trackback:ping><description><![CDATA[
		<p>在這範例中，若要取得 form 裡面的 text 的元素的話，相信應該是很多人都會用 document.all("text1") 或是用 document.form1.text1 吧！在 IE 、 FireFox 及 Opera 中，以上兩種寫法都是可以執行的，但要注意的是： <font color="#ff0000">document.all 並非是標準的寫法</font>。</p>
		<p>而在 W3C 的標準中，建議使用 getElementById 來取得某特定 ID 的元素；另外也可以用 getElementsByName 或是 getElementsByTagName 來取得某特定 Name 或是類型的元素集合。</p>
		<p>
				<strong>getElementById(elementId)</strong>
		</p>
		<p>在 HTML 中，每個元素都可以有自己專屬的 ID 。 在 HTML 中要使用 id 屬性來指定 ID ，且在 HTML 中是不能有元素使用同一個 ID 的，但是可以不使用 ID 。所以在上面的範例中，我們可以用 document.getElementById("text1") 來取得 ID 為 text1 的元素。</p>
		<p>
				<strong>getElementsByName(elementName)</strong>
		</p>
		<p>若用 document.getElementsByName 的話，則可以取得所有某特定 Name 的元素集合。回傳的元素集合是一個陣列。所以在上面的範例中，我們可以用 document.getElementsByName("text1") 來取得 Name 為 text1 的元素集合，而在元素集合中的第一個元素則是 document.getElementsByName("text1")[0] 。</p>
		<p>
				<font color="#ff0000">註： </font>
				<font color="#ff0000">getElementsByName 在 DOM Level 3 中已經被拿掉了。</font>
		</p>
		<p>
				<strong>getElementsByTagName(tagName)</strong>
		</p>
		<p>若用 document.getElementsByTagName 的話，則可以取得所有某特定類型的元素集合。回傳的元素集合是一個陣列。所以在上面的範例中，我們可以用 document.getElementsByTagName("input") 來取得類型為 input 的元素集合，而在元素集合中的第一個元素則是 document.getElementsByTagName("input")[0] 。</p>
		<p>
				<strong>總結：所以像 document.all 這種非標準的語法就別再使用了，請改用 document.getElementById(elementId) 。</strong>
		</p>
		<p>另外要注意的是，除了 getElement<font color="#ff0000">s</font>ByName 跟 getElement<font color="#ff0000">s</font>ByTagName 中都有一個 <font color="#ff0000">s </font><font color="#000000">，</font><font color="#000000">而 getElementById 則沒有喔！你就把它想成是因為 getElementById 只是取得單一元素，而 getElementsByName 跟 getElementsByTagName 都是取得元素集合，所以是複數型態就要加 <font color="#ff0000">s </font>囉。</font></p>
		<p>且 getElementsByName 跟 getElementsByTagName 一定會回傳一個元素集合的陣列，即使符合該條件的元素只有一個。</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/49167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 09:39 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同时支持三种事件模型</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49166.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49166.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49166.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49166.html</trackback:ping><description><![CDATA[
		<p class="WF">事件使得客户端的 JavaScript 有机会被激活，并得以运行。在一个 Web 页面装载之后，运行脚本的唯一方式，就是响应系统或者用户的动作。虽然从第一个支持脚本编程的浏览器面世以来，简单的事件被实现为 JavaScript 的一部分；但是大多数最近出现的浏览器都实现了强壮的事件模型，使脚本可以更加智能地处理事件。现在的问题在于：为了支持各种浏览器，您必须和多个先进的事件模型做斗争，准确地说，是三个。</p>
		<p class="WF">这三个事件模型分别和下面的文档对象模型（Document Object Model，即 DOM）三巨头结盟：Netscape Navigator 4 (NN4)，Macintosh 和 Windows 系统的 Internet Explorer 4 及其更新版本(IE4+)，以及在 Safari 中得到实现的 W3C DOM。尽管这些模型之间有些地方存在一些本质的差别，但是在一些简易的 JavaScript 的帮助下，它们都可以同时适用于同一个文档。本文主要着眼于相互冲突的事件模型中的两个关键方面：</p>
		<ul class="inline">
				<li class="WF">把一个事件和 HTML 元素绑定起来的方法。 
</li>
				<li class="WF">在事件被触发后如何对之进行处理。 </li>
		</ul>
		<h2 class="WF">
				<font size="4">事件绑定的方法</font>
		</h2>
		<p class="WF">事件绑定是指构造一个响应系统或者用户动作的 HTML 元素的过程。在不同的浏览器版本中，有不少于五种事件绑定技术。下面我们快速地介绍一下这些技术。</p>
		<h2 class="WF">
				<font size="4">事件绑定方法I：绑定元素属性</font>
		</h2>
		<p class="WF">最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性。事件属性名称由事件类型外加一个“on”前缀构成。尽管HTML属性并不是大小写敏感的，人们还是定义了一个规则，规定事件类型的每一个“词”的首字母大写，比如 <code>onClick</code> 和 <code>onMouseOver</code>。这些属性也被称为<i>事件处理器</i>，因为它们指示了元素如何“处理”特定的事件类型。</p>
		<p class="WF">正确的事件处理器属性的值在形式上是被引号包含的 JavaScript 语句。最常见的值是一条调用某个脚本函数的语句，而被调用的函数在位于文档前部的 &lt;SCRIPT&gt; 标识中定义--该标识通常位于 &lt;HEAD&gt; 部分。举例来说，下面的函数：</p>
		<pre class="sourcecodebox">
				<span class="WF">function myFunc() {
    // script statements here
}</span>
		</pre>
		<p class="WF">可以被定义为一个按键控件的事件处理器，按键的定义如下：</p>
		<pre class="sourcecodebox">
				<span class="WF">&lt;INPUT TYPE="button" NAME="myButton" VALUE="Click Here" 
onClick="myFunc()"&gt;</span>
		</pre>
		<p class="WF">把事件绑定到元素属性上有一个优点，即可以支持开发者把参数传递给事件处理器函数。接收事件的元素的引用则由一个特殊的参数值--<code>this </code>关键字来传递。下面的代码演示一个函数如何借助传入参数，把任意数目的文本框的内容转化为大写：</p>
		<pre class="sourcecodebox">
				<span class="WF">&lt;SCRIPT LANGUAGE="JavaScript"&gt;
function convertToUpper(textbox) {
    textbox.value = textbox.value.toUpperCase();
}
&lt;/SCRIPT&gt;
...
&lt;FORM ....&gt;
&lt;INPUT TYPE="text" NAME="first_name" onChange="convertToUpper(this)"&amp;gt
&lt;INPUT TYPE="text" NAME="last_name" onChange="convertToUpper(this)"&amp;gt
...
&lt;/FORM&gt;</span>
		</pre>
		<h2 class="WF">
				<font size="4">事件绑定方法II：绑定对象属性</font>
		</h2>
		<p class="WF">对于 NN3+ 和 IE4+ 这两类浏览器，脚本编程人员可以以脚本语句的方式把事件绑定到对象上，而不是绑定到元素标识的属性上。每一个负责事件响应的元素对象都为自己能够识别的事件设置了相应的属性。对象属性名称是元素标识属性的小写形式，比如 <code>onmouseover</code>。NN4 还接受 interCap（即首字小写，之后的每一个词的首字大写）版本的属性名，但是考虑到跨浏览器的兼容性，所有字母都是小写的名称会更安全一些。</p>
		<p class="WF">当您把一个函数的引用赋值给一个事件属性的时候，就发生了绑定。函数的引用是指函数的名称，但是不带函数定义中的括号。因此，如果要为一个名为 <code>myButton</code> 的按键的点击事件（click）进行绑定，使之激活一个定义为 <code>myFunc()</code> 的函数，则其赋值语句如下所示：</p>
		<pre class="sourcecodebox">
				<span class="WF">document.forms[0].myButton.onclick = myFunc;</span>
		</pre>
		<p class="WF">您应该注意一点：在事件触发的时候，没有办法向事件函数传递参数。本文在稍候对事件处理过程的讨论中还会回顾这个问题。</p>
		<h2 class="WF">
				<font size="4">事件绑定方法III: 绑定 IE4+&lt;SCRIPT FOR&gt; 标识</font>
		</h2>
		<p class="WF">在 IE4+ 中，Microsoft 对 &lt;SCRIPT&gt; 标识实现了自己的扩展，可以将它包含的脚本语句和某个元素的一个事件类型进行绑定。支持这个绑定的标识属性（还没有被 W3C 批准为 HTML 的一部分）是<code> FOR</code> 和 <code>EVENT</code>。</p>
		<p class="WF">
				<code>FOR</code> 属性的值必须是您为元素的 ID 属性分配的唯一标识符。然后，您必须把事件的名称（onmouseover，onclick，等等）分配给<code> EVENT </code>属性。在上面的按键实例的基础上，我们必须对按键标识进行修改，使之包含一个 <code>ID</code> 属性：</p>
		<pre class="sourcecodebox">
				<span class="WF">&lt;INPUT TYPE="button" NAME="myButton" ID="button1" VALUE="Click Here"&gt;</span>
		</pre>
		<p class="WF">脚本语句并不在函数中，而是在 &lt;SCRIPT&gt; 标识中，如下所示：</p>
		<pre class="sourcecodebox">
				<span class="WF">&lt;SCRIPT FOR="button1" EVENT="onclick"&gt;
// script statements here
&lt;/SCRIPT&gt;</span>
		</pre>
		<p class="WF">当然，标识中的语句可以调用页面上其它地方定义的任何函数（或者从.js文件中导入的函数）。然而，这种绑定方式意味着您必须为每一个元素和每一个事件创建一个 &lt;SCRIPT FOR&gt; 标识。</p>
		<p class="WF">您还必须小心，只能把这种绑定方法部署在仅供 IE4+ 浏览器浏览的页面。其它任何支持脚本编程而又没有实现这个特殊的 &lt;SCRIPT&gt; 标识的浏览器（包括 IE3），都将把它作为常规的 &lt;SCRIPT&gt; 标识来处理，并试图在页面装载的时候执行这些脚本语句--这不可避免地引起脚本错误。</p>
		<h2 class="WF">
				<font size="4">事件绑定方法IV：使用 IE5/Windows 的 attachEvent() 方法</font>
		</h2>
		<p class="WF">早在 W3C DOM 工作组磨砺出标准的事件模型之前，<code>attachEvent()</code> 方法已经被实现了，并且可被用于 Windows 版的 IE5 或更新版本的浏览器上的每一个 HTML 元素。</p>
		<p class="WF">
				<code>attachEvent() </code>方法的用法如下所示：</p>
		<pre class="sourcecodebox">
				<span class="WF">
						<em>elemObject</em>.attachEvent("<em>eventName</em>", <em>functionReference</em>);</span>
		</pre>
		<p class="WF">
				<em>eventName</em> 参数的值是表示事件名称的字符串，比如<code> onmousedown</code>。<em>functionReference</em> 参数是一个不带括号的函数引用，和早些时候描述的事件属性方法中一样。因此对于上面例子的按键对象，可以通过如下的脚本语句把函数绑定到按键的 click 事件：</p>
		<pre class="sourcecodebox">
				<span class="WF">document.getElementById("button1").attachEvent("onclick", myFunc);</span>
		</pre>
		<p class="WF">由于<code> attachEvent()</code> 方法必须严格工作在 IE5+/Windows 的环境中，所以您既可以使用 W3C DOM 的元素引用方式（如上文所示），也可以使用 IE4+ 的引用方式：</p>
		<pre class="sourcecodebox">
				<span class="WF">document.all.button1.attachEvent("onclick", myFunc);</span>
		</pre>
		<p class="WF">这个方法有一个值得注意的地方：您不能在元素被载入浏览器之前执行这个语句。该对象的引用在相应的 HTML 按键元素被浏览器创建之前，都是无效的。因此，要让这样的绑定语句或者在页面的底部运行，或者在 BODY 元素的<code> onLoad </code>事件处理器调用的函数中运行。</p>
		<h2 class="WF">
				<font size="4">事件绑定方法V：使用 W3C DOM 的 addEventListener() 方法</font>
		</h2>
		<p class="WF">Safari 使用的是 W3C DOM 级别2定义的事件绑定机制，这个机制和 IE5/Windows 的<code> attachEvent()</code> 方法很类似，但是有自己的语法。W3C DOM 规范为 DOM 层次中的每一个结点都定义了一个 <code>addEventListener() </code>方法。HTML 元素是 DOM 结点中的一类，在一对元素标识内部的文本结点也是一个结点，也能够接收事件。这一点在 NN6 事件处理过程中经常得到体现，在本文的后面部分您将会看到。</p>
		<p class="WF">
				<code>addEventListener()</code> 方法的语法如下所示：</p>
		<pre class="sourcecodebox">
				<span class="WF">
						<em>nodeReference</em>.addEventListener("<em>eventType</em>", <em>listenerReference</em>, <em>captureFlag</em>);</span>
		</pre>
		<p class="WF">用 W3C DOM 规范中的行话来说，<code>addEventListener()</code> 方法为指定的结点注册了一个事件，表示该结点希望处理相应的事件。这个方法的第一个参数是一个声明事件类型的字符串（不带"on"前缀），比如 <code>click</code>，<code>mousedown</code>，和 <code>keypress</code>。<code>addEventListener()</code> 方法的第二个参数可以和早些时候描述过的函数引用同样对待。第三个参数则是一个 Boolean 值，指明该结点是否以DOM中所谓的<em>捕捉模式</em>来侦听事件。事件的捕捉和派发---综合起来称为<em>事件的传播</em>--最后由另一篇文章来描述。对于一个典型的事件侦听器来说，第三个参数应该为 <code>false（假）</code>。</p>
		<h2 class="WF">
				<font size="4">那种绑定方法最好？</font>
		</h2>
		<p class="WF">如果您足够幸运，只需要为某一个操作系统上特定版本的浏览器创建应用程序，则可以为选定的浏览器选择最现代的绑定方式。但是对于跨浏览器的网站作者来说，选择绑定方法则需要面对实质性的挑战。</p>
		<p class="WF">如果您只计划支持 IE5/Mac，则可以不考虑 <code>attachEvent()</code> 和 <code>addEventListener()</code> 方法，因为 IE5/Mac 对这两种方法都不支持。这种情况下，比较实际的选择有两种，要么绑定标识属性，要么绑定对象属性。这时就需要费心思了。</p>
		<p class="WF">一方面，W3C DOM Level 2 承认基于标识属性的方法，并将它推荐为 <code>addEventListener()</code> 方法的可接受代替方法。为了和数以百万计的脚本相兼容，所有支持脚本编程的浏览器都支持基于标识属性的事件绑定方法。一些自动化的页面制作工具，比如 DreamWeaver，也把事件处理器的属性嵌入到 HTML 标识中。</p>
		<p class="WF">但是另一方面，在元素标识文件中嵌入面向脚本的信息，又不能将内容从风格及行为中分离开来，这和当前的流行趋势相违背。把事件绑定到对象属性上的方法听起来方向是对的，但是在 W3C 关于 HTML，XHTML，或者 DOM 的标准中，并没有对事件属性提供“官方”的支持。尽管如此，在实际生活中，除了第一代支持脚本编程的浏览器之外，其它浏览器都支持这种方法。</p>
		<p class="WF">一个纯标准论者会认为上述的两种方法都有缺点，但是对于讲究实际的开发者来说，即使考虑到未来主流浏览器的兼容性，这两种方法都是“安全”的。</p>
		<h2 class="WF">
				<font size="4">事件的信息矿：事件对象</font>
		</h2>
		<p class="WF">所有这三种事件模型的核心都是一个事件对象--它是一个抽象的实体，其属性中包含很多对事件处理函数具有潜在价值的信息。从本文早些时候对事件绑定技术的讨论中，您可能可以推断出事件对象对脚本之所以至关重要，原因之一是除了基于标识属性的绑定方法以外，其它绑定方法都不支持将参数传递到事件处理函数中。</p>
		<p class="WF">事件对象通过提供足够的“挂钩”，使事件处理函数可以读取事件的特征，从而填补了这个缝隙。因此，事件处理函数可以得到接收事件的元素的引用，以及其它一些有用的信息，比如鼠标动作的坐标，鼠标使用的按键，键盘上被按压的键，以及在事件发生的过程中是否有修饰键被按下（比如检测 Shift-click 事件）。</p>
		<h2 class="WF">
				<font size="4">访问事件对象</font>
		</h2>
		<p class="WF">虽然事件对象的精确构成因为本文讨论的三种 DOM（NN4，IE4+，以及 W3C/Safari）的不同而有所变化，但是，一个事件处理函数只能通过以下两种方式之一来访问事件对象：NN 方式和 IE 方式。W3C/Safari DOM 事件对象公布给脚本的接口方式和 NN4 的事件对象一样；而 IE4+ 则有自己的方法。</p>
		<p class="WF">IE4+ 的事件对象更加易于描述，因此我们首先对它进行讨论。简单地说，事件对象是<code> window </code>对象的一个属性。这意味着在所有的实例中只有一个事件对象。举例来说，在键盘上简单地按压和松开一个按键，会产生三个事件：<code>onKeyDown</code>，<code>onKeyPress</code>，和<code> onKeyUp</code>（事件的发生顺序和这里的列举顺序相同）。如果 <code>onKeyDown</code>事 件激活的函数花费很长的时间进行处理，则浏览器就会把其它两个事件保持在队列中，直到 <code>onMouseDown</code> 事件处理完成为止。</p>
		<p class="WF">而对于 NN4 和 W3C DOM 来说，事件对象看起来就更加抽象一些。除了基于标识属性风格的绑定方法之外，其它绑定方法都是把事件对象自动传递给与事件相绑定的函数。传递给函数的是一个单一的参数。开发者需要在函数中定义一个参数变量，来“接收”该参数的值。为了避免和IE中的 <code>window.event</code> 对象互相冲突，请不要把参数命名为 event。举例来说，把它命名为 <code>evt</code> 就相当好，相应的事件函数的定义大致如下：</p>
		<pre class="sourcecodebox">
				<span class="WF">function myFunc(evt) {
    // script statements here
}</span>
		</pre>
		<p class="WF">然而，如果您使用的是基于标识属性的事件绑定技术，就必须显式地把事件作为一个参数传递到您调用的函数。为了完成事件的传递，需要把 <code>event</code> 这个关键字作为参数进行传递：</p>
		<pre class="sourcecodebox">
				<span class="WF">onClick = "myFunc(event)"</span>
		</pre>
		<p class="WF">外部传入的参数是您的事件处理函数和 NN 的事件对象之间的唯一联系纽带。如果在主事件处理函数内部调用的其它函数需要该对象或者该对象的属性值，则您可以把该对象或其属性值作为参数中继给这些函数。</p>
		<p class="WF">如果您想知道 IE 是否把事件的引用保存在 <code>window.event</code> 属性中，那答案是“是”。使用这个语法交集是相当安全的，因为在 NN 和 IE 这两个浏览器，被传递到事件处理函数的事件对象都有您所期望的当前事件的属性值。</p>
		<h2 class="WF">
				<font size="4">兼容两种事件对象引用</font>
		</h2>
		<p class="WF">设想在处理事件时，我们需要在一个事件函数中考察一个或者多个事件属性。这是一个简单的技术，可以使事件处理函数和作为参数传入的事件对象协同工作，或者从 <code>window.event</code> 属性中读取信息。而且，这个技术不必处理不同的浏览器版本之间的细微差别。</p>
		<p class="WF">在开始的时候，需要在您的事件处理函数中定义一个参数变量，准备接收可能传入的事件对象。然后，通过简单的条件表达式把浏览器的事件对象赋值给上述的参数变量：</p>
		<pre class="sourcecodebox">
				<span class="WF">function myFunc(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    // process event here
}</span>
		</pre>
		<p class="WF">如果事件对象真的以参数的形式传进来了，则在函数内部，事件对象就被保留在 <code>evt </code>这个局部变量中。如果这个参数是 <code>null</code>，而且浏览器的 <code>window</code> 对象包含有一个 <code>event</code> 属性，则 <code>window.event</code> 对象就会把自己赋值给 <code>evt</code> 变量。</p>
		<p class="WF">然而，为了完成这个工作，还应该再包含一层或者多层条件控制，以便优雅地适应那些在事件模型中没有定义事件对象的的早期浏览器：</p>
		<pre class="sourcecodebox">
				<span class="WF">function myFunc(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    if (evt) {
        // process event here
    }
}</span>
		</pre>
		<p class="WF">为了把同样的方式应用到所有事件处理函数的构建中，您可以定义一个函数来兼容两种事件，即由绑定的标识属性显式传入的事件对象，以及由绑定的事件属性隐式传入的事件对象。这样即使您在开发过程中改变了事件绑定的风格，这个函数也不必改变。</p>
		<h2 class="WF">
				<font size="4">瑞典自助餐式地选择事件对象</font>
		</h2>
		<p class="WF">然而，建立一个指向事件对象的引用只是战斗的一部分。来自不同事件模型的每一个事件对象都拥有自己的一套属性，以容纳事件的细节。下面的表格列出了最常用的属性，以及这些属性在上述三种事件对象类型中的名称。</p>
		<h3 class="WF">表格 1. 流行的事件对象属性</h3>
		<table cellspacing="0" cellpadding="5" border="1">
				<tbody>
						<tr>
								<th class="WF">描述</th>
								<th class="WF">NN4</th>
								<th class="WF">IE4+</th>
								<th class="WF">W3C/Safari</th>
						</tr>
						<tr>
								<td class="WF">Event target</td>
								<td class="WF">
										<code>target</code>
								</td>
								<td class="WF">
										<code>srcElement</code>
								</td>
								<td class="WF">
										<code>target</code>
								</td>
						</tr>
						<tr>
								<td class="WF">Event type</td>
								<td class="WF">
										<code>type</code>
								</td>
								<td class="WF">
										<code>type</code>
								</td>
								<td class="WF">
										<code>type</code>
								</td>
						</tr>
						<tr>
								<td class="WF">X coordinate on page</td>
								<td class="WF">
										<code>pageX</code>
								</td>
								<td class="WF">*</td>
								<td class="WF">
										<code>pageX</code>
								</td>
						</tr>
						<tr>
								<td class="WF">Y coordinate on page</td>
								<td class="WF">
										<code>pageY</code>
								</td>
								<td class="WF">*</td>
								<td class="WF">
										<code>pageY</code>
								</td>
						</tr>
						<tr>
								<td class="WF">Mouse button</td>
								<td class="WF">
										<code>which</code>
								</td>
								<td class="WF">
										<code>button</code>
								</td>
								<td class="WF">
										<code>button</code>
								</td>
						</tr>
						<tr>
								<td class="WF">Keyboard key</td>
								<td class="WF">
										<code>which</code>
								</td>
								<td class="WF">
										<code>keyCode</code>
								</td>
								<td class="WF">
										<code>keyCode</code>
								</td>
						</tr>
				</tbody>
		</table>
		<span class="WF">
				<br />
		</span>
		<p class="WF">标注*的属性值可以通过对 <code>event.clientX + document.body.scrollTop</code> 或者 <code>event.clientY + document.body.scrollTop</code> 进行求值来得到。</p>
		<p class="WF">Macintosh 版本的IE5在通常情况下都遵循 IE4+ 的事件对象模型，但是有一个例外，即 IE5/Mac 的事件对象既定义了 <code>srcElement</code> 属性，也定义了 <code>target</code> 属性，这两个属性都指向接收事件的元素。</p>
		<p class="WF">需要抽象的最重要的事件对象属性可能得算指向接收事件的 HTML 元素的引用。NN4 和 W3C 的事件对象采用相同的属性名（<code>target</code>），而 IE4+ 的事件对象则使用<code> srcElement</code> 属性。这时候，对象检测技术（而不是费力劳神而又具有危险倾向的浏览器版本识别方法）再次拯救了我们。对于那些非文本容器的元素，一个简单的条件表达式就可以轻松处理脚本语法上的差别：</p>
		<pre class="sourcecodebox">
				<span class="WF">var elem = (evt.target) ? evt.target : evt.srcElement</span>
		</pre>
		<p class="WF">从现在开始，您的脚本就可以读写任何浏览器对象模型公布出来的元素对象属性了。</p>
		<h2 class="WF">
				<font size="4">W3C DOM结点的事件目标</font>
		</h2>
		<p class="WF">W3C DOM 的结点架构使得文档中的每一个结点都可以接收事件。在支持这一架构的浏览器中，发生在嵌套文本顶上的事件并不调用分配给文本容器的事件处理器，相应的文本结点才是该事件的目标结点。考虑如下场景：</p>
		<p class="WF">在<a href="http://developer.apple.com.cn/internet/webcontent/examples/eventsexample1_source.html" target="_blank">事件实例</a>，当鼠标的指针在一个 SPAN 元素包含的文本顶上滚动时，该文本就会被高亮显示。 事件绑定的过程通过对象属性在 <code>init()</code> 函数中进行。从表面上看，当用户在 SPAN 元素顶上滚动鼠标时，<code>onMouseOver</code> 事件动作函数就为该元素指派一个与风格表单规则相关联的类名（<code>highlight</code>），该风格规则把文本的显示风格定义为粗体，黄色背景；而在<code> onMouseOut</code> 函数中，则把风格恢复为原始的版本（类 <code>normal</code>）。请注意一个 <code>toggleHighlight()</code> 函数是如何在事件对象的 <code>type</code> 属性的帮助下，执行两个动作的（该属性在所有事件模型对象中的名称是相同的）。请<a href="http://developer.apple.com.cn/internet/webcontent/examples/eventsexample1.html" target="_blank">试一下这个事件实例</a>。</p>
		<p class="WF">但是如果您把例子装载到 NN6，则鼠标事件的真正目标就是 SPAN 元素中的文本结点了。本文并不讨论事件的传播机制，但是请相信，W3C DOM 事件模型的缺省行为会使事件沿着结点的包含层次向上传播（和 IE4+ 中事件通过元素容器向上传播的机制很类似）。因此，在这个事件实例中。鼠标事件会从其真正的目标向上传递到文本结点的容器（也就是 SPAN 元素）。这些事件触发了 SPAN 元素中相应的事件处理器。</p>
		<p class="WF">虽然事件处理器属于 SPAN 元素，事件对象还是保留文本对象的引用，并将它作为事件的原始目标。然而，只有对文本结点的容器进行动作，才能修改它的风格。为了实现 <code>toggleHighlight() </code>函数的等价操作，使之可以修改SPAN容器的 <code>className</code> 属性，该函数需要派生出一个指向文本结点容器的引用。</p>
		<p class="WF">一个策略是使用 W3C DOM 事件对象的 <code>currentTarget</code> 属性，该属性返回一个处理事件的结点的引用。脚本中的决策树需要考虑这个属性，增加代码之后的 <code>toggleHighlight() </code>函数如下所示：</p>
		<pre class="sourcecodebox">
				<span class="WF">function toggleHighlight(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    if (evt) {
        var elem
        if (evt.target) {
            if (evt.currentTarget &amp;&amp; (evt.currentTarget != evt.target)) {
                elem = evt.currentTarget
            } else {
                elem = evt.target
            } 
        } else {
            elem = evt.srcElement
        }
        elem.className = (evt.type == "mouseover") ? "highlight" : "normal"
    }
}</span>
		</pre>
		<p class="WF">另一个可选的方法是考察由 <code>target</code> 属性返回的对象的 ro<code>nodeType</code> 属性。一个能够把事件定向给文本结点的浏览器，也可以把一个文本结点的 <code>nodeType</code> 属性值报告为3，而不是报告为元素结点的类型（其值为１）。如果事件的目标是一个文本结点，则脚本程序就可以通过该文本结点的 <code>parentNode</code> 属性来得到其上级元素结点的引用。这种方法的决策树在某种程度上得到更多的改进：</p>
		<pre class="sourcecodebox">
				<span class="WF">function toggleHighlight(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    if (evt) {
        var elem
        if (evt.target) {
            elem = (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target
        } else {
            elem = evt.srcElement
        }
        elem.className = (evt.type == "mouseover") ? "highlight" : "normal"
    }
}</span>
		</pre>
		<p class="WF">如果您正在用遵循 W3 的浏览器阅读本文，则请<a href="http://developer.apple.com.cn/internet/webcontent/examples/eventsexample2.html" target="_blank">尝试这个修改过的版本</a>，看看鼠标滚动时的风格变化。</p>
		<p class="WF">这个页面使用了嵌入到<a href="http://developer.apple.com.cn/internet/webcontent/examples/eventsexample1_source.html" target="_blank">事件实例</a>中的最新版本的 <code>toggleHighlight() </code>函数，展示了如何使用 JavaScript 为那些能够显示期望效果的浏览器增加额外的价值，同时也可以那些基本的内容提供给仍然使用着较老版本或者不支持脚本编程的浏览器的用户，只不过在模式上不那么动人和便于交互。</p>
		<h2 class="WF">
				<font size="4">一个事件处理函数的模板</font>
		</h2>
		<p class="WF">并不是每个事件处理函数都处理页面元素对象中同样的属性或者行为，但是，从上文的讨论可以派生出来的一个模板，您可以在这个模板的帮助下开始编码。模板如下：</p>
		<pre class="sourcecodebox">
				<span class="WF">function functionName(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    if (evt) {
        var elem
        if (evt.target) {
            elem = (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target
        } else {
            elem = evt.srcElement
        }
        if (elem) {
            // process event here
        }
    }
}</span>
		</pre>
		<p class="WF">请把第一行的函数名替换为您希望的函数名，并在注视指示的地方开始书写具体事件的代码。这个格式应该可以为您提供一个起点，适合于您采用的任何跨浏览器的事件绑定风格。如果您需要在一个页面中多次使用这个格式，则可以进一步精简代码，即把读取目标的代码抽象成一个可重用的工具函数，然后在每一个事件处理函数中进行调用：</p>
		<pre class="sourcecodebox">
				<span class="WF">// shared function
function getTargetElement(evt) {
    var elem
    if (evt.target) {
        elem = (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target
    } else {
        elem = evt.srcElement
    }
    return elem

}

function functionName(evt) {
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    if (evt) {
        var elem = getTargetElement(evt)
        if (elem) {
            // process event here
        }
    }
}</span>
		</pre>
		<p class="WF">有了这类框架，您现在应该可以把更多的注意力集中在各个事件处理函数要求的具体动作中了。</p>
		<h2 class="WF">
				<font size="4">查看实例：</font>
		</h2>
		<ul>
				<li class="WF">
						<a href="http://developer.apple.com.cn/internet/webcontent/examples/eventsexample1.html">Events Example</a>
				</li>
		</ul>
		<h2 class="WF">
				<font size="4">下载脚本</font>
		</h2>
		<ul>
				<li class="WF">
						<a href="http://developer.apple.com.cn/internet/webcontent/examples/eventsexample1_source.html">eventsexample.txt</a>
				</li>
		</ul>
<img src ="http://www.blogjava.net/jackstudio/aggbug/49166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 09:36 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>