﻿<?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-szhswl</title><link>http://www.blogjava.net/szhswl/</link><description>宋针还的个人空间</description><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 05:17:37 GMT</lastBuildDate><pubDate>Tue, 05 May 2026 05:17:37 GMT</pubDate><ttl>60</ttl><item><title>JS屏蔽功能类</title><link>http://www.blogjava.net/szhswl/articles/291529.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Mon, 17 Aug 2009 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/291529.html</guid><description><![CDATA[<span style="color: teal">1.屏蔽功能类 <br />
<br />
1.1 屏蔽键盘所有键 <br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function document.onkeydown(){ <br />
event.keyCode = 0; <br />
event.returnvalue = false; <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
1.2 屏蔽鼠标右键 <br />
<br />
在body标签里加上on_contextmenu=self.event.returnvalue=false <br />
<br />
或者 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function document.on_contextmenu() <br />
{ <br />
return false; <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
function nocontextmenu() <br />
{ <br />
if(document.all) { <br />
event.cancelBubble=true; <br />
event.returnvalue=false; <br />
return false; <br />
} <br />
} <br />
<br />
或者 <br />
<br />
&lt;body onmousedown="rclick()" on_contextmenu= "nocontextmenu()"&gt; <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function rclick() <br />
{ <br />
if(document.all) { <br />
if (event.button == 2){ <br />
event.returnvalue=false; <br />
} <br />
} <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
<br />
1.3 屏蔽 Ctrl+N、Shift+F10、F5刷新、退格键 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
//屏蔽鼠标右键、Ctrl+N、Shift+F10、F5刷新、退格键 <br />
function window.onhelp(){return false} //屏蔽F1帮助 <br />
function KeyDown(){ <br />
if ((window.event.altKey)&amp;&amp; <br />
((window.event.keyCode==37)|| //屏蔽 Alt+ 方向键 &#8592; <br />
(window.event.keyCode==39))){ //屏蔽 Alt+ 方向键 &#8594; <br />
alert("不准你使用ALT+方向键前进或后退网页！"); <br />
event.returnvalue=false; <br />
} <br />
<br />
/* 注：这还不是真正地屏蔽 Alt+ 方向键， <br />
因为 Alt+ 方向键弹出警告框时，按住 Alt 键不放， <br />
用鼠标点掉警告框，这种屏蔽方法就失效了。以后若 <br />
有哪位高手有真正屏蔽 Alt 键的方法，请告知。*/ <br />
<br />
if ((event.keyCode ==<img src="http://guoqinhua1986-126-com.javaeye.com/images/smiles/icon_cool.gif"  alt="" /> &amp;&amp; <br />
(event.srcElement.type != "text" &amp;&amp; <br />
event.srcElement.type != "textarea" &amp;&amp; <br />
event.srcElement.type != "password") || //屏蔽退格删除键 <br />
(event.keyCode ==116)|| //屏蔽 F5 刷新键 <br />
(event.ctrlKey &amp;&amp; event.keyCode==82)){ //Ctrl + R <br />
event.keyCode=0; <br />
event.returnvalue=false; <br />
} <br />
if ((event.ctrlKey)&amp;&amp;(event.keyCode==78)) //屏蔽 Ctrl+n <br />
event.returnvalue=false; <br />
if ((event.shiftKey)&amp;&amp;(event.keyCode==121)) //屏蔽 shift+F10 <br />
event.returnvalue=false; <br />
if (window.event.srcElement.tagName == "A" &amp;&amp; window.event.shiftKey) <br />
window.event.returnvalue = false; //屏蔽 shift 加鼠标左键新开一网页 <br />
if ((window.event.altKey)&amp;&amp;(window.event.keyCode==115)){ //屏蔽Alt+F4 <br />
window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px"); <br />
return false;} <br />
} <br />
/* 另外可以用 window.open 的方法屏蔽 IE 的所有菜单 <br />
第一种方法： <br />
window.open("你的.htm", "","toolbar=no,location=no,directories= no,menubar=no,scrollbars=no,resizable=yes,status=no,top=0,left=0") <br />
第二种方法是打开一个全屏的页面： <br />
window.open("你的.asp", "", "fullscreen=yes") <br />
*/ <br />
//--&gt; <br />
&lt;/script&gt; <br />
<br />
1.4屏蔽浏览器右上角&#8220;最小化&#8221;&#8220;最大化&#8221;&#8220;关闭&#8221;键 <br />
<br />
&lt;script language=javascript&gt; <br />
function window.on_beforeunload() <br />
{ <br />
if(event.clientX&gt;document.body.clientWidth&amp;&amp;event.clientY&lt;0||event.altKey) <br />
{ <br />
window.event.returnvalue = ""; <br />
} <br />
} <br />
&lt;/script&gt; <br />
<br />
或者使用全屏打开页面 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
window.open(www.32pic.com,"32pic","fullscreen=3,height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no"); <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
注：在body标签里加上on_beforeunload="javascript:return false"（使不能关闭窗口） <br />
<br />
1.5屏蔽F5键 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function document.onkeydown() <br />
{ <br />
if ( event.keyCode==116) <br />
{ <br />
event.keyCode = 0; <br />
event.cancelBubble = true; <br />
return false; <br />
} <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
1.6屏蔽IE后退按钮 <br />
<br />
在你链接的时候用 &lt;a href="javascript:location.replace(url)"&gt; <br />
<br />
1.7屏蔽主窗口滚动条 <br />
<br />
在body标签里加上 style="overflow-y:hidden" <br />
<br />
1.8 屏蔽拷屏,不断地清空剪贴板 <br />
<br />
在body标签里加上onload="setInterval('clipboardData.setData(\'Text\',\'\')',100)" <br />
<br />
1.9 屏蔽网站的打印功能 <br />
<br />
&lt;style&gt; <br />
@media print { <br />
* { display: none } <br />
} <br />
&lt;/style&gt; <br />
<br />
1.10 屏蔽IE6.0 图片上自动出现的保存图标 <br />
<br />
方法一： <br />
&lt;META HTTP-EQUIV="imagetoolbar" CONTENT="no"&gt; <br />
方法二： <br />
&lt;img galleryimg="no"&gt; <br />
<br />
1.11 屏蔽页中所有的script <br />
<br />
&lt;noscrript&gt;&lt;/noscript&gt; <br />
<br />
<br />
2.表单提交验证类 <br />
<br />
<br />
2.1 表单项不能为空 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function CheckForm() <br />
{ <br />
if (document.form.name.value.length == 0) { <br />
alert("请输入您姓名!"); <br />
document.form.name.focus(); <br />
return false; <br />
} <br />
return true; <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
2.2 比较两个表单项的值是否相同 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function CheckForm() <br />
if (document.form.PWD.value != document.form.PWD_Again.value) { <br />
alert("您两次输入的密码不一样！请重新输入."); <br />
document.ADDUser.PWD.focus(); <br />
return false; <br />
} <br />
return true; <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
2.3 表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function isNumber(String) <br />
{ <br />
var Letters = "1234567890-"; //可以自己增加可输入值 <br />
var i; <br />
var c; <br />
if(String.charAt( 0 )=='-') <br />
return false; <br />
if( String.charAt( String.length - 1 ) == '-' ) <br />
return false; <br />
for( i = 0; i &lt; String.length; i ++ ) <br />
{ <br />
c = String.charAt( i ); <br />
if (Letters.indexOf( c ) &lt; 0) <br />
return false; <br />
} <br />
return true; <br />
} <br />
function CheckForm() <br />
{ <br />
if(! isNumber(document.form.TEL.value)) { <br />
alert("您的电话号码不合法！"); <br />
document.form.TEL.focus(); <br />
return false; <br />
} <br />
return true; <br />
} <br />
--&gt; <br />
&lt;/script&gt; <br />
<br />
<br />
2.4 表单项输入数值/长度限定 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function CheckForm() <br />
{ <br />
if (document.form.count.value &gt; 100 || document.form.count.value &lt; 1) <br />
{ <br />
alert("输入数值不能小于零大于100!"); <br />
document.form.count.focus(); <br />
return false; <br />
} <br />
if (document.form.MESSAGE.value.length&lt;10) <br />
{ <br />
alert("输入文字小于10!"); <br />
document.form.MESSAGE.focus(); <br />
return false; <br />
} <br />
return true; <br />
} <br />
//--&gt; <br />
&lt;/script&gt; <br />
<br />
2.5 中文/英文/数字/邮件地址合法性判断 <br />
<br />
&lt;SCRIPT LANGUAGE="javascript"&gt; <br />
&lt;!-- <br />
<br />
function isEnglish(name) //英文值检测 <br />
{ <br />
if(name.length == 0) <br />
return false; <br />
for(i = 0; i &lt; name.length; i++) { <br />
if(name.charCodeAt(i) &gt; 128) <br />
return false; <br />
} <br />
return true; <br />
} <br />
<br />
function isChinese(name) //中文值检测 <br />
{ <br />
if(name.length == 0) <br />
return false; <br />
for(i = 0; i &lt; name.length; i++) { <br />
if(name.charCodeAt(i) &gt; 128) <br />
return true; <br />
} <br />
return false; <br />
} <br />
<br />
function isMail(name) // E-mail值检测 <br />
{ <br />
if(! isEnglish(name)) <br />
return false; <br />
i = name.indexOf("@"); <br />
j = name.lastIndexOf("@"); <br />
if(i == -1) <br />
return false; <br />
if(i != j) <br />
return false; <br />
if(i == name.length) <br />
return false; <br />
return true; <br />
} <br />
<br />
function isNumber(name) //数值检测 <br />
{ <br />
if(name.length == 0) <br />
return false; <br />
for(i = 0; i &lt; name.length; i++) { <br />
if(name.charAt(i) &lt; "0" || name.charAt(i) &gt; "9") <br />
return false; <br />
} <br />
return true; <br />
} <br />
<br />
function CheckForm() <br />
{ <br />
if(! isMail(form.Email.value)) { <br />
alert("您的电子邮件不合法！"); <br />
form.Email.focus(); <br />
return false; <br />
} <br />
if(! isEnglish(form.name.value)) { <br />
alert("英文名不合法！"); <br />
form.name.focus(); <br />
return false; <br />
} <br />
if(! isChinese(form.cnname.value)) { <br />
alert("中文名不合法！"); <br />
form.cnname.focus(); <br />
return false; <br />
} <br />
if(! isNumber(form.PublicZipCode.value)) { <br />
alert("邮政编码不合法！"); <br />
form.PublicZipCode.focus(); <br />
return false; <br />
} <br />
return true; <br />
} <br />
//--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
2.6 限定表单项不能输入的字符 <br />
<br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
<br />
function contain(str,charset)// 字符串包含测试函数 <br />
{ <br />
var i; <br />
for(i=0;i&lt;charset.length;i++) <br />
if(str.indexOf(charset.charAt(i))&gt;=0) <br />
return true; <br />
return false; <br />
} <br />
<br />
function CheckForm() <br />
{ <br />
if ((contain(document.form.NAME.value, "%\(\)&gt;&lt;")) || (contain(document.form.MESSAGE.value, "%\(\)&gt;&lt;"))) <br />
{ <br />
alert("输入了非法字符"); <br />
document.form.NAME.focus(); <br />
return false; <br />
} <br />
return true; <br />
} <br />
//--&gt; <br />
&lt;/script&gt;</span>
<img src ="http://www.blogjava.net/szhswl/aggbug/291529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2009-08-17 18:00 <a href="http://www.blogjava.net/szhswl/articles/291529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Flex及AS3的百多条小小知识</title><link>http://www.blogjava.net/szhswl/articles/264012.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Sun, 05 Apr 2009 11:35:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/264012.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/264012.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/264012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/264012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/264012.html</trackback:ping><description><![CDATA[<span  style="font-family: verdana; font-size: 12px; line-height: 18px; ">
<p style="text-indent: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 22px; font-size: 14px; ">【改变输出swf的尺度,背景颜色或帧频】&nbsp;<br />
在"Navigator"窗框里右键你的项目&gt;选中"Properties"&gt;选中"ActionScript Compiler"&gt;在"Additional compiler arguments"里输入你所需要的命令<br />
如想改变背景颜色,请输入: -default-background-color 0xffffff&nbsp;<br />
【鼠标坐标】&nbsp;<br />
mouseX mouseY&nbsp;<br />
【检查变量类型并返回布尔值】&nbsp;<br />
is&nbsp;<br />
【检查变量类型并返回类型】&nbsp;<br />
typeof&nbsp;<br />
【检查对象类型并返回该对象】&nbsp;<br />
as&nbsp;<br />
【是数字但不是有效数字问题】&nbsp;<br />
var quantity:Number = 15 - "rabbits";&nbsp;<br />
trace(typeof quantity); //显示: "number" , 但它是NaN (not a number)&nbsp;<br />
trace(quantity is Number); //true&nbsp;<br />
trace(quantity != NaN); //false&nbsp;<br />
//使用isNaN()函数检测:&nbsp;<br />
isNaN(quantity); //true&nbsp;<br />
//检测变量是否内含有效数字:&nbsp;<br />
!isNaN(quantity); //false&nbsp;<br />
【取消默认的严格编译模式】&nbsp;<br />
在"Navigator"窗框里右键你的项目&gt;选中"Properties"&gt;选中"ActionScript Compiler"&gt;取消"Enabel compile-time type checking"选项&nbsp;<br />
【基元数据类型和复杂数据类型好比"值类型"和"引用类型"】&nbsp;<br />
基元数据类型类似按值传递:&nbsp;<br />
var intOne:int = 1;&nbsp;<br />
var intTwo:int = 1;&nbsp;<br />
trace(intOne == intTwo); //true&nbsp;<br />
【复杂数据类型类似按引用传递】&nbsp;<br />
var arrayOne:Array = new Array("a", "b");&nbsp;<br />
var arrayTwo:Array = arrayOne;&nbsp;<br />
trace(arrayOne == arrayTwo); //true&nbsp;<br />
//-----------------------------------&nbsp;<br />
var arrayOne:Array = new Array("a", "b");&nbsp;<br />
var arrayTwo:Array = new Array("a", "b");&nbsp;<br />
trace(arrayOne == arrayTwo); //false&nbsp;<br />
【优化逻辑AND(&amp;&amp;)和OR(||)的小知识】&nbsp;<br />
对于逻辑And(&amp;&amp;):&nbsp;<br />
&nbsp;&nbsp;&nbsp; 除非条件表达式的前半部分为真,否则,ActionScript不会再去求算逻辑AND运算符的后半部.如果前半部为假,整个条件表达式一定为假,所以再去求算后半部就没效率了.&nbsp;<br />
对于逻辑OR(||):&nbsp;<br />
&nbsp;&nbsp;&nbsp; 除非条件表达式前半部为假,否则,ActionScript不会再去求算逻辑OR运算符的后半部,如果前半部为真,整个条件表达式一定为真.&nbsp;<br />
总结:使用逻辑AND(&amp;&amp;)时,把结果最可能为false的表达式放到前面;使用逻辑OR(||)时,把结果最可能为true的表达式放到前面.&nbsp;<br />
【Timer类注意事项】&nbsp;<br />
不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒.&nbsp;<br />
【private,protected,internal,public访问权限】&nbsp;<br />
private:只能在类本身内部访问,按惯例,命名私有成员时以下划线"_"开头;&nbsp;<br />
protected:可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,按惯例,命名保护成员时以下划线"_"开头;&nbsp;<br />
internal:可以由类本身或者相同包内的任何类访问;&nbsp;<br />
public:可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问.&nbsp;<br />
【一个函数具有未知个数的参数,用arguments对象或"...(rest)"符号访问它的参数】&nbsp;<br />
注意:使用"...(rest)"参数会使 arguments 对象不可用;&nbsp;<br />
private funciton average():void{&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace(arguments.length); //输出参数的个数&nbsp;<br />
&nbsp;&nbsp;&nbsp; // arguments的类型是:object,但可以像访问数组一样去访问它&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace(arguments[1]); //输出第二个参数&nbsp;<br />
}&nbsp;<br />
private function average(...argu):void{&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace(argu[1]); //输出第二个参数,argu参数名是自定义的.&nbsp;<br />
}&nbsp;<br />
【错误处理try,catch,finally】&nbsp;<br />
private function tryError():void{&nbsp;<br />
&nbsp;&nbsp;&nbsp; try {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("测试开始-try");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throwError();&nbsp;<br />
&nbsp;&nbsp;&nbsp; }catch(errObject:Error) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("错误信息:" + errObject.message);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("测试结束-catch");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }finally{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("虽然catch里已经有return方法,但位于return方法后面的finally里的代码依然会被执行.其实无论return方法是在try里,还是catch里,finally里的代码始终会被执行");&nbsp;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace("前面已经有return了,此处是不会再执行的.除非没有抛出错误,以使catch里的代码没有被执行");&nbsp;<br />
}&nbsp;<br />
private function throwError():void{&nbsp;<br />
&nbsp;&nbsp;&nbsp; throw new Error("抛出错误");&nbsp;<br />
}&nbsp;<br />
【for...in与for each...in的区别】&nbsp;<br />
与for...in循环不同的是,for each...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引).&nbsp;<br />
【命名包路径的小技巧】&nbsp;<br />
&nbsp;&nbsp;&nbsp; 使用相应于拥有者和相关项目的包名称会比较好.按惯例来讲,包名称的开头应该是逆向的网址名称.例如,如果Example Corp(examplecorp.com)写了一些ActionScript3.0类,就会把所有类放在com.examplecorp包内(或者 com.examplecorp的子包内).如此一来,如果英国有另一家Example Corp(examplecorp.co.uk)也写了一些ActionScript3.0类,只要使用包uk.co.examplecorp,就可确保 唯一性.&nbsp;<br />
&nbsp;&nbsp;&nbsp; 当类属于特定应用程序的一部分时,就应该放在该应用程序特定的子包内.例如,Example Corp可能有个应用程序名叫WidgetStore.如果WidgetStore应用程序使用一个名为ApplicationManager的类,则此 类就应该放在com.examplecorp.widgetstore包内,或者位于该包的子包内.&nbsp;<br />
&nbsp;&nbsp;&nbsp; 按惯例来说,包名称的开头是小写字母.&nbsp;<br />
【隐式的取出方法(getter)和设定方法(setter)】&nbsp;<br />
public function get count():uint {&nbsp;<br />
&nbsp;&nbsp;&nbsp; return _count;&nbsp;<br />
}&nbsp;<br />
public function set count(value:uint):uint {&nbsp;<br />
&nbsp;&nbsp;&nbsp; if(value &lt; 100){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _count = value;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }else {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw Error();&nbsp;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;<br />
}&nbsp;<br />
【确保类是绝不会有子类,使用final】&nbsp;<br />
final public class Example{}&nbsp;<br />
【super关键字的使用】&nbsp;<br />
super(); //父类的构造函数,只能在类实例构造函数内部使用&nbsp;<br />
super.propertyName; //调用父类的属性,属性需要声明为public或protected&nbsp;<br />
super.methodName(); //调用父类的方法,方法需要声明为public或protected&nbsp;<br />
【建立常数,使用关键字const而不是var】&nbsp;<br />
static public const EXAMPLE:String = "example";&nbsp;<br />
【检测播放器版本】&nbsp;<br />
flash.system.Capabilities.version&nbsp;<br />
对于8.5版以前的任何Flash Player版本,这种方法都不适用.&nbsp;<br />
【判断客户端系统】&nbsp;<br />
flash.system.Capabilities.os&nbsp;<br />
【检测播放器类型】&nbsp;<br />
flash.system.Capabilities.playerType&nbsp;<br />
可能的值有:&nbsp;<br />
"StandAlone"，用于独立的 Flash Player&nbsp;<br />
"External"，用于外部的 Flash Player 或处于测试模式下&nbsp;<br />
"PlugIn"，用于 Flash Player 浏览器插件&nbsp;<br />
"ActiveX"，用于 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控件&nbsp;<br />
【检测系统语言】&nbsp;<br />
flash.system.Capabilities.language&nbsp;<br />
【判断用户是否启用了IME(输入法编辑器)】&nbsp;<br />
flash.system.IME.enabled&nbsp;<br />
【检测屏幕的分辨率】&nbsp;<br />
flash.system.Capabilities.screenResolutionX&nbsp;<br />
flash.system.Capabilities.screenResolutionY&nbsp;<br />
【把弹出窗口居中的算法】&nbsp;<br />
X = (舞台宽/2)-(窗口宽/2)&nbsp;<br />
Y = (舞台高/2)-(窗口高/2)&nbsp;<br />
【控制影片配合Player的方式,包括缩放问题】&nbsp;<br />
stage.scaleMode&nbsp;<br />
可供选择值:flash.display.StageScaleMode&nbsp;<br />
【舞台的对齐方式】&nbsp;<br />
stage.align&nbsp;<br />
可供选择值:flash.display.StageAlign&nbsp;<br />
【隐藏Flash Player的右键菜单】&nbsp;<br />
stage.showDefaultContextMenu = false;&nbsp;<br />
【检测系统是否具有音频功能】&nbsp;<br />
flash.system.Capabilities.hasAudio&nbsp;<br />
【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】&nbsp;<br />
flash.system.Capabilities.hasMP3&nbsp;<br />
【检测播放器能 (true) 还是不能 (false) 播放流式视频】&nbsp;<br />
flash.system.Capabilities.hasStreamingVideo&nbsp;<br />
【检测播放器是在支持 (true) 嵌入视频的系统上运行，还是在不支持 (false) 嵌入视频的系统上运行】&nbsp;<br />
flash.system.Capabilities.hasEmbeddedVideo&nbsp;<br />
【检测播放器能 (true) 还是不能 (false) 对视频流（如来自 Web 摄像头的视频流）进行编码】&nbsp;<br />
flash.system.Capabilities.hasVideoEncoder&nbsp;<br />
【显示 Flash Player 中的"安全设置"面板】&nbsp;<br />
flash.system.Security.showSettings();&nbsp;<br />
可供选择项:flash.system.SecurityPanel&nbsp;<br />
【让其它域的.swf访问本域的.swf】&nbsp;<br />
在本域的.swf文件里加上:flash.system.Security.allowDomain()&nbsp;<br />
或者使用安全策略文件"crossdomain.xml".在Flash 8以前,这个文件必须放在.swf所在域的根目录,现在,你可以使用flash.system.Security.loadPolicyFile(),指 定安全策略文件所在的位置.拒绝任何域的做法是在&lt;cross-domain-policy&gt;标签内什么也不填,安全策略文件也支持通用字符 "*":&nbsp;<br />
&lt;?xml version="1.0"?&gt;&nbsp;<br />
&lt;!--&nbsp;<a href="http://www.mydomain.com/crossdomain.xml" style="text-decoration: none; color: #336699; "><span style="color: #075db3; ">http://www.mydomain.com/crossdomain.xml</span></a>&nbsp;--&gt;&nbsp;<br />
&lt;cross-domain-policy&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;allow-access-from domain="<a href="http://www.riahome.cn/" style="text-decoration: none; color: #336699; "><span style="color: #075db3; ">www.riahome.cn</span></a>" /&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;allow-access-from domain="*.Y-boy.cn" /&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;allow-access-from domain="210.38.196.48" /&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;allow-access-from domain="*" /&gt;&nbsp;<br />
&lt;/cross-domain-policy&gt;&nbsp;<br />
【数字的不同进制之间的转换】&nbsp;<br />
parseInt(str:String, radix:uint = 0):Number 返回十进制的数,参数radix表示要分析的数字的基数.如果省略radix,就默认为10,除非字符串的开头是"0x","0X"或"0":&nbsp;<br />
trace(parseInt("0x12")); //设定radix为16,输出:18&nbsp;<br />
trace(parseInt("017")); //设定radix为8,输出:15&nbsp;<br />
或者使用Number,uint和int对象的toString(radix)方法.&nbsp;<br />
【使用Math.round()对一个数取整,四舍五入】&nbsp;<br />
Math.round()&nbsp;<br />
trace(Math.round(204.499)); //输出:204&nbsp;<br />
trace(Math.round(401.5)); //输出:402&nbsp;<br />
【使用Math.floor()对一个数向下取整,就是只要整数部分而不理会小数分】&nbsp;<br />
trace(Math.floor(204.99)); //输出:204&nbsp;<br />
【使用Math.ceil()对一个数向上取整,只要小数部分不为零,整数部分就加1】&nbsp;<br />
trace(Math.ceil(401.01)); //输出:402&nbsp;<br />
【产生一个随机数】&nbsp;<br />
使用Math.random()产生一个伪随机数n,其中 0 &lt;= n &lt; 1&nbsp;<br />
【把数字取至最近的小数点位,即指定精确度】&nbsp;<br />
1. 决定你要取的数字的小数点位数:例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01;&nbsp;<br />
2. 让输入值除以步骤1所选的数字(此例为0.01);&nbsp;<br />
3. 使用Math.round()把步骤2所计得的值取成最近的整数;&nbsp;<br />
4. 把步骤3所得的结果乘以步骤2用于除法的那个值.&nbsp;<br />
例如,要把90.337取成两个小数点位数,可以使用:&nbsp;<br />
trace(Math.round(90.337/0.01)*0.01); //输出:90.34&nbsp;<br />
【把数字取成一个整数的最接近倍数值】&nbsp;<br />
例1,这样会把92.5取成5的最近倍数值:&nbsp;<br />
trace(Math.round(92.5/5)*5); //输出:95&nbsp;<br />
例2,这样会把92.5取成10的最近倍数值:&nbsp;<br />
trace(Math.round(92.5/10)*10); //输出:90&nbsp;<br />
【在指定数值范围内获得随机数】&nbsp;<br />
//可取范围:[min, max]&nbsp;<br />
private function randRange(min:Number, max:Number):Number {&nbsp;<br />
&nbsp;&nbsp;&nbsp; var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;&nbsp;<br />
&nbsp;&nbsp;&nbsp; return randomNum;&nbsp;<br />
}&nbsp;<br />
应用例子:&nbsp;<br />
模拟投银币,即希望得到随机布尔值(true 或 false): randRange(0, 1);&nbsp;<br />
模拟投骰子,即希望得到随机六个值: randRange(1, 6);&nbsp;<br />
为避免被缓存而需要产生一个独一无二的数字追加在URL尾端,通常最佳方法是取得当前毫秒数.&nbsp;<br />
【弧度(radian)与度数(degree)之间的转换】&nbsp;<br />
从弧度转为度数: degrees = radians * 180 / Math.PI&nbsp;<br />
从度数转为弧度: radians = degrees * Math.PI / 180&nbsp;<br />
【计算两点之间的距离】&nbsp;<br />
勾股定理: c2 = a2 + b2&nbsp;<br />
假设有两个影片剪辑mc1和mc2,则它们两点间的距离c为:&nbsp;<br />
var c:Number = Math.sqrt(Math.pow(mc1.x - mc2.x, 2) + Math.pow(mc1.y - mc2.y, 2));&nbsp;<br />
【模拟圆周运动】&nbsp;<br />
已知圆心o(x0, y0),半径r和弧度angle,求圆上任意一点P(x, y)的坐标:&nbsp;<br />
x = x0 + (Math.cos(angle) * r);&nbsp;<br />
y = y0 + (Math.sin(angle) * r);&nbsp;<br />
注意:舞台的x轴正方向水平向右,y轴正方向垂直向下.&nbsp;<br />
【模拟椭圆运动】&nbsp;<br />
已知圆心o(x0, y0),长轴a,短轴b以及弧度angle,求圆上任意一点P(x, y)的坐标:&nbsp;<br />
x = x0 + (Math.cos(angle) * a);&nbsp;<br />
y = y0 + (Math.sin(angle) * b);</p>
<p style="text-indent: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 22px; font-size: 14px; ">【华氏温度和摄氏温度之间的转换】&nbsp;<br />
华氏温度 = 摄氏度数 * 9 / 5 + 32&nbsp;<br />
摄氏温度 = (华氏度数 - 32) * 5 /9&nbsp;<br />
【公斤与磅之间的转换】&nbsp;<br />
公斤 = 磅 * 2.2&nbsp;<br />
磅 = 公斤 / 2.2&nbsp;<br />
【向数组尾端添加元素】&nbsp;<br />
var array:Array = new Array();&nbsp;<br />
array.push("a", "b");&nbsp;<br />
//向数组尾端添加单一元素也可以这样:&nbsp;<br />
array[array.length] = "c";&nbsp;<br />
//如果以索引设定的元素不存在,数组本身会自动扩展以包含足够的元素数目.介于中间的元素会被设为undefined:&nbsp;<br />
array[5] = "e";&nbsp;<br />
trace(array[4]); //输出: undefined&nbsp;<br />
【向数组开端添加元素】&nbsp;<br />
var array:Array = ["a", "b"];&nbsp;<br />
array.unshift("c", "d");&nbsp;<br />
trace(array); //输出: c,d,a,b&nbsp;<br />
【删除数组中第一个元素并返回该元素,使用shift()方法】&nbsp;<br />
var letters:Array = new Array("a", "b", "c");&nbsp;<br />
var firstLetter:String = letters.shift();&nbsp;<br />
trace(letters); //输出: b,c&nbsp;<br />
trace(firstLetter); //输出: a&nbsp;<br />
【删除数组中最后一个元素并返回该元素的值,使用pop()方法】&nbsp;<br />
var letters:Array = new Array("a", "b", "c");&nbsp;<br />
trace(letters); //输出: a,b,c&nbsp;<br />
var letter:String = letters.pop();&nbsp;<br />
trace(letters); //输出: a,b&nbsp;<br />
trace(letter); //输出: c&nbsp;<br />
【删除数组中的元素,给数组添加新元素并返回删除的元素,使用splice()方法】&nbsp;<br />
splice(startIndex:int, deleteCount:uint, ... values):Array&nbsp;<br />
startIndex: 一个整数，它指定数组中开始进行插入或删除的位置处的元素的索引;&nbsp;<br />
deleteCount: 一个整数，它指定要删除的元素数量;&nbsp;<br />
... values: 用逗号分隔的一个或多个值的可选列表或数组，此列表或数组将插入到此数组中由 startIndex 参数指定的位置.&nbsp;<br />
【查找数组中第一个相匹配的元素】&nbsp;<br />
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];&nbsp;<br />
var match:String = "b";&nbsp;<br />
for(var i:int = 0; i &lt; array.length; i++) {&nbsp;<br />
&nbsp;&nbsp;&nbsp; if(array[i] == match) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("Element with index " + i + " found to match " + match);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出: Element with index 1 found to match b&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;<br />
}&nbsp;<br />
【查找数组中最后一个相匹配的元素】&nbsp;<br />
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];&nbsp;<br />
var match:String = "b";&nbsp;<br />
for(var i:int = array.length - 1; i &gt;= 0; i--) {&nbsp;<br />
&nbsp;&nbsp;&nbsp; if(array[i] == match) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("Element with index " + i + " found to match " + match);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出: Element with index 5 found to match b&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;<br />
}&nbsp;<br />
【把字符串转成数组】&nbsp;<br />
使用String.split()方法:&nbsp;<br />
var list:String = "I am YoungBoy.";&nbsp;<br />
var words:Array = list.split(" "); //以空格作为分隔符将字符串切割&nbsp;<br />
trace(words); //输出: I,am,YoungBoy.&nbsp;<br />
【把数组转成字符串】&nbsp;<br />
使用String.join()方法:&nbsp;<br />
var myArr:Array = new Array("one", "two", "three");&nbsp;<br />
var myStr:String = myArr.join(" and ");&nbsp;<br />
trace(myArr); //输出: one,two,three&nbsp;<br />
trace(myStr); //输出: one and two and three&nbsp;<br />
【使用对象数组处理相关数据】&nbsp;<br />
var cars:Array = new Array();&nbsp;<br />
cars.push({make:"Mike", year:1997, color:"blue"});&nbsp;<br />
cars.push({make:"Kelly", year:1986, color:"red"});&nbsp;<br />
for(var i:int = 0; i &lt; cars.length; i++) {&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color);&nbsp;<br />
}&nbsp;<br />
//输出:&nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp; Mike - 1997 - blue&nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp; Kelly - 1986 - red&nbsp;<br />
【在数组中获取最小或最大值】&nbsp;<br />
var scores:Array = [10, 4, 15, 8];&nbsp;<br />
scores.sort(Array.NUMERIC);&nbsp;<br />
trace("Minimum: " + scores[0]);&nbsp;<br />
trace("Maximum: " + scores[scores.length - 1]);&nbsp;<br />
【使用for ... in语句读取关联数组元素】&nbsp;<br />
var myObject:Object = new Object();&nbsp;<br />
myObject.name = "YoungBoy";&nbsp;<br />
myObject.age = 20;&nbsp;<br />
for(var i:String in myObject) {&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace(i + ": " + myObject[i]);&nbsp;<br />
}&nbsp;<br />
//输出: name: YoungBoy&nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age: 20&nbsp;<br />
注意: for ... in循环不会显示对象所有的内建属性.例如,循环会显示执行期间新增的特殊属性,但是,不会列出内建对象的方法,即使都是储存在对象属性内.&nbsp;<br />
【AVM(ActionScript Virtual Machine,虚拟机)和渲染引擎(Rendering Engine)】&nbsp;<br />
AVM负责执行ActionScript程序,而渲染引擎则是把对象绘制在显示器上.&nbsp;<br />
【指出容器的显示清单中有多少显示对象】&nbsp;<br />
每个容器都有numChildren属性.&nbsp;<br />
【把项目新增至显示清单】&nbsp;<br />
addChild(child:DisplayObject)&nbsp;<br />
addChildAt(child:DisplayObject, index:int)&nbsp;<br />
index: 添加该子项的索引位置.如果指定当前占用的索引位置,则该位置以及所有更高位置上的子对象会在子级列表中上移一个位置.&nbsp;<br />
【从显示清单中移除项目】&nbsp;<br />
removeChild(child:DisplayObject)&nbsp;<br />
removeChildAt(index:int)&nbsp;<br />
index: 要删除的 DisplayObject 的子索引,该子项之上的任何显示对象的索引位置都减去1.&nbsp;<br />
如果想移除窗口所有子元件,可以结合removeChildAt(),numChildren属性以及for循环.因为每次一个子元件被移除时,索引位置都会变化,所以,有两种方法可以处理所有子元件的移除:&nbsp;<br />
1. 总是移除位置0的子元件;&nbsp;<br />
2. 倒过来移除子元件,也就是从尾端开始.&nbsp;<br />
【更改现有子项在显示对象容器中的位置】&nbsp;<br />
setChildIndex(child:DisplayObject, index:int):void&nbsp;<br />
可能用到的方法:&nbsp;<br />
返回 DisplayObject 的 child 实例的索引位置: getChildIndex(child:DisplayObject):int&nbsp;<br />
返回位于指定索引处的子显示对象实例: getChildAt(index:int):DisplayObject&nbsp;<br />
注意: 当子元件移到低于它现在所在位置的索引时,那么,从标的索引起,直到子元件索引前面的那个索引的所有子元件都会令其索引增加1,而该子元件就会指定至标的 索引.当子元件移到较高索引时,从该子元件索引之上的那个索引起,直到标的索引的所有子元件都会令其索引往下减1,而该子元件就会指定至标的索引值.&nbsp;<br />
【关于TextField以垂直方式把文字摆在按钮表面中心点的小技巧】&nbsp;<br />
textField.y = (_height - textField.textHeight) / 2;&nbsp;<br />
textField.y -= 2; //减2个像素以调整偏移量&nbsp;<br />
【外部.swf影片载入和互动】&nbsp;<br />
1. 监听init事件;&nbsp;<br />
2. 透过content属性存取所载入的影片.&nbsp;<br />
当所载入的影片做好足够的初始化工作,使其方法和属性可以接受互动时,init事件就会被发起.只有在载入器发起init事件后,才能控制影片.所载入的影片还没初始化就试着与它互动,是会产生执行期间错误的.&nbsp;<br />
_loader.contentLoaderInfo.addEventListener(Event.INIT, handleInit); //当载入的.swf的属性和方法可用时&nbsp;<br />
_loader.load(new URLRequest("ExternalMovie.swf"));&nbsp;<br />
private function handleInit(event:Event):void {&nbsp;<br />
&nbsp;&nbsp;&nbsp; var movie:* = _loader.content;&nbsp;<br />
&nbsp;&nbsp;&nbsp; trace(movie.getColor());&nbsp;<br />
&nbsp;&nbsp;&nbsp; movie.setColor(0xFF0000);&nbsp;<br />
}&nbsp;<br />
【TextField有两种类型:动态(dynamic)和输入(input),默认值为动态.改变TextField类型方法】&nbsp;<br />
field.type = TextFieldType.INPUT; //selectable属性默认值为true&nbsp;<br />
flash.text.TextFieldType.INPUT和flash.text.TextFieldType.DYNAMIC&nbsp;<br />
【过滤文字输入】&nbsp;<br />
TextField.restrict = "此处为可输入的内容";&nbsp;<br />
field.restrict = "^此处为禁止输入的内容";&nbsp;<br />
restrict属性支持一些类似正则表达式的样式:&nbsp;<br />
field.restrict = "a-zA-z"; //只允许大小字母&nbsp;<br />
field.restrict = "a-zA-z "; //只允许字母和空格&nbsp;<br />
field.restrict = "0-9"; //只允许数字&nbsp;<br />
field.restrict = "^abcdefg"; //除了小写字母abcdefg不允许外,其它都允许&nbsp;<br />
field.restrict = "^a-z"; //所有小写字母都不允许,但是,其它内容都允许,包括大写字母&nbsp;<br />
field.restrict = "0-9^5"; //只允许数字,但5例外&nbsp;<br />
让restrict字符包含具有特殊意义的字母(例如-和^):&nbsp;<br />
field.restrict = "0-9\\-"; //允许数字和破折号&nbsp;<br />
field.restrict = "0-9\\^"; //允许数字和^&nbsp;<br />
field.restrict = "0-9\\\\"; //允许数字和反斜杠&nbsp;<br />
你也可以使用Unicode转义序列,指定允许的内容.例如:&nbsp;<br />
field.restrict = "^\u001A";&nbsp;<br />
注意:ActionScript有区分大小写的,如果restrict属性设为abc,允许字母的大写形式(A,B和C)输入时会变成小写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内容,脚本可将任何文本放入文本字段中.&nbsp;<br />
【设定输入框的最大长度】&nbsp;<br />
TextField.maxChars:int&nbsp;<br />
【向TextField追加内容】&nbsp;<br />
TextField.appendText(text:String):void&nbsp;<br />
与通过对 text 属性使用加法赋值来连接两个字符串(例如 field.text += moreText)相比,此方法的效率更高.&nbsp;<br />
【显示HTML格式的文字】&nbsp;<br />
TextField.htmlText = "&lt;b&gt;Html text&lt;/b&gt;";&nbsp;<br />
支持的HTML标签集有: &lt;b&gt;,&lt;i&gt;,&lt;u&gt;,&lt;font&gt;(有face,size以及color属性),&lt; p&gt;,&lt;br&gt;,&lt;a&gt;,&lt;li&gt;,&lt;img&gt;以及&lt;textformat&gt;(有 leftmargin,rightmargin,blockindent,indent,leading以及tabstops属性,相应于 TextFormat类的同名属性)&nbsp;<br />
【缩减空白】&nbsp;<br />
TextField.condenseWhite = true;&nbsp;<br />
删除具有HTML文本的文本字段中的额外空白(空格,换行符等),如同多数HTML浏览器所做的那样.&nbsp;<br />
注意: 在设置 htmlText 属性之前设置 condenseWhite 属性&nbsp;<br />
【自动大小调整和对齐】&nbsp;<br />
TextField.autoSize = TextFieldAutoSize.LEFT;&nbsp;<br />
可选之值:&nbsp;<br />
flash.text.TextFieldAutoSize.CENTER&nbsp;<br />
flash.text.TextFieldAutoSize.LEFT&nbsp;<br />
flash.text.TextFieldAutoSize.NONE&nbsp;<br />
flash.text.TextFieldAutoSize.RIGHT&nbsp;<br />
【指示文本字段是否自动换行】&nbsp;<br />
TextField.wordWrap = true; //自动换行&nbsp;<br />
【用程序手段滚动文字】&nbsp;<br />
水平方向以像素为单位,而垂直方向以行做单位:&nbsp;<br />
scrollV: 指出文字框可见区域的最顶行,可读写;&nbsp;<br />
bottomScrollV: 指出文字框内最底端可见行,只读;&nbsp;<br />
maxScrollV: scrollV的最大值,只读;&nbsp;<br />
numLines: 定义多行文本字段中的文本行数,只读;&nbsp;<br />
TextField.scrollV = field.maxScrollV; //滚动到最后一页&nbsp;<br />
【响应滚动事件】&nbsp;<br />
field.addEventListener(Event.SCROLL, onTextScroll);&nbsp;<br />
【样式化文字的方法】&nbsp;<br />
1. 使用HTML标签进行样式化;&nbsp;<br />
2. 使用TextFormat对象;&nbsp;<br />
3. 使用CSS.&nbsp;<br />
例如: HTML是用&lt;font&gt;标签,TextFormat对象是设定font属性,而CSS是使用font-family属性的.&nbsp;<br />
受支持的层叠样式表(CSS)属性和值,及其相应的ActionScript属性名称(小括号内):&nbsp;<br />
color(color),display(display),font-family(fontFamily),font-size(fontSize),font-style(fontStyle),font-weight(fontWeight),kerning(kerning),leading(leading),letter-spacing(letterSpacing),margin-left(marginLeft),margin-right(marginRight),text-align(textAlign),text-decoration(textDecoration),text-indent(textIndent)&nbsp;<br />
受支持的HTML实体: &lt;(小于号: &lt;), &gt;(大于号: &gt;), &amp;(和: &amp;), "(双引号: "), '(撇号,单引号: &amp;apos;)&nbsp;<br />
其中样式对象的两种写法:&nbsp;<br />
写法一:&nbsp;<br />
var sampleStyle:Object = new Object();&nbsp;<br />
sampleStyle.color = "#FFFFFF";&nbsp;<br />
sampleStyle.textAlign = "center";&nbsp;<br />
css.setStyle(".sample", sampleStyle);&nbsp;<br />
写法二:&nbsp;<br />
var sampleStyle:Object = {color: "#FFFFFF", textAlign: "center"};&nbsp;<br />
css.setStyle(".sample", sampleStyle);&nbsp;<br />
【对用户输入的文字进行样式化】&nbsp;<br />
使用defaultTextFormat属性,样式会施加至用户键入输入框的文字身上:&nbsp;<br />
var formatter:TextFormat = new TextFormat();&nbsp;<br />
formatter.color = 0x0000FF; //把文字变成蓝色&nbsp;<br />
field.defaultTextFormat = formatter;&nbsp;<br />
【对现有文字的一部分进行样式化】&nbsp;<br />
TextFormat.setTextFormat(format:TextFormat, beginIndex:int = -1, endIndex:int = -1):void&nbsp;<br />
【设定文字框的字体】&nbsp;<br />
例子:&nbsp;<br />
HTML: field.htmlText = "&lt;font face='Arial'&gt;Formatted text&lt;/font&gt;";&nbsp;<br />
TextFormat: formatter.font = "Arial";&nbsp;<br />
CSS: P{ font-family: Arial; }&nbsp;<br />
也可以使用以逗号隔开的字体清单: formatter.font = "Arial, Verdana, Helvetica";&nbsp;<br />
注意:&nbsp;<br />
字体和字体群组不同.字体群组有三种: _sans,_serif以及_typewriter.&nbsp;<br />
_sans群组一般就是指Arial或Helvetica这种字体;&nbsp;<br />
_serif群组一般就是指Times或Times New Roman这种字体;&nbsp;<br />
_typewriter群组一般就是指Courier或Courier New这种字体.&nbsp;<br />
【嵌入字体】&nbsp;<br />
使用[Embed]后设标签.[Embed]后设标签应该出现在ActionScript文件中,处于类宣告之外.你可以内嵌TrueType字体或系统字体.内嵌TrueType字体时的语法:&nbsp;<br />
[Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font-truetype")]&nbsp;<br />
pathToTtfFile: ttf文件的路径,TrueType字体的路径可以是相对的,也可以是绝对的;&nbsp;<br />
FontName: 字体名称;&nbsp;<br />
内嵌系统字体的语法:&nbsp;<br />
[Embed(systemFont="Times New Roman", fontName="Times New Roman", mimeType="application/x-font-truetype")]&nbsp;<br />
fontName: 以相同名称作为实际系统字体名称.&nbsp;<br />
注意: 在使用嵌入字体时,要把TextField的embedFonts属性设为true,这样TextField只能用内嵌字体了.如果你试着替 embedFonts设为true的TextField使用设备字体,什么都不会显示.如果embedFonts设为true,就无法指定以逗号相隔的字 体清单.&nbsp;<br />
【建立可以旋转的文字】&nbsp;<br />
使用内嵌字体.当你旋转文字框时,设备字体就会消失.&nbsp;<br />
【显示Unicode文字】&nbsp;<br />
1. 从外部来源载入Unicode文字;&nbsp;<br />
2. 假如你的编辑器支持Unicode(如 Flex Builder),则可以直接在ActionScript程序中使用该字符;&nbsp;<br />
3. 使用Unicode转义字符,ActionScript里所有Unicode转义字符都以\u开头,后面再跟四位十六进制数字.&nbsp;<br />
注意: 如果你想取得Unicode字符,在Windows下使用: 开始&gt;所有程序&gt;附件&gt;系统工具&gt;字符映射表.&nbsp;<br />
【把Flash Player的焦点带给文字框】&nbsp;<br />
stage.focus = field;&nbsp;<br />
把焦点移除:&nbsp;<br />
stage.focus = null;&nbsp;<br />
注意: 当.swf文件首次载入至网页浏览器时,并没有焦点.因此,以程序的方式把焦点指定给Flash应用程序的一个元素前,必须先把焦点移至Flash Player.&nbsp;<br />
【以ActionScript选取文字】&nbsp;<br />
使用TextField.setSelection(beginIndex:int, endIndex:int):void&nbsp;<br />
为了可以正常选取文字,文字框必须具有焦点:&nbsp;<br />
stage.focus = field; //把焦点设给文字框&nbsp;<br />
field.text = "This is example text"; //设定文字&nbsp;<br />
field.setSelection(0, 4); //把"This"这个单词以高亮显示&nbsp;<br />
使用只读的selectionBeginIndex和selectionEndIndex属性访问所选取的字符范围的索引.&nbsp;<br />
【在文字内设定安插点(游标位置)并访问游标位置的索引值】&nbsp;<br />
可以使用TextField.setSelection()把起始和结尾的索引参数都设成相同值,在文字内设定游标位置(假设具有焦点):&nbsp;<br />
field.setSelection(0, 0); //在第一个字符前摆放安插点&nbsp;<br />
trace(field.caretIndex); //输出游标位置的索引值</p>
<p style="text-indent: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 22px; font-size: 14px; ">&nbsp;</p>
<p style="text-indent: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 22px; font-size: 14px; ">本文转自:http://hi.baidu.com/honfei/blog/item/df5d1e945a7b441bd31b7045.html</p>
</span>
<img src ="http://www.blogjava.net/szhswl/aggbug/264012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2009-04-05 19:35 <a href="http://www.blogjava.net/szhswl/articles/264012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>驯服Tiger之线程中的默认异常处理(转)</title><link>http://www.blogjava.net/szhswl/articles/251578.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Fri, 16 Jan 2009 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/251578.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/251578.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/251578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/251578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/251578.html</trackback:ping><description><![CDATA[跟踪无法预期的运行时异常可能是一件又慢又费力的事情，只获得默认线程名称和堆栈跟踪通常是不够的。在文中，Java 开发人员 John Zukowski 向您展示了如何通过替代默认行为来定制输出。 他还对比了通过细分 ThreadGroup 定制输出的老方法与通过提供自己的 UncaughtExceptionHandler 定制输出的新方法。 <br />
<br />
　　虽然我们不想创建在无法预期时抛出运行时异常的程序，但这种情况还是会发生——尤其是第一次运行复杂程序时。通常是使用默认行为、打印堆栈溢出和结束线程的生命来处理这些异常。 <br />
<br />
　　从哪里发现默认行为？每个线程都属于一个由 java.lang.ThreadGroup 类表示的线程组。顾名思义，线程组允许您将线程组合在一起。您可能是为了方便而将线程组合，例如，一个线程池中的所有线程都属于组 X，而另一个池的所有线程则属于组 Y，或者是为了访问控制而将线程进行组合。组 X 中的线程无权访问或改变组 Y 中的线程，除非它们都在同一线程组内（或在一个子组内）。 <br />
<br />
　　在 Tiger 之前， ThreadGroup 类提供了一种处理未捕获异常的方法： ThreadGroup 的 uncaughtException() 方法。如果异常不是 ThreadDeath ，则将线程的名称和堆栈回溯（stack backtrace）发送到 System.err 。但是 Tiger 添加了另一种方法： Thread.UncaughtExceptionHandler 接口。细分 ThreadGroup 或安装该新接口的实现都允许您更改默认行为。我们将对 Tiger 之前和之后提供的方法都进行研究。 <br />
<br />
　　<strong>使用 ThreadGroup 的定制行为</strong><br />
<br />
　　发生未捕获的异常时，默认行为是将堆栈溢出打印输出到系统错误（ System.err ）中，如清单 1 中所示。不需要使用任何命令参数来启动程序。 <br />
<br />
　　清单 1. 线程溢出示例<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>public class SimpleDump {<br />
            　public static void main(String args[]) {<br />
            　　System.out.println(args[0]);<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　不使用任何参数运行该程序将生成清单 2 中的输出。尽管它不是一个很长的堆栈跟踪，但它是一个完整的堆栈跟踪。<br />
<br />
　　清单 2. 默认线程溢出输出<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0<br />
            at SimpleDump.main(SimpleDump.java:3)</td>
        </tr>
    </tbody>
</table>
<br />
　　正如 Java 平台的许多东西一样，如果不喜欢默认行为，您可以对其进行更改。在 Java 平台的 Tiger 版以前的版本中，不能替代所有线程的默认行为，但是可以创建一个新的 ThreadGroup ，并更改在该组内创建的任何线程的默认行为。您可以重写 uncaughtException(Thread t, Throwable e) 方法来定制该行为。然后，当发生未预料的运行时异常时，该线程组内创建的任何线程都将获得新的行为。不过，最好是修复基础问题，我将提供一个简单的示例，说明更改默认行为所必需的步骤。清单 3 展示了将执行代码放入新线程的调整过的测试程序： <br />
<br />
　　清单 3. 调整过的线程溢出示例<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>public class WindowDump {<br />
            　public static void main(String args[]) throws Exception {<br />
            　　ThreadGroup group = new LoggingThreadGroup("Logger");<br />
            　　new Thread(group, "myThread") {<br />
            　　　public void run() {<br />
            　　　　System.out.println(1 / 0);<br />
            　　　}<br />
            　　}.start();<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　LoggingThreadGroup 类是一个新的内容，清单 4 中显示了它的定义。为了进行说明，通过重写 uncaughtException() 方法实现的特殊行为将在一个弹出窗口中显示该异常，这项操作是在特殊 Handler 的帮助下使用 Java Logging API 来完成的。 <br />
<br />
　　清单 4. LoggingThreadGroup 的定义<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>import java.util.logging.*;<br />
            <br />
            public class LoggingThreadGroup extends ThreadGroup {<br />
            　private static Logger logger;<br />
            　public LoggingThreadGroup(String name) {<br />
            　　super(name);<br />
            　}<br />
            　public void uncaughtException(Thread t, Throwable e) {<br />
            　　// Initialize logger once<br />
            　　if (logger == null) {<br />
            　　　logger = Logger.getLogger("example");<br />
            　　　Handler handler = LoggingWindowHandler.getInstance();<br />
            　　　logger.addHandler(handler);<br />
            　　}<br />
            　　logger.log(Level.WARNING, t.getName(), e);<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　这里创建的定制 Handler 的类型为 LoggingWindowHandler ，该类型的定义在清单 5 中。处理程序使用了一个支持类 LoggingWindow ，该类将异常显示在屏幕上。 清单 6 中显示了该类的定义。 Handler 的 public void publish(LogRecord record) 方法实现了一些重要操作。其余操作大部分只与配置有关。 <br />
<br />
　　清单 5. LoggingWindowHandler 的定义<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>import java.util.logging.*;<br />
            <br />
            public class LoggingWindowHandler extends Handler {<br />
            　private static LoggingWindow window;<br />
            　private static LoggingWindowHandler handler;<br />
            <br />
            　private LoggingWindowHandler() {<br />
            　　configure();<br />
            　　window = new LoggingWindow("Logging window...", 400, 200);<br />
            　}<br />
            <br />
            　public static synchronized LoggingWindowHandler getInstance() {<br />
            　　if (handler == null) {<br />
            　　　handler = new LoggingWindowHandler();<br />
            　　}<br />
            　　return handler;<br />
            　}<br />
            <br />
            　/**<br />
            　* Get any configuration properties set<br />
            　*/<br />
            　private void configure() {<br />
            　　LogManager manager = LogManager.getLogManager();<br />
            　　String className = getClass().getName();<br />
            　　String level = manager.getProperty(className + ".level");<br />
            　　setLevel((level == null) ? Level.INFO : Level.parse(level));<br />
            　　String filter = manager.getProperty(className + ".filter");<br />
            　　setFilter(makeFilter(filter));<br />
            　　String formatter = manager.getProperty(className + ".formatter");<br />
            　　setFormatter(makeFormatter(formatter));<br />
            　}<br />
            <br />
            　private Filter makeFilter(String name) {<br />
            　　Filter f = null;<br />
            　　try {<br />
            　　　Class c = Class.forName(name);<br />
            　　　f = (Filter)c.newInstance();<br />
            　　} catch (Exception e) {<br />
            　　　if (name != null) {<br />
            　　　　System.err.println("Unable to load filter: " + name);<br />
            　　　}<br />
            　　}<br />
            　　return f;<br />
            　}<br />
            <br />
            　private Formatter makeFormatter(String name) {<br />
            　　Formatter f = null;<br />
            　　　try {<br />
            　　　　Class c = Class.forName(name);<br />
            　　　　f = (Formatter)c.newInstance();<br />
            　　　} catch (Exception e) {<br />
            　　　　f = new SimpleFormatter();<br />
            　　　}<br />
            　　　return f;<br />
            　　}<br />
            <br />
            　　// Overridden abstract Handler methods<br />
            <br />
            　　public void close() {<br />
            　　}<br />
            <br />
            　　public void flush() {<br />
            　}<br />
            <br />
            　/**<br />
            　* If record is loggable, format it and add it to window<br />
            　*/<br />
            　public void publish(LogRecord record) {<br />
            　　String message = null;<br />
            　　if (isLoggable(record)) {<br />
            　　　try {<br />
            　　　　message = getFormatter().format(record);<br />
            　　　} catch (Exception e) {<br />
            　　　reportError(null, e, ErrorManager.FORMAT_FAILURE);<br />
            　　　return;<br />
            　　}<br />
            　try {<br />
            　　window.addLogInfo(message);<br />
            　} catch (Exception e) {<br />
            　　reportError(null, e, ErrorManager.WRITE_FAILURE);<br />
            　}<br />
            }<br />
            }<br />
            }　　　　　　　　　　　　　　　　　　　　　　　　　　　　</td>
        </tr>
    </tbody>
</table>
<br />
　　清单 6. LoggingWindow 的定义<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>import java.awt.*;<br />
            import javax.swing.*;<br />
            <br />
            public class LoggingWindow extends JFrame {<br />
            　private JTextArea textArea;<br />
            　<br />
            　public LoggingWindow(String title, final int width,<br />
            　final int height) {<br />
            　　super(title);<br />
            　　EventQueue.invokeLater(new Runnable() {<br />
            　　　public void run() {<br />
            　　　　setSize(width, height);<br />
            　　　　textArea = new JTextArea();<br />
            　　　　JScrollPane pane = new JScrollPane(textArea);<br />
            　　　　textArea.setEditable(false);<br />
            　　　　getContentPane().add(pane);<br />
            　　　　setVisible(true);<br />
            　　　}<br />
            　　});<br />
            　}　　<br />
            <br />
            　public void addLogInfo(final String data) {<br />
            　　EventQueue.invokeLater(new Runnable() {<br />
            　　　public void run() {<br />
            　　　　textArea.append(data);<br />
            　　　}<br />
            　　});<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　执行 清单 3 中的 WindowDump 程序将出现屏幕。因为没有从 Logger 中删除控制台处理程序，所以堆栈溢出仍将出现在控制台上。 <br />
<br />
　　发生运行时异常时，可能要做许多工作来更改发生的问题。该代码的大部分都是 Logging Handler，但是，要执行更改，就必须细分 ThreadGroup ，重写 uncaughtException() ，然后在该线程组中执行您的线程。不过，让我们通过只安装 Thread.UncaughtExceptionHandler ，来看一看 Tiger 的处理方式。 <br />
<br />
　　<strong>使用 UncaughtExceptionHandler 的定制行为</strong><br />
<br />
　　对于 Tiger， Thread 类定义中添加了一个新的公共内部类 UncaughtExceptionHandler ，更完整的名称为 Thread.UncaughtExceptionHandler （其他类访问内部类时需要使用完整名称）。接口的定义是一个方法，如图 7 中所示： <br />
<br />
　　清单 7. UncaughtExceptionHandler 的定义<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>public interface Thread.UncaughtExceptionHandler {<br />
            　public void uncaughtException(Thread, Throwable);<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　您可能没有注意到，清单 7 中的方法与我们前面重写的 ThreadGroup 的方法相同。实际上，现在由 ThreadGroup 类实现该接口。 <br />
<br />
　　新的内部类可以帮助我们了解下列两对新方法，并有助于我们在 Thread 中使用它们： <br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>getUncaughtExceptionHandler() 和 setUncaughtExceptionHandler() 。 <br />
            getDefaultUncaughtExceptionHandler() 和 setDefaultUncaughtExceptionHandler() 。</td>
        </tr>
    </tbody>
</table>
<br />
　　第一对方法是 getUncaughtExceptionHandler() 和 setUncaughtExceptionHandler() ，它们允许您为当前线程及其后代定制行为，从而允许二十或更多的线程拥有自己的定制行为。不过，您更可能使用第二对方法 getDefaultUncaughtExceptionHandler() 和 setDefaultUncaughtExceptionHandler() 。如果使用第二对方法设置默认处理程序，那么没有自己的异常处理程序的所有线程都将使用默认处理程序。 <br />
<br />
　　听起来好像很简单。为了进行说明，清单 8 转换了 清单 3 中的 ThreadGroup 友好的程序，使用新的 UncaughtExceptionHandler 接口： <br />
<br />
清单 8. UncaughtExceptionHandler 示例<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    <tbody>
        <tr>
            <td>public class HandlerDump {<br />
            　public static void main(String args[]) throws Exception {<br />
            　　Thread.UncaughtExceptionHandler handler = new LoggingThreadGroup("Logger");<br />
            　　Thread.currentThread().setUncaughtExceptionHandler(handler);<br />
            　　System.out.println(1 / 0);<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　该程序只是将 LoggingThreadGroup 重用为 UncaughtExceptionHandler ，并没有创建新的处理程序实现。请注意，与原来的代码相比，新代码要简洁得多。 <br />
<br />
　　<strong>其他线程更改</strong><br />
<br />
　　Thread 类不仅支持使用 Tiger 添加的未捕获异常处理程序，它还支持使用 getAllStackTraces() 获得所有有效线程的堆栈跟踪，或者支持使用 getStackTrace() 来只获得当前线程的堆栈跟踪。这两种堆栈跟踪都返回类型为 java.lang.StackTraceElement 的对象， java.lang.StackTraceElement 是 Java 1.4 平台中添加的一个类，它可以让您生成自己的堆栈跟踪。同时，Java 5 平台新添加的功能是一个惟一线程标识符（可以使用 getId() 获得该标识符）和一个新的 Thread.State 类，以及与该类相关的 getThreadState() 方法。最后一个线程更改是一个状态枚举表，该表是用来监视系统状态，而不是用来同步状态的。 <br />
<br />
　　<strong>结束语</strong><br />
<br />
　　像添加未捕获的异常处理程序这样的简单库更改，可以极大地增加原代码的可理解性。虽然在线程组级别上，新的库代码的功能与原来库代码的相同，但新模型中的易用性和灵活性远远超出了将代码调整为更新的方式所需的时间。当然，老方法仍然可以使用，但最好将代码更新为最新的库功能。
<img src ="http://www.blogjava.net/szhswl/aggbug/251578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2009-01-16 15:16 <a href="http://www.blogjava.net/szhswl/articles/251578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver 2000 常用函数</title><link>http://www.blogjava.net/szhswl/articles/251137.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Tue, 13 Jan 2009 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/251137.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/251137.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/251137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/251137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/251137.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: --聚合函数use&nbsp;pubsgoselect&nbsp;avg(distinct&nbsp;price)&nbsp;&nbsp;--算平均数from&nbsp;titleswhere&nbsp;type='business'go&nbsp;use&nbsp;pubsgoselect&nbsp;max(ytd_sales)&nbsp;&nbsp;--最大...&nbsp;&nbsp;<a href='http://www.blogjava.net/szhswl/articles/251137.html'>阅读全文</a><img src ="http://www.blogjava.net/szhswl/aggbug/251137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2009-01-13 16:14 <a href="http://www.blogjava.net/szhswl/articles/251137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>glassfish数据库连接池备份日志</title><link>http://www.blogjava.net/szhswl/archive/2008/12/24/248164.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Wed, 24 Dec 2008 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/archive/2008/12/24/248164.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/248164.html</wfw:comment><comments>http://www.blogjava.net/szhswl/archive/2008/12/24/248164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/248164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/248164.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天又重新玩了玩glassfish v2，配置了connection pools，遇到一些问题，就在这里记录一下，以便日后查阅。<br />
１，sqlserver 2000(打了sp4补丁包)的数据库连接池的配置。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置的时候出现了一些问题，在网上找了资料，最后还是比较顺利地一一解决。在glassfish的安装目录：%glassfish_home%\lib\install\templates\resoures\jdbc文件夹下，有各个数据库的连接池的配置说明，随便选了一个：microsoft_sqlserver2000_datasource.xml，查看里面内容需配置：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user" value="DB_USER"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="DB_PASSWORD"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="selectMethod" value="direct"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serverName" value="DB_HOSTNAME"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="portNumber" value="1433"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="databaseName" value="DATABASE_NAME"/&gt;<br />
如下图：<br />
<img height="357" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish1.jpg" width="949" border="0" /><br />
根据配置文件里说明：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datasource-classname="com.microsoft.jdbcx.sqlserver.SQLServerDataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res-type="javax.sql.DataSource"<br />
如下图：<br />
<img height="335" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish2.jpg" width="938" border="0" /><br />
这里注意的是，需要连接驱动jar包三个，放在%glassfish_home%\lib下：<br />
msbase.jar、mssqlserver.jar、msutil.jar<br />
然后点击ping按钮，测试连接是否成功，如果如上配置，sqlserver已经启动，则如下图：<br />
<img height="375" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish3.jpg" width="942" border="0" /><br />
还有就是sqlserver的身份验证得为混合模式，如下图：<br />
<img height="210" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish7.jpg" width="396" border="0" /><br />
不然就如上配置在ping时，会报用户"sa"登录失败，未与信任SQL Server连接相关联，如下图：<br />
<img height="394" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish9.jpg" width="941" border="0" /><br />
２，mysql 5.1的数据库连接池的配置。<br />
配置比较顺利，查看mysql_type4_datasource.xml配置文件：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="user" value="DB_USER"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="DB_PASSWORD"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="url" value="jdbc:mysql://DB_HOSTNAME:3306/DATABASE_NAME"/&gt;<br />
不过偶这里采用了另外的配置方式，如下图：<br />
<img height="355" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish4.jpg" width="949" border="0" /><br />
并且：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res-type="javax.sql.DataSource"&gt;<br />
如下图：<br />
<img height="334" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish5.jpg" width="938" border="0" /><br />
而且在%glassfish_home%\lib下放mysql连接驱动：<br />
mysql-connector-java-5.0.8-bin.jar<br />
然后点击ping按钮，测试连接是否成功，如果如上配置，mysql已经启动，则如下图：<br />
<img height="368" alt="" src="http://www.blogjava.net/images/blogjava_net/szhswl/glassfish6.jpg" width="938" border="0" /><br />
<img src ="http://www.blogjava.net/szhswl/aggbug/248164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-12-24 22:42 <a href="http://www.blogjava.net/szhswl/archive/2008/12/24/248164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python, Ruby 与 Groovy，谁与争锋？(转) </title><link>http://www.blogjava.net/szhswl/articles/244867.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Sun, 07 Dec 2008 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/244867.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/244867.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/244867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/244867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/244867.html</trackback:ping><description><![CDATA[<p>随着计算机硬件的快速发展，10年前因为速度问题而被诟病的Java现在成了计算机流言语言中的老大，但是它却仍被认为复杂笨重，近几年来动态语言却有后来赶上的趋势，掌握一门动态语言成了程序员需要考虑的事宜。 近期接触了几种流行的动态语言Python, Ruby, Groovy，它们相比静态语言Java/C++来说，大为简单，灵活，省时，那么选择何种语言？ 浅尝三种语言后，写下此文，作为在JavaEye留的第一爪。 </p>
<p>从TIOBE网站的语言排名可以看出，比较2000与2008年，Java 从30%跌到20%左右, C++从18%跌到11％， 静态语言从72%占有率降到了60%; 动态语言由27%升到40%，其中Python从1%到5%, Ruby由 &lt; 1%到2.5%。PHP由5%长到11%。(以上数据为大约估算) </p>
<p>从企业界角度看，语言的流行性与以个几点有关： </p>
<p>1)&nbsp; 成熟的库(library) <br />
&nbsp;&nbsp; Python的库非常多， Groovy可以调用强大的Java所有的库，ruby差些，但是正在赶上。 </p>
<p>2) 流行框架 <br />
&nbsp; 如果某种语言有个流行框架，那就能吸引过来很多使用者。Ruby on Rail是杀手级框架。Python 框架很多，但是目前尚没有特别突出的。Groovy还年轻，只有个Grails，但是可以利用JAVA已有的框架如SPRING HIBERNATE。 </p>
<p>3) 流行程序 <br />
&nbsp;&nbsp; 如果某个流行程序使用了某语言，那么这种语言不可必免会被多人使用。比如iPhone的出现使一种可能没多少人听说过的 Cocoa热了起来，因为人们用它编写在iPhone上运行的手机程序。这三种动态语言中Python在图象处理，或科学计算界已占有一席之地。Ruby可能落后一些，Groovy几乎没有。JavaEye </p>
<p>4) 企业界的倾向 <br />
市场通常会倾向于简单好用省时省力，易于使用维护，稳定，能承受大负荷(scalable)的语言，这也是JAVA的流行性当时超过C＋+的原因，这三个语言比静态语言都简单，其中Python由于其语法和句法简单，所以可能是最好维护，而且能够承受高负荷(Youtube每天数亿点击为证)；RUBY 有些魔幻语法也能使程序写得很简单，总体维护上比Python感觉差了一点，让其他人看程序可能不是非常直接易懂，性能上目前也差些。Groovy 模仿了大量RUBY，也借鉴了少量Python文法，由于在JVM上运行，性能上应该是不错的。 </p>
<p>5)对硬件的利用 <br />
对着双核的出现，可以预料双核，四核，16, 32..核CPU都可能在未来出现。如果未来语言只能利用多核中的一核，那未免太浪费了，也可能因此而落于人后。从这一点上看GROOVY有天然优势，能借助JVM完成这一任务；PYTHON 正在积极研制新的方法实现，也可以在JVM或WINDOW环境下运行JPython 与IronPython；Ruby落后些，但是也有JRuby和IronRuby，起步晚些。 </p>
<p><br />
从语言的各自优缺点来看： </p>
<p>Python: </p>
<p>1)三者中最成熟，通用，工具库多，资源丰富，文档等支持强大，几乎能做任何事：网络，图形界面，桌面程序，服务器，图形处理，算法等。 </p>
<p>2)相比之下性能好，运行速度快，负载力强。 </p>
<p>3)简单易学，文法简洁，其使用空白缩进代替花括号或END使代码看起来很干净，易读易懂因此易维护。 </p>
<p>4)基于尽量使用一种方法完成一件事，越简单越好的哲学。这种哲学适合大型项目，因为让其他人看着易懂，好维护，不至于过多灵活繁杂的语法使自己玩的爽了，别人看得傻了。这与RUBY的用许多种方法完成一件事的哲学正相反。GROOVY感觉在两者之间。 </p>
<p>5)得到业界承认 </p>
<p>a) 大多数Linux，或者流行Linux中绝大多数都默认安装Python，这意味着不管你是哪国人在哪里，想用哪台Linux机子，想用Python就可以用，省时顺手；要用Ruby Groovy还得安装。 <br />
b) 有巨头支持。几个例子，Google 互联网老大，公司内部中Python是官方的第三语言，有内部员工说他们是能用Python就用Python， 实在不行才用C++;&nbsp;&nbsp; Youtube 大部分是用 Python写的；著名Linux发行版Ubuntu的发行公司的官方语言，也是其创始人的首选语言；其他还有Redhat, NASA, 动画公司Pixar等；桌面程序如流行程序BT客户端等； </p>
<p>缺点： <br />
1)不是完全的面向对象，语法中混杂有函数调用方法。 <br />
2)使用空白缩进代替截止符在网页制作有点问题，这时还得需要新语言或语法，代码Copy Paste等时，使用Tab时也可能有点麻烦， <br />
3)好象目前还不支持多核CPU <br />
4)尽管创始人说Python这一名字取自一个喜剧团体，但是其名字或图标可能会使一些人反感，有些Python语言网站的的Python图片着实不令人喜欢。不喜欢这种动物的人可以考虑选其它的，比如Python的弟弟Ruby。 </p>
<p>简要：Python适合大中小型企业各类开发，几乎无所不在，无所不能，想跟紧大型企业或者需要成熟的库，Python可能较合适。 </p>
<p>－－－－－－－－－－－－－－－－－－－－－－ </p>
<p>Ruby </p>
<p>1) 语法是更纯正的面向对象语言，许多功能让从Java/C++世界过来的人耳目一新；因为它借鉴了包括Python, Smalltalk, Lisp等在内的一些其它优秀语言的优点。一切都是Object，如避免Python的类似len("name")，而采用 "name&#8221;.length, 还有提供类内部参数数据的保护等;提供的更多语法，使程序更易懂简练， 比如它有Block closure,它用' &lt; ' 来表示类继承，用?来表示返回是否的函数。 </p>
<p>2) 灵活的魔幻语法，如模块的混入，块，开放式的类定义，加上已有的动态性使其变得极其灵活；各种繁多的著名设计模式在它手中好象都失去了意义，Java做梦都想达到的灵活性在RUBY手中轻而易举，Spring AOP相比也失去了光泽，设计大师们的法则与多年经验也好象都不再适用。 </p>
<p>3) 相比Python提供了End作为程序块的截止符，这是Rubist们自认为的一大进步，也是与Python的一个重要区别。 </p>
<p>4) 杀手级框架，Ruby on Rails，及还有些其它杀手级框架正在一一跃出。 </p>
<p>5）有跑在JVM的JRuby和微软的IronRuby </p>
<p>6）名字与图标很好&nbsp;&nbsp;&nbsp; Ruby 红宝石是瞄准Perl （珍珠）的继承者而来的，名字与图标都优雅端庄赏心阅目。 </p>
<p>缺点 <br />
1)灵活可能有负面影响 <br />
开放的类在大型程序中可能会造成混乱，不易懂不易维护，类可能会不知道是谁在哪个角落改的(不过有了IDE的支持这种情况可能可以解决)；语法方法的灵活可能使代码不规范，一个人喜欢写魔幻代码的有可能使后来人看不懂，其用多种方法实现一个目的的哲学好象是在鼓励代码的多样灵活性，这在大型项目中会加大维护难度。这可能也是为何目前尚未有大型企业界使用Ruby的原因。 </p>
<p>2)性能相对不强&nbsp;&nbsp; 原有的Ruby速度慢，稳定性相对差些，据说是原有的GC写的不强。不过随着新的更好的RUBY编译器的出现与硬件的快速发展与价格降低，此性能问题应该能够在不远的未来解决。据Java Eye的Robbin讲，即使有此性能问题，扩充硬件或设置系统也多可解决问题。 </p>
<p>3)对线程支持不强，Ruby 2.0据说要加强 </p>
<p>4)好象尚未支持多核，不过未来可能解决，道理同2) </p>
<p>5)对End的意见&nbsp; 不少人认为Ruby的End过多，显得不好看。代码在写很多层时尤其如此，这样使查找相应的起始位置增加难度。有人建议其创始人Mats提供End的替代字符，他有此意，但是好象没有他看的上的，如果谁不喜欢End的，找个自认为不错的字符发给总部吧，要趁早，否则以后越来越难改。 </p>
<p>简要：Ruby是令人兴奋的，学习Ruby可以加深程序员对面向对象，及计算机语言的理解，从这一点上说，Python更只象个工具，Ruby灵活却又很有深度，值得一学。Ruby的主要缺点是其性能性，但是看Java的历史可知，当时Java的速度被评为比C++差得太远，可是几年后性能随着硬件的发展而大大加强，所以Ruby的性能应该在未来不会是大问题。 </p>
<p>看过Python 和ruby后，本应就此罢手了，但是对这两语言感觉仍有遗憾之处，于是看到了以前看Ruby时瞧不上的Groovy, 却发现这是个不可小看的语言，不仅如此，而且Groovy可能会成为未来耀眼的新星。 </p>
<p><br />
------------------------------------ <br />
Groovy </p>
<p>1）初看Groovy, 它好象是Ruby 与java的结合体，也添加了少量Python的东西。Ruby中引以为傲的一切是对象，Groovy也可以作到，如 3.times { ...},&nbsp;&nbsp; 块传递，动态改变类，增加类函数等。它借鉴了大量Ruby 的语法，但是保留了C/C++/Java程序员熟悉的花括号，没有用Ruby无所不在的"End&#8221;。而且对Ruby的一些生僻的字符进行了改进，使得更加友好易懂，如块中的 | x | 换成了 &#8594; x </p>
<p>2）被Thoughtwork(就是写重构那本书的Martin Fowler所在公司)经理称为 &#8220;Java 2.0&#8221; ，可以&#8220;无缝&#8221;结合Java 代码，你可以在Groovy文件中写Java代码，用Java库。Groovy象是个轻量级的动态版Java,而且加大扩展了许多易用的句法，以前曾想过的一些"Java 要是这么写多好啊" 竟然在Groovy中实现了： 如去掉了多余的分号，三引号使得多行的文本变量整洁好看，砍掉了没多大用的getter setter等。 </p>
<p>3 )可以使用所有Java的库，因为Groovy"就是Java&#8221;。相比Ruby爱好者在一个一个辛苦编写各种库的时候，Groovy已经是站在Java 的车头上向前冲了。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
4)支持多核CPU，未来的硬件是多核CPU的世界，谁不支持多核可能不是淘汰就落后。由于跑在JVM上，Groovy再次领先于Python和Ruby；有人说，也有Jython 和Jruby 啊，但是从与Java的结合性及调用Java代码或库来说，Groovy无疑是极佳的结合，Jruby或Jython相比下显得并不自然。 <br />
&nbsp; <br />
5)性能不错 <br />
Groovy不再是一个玩具或试用品，一个已经使用Groovy的公司其正式发布的产品中有超过十万行Groovy代码。 <br />
其性能相比Python我不清楚，但有测试说Grail性能不亚于，甚至更强于Ruby on Rails.由于Groovy跑在JVM上，性能应该不会太差。 </p>
<p>6)业界的支持 <br />
Groovy 2003年左右刚出现，还是新生儿，还谈不上大型业界的大量支持，就连Sun公司也对Ruby青眼有加，使得Groovy爱好者大抱不平，抱怨Sun偏向外人，不向自己这个Java 亲生子。目前可能只有Oracle与Thoughwork支持。 那么目前业界还未大力支持，谁可能会支持Groovy呢？私下认同这种说法，就是全世界Java与C++的几百万程序员中可能会有不少支持的。这是由于Groovy与Java，或C系列语言句法的近似及与其与Java&#8220;无缝&#8221;结合的特点相关的。流行语言的发展目前为止是在相似的基础上发展的，想想C &#8594; C++ &#8594; Java 他们的句法是不是相似？从这一点上看，Groovy最与Java类似； 试想，如果有两种语言有相近的功能，一种有你熟悉的句法，另一种却较为生僻，哪种语言更易上手？从企业界的角度来说，Java的业界(Sun, IBM Oracle等)在过去十年中已经投资了大量金钱与时间在Java上，如果一种语言能与目前的Java项目自然结合使用调用，另一种语言有全新的语法要员工学习，企业界的项目经理会选择哪个？ 即使Ruby On Rails再强大，如果使用Ruby Python意味着十年来的人力，资源，框架(Spring Hibernate)库等投资大部分作废，在Grail能带来Rails 70%的编码效率，120%的性能，并且利用已有的框架与员工的情况下，企业会选择哪个？所以个人认为Java程序员或企业界可能会以后认识到Groovy能带来的益处。 </p>
<p>7）名字起的也不错 <br />
名字是&#8220;很棒&#8220;， &#8221;极佳&#8220;， 有着很积极正面的含意 </p>
<p>缺点： </p>
<p>1）它虽然借鉴了大量Ruby的语法，但是有少部分没有完全实现，如开放的类，它只是在一定范围内对类开放修改。 </p>
<p>2）Groovy就是Java, 目前只有JVM的实现，只能跑在有JVM的机子上。做桌面程序有着Java相同的弱点，不适合做小巧的Window程序 </p>
<p>Groovy是个有前途的语言，照现在的势头发展，仅管它现在排名在39名，未来几年内闯入20名，再过些年闯入前十名或更前都不是不可能的事。 </p>
<p>三种语言各有特点，选择哪种语言与您的工作环境，项目特点或个人爱好有着关系。随着动态语言的向前发展，他们的简单灵活与强大能帮助我们节省时间与资源，学一种有潜力的语言能让程序员们站得更稳，立于领先之地，如果有天动态语言发达了，设计模式们很多都用不上了，这不是多年的经验淘汰了吗？程序员们不要忽视了他们了啊。 </p>
<p>以上内容为参看一些文章与自己初步使用的感受的一些感想，与网友们分享，有错误之处，请指正。<br />
&nbsp;<br />
转自：<br />
<a href="http://www.javaeye.com/topic/259257">http://www.javaeye.com/topic/259257</a></p>
<img src ="http://www.blogjava.net/szhswl/aggbug/244867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-12-07 14:40 <a href="http://www.blogjava.net/szhswl/articles/244867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python和Ruby的对比</title><link>http://www.blogjava.net/szhswl/articles/244866.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Sun, 07 Dec 2008 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/244866.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/244866.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/244866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/244866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/244866.html</trackback:ping><description><![CDATA[<font size="4">《ruby和python的比较》更正一点事情<br />
<br />
1、文档、开源项目、库支持，这些东西Ruby不要跟Python比，不是几个数量级的问题，何必貌似并列的排在一起。<br />
2、Python确实没有把正则表达式模块内置到核心里面，但是却有re这个标准库的支持，当时的目的也是为了尽可能的把核心做到最小。我不太明白，使用标准库和内置有什么区别，甚至可以作为优点？且使用Python中的正则表达式也不过是多个import re和调用时的几个字母而已，省下的无数个end足以抵销这个问题了。<br />
3、至于嵌入HTML功能，Python里有C/Python双实现的Cheetah模板可用，据说托Zope的福，美国海军和法国政府在用，不知Ruby这个功能的成熟度如何？<br />
4、mod_ruby模块的出现时间很短，如果作者没有听过mod_python那就实在孤陋寡闻了。我在一年前翻译mod_python3.2.8文档的时候，mod_python已经很成熟了，以至于几乎所有的Python WEB框架都支持构建在其上来提高效率。但是，似乎mod_ruby的更新，每年也只有几次。mod_python更有gnu.org这样的重量级应用，不知mod_ruby有没有？<br />
5、另外，提到unix工具。Red hat Linux的安装程序一直是用Python写的，如果你恰巧用ubuntu，那么，那个提示你更新系统的程序，也是用Python写的。<br />
6、racc和doctools，请原谅我的孤陋寡闻，我google了一下居然除了你的这篇文章还没找到几篇关于racc的中文内容，辗转之后才查到是一种类似yacc的工具。从google的角度讲，racc的可用性我就不多说了。我不太明白一个yacc工具在日常编程当中有多大的实用性，但是既然作者提到了我就顺便找了个我只听说过名字，根本没用过的spark。google的结果是"racc ruby":"python spark"=159,000:659,000。至于doctools，我更是无话可说，在google上只有15,800条记录，我到现在都看不出这个东西是干什么用的。所以找了个估计是类似的东西对比了一下，docutils，google的记录是25,400条。<br />
7、&#8220;比Python库更完整的面向对象语法&#8221;。试问面向对象的目的是什么？再者，ruby能否像Python一样，绝大多数标准库根本不需要查文档，只要猜测一下大体上的名字，然后dir()一下，再help()一下就可以直接上手，用到第二次的时候，因为模块内东西实在太少，记忆太方便，就可以直接写出来的地步？另外，面向对象既不是什么银弹，也不是最先进的软件工程思想。<br />
8、"ruby的整个库都是类继承结构的"，个人认为是Java的糟粕，反倒是当成宝学过来了。或许这也是ruby来拯救Java程序员的一项优势吧。<br />
9、"基本数据类型和运算符都是可以重载的"，这个不是太清楚，不知Python中重载__add__之类的算不算。<br />
10、"ruby主要的功能都是通过对象的方法调用来实现的，而不是函数"，Python中所有的东西都是对象，但并不都是类，不知这句还有什么意义。另外，推荐你不要太追求什么彻底，还是实用这个词比较有吸引力。<br />
11、Python没有严格要求单继承是给程序员以灵活性。另外，关于接口，Python中只要定义了同名的函数就算是具有了相同的接口，玄学上升到了这个高度，我也有些迷糊了。至于接口，不要那么自信，ruby的所谓接口也不过是个mix-in。这个东西Python的几个大项目中也有过实现，只是因为对Python意义不明显，所以才没有更多的使用。<br />
12、关于lisp的函数式编程，Python中有很多内置支持，如map、zip、filter等等，当然还有lambda。不要说支持，我们谈实用。Pythoner中尚且有些人认为函数式编程影响了代码可读性而尽量避免呢。所以，你认为支持什么东西之前，先想好这样东西算不算是个好东西。<br />
13、"最大的不足正是因为ruby的强大所引起的"。这句真恶心，不予评论。<br />
14、呵呵，ruby居然没有国际化支持，真是个笑话，不知道当初那个小日本怎么想的？难道他英语过了四级？<br />
15、至于jython，现在也有了jruby，可能是作者的原文比较早的缘故吧。Python也有很多种实现，像是jython, ironpython, pypy, pyrex等等。Python的优秀其实并不一定要通过用其他语言来实现才能体现出来。当然更不要说寄希望于要Java来解救水深火热中的ruby了。<br />
另外么，有些ruby的缺点不要回避：<br />
16、ruby没有本地化线程，而是用的伪线程，根本无法利用多核CPU的优势。CPython使用了本地化线程，但是因为使用了GIL所以也是无法利用多核CPU优势的。但是Stackless的出现完全可以解决这个问题，并且stackless更是将Python提高到了并行计算的高度，这个高度的竞争对手可以是Erlang，ruby自然不必窥探。其中的超轻量线程技术可以确保一台很烂的机器上跑几十万的线程还很轻松。基于Twisted的异步编程方式也提供了一种选择。<br />
17、刚刚开始学Python的时候，就听说过一句&#8220;Python是主流动态语言中最慢的&#8221;，后来才知道，说那句话的人根本没把ruby放在眼里。如果把ruby也算进主流动态语言里，那么就会出现一个比Python还慢了一个多数量级的语言了。<br />
18、ruby流行么？是不是要走向PHP？PHP是个好东西，但是问题在于他只能作WEB编程，限制了PHP的应用范围，稍微需要系统一点的东西就要借助于C。而现在的ruby似乎也就是走着这条路。直到有一天，有人爆料"ruby是可以做客户端编程的"，赢得大家一片好奇。况且现在的ROR能否取代什么还是个未知数。从Java WEB开发中解救出来的人们也并不都是走向了ruby。<br />
<br />
<br />
<br />
-------------------------------------------<br />
<br />
<br />
<br />
评《选Ruby还是选Python？》<br />
<br />
这篇文章看来传播的算是比较多的，至少我看到的是转载。文中谬误颇多，在此纠正一下，当然还有少许经典语句这里也要提及。<br />
<br />
Python和Ruby的设计哲学确实有很大的差异，这个问题，我就不评论哪个更好了，各有所爱吧。至于效率，Ruby永远不要考虑跟Python相比。Ruby是伪线程，而且根本没有利用多核CPU的可能，直接pass。而Python使用native thread，仅仅由于部分模块不是threadsafe的而加入了GIL来限制应用多核CPU，而在我最近的测试中，在使用Twisted的异步线程之后，已经可以很好的利用多核CPU的计算能力了。执行效率上也不是一个数量级，自己试试就知道。<br />
<br />
拿Java对比Python，可见作者创造力之强悍，哈哈。开源项目是很符合达尔文的自然选择的，难道Ruby的开源项目少倒成了优点了？另外，在Python中我也没见除了WEB framework之外有什么项目有太多的重复。举个例子，pypcap就已经基本淘汰了pcapy了。<br />
<br />
谈到资源，Ruby还有很长的路要走，所以提到双方都很强的时候，麻烦不要太并列化了。至于Java社区的人倾向于学Ruby，我个人认为只是被Java折磨惯了的开发人员目光太狭隘所致。语言是工具，面向对象也是工具，纯粹的面向对象并不见得高明到哪里去，Python也有函数式编程的支持，作者怎么没有提到。另外，Python的很多做法是以开发效率为第一目标的而不拘泥于各类形式，甚至为很多智力有限的人所广泛诟病的C++中的多继承，Python也可以支持。问题不在于支持了什么让你不喜欢的东西，而是让尽可能多的人用上他们喜欢的东西。另外，一直被Ruby开发者所认为的Python不够OO的一个例子就是取一个序列的长度，Python使用len(x)的方法。这个问题，如果Ruby开发者认为x.length就可以算是OO的话，那么Python也大可以直接使用x.__len__()来获取长度。从用方法来封装属性的Java角度讲，谁更OO一些呢，哈哈。<br />
<br />
Ruby是一个日本人的作品，呵呵，这个就不多说了，不喜欢日本的国人有很多，在此我仅在技术层面就可以把Ruby贬低下去，无须用非技术的东西了。<br />
<br />
关于Ruby on rails，Ruby社区确实把几乎所有的精力都集中于此。但是这只能表现出Ruby的幼稚，事实已经证明了，ROR的很多模仿者已经推出无数的高级功能，远远超过了ROR，没有取代ROR只是出于先入为主的观念。如果现在的Ruby，突然失去了ROR又会是什么样子。至于作者提到的zend，居然用来跟ROR相比，有如以卵击石，我学过Python的2种WEB框架，平时也比较关注Python和Ruby的各种东西，但是zend这个东西，我是没有听说过的，不知是不是作者的作品，哈哈。如果一定要在WEB框架上有个较量的话，你可以用django,Quixote,mod_python之类的来比较一下。django，一个典型的ROR模仿品，还在成长，但是已经有很多优于ROR的功能了，而性能上远优于ROR自不必说。应用Quixote的douban.com是所有使用Python和Ruby网站中流量最大的，而且在相同硬件配置的情况下比ROR实现速度快了一倍还多，要知道去除WEB服务器等等的各种平等损耗之后，这可是要快上一个数量级的东西。至于mod_python，据说<a href="http://www.gnu.org/" target="_blank">www.gnu.org</a>用的就是这个。如果Ruby还想开源的话，那么就永远活在Python的阴影里面吧。<br />
<br />
至于上手的速度，各个人有不同的情况，不作评论。至于灵活性所带来的东西，仁者见仁，就不要评论了。作者谈到Python的入门不容易，真不知Ruby有个何等容易。我初学Python时，第11天就用Python写了一个词法解析器，至今仍然在我博客上可查。所以，入门难度这个东西，每个人还是自己去试试为好，不必听别人怎么说。<br />
<br />
提到ROR生成的目录有很多东西，要很久才可以都了解，这确实是IDE的综合症。在Python下，比较典型的例子是TurboGears，如果你希望了解整个应用程序的运行方式，你可以从核心cherrypy开始学习，然后开始使用TurboGears就没有什么可不了解的东西了。在这个角度上，ROR没有选择。再者，现在ROR可用的一种连接WEB服务器的方式scgi，当年也是Python的作品，又是一个在Python的阴影下活着的小东西。<br />
<br />
未来的发展么，孤注一掷的Ruby还很难说，但既然是孤注一掷，风险还是蛮大的。而Python么，我也以为真的会平稳的发展，但是后来Micro$oft的加入，让我们都难以预料Python的未来到底有多大了。我们再回头谈谈作者一直讨厌的Python的多样性，在我看来Ruby可以超越Python的东西屈指可数，而Python超过Ruby的东西，自然是Ruby难以逾越的鸿沟。所以从编程语言的多样性考虑，也就不建议大家学Ruby了吧，少了一种选择，聚集一些人气总是好的。</font> <br />
<br />
转自：http://www.winu.cn/viewthread.php?tid=109124
<img src ="http://www.blogjava.net/szhswl/aggbug/244866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-12-07 14:36 <a href="http://www.blogjava.net/szhswl/articles/244866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>醉酒</title><link>http://www.blogjava.net/szhswl/articles/243281.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Fri, 28 Nov 2008 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/243281.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/243281.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/243281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/243281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/243281.html</trackback:ping><description><![CDATA[　　丈夫：&#8220;今天电视不知怎么的，整晚上只演一堆篝火！&#8221;<br />
　　妻子：&#8220;你少喝点吧！电视机昨晚就送去修理了，你看到的是壁炉。&#8221;
<img src ="http://www.blogjava.net/szhswl/aggbug/243281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-11-28 16:36 <a href="http://www.blogjava.net/szhswl/articles/243281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>世界是一个班级(35国)</title><link>http://www.blogjava.net/szhswl/articles/241137.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Tue, 18 Nov 2008 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/241137.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/241137.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/241137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/241137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/241137.html</trackback:ping><description><![CDATA[<strong><font size="4">1、美国 班长，学习好，家里有钱，人高马大，好打架。 班里没几个人敢惹他。和副班长关系不好。&nbsp;</font></strong><br />
<br />
<strong><font size="4">2、俄罗斯 副班长，成绩优异，全班最高大，上学期光和班长顶着干。后来家里出事：分家！现在做事很消极，但在班级里有一定的影响力。&nbsp;</font></strong><br />
<br />
<strong><font size="4">3、中国 团支书。幼儿园学习成绩很好。小学时由于体质差常被欺负，没事爱吹牛，由副班长罩着。　　&nbsp;</font></strong><br />
<br />
<strong><font size="4">4、英国 学习委员，学习成绩好。家里也很富。班长的跟屁虫，做事没主见，啥都听班长的。前些天和班长把伊拉克打了一顿。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">5、瑞士 班花。学习成绩好，清高。不跟人勾肩搭背拉帮结派 。</font></strong><br />
<br />
<br />
<strong><font size="4">6、奥地利 音乐课代表，早熟，在两性观念上特别开放，经常因为乱搞男女关系被同学非议。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">7、阿富汗 职务无。不爱学习。身材矮小。上学期被副班长打，班长帮忙付医药费。前几天把班长家的最高的两个家具砸了，被班长揍个半死，现在失忆中。&nbsp;</font></strong><br />
<br />
<strong><font size="4">8、伊拉克 无职务。幼儿园时学习好，现在学习差。但人高马大，上学期排全班第四。嘴硬，上学期欺负同桌被群殴。前些天被班长和学习委员冲进他家揍个稀巴烂。&nbsp;</font></strong><br />
<br />
<strong><font size="4">9、印度 好玩电脑，成了电脑课代表。经常和同桌巴基斯坦为一块课桌吵架。&nbsp;</font></strong><br />
<br />
<strong><font size="4"></font></strong>&nbsp;<br />
<strong><font size="4">10、巴基斯坦 职务无。成绩一般。和团支书关系不错，经常和印度吵架。&nbsp;</font></strong><br />
<br />
<strong><font size="4">11、德国 班级活跃分子，人高马大，擅长数理化。有野心，由于上学打了2架所以现在暂无职务。但认错态度较好。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">12、____ 无职位，成绩不错。思想品德很差。上学期刚被班长和团支书等人揍。现在还惦记着班长家的鱼缸。&nbsp;</font></strong><br />
<br />
<strong><font size="4">13、越南 无职位。人品有问题,瘦弱。上学期被班长揍，幸好有副班长和团支书撑腰。后又挑衅团支书，被狂揍。 <br />
</font></strong><br />
<br />
<strong><font size="4">14、朝鲜 无职位。有个性。和团支书关系好。近期和班长闹矛盾，班长扬言要揍他。&nbsp;</font></strong><br />
<br />
<strong><font size="4">15、韩国，无职务，品行比____还差，样貌丑,整容整了数十次,终于发现原来基因不好,怎么整都没用,于是决定不要脸了.现在班里公认的心灵与长相一样欠扁.喜欢偷团支书东西，偷完了还不知廉耻拿出来炫耀。由班长罩着。&nbsp;</font></strong><br />
<br />
<strong><font size="4">16、巴西 体育委员，家里杂草丛生。&nbsp;</font></strong><br />
<br />
<strong><font size="4">17、法国 宣传委员，班级活跃分子，从小喜欢闹事，追求时尚，被班里有钱男生认为是内涵型气质美女。最近他和一帮同学把团支书惹毛了，被团支书当作出头鸟教训。&nbsp;</font></strong><br />
<br />
<strong><font size="4">18、蒙古 特困生，但刚出生时是个巨婴，曾大哭大闹，弄得还在上幼儿园的全班同学不得安宁。&nbsp;</font></strong><br />
<br />
<strong><font size="4">19、意大利 上幼儿园时收拾了周围几十个比自己小的骠悍小朋友，后来被众小朋友合伙打残，失忆，醒来后加入了打他的那群骠悍小朋友，大一点后发现自己又能记起一点失忆前的东西，把它们教给众小朋友后，众小朋友变得比自己学习还要好，且大多成为班干部。&nbsp;</font></strong><br />
<br />
<strong><font size="4">20、希腊 上幼儿园时特聪明，教会了周围一大帮同学数理化政史地，后来被自己教出来的意大利打残，抓到家里，意大利又被打失忆后，希腊为了避免步其后尘，对意大利旁边那群骠悍小朋友躲得远远的，但终于还是被几伙同学联番欺负。&nbsp;</font></strong><br />
<br />
<strong><font size="4">21、土耳其 小学时骠悍，打了不少人，还不知好歹地收拾了早慧少年希腊，结果被那群更骠悍而且有钱的小朋友收拾了，现在正在乞求那群彪悍小朋友收留他。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">22、格鲁吉亚 副班长的小弟弟，前不久才转进班里，现在正在挨哥哥揍。&nbsp;</font></strong><br />
<br />
<strong><font size="4">23、埃及 早慧儿童，可惜幼儿园毕业后失忆，幸好一系列家传古董还在。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">24、以色列 早慧儿童，智商极高，但童年不幸，曾经被很多同学轮番欺负，却都挺过来了，没有失忆。成为班长的铁杆朋友后，开始不那么低调了。&nbsp;</font></strong><br />
<br />
<strong><font size="4">25、丹麦 小学时很凶，喜欢抢别人钱，后来不耍脾气了，成了人见人爱的娃娃脸。&nbsp;</font></strong><br />
<br />
<strong><font size="4">26、墨西哥 幼儿园时聪明，但大多数同学不知道，知道后直接把他打残，失忆，醒来后发现原来班长住在自己家旁边，后来班长半买半抢拿了他家一半的东西走。&nbsp;</font></strong><br />
<br />
<strong><font size="4">27、西班牙 幼儿园时全家被人强光，小学时便成专抢别人的，发现了一块新地盘，收保护费时被后来的学习委员狠狠揍个半死，手下人全部走掉。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">28、葡萄牙 经历与西班牙类似，但是体质比较弱，更早就被收拾了，最近的一件大事是把小学一年级时抢的现在团支书的一点东西还给了他。&nbsp;</font></strong><br />
<br />
<strong><font size="4">29、阿根廷 和墨西哥一样，原来是西班牙的手下，后来溜了，最近为了争一点吃的，跟学习委员打了起来，被打个半死。现在只敢跟巴西争争体委的位置。&nbsp;</font></strong><br />
<br />
<strong><font size="4">30、委内瑞拉 原西班牙手下，最近突然变得很有个性，自立门户，和几个哥们一起，跟班长对着干。&nbsp;</font></strong><br />
<br />
<strong><font size="4">31、古巴 班长邻居，有个性，由委内瑞拉等一帮哥们，还有副班长（有时还有团支书）撑腰，跟班长对着干了一个学期。&nbsp;</font></strong><br />
<br />
<br />
<strong><font size="4">32、加拿大 全班第二高大，是班长的邻居，除了最近要和班长、副班长等抢几个冰棍外，基本上是班长的助手。&nbsp;</font></strong><br />
<br />
<strong><font size="4">33、伊朗 无职位，做事却很高调，引起班长等的极度反感，扬言要好好教训他一顿。&nbsp;</font></strong><br />
<br />
<strong><font size="4">34、前南斯拉夫诸国 本来自成一派，不听班长话，也不听副班长话，后来分家，各自加入班长或副班长的圈子。其中有不少被认为&#8220;不适宜上学&#8221;者整天闹着要上学，原来一个叫黑山的小子被同学们接纳了，最近闹的是一个叫科索沃的小P孩，班长带头的十几名同学已经同意他入学，但副班长不肯。&nbsp;</font></strong><br />
<br />
<strong><font size="4">35、联合国 班主任，穷，身子弱，地位低，没几个学生把自己当一回事，同学们还算有点良知，分摊了他的生活费，但作为交换条件，班主任的管理权交给了五个班干部。</font></strong>
<img src ="http://www.blogjava.net/szhswl/aggbug/241137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-11-18 14:26 <a href="http://www.blogjava.net/szhswl/articles/241137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让你读懂爱情的七个故事</title><link>http://www.blogjava.net/szhswl/articles/232947.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Tue, 07 Oct 2008 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/232947.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/232947.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/232947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/232947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/232947.html</trackback:ping><description><![CDATA[<p><strong><a class="st_tag internal_tag" title="标签 1 下的日志" href="http://www.bwqcw.cn/blog/?tag=1" rel="nofollow">1</a>.带走的钥匙</p>
<p></strong>他和她邂遇在火车上，他坐在她对面，他是个画家。他一直在画她，当他把画稿送给她时，他们才知道彼此住在一个城市。两周后，她便认定了他是她一生所爱。</p>
<p>那年，她做了新娘，就像实现了一个梦想，感觉真好。但是，婚后的生活就像划过的火柴，擦亮之后就再没了光亮。他不拘小节、不爱干净、不擅交往，他崇尚自由，喜欢无拘无束，虽然她乖巧得像上帝的羔羊，可他仍觉得婚姻束缚了他。但是他们仍然相爱，而且他品行端正，从不拈花惹草。</p>
<p>她含着泪和他离了婚，但是带走了家门的钥匙。她不再管他蓬乱的头发，不再管他几点休息，不再管他到哪里去、和谁在一起，只是一如既往地去收拾房间，清理那些垃圾。他也习惯她间断地光临，也比在婚姻中更浪漫地爱她，什么烛光晚餐、远足旅游、玫瑰花床，她都不是在恋爱和婚姻中享受到的，而是在现在。除了大红的结婚证变成了墨绿的离婚证外，他们和夫妻没什么两样。</p>
<p>后来，他终于成为了有名的艺术家，那一尺尺堆高的画稿，变成了一打打花花绿绿的钞票，她帮他经营帮他管理帮他消费。他们就一直那样过着，直到他被确诊为癌症晚期。弥留之际，他拉着她的手问她，为什么会一生无悔地陪着他。她告诉他，爱要比婚姻长得多，婚姻结束了，爱却没有结束，所以她才会守侯他一生。</p>
<p><strong>是的，爱比婚姻的长度要长，婚姻结束，爱还可以继续，爱不在于有无婚姻这个形式，而在于内容。</strong></p>
<p><strong><a class="st_tag internal_tag" title="标签 2 下的日志" href="http://www.bwqcw.cn/blog/?tag=2" rel="nofollow">2</a>.破碎的花瓶</strong></p>
<p>他和她是大学同学，他来自偏远的农村，她来自繁华的都市。他的父亲是农民，她的父亲是经理。除了这些，没有人不说他们是天生的一对，在她家人的极力反对下，他们最终还是走到了一起。</p>
<p>　</p>
<p>他是定向分配的考生，毕业只能回到预定的单位。她放弃了父亲找好的单位，随他回到他所在的县城。他在局里做着小职员，她在中学教书，过着艰辛而又平静的生活。在物欲横流的今天，这样的爱情不亚于好来坞的&#8220;经典&#8221;。</p>
<p>　</p>
<p>那天，很冷。她拖着重感冒的身体，在学校给落课的学生补课，她给他打过电话，让他早点回家作饭。可当她又累又饿地回到家时，他不在，屋子里冷锅冷灶，没有一丝人气，她刚要起身做饭，他回来了。她问他去哪了，他说，因为她不能回来做饭，他就出去吃了。她很伤心，含着满眶的泪水走进了卧室。她走过茶几时，裙角刮落了茶几上的花瓶，花瓶掉在地上，碎了。半年后，她离开了县城，回到了繁华的都市。</p>
<p>　</p>
<p><strong>这便是婚姻，坚强而又脆弱。如同漂亮的花瓶，放在一个合适的位置，可以经受得住岁月的风化，但是只要轻轻一碰，掉在地上，就可能会变成无数的碎片。</strong></p>
<p><strong>3.滴水的窗檐</p>
<p></strong>　</p>
<p>他和她属于青梅竹马，相互熟悉得连呼吸的频率相似。时间久了，婚姻便有了一种沉闷与压抑。她知道他体贴，知道他心好，可还是感到不满，她问他，你怎么一点情趣都没有，他尴尬地笑笑，怎么才算有情趣？</p>
<p>　</p>
<p>后来，她想离开他。他问，为什么？她说，我讨厌这种死水样的生活。他说，那就让老天来决定吧，如果今晚下雨，就是天意让我们在一起。到了晚上，她刚睡下，就听见雨滴打窗的声音，她一惊，真的下雨了？她起身走到窗前，玻璃上正淌着水，望望夜空，却是繁星满天！她爬上楼顶，天啊！他正在楼上一勺一勺地往下浇水。她心里一动，从后面轻轻地把他抱住。</p>
<p>　</p>
<p><strong>婚姻是需要一点情趣的，它就犹如沙漠中的一片绿洲，让我们疲劳的眼睛感到希望和美，适当地给&#8220;左手&#8221;和&#8220;右手&#8221;一种新鲜的感觉吧。</strong></p>
<p><strong>4.最后的旅行</strong></p>
<p>他是个搞设计的工程师，她是中学毕业班的班任老师，两人都错过了恋爱的最佳季节，后来经人介绍而相识。没有惊天动地的过程，平平淡淡地相处，自自然然地结婚。</p>
<p>　</p>
<p>婚后第三天，他就跑到单位加班，为了赶设计，他甚至可以彻夜拼命，连续几天几夜不回家。她忙于毕业班的管理，经常晚归。为了各自的事业，他们就像两个陀螺，在各自的轨道上高速旋转着。</p>
<p>　</p>
<p>送走了毕业班，清闲了的她开始重新审视自己的生活，审视自己的婚姻，她开始迷茫，不知道自己在他心里有多重，她似乎不记得他说过爱他。一天，她问他是不是爱她，他说当然爱，不然怎么会结婚，她问他怎么不说爱，他说不知道怎么说。她拿出写好的离婚协议，他愣了，说，那我们去旅游吧，结婚的蜜月我都没陪你，我亏欠你太多。</p>
<p>　</p>
<p>他们去了奇峰异石的张家界。飘雨的天气和他们阴郁的心情一样，走在盘旋的山道上，她发现他总是走在外侧，她问他为什么，他说路太滑，他怕外侧的栅栏不牢，怕她万一不小心跌倒。她的心忽然感到了温暖，回家就把那份离婚协议撕掉了。</p>
<p>　</p>
<p><strong>很多时候，爱是埋在心底的，尤其是婚姻进行中的爱，平平淡淡，说不出来，但是真实存在。</strong></p>
<p><strong>5.晾晒的萝卜干</strong></p>
<p>　</p>
<p>楼下住着一对老夫妻，男的是离休的处级干部，女的退休前是一家大医院的主任医师，他们的两个孩子，一个是某局里的中层干部，一个在国外读书。</p>
<p>　</p>
<p>入秋的一个傍晚，我看见那老夫人在翻晒萝卜，我很奇怪，像她这样的家庭，还用自己淹菜吃吗？我问她，张阿姨，你家还淹咸菜吗？那老夫人很有丰韵，笑起来一脸的幸福，她说你王伯就爱吃我做的萝卜咸菜，吃了一辈子都不腻，过去工作再忙，都要给他晾菜，何况现在退休了，有多是时间。</p>
<p>望着翻菜的老人，忽然就想起林语堂先生的名言：爱一个人，从他肚子起。对那些走过几十载风风雨雨的婚姻来说，爱可能真的就落在碗里，落在&#8220;萝卜干&#8221;上了。</p>
<p><strong>不是每份爱都是惊天动地的，实实在在，朴实无华是婚姻的一种境界。</strong></p>
<p><strong>6.身边的风景</strong></p>
<p>　</p>
<p>和许多家庭一样，他们曾经那么热烈地相爱过，但是随着岁月的流失，他开始变得冷漠了，大概就是人们常说的&#8220;审美疲劳&#8221;吧，激情越来越少，心开始了漂移。</p>
<p>　</p>
<p>他开始上网，聊QQ，在虚拟中寻找新鲜的感觉。一日，他在一个网站看到一个署名&#8220;飘落的枫叶&#8221;所写的短文，写的是一个女子对婚姻对生活的失望。那优美的文字和文字间流溢的淡淡忧伤，深深打动了他。他不明白，一个感情这样细腻、丰富的女子，她的丈夫怎会不知道珍惜？他禁不住翻阅了那女子的注册资料，却发现那注册的信箱竟是妻子的姓名全拼，他猛地释然了，妻子的名字不正是&#8220;枫&#8221;吗，自己怎么就忘了，妻子曾是大学里的文学社团主席呢，只是婚姻让她淡忘了许多爱好。</p>
<p>　</p>
<p>他走进厨房，用手从后面环住妻子的腰：我们吃完饭出去散步吧。妻子肩头微微一颤：太阳从西边出来了？你不上网了？他转过妻子的身，看着那其实很好看的脸说，我以后天天陪你散步。</p>
<p><strong>&#8220;不识庐山真面目，只缘身在此山中&#8221;，人们常说身边没有风景，其实风景往往就在你身边。</strong></p>
<p><strong>7.温顺的丈夫</strong></p>
<p>他和她都是小工人，薪水不高，但是足够生活。丈夫很普通，妻子却很漂亮，也很伶俐。</p>
<p>因为彼此都很有时间，他们每个月或是出去看场电影，或是去逛逛公园，间或出去吃顿晚餐。只要妻子想，丈夫就陪着。什么事都顺着妻子，只要妻子高兴，只要条件允许，从来不说半个&#8220;不&#8221;字，好像从来就没有自己的想法。一次，他们出去吃晚饭，妻子让丈夫点菜，丈夫说，点你爱吃的吧，妻子有点生气，你就没一点自己的主见！是不是有点窝囊！丈夫楞了，叹了口气：我只是一个普通的工人，不能给你宽敞的住房和漂亮汽车，我只想在自己&#8220;能&#8221;的范围内，给你最好的。</p>
<p><strong>世界上有卑微的男女，却没有卑微的爱情，爱她，就给她最好的，我想这也该算是婚姻的真谛吧。</strong></p>
<img src ="http://www.blogjava.net/szhswl/aggbug/232947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-10-07 16:43 <a href="http://www.blogjava.net/szhswl/articles/232947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>