﻿<?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--随笔分类-common</title><link>http://www.blogjava.net/jackstudio/category/8998.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 16:42:04 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 16:42:04 GMT</pubDate><ttl>60</ttl><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>各种排序算法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>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>分页类,调用很简单. ........</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>关于数据库优化</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>关于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 使用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>0</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>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>0</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>电影</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>法国，你出了什么问题？</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>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>0</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>这次麻烦大了(小偷给我的苦恼.)</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/25/47985.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 25 May 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/25/47985.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/47985.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/25/47985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/47985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/47985.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000">         今天从白石洲至上沙一段的473公交车上,一个不留名的小偷又得手了.很显然现在的他应该很高兴(离事发时间还不到1个小时),似乎又可以跟同伴夸耀其手段之诡异,行动之迅速,敏捷完全无人出其右.<br />          早晨8点,手机闹钟准时响了,我习惯性了懒床两三分钟,之后起床,要刷牙时发现牙膏没有了,无奈只有拿着牙刷象征性的刷了一下就算了.出门时看了一下手机是8:16分,按照以往经验可以提前10分钟到达公司,在路边的小摊买了一瓶牛奶,边走边喝的就到了公交站点,等了几分钟,公交车来了,当时人还挺多的,已经没有位置了.上了车找了个地站着,车停了一下就弛出了.此时我旁边站着一女孩,后面站着一个拿包的小伙.因为人多,所以我双手都握着车上的扶手,车子就这样一路过来了,旁边的女孩在竹子林站下车,快到下沙的时候又上来了好几个人,把车门全都堵住了.车还是这样过来.到是体育公园我就下车了..因为车门住人多的原因,我挤了好一会才下了车,下了车习惯的要抽跟烟.可是摸了口袋没有烟,什么回事,我记得带了的,出门时还抽了一根呢..感觉不对,再一摸发现钱包,手机全都不见了....哎....真是大意了....<br />         现在心理慢慢有点平衡了,没有刚才的愤怒了.但是对于无端被窃还是觉得不爽.这样的事情深圳的公安也管不了.没办法,任倒霉了.但是我就纳闷,这小偷让半包香烟都要偷.实在是让人不能容忍.操蛋.还有就是钱包里面还有我的身份证.这么一丢了.我还得跑回长沙去办理.这想起来真叫人气愤.<br />         因为这次的原因,我总结了一下:<br />         1.在工交车上千万不要让美女给迷住了.想如菲菲只能导致你对身边的人属于防范.<br />         2.不要双手都握着扶手,因为扶手是在脑袋以上,上衣会跟肩旁往上拉,这样裤子的口袋就更容易暴露出来,眼尖的人就能看到里面的东西了.<br />         3.警惕旁边那些异常安静的人.<br />         4.在人多时从车厢内往车门走动一定要注意,这对行窃者来说是最好的时机.<br />         5.不要听深圳里面喧传的口号"身份证随身带",这有时候有利,有时候却很麻烦,现在进出关很少检查了,入口在市内的话最好还不是放在家里好一点,因为一张身份证和很多的证件关联在一起,比如银行卡,卡丢了还可以那身份证去银行挂失,如果两身份证也一起丢了,那麻烦可像我一样大了..............<br /><br />         <br /></font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Code_Closed_Image" onclick="this.style.display='none'; Code_Closed_Text.style.display='none'; Code_Open_Image.style.display='inline'; Code_Open_Text.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" />
				<img id="Code_Open_Image" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text.style.display='none'; Code_Closed_Image.style.display='inline'; Code_Closed_Text.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" />
				<span id="Code_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">小心才驰万年船</span>
				<span id="Code_Open_Text" style="DISPLAY: none">
						<br />
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="COLOR: #008080">1</span>
						<img id="Codehighlighter1_0_57_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_57_Open_Text.style.display='none'; Codehighlighter1_0_57_Closed_Image.style.display='inline'; Codehighlighter1_0_57_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_0_57_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_57_Closed_Text.style.display='none'; Codehighlighter1_0_57_Open_Image.style.display='inline'; Codehighlighter1_0_57_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span id="Codehighlighter1_0_57_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
						<span id="Codehighlighter1_0_57_Open_Text">
								<span style="COLOR: #008000">/**</span>
								<span style="COLOR: #008000">******<br /></span>
								<span style="COLOR: #008080">2</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">3</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         洁身自好,奉公守法.<br /></span>
								<span style="COLOR: #008080">4</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         时刻警惕,不给犯罪分可乘之机<br /></span>
								<span style="COLOR: #008080">5</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">6</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #008000">*/</span>
						</span>
				</span>
		</div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/47985.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-25 10:59 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/25/47985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新的工作,新的开始</title><link>http://www.blogjava.net/jackstudio/archive/2006/03/31/38441.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 31 Mar 2006 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/03/31/38441.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/38441.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/03/31/38441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/38441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/38441.html</trackback:ping><description><![CDATA[
		<p>      这blog申请也有好几天了,可是这段时间一直忙与找工作都没有更新.生活实在是无奈啊..<br />不知道以后的路要什么走才好.突然想起了以前的一个短信.<br />      深圳的天空是蔚蓝的,<br />      深圳的楼房是高大的.<br />      深圳的女孩是漂亮的.<br />      深圳的我却是无奈的.<br /></p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/38441.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-03-31 12:40 <a href="http://www.blogjava.net/jackstudio/archive/2006/03/31/38441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>