<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[单翼天使]]></title>
<link>http://blog.sjzj.com.cn/</link>
<description><![CDATA[没有任何借口！！！]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[xtftbwvfp@gmail.com(单翼)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>单翼天使</title> 
	<url>http://blog.sjzj.com.cn/images/logos.gif</url> 
	<link>http://blog.sjzj.com.cn/</link> 
	<description>单翼天使</description> 
</image>

			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=1005</link>
			<title><![CDATA[mencoder 和ffmpeg常用命令]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Thu,26 Jun 2008 21:52:36 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=1005</guid>	
		<description><![CDATA[先从Mencoder这个开始，将所有格式转AVI，<br/><br/>RMVB转AVI<br/><br/><br/>mencoder&nbsp;1.rmvb&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;rmvb.avi&nbsp;<br/><br/>RM转AVI<br/><br/>mencoder&nbsp;1.rm&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;rm.avi<br/><br/>MPEG转AVI<br/><br/>mencoder&nbsp;mp4.mpeg&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;mp4.avi<br/><br/>MOV转AVI<br/><br/>mencoder&nbsp;qtime.mov&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;qtime.avi<br/><br/>WMV转AVI&nbsp;包括WMV7到WMV9，只实验到WMV9<br/><br/>mencoder&nbsp;m7.wmv&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;m7.avi<br/><br/>RV转AVI<br/><br/>mencoder&nbsp;1.rv&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;rv.avi<br/><br/>等等……格式，参数不变，改文件名就好了。这里参数是什么意思，我目前还不懂，学习中，你可以在网上找找，找到告诉我啊，谢谢。<br/><br/>接下来是FFMPEG上场。<br/><br/>AVI转FLV<br/><br/>ffmpeg&nbsp;-i&nbsp;test.avi&nbsp;-ab&nbsp;56&nbsp;-ar&nbsp;22050&nbsp;-b&nbsp;500&nbsp;-r&nbsp;15&nbsp;-s&nbsp;320x240&nbsp;test.flv&nbsp;<br/><br/>抓图JPG。<br/><br/>ffmpeg&nbsp;-i&nbsp;2.wmv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;350x240&nbsp;test.jpg<br/><br/>3GP转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\1.3gp&nbsp;-o&nbsp;ok\3gp.flv<br/><br/>MOV转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\qtime.mov&nbsp;-o&nbsp;ok\mov.flv&nbsp;<br/><br/>RMVB转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\1.rmvb&nbsp;-o&nbsp;ok\rmvb.flv<br/><br/>WMV转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\m9.wmv&nbsp;-o&nbsp;ok\m9.flv&nbsp;<br/><br/>等等等…………<br/><br/>以上的参数通用，只要在输入的ok\m9.wmv换成你自己相应的格式就好，绝对可以，这次测试完全OK，效果点这里，给大家看看，我近期的成果，已实现的。&nbsp;<br/><br/>裁图方面，跟以前一样的，我再贴一份。<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\3gp.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;3gp.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mov.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mov.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mpeg.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mpeg.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mp1.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mp1.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mp2.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mp2.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\rm.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;rm.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\rmvb.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;rmvb.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\rv.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;rv.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mp4.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mp4.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\avi.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;avi.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\m7.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;m7.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\m8.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;m8.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\m9.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;m9.jpg<br/><br/><br/>以上转完FLV，有个缺陷，就是FLV播放时不能拖放，要用下面的一个软件来修复。<br/><br/>在服务器上自动转，用命令行的。用这个，<br/>flvmdigui.exe&nbsp;要有用户界面的，手动修复的，用这个<br/><br/>flvmdi.exe&nbsp;使用方法:<br/>命令提示符下输入&gt;flvmdi&nbsp;inputFile&nbsp;[outputFile][/s]&nbsp;[/x]&nbsp;[/e]&nbsp;[/k]&nbsp;<br/><br/>给个例子，后面的参数不加也可以修复，比如。<br/><br/>flvmdi&nbsp;m7.flv<br/><br/>这样就行了。<br/><br/>修复OK。<br/><br/>&nbsp;<br/><br/>&nbsp;<br/><br/>==========================<br/>ffmpeg&nbsp;-i&nbsp;ok\3gp.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;3gp.jpg<br/><br/>==============&nbsp;<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=1004</link>
			<title><![CDATA[mencoder 和ffmpeg常用命令]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Thu,26 Jun 2008 20:43:14 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=1004</guid>	
		<description><![CDATA[先从Mencoder这个开始，将所有格式转AVI，<br/><br/>RMVB转AVI<br/><br/><br/>mencoder&nbsp;1.rmvb&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;rmvb.avi&nbsp;<br/><br/>RM转AVI<br/><br/>mencoder&nbsp;1.rm&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;rm.avi<br/><br/>MPEG转AVI<br/><br/>mencoder&nbsp;mp4.mpeg&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;mp4.avi<br/><br/>MOV转AVI<br/><br/>mencoder&nbsp;qtime.mov&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;qtime.avi<br/><br/>WMV转AVI&nbsp;包括WMV7到WMV9，只实验到WMV9<br/><br/>mencoder&nbsp;m7.wmv&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;m7.avi<br/><br/>RV转AVI<br/><br/>mencoder&nbsp;1.rv&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;preset=64&nbsp;-ovc&nbsp;xvid&nbsp;-xvidencopts&nbsp;bitrate=600&nbsp;-of&nbsp;avi&nbsp;-o&nbsp;rv.avi<br/><br/>等等……格式，参数不变，改文件名就好了。这里参数是什么意思，我目前还不懂，学习中，你可以在网上找找，找到告诉我啊，谢谢。<br/><br/>接下来是FFMPEG上场。<br/><br/>AVI转FLV<br/><br/>ffmpeg&nbsp;-i&nbsp;test.avi&nbsp;-ab&nbsp;56&nbsp;-ar&nbsp;22050&nbsp;-b&nbsp;500&nbsp;-r&nbsp;15&nbsp;-s&nbsp;320x240&nbsp;test.flv&nbsp;<br/><br/>抓图JPG。<br/><br/>ffmpeg&nbsp;-i&nbsp;2.wmv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;350x240&nbsp;test.jpg<br/><br/>3GP转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\1.3gp&nbsp;-o&nbsp;ok\3gp.flv<br/><br/>MOV转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\qtime.mov&nbsp;-o&nbsp;ok\mov.flv&nbsp;<br/><br/>RMVB转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\1.rmvb&nbsp;-o&nbsp;ok\rmvb.flv<br/><br/>WMV转FLV<br/><br/>mencoder&nbsp;-vf&nbsp;scale=320:240&nbsp;-ffourcc&nbsp;FLV1&nbsp;-of&nbsp;lavf&nbsp;-lavfopts&nbsp;i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=200&nbsp;-srate&nbsp;22050&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp3:abitrate=56&nbsp;ok\m9.wmv&nbsp;-o&nbsp;ok\m9.flv&nbsp;<br/><br/>等等等…………<br/><br/>以上的参数通用，只要在输入的ok\m9.wmv换成你自己相应的格式就好，绝对可以，这次测试完全OK，效果点这里，给大家看看，我近期的成果，已实现的。&nbsp;<br/><br/>裁图方面，跟以前一样的，我再贴一份。<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\3gp.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;3gp.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mov.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mov.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mpeg.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mpeg.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mp1.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mp1.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mp2.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mp2.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\rm.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;rm.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\rmvb.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;rmvb.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\rv.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;rv.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\mp4.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;mp4.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\avi.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;avi.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\m7.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;m7.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\m8.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;m8.jpg<br/><br/>ffmpeg&nbsp;-i&nbsp;ok\m9.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;m9.jpg<br/><br/><br/>以上转完FLV，有个缺陷，就是FLV播放时不能拖放，要用下面的一个软件来修复。<br/><br/>在服务器上自动转，用命令行的。用这个，<br/>flvmdigui.exe&nbsp;要有用户界面的，手动修复的，用这个<br/><br/>flvmdi.exe&nbsp;使用方法:<br/>命令提示符下输入&gt;flvmdi&nbsp;inputFile&nbsp;[outputFile][/s]&nbsp;[/x]&nbsp;[/e]&nbsp;[/k]&nbsp;<br/><br/>给个例子，后面的参数不加也可以修复，比如。<br/><br/>flvmdi&nbsp;m7.flv<br/><br/>这样就行了。<br/><br/>修复OK。<br/><br/>&nbsp;<br/><br/>&nbsp;<br/><br/>==========================<br/>ffmpeg&nbsp;-i&nbsp;ok\3gp.flv&nbsp;-y&nbsp;-f&nbsp;image2&nbsp;-ss&nbsp;8&nbsp;-t&nbsp;0.001&nbsp;-s&nbsp;320x240&nbsp;3gp.jpg<br/><br/>==============&nbsp;<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=1003</link>
			<title><![CDATA[SQL的扩展的删除与恢复]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Js/Ajax/Css]]></category>
			<pubDate>Mon,05 May 2008 16:53:16 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=1003</guid>	
		<description><![CDATA[删除<br/><br/>use&nbsp;master&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_cmdshell&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_dirtree&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_enumgroups&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_fixeddrives&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_loginconfig&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_enumerrorlogs&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;xp_getfiledetails&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OACr&#101;ate&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OADestroy&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OAGetErrorInfo&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OAGetProperty&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OAMethod&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OASetProperty&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Sp_OAStop&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regaddmultistring&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regdel&#101;tekey&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regdel&#101;te&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regenums&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regread&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regremovemultistring&#39;&nbsp;<br/><br/>exec&nbsp;sp_dro&#112;extendedproc&nbsp;&#39;Xp_regwrite&#39;&nbsp;<br/><br/>dro&#112;&nbsp;procedure&nbsp;sp_makewebtask&nbsp;<br/><br/>go<br/><br/>恢复<br/><br/>use&nbsp;master&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_cmdshell,&#39;xp_cmdshell.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_dirtree,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_enumgroups,&#39;xplog70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_fixeddrives,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_loginconfig,&#39;xplog70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_enumerrorlogs,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_getfiledetails,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OACr&#101;ate,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OADestroy,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OAGetErrorInfo,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OAGetProperty,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OAMethod,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OASetProperty,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;sp_OAStop,&#39;odsole70.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regaddmultistring,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regdel&#101;tekey,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regdel&#101;te,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regenums,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regread,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regremovemultistring,&#39;xpstar.dll&#39;&nbsp;<br/><br/>exec&nbsp;sp_addextendedproc&nbsp;xp_regwrite,&#39;xpstar.dll&#39;<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=1001</link>
			<title><![CDATA[工厂模式]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Fri,25 Apr 2008 09:56:53 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=1001</guid>	
		<description><![CDATA[Web：Default.aspx&nbsp;<br/>BLL：UserInfo.cs&nbsp;<br/>DALFactoryFactory.cs&nbsp;<br/>IDALIDALClass.cs&nbsp;<br/>DALSQLServerAccessDB.cs、SQLHelper.cs&nbsp;<br/>ModelUserEntity.cs&nbsp;<br/><br/>项目引用如下：&nbsp;<br/>Web：BLL.dll、DALFactory、IDAL、SQLServer.dll&nbsp;<br/>BLL：DALFactory、DALSQLServer、IDAL、Model&nbsp;<br/>DALFactory：IDAL&nbsp;<br/>IDAL：Model&nbsp;<br/>DALSQLServer：IDAL、Model&nbsp;<br/>Model：无&nbsp;<br/><br/>=============================================================================&nbsp;<br/>///Web项目的代码&nbsp;<br/><br/>//Default.aspx.cs&nbsp;<br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Data;&nbsp;<br/>using&nbsp;System.Configuration;&nbsp;<br/>using&nbsp;System.Web;&nbsp;<br/>using&nbsp;System.Web.Security;&nbsp;<br/>using&nbsp;System.Web.UI;&nbsp;<br/>using&nbsp;System.Web.UI.WebControls;&nbsp;<br/>using&nbsp;System.Web.UI.WebControls.WebParts;&nbsp;<br/>using&nbsp;System.Web.UI.HtmlControls;&nbsp;<br/>using&nbsp;BLL;&nbsp;<br/>using&nbsp;Model;&nbsp;<br/><br/>public&nbsp;partial&nbsp;class&nbsp;_Default&nbsp;:&nbsp;System.Web.UI.Page&nbsp;<br/>{&nbsp;<br/>protected&nbsp;void&nbsp;Page_Load(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)&nbsp;<br/>{&nbsp;<br/>Button2.Visible&nbsp;=&nbsp;false;&nbsp;<br/>if&nbsp;(!Page.IsPostBack)&nbsp;<br/>{&nbsp;<br/>//调用BLL&nbsp;<br/>UserInfo&nbsp;userInfo&nbsp;=&nbsp;new&nbsp;UserInfo();&nbsp;<br/>GridView1.DataSource&nbsp;=&nbsp;userInfo.GetALLUserInfo();&nbsp;<br/>GridView1.DataBind();&nbsp;<br/>}&nbsp;<br/><br/>}&nbsp;<br/>protected&nbsp;void&nbsp;Button1_Click(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)&nbsp;<br/>{&nbsp;<br/>UserEntity&nbsp;userEntity&nbsp;=&nbsp;new&nbsp;UserEntity();&nbsp;<br/>try&nbsp;<br/>{&nbsp;<br/>userEntity.UserName&nbsp;=&nbsp;txtUserName.Text.Trim();&nbsp;<br/>userEntity.Sex&nbsp;=&nbsp;ddlSex.Sel&#101;ctedValue.Trim();&nbsp;<br/>userEntity.Email&nbsp;=&nbsp;txtEmail.Text.Trim();&nbsp;<br/>userEntity.Phone&nbsp;=&nbsp;txtPhone.Text.Trim();&nbsp;<br/>userEntity.Address&nbsp;=&nbsp;txtAddress.Text.Trim();&nbsp;<br/>}&nbsp;<br/>catch&nbsp;(Exception&nbsp;ee)&nbsp;<br/>{&nbsp;<br/>Label1.Text&nbsp;=&nbsp;ee.Message;&nbsp;<br/>return;&nbsp;<br/>}&nbsp;<br/><br/>try&nbsp;<br/>{&nbsp;<br/>//调用BLL层&nbsp;<br/>UserInfo&nbsp;userInfo&nbsp;=&nbsp;new&nbsp;UserInfo();&nbsp;<br/>userInfo.Ins&#101;rt(userEntity);&nbsp;<br/>Label1.Text&nbsp;=&nbsp;&#34;向数据表写入成功&#34;;&nbsp;<br/>Button2.Visible&nbsp;=&nbsp;true;&nbsp;<br/>}&nbsp;<br/>catch(Exception&nbsp;ee)&nbsp;<br/>{&nbsp;<br/>Label1.Text&nbsp;=&nbsp;ee.Message;&nbsp;<br/>}&nbsp;<br/><br/>}&nbsp;<br/>protected&nbsp;void&nbsp;Button2_Click(object&nbsp;sender,&nbsp;EventArgs&nbsp;e)&nbsp;<br/>{&nbsp;<br/>Response.Redirect(&#34;Default.aspx&#34;);&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/><br/><br/>//Web.config&nbsp;<br/>&lt;configuration&gt;&nbsp;<br/>&lt;appSettings&gt;&nbsp;<br/>&lt;add&nbsp;key=&#34;DALDB&#34;&nbsp;value=&#34;DALSQLServer&#34;/&gt;&nbsp;<br/>&lt;add&nbsp;key=&#34;ConnectionString&#34;&nbsp;value=&#34;Server=.;DataBase=ThreeLayersSampleDB;Integrated&nbsp;Security&nbsp;=&nbsp;SSPI;&#34;/&gt;&nbsp;<br/>&lt;add&nbsp;key=&#34;Sel&#101;ct&#34;&nbsp;value=&#34;Sel&#101;ct&nbsp;*&nbsp;From&nbsp;UserInfo&#34;/&gt;&nbsp;<br/>&lt;add&nbsp;key=&#34;Ins&#101;rt&#34;&nbsp;value=&#34;Ins&#101;rtValues&#34;/&gt;&nbsp;<br/>&lt;/appSettings&gt;&nbsp;<br/>&lt;connectionStrings/&gt;&nbsp;<br/><br/>-------------------------------------------------------------&nbsp;<br/>///BLL项目代码&nbsp;<br/><br/>//UserInfo.cs&nbsp;<br/><br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Collections.Generic;&nbsp;<br/>using&nbsp;System.Text;&nbsp;<br/>using&nbsp;System.Data;&nbsp;<br/>using&nbsp;System.Configuration;&nbsp;<br/>using&nbsp;DALSQLServer;&nbsp;<br/>using&nbsp;Model;&nbsp;<br/>using&nbsp;IDAL;&nbsp;<br/>using&nbsp;DALFactory;&nbsp;<br/><br/>namespace&nbsp;BLL&nbsp;<br/>{&nbsp;<br/>public&nbsp;class&nbsp;UserInfo&nbsp;<br/>{&nbsp;<br/>private&nbsp;readonly&nbsp;IDAL.IDALInterface&nbsp;instance&nbsp;=&nbsp;DALFactory.Factory.Cr&#101;ateAccessDBInstance();&nbsp;<br/><br/>public&nbsp;DataSet&nbsp;GetALLUserInfo()&nbsp;<br/>{&nbsp;<br/>return&nbsp;instance.GetAllUserInfo();&nbsp;<br/>}&nbsp;<br/><br/>public&nbsp;void&nbsp;Ins&#101;rt(UserEntity&nbsp;userEntity)&nbsp;<br/>{&nbsp;<br/>try&nbsp;<br/>{&nbsp;<br/>instance.Ins&#101;rt(userEntity);&nbsp;<br/>}&nbsp;<br/>catch&nbsp;(Exception&nbsp;e)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;e;&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/><br/>}&nbsp;<br/>}&nbsp;<br/><br/>-------------------------------------------------------------------&nbsp;<br/>///DALFactory项目代码&nbsp;<br/><br/>//Factory.cs&nbsp;<br/><br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Collections.Generic;&nbsp;<br/>using&nbsp;System.Text;&nbsp;<br/>using&nbsp;System.Configuration;&nbsp;<br/>using&nbsp;System.Reflection;&nbsp;<br/><br/>namespace&nbsp;DALFactory&nbsp;<br/>{&nbsp;<br/>public&nbsp;sealed&nbsp;class&nbsp;Factory&nbsp;<br/>{&nbsp;<br/>public&nbsp;static&nbsp;readonly&nbsp;string&nbsp;path&nbsp;=&nbsp;ConfigurationManager.AppSettings[&#34;DALDB&#34;];&nbsp;<br/><br/>public&nbsp;static&nbsp;IDAL.IDALInterface&nbsp;Cr&#101;ateAccessDBInstance()&nbsp;<br/>{&nbsp;<br/>IDAL.IDALInterface&nbsp;i&nbsp;=&nbsp;Assembly.Load(path).Cr&#101;ateInstance(path&nbsp;+&nbsp;&#34;.AccessDB&#34;)&nbsp;as&nbsp;IDAL.IDALInterface;&nbsp;<br/>return&nbsp;i;&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/><br/>-------------------------------------------------------------------&nbsp;<br/>///IDAL项目代码&nbsp;<br/><br/>//IDALInterface.cs&nbsp;<br/><br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Collections.Generic;&nbsp;<br/>using&nbsp;System.Text;&nbsp;<br/>using&nbsp;System.Data;&nbsp;<br/>using&nbsp;Model;&nbsp;<br/><br/>namespace&nbsp;IDAL&nbsp;<br/>{&nbsp;<br/>public&nbsp;interface&nbsp;IDALInterface&nbsp;<br/>{&nbsp;<br/>DataSet&nbsp;GetAllUserInfo();&nbsp;<br/>void&nbsp;Ins&#101;rt(UserEntity&nbsp;userEntity);&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/><br/>///DALSQLServer项目代码&nbsp;<br/><br/>//AccessDB.cs&nbsp;<br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Collections.Generic;&nbsp;<br/>using&nbsp;System.Text;&nbsp;<br/>using&nbsp;System.Data;&nbsp;<br/>using&nbsp;System.Data.SqlClient;&nbsp;<br/>using&nbsp;System.Configuration;&nbsp;<br/>using&nbsp;Model;&nbsp;<br/>using&nbsp;IDAL;&nbsp;<br/><br/>namespace&nbsp;DALSQLServer&nbsp;<br/>{&nbsp;<br/>public&nbsp;class&nbsp;AccessDB&nbsp;:&nbsp;IDAL.IDALInterface&nbsp;<br/>{&nbsp;<br/>public&nbsp;DataSet&nbsp;GetAllUserInfo()&nbsp;<br/>{&nbsp;<br/>return&nbsp;SQLHelper.GetAllUserInfo();&nbsp;<br/>}&nbsp;<br/><br/>public&nbsp;void&nbsp;Ins&#101;rt(UserEntity&nbsp;userEntity)&nbsp;<br/>{&nbsp;<br/>try&nbsp;<br/>{&nbsp;<br/>SQLHelper.Ins&#101;rt(userEntity);&nbsp;<br/>}&nbsp;<br/>catch&nbsp;(Exception&nbsp;e)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;e;&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/><br/><br/>//SQLHelper.cs&nbsp;<br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Collections.Generic;&nbsp;<br/>using&nbsp;System.Text;&nbsp;<br/>using&nbsp;System.Data.SqlClient;&nbsp;<br/>using&nbsp;Model;&nbsp;<br/>using&nbsp;System.Data;&nbsp;<br/>using&nbsp;System.Configuration;&nbsp;<br/><br/>namespace&nbsp;DALSQLServer&nbsp;<br/>{&nbsp;<br/>public&nbsp;abstract&nbsp;class&nbsp;SQLHelper&nbsp;<br/>{&nbsp;<br/>private&nbsp;static&nbsp;readonly&nbsp;string&nbsp;strConnection&nbsp;=&nbsp;ConfigurationManager.AppSettings[&#34;ConnectionString&#34;];&nbsp;<br/>private&nbsp;static&nbsp;readonly&nbsp;string&nbsp;strSQLIns&#101;rt&nbsp;=&nbsp;ConfigurationManager.AppSettings[&#34;Ins&#101;rt&#34;];&nbsp;<br/><br/>private&nbsp;static&nbsp;SqlConnection&nbsp;con&nbsp;=&nbsp;new&nbsp;SqlConnection(strConnection);&nbsp;<br/><br/>public&nbsp;static&nbsp;DataSet&nbsp;GetAllUserInfo()&nbsp;<br/>{&nbsp;<br/>SqlDataAdapter&nbsp;da&nbsp;=&nbsp;new&nbsp;SqlDataAdapter(ConfigurationManager.AppSettings[&#34;Sel&#101;ct&#34;],&nbsp;con);&nbsp;<br/>DataSet&nbsp;ds&nbsp;=&nbsp;new&nbsp;DataSet();&nbsp;<br/>da.Fill(ds,&nbsp;&#34;UserInfo&#34;);&nbsp;<br/>return&nbsp;ds;&nbsp;<br/>}&nbsp;<br/><br/>public&nbsp;static&nbsp;void&nbsp;Ins&#101;rt(UserEntity&nbsp;userEntity)&nbsp;<br/>{&nbsp;<br/>SqlCommand&nbsp;com&nbsp;=&nbsp;new&nbsp;SqlCommand(strSQLIns&#101;rt,&nbsp;con);&nbsp;<br/>com.CommandType&nbsp;=&nbsp;CommandType.StoredProcedure;&nbsp;<br/>com.Parameters.Add(new&nbsp;SqlParameter(&#34;@UserName&#34;,&nbsp;SqlDbType.NChar,&nbsp;20));&nbsp;<br/>com.Parameters.Add(new&nbsp;SqlParameter(&#34;@Sex&#34;,&nbsp;SqlDbType.NChar,&nbsp;2));&nbsp;<br/>com.Parameters.Add(new&nbsp;SqlParameter(&#34;@Email&#34;,&nbsp;SqlDbType.NChar,&nbsp;50));&nbsp;<br/>com.Parameters.Add(new&nbsp;SqlParameter(&#34;@Phone&#34;,&nbsp;SqlDbType.NChar,&nbsp;20));&nbsp;<br/>com.Parameters.Add(new&nbsp;SqlParameter(&#34;@Address&#34;,&nbsp;SqlDbType.NChar,&nbsp;50));&nbsp;<br/><br/>com.Parameters[&#34;@UserName&#34;].Value&nbsp;=&nbsp;userEntity.UserName;&nbsp;<br/>com.Parameters[&#34;@Sex&#34;].Value&nbsp;=&nbsp;userEntity.Sex;&nbsp;<br/>com.Parameters[&#34;@Email&#34;].Value&nbsp;=&nbsp;userEntity.Email;&nbsp;<br/>com.Parameters[&#34;@Phone&#34;].Value&nbsp;=&nbsp;userEntity.Phone;&nbsp;<br/>com.Parameters[&#34;@Address&#34;].Value&nbsp;=&nbsp;userEntity.Address;&nbsp;<br/><br/>try&nbsp;<br/>{&nbsp;<br/>con.Open();&nbsp;<br/>com.ExecuteNonQuery();&nbsp;<br/>}&nbsp;<br/>catch&nbsp;(Exception&nbsp;e)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;e;&nbsp;<br/>}&nbsp;<br/>finally&nbsp;<br/>{&nbsp;<br/>con.Close();&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/>}&nbsp;<br/><br/>---------------------------------------------------------------&nbsp;<br/>///Model项目代码&nbsp;<br/><br/>//UserEntity.cs&nbsp;<br/><br/>using&nbsp;System;&nbsp;<br/>using&nbsp;System.Collections.Generic;&nbsp;<br/>using&nbsp;System.Text;&nbsp;<br/><br/>namespace&nbsp;Model&nbsp;<br/>{&nbsp;<br/>public&nbsp;class&nbsp;UserEntity&nbsp;<br/>{&nbsp;<br/>private&nbsp;string&nbsp;_UserName;&nbsp;<br/>private&nbsp;string&nbsp;_Sex;&nbsp;<br/>private&nbsp;string&nbsp;_Email;&nbsp;<br/>private&nbsp;string&nbsp;_Phone;&nbsp;<br/>private&nbsp;string&nbsp;_Address;&nbsp;<br/><br/>public&nbsp;UserEntity()&nbsp;{&nbsp;}&nbsp;<br/><br/>public&nbsp;string&nbsp;UserName&nbsp;<br/>{&nbsp;<br/>set&nbsp;<br/>{&nbsp;<br/>if&nbsp;(value.Length&nbsp;&gt;&nbsp;20&nbsp;||&nbsp;value.Length&nbsp;==&nbsp;0)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;new&nbsp;Exception(&#34;用户名过长或为空&#34;);&nbsp;<br/>}&nbsp;<br/>_UserName&nbsp;=&nbsp;value.Replace(&#39;\&#39;&#39;,&nbsp;&#39;_&#39;);&nbsp;<br/>}&nbsp;<br/>get&nbsp;{&nbsp;return&nbsp;_UserName;&nbsp;}&nbsp;<br/>}&nbsp;<br/>public&nbsp;string&nbsp;Sex&nbsp;<br/>{&nbsp;<br/>set&nbsp;<br/>{&nbsp;<br/>if&nbsp;(value.Length&nbsp;==&nbsp;0)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;new&nbsp;Exception(&#34;请选择性别&#34;);&nbsp;<br/>}&nbsp;<br/>_Sex&nbsp;=&nbsp;value.Replace(&#39;\&#39;&#39;,&nbsp;&#39;_&#39;);&nbsp;<br/>}&nbsp;<br/>get&nbsp;{&nbsp;return&nbsp;_Sex;&nbsp;}&nbsp;<br/>}&nbsp;<br/>public&nbsp;string&nbsp;Email&nbsp;<br/>{&nbsp;<br/>set&nbsp;<br/>{&nbsp;<br/>if&nbsp;(value.Length&nbsp;&gt;&nbsp;50)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;new&nbsp;Exception(&#34;Email地址过长&#34;);&nbsp;<br/>}&nbsp;<br/>_Email&nbsp;=&nbsp;value.Replace(&#39;\&#39;&#39;,&nbsp;&#39;_&#39;);&nbsp;<br/>}&nbsp;<br/>get&nbsp;{&nbsp;return&nbsp;_Email;&nbsp;}&nbsp;<br/>}&nbsp;<br/>public&nbsp;string&nbsp;Phone&nbsp;<br/>{&nbsp;<br/>set&nbsp;<br/>{&nbsp;<br/>if&nbsp;(value.Length&nbsp;&gt;&nbsp;20)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;new&nbsp;Exception(&#34;电话号码过长&#34;);&nbsp;<br/>}&nbsp;<br/>_Phone&nbsp;=&nbsp;value.Replace(&#39;\&#39;&#39;,&nbsp;&#39;_&#39;);&nbsp;<br/>}&nbsp;<br/>get&nbsp;{&nbsp;return&nbsp;_Phone;&nbsp;}&nbsp;<br/>}&nbsp;<br/>public&nbsp;string&nbsp;Address&nbsp;<br/>{&nbsp;<br/>set&nbsp;<br/>{&nbsp;<br/>if&nbsp;(value.Length&nbsp;&gt;&nbsp;50)&nbsp;<br/>{&nbsp;<br/>throw&nbsp;new&nbsp;Exception(&#34;地址过长&#34;);&nbsp;<br/>}&nbsp;<br/>_Address&nbsp;=&nbsp;value.Replace(&#39;\&#39;&#39;,&nbsp;&#39;_&#39;);&nbsp;<br/>}&nbsp;<br/>get&nbsp;{&nbsp;return&nbsp;_Address;&nbsp;}&nbsp;<br/>}&nbsp;<br/><br/>}&nbsp;<br/>}]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=1000</link>
			<title><![CDATA[新一篇: 无限级可分类的分类表ADT的实现(4) ]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Fri,25 Apr 2008 09:32:54 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=1000</guid>	
		<description><![CDATA[声明：本文内容主要译自Nauman&nbsp;Leghari的Using&nbsp;log4net，亦加入了个人的一点心得(节3.1.4)。<br/>请在这里下载示例代码&nbsp;&nbsp;<br/><br/>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简介&nbsp;<br/>1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log4net的优点：&nbsp;<br/>几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后，就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。&nbsp;<br/>经验表明，日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点：它可以提供应用程序运行时的精确环境，可供开发人员尽快找到应用程序中的Bug；一旦在程序中加入了Log&nbsp;输出代码，程序运行过程中就能生成并输出日志信息而无需人工干预。另外，日志信息可以输出到不同的地方（控制台，文件等）以备以后研究之用。&nbsp;<br/>Log4net就是为这样一个目的设计的，用于.NET开发环境的日志记录包。&nbsp;<br/>1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log4net的安装：&nbsp;<br/>用户可以从<a href="http://logging.apache.org/log4net/" target="_blank">http://logging.apache.org/log4net/</a>下载log4net的源代码。解压软件包后，在解压的src目录下将log4net.sln载入Visual&nbsp;Studio&nbsp;.NET，编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能，只需将log4net.dll引入工程即可。&nbsp;<br/>&nbsp;&nbsp;<br/>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log4net的结构&nbsp;<br/>log4net&nbsp;有四种主要的组件，分别是Logger（记录器）,&nbsp;Repository（库）,&nbsp;Appender（附着器）以及&nbsp;Layout（布局）.&nbsp;<br/>2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger&nbsp;<br/>2.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger接口&nbsp;<br/>Logger是应用程序需要交互的主要组件，它用来产生日志消息。产生的日志消息并不直接显示，还要预先经过Layout的格式化处理后才会输出。&nbsp;<br/>Logger提供了多种方式来记录一个日志消息，你可以在你的应用程序里创建多个Logger，每个实例化的Logger对象都被log4net框架作为命名实体(named&nbsp;entity)来维护。这意味着为了重用Logger对象，你不必将它在不同的类或对象间传递，只需要用它的名字为参数调用就可以了。log4net框架使用继承体系，继承体系类似于.NET中的名字空间。也就是说，如果有两个logger,分别被定义为a.b.c和a.b，那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性&nbsp;<br/>Log4net框架定义了一个ILog接口，所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger，你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。&nbsp;<br/>ILog接口的定义如下：&nbsp;<br/>public&nbsp;interface&nbsp;ILog&nbsp;<br/>{&nbsp;<br/>&nbsp;void&nbsp;Debug(object&nbsp;message);&nbsp;<br/>&nbsp;void&nbsp;Info(object&nbsp;message);&nbsp;<br/>&nbsp;void&nbsp;Warn(object&nbsp;message);&nbsp;<br/>&nbsp;void&nbsp;Error(object&nbsp;message);&nbsp;<br/>&nbsp;void&nbsp;Fatal(object&nbsp;message);&nbsp;<br/>&nbsp;&nbsp;<br/>//以上的每一个方法都有一个重载的方法，用来支持异常处理。&nbsp;<br/>//每一个重载方法都如下所示，有一个异常类型的附加参数。&nbsp;<br/>&nbsp;void&nbsp;Debug(object&nbsp;message,&nbsp;Exception&nbsp;ex);&nbsp;<br/>&nbsp;//&nbsp;...&nbsp;<br/>&nbsp;&nbsp;<br/>//Boolean&nbsp;属性用来检查Logger的日志级别&nbsp;<br/>//（我们马上会在后面看到日志级别）&nbsp;<br/>&nbsp;bool&nbsp;isDebugEnabled;&nbsp;<br/>&nbsp;bool&nbsp;isInfoEnabled;&nbsp;<br/>&nbsp;//…&nbsp;其他方法对应的Boolean属性&nbsp;<br/>}&nbsp;<br/>Log4net框架定义了一个叫做LogManager的类，用来管理所有的logger对象。它有一个GetLogger()静态方法，用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象，它也会为我们创建一个Logger对象。代码如下所示：&nbsp;<br/>log4net.ILog&nbsp;log&nbsp;=&nbsp;log4net.LogManager.GetLogger(&#34;logger-name&#34;);&nbsp;<br/>通常来说，我们会以类（class）的类型（type）为参数来调用GetLogger()，以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得，或者可以用如下的反射方法来获得：&nbsp;<br/>System.Reflection.MethodBase.GetCurrentMethod().DeclaringType&nbsp;<br/>尽管符号长了一些，但是后者可以用于一些场合，比如获取调用方法的类(class)的类型(type)。&nbsp;<br/>2.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日志的级别&nbsp;<br/>正如你在ILog的接口中看到的一样，有五种不同的方法可以跟踪一个应用程序。事实上，这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期，因此，框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>Level有以下几种取值&nbsp;<br/>级别&nbsp;&nbsp;允许的方法&nbsp;&nbsp;Boolean属性&nbsp;&nbsp;优先级别&nbsp;&nbsp;<br/>OFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Highest&nbsp;&nbsp;<br/>FATAL&nbsp;&nbsp;void&nbsp;Fatal(...);&nbsp;&nbsp;bool&nbsp;IsFatalEnabled;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>RROR&nbsp;&nbsp;void&nbsp;Error(...);&nbsp;&nbsp;bool&nbsp;IsErrorEnabled;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>WARN&nbsp;&nbsp;void&nbsp;Warn(...);&nbsp;&nbsp;bool&nbsp;IsWarnEnabled;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>INFO&nbsp;&nbsp;void&nbsp;Info(...);&nbsp;&nbsp;bool&nbsp;IsInfoEnabled;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>DEBUG&nbsp;&nbsp;void&nbsp;Debug(...);&nbsp;&nbsp;bool&nbsp;IsDebugEnabled;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>ALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lowest&nbsp;&nbsp;<br/><br/>表1&nbsp;Logger的日志级别&nbsp;<br/>在log4net框架里，通过设置配置文件，每个日志对象都被分配了一个日志优先级别。如果没有给一个日志对象显式地分配一个级别，那么该对象会试图从他的祖先继承一个级别值。&nbsp;<br/>ILog接口的每个方法都有一个预先定义好了的级别值。正如你在表1看到的，ILog的Inof()方法具有INFO级别。同样的，以此类推，Error()方法具有ERROR级别。当我们使用以上的任何一种方法时，log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时，日志请求才会被接受并执行。&nbsp;<br/>举例说明，当你创建了一个日志对象，并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时，框架会检查相应的Boolean属性，以决定该方法能不能执行。如下的代码：&nbsp;<br/>&nbsp;&nbsp;<br/>Logger.Info(&#34;message&#34;);&nbsp;<br/>Logger.Debug(&#34;message&#34;);&nbsp;<br/>Logger.Warn(&#34;message&#34;);&nbsp;<br/>对于第一种方法，Info()的级别等与日志的级别（INFO），因此日志请求会被传递，我们可以得到输出结果”message”。&nbsp;<br/>对于第二种方法，Debug()的级别低于日志对象logger的日志级别(INFO)，因此，日志请求被拒绝了，我们得不到任何输出。同样的，针对第三行语句，我们可以很容易得出结论。&nbsp;<br/>在表1中有两个特殊的级别：ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。&nbsp;<br/>你也可以显式地检查Logger对象的Boolean属性，如下所示：&nbsp;<br/>if&nbsp;(logger.IsDebugEnabled)&nbsp;<br/>{&nbsp;<br/>&nbsp;Logger.Debug(&#34;message&#34;);&nbsp;<br/>}&nbsp;<br/>&nbsp;&nbsp;<br/>2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Repository&nbsp;<br/>Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中，框架仅支持分等级的组织结构(hierarchical&nbsp;o&#114;ganization)。这种等级结构本质上是库的一个实现，并且定义在log4net.Repository.Hierarchy&nbsp;名字空间中。要实现一个Repository，需要实现log4net.Repository.ILoggerRepository&nbsp;接口。但是通常并不是直接实现该接口，而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库&nbsp;(hierarchical&nbsp;repository&nbsp;)则由log4net.Repository.Hierarchy.Hierarchy类实现。&nbsp;<br/>如果你是个log4net框架的使用者，而非扩展者，那么你几乎不会在你的代码里用到Repository的类。相反的，你需要用到LogManager类来自动管理库和日志对象。&nbsp;<br/>2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Appender&nbsp;<br/>一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net&nbsp;能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示，这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。&nbsp;Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表可以在log4net框架的帮助手册中找到。有了这些现成的Appender组件，一般来说你没有必要再自己编写了。但是如果你愿意，可以从log4net.Appender.AppenderSkeleton类继承。&nbsp;<br/>2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Appender&nbsp;Filters&nbsp;<br/>一个Appender&nbsp;对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender&nbsp;Filters)&nbsp;可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器，你可以按照日志级别范围过滤日志事件，或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。&nbsp;<br/>2.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Layout&nbsp;<br/>Layout&nbsp;组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示，主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象，只能对应一个Layout对象。要实现你自己的Layout类，你需要从log4net.Layout.LayoutSkeleton类继承，它实现了ILayout接口。&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在程序中使用log4net&nbsp;<br/>在开始对你的程序进行日志记录前，需要先启动log4net引擎。这意味着你需要先配置前面提到的三种组件。你可以用两种方法来设定配置：在单独的文件中设定配置或在代码中定义配置。&nbsp;<br/>因为下面几种原因，推荐在一个单独的文件中定义配置：&nbsp;<br/>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你不需要重新编译源代码就能改变配置；&nbsp;<br/>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你可以在程序正运行的时候就改变配置。这一点在一些WEB程序和远程过程调用的程序中有时很重要；&nbsp;<br/>考虑到第一种方法的重要性，我们先看看怎样在文件中设定配置信息。&nbsp;<br/>3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定义配置文件&nbsp;<br/>配置信息可以放在如下几种形式文件的一种中。&nbsp;<br/>在程序的配置文件里，如AssemblyName.config&nbsp;或web.config.&nbsp;<br/>在你自己的文件里。文件名可以是任何你想要的名字，如AppName.exe.xyz等.&nbsp;<br/>log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory&nbsp;属性定义的目录路径下查找配置文件。框架在配置文件里要查找的唯一标识是&lt;log4net&gt;标签。一个完整的配置文件的例子如下：&nbsp;<br/>&nbsp;&nbsp;<br/>&lt;?xml&nbsp;version=&#34;1.0&#34;&nbsp;encoding=&#34;utf-8&#34;&nbsp;?&gt;&nbsp;<br/>&lt;configuration&gt;&nbsp;<br/>&nbsp;&lt;configSections&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;section&nbsp;name=&#34;log4net&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#34;log4net.Config.Log4NetConfigurationSectionHandler,&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4net-net-1.0&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;/configSections&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&lt;log4net&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;root&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;level&nbsp;value=&#34;WARN&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref&nbsp;ref=&#34;LogFileAppender&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref&nbsp;ref=&#34;ConsoleAppender&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/root&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;logger&nbsp;name=&#34;testApp.Logging&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;level&nbsp;value=&#34;DEBUG&#34;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logger&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&nbsp;name=&#34;LogFileAppender&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#34;log4net.Appender.FileAppender&#34;&nbsp;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;File&#34;&nbsp;value=&#34;log-file.txt&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;AppendToFile&#34;&nbsp;value=&#34;true&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type=&#34;log4net.Layout.PatternLayout&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;Header&#34;&nbsp;value=&#34;[Header]\r\n&#34;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;Footer&#34;&nbsp;value=&#34;[Footer]\r\n&#34;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;ConversionPattern&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&#34;%d&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;[%x]&nbsp;-&nbsp;%m%n&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter&nbsp;type=&#34;log4net.Filter.LevelRangeFilter&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;LevelMin&#34;&nbsp;value=&#34;DEBUG&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;LevelMax&#34;&nbsp;value=&#34;WARN&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/filter&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/appender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&nbsp;name=&#34;ConsoleAppender&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#34;log4net.Appender.ConsoleAppender&#34;&nbsp;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type=&#34;log4net.Layout.PatternLayout&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;ConversionPattern&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&#34;%d&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;[%x]&nbsp;-&nbsp;%m%n&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/appender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&lt;/log4net&gt;&nbsp;<br/>&lt;/configuration&gt;&nbsp;<br/>你可以直接将上面的文本拷贝到任何程序中使用，但是最好还是能够理解配置文件是怎样构成的。&nbsp;只有当你需要在应用程序配置文件中使用log4net配置时，才需要在&lt;configSection&gt;标签中加入&lt;section&gt;配置节点入口。对于其他的单独文件，只有&lt;log4net&gt;标签内的文本才是必需的，这些标签的顺序并不是固定的。下面我们依次讲解各个标签内文本的含义：&nbsp;<br/>3.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;root&gt;&nbsp;<br/>&lt;root&gt;&nbsp;<br/>&nbsp;&lt;level&nbsp;value=&#34;WARN&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;appender-ref&nbsp;ref=&#34;LogFileAppender&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;appender-ref&nbsp;ref=&#34;ConsoleAppender&#34;&nbsp;/&gt;&nbsp;<br/>&lt;/root&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>在框架的体系里，所有的日志对象都是根日志(root&nbsp;logger)的后代。&nbsp;因此如果一个日志对象没有在配置文件里显式定义，则框架使用根日志中定义的属性。在&lt;root&gt;标签里，可以定义level级别值和Appender的列表。如果没有定义LEVEL的值，则缺省为DEBUG。可以通过&lt;appender-ref&gt;标签定义日志对象使用的Appender对象。&lt;appender-ref&gt;声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说，子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定&lt;logger&gt;标签的additivity属性为false而改变。&nbsp;<br/>&lt;logger&nbsp;name=&#34;testApp.Logging&#34;&nbsp;additivity=&#34;false&#34;&gt;&nbsp;<br/>&lt;/logger&gt;&nbsp;<br/>Additivity的值缺省是true.&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>3.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Logger&gt;&nbsp;<br/>&lt;logger&nbsp;name=&#34;testApp.Logging&#34;&gt;&nbsp;<br/>&nbsp;&lt;level&nbsp;value=&#34;DEBUG&#34;/&gt;&nbsp;<br/>&lt;/logger&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&lt;logger&gt;&nbsp;元素预定义了一个具体日志对象的设置。然后通过调用LogManager.GetLogger(“testAPP.Logging”)函数，你可以检索具有该名字的日志。如果LogManager.GetLogger(…)打开的不是预定义的日志对象，则该日志对象会继承根日志对象的属性。知道了这一点，我们可以说，其实&lt;logger&gt;标签并不是必须的。&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>3.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>&lt;appender&nbsp;name=&#34;LogFileAppender&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#34;log4net.Appender.FileAppender&#34;&nbsp;&gt;&nbsp;<br/>&nbsp;&lt;param&nbsp;name=&#34;File&#34;&nbsp;value=&#34;log-file.txt&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;param&nbsp;name=&#34;AppendToFile&#34;&nbsp;value=&#34;true&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;layout&nbsp;type=&#34;log4net.Layout.PatternLayout&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;Header&#34;&nbsp;value=&#34;[Header]\r\n&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;Footer&#34;&nbsp;value=&#34;[Footer]\r\n&#34;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;ConversionPattern&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&#34;%d&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;-&nbsp;%m%n&#34;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;/layout&gt;&nbsp;<br/>&nbsp;&lt;filter&nbsp;type=&#34;log4net.Filter.LevelRangeFilter&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;LevelMin&#34;&nbsp;value=&#34;DEBUG&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#34;LevelMax&#34;&nbsp;value=&#34;WARN&#34;&nbsp;/&gt;&nbsp;<br/>&nbsp;&lt;/filter&gt;&nbsp;<br/>&lt;/appender&gt;&nbsp;<br/>&nbsp;&nbsp;<br/>在&lt;root&gt;标签或单个的&lt;logger&gt;标签里的Appender对象可以用&lt;appender&gt;标签定义。&lt;appender&gt;标签的基本形式如上面所示。它定义了appender的名字和类型。&nbsp;另外比较重要的是&lt;appender&gt;标签内部的其他标签。不同的appender有不同的&lt;param&gt;标签。在这里，为了使用FileAppender,你需要一个文件名作为参数。另外还需要一个在&lt;appender&gt;标签内部定义一个Layout对象。Layout对象定义在它自己的&lt;layout&gt;标签内。&lt;layout&gt;标签的type属性定义了Layout的类型(在本例里是PatternLayout)，同时也确定了需要提供的参数值。Header和Footer标签提供了一个日志会话(logging&nbsp;session)开始和结束时输出的文字。有关每种appender的具体配置的例子，可以在log4net\doc\manual\example-config-appender.html中得到。&nbsp;<br/>&nbsp;&nbsp;<br/>3.1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4net.Layout.PatternLayout中的转换模式(ConversionPattern)&nbsp;<br/>%m(message):输出的日志消息，如ILog.Debug(…)输出的一条消息&nbsp;<br/>%n(new&nbsp;line):换行&nbsp;<br/>%d(datetime):输出当前语句运行的时刻&nbsp;<br/>%r(run&nbsp;time):输出程序从运行到执行到当前语句时消耗的毫秒数&nbsp;<br/>%t(thread&nbsp;id):当前语句所在的线程ID&nbsp;<br/>%p(priority):&nbsp;日志的当前优先级别，即DEBUG、INFO、WARN…等&nbsp;<br/>%c(class):当前日志对象的名称，例如：&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模式字符串为：%-10c&nbsp;-%m%n&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码为：&nbsp;<br/>ILog&nbsp;log=LogManager.GetLogger(“Exam.Log”);&nbsp;<br/>log.Debug(“Hello”);&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;则输出为下面的形式：&nbsp;<br/>Exam.Log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Hello&nbsp;<br/>%L：输出语句所在的行号&nbsp;<br/>%F：输出语句所在的文件名&nbsp;<br/>%-数字：表示该项的最小长度，如果不够，则用空格填充&nbsp;<br/>例如，转换模式为%r&nbsp;[%t]%-5p&nbsp;%c&nbsp;-&nbsp;%m%n&nbsp;的&nbsp;PatternLayout&nbsp;将生成类似于以下内容的输出：&nbsp;<br/>176&nbsp;[main]&nbsp;INFO&nbsp;o&#114;g.foo.Bar&nbsp;-&nbsp;Located&nbsp;nearest&nbsp;gas&nbsp;station.&nbsp;<br/>&nbsp;&nbsp;<br/>3.1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter&gt;&nbsp;<br/>最后，让我们看看在Appender元素里的&lt;filter&gt;标签。它定义了应用到Appender对象的过滤器。本例中，我们使用了LevelRangeFilter过滤器,它可以只记录LevelMin和LevelMax参数指定的日志级别之间的日志事件。可以在一个Appender上定义多个过滤器（Filter）,这些过滤器将会按照它们定义的顺序对日志事件进行过滤。其他过滤器的有关信息可以在log4net的SDK文档中找到。&nbsp;<br/>&nbsp;&nbsp;<br/>3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用配置文件&nbsp;<br/>3.2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关联配置文件&nbsp;<br/>当我们创建了上面的配置文件后，我们接下来需要把它和我们的应用联系起来。缺省的，每个独立的可执行程序集都会定义它自己的配置。log4net框架使用&nbsp;log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。&nbsp;<br/>例如：可以在项目的AssemblyInfo.cs文件里添加以下的语句&nbsp;<br/>[assembly:log4net.Config.DOMConfigurator(ConfigFile=&#34;filename&#34;,&nbsp;<br/>&nbsp;ConfigFileExtension=&#34;ext&#34;,Watch=true/false)]&nbsp;<br/>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigFile:指出了我们的配置文件的路径及文件名，包括扩展名。&nbsp;<br/>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名，那么我们需要定义这个属性，缺省的，程序集的配置文件扩展名为”config”。&nbsp;<br/>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Watch&nbsp;(Boolean属性):&nbsp;log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变，重命名，删除等事件。&nbsp;<br/>其中：ConfigFile和ConfigFileExtension属性不能同时使用，ConfigFile指出了配置文件的名字，例如，ConfigFile=”Config.txt”&nbsp;<br/>ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名，例如，应用程序的名称是”test.exe”,ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt”&nbsp;；&nbsp;<br/>也可以不带参数应用DOMConfiguratio():&nbsp;<br/>&nbsp;[assembly:&nbsp;log4net.Config.DOMConfigurator()]&nbsp;<br/>也可以在程序代码中用DOMConfigurator类打开配置文件。类的构造函数需要一个FileInfo对象作参数，以指出要打开的配置文件名。&nbsp;这个方法和前面在程序集里设置属性打开一个配置文件的效果是一样的。&nbsp;<br/>log4net.Config.DOMConfigurator.Configure(&nbsp;<br/>&nbsp;new&nbsp;FileInfo(&#34;TestLogger.Exe.Config&#34;));&nbsp;<br/>DOMConfigurator&nbsp;类还有一个方法ConfigureAndWatch(..),&nbsp;用来配置框架并检测文件的变化。&nbsp;<br/>以上的步骤总结了和配置相关的各个方面，下面我们将分两步来使用logger对象。&nbsp;<br/>3.2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建或获取日志对象&nbsp;<br/>日志对象会使用在配置文件里定义的属性。如果某个日志对象没有事先在配置文件里定义，那么框架会根据继承结构获取祖先节点的属性，最终的，会从根日志获取属性。如下所示：&nbsp;<br/>Log4net.ILog&nbsp;log&nbsp;=&nbsp;Log4net.LogManager.GetLogger(&#34;MyLogger&#34;);&nbsp;<br/>3.2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输出日志信息&nbsp;<br/>可以使用ILog的几种方法输出日志信息。你也可以在调用某方法前先检查IsXXXEnabled布尔变量，再决定是否调用输出日志信息的函数，这样可以提高程序的性能。因为框架在调用如ILog.Debug(…)这样的函数时，也会先判断是否满足Level日志级别条件。&nbsp;<br/>if&nbsp;(log.IsDebugEnabled)&nbsp;log.Debug(&#34;message&#34;);&nbsp;<br/>if&nbsp;(log.IsInfoEnabled)&nbsp;log.Info(&#34;message);&nbsp;<br/>&nbsp;&nbsp;<br/>3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在程序中配置log4net&nbsp;<br/>除了前面讲的用一个配置文件来配置log4net以外，还可以在程序中用代码来配置log4net框架。如下面的例子:&nbsp;<br/>&nbsp;&nbsp;<br/>//&nbsp;和PatternLayout一起使用FileAppender&nbsp;<br/>log4net.Config.BasicConfigurator.Configure(&nbsp;<br/>&nbsp;new&nbsp;log4net.Appender.FileAppender(&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;log4net.Layout.PatternLayout(&#34;%d&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[%t]%-5p&nbsp;%c&nbsp;[%x]&nbsp;-&nbsp;%m%n&#34;),&#34;testfile.log&#34;));&nbsp;<br/>&nbsp;&nbsp;<br/>//&nbsp;using&nbsp;a&nbsp;FileAppender&nbsp;with&nbsp;an&nbsp;XMLLayout&nbsp;<br/>log4net.Config.BasicConfigurator.Configure(&nbsp;<br/>&nbsp;new&nbsp;log4net.Appender.FileAppender(&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;log4net.Layout.XMLLayout(),&#34;testfile.xml&#34;));&nbsp;<br/>&nbsp;&nbsp;<br/>//&nbsp;using&nbsp;a&nbsp;ConsoleAppender&nbsp;with&nbsp;a&nbsp;PatternLayout&nbsp;<br/>log4net.Config.BasicConfigurator.Configure(&nbsp;<br/>&nbsp;new&nbsp;log4net.Appender.ConsoleAppender(&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;log4net.Layout.PatternLayout(&#34;%d&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;-&nbsp;%m%n&#34;)));&nbsp;<br/>&nbsp;&nbsp;<br/>//&nbsp;using&nbsp;a&nbsp;ConsoleAppender&nbsp;with&nbsp;a&nbsp;SimpleLayout&nbsp;<br/>log4net.Config.BasicConfigurator.Configure(&nbsp;<br/>&nbsp;new&nbsp;log4net.Appender.ConsoleAppender(new&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;log4net.Layout.SimpleLayout()));&nbsp;<br/>尽管这里用代码配置log4net也很方便，但是你却不能分别配置每个日志对象。所有的这些配置都是被应用到根日志上的。&nbsp;<br/>log4net.Config.BasicConfigurator&nbsp;类使用静态方法Configure&nbsp;设置一个Appender&nbsp;对象。而Appender的构造函数又会相应的要求Layout对象。你也可以不带参数直接调用BasicConfigurator.Configure()，它会使用一个缺省的PatternLayout对象，在一个ConsoleAppender中输出信息。如下所示：&nbsp;<br/>&nbsp;&nbsp;<br/>log4net.Config.BasicConfigurator.Configure();&nbsp;<br/>在输出时会显示如下格式的信息：&nbsp;<br/>&nbsp;&nbsp;<br/>0&nbsp;[1688]&nbsp;DEBUG&nbsp;log1&nbsp;A&nbsp;B&nbsp;C&nbsp;-&nbsp;Test&nbsp;<br/>20&nbsp;[1688]&nbsp;INFO&nbsp;log1&nbsp;A&nbsp;B&nbsp;C&nbsp;-&nbsp;Test&nbsp;<br/>当log4net框架被配置好以后，就可以如前所述使用日志功能了。&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总结&nbsp;<br/>使用log4net可以很方便地为应用添加日志功能。应用Log4net，使用者可以很精确地控制日志信息的输出，减少了多余信息，提高了日志记录性能。同时，通过外部配置文件，用户可以不用重新编译程序就能改变应用的日志行为，使得用户可以根据情况灵活地选择要记录的信息。&nbsp;<br/>&nbsp;]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=998</link>
			<title><![CDATA[基于jQuery的facebox]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Js/Ajax/Css]]></category>
			<pubDate>Mon,21 Apr 2008 23:25:07 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=998</guid>	
		<description><![CDATA[它是什么?<br/>facebox是一个jquery为基础的lightbox，可显示图像，&nbsp;divs&nbsp;，或者远程页面。&nbsp;它的使用简单，容易。下载js，请查看例子，然后开始享受facebox给我们带来的乐趣。&nbsp;<br/><br/>首先我们用Facebox观看图片&nbsp;：<br/>&lt;a&nbsp;href=&#34;cssrain.jpg&#34;&nbsp;rel=&#34;facebox&#34;&gt;text&lt;/a&gt;<br/>仅仅这样就OK。<br/><br/>然后我们在来看&nbsp;用Facebox观看div&nbsp;：<br/>&lt;a&nbsp;href=&#34;#info&#34;&nbsp;rel=&#34;facebox&#34;&gt;text&lt;/a&gt;<br/>ok,就这样就能简单的实现facebox了。<br/><br/>当然在ajax横行的时代，ajax远程加载页面也是必不可少的。<br/>我们用Facebox加载远程的页面内容：<br/>&lt;a&nbsp;href=&#34;cssrain.html&#34;&nbsp;rel=&#34;facebox&#34;&gt;text&lt;/a&gt;<br/>OK，这样就能远程加载&nbsp;cssrain.html&nbsp;的内容，以facebox的方式显示了。<br/><br/>用法：<br/>facebox应该导入<br/>&lt;script&nbsp;src=&#34;jquery.js&#34;&nbsp;type=&#34;text/javascript&#34;&gt;&lt;/script&gt;<br/>&lt;link&nbsp;href=&#34;/facebox/facebox.css&#34;&nbsp;media=&#34;screen&#34;&nbsp;rel=&#34;stylesheet&#34;&nbsp;type=&#34;text/css&#34;/&gt;<br/>&lt;script&nbsp;src=&#34;/facebox/facebox.js&#34;&nbsp;type=&#34;text/javascript&#34;&gt;&lt;/script&gt;&nbsp;<br/>jQuery(document).ready(function($)&nbsp;{<br/>//超链接的rel属性是否具有facebox<br/>$(&#39;a[rel*=facebox]&#39;).facebox()&nbsp;<br/>})&nbsp;<br/><br/>演示<br/><br/>看演示点这里<br/><br/>下载<br/><br/>你需要在js和css里面&nbsp;加上&nbsp;loading图片，和四个角的图片和边框图片。&nbsp;这就是你要做的。&nbsp;<br/>Download&nbsp;Facebox&nbsp;v1.0&nbsp;<br/><br/>深入研究<br/><a href="http://famspam.com/facebox/" target="_blank">http://famspam.com/facebox/</a>]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=997</link>
			<title><![CDATA[Jquery常用代码]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Js/Ajax/Css]]></category>
			<pubDate>Mon,21 Apr 2008 02:19:02 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=997</guid>	
		<description><![CDATA[$(&#34;#other_category&#34;).attr(&#39;disabled&#39;,&#39;&nbsp;true&#39;);<br/><br/>jQuery中文会乱码的解决方法<br/>作者:admin&nbsp;日期:2008-01-24<br/>字体大小:&nbsp;小&nbsp;中&nbsp;大&nbsp;<br/>有很多朋友反映用jQuery会碰到中文乱码的问题。<br/>使用escape()和unescape()；<br/>解决方法:<br/>除了编码一定要选择utf-8外，用$.get()方法还需要对传递内容进行编码，如：<br/><br/>$.get(&#39;Accept.jsp&#39;,&nbsp;<br/>text:&nbsp;{escape($(&#34;#name&#34;).val()),address:escape($(&#34;#address&#34;).val())},&nbsp;<br/>function&nbsp;(data)&nbsp;{&nbsp;<br/>$(&#34;#result&#34;).html(unescape(data));<br/>//&nbsp;escapse编码后进行传递，返回后用unescape()进行解码.});<br/><br/>原因：js无法获知get回来的数据是何种编码。&nbsp;<br/><br/><br/><br/>在jQuery&nbsp;google(english)上看到的问题，整理了一下，想给回复，结果没回复成功，就回来写了。<br/><br/>有如下HTML代码，现在只想将row1那一行的表单元素进行serialize()，而其它的不想用。<br/><br/>&lt;table&gt;<br/>&lt;form&gt;<br/>&lt;tr&nbsp;id=&#34;row1&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type=&#34;text&#34;&nbsp;name=&#34;text1&#34;&nbsp;id=&#34;text1&#34;&nbsp;value=&#34;&#34;&gt;&lt;/td&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type=&#34;text&#34;&nbsp;name=&#34;text2&#34;&nbsp;id=&#34;text2&#34;&nbsp;value=&#34;&#34;&gt;&lt;/td&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type=&#34;text&#34;&nbsp;name=&#34;text3&#34;&nbsp;id=&#34;text3&#34;&nbsp;value=&#34;&#34;&gt;&lt;/td&gt;&nbsp;<br/>&lt;/tr&gt;<br/>&lt;tr&nbsp;id=&#34;row2&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type=&#34;text&#34;&nbsp;name=&#34;text4&#34;&nbsp;id=&#34;text4&#34;&nbsp;value=&#34;&#34;&gt;&lt;/td&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type=&#34;text&#34;&nbsp;name=&#34;text5&#34;&nbsp;id=&#34;text5&#34;&nbsp;value=&#34;&#34;&gt;&lt;/td&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type=&#34;text&#34;&nbsp;name=&#34;text6&#34;&nbsp;id=&#34;text6&#34;&nbsp;value=&#34;&#34;&gt;&lt;/td&gt;&nbsp;<br/>&lt;/tr&gt;<br/>&lt;/form&gt;<br/>&lt;/table&gt;<br/>其实就是一句话<br/><br/>$(&#39;#row1&nbsp;:input&#39;).serialize()<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=994</link>
			<title><![CDATA[大型高并发高负载网站的系统架构 ]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Tue,08 Apr 2008 13:39:37 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=994</guid>	
		<description><![CDATA[我在Cernet做过拨号接入平台的搭建，而后在Yahoo3721负载搜索引擎前端平台开发，又在猫扑处理过大型社区猫扑大杂烩的架构升级等工作，&nbsp;同时自己接触和开发过不少大中型网站的模块，因此在大型网站应对高负载和并发的解决方案上有一些积累和经验，可以和大家一起探讨一下。<br/>　　<br/>　　<br/>　&nbsp;　一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系&nbsp;统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技&nbsp;术更是涉及面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能&nbsp;比拟的。<br/>　　<br/>　　大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。<br/>　　<br/>　　上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。<br/>　　<br/>　　1、HTML静态化<br/>　&nbsp;　其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是&nbsp;最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点&nbsp;的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限&nbsp;管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。<br/>　　<br/>　　除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。<br/>　　<br/>　&nbsp;　同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛&nbsp;中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这&nbsp;部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。<br/>　　<br/>　　2、图片服务器分离<br/>　　大家知道，对于Web&nbsp;服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他&nbsp;们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用&nbsp;服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，&nbsp;保证更高的系统消耗和执行效率。<br/>　　<br/>　　3、数据库集群和库表散列<br/>　　大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。<br/>　　<br/>　　在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。<br/>　　<br/>　&nbsp;　上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并&nbsp;且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者&nbsp;功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的&nbsp;架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系&nbsp;统随时增加一台低成本的数据库进来补充系统性能。<br/>　　<br/>　　4、缓存<br/>　　缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br/>　　架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br/>　&nbsp;　网站程序开发方面的缓存，Linux上提供的Memory&nbsp;Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大&nbsp;型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多&nbsp;了，.net不是很熟悉，相信也肯定有。<br/>　　<br/>　　5、镜像<br/>　　镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可&nbsp;以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定&nbsp;时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的&nbsp;rsync等工具。<br/>　　<br/>　　6、负载均衡<br/>　　负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br/>　　负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br/>　　硬件四层交换<br/>　&nbsp;　第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象&nbsp;是虚IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复&nbsp;杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同&nbsp;决定。<br/>　　在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。<br/>　　<br/>　　软件四层交换<br/>　　大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br/>　&nbsp;　软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux&nbsp;Virtual&nbsp;Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满&nbsp;足多种应用需求，这对于分布式的系统来说必不可少。<br/>　　<br/>　　一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。<br/>　　<br/>　　对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。<br/>　　<br/>　　作者：Just&nbsp;Do&nbsp;IT&nbsp;(<a href="http://www.toplee.com" target="_blank">http://www.toplee.com</a>)&nbsp;lee@toplee.com&nbsp;]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=993</link>
			<title><![CDATA[成批更改sql server数据库所有者的对象]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Mon,07 Apr 2008 10:51:29 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=993</guid>	
		<description><![CDATA[成批更改sql&nbsp;server数据库所有者的对象<br/><br/>因为一些网站是使用虚拟主机.用sql-server导数据上去的话.<br/>数据库的用户默认是你登录的用户,不是dbo,有时就和本地产生不一致.<br/><br/>--功能说明：成批更改数据库所有者的对象<br/>--作者：不详<br/>--用法：exec&nbsp;ChangeObjectOwner&nbsp;&#39;nmkspro&#39;,&#39;dbo&#39;<br/>--即可将所有nmkspro所有者的对象改为dbo所有<br/>--运行成功后将提示：&#34;注意:&nbsp;更改对象名的任一部分都可能破坏脚本和存储过程。&#34;<br/>Cr&#101;ate&nbsp;PROCEDURE&nbsp;dbo.ChangeObjectOwner<br/>@OldOwner&nbsp;as&nbsp;NVARCHAR(128),--参数原所有者<br/>@NewOwner&nbsp;as&nbsp;NVARCHAR(128)--参数新所有者<br/>AS<br/><br/>DECLARE&nbsp;@Name&nbsp;&nbsp;&nbsp;as&nbsp;NVARCHAR(128)<br/>DECLARE&nbsp;@Owner&nbsp;as&nbsp;NVARCHAR(128)<br/>DECLARE&nbsp;@OwnerName&nbsp;as&nbsp;NVARCHAR(128)<br/><br/>DECLARE&nbsp;curObject&nbsp;CURSOR&nbsp;FOR<br/>sel&#101;ct&nbsp;&#39;Name&#39;&nbsp;&nbsp;&nbsp;=&nbsp;name,<br/>&#39;Owner&#39;&nbsp;&nbsp;&nbsp;=&nbsp;user_name(uid)<br/>from&nbsp;sysobjects<br/>wh&#101;re&nbsp;user_name(uid)=@OldOwner<br/>o&#114;der&nbsp;by&nbsp;name<br/><br/>OPEN&nbsp;curObject<br/>FETCH&nbsp;NEXT&nbsp;FROM&nbsp;curObject&nbsp;INTO&nbsp;@Name,&nbsp;@Owner<br/>WHILE(@@FETCH_STATUS=0)<br/>BEGIN&nbsp;&nbsp;<br/>if&nbsp;@Owner=@OldOwner<br/>begin<br/>set&nbsp;@OwnerName&nbsp;=&nbsp;@OldOwner&nbsp;+&nbsp;&#39;.&#39;&nbsp;+&nbsp;rtrim(@Name)<br/>exec&nbsp;sp_changeobjectowner&nbsp;@OwnerName,&nbsp;@NewOwner<br/>end<br/><br/>FETCH&nbsp;NEXT&nbsp;FROM&nbsp;curObject&nbsp;INTO&nbsp;@Name,&nbsp;@Owner<br/>END<br/><br/>close&nbsp;curObject<br/>deallocate&nbsp;curObject<br/>GO<br/><br/><br/>批量修改：<br/>EXEC&nbsp;sp_MSforeachtable&nbsp;&#39;exec&nbsp;sp_changeobjectowner&nbsp;&#39;&#39;?&#39;&#39;,&#39;&#39;dbo&#39;&#39;&nbsp;&#39;<br/>单个修改：<br/>exec&nbsp;sp_changeobjectowner&nbsp;&#39;要改的表名&#39;,&#39;dbo&#39;<br/><br/><br/>方法一：直接点击该表-》设计-》属性-》更改上面的所有者。该方法针对于表少的情况下。<br/>方法二：利用脚本直接执行，用系统帐号或者超户登陆到该数据库，然后执行下面语句：<br/>sp_configure&nbsp;&#39;allow&nbsp;up&#100;ates&#39;,&#39;1&#39;<br/>go<br/>reconfigure&nbsp;with&nbsp;override<br/>go<br/>up&#100;ate&nbsp;sysobjects&nbsp;set&nbsp;uid=1&nbsp;wh&#101;re&nbsp;uid&lt;&gt;1&nbsp;--根据条件可以任意修改，在多用户之间切换。<br/>go<br/>sp_configure&nbsp;&#39;allow&nbsp;up&#100;ates&#39;,&#39;0&#39;<br/>go<br/>reconfigure&nbsp;with&nbsp;override]]></description>
		</item>
		
			<item>
			<link>http://blog.sjzj.com.cn/default.asp?id=992</link>
			<title><![CDATA[在.NET中 DAL+IDAL+Model+BLL+Web是什么意思]]></title>
			<author>xtftbwvfp@gmail.com(单翼)</author>
			<category><![CDATA[Asp/Php/Jsp]]></category>
			<pubDate>Mon,24 Mar 2008 13:02:38 +0800</pubDate>
			<guid>http://blog.sjzj.com.cn/default.asp?id=992</guid>	
		<description><![CDATA[业务逻辑层(BLL)：主要是针对具体的问题的操作，也可以理解成对数据层的操作，对数据业务逻辑处理。如果说数据层是积木，那逻辑层就是对这些积木的搭建。&nbsp;<br/>数据访问层(DAL)：主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层，而不是指原始数据，也就是说，是对数据的操作，而不是数据库，具体为业务逻辑层或表示层提供数据服务。&nbsp;<br/>(IDAL)它体现了“抽象”的精神，或者说是“面向接口编程”的最佳体现。抽象的接口模块IDAL&nbsp;<br/>(Model)实体和数据库表映射类&nbsp;<br/>（Web）web网站项目]]></description>
		</item>
		
</channel>
</rss>