ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国内精品在线播放,亚洲欧美综合,亚洲欧美激情另类校园http://www.aygfsteel.com/ilovezmh/archive/2007/07/07/128720.htmlž®ç¥ž®ç¥Fri, 06 Jul 2007 16:12:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/07/07/128720.htmlhttp://www.aygfsteel.com/ilovezmh/comments/128720.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/07/07/128720.html#Feedback7http://www.aygfsteel.com/ilovezmh/comments/commentRss/128720.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/128720.html阅读全文

ž®ç¥ 2007-07-07 00:12 发表评论
]]>
关于复选框的验证与jsp取å€?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121004.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Wed, 30 May 2007 14:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121004.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/121004.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121004.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/121004.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/121004.html</trackback:ping><description><![CDATA[今天做一个类似邮件的多选操作时用到了复选框åQŒæœ‰å…³éªŒè¯ä¸Žå–å€ég»¥å‰ä¹Ÿåšè¿‡åQŒè®°çš„不是很清楚了,今天弄清白了åQŒè®°å½•一下ã€?br><br><strong>表单如下åQ?br></strong><form name="form1" action="test.jsp" method="post" onsubmit="return checkData();"><br>   <input name="checkall1" type="checkbox" value="0" onClick="checkAllBox(this);"/>å…¨é€?lt;br><br>   <input name="answer" type="checkbox" value="a"/>A<br><br>   <input name="answer" type="checkbox" value="b"/>B<br><br>   <input name="answer" type="checkbox" value="c"/>C<br><br>   <input name="answer" type="checkbox" value="d"/>D<br><br>   <input name="answer" type="checkbox" value="e"/>E<br><br>   <input name="answer" type="checkbox" value="f"/>F<br><br></form><br><br><strong>全选及验证javascript如下åQ?/strong><br><script type="text/javascript"><br>function checkAllBox(obj){<br> var answer= document.getElementsByName("answer");<br> if(obj.checked==true){<br>  for(var i=0;i<answer.length;i++){<br>   answer[i].checked = true;<br>  }<br> }else{<br>  for(var i=0;i<answer.length;i++){<br>   answer[i].checked = false;<br>  }<br> }<br>}<br>function checkData(){ <br> var answer= document.getElementsByName("answer");<br> var flag = false;<br> for(var i=0;i<income.length;i++){<br>  if(income[i].checked == true){<br>   flag = true;<br>   break;<br>  }<br> }<br> if(!flag){<br>  alert("误‚‡³ž®‘选择一™å?);<br> }<br> return flag;<br>}<br></script><br><br><strong>test.jsp中取值如下:</strong><br>String[] answer= request.getParameterValues("answer");//˜q™é‡Œåªå–得了选中的项åQŒå¦‚果没有选中ä»ÖM½•一™å¹ï¼Œåˆ™äØ“null<br>if(answer!=null){<br>   for(String i:answer){<br>      System.out.println(i);<br>   }<br>}<br> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/121004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-05-30 22:04 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jspåŽÈ¼“å­?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121000.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Wed, 30 May 2007 13:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121000.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/121000.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121000.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/121000.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/121000.html</trackback:ping><description><![CDATA[写了˜q™ä¹ˆä¹…了jspåQŒæœ€å¸¸ç”¨çš„jsp头和åŽÈ¼“存代码要手写˜q˜ä¸€æ—¶è¿˜å†™ä¸å‡ºæ¥ã€‚。。留个记念了<br><%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"%><br><%@ page import="java.util.*"%><br><%<br> //remove cache<br> response.setHeader("Pragma","No-cache");<br> response.setHeader("Cache-Control","no-cache");<br> response.setDateHeader("Expires", 0);<br>%> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/121000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-05-30 21:48 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/05/30/121000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript学习½W”è®°(å…?åQï¼é”™è¯¯å¤„理http://www.aygfsteel.com/ilovezmh/archive/2007/04/25/113370.htmlž®ç¥ž®ç¥Tue, 24 Apr 2007 16:58:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/25/113370.htmlhttp://www.aygfsteel.com/ilovezmh/comments/113370.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/25/113370.html#Feedback1http://www.aygfsteel.com/ilovezmh/comments/commentRss/113370.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/113370.html1.onerror事äšg处理函数
onerror事äšg处理函数是第一个用来协助javascript处理错误的机制。页面上出现异常æ—Óž¼Œerror事äšg便在window对象上触发ã€?br>例如åQ?br>

<html>
    
<head>
        
<title>OnError Example</title>
        
<script type="text/javascript">
            window.onerror 
= function () {
                alert(
"An error occurred.");
            }
        
</script>
    
</head>
    
<body onload="nonExistentFunction()">
    
</body>
</html>
在这个例子中åQŒå°è¯•调用不存在的函数nonExistentFunction()æ—Óž¼Œž®×ƒ¼šå¼•发一个异常。这时会弹出警告框显½C?#8220;An error occurred.”不幸的是åQŒæµè§ˆå™¨çš„错误信息也昄¡¤ºå‡ºæ¥äº†ï¼Œè¦ä»Ž‹¹è§ˆå™¨ä¸­éšè—å®ƒï¼Œonerror事äšg处理函数必须˜q”回trueå€û|¼šå¦‚下
<html>
    
<head>
        
<title>OnError Example</title>
        
<script type="text/javascript">
            window.onerror 
= function () {
                alert(
"An error occurred.");
                
return true;
            }
        
</script>
    
</head>
    
<body onload="nonExistentFunction()">
    
</body>
</html>

2.取出错误信息
onerror事äšg处理函数提供了三¿Uä¿¡æ¯æ¥¼‹®å®šé”™è¯¯¼‹®åˆ‡çš„æ€§è´¨åQ?br>错误信息åQï¼å¯¹äºŽ¾l™å®šé”™è¯¯åQŒæµè§ˆå™¨ä¼šæ˜¾½CºåŒæ ïLš„信息ã€?br>URLåQï¼åœ¨å“ªä¸ªæ–‡ä»¶ä¸­å‘生了错误ã€?br>行号åQï¼¾l™å®šçš„URL中发生错误的行号ã€?br>
<html>
    
<head>
        
<title>OnError Example</title>
        
<script type="text/javascript">
            window.onerror 
= function (sMessage, sUrl, sLine) {
                alert(
"An error occurred:\n" + sMessage + "\nURL: " + sUrl + "\nLine Number: " + sLine);
                
return true;
            }
        
</script>
    
</head>
    
<body onload="nonExistentFunction()">
    
</body>
</html>

3.囑փè½½å…¥é”™è¯¯
囑փå¯¹è±¡ä¹Ÿæ”¯æŒonerror事äšg处理函数。当一个图像由于某¿UåŽŸå› æœªèƒ½æˆåŠŸè²å…¥æ—¶åQˆä¾‹å¦‚,文äšg不存在)åQŒerror事äšg便在˜q™ä¸ªå›‘Öƒä¸Šè§¦å‘ã€?br>
<html>
    
<head>
        
<title>Image Error Test</title>
    
</head>
    
<body>
        
<p>The image below attempts to load a file that doesn't exist.</p>
        
<img src="blue.gif" onerror="alert('An error occurred loading the image.')" />
    
</body>
</html>

与window对象的onerror事äšg处理函数不同åQŒimageçš„onerror事äšg处理函数没有ä»ÕdŠ¡å…³äºŽé¢å¤–ä¿¡æ¯çš„å‚æ•°ã€?br>
4.处理语法错误
onerror事äšg处理函数不仅可以处理异常åQŒå®ƒ˜q˜èƒ½å¤„理语法错误åQŒä¹Ÿåªæœ‰å®ƒæ‰èƒ½å¤„理ã€?br>
<html>
    
<head>
        
<title>OnError Example</title>
        
<script type="text/javascript">
            window.onerror 
= function (sMessage, sUrl, sLine) {
                alert(
"An error occurred:\n" + sMessage + "\nURL: " + sUrl + "\nLine Number: " + sLine);
                
return true;
            }
            alert(
"Syntax error.";
        
</script>
    
</head>
    
<body onload="nonExistentFunction()">
        
<p>The syntax error on this page comes <em>after</em> the <code>onerror</code>
        event handler is defined, so the custom dialog catches it.
</p>
        
<p><strong>Note:</strong> This may not work in newer browsers with tighter security restrictions.</p>
    
</body>
</html>

注:使用onerror事äšg处理函数的主要问题是åQŒå®ƒæ˜¯BOM的一部分åQŒæ‰€ä»¥ï¼Œæ²¡æœ‰ä»ÖM½•标准能控制它的行为。因此,不同的浏览器使用˜q™ä¸ªäº‹äšg处理函数处理错误的方式有明显的不同。例如,在IE中发生error事äšgæ—Óž¼Œæ­£å¸¸çš„代码会¾l§ç®‹æ‰§è¡ŒåQšæ‰€æœ‰çš„å˜é‡å’Œæ•°æ®éƒ½ä¿å­˜ä¸‹æ¥åQŒåƈ可能˜q‡onerror事äšg处理函数讉K—®ã€‚然而在Mozilla中,正常的代码执行都会结束,同时所有错误发生之前的变量和数据都被销毁。Safariå’ŒKonqueror不支持window对象上的onerror事äšg处理函数åQŒä½†æ˜¯å®ƒä»¬æ”¯æŒå›¾åƒä¸Šçš„onerror事äšg处理函数ã€?br>
5.try...catch语句
<html>
    
<head>
        
<title>Try Catch Example</title>
        
<script type="text/javascript">
                
try {
                    window.nonExistentFunction();
                    alert(
"Method completed.");
                } 
catch (exception) {
                    alert(
"An exception occurred.");
                } 
finally {
                    alert(
"End of try...catch test.");
                }
        
</script>
    
</head>
    
<body>
    
</body>
</html>

与java不同åQŒECMAScript标准在try...catch语句中指定只能有一个catch子句。因为javascript是弱¾cÕdž‹åQŒæ²¡åŠžæ³•æŒ‡æ˜Žcatch子句中的异常的特定类型。不½Ž¡é”™è¯¯æ˜¯ä»€ä¹ˆç±»åž‹ï¼Œéƒ½ç”±åŒä¸€ä¸ªcatch子句处理。Mozilla对其˜q›è¡Œäº†æ‰©å±•ï¼Œå¯äØ“try...catch语句æ·ÕdŠ å¤šä¸ªcatch子句。当然只有Mozilla才能使用˜q™ä¸ªå½¢å¼åQŒæ‰€ä»¥ä¸æŽ¨èä½¿ç”¨ã€?br>
(1)嵌套try...catch语句
<html>
    
<head>
        
<title>Try Catch Example</title>
        
<script type="text/javascript">
                
try {
                    eval(
"a ++ b");        //causes error
                } catch (oException) {
                    alert(
"An exception occurred.");
                    
try {
                        
var arrErrors = new Array(10000000000000000000000);  //causes error
                        arrErrors.push(exception);
                    } 
catch (oException2) {
                        alert(
"Another exception occurred.");
                    }
                } 
finally {
                    alert(
"All done.");
                }

        
</script>
    
</head>
    
<body>
    
</body>
</html>
(2)Error对象
¾cÖM¼¼äºŽjava有个用于抛出的基¾c»ExceptionåQŒjavascript有个Error基类用于抛出。Error对象有以下特性:
nameåQï¼è¡¨ç¤ºé”™è¯¯¾cÕdž‹çš„å­—½W¦ä¸²ã€?br>messageåQï¼å®žé™…的错误信息ã€?br>Error对象的名¿U°å¯¹è±¡å¯¹åº”于它的¾c?因䨓Error只是一个基¾c?åQŒå¯ä»¥æ˜¯ä»¥ä¸‹å€ég¹‹ä¸€åQ?br>
¾c?/td> 发生原因
EvalError 错误发生在eval()函数�/td>
RangeError æ•°å­—çš„å€ÆD¶…出javascript可表½Cºçš„范围
ReferenceError 使用了非法的引用
SyntaxError 在eval()函数调用中发生了语法错误。其他的语法错误由浏览器报告åQŒæ— æ³•通过try...catch语句处理
TypeError 变量的类型不是预期所需�/td>
URIError 在encodeURI()或者decodeURI()函数中发生了错误

Mozillaå’ŒIE都扩展了Erro对象以适应各自的需求。Mozilla提供一个fileNameç‰ÒŽ(gu¨©)€§æ¥è¡¨ç¤ºé”™è¯¯å‘生在哪一个文件中åQŒä»¥åŠä¸€ä¸ªstackç‰ÒŽ(gu¨©)€§ä»¥åŒ…含到错误发生时的调用堆æ ?IE提供了一个numberç‰ÒŽ(gu¨©)€§æ¥è¡¨ç¤ºé”™è¯¯ä»£å·ã€?br>(3)判断错误¾cÕdž‹
<html>
    
<head>
        
<title>Try Catch Example</title>
        
<script type="text/javascript">
                
try {
                    eval(
"a ++ b");        //causes SyntaxError
                } catch (oException) {
                    
if (oException.name == "SyntaxError") {      //或者if(oException instanceof SyntaxError)
                        alert(
"Syntax Error: " + oException.message);
                    } 
else {
                        alert(
"An unexpected error occurred: " + oException.message);
                    }
                }

        
</script>
    
</head>
    
<body>
    
</body>
</html>

(4)抛出异常
ECMAScript½W¬ä¸‰ç‰ˆè¿˜å¼•入了throw语句åQŒç”¨äºŽæœ‰ç›®çš„的抛出异常。语法如下:
throw error_object;      //error_object可以是字½W¦ä¸²ã€æ•°å­—、布?y¨­u)®”值或者是实际的对象ã€?br>
<html>
    
<head>
        
<title>Try Catch Example</title>
        
<script type="text/javascript">
                
function addTwoNumbers(a, b) {
                    
if (arguments.length < 2) {
                        
throw new Error("Two numbers are required.");
                    } 
else {
                        
return a + b;
                    }
                }
                
                
try {
                    result 
= addTwoNumbers(90);
                } 
catch (oException) {
                    alert(oException.message);      
//outputs "Two numbers are required."
                }

        
</script>
    
</head>
    
<body>
    
</body>
</html>

另个åQŒå› ä¸ºæµè§ˆå™¨ä¸ç”ŸæˆError对象åQˆå®ƒæ€ÀL˜¯ç”Ÿæˆä¸€ä¸ªè¾ƒ¾_„¡¡®çš„Error对象åQŒæ¯”如RangeErroråQ‰ï¼Œæ‰€ä»¥åŒºåˆ†æµè§ˆå™¨æŠ›å‡ºçš„错误和开发äh员抛出的错误很简单,使用前面的技术就行了åQ?br>try{
   result = addTwoNumber(90,parseInt(z));
}catch(oException){
   if(oException instanceof SyntaxError){
      alert("Syntax Error: "+oException.message);
   }else if(oException instanceof Error){
      alert(oException.message);
   }
}
注意‹‚€æŸ¥instanceof Error必须是if语句中的最后一个条ä»Óž¼Œå› äؓ所有其他的错误¾c»éƒ½¾l§æ‰¿äºŽå®ƒåQˆæ‰€ä»¥åœ¨‹‚€‹¹‹instanceof Erroræ—‰™ƒ½˜q”回trueåQ‰ã€?br>
所有的‹¹è§ˆå™¨éƒ½å¯ä»¥æŠ¥å‘Šå¼€å‘äh员抛出的错误åQŒä½†æ˜¯é”™è¯¯æ¶ˆæ¯çš„æ˜„¡¤ºæ–¹å¼å¯èƒ½æœ‰æ‰€ä¸åŒã€‚IE6只会在抛出Error对象æ—Óž¼Œæ‰æ˜¾½Cºé”™è¯¯ä¿¡æ?其他情况下,它就只显½CºException thrown and not caughtåQŒè€Œæ²¡æœ‰ä“Q何详¾l†å†…宏V€‚Mozilla则会报告Error:uncaught exception:然后调用所抛出的对象的toString()æ–ÒŽ(gu¨©)³•ã€?

ž®ç¥ 2007-04-25 00:58 发表评论
]]>
javascript学习½W”è®°(ä¸?åQï¼DOM基础http://www.aygfsteel.com/ilovezmh/archive/2007/04/24/113336.htmlž®ç¥ž®ç¥Tue, 24 Apr 2007 14:06:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/24/113336.htmlhttp://www.aygfsteel.com/ilovezmh/comments/113336.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/24/113336.html#Feedback4http://www.aygfsteel.com/ilovezmh/comments/commentRss/113336.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/113336.html1.节点(node)层次
DocumentåQï¼æœ€™å¶å±‚的节点,所有的其他节点都是附属于它的ã€?br>DocumentTypeåQï¼DTD引用åQˆä‹Éç”?lt;!DOCTYPE>语法åQ‰çš„对象表现形式åQŒå®ƒä¸èƒ½åŒ…含子节炏V€?br>DocumentFragmentåQï¼å¯ä»¥åƒDocument一æ äh¥ä¿å­˜å…¶ä»–节点ã€?br>ElementåQï¼è¡¨ç¤ºèµ·å§‹æ ‡ç­¾å’Œç»“束标½{¾ä¹‹é—´çš„内容åQŒä¾‹å¦?lt;tag></tab>或è€?lt;tag/>。这是唯一可以同时包含ç‰ÒŽ(gu¨©)€§å’Œå­èŠ‚ç‚¹çš„èŠ‚ç‚¹¾cÕdž‹ã€?br>AttråQï¼ä»£è¡¨ä¸€å¯¹ç‰¹æ€§åå’Œç‰¹æ€§å€¹{€‚这个节点类型不能包含子节点ã€?br>TextåQï¼ä»£è¡¨XML文档中的在è“vå§‹æ ‡½{‘Ö’Œ¾l“束标签之间åQŒæˆ–者CDataSection内包含的普通文本。这个节点类型不能包含子节点ã€?br>CDataSectionåQï¼<![CDATA[]]>的对象表现åŞ式。这个节点类型仅能包含文本节点Textä½œäØ“å­èŠ‚ç‚V€?br>EntityåQï¼è¡¨ç¤ºåœ¨DTD中的一个实体定义,例如<!ENTITY foo"foo">。这个节点类型不能包含子节点ã€?br>EntityReferenceåQï¼ä»£è¡¨ä¸€ä¸ªå®žä½“引用,例如&quot;。这个节点类型不能包含子节点ã€?br>ProcessingInstructionåQï¼ä»£è¡¨ä¸€ä¸ªPI。这个节点类型不能包含子节点ã€?br>CommentåQï¼ä»£è¡¨XML注释。这个节点不能包含子节点ã€?br>NotationåQï¼ä»£è¡¨åœ¨DTD中定义的记号。这个很ž®‘用到ã€?br>
Node接口定义了所有节点类型都包含的特性和æ–ÒŽ(gu¨©)³•ã€?br>
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• ¾cÕdž‹/˜q”回¾cÕdž‹ 说明
nodeName String 节点的名å­?æ ÒŽ(gu¨©)®èŠ‚ç‚¹çš„ç±»åž‹è€Œå®šä¹?/td>
nodeValue String 节点的å€?æ ÒŽ(gu¨©)®èŠ‚ç‚¹çš„ç±»åž‹è€Œå®šä¹?/td>
nodeType Number 节点的类型常量å€ég¹‹ä¸€
ownerDocument Document 指向˜q™ä¸ªèŠ‚ç‚¹æ‰€å±žçš„æ–‡æ¡£
firstChild Node 指向在childNodes列表中的½W¬ä¸€ä¸ªèŠ‚ç‚?/td>
lastChild Node 指向在childNodes列表中的最后一个节�/td>
childNodes NodeList 所有子节点的列�/td>
previousSibling Node 指向前一个兄弟节ç‚?如果˜q™ä¸ªèŠ‚ç‚¹ž®±æ˜¯½W¬ä¸€ä¸ªå…„弟节点,那么该å€égØ“null
nextSibling Node 指向后一个兄弟节ç‚?如果˜q™ä¸ªèŠ‚ç‚¹ž®±æ˜¯æœ€åŽä¸€ä¸ªå…„弟节点,那么该å€égØ“null
hasChildNodes() Boolean 当childNodes包含一个或多个节点æ—?˜q”回çœ?/td>
attributes NamedNodeMap 包含了代表一个元素的ç‰ÒŽ(gu¨©)€§çš„Attr对象;仅用于Element节点
appendChild(node) Node ž®†nodeæ·ÕdŠ åˆ°childNodes的末ž®?/td>
removeChild(node) Node 从childNodes中删除node
replaceChild(newnode,oldnode) Node ž®†childNodes中的oldnode替换成newnode
insertBefore(newnode,refnode) Node 在childNodes中的refnode之前插入newnodd

除节点外åQŒDOM˜q˜å®šä¹‰äº†ä¸€äº›åŠ©æ‰‹å¯¹è±¡ï¼Œå®ƒä»¬å¯ä»¥å’ŒèŠ‚ç‚¹ä¸€èµ·ä‹É用,但不是DOM文档必有的部分ã€?br>NodeListåQï¼èŠ‚ç‚¹æ•°ç»„åQŒæŒ‰ç…§æ•°å€ÆD¿›è¡Œçƒ¦å¼?用来表示和一个元素的子节炏V€?br>NamedNodeMapåQï¼åŒæ—¶ä½¿ç”¨æ•°å€¼å’Œåå­—˜q›è¡Œç´¢å¼•的节点表;用于表示元素ç‰ÒŽ(gu¨©)€§ã€?br>
2.讉K—®ç›¸å…³çš„节ç‚?br>下面的几节中考虑下面的HTML™åµé¢
<html>
    
<head>
        
<title>DOM Example</title>
    
</head>
    
<body>
        
<p>Hello World!</p>
        
<p>Isn't this exciting?</p>
        
<p>You're learning to use the DOM!</p>
    
</body>
</html>
要访é—?lt;html/>元素åQˆä½ åº”该明白˜q™æ˜¯è¯¥æ–‡ä»¶çš„document元素åQ‰ï¼Œä½ å¯ä»¥ä‹É用documentçš„documentElementç‰ÒŽ(gu¨©)€§ï¼š
var oHtml = document.documentElement;
现在变量oHtml包含一个表½C?lt;html/>çš„HTMLElement对象。如果你惛_–å¾?lt;head/>å’?lt;body/>元素åQŒä¸‹é¢çš„可以实现åQ?br>var oHead = oHtml.firstChild;
var oBody = oHtml.lastChild;
也可以ä‹É用childNodesç‰ÒŽ(gu¨©)€§æ¥å®ŒæˆåŒæ ·çš„工作。只需把它当成普通的javascript arrayåQŒä‹É用方括号标记åQ?br>var oHead = oHtml.childNodes[0];
var oBody = oHtml.childNodes[1];
注意æ–ÒŽ(gu¨©)‹¬åäh ‡è®°å…¶å®žæ˜¯NodeList在javascript中的½Ž€ä¾¿å®žçŽ°ã€‚å®žé™…ä¸Šæ­£å¼çš„ä»ŽchildNodes列表中获取子节点的方法是使用item()æ–ÒŽ(gu¨©)³•åQ?br>var oHead = oHtml.childNodes.item(0);
var oBody = oHtml.childNodes.item(1);
HTML DOM™åµå®šä¹‰äº†document.bodyä½œäØ“æŒ‡å‘<body/>元素的指针ã€?br>var oBody = ducument.body;
有了oHtml,oHeadå’ŒoBody˜q™ä¸‰ä¸ªå˜é‡ï¼Œž®±å¯ä»¥å°è¯•确定它们之间的关系åQ?br>alert(oHead.parentNode==oHtml);
alert(oBody.parentNode==oHtml);
alert(oBody.previousSibling==oHead);
alert(bHead.nextSibling==oBody);
alert(oHead.ownerDocument==document);
以上均outputs "true"�br>
3.处理ç‰ÒŽ(gu¨©)€?br>正如前面所提到的,即便Node接口已具有attributesæ–ÒŽ(gu¨©)³•åQŒä¸”已被所有类型的节点¾l§æ‰¿åQŒç„¶è€Œï¼Œåªæœ‰
Element节点才能有特性。Element节点的attributes属性其实是NameNodeMap,它提供一些用于访问和处理其内容的æ–ÒŽ(gu¨©)³•åQ?br>getNamedItem(name)åQï¼˜q”回nodename属性值等于name的节ç‚?
removeNamedItem(name)åQï¼åˆ é™¤nodename属性值等于name的节ç‚?
setNamedItem(node)åQï¼ž®†nodeæ·ÕdŠ åˆ°åˆ—è¡¨ä¸­åQŒæŒ‰å…¶nodeName属性进行烦å¼?
item(pos)åQï¼åƒNodeListä¸€æ øP¼Œ˜q”回在位¾|®pos的节ç‚?
注:误‚®°ä½è¿™äº›æ–¹æ³•都是返回一个Attr节点åQŒè€Œéžç‰ÒŽ(gu¨©)€§å€¹{€?br>
NamedNodeMap对象也有一个length属性来指示它所包含的节点的数量ã€?br>当NamedNodeMap用于表示ç‰ÒŽ(gu¨©)€§æ—¶åQŒå…¶ä¸­æ¯ä¸ªèŠ‚ç‚šwƒ½æ˜¯Attr节点åQŒè¿™çš„nodeName属性被讄¡½®ä¸ºç‰¹æ€§å¿UŽÍ¼Œè€ŒnodeValue属性被讄¡½®ä¸ºç‰¹æ€§çš„倹{€‚例如,假设有这样一个元素:
<p style="color:red" id="p1">Hello world!</p>
同时åQŒå‡è®‘֏˜é‡oP包含指向˜q™ä¸ªå…ƒç´ çš„一个引用。于是可以这栯‚®¿é—®idç‰ÒŽ(gu¨©)€§çš„å€?
var sId = oP.attributes.getNamedItem("id").nodeValue;
当然åQŒè¿˜å¯ä»¥ç”¨æ•°å€¼æ–¹å¼è®¿é—®idç‰ÒŽ(gu¨©)€§ï¼Œä½†è¿™æ ïL¨å¾®æœ‰äº›ä¸ç›´è§‚åQ?br>var sId = oP.attributes.item(1).nodeValue;
˜q˜å¯ä»¥é€šè¿‡¾l™nodeValue属性赋新值来改变idç‰ÒŽ(gu¨©)€§ï¼š
oP.attributes.getNamedItem("id").nodeValue="newId";
Attr节点也有一个完全等同于(同时也完全同步于)nodeValue属性的value属性,òq¶ä¸”有name属性和nodeName属性保持同步。我们可以随意ä‹É用这些属性来修改或变更特性ã€?br>因䨓˜q™ä¸ªæ–ÒŽ(gu¨©)³•有些累赘åQŒDOM又定义了三个元素æ–ÒŽ(gu¨©)³•来帮助访问特性:
getAttribute(name)åQï¼½{‰äºŽattributes.getNamedItem(name).value;
setAttribute(name,newvalue)åQï¼½{‰äºŽattribute.getNamedItem(name).value=newvalue;
removeAttribute(name)åQï¼½{‰äºŽattribute.removeNamedItem(name)ã€?br>
4.讉K—®æŒ‡å®šèŠ‚ç‚¹
(1)getElementsByTagName()
核心(XML) DOM定义了getElementsByTagName()æ–ÒŽ(gu¨©)³•åQŒç”¨æ¥è¿”回一个包含所有的tagName(标签å?ç‰ÒŽ(gu¨©)€§ç­‰äºŽæŸä¸ªæŒ‡å®šå€¼çš„元素的NodeList。在Element对象中,tagNameç‰ÒŽ(gu¨©)€§æ€ÀL˜¯½{‰äºŽž®äºŽå·ä¹‹åŽç´§è·Ÿéšçš„名¿UŽÍ¼åQä¾‹å¦‚,<img />çš„tagNameæ˜?img"。下一行代码返回文档中所æœ?lt;img />元素的列表:
var oImgs = document.getElementsByTagName("img");
把所有图形都存于oImgs后,只需使用æ–ÒŽ(gu¨©)‹¬åähˆ–者Item()æ–ÒŽ(gu¨©)³•åQˆgetElementsByTagName()˜q”回一个和childNodes一æ ïLš„NodeListåQ‰ï¼Œž®±å¯ä»¥åƒè®‰K—®å­èŠ‚ç‚šw‚£æ ·é€ä¸ªè®‰K—®˜q™äº›èŠ‚ç‚¹äº†ï¼š
alert(oImgs[0].tagName);      //outputs "IMG"
假如只想获取在某个页面第一个段落的所有图像,可以通过对第一个段落元素调用getElementsByTagName()æ¥å®Œæˆï¼Œåƒè¿™æ øP¼š
var oPs = document.getElementByTagName("p");
var oImgsInp = oPs[0].getElementByTagName("img");
可以使用一个星åïLš„æ–ÒŽ(gu¨©)³•来获取document中的所有元素:
var oAllElements = document.getElementsByTagName("*");
当参数是一个星åïLš„æ—¶å€™ï¼ŒIE6.0òq¶ä¸˜q”回所有的元素。必™åÖM‹É用document.all来替代它ã€?br>(2)getElementsByName()
HTML DOM 定义了getElementsByName()åQŒè¿™ç”¨æ¥èŽ·å–æ‰€æœ‰nameç‰ÒŽ(gu¨©)€§ç­‰äºŽæŒ‡å®šå€¼çš„元素的ã€?br>(3)getElementById()
˜q™æ˜¯HTML DOM定义的第二种æ–ÒŽ(gu¨©)³•åQŒå®ƒ?y¨­u)®†è¿”回idç‰ÒŽ(gu¨©)€§ç­‰äºŽæŒ‡å®šå€¼çš„元素。在HTML中,idç‰ÒŽ(gu¨©)€§æ˜¯å”¯ä¸€çš„-åQè¿™æ„å‘³ç€æ²¡æœ‰ä¸¤ä¸ªå…ƒç´ å¯ä»¥å…׃ín同一个id。毫无疑问这是从文档树中获取单个指定元素最快的æ–ÒŽ(gu¨©)³•ã€?br>注:如果¾l™å®šçš„ID匚w…æŸä¸ªå…ƒç´ çš„nameç‰ÒŽ(gu¨©)€§ï¼ŒIE6.0˜q˜ä¼š˜q”回˜q™ä¸ªå…ƒç´ ã€‚这是一个bugåQŒä¹Ÿæ˜¯å¿…™å»éžå¸¸å°å¿ƒçš„一个问题ã€?br>
5.创徏新节ç‚?br>最常用到的几个æ–ÒŽ(gu¨©)³•æ˜?br>createDocumentFragment()åQï¼åˆ›å¾æ–‡æ¡£¼„Žç‰‡èŠ‚ç‚¹
createElement(tagname)åQï¼åˆ›å¾æ ‡ç­¾åäØ“tagname的元ç´?br>createTextNode(text)åQï¼åˆ›å¾åŒ…含文本text的文本节ç‚?br>
createElement()、createTextNode()、appendChild()
<html>
    
<head>
        
<title>createElement() Example</title>
        
<script type="text/javascript">
            
function createMessage() {
                
var oP = document.createElement("p");
                
var oText = document.createTextNode("Hello World!");
                oP.appendChild(oText);
                document.body.appendChild(oP);
            }
        
</script>
    
</head>
    
<body onload="createMessage()">
    
</body>
</html>

removeChild()、replaceChild()、insertBefore()
删除节点
<html>
    
<head>
        
<title>removeChild() Example</title>
        
<script type="text/javascript">
            
function removeMessage() {
                
var oP = document.body.getElementsByTagName("p")[0];
                oP.parentNode.removeChild(oP);
            }
        
</script>
    
</head>
    
<body onload="removeMessage()">
        
<p>Hello World!</p>
    
</body>
</html>
替换
<html>
    
<head>
        
<title>replaceChild() Example</title>
        
<script type="text/javascript">
            
function replaceMessage() {
                
var oNewP = document.createElement("p");
                
var oText = document.createTextNode("Hello Universe!");
                oNewP.appendChild(oText);
                
var oOldP = document.body.getElementsByTagName("p")[0];
                oOldP.parentNode.replaceChild(oNewP, oOldP);
            }
        
</script>
    
</head>
    
<body onload="replaceMessage()">
        
<p>Hello World!</p>
    
</body>
</html>
新消息添加到旧消息之�br>
<html>
    
<head>
        
<title>insertBefore() Example</title>
        
<script type="text/javascript">
            
function insertMessage() {
                
var oNewP = document.createElement("p");
                
var oText = document.createTextNode("Hello Universe!");
                oNewP.appendChild(oText);
                
var oOldP = document.getElementsByTagName("p")[0];
                document.body.insertBefore(oNewP, oOldP);
            }
        
</script>
    
</head>
    
<body onload="insertMessage()">
        
<p>Hello World!</p>
    
</body>
</html>

createDocumentFragment()
一旦把节点æ·ÕdŠ åˆ°document.bodyåQˆæˆ–者它的后代节点)中,™åµé¢ž®×ƒ¼šæ›´æ–°òq¶åæ˜ å‡º˜q™ä¸ªå˜åŒ–。对于少量的更新åQŒè¿™æ˜¯å¾ˆå¥½çš„åQŒç„¶è€Œï¼Œå½“要向documentæ·ÕdŠ å¤§é‡æ•°æ®æ—Óž¼Œå¦‚果逐个æ·ÕdŠ ˜q™äº›å˜åЍåQŒè¿™ä¸ªè¿‡½E‹æœ‰å¯èƒ½ä¼šååˆ†ç¼“æ…¢ã€‚äØ“è§£å†³˜q™ä¸ªé—®é¢˜åQŒå¯ä»¥åˆ›å»ÞZ¸€ä¸ªæ–‡æ¡£ç¢Žç‰‡ï¼ŒæŠŠæ‰€æœ‰çš„æ–°èŠ‚ç‚šw™„加其上,然后把文档碎片的内容一‹Æ¡æ€§æ·»åŠ åˆ°document中,假如惛_ˆ›å»ºåä¸ªæ–°ŒDµè½ã€?br>
<html>
    
<head>
        
<title>insertBefore() Example</title>
        
<script type="text/javascript">
            
function addMessages() {
                
var arrText = ["first""second""third""fourth""fifth""sixth""seventh""eighth""ninth""tenth"];
                
                
var oFragment = document.createDocumentFragment();
                
                
for (var i=0; i < arrText.length; i++) {
                    
var oP = document.createElement("p");
                    
var oText = document.createTextNode(arrText[i]);
                    oP.appendChild(oText);
                    oFragment.appendChild(oP);
                }
                
                document.body.appendChild(oFragment);

            }
        
</script>
    
</head>
    
<body onload="addMessages()">

    
</body>
</html>

6.让特性像属性一æ ?br>大部分情况下åQŒHTML DOMå…ƒç´ ä¸­åŒ…å«çš„æ‰€æœ‰ç‰¹æ€§éƒ½æ˜¯å¯ä½œäØ“å±žæ€§ã€?br>假设有如下图像元素:
<img src = "mypicture.jpg" border=0 />
如果要ä‹É用核心的DOM来获取和讄¡½®srcå’Œborderç‰ÒŽ(gu¨©)€§ï¼Œé‚£ä¹ˆè¦ç”¨getAttribute()å’ŒsetAttribute()æ–ÒŽ(gu¨©)³•åQ?br>alert(oImg.getAttribute("src"));
alert(oImg.getAttribute("border"));
oImg.setAttribute("src","mypicture2.jpg");
oImg.setAttribute("border",1);
然而,使用HTML DOMåQŒå¯ä»¥ä‹É用同样名¿U°çš„属性来获取和设¾|®è¿™äº›å€û|¼š
alert(oImg.src);
alert(oImg.border);
oImg.src="mypicture2.jpg";
oImg.border ="1";
唯一的特性名和属性名不一æ ïLš„特例是class属性,它是用来指定应用于某个元素的一个CSS¾c»ï¼Œå› äØ“class在ECMAScript中是一个保留字åQŒåœ¨javascriptä¸­ï¼Œå®ƒä¸èƒ½è¢«ä½œäØ“å˜é‡åã€å±žæ€§åæˆ–éƒ½å‡½æ•°åã€‚äºŽæ˜¯ï¼Œç›¸åº”çš„å±žæ€§åž®±å˜æˆäº†className;
注:IE在setAttribute()上有很大的问题,最好尽可能使用属性�br>
7.tableæ–ÒŽ(gu¨©)³•
ä¸ÞZº†ååŠ©å»ºç«‹è¡¨æ ¼åQŒHTML DOM¾l?lt;table/>,<tbody/>å’?lt;tr/>½{‰å…ƒç´ æ·»åŠ äº†ä¸€äº›ç‰¹æ€§å’Œæ–ÒŽ(gu¨©)³•ã€?br>¾l?lt;table/>元素æ·ÕdŠ äº†ä»¥ä¸‹å†…å®¹ï¼š
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• 说明
caption 指向<caption/>元素òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td>
tBodies <tbody/>元素的集�/td>
tFoot 指向<tfoot/>元素åQˆå¦‚果存在)
tHead 指向<thead/>元素åQˆå¦‚果存在)
rows 表格中所有行的集�/td>
createTHead() 创徏<thead/>元素òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td>
createTFood() 创徏<tfoot/>元素òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td>
createCpation() 创徏<caption/>元素òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td>
deleteTHead() 删除<thead/>元素
deleteTFood() 删除<tfoot/>元素
deleteCaption() 删除<caption/>元素
deleteRow(position) 删除指定位置上的�/td>
insertRow(position) 在rows集合中的指定位置上插入一个新�/td>

<tbody/>元素æ·ÕdŠ äº†ä»¥ä¸‹å†…å®?br>
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• 说明
rows <tbody/>中所有行的集�/td>
deleteRow(position) 删除指定位置上的�/td>
insertRow(position) 在rows集合中的指定位置上插入一个新�/td>

<tr/>元素æ·ÕdŠ äº†ä»¥ä¸‹å†…å®?br>
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• 说明
cells <tr/>元素中所有的单元格的集合
deleteCell(postion) 删除¾l™å®šä½ç½®ä¸Šçš„单元æ ?/td>
insertCell(postion) 在cells集合的给点位¾|®ä¸Šæ’入一个新的单元格

8.遍历DOM
NodeIteratoråQŒTreeWalker
DOM Level2的功能,˜q™äº›åŠŸèƒ½åªæœ‰åœ¨Mozillaå’ŒKonqueror/Safari中才有,˜q™é‡Œž®×ƒ¸ä»‹ç»äº†ã€?br>

ž®ç¥ 2007-04-24 22:06 发表评论
]]>
javascript学习实践åQï¼æ–°æ‰‹ä¸Šèµ\åQï¼éªŒè¯è¡¨å•http://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111783.htmlž®ç¥ž®ç¥Wed, 18 Apr 2007 15:36:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111783.htmlhttp://www.aygfsteel.com/ilovezmh/comments/111783.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111783.html#Feedback2http://www.aygfsteel.com/ilovezmh/comments/commentRss/111783.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/111783.html˜q™å‡ å¤©å­¦ä¹ javascriptåQŒå°±åªåœ¨çœ‹ä¹¦åQŒéƒ½æ²¡æ€Žä¹ˆå®žè·µåQ?br>今天工作的时候要‹‚€éªŒè¡¨å•数据,属性N多,以前做的时候是å¯ÒŽ(gu¨©)¯ä¸ªå±žæ€§éƒ½å†™å››äº”句话来判断åQŒç±»ä¼?br>function checkData(){
   if(document.forms[0].username==""){
      alert("误‚¾“入用户名");
      document.forms[0].username.focus();
      return false;
   }
   return true;
}
关于˜q™ç§éªŒè¯çš„实用性暂且不谈,现在一般的验证早已不用˜q™ä¸ªäº†ã€?br>只是ä¸ÞZº†åœ¨å·¥ä½œä¸­å·å·æ‡’,写了个方便点的CheckUtilåQŒå¦‚ä¸?br>



其实也可以方便的æ ÒŽ(gu¨©)®éœ€è¦æ›´æ”ÒŽ(gu¨©)½Cºçš„æ–¹å¼ã€?

ž®ç¥ 2007-04-18 23:36 发表评论
]]>
javascript学习½W”è®°(å…?åQï¼èµ„æ–™http://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111435.htmlž®ç¥ž®ç¥Tue, 17 Apr 2007 16:50:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111435.htmlhttp://www.aygfsteel.com/ilovezmh/comments/111435.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111435.html#Feedback4http://www.aygfsteel.com/ilovezmh/comments/commentRss/111435.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/111435.html把整个文档放在这里算了,到时候需要再找ã€?br>重要的地方再记录下了ã€?br>æ³¨ï¼šæœ¬èµ„æ–™äØ“ã€Šjavascript高çñ”½E‹åºè®¾è®¡ã€‹ä¸€ä¹¦é…å¥—源代码。学习笔è®îC¹Ÿä»Žæœ¬ä¹¦æ‘˜å½•ã€?br>
源代码下�/a>

ž®ç¥ 2007-04-18 00:50 发表评论
]]>
javascript学习½W”è®°(äº?åQï¼äº‹äšghttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111430.htmlž®ç¥ž®ç¥Tue, 17 Apr 2007 16:18:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111430.htmlhttp://www.aygfsteel.com/ilovezmh/comments/111430.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111430.html#Feedback2http://www.aygfsteel.com/ilovezmh/comments/commentRss/111430.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/111430.htmlvar EventUtil = new Object;
EventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) {
    if (oTarget.addEventListener) {
        oTarget.addEventListener(sEventType, fnHandler, false);
    } else if (oTarget.attachEvent) {
        oTarget.attachEvent("on" + sEventType, fnHandler);
    } else {
        oTarget["on" + sEventType] = fnHandler;
    }
};
       
EventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {
    if (oTarget.removeEventListener) {
        oTarget.removeEventListener(sEventType, fnHandler, false);
    } else if (oTarget.detachEvent) {
        oTarget.detachEvent("on" + sEventType, fnHandler);
    } else {
        oTarget["on" + sEventType] = null;
    }
};

EventUtil.formatEvent = function (oEvent) {
    if (isIE && isWin) {
        oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
        oEvent.eventPhase = 2;
        oEvent.isChar = (oEvent.charCode > 0);
        oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
        oEvent.pageY = oEvent.clientY + document.body.scrollTop;
        oEvent.preventDefault = function () {
            this.returnValue = false;
        };

        if (oEvent.type == "mouseout") {
            oEvent.relatedTarget = oEvent.toElement;
        } else if (oEvent.type == "mouseover") {
            oEvent.relatedTarget = oEvent.fromElement;
        }

        oEvent.stopPropagation = function () {
            this.cancelBubble = true;
        };

        oEvent.target = oEvent.srcElement;
        oEvent.time = (new Date).getTime();
    }
    return oEvent;
};

EventUtil.getEvent = function() {
    if (window.event) {
        return this.formatEvent(window.event);
    } else {
        return EventUtil.getEvent.caller.arguments[0];
    }
};



ž®ç¥ 2007-04-18 00:18 发表评论
]]>
javascript学习½W”è®°(å›?åQï¼‹‚€‹¹‹æµè§ˆå™¨å’Œæ“ä½œç³»¾l?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111429.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Tue, 17 Apr 2007 16:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111429.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/111429.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111429.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/111429.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/111429.html</trackback:ping><description><![CDATA[<p>var sUserAgent = navigator.userAgent;<br>var fAppVersion = parseFloat(navigator.appVersion);</p> <p>function compareVersions(sVersion1, sVersion2) {</p> <p>    var aVersion1 = sVersion1.split(".");<br>    var aVersion2 = sVersion2.split(".");<br>    <br>    if (aVersion1.length > aVersion2.length) {<br>        for (var i=0; i < aVersion1.length - aVersion2.length; i++) {<br>            aVersion2.push("0");<br>        }<br>    } else if (aVersion1.length < aVersion2.length) {<br>        for (var i=0; i < aVersion2.length - aVersion1.length; i++) {<br>            aVersion1.push("0");<br>        }    <br>    }<br>    <br>    for (var i=0; i < aVersion1.length; i++) {<br> <br>        if (aVersion1[i] < aVersion2[i]) {<br>            return -1;<br>        } else if (aVersion1[i] > aVersion2[i]) {<br>            return 1;<br>        }    <br>    }<br>    <br>    return 0;</p> <p>}</p> <p>var isOpera = sUserAgent.indexOf("Opera") > -1;<br>var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;</p> <p>if (isOpera) {<br>    var fOperaVersion;<br>    if(navigator.appName == "Opera") {<br>        fOperaVersion = fAppVersion;<br>    } else {<br>        var reOperaVersion = new RegExp("Opera (\\d+\\.\\d+)");<br>        reOperaVersion.test(sUserAgent);<br>        fOperaVersion = parseFloat(RegExp["$1"]);<br>    }</p> <p>    isMinOpera4 = fOperaVersion >= 4;<br>    isMinOpera5 = fOperaVersion >= 5;<br>    isMinOpera6 = fOperaVersion >= 6;<br>    isMinOpera7 = fOperaVersion >= 7;<br>    isMinOpera7_5 = fOperaVersion >= 7.5;<br>}</p> <p>var isKHTML = sUserAgent.indexOf("KHTML") > -1 <br>              || sUserAgent.indexOf("Konqueror") > -1 <br>              || sUserAgent.indexOf("AppleWebKit") > -1; <br>              <br>var isMinSafari1 = isMinSafari1_2 = false;<br>var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;</p> <p>if (isKHTML) {<br>    isSafari = sUserAgent.indexOf("AppleWebKit") > -1;<br>    isKonq = sUserAgent.indexOf("Konqueror") > -1;</p> <p>    if (isSafari) {<br>        var reAppleWebKit = new RegExp("AppleWebKit\\/(\\d+(?:\\.\\d*)?)");<br>        reAppleWebKit.test(sUserAgent);<br>        var fAppleWebKitVersion = parseFloat(RegExp["$1"]);</p> <p>        isMinSafari1 = fAppleWebKitVersion >= 85;<br>        isMinSafari1_2 = fAppleWebKitVersion >= 124;<br>    } else if (isKonq) {</p> <p>        var reKonq = new RegExp("Konqueror\\/(\\d+(?:\\.\\d+(?:\\.\\d)?)?)");<br>        reKonq.test(sUserAgent);<br>        isMinKonq2_2 = compareVersions(RegExp["$1"], "2.2") >= 0;<br>        isMinKonq3 = compareVersions(RegExp["$1"], "3.0") >= 0;<br>        isMinKonq3_1 = compareVersions(RegExp["$1"], "3.1") >= 0;<br>        isMinKonq3_2 = compareVersions(RegExp["$1"], "3.2") >= 0;<br>    } <br>    <br>}</p> <p>var isIE = sUserAgent.indexOf("compatible") > -1 <br>           && sUserAgent.indexOf("MSIE") > -1<br>           && !isOpera;<br>           <br>var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;</p> <p>if (isIE) {<br>    var reIE = new RegExp("MSIE (\\d+\\.\\d+);");<br>    reIE.test(sUserAgent);<br>    var fIEVersion = parseFloat(RegExp["$1"]);</p> <p>    isMinIE4 = fIEVersion >= 4;<br>    isMinIE5 = fIEVersion >= 5;<br>    isMinIE5_5 = fIEVersion >= 5.5;<br>    isMinIE6 = fIEVersion >= 6.0;<br>}</p> <p>var isMoz = sUserAgent.indexOf("Gecko") > -1<br>            && !isKHTML;</p> <p>var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;</p> <p>if (isMoz) {<br>    var reMoz = new RegExp("rv:(\\d+\\.\\d+(?:\\.\\d+)?)");<br>    reMoz.test(sUserAgent);<br>    isMinMoz1 = compareVersions(RegExp["$1"], "1.0") >= 0;<br>    isMinMoz1_4 = compareVersions(RegExp["$1"], "1.4") >= 0;<br>    isMinMoz1_5 = compareVersions(RegExp["$1"], "1.5") >= 0;<br>}</p> <p>var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML <br>            && (sUserAgent.indexOf("Mozilla") == 0) <br>            && (navigator.appName == "Netscape") <br>            && (fAppVersion >= 4.0 && fAppVersion < 5.0);</p> <p>var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;</p> <p>if (isNS4) {<br>    isMinNS4 = true;<br>    isMinNS4_5 = fAppVersion >= 4.5;<br>    isMinNS4_7 = fAppVersion >= 4.7;<br>    isMinNS4_8 = fAppVersion >= 4.8;<br>}</p> <p>var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");<br>var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") <br>            || (navigator.platform == "Macintosh");</p> <p>var isUnix = (navigator.platform == "X11") && !isWin && !isMac;</p> <p>var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;<br>var isMac68K = isMacPPC = false;<br>var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;</p> <p>if (isWin) {<br>    isWin95 = sUserAgent.indexOf("Win95") > -1 <br>              || sUserAgent.indexOf("Windows 95") > -1;<br>    isWin98 = sUserAgent.indexOf("Win98") > -1 <br>              || sUserAgent.indexOf("Windows 98") > -1;<br>    isWinME = sUserAgent.indexOf("Win 9x 4.90") > -1 <br>              || sUserAgent.indexOf("Windows ME") > -1;<br>    isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 <br>              || sUserAgent.indexOf("Windows 2000") > -1;<br>    isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 <br>              || sUserAgent.indexOf("Windows XP") > -1;<br>    isWinNT4 = sUserAgent.indexOf("WinNT") > -1 <br>              || sUserAgent.indexOf("Windows NT") > -1 <br>              || sUserAgent.indexOf("WinNT4.0") > -1 <br>              || sUserAgent.indexOf("Windows NT 4.0") > -1 <br>              && (!isWinME && !isWin2K && !isWinXP);<br>} </p> <p>if (isMac) {<br>    isMac68K = sUserAgent.indexOf("Mac_68000") > -1 <br>               || sUserAgent.indexOf("68K") > -1;<br>    isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 <br>               || sUserAgent.indexOf("PPC") > -1;  <br>}</p> <p>if (isUnix) {<br>    isSunOS = sUserAgent.indexOf("SunOS") > -1;</p> <p>    if (isSunOS) {<br>        var reSunOS = new RegExp("SunOS (\\d+\\.\\d+(?:\\.\\d+)?)");<br>        reSunOS.test(sUserAgent);<br>        isMinSunOS4 = compareVersions(RegExp["$1"], "4.0") >= 0;<br>        isMinSunOS5 = compareVersions(RegExp["$1"], "5.0") >= 0;<br>        isMinSunOS5_5 = compareVersions(RegExp["$1"], "5.5") >= 0;<br>    }<br>}<br></p> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/111429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-04-18 00:13 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/04/18/111429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript学习½W”è®°(ä¸?åQï¼æ­£åˆ™è¡¨è¾¾å¼?http://www.aygfsteel.com/ilovezmh/archive/2007/04/17/111120.htmlž®ç¥ž®ç¥Mon, 16 Apr 2007 16:45:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/17/111120.htmlhttp://www.aygfsteel.com/ilovezmh/comments/111120.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/17/111120.html#Feedback7http://www.aygfsteel.com/ilovezmh/comments/commentRss/111120.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/111120.html1.元字½W?br>˜q™é‡Œæ˜¯æ­£åˆ™è¡¨è¾‘Ö¼ç”¨åˆ°çš„æ‰€æœ‰å…ƒå­—符
(  [  {  \  ^  $  |  )  ?  *  +  .
ä»ÖM½•时候要在正则表辑ּä¸­ä‹É用这些元字符åQŒéƒ½å¿…须对它们进行è{义。因此要匚w…ä¸€ä¸ªé—®åøP¼Œæ­£åˆ™è¡¨è¾¾å¼å°±è¯¥è¿™æ ¯‚¡¨½Cºï¼š
var veQMark =/\?/;
或者这栯‚¡¨½Cºï¼š
var veQMark=new RegExp("\\?");
注意当正则表辑ּä»¥ç¬¬äºŒç§å½¢å¼è¡¨ç¤ºæ—Óž¼Œæ‰€æœ‰çš„åæ–œæ éƒ½å¿…é¡»ç”¨ä¸¤ä¸ªåæ–œæ æ¥æ›¿æ¢ï¼Œå› äØ“javascript字符串解析器会按照\n的方式尝试翻译\?ã€‚äØ“äº†ä¿è¯ä¸ä¼šå‡ºçŽ°è¿™ä¸ªé—®é¢˜ï¼Œåœ¨å…ƒå­—ç¬¦çš„å‰é¢åŠ ä¸Šä¸¤ä¸ªåæ–œæ åQˆåŒé‡è{义)。这个小ž®çš„gotchaž®±æ˜¯å¤šæ•°å¼€å‘者更偏好使用字面量语法的原因ã€?br>
2.使用ç‰ÒŽ(gu¨©)®Šå­—符
要ä‹É用ASCII来表½CÞZ¸€ä¸ªå­—½W¦ï¼Œåˆ™å¿…™åÀLŒ‡å®šä¸€ä¸ªä¸¤ä½çš„十六˜q›åˆ¶ä»£ç åQŒåƈ有前面加上\x。例如字½W¦bçš„ASCIIç äØ“98åQŒç­‰äºŽåå…­è¿›åˆ¶çš„62åQŒå› æ­¤ï¼Œè¡¨ç¤ºå­—符b可以使用\x62
另外也可以ä‹É用八˜q›åˆ¶ä»£æ›¿åå…­˜q›åˆ¶æ¥æŒ‡å®šå­—½W¦ä»£ç ï¼Œç›´æŽ¥åœ¨åæ–œæ ä¹‹åŽè·Ÿä¸Šå…«è¿›åˆ¶æ•°å€û|¼Œä¾‹å¦‚åQŒb½{‰äºŽå…«è¿›åˆ¶çš„142åQŒæ‰€ä»¥ä¸‹é¢å°±è¯¥è¿™æ ?br>/\142/
如果要ä‹É用Unicode来表½Cºå­—½W¦ï¼Œå¿…须指定字符串的四位十六˜q›åˆ¶è¡¨ç¤ºå½¢å¼åQŒå› æ­¤b应该是\u0062
另外˜q˜æœ‰å…¶ä»–一些预定义的特ŒDŠå­—½W¦ï¼Œå¦‚下表所åˆ?br>
字符 描述
\t 制表½W?/td>
\n 换行½W?/td>
\r 回èžR½W?/td>
\f 换页½W?/td>
\a alert字符
\e escape字符
\cx 与X相对应的控制字符
\b 回退字符
\v 垂直制表½W?/td>
\0 ½Iºå­—½W?/td>

3.字符¾c?br>3.1½Ž€å•ç±»
假设相匹é…?bat","cat","fat"。ä‹É用简单类可以很方便的解决˜q™ä¸ªé—®é¢˜
/[bcf]at/gi
后面的g表示全匹配,i表示不区分大ž®å†™ã€?br>3.2负向¾c?br>要匹配除了aå’Œb的所有字½W¦ï¼Œé‚£ä¹ˆ˜q™ä¸ªå­—符ž®±æ˜¯[^ab]
3.3范围¾c?br>[a-z]
[A-Z]
[0-9]
[^1-4]
3.4¾l„合¾c?br>匚w…æ‰€æœ‰ä»Ža~m的字母以及从1~4的数字,以及一个换行符
[a-m1-4\n]
3.5预定义类
代码 ½{‰åŒäº?/td> 匚w…
. [^\n\r] 除了换行和回车之外的ä»ÀL„å­—符
\d [0-9] æ•°å­—
\D [^0-9] 非数字字½W?/td>
\s [\t\n\x0B\f\r] ½Iºç™½å­—符
\S [^\t\n\x0B\f\r] 非空白字½W?/td>
\w [a-zA-Z_0-9] 单词字符åQˆæ‰€æœ‰å­—母,所有的数字和下划线åQ?/td>
\W [^a-zA-Z_0-9] 非单词字½W?/td>

4.量词
4.1½Ž€å•量è¯?br>
代码 描述
? 出现零次或一‹Æ?/td>
* 出现零次或多‹Æ?/td>
+ 出现一‹Æ¡æˆ–多次åQˆè‡³ž®‘出çŽîC¸€‹Æ¡ï¼‰
{n} 一定出现n‹Æ?/td>
{n,m} 臛_°‘出现n‹Æ¡ä½†ä¸è¶…˜q‡m‹Æ?/td>
{n,} 臛_°‘出现n‹Æ?/td>
4.2贪婪的、惰性的和支配性的量词
贪婪量词åQšå…ˆçœ‹æ•´ä¸ªçš„字符串是不是一个匹配,如果没有发现匚w…åQŒå®ƒåŽÀLŽ‰å­—ç¬¦ä¸²ä¸­çš„æœ€åŽä¸€ä¸ªå­—½W¦ï¼Œòq¶å†‹Æ¡å°è¯•。直到发çŽîC¸€ä¸ªåŒ¹é…å­—½W¦æˆ–者字½W¦ä¸²ä¸å‰©ä»ÖM½•字符ã€?br>惰性量词:先看字符串中的第一个字¾U¿æ˜¯ä¸æ˜¯ä¸€ä¸ªåŒ¹é…ã€‚如果单独这个字½W¦è¿˜ä¸å¤ŸåQŒå°±è¯Õd…¥ä¸‹ä¸€ä¸ªå­—½W¦ï¼Œ¾l„成两个字符的字½W¦ä¸²åQŒå¦‚果还是没有发现匹配,¾l§ç®‹æ·ÕdŠ å­—ä¼šç›´åˆ°å‘çŽ°ä¸€ä¸ªæˆ–è€…æ•´ä¸ªå­—½W¦éƒ½‹‚€æŸ¥è¿‡ä¹Ÿæ²¡æœ‰åŒ¹é…ã€‚其工作方式恰好与贪婪相反ã€?br>支配量词åQšåªž®è¯•匚w…æ•´ä¸ªå­—符丌Ӏ‚如果整个字½W¦ä¸²ä¸èƒ½äº§ç”ŸåŒšw…åQŒä¸åšè¿›ä¸€æ­¥å°è¯•ã€?br>表示æ–ÒŽ(gu¨©)³•如下è¡?br>
贪婪 惰�/td> 支配 描述
?   ?? ?+ 零次或一‹Æ¡å‡ºçŽ?/td>
* *? *+ 零次或多‹Æ¡å‡ºçŽ?/td>
+ +? ++ 一‹Æ¡æˆ–多次出现
{n} {n}? {n}+ 恰好n‹Æ¡å‡ºçŽ?/td>
{n,m} {n,m}? {n,m}+ 臛_°‘n‹Æ¡è‡³å¤šm‹Æ¡å‡ºçŽ?/td>
{n,} {n,}? {n,}+ 臛_°‘n‹Æ¡å‡ºçŽ?/td>


‹¹è§ˆå™¨å¯¹æ”¯é…é‡è¯çš„æ”¯æŒè¿˜å¾ˆä¸å®Œå–„。IEå’ŒOpera不支持,Mozillaž®†æ”¯é…é‡è¯çœ‹ä½œæ˜¯è´ªå©ªçš„ã€?br>
二、复杂模�br>1.分组
分组是通过一¾pÕdˆ—括号包围一¾pÕdˆ—字符、字½W¦ç±»ä»¥åŠé‡è¯æ¥ä‹É用的ã€?br>/dogdog/可ä‹É用分¾l„来重写æˆ?(dog){2}/
/([bd]ad?)*/匚w…é›¶ä¸ªå’Œå¤šä¸?ba","da","bad"æˆ?dad"
/(mom( and dad)?)/匚w…"mom" 或 "mom and dad"

2.反向引用
在表辑ּè®¡ç®—完成后还可以怎样利用分组åQŸæ¯ä¸ªåˆ†¾l„都被存攑֜¨ä¸€ä¸ªç‰¹ŒDŠçš„地方以备ž®†æ¥ä½¿ç”¨ã€‚这些存储在分组中的ç‰ÒŽ(gu¨©)®Šå€û|¼Œæˆ‘们¿UîC¹‹ä¸ºåå‘引用ã€?br>反向引用是按照从左到右遇到的左括号字½W¦çš„™åºåº˜q›è¡Œåˆ›å¾å’Œç¼–åïLš„。例如表辑ּ(A?(B?(C?)))ž®†äñ”生编号从1-3的三个反向引ç”?br>(1).(A?(B?(C?)))
(2).(B?(C?))
(3).(C?)
反向引用可以有几¿Uä¸åŒçš„使用æ–ÒŽ(gu¨©)³•ã€?br>首先åQŒä‹É用正则表辑ּå¯¹è±¡çš„test(),match()或search()æ–ÒŽ(gu¨©)³•后,反向引用的值可以从RegExp构造函æ•îC¸­èŽ·å¾—ã€‚ä¾‹
var sToMatch = "#123456789";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);      //outputs "123456789"
然后åQŒè¿˜å¯ä»¥ç›´æŽ¥åœ¨å®šä¹‰åˆ†¾l„的表达式中包含反向引用åQŒè¿™å¯ä»¥é€šè¿‡ä½¿ç”¨ç‰ÒŽ(gu¨©)®Šè½¬ä¹‰åºåˆ—如\1,\2½{‰ç­‰å®žçް
例如
var sToMatch = "dogdog";
var reDogDog = /(dog)\1/;
alert(reDogDog.test(sToMatch));      //outputs "true"
正则表达式reDogDog首先创徏单词dog的组åQŒç„¶åŽåˆè¢«ç‰¹ŒDŠè{义序列\1引用åQŒä‹É得这个正则表辑ּ½{‰åŒäº?dogdog/
½W¬ä¸‰åQŒåå‘引用可以用在String对象的replace()æ–ÒŽ(gu¨©)³•中,˜q™é€šè¿‡ä½¿ç”¨ç‰ÒŽ(gu¨©)®Šå­—符序列$1,$2½{‰ç­‰æ¥å®žçŽ°ã€‚ä¾‹å¦?br>var sToChange = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/
var sNew  = sToChange.replace(reMatch,"$2 $1");
alert(sNew);      //outputs "5678 1234"

3.候é€?br>有时候要构徏一个能够正¼‹®åŒ¹é…æƒ³å¾—到所有可能性的模式是十分困隄¡š„。如果要对同一个表辑ּåŒæ—¶åŒšw…"red"å’?break"时要怎么做呢åQŸè¿™äº›å•词完全没有相同的字符åQŒè¿™æ ·å°±è¦å†™ä¸¤ä¸ªä¸åŒçš„æ­£åˆ™è¡¨è¾‘Ö¼åQŒåƈ分别对两个字½W¦ä¸²˜q›è¡ŒåŒšw…åQŒåƒ˜q™æ ·åQ?br>var sToMatch1 = "red";
var sToMatch2 = "black";
var reRed = /red/;
var reBlack = /black/;
alert(reRed.test(sToMatch1)||reBlack.test(sToMatch1));      //outputs "true"
alert(reRed.test(sToMatch2)||reBlack.test(sToMatch2));      //outputs "true"
˜q™å®Œæˆäº†ä»ÕdŠ¡åQŒä½†æ˜¯ååˆ†å†—é•ѝ€‚还有另一¿Uæ–¹å¼å°±æ˜¯ä‹É用正则表辑ּçš„候选操作符。例åQ?br>var sToMatch1 = "red";
var sToMatch2 = "black";
var reRedOrBlack = /(red|black)/;
alert(reRedOrBlack.test(sToMatch1));      //outputs "true"
alert(reRedOrBlack.test(sToMatch2));      //outputs "true"

4.非捕èŽäh€§åˆ†¾l?br>创徏反向引用的分¾l„,我们¿UîC¹‹ä¸ºæ•èŽäh€§åˆ†¾l„。同时还有一¿Uéžæ•获性分¾l„,它不会创建反向引用。在较长的正则表辑ּä¸­ï¼Œå­˜å‚¨åå‘引用会降低匹配速度ã€?br>如果要创å»ÞZ¸€ä¸ªéžæ•获性分¾l„,只要在左括号的后面加上一个问号和一个紧跟的冒号åQ?br>var sToMatch = "#123456789";
var reNumbers = /#(?:\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);      //outputs ""

5.前瞻
有时候,可能希望åQŒå½“某个特定的字½W¦åˆ†¾l„出现在另一个字½W¦ä¸²ä¹‹å‰æ—Óž¼Œæ‰åŽ»æ•èŽ·å®ƒã€‚å¦‚æžœä‹Éç”?#8220;前瞻”ž®±å¯ä»¥è®©˜q™ä¸ª˜q‡ç¨‹å˜å¾—十分½Ž€å•ã€?br>前瞻åQŒå‘Šè¯‰æ­£åˆ™è¡¨è¾‘Ö¼˜qç®—器向前看一些字½W¦è€Œä¸¿UÕdŠ¨å…¶ä½¾|®ã€‚同样存在正向前çžÕd’Œè´Ÿå‘前瞻。正向前çžÀL£€æŸ¥çš„æ˜¯æŽ¥ä¸‹æ¥å‡ºçŽ°çš„æ˜¯ä¸æ˜¯æŸä¸ªç‰¹å®šå­—ç¬¦é›†ã€‚è€Œè´Ÿå‘å‰çžÕdˆ™æ˜¯æ£€æŸ¥æŽ¥ä¸‹æ¥çš„不应该出现的特定字½W¦é›†ã€?br>创徏正向前瞻要将模式攑֜¨(?=å’?之间。注意这不是分组åQŒè™½ç„¶å®ƒä¹Ÿç”¨åˆ°æ‹¬å—÷€?br>var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?=room)/;
alert(reBed.test(sToMatch1));      //outputs "true"
alert(RegExp.$1);      //outputs "bed"
alert(reBed.test(sToMatch2));      //outputs "false"
负向前瞻åQŒåˆ™è¦å°†æ¨¡å¼æ”‘Öœ¨(?!å’?之间ã€?br>var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?!room)/;
alert(reBed.test(sToMatch1));      //outputs "false"
alert(reBed.test(sToMatch2));      //outputs "true"
alert(RegExp.$1);      //outputs "bed"

6.边界
边界 用于正则表达式中表示模式的位¾|®ã€‚下表列å‡ÞZº†å‡ ç§å¯èƒ½çš„è¾¹ç•?br>
边界 描述
^ 行开�/td>
$ 行结ž®?/td>
\b 单词的边�/td>
\B 非单词的边界

假设æƒÏxŸ¥æ‰¾ä¸€ä¸ªå•词,但要它只出现在行ž®¾ï¼Œåˆ™å¯ä»¥ä‹É用美元符å?来表½Cºå®ƒåQ?br>var sToMatch = "Important word is the last one.";
var reLastWord = /(\w+).$/;
reLastWord.test(sToMatch);
alert(RegExp.$1);      //outputs "one"

7.多行模式
要指定多行模式,只要在正则表辑ּåŽé¢æ·ÕdŠ ä¸€ä¸ªm选项。这会让$边界匚w…æ¢è¡Œ½W?\n)以及字符串真正的¾l“å°¾ã€?br>var sToMatch = "First second\nthird fourth\nfifth sixth";
var reLastWordOnLine = /(\w+)$/gm;
var arrWords = sToMatch.match(reLastWordOnLine);
表达式返�second","fourth"�sixth"。若不指定多行模式,表达式将只返�sixth"�br>
二、RegExp对象
javascript中的每个正则表达式都是一个对象,同其他的对象一栗÷€?br>1.实例属æ€?br>globalåQï¼Booleanå€û|¼Œè¡¨ç¤ºg(全局选项)是否已设¾|®ã€?br>ignoreCaseåQï¼Booleanå€û|¼Œè¡¨ç¤ºi(忽略大小写选项)是否已设¾|®ã€?br>lastIndexåQï¼æ•´æ•°åQŒä»£è¡¨ä¸‹‹Æ¡åŒ¹é…å°†ä¼šä»Žå“ªä¸ªå­—符位置开å§?只有当ä‹É用exec()或test()函数才会填入åQŒå¦åˆ™äØ“0)ã€?br>multilineåQï¼Booleanå€û|¼Œè¡¨ç¤ºm(多行模式选项)是否已设¾|®ã€?br>sourceåQï¼æ­£åˆ™è¡¨è¾¾å¼çš„æºå­—½W¦ä¸²å½¢å¼ã€‚例如表辑ּ/[ba]*/çš„sourcež®†è¿”å›?[ba]*"ã€?br>
2.静态属�br>静态的RegExp属性对所有的正则表达式都有效�br>
长名 短名 描述
input $_ 最后用于匹配的字符ä¸?传递给exec()或test()的字½W¦ä¸²)
lastMatch $& 最后匹配的字符
lastParen $+ 最后匹配的分组
leftContext $` 在上‹Æ¡åŒ¹é…çš„前面的子ä¸?/td>
multiline $* 用于指定是否所有的表达式都使用多行模式的布?y¨­u)®”å€?/td>
rightContext $' 在上‹Æ¡åŒ¹é…ä¹‹åŽçš„子串

IEå’ŒOperaòq¶ä¸æ”¯æŒRegExp.multilineåQŒæ‰€ä»¥æœ€å¥½å•独的å¯ÒŽ(gu¨©)¯ä¸ªè¡¨è¾‘Ö¼è®„¡½®m选项而不要直接设¾|®è¿™ä¸ªæ ‡è®°ã€?/p>

ž®ç¥ 2007-04-17 00:45 发表评论
]]>
javascript学习½W”è®°(äº?åQï¼¾l§æ‰¿http://www.aygfsteel.com/ilovezmh/archive/2007/04/16/111106.htmlž®ç¥ž®ç¥Mon, 16 Apr 2007 15:24:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/16/111106.htmlhttp://www.aygfsteel.com/ilovezmh/comments/111106.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/16/111106.html#Feedback4http://www.aygfsteel.com/ilovezmh/comments/commentRss/111106.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/111106.html一、ç‘ô承的方式
1.对象冒充
function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

function ClassB(sColor, sName) {
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;
   
    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };   
}

var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
所有新的属性和新的æ–ÒŽ(gu¨©)³•都必™åÕdœ¨åˆ é™¤äº†æ–°æ–ÒŽ(gu¨©)³•的代码行后定义。否则,可能会覆盖超¾cȝš„相关属性和æ–ÒŽ(gu¨©)³•ã€?br>对象冒充可以支持多ç‘ôæ‰Ñ€?br>function ClassZ(){
   this.newMethod = ClassX;
   this.newMethod(sColor);
   delete this.newMethod;

   this.newMethod = ClassY;
   this.newMethod(sColor);
   delete this.newMethod;
}
˜q™é‡Œå­˜åœ¨ä¸€ä¸ªå¼Šç«¯ï¼Œå¦‚æžœClassXå’ŒClassYå…ähœ‰ç›¸åŒçš„属性或æ–ÒŽ(gu¨©)³•åQŒClassYå…ähœ‰é«˜ä¼˜å…ˆçñ”åQŒå› ä¸ºç‘ô承的是最后的¾c…R€?br>
2.call()æ–ÒŽ(gu¨©)³•
call()æ–ÒŽ(gu¨©)³•是与¾lå…¸çš„å¯¹è±¡å†’å……æ–¹æ³•æœ€ç›æ€¼¼çš„æ–¹æ³•,它的½W¬ä¸€ä¸ªå‚数用作this的对象,其他参数都直接传递函数自íw«ã€?br>function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();

3.apply()æ–ÒŽ(gu¨©)³•
apply()æ–ÒŽ(gu¨©)³•有两个参敎ͼŒç”¨ä½œthis的对象和要传递参数的数组。例如:
function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.apply(this, arguments);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();

当然åQŒåªæœ‰è¶…¾cÖM¸­çš„参数顺序与子类中的参数™åºåºå®Œå…¨ä¸€è‡´æ—¶æ‰å¯ä»¥ä¼ é€’参数对象。如果不是,ž®±å¿…™åÕdˆ›å»ÞZ¸€ä¸ªå•独的数组åQŒæŒ‰ç…§æ­£¼‹®çš„™åºåºæ”„¡½®å‚数。此外,˜q˜å¯ä»¥ä‹É用call()æ–ÒŽ(gu¨©)³•ã€?br>
4.原型�br>function ClassA() {
}

ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();

ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
    alert(this.name);
};

var objA = new ClassA();
var objB = new ClassB();
objA.color = "red";
objB.color = "blue";
objB.name = "Nicholas";
objA.sayColor();
objB.sayColor();
objB.sayName();
注意åQŒè°ƒç”¨ClassA的构造函数时åQŒæ²¡æœ‰ç»™å®ƒä¼ é€’参数。这在原型链中是标准做法。要¼‹®ä¿æž„造函数没有ä“Q何参数ã€?br>原型铄¡š„弊端是不支持多重¾l§æ‰¿ã€?br>
5.混合方式
与创建对象最好方式相ä¼û|¼Œç”¨å¯¹è±¡å†’å……ç‘ô承构造函数的属性,用原型链¾l§æ‰¿prototype对象的方法ã€?br>function ClassA(sColor) {
    this.color = sColor;
}

ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    this.name = sName;
}

ClassB.prototype = new ClassA();

ClassB.prototype.sayName = function () {
    alert(this.name);
};


var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();


二、其他ç‘ô承方å¼?br>1.zlnheritåº?br>可以ä»?a >http://www.nczonline.net/downloads处下è½?br>zInherit库给Object¾cÀL·»åŠ äº†ä¸¤ä¸ªæ–ÒŽ(gu¨©)³•åQŒinheritFrom()å’ŒinstanceOf()
ClassB.prototype.inheritFrom(ClassA);
CalssB.instanceOf(ClassA);

2.xbObjects�br>可以�a );
         ˜q™é‡ŒåQŒå­¾cÕd’Œ­‘…类名都以字½W¦ä¸²å½¢å¼ä¼ è¿›æ¥ï¼Œè€Œä¸æ˜¯æŒ‡å‘它们的构造函数的指针。这个调用必™åÀL”¾åœ¨æŒ‡å®šå­¾cÈš„æž„造构函数前ã€?br>½W¬äºŒæ­¥ï¼Œåœ¨æž„造函数内调用defineClass()æ–ÒŽ(gu¨©)³•åQŒä¼ ¾l™å®ƒ¾cÕdåŠè¢«Clary¿UîCؓ原型函数的指针,该函数用于初始化对象的所有属性和æ–ÒŽ(gu¨©)³•ã€?br>å¦?br>_classes.registerClass("ClassA");
function ClassA(color){
   _classes.defineClass("ClassA",prototypeFunction);

   function prototypeFunction(){
      //...
   }
}
½W¬ä¸‰æ­¥ï¼Œä¸ø™¯¥¾cÕdˆ›å»ºinit()æ–ÒŽ(gu¨©)³•。该æ–ÒŽ(gu¨©)³•负责讄¡½®è¯¥ç±»çš„æ‰€æœ‰å±žæ€§ï¼Œå®ƒå¿…™åÀLŽ¥å—ä¸Žæž„é€ å‡½æ•°ç›¸åŒçš„å‚æ•°ã€‚ä½œä¸ÞZ¸€¿Uè§„¾U¦ï¼Œinit()æ–ÒŽ(gu¨©)³•æ€ÀL˜¯åœ¨defineClass()æ–ÒŽ(gu¨©)³•后调用ã€?br>_classes.registerClass("ClassA");
function ClassA(color){
   _classes.defineClass("ClassA",prototypeFunction);
   this.init(sColor);
   function prototypeFunction(){
     ClassA.prototype.init = function(sColor){
         this.parentMethod("init");
         this.color = sColor;
      }
   }
}
½W¬å››æ­¥ï¼Œåœ¨åŽŸåž‹å‡½æ•°å†…æ·ÕdŠ å…¶ä»–¾cÈš„æ–ÒŽ(gu¨©)³•ã€?br>_classes.registerClass("ClassA");
function ClassA(color){
   _classes.defineClass("ClassA",prototypeFunction);
   this.init(sColor);
   function prototypeFunction(){
     ClassA.prototype.init = function(sColor){
         this.parentMethod("init");
         this.color = sColor;
      }
      ClassA.prototype.sayColor = function(){
         alert(this.color);
      }
   }
}
然后åQŒå³å¯ä»¥ä»¥å¸¸è§„方式创建ClassA的实ä¾?br>var objA = new ClassA("red");
objA.sayColor();      //outputs "res"

ž®ç¥ 2007-04-16 23:24 发表评论
]]>
javascript学习½W”è®°(一)åQï¼å¯¹è±¡http://www.aygfsteel.com/ilovezmh/archive/2007/04/16/111098.htmlž®ç¥ž®ç¥Mon, 16 Apr 2007 14:20:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/04/16/111098.htmlhttp://www.aygfsteel.com/ilovezmh/comments/111098.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/04/16/111098.html#Feedback4http://www.aygfsteel.com/ilovezmh/comments/commentRss/111098.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/111098.html一、定义类或对è±?br>1.工厂方式
创徏对象car
var oCar = new Object;
oCar.color = "red";
oCar.doors = 4;
oCar.mpg = 23;
oCar.showColor = function(){
   alert(this.corlor);
};

创徏多个car
function createCar(color, doors, mpg) {
    var tempcar = new Object;
    tempcar.color = color;
    tempcar.doors = doors;
    tempcar.mpg = mpg;
    tempcar.showColor = function () {
        alert(this.color)
    };
   return tempcar;
}

var car1 = createCar("red", 4, 23);
var car2 = createCar("blue", 3, 25);
car1.showColor();    //outputs "red"
car2.showColor();    //outputs "blue"
˜q™ä¸ªä¾‹å­ä¸­ï¼Œæ¯æ¬¡è°ƒç”¨å‡½æ•°createCar()åQŒéƒ½è¦åˆ›å»ºæ–°å‡½æ•°showColor()åQŒæ„å‘³ç€æ¯ä¸ªå¯¹è±¡éƒ½æœ‰è‡ªå·±çš„showColor()版本åQŒäº‹å®žä¸ŠåQŒæ¯ä¸ªå¯¹è±¡éƒ½å…׃ín了同一个函数ã€?br>有些开发者在工厂函数外定义对象的æ–ÒŽ(gu¨©)³•åQŒç„¶åŽé€šè¿‡å±žæ€§æŒ‡å‘该æ–ÒŽ(gu¨©)³•åQŒä»Žè€Œé¿å¼€˜q™ä¸ªé—®é¢˜ã€?br>function showColor(){
   alert(this.color);
}
function createCar(color, doors, mpg) {
    var tempcar = new Object;
    tempcar.color = color;
    tempcar.doors = doors;
    tempcar.mpg = mpg;
    tempcar.showColor = showColor;
    return tempcar;
}

var car1 = createCar("red", 4, 23);
var car2 = createCar("blue", 3, 25);
car1.showColor();    //outputs "red"
car2.showColor();    //outputs "blue"
从功能上è®ÔŒ¼Œ˜q™æ ·è§£å†³äº†é‡å¤åˆ›å»ºå‡½æ•°å¯¹è±¡çš„问题åQŒä½†è¯¥å‡½æ•°çœ‹èµäh¥ä¸åƒå¯¹è±¡çš„æ–¹æ³•。所有这些问题引发了开发者定义的构造函数的出现ã€?br>
2.构造函数方�br>function Car(sColor, iDoors, iMpg) {
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    this.showColor = function () {
        alert(this.color)
    };
}

var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
oCar1.showColor();    //outputs "red"
oCar2.showColor();    //outputs "blue"
ž®±åƒå·¥åŽ‚å‡½æ•°åQŒæž„造函æ•îC¼šé‡å¤ç”Ÿæˆå‡½æ•°åQŒäؓ每个对象都创建独立的函数版本。不˜q‡ï¼Œä¹Ÿå¯ä»¥ç”¨å¤–部函数重写构造函敎ͼŒåŒæ ·åQŒè¿™ä¹ˆåšè¯­ä¹‰ä¸Šæ— ä»ÖM½•意义ã€?br>
3.原型方式
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors= 4;
Car.prototype.mpg= 23;
Car.prototype.showColor = function(){
   alert(this.color);
}

var oCar1 = new Car();
var oCar2 = new Car();
它解决了前面两种方式存在的两个问题。但òq¶ä¸ž®½äh意。首先,˜q™ä¸ªæž„造函数没有参数。ä‹É用原型方式时åQŒä¸èƒ½é€šè¿‡æž„造函æ•îC¼ é€’参数初始化属性的å€û|¼Œ˜q™ç‚¹å¾ˆä×oäºø™®¡åŽŒï¼Œä½†è¿˜æ²¡å®ŒåQŒçœŸæ­£çš„问题出现在属性指向的是对象,而不是函数时。考虑下面的例子:
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors= 4;
Car.prototype.mpg= 23;
Car.prototype.drivers = new Array("Mike","Sue");
Car.prototype.showColor = function(){
   alert(this.color);
}

var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Matt");
alert(oCar1.drivers);      //outputs "Mike,Sue,Matt"
alert(oCar2.drivers);      //outputs "Mike,Sue,Matt"

4.混合的构造函�原型方式
function Car(sColor, iDoors, iMpg) {
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    this.drivers = new Array("Mike", "Sue");
}

Car.prototype.showColor = function () {
    alert(this.color);
};

var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);

oCar1.drivers.push("Matt");

alert(oCar1.drivers);    //outputs "Mike,Sue,Matt"
alert(oCar2.drivers);    //outputs "Mike,Sue"
现在ž®±æ›´åƒåˆ›å»ÞZ¸€èˆ¬å¯¹è±¡äº†ã€‚所有的非函数属性都有构造函æ•îC¸­åˆ›å¾åQŒæ„å‘³ç€åˆå¯ç”¨æž„造函数的参数赋予属性默认å€égº†ã€‚因为只创徏showColor()函数的一个实例,所以没有内存浪贏V€?br>
5.动态原型方�br>function Car(sColor, iDoors, iMpg) {
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    this.drivers = new Array("Mike", "Sue");

    if (typeof Car._initialized == "undefined") {

        Car.prototype.showColor = function () {
            alert(this.color);
        };

        Car._initialized = true;
    }
}


var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);

oCar1.drivers.push("Matt");

alert(oCar1.drivers);    //outputs "Mike,Sue,Matt"
alert(oCar2.drivers);    //outputs "Mike,Sue"
动态原型方法的基本æƒÏx³•ä¸ŽæØœåˆçš„æž„é€ å‡½æ•?原型方式相同åQŒå³åœ¨æž„造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象æ–ÒŽ(gu¨©)³•的位¾|®ã€?/p>

6.混合工厂方式
˜q™ç§æ–¹å¼é€šå¸¸æ˜¯åœ¨ä¸èƒ½åº”用前一¿Uæ–¹å¼æ—¶çš„变通方法。它的目的是创徏假构造函敎ͼŒåªè¿”回另一¿Uå¯¹è±¡çš„æ–°å®žä¾‹ã€?br>function Car() {
    var tempcar = new Object;
    tempcar.color = "red";
    tempcar.doors = 4;
    tempcar.mpg = 23;
    tempcar.showColor = function () {
        alert(this.color)
    };
   return tempcar;
}
与经典方式不同,˜q™ç§æ–¹å¼ä½¿ç”¨new˜qç®—½W¦ï¼Œä½¿å®ƒçœ‹è“v来像真正的构造函数ã€?br>
7.采用哪种方式
   å¦‚前所˜qŽÍ¼Œç›®å‰ä½¿ç”¨æœ€òq¿æ³›çš„æ˜¯æ··åˆçš„æž„造函æ•?åŽŸåž‹æ–¹å¼ã€‚äº›å¤–ï¼ŒåŠ¨æ€åŽŸåž‹æ–¹æ³•ä¹Ÿå¾ˆæµè¡Œï¼Œåœ¨åŠŸèƒ½ä¸Šä¸Žå‰è€…ç­‰ä»øP¼Œå¯ä»¥é‡‡ç”¨˜q™ä¸¤¿Uæ–¹å¼ä¸­çš„ä“Q何一¿Uã€?br>
二、修改对è±?br>1.创徏新方æ³?br>可以用prototypeå±žæ€§äØ“ä»ÖM½•已有的类定义新方法,ž®±åƒå¤„理自己的类一栗÷€?br>例:
Array.prototype.indexOf = function(vItem){
   for(var i=0;i<this.length;i++){
      if(vItem == this[i]){
         return i;
      }
   }
   retunr -1;
}
最后,如果想给ECMAScript中的每个本地对象æ·ÕdŠ æ–°æ–¹æ³•ï¼Œå¿…é¡»åœ¨Object对象的prototype属性上定义它ã€?br>
2.重定义已有方æ³?br>ž®±åƒèƒ½ç»™è‡ªå·±çš„ç±»å®šä¹‰æ–°æ–¹æ³•ä¸€æ øP¼Œä¹Ÿå¯é‡å®šä¹‰å·²æœ‰çš„æ–ÒŽ(gu¨©)³•。函数名只是指向函数的指针,因此可以è½ÀL˜“åœîC‹É它指向其他函数ã€?br>å¦?br>Function.prototype.toString = function(){
   return "Function code hidden";
}
function sayHi(){
   alert("hi");
}
alert(sayHi.toString());      //outputs "Function code hidden"



ž®ç¥ 2007-04-16 22:20 发表评论
]]>
webwork学习½W”è®°http://www.aygfsteel.com/ilovezmh/archive/2007/03/24/106037.htmlž®ç¥ž®ç¥Sat, 24 Mar 2007 04:18:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/03/24/106037.htmlhttp://www.aygfsteel.com/ilovezmh/comments/106037.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/03/24/106037.html#Feedback0http://www.aygfsteel.com/ilovezmh/comments/commentRss/106037.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/106037.html
最˜q‘学习webworkåQŒä¸»è¦æ˜¯ã€Šwebwork in action》一书,以及一些其它的文档。书是看完了åQŒwebwork大致有所了解åQŒè¿˜æ²¡æœ‰æœÞZ¼šå’Œæ—¶é—´åŽ»å®?br />
è·üc€‚记下了一些配¾|®åž‹çš„东西,方便以后查阅。还有很多东西没记录下来åQŒä»¥åŽå®žè·ëŠš„话,再逐步完善ã€?br />
文档˜q˜æœ‰ç‚šw•¿åQŒå°±ç”¨æ–‡ä»¶çš„形式了ã€?br />
下蝲地址

ž®ç¥ 2007-03-24 12:18 发表评论
]]>
æ·ÕdŠ Eclipse插äšg的简单方æ³?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/03/12/103408.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Mon, 12 Mar 2007 14:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/03/12/103408.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/103408.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/03/12/103408.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/103408.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/103408.html</trackback:ping><description><![CDATA[˜q™å‡ å¤©ä¸‹äº†å¾ˆå¤šEclipse的插ä»Óž¼Œå‚考Myeclipse插äšgåQŒå‘çŽîCº†ä¸€ä¸ªå¾ˆæ–¹ä¾¿½Ž€å•çš„æ–ÒŽ(gu¨©)³•åQŒæ–¹ä¾¿å®‰è£…和删除ã€?br /><br />Eclipse插äšg都会带有featureså’Œplugins˜q™ä¸¤ä¸ªæ–‡ä»¶å¤¹åQŒä¸€èˆ¬çš„æƒÏx³•都会是直接把˜q™ä¸¤ä¸ªæ–‡ä»¶æ·»åŠ åˆ°Eclipse中去。且不谈˜q™æ ·ä¼šä¸ä¼šæˆåŠŸï¼Œå½“ä½ è¦åˆ é™¤å®ƒçš„æ—¶å€™ï¼Œè¦æ‰¾åˆ°å®ƒçš„æ–‡ä»‰™ƒ½ä¼šå¾ˆéºÈƒ¦ã€?br /><br />下面介绍下我使用的方法,以jigloo_395åQˆSWT/Swingçš„å›¾å½¢å·¥å…øP¼‰ä¸ÞZ¾‹ã€?br /><br />首先当然是下载jigloo_395.zipåQŒè§£åŽ‹åŽæ”‘Öˆ°ä½ æƒ³æ”„¡½®çš„位¾|®ï¼Œä¸ç”¨ä¸€å®šæ”¾åœ¨eclipse中,比如“D:\eclipse-plugs\jigloo_395”ã€?br /><br />然后在它下面新徏一个文件夹命名为eclipseåQŒå†ž®†featureså’Œplugins˜q™ä¸¤ä¸ªæ–‡ä»¶å¤¹æ‹–进厅R€?br /><br />最后打开你安装的eclipse路径åQŒæ¯”如“D:\eclipse”,打开linksæ–‡äšg夹,新徏文本文äšgåQŒåœ¨é‡Œé¢è¾“入“path=D:\\eclipse-plugs\\jigloo_395”,最后将文äšgé‡å‘½åäØ“â€œjigloo_395.link”。OK了。。ã€?br /><br />重新打开Eclipse,你会在窗å?>首选项中看到这个插件了。具体用法请参考jigloo_395çš„ä‹É用文档ã€?br /><br /><img src ="http://www.aygfsteel.com/ilovezmh/aggbug/103408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-03-12 22:48 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/03/12/103408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整理åQšæ•°æ®åº“è®¾è®¡ä¸­çš„14个技å·?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98396.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Tue, 06 Feb 2007 09:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98396.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/98396.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/98396.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/98396.html</trackback:ping><description><![CDATA[ <p>数据库设计中çš?4个技å·?br />                                       <br />数据库的设计有很多技巧,以下ž®×ƒ»‹¾lå…¶ä¸­çš„几种åQŒæ˜¯è®¸å¤šäººåœ¨å¤§é‡çš„æ•°æ®åº“分析与设计实践中åQŒé€æ­¥æ€È»“出来的。对于这些经验的˜qç”¨åQŒè¯»è€…不能生帮硬套,死记¼‹¬èƒŒåQŒè€Œè¦æ¶ˆåŒ–理解åQŒå®žäº‹æ±‚是,灉|´»æŽŒæ¡ã€?br />òq‰™€æ­¥åšåˆ°åQšåœ¨åº”用中发展,在发展中应用ã€?br /><font size="4"><strong> <br />1. 原始单据与实体之间的关系</strong></font><br /><br />可以是一对一、一对多、多对多的关¾p…R€‚在一般情况下åQŒå®ƒä»¬æ˜¯ä¸€å¯¹ä¸€çš„å…³¾p»ï¼šå³ä¸€å¼ åŽŸå§‹å•æ®å¯¹åº”ä¸”åªå¯¹åº”ä¸€ä¸ªå®žä½“ã€‚åœ¨ç‰ÒŽ(gu¨©)®Šæƒ…况下,它们可能是一对多或多对一的关¾p»ï¼Œå³ä¸€å¼ åŽŸå§‹å•æ®å¯¹åº”å¤šä¸ªå®žä½“ï¼Œæˆ–å¤šå¼ åŽŸå§‹å•æ®å¯¹åº”ä¸€ä¸ªå®žä½“ã€‚è¿™é‡Œçš„å®žä½“å¯ä»¥ç†è§£ä¸ºåŸºæœ¬è¡¨ã€‚æ˜Ž¼‹®è¿™¿Uå¯¹åº”å…³¾pÕdŽåQŒå¯¹æˆ‘们设计录入界面大有好处ã€?<br /><br />〖例1〗:一份员工åï–历资料,在äh力资源信息系¾lŸä¸­åQŒå°±å¯¹åº”三个基本表:员工基本情况表、社会关¾p»è¡¨ã€å·¥ä½œç®€åŽ†è¡¨ã€‚è¿™ž®±æ˜¯â€œä¸€å¼ åŽŸå§‹å•æ®å¯¹åº”å¤šä¸ªå®žä½“â€çš„å…¸åž‹ä¾‹å­ã€?<br /><br /><font size="4"><strong>2. 主键与外é”?/strong></font><br /><br />一般而言åQŒä¸€ä¸ªå®žä½“不能既无主键又无外键。在EåQR 图中, 处于叶子部位的实ä½? 可以定义主键åQŒä¹Ÿå¯ä»¥ä¸å®šä¹‰ä¸»é”?å› äØ“å®ƒæ— å­å­™), 但必™å»è¦æœ‰å¤–é”?å› äØ“å®ƒæœ‰çˆ¶äº²)ã€?<br />主键与外键的设计åQŒåœ¨å…¨å±€æ•°æ®åº“的设计中,占有重要åœîC½ã€‚当全局数据库的设计完成以后åQŒæœ‰ä¸ªç¾Žå›½æ•°æ®åº“设计专家è¯ß_¼šâ€œé”®åQŒåˆ°å¤„都是键åQŒé™¤äº†é”®ä¹‹å¤–åQŒä»€ä¹ˆä¹Ÿæ²¡æœ‰â€ï¼Œ˜q™å°±æ˜¯ä»–的数据库设计¾léªŒä¹‹è°ˆåQŒä¹Ÿåæ˜ äº†ä»–对信息系¾lŸæ ¸å¿?数据模型)的高度抽象思想。因为:主键是实体的高度抽象åQŒä¸»é”®ä¸Žå¤–键的配对,表示实体之间的连接ã€?<br /><br /><font size="4"><strong>3. 基本表的性质</strong></font><br /><br />基本表与中间表、äÍ时表不同åQŒå› ä¸ºå®ƒå…ähœ‰å¦‚下四个ç‰ÒŽ(gu¨©)€§ï¼š <br />(1) 原子性。基本表中的字段是不可再分解的ã€?<br />(2) 原始性。基本表中的记录是原始数据(基础数据åQ‰çš„记录ã€?<br />(3) 演绎性。由基本表与代码表中的数据,可以‹z„¡”Ÿå‡ºæ‰€æœ‰çš„输出数据ã€?<br />(4) ½E›_®šæ€§ã€‚基本表的结构是相对½E›_®šçš„,表中的记录是要长期保存的ã€?<br />理解基本表的性质后,在设计数据库æ—Óž¼Œž®Þpƒ½ž®†åŸºæœ¬è¡¨ä¸Žä¸­é—´è¡¨ã€äÍ时表区分开来ã€?<br /><br /><font size="4"><strong>4. 范式标准</strong></font><br /><br />基本表及其字ŒDµä¹‹é—´çš„关系, 应尽量满­‘³ç¬¬ä¸‰èŒƒå¼ã€‚但是,满èƒö½W¬ä¸‰èŒƒå¼çš„æ•°æ®åº“设计åQŒå¾€å¾€ä¸æ˜¯æœ€å¥½çš„è®¾è®¡ã€‚äØ“äº†æé«˜æ•°æ®åº“çš„è¿è¡Œæ•ˆçŽ‡ï¼Œå¸¸å¸¸éœ€è¦é™ä½ŽèŒƒå¼æ ‡å‡†ï¼šé€‚å½“å¢žåŠ å†—ä½™åQŒè¾¾åˆîC»¥½Iºé—´æ¢æ—¶é—´çš„目的ã€?<br />〖例2〗:有一张存攑֕†å“çš„基本表,如表1所½Cºã€‚“金额”这个字ŒD늚„存在åQŒè¡¨æ˜Žè¯¥è¡¨çš„设计不满­‘³ç¬¬ä¸‰èŒƒå¼ï¼Œå› äؓ“金额”可以由“单价”乘以“数量”得刎ͼŒè¯´æ˜Žâ€œé‡‘额”是冗余字段。但是,增加“金额”这个冗余字ŒDµï¼Œå¯ä»¥æé«˜æŸ¥è¯¢¾lŸè®¡çš„速度åQŒè¿™ž®±æ˜¯ä»¥ç©ºé—´æ¢æ—‰™—´çš„作法ã€?在Rose 2002中,规定列有两种¾cÕdž‹åQšæ•°æ®åˆ—å’Œè®¡½Ž—列。“金额”这æ ïLš„列被¿UîCؓ“计½Ž—列”,而“单价”和“数量”这æ ïLš„列被¿UîCؓ“数据列”ã€?<br />è¡? 商品表的表结æž?<br />商品名称 商品型号 单ä­h(hu¨¢n) 数量 金额 <br />电视æœ?29å?2,500 40 100,000 <br /><br /><font size="4"><strong>5. 通俗地理解三个范å¼?/strong></font><br /><br />通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中åQŒäؓ了更好地应用三个范式åQŒå°±å¿…须通俗地理解三个范å¼?通俗地理解是够用的理解,òq¶ä¸æ˜¯æœ€¿U‘学最准确的理è§?åQ?<br />½W¬ä¸€èŒƒå¼åQ?NF是对属性的原子性约束,要求属性具有原子性,不可再分解; <br />½W¬äºŒèŒƒå¼åQ?NF是对记录的惟一性约束,要求记录有惟一标识åQŒå³å®žä½“的惟一性; <br />½W¬ä¸‰èŒƒå¼åQ?NF是对字段冗余性的¾U¦æŸåQŒå³ä»ÖM½•字段不能由其他字ŒD‰|´¾ç”Ÿå‡ºæ¥ï¼Œå®ƒè¦æ±‚å­—ŒD‰|²¡æœ‰å†—ä½™ã€?<br />没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时ä¸ÞZº†æé«˜˜qè¡Œæ•ˆçއåQŒå°±å¿…须降低范式标准åQŒé€‚当保留冗余数据。具体做法是åQšåœ¨æ¦‚念数据模型设计旉™µå®ˆç¬¬ä¸‰èŒƒå¼ï¼Œé™ä½ŽèŒƒå¼æ ‡å‡†çš„工作放到物理数据模型设计时考虑。降低范式就是增加字ŒDµï¼Œå…è®¸å†—ä½™ã€?<br /><br /><font size="4"><strong>6. 要善于识别与正确处理多对多的关系</strong></font><br /><br />若两个实体之间存在多对多的关¾p»ï¼Œåˆ™åº”消除˜q™ç§å…³ç³»ã€‚æ¶ˆé™¤çš„åŠžæ³•æ˜¯ï¼Œåœ¨ä¸¤è€…ä¹‹é—´å¢žåŠ ç¬¬ä¸‰ä¸ªå®žä½“ã€‚è¿™æ øP¼ŒåŽŸæ¥ä¸€ä¸ªå¤šå¯¹å¤šçš„å…³¾p»ï¼ŒçŽ°åœ¨å˜äØ“ä¸¤ä¸ªä¸€å¯¹å¤šçš„å…³¾p…R€‚要ž®†åŽŸæ¥ä¸¤ä¸ªå®žä½“çš„å±žæ€§åˆç†åœ°åˆ†é…åˆîC¸‰ä¸ªå®žä½“中厅R€‚这里的½W¬ä¸‰ä¸ªå®žä½“,实质上是一个较复杂的关¾p»ï¼Œå®ƒå¯¹åº”一张基本表。一般来è®ÔŒ¼Œæ•°æ®åº“设计工具不能识别多对多的关¾p»ï¼Œä½†èƒ½å¤„理多对多的关系ã€?br /> <br />〖例3〗:在“图书馆信息¾pȝ»Ÿâ€ä¸­åQŒâ€œå›¾ä¹¦â€æ˜¯ä¸€ä¸ªå®žä½“,“读者”也是一个实体。这两个实体之间的关¾p»ï¼Œæ˜¯ä¸€ä¸ªå…¸åž‹çš„多对多关¾p»ï¼šä¸€æœ¬å›¾ä¹¦åœ¨ä¸åŒæ—‰™—´å¯ä»¥è¢«å¤šä¸ªè¯»è€…借阅åQŒä¸€ä¸ªè¯»è€…åˆå¯ä»¥å€Ÿå¤šæœ¬å›¾ä¹¦ã€‚äØ“æ­¤ï¼Œè¦åœ¨äºŒè€…ä¹‹é—´å¢žåŠ ç¬¬ä¸‰ä¸ªå®žä½“åQŒè¯¥å®žä½“å–åä¸ºâ€œå€Ÿè¿˜ä¹¦â€ï¼Œå®ƒçš„å±žæ€§äØ“åQšå€Ÿè¿˜æ—‰™—´ã€å€Ÿè¿˜æ ‡å¿—(0表示借书åQ?表示˜q˜ä¹¦)åQŒå¦å¤–,它还应该有两个外é”?“图书”的主键åQŒâ€œè¯»è€…”的主键)åQŒä‹É它能与“图书”和“读者”连接ã€?<br /><br /><font size="4"><strong>7. 主键PK的取值方æ³?/strong></font><br /><br />PK是供½E‹åºå‘˜ä‹É用的表间˜qžæŽ¥å·¥å…·åQŒå¯ä»¥æ˜¯ä¸€æ— ç‰©ç†æ„ä¹‰çš„æ•°å­—ä¸? ç”Þq¨‹åºè‡ªåŠ¨åŠ 1来实现。也可以是有物理意义的字ŒDµåæˆ–å­—ŒDµåçš„组合。不˜q‡å‰è€…比后者好。当PK是字ŒDµåçš„组合时åQŒå¾è®®å­—ŒD늚„个数不要太多åQŒå¤šäº†ä¸ä½†çƒ¦å¼•占用空间大åQŒè€Œä¸”速度也慢ã€?<br /><br /><font size="4"><strong>8. 正确认识数据冗余</strong></font><br /><br />主键与外键在多表中的重复出现, 不属于数据冗余,˜q™ä¸ªæ¦‚念必须清楚åQŒäº‹å®žä¸Šæœ‰è®¸å¤šäh˜q˜ä¸æ¸…楚。非键字ŒD늚„重复出现, 才是数据冗余åQè€Œä¸”是一¿Uä½Ž¾U§å†—余,即重复性的冗余。高¾U§å†—余不是字ŒD늚„重复出现åQŒè€Œæ˜¯å­—段的派生出现ã€?<br />〖例4〗:商品中的“单仗÷€æ•°é‡ã€é‡‘额”三个字ŒDµï¼Œâ€œé‡‘额”就是由“单价”乘以“数量”派生出来的åQŒå®ƒ?y¨­u)®±æ˜¯å†—ä½™åQŒè€Œä¸”是一¿Ué«˜¾U§å†—ä½™ã€‚å†—ä½™çš„ç›®çš„æ˜¯äØ“äº†æé«˜å¤„ç†é€Ÿåº¦ã€‚åªæœ‰ä½Ž¾U§å†—ä½™æ‰ä¼šå¢žåŠ æ•°æ®çš„ä¸ä¸€è‡´æ€§ï¼Œå› äØ“åŒä¸€æ•°æ®åQŒå¯èƒ½ä»Žä¸åŒæ—‰™—´ã€åœ°ç‚V€è§’色上多次录入。因此,我们提倡高¾U§å†—ä½?‹z„¡”Ÿæ€§å†—ä½?åQŒåå¯¹ä½Ž¾U§å†—ä½?重复性冗ä½?ã€?<br /><br /><font size="4"><strong>9. EåQR图没有标准答æ¡?/strong></font><br /><br />信息¾pȝ»Ÿçš„EåQRå›¾æ²¡æœ‰æ ‡å‡†ç­”æ¡ˆï¼Œå› äØ“å®ƒçš„è®¾è®¡ä¸Žç”»æ³•ä¸æ˜¯æƒŸä¸€çš„ï¼Œåªè¦å®ƒè¦†ç›–äº†¾pȝ»Ÿéœ€æ±‚的业务范围和功能内容,ž®±æ˜¯å¯è¡Œçš„。反之要修改EåQR图。尽½Ž¡å®ƒæ²¡æœ‰æƒŸä¸€çš„æ ‡å‡†ç­”案,òq¶ä¸æ„å‘³ç€å¯ä»¥éšæ„è®¾è®¡ã€‚好的EåQå›¾çš„æ ‡å‡†æ˜¯åQšç»“构清晰、关联简‹zã€å®žä½“个数适中、属性分配合理、没有低¾U§å†—ä½™ã€?<br /><br /><font size="4"><strong>10. 视图技术在数据库设计中很有ç”?/strong></font><br /><br />与基本表、代码表、中间表不同åQŒè§†å›¾æ˜¯ä¸€¿Uè™šè¡¨ï¼Œå®ƒä¾èµ–数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一¿UåÅžå¼? 是数据处理的一¿Uæ–¹æ³•,是用æˆäh•°æ®ä¿å¯†çš„一¿Uæ‰‹ŒDüc€‚äØ“äº†è¿›è¡Œå¤æ‚å¤„ç†ã€æé«˜è¿½Ž—速度和节省存储空é—? 视图的定义深度一般不得超˜q‡ä¸‰å±‚ã€?若三层视图仍不够ç”? 则应在视图上定义临时è¡? 在äÍ时表上再定义视图。这样反复交˜q­å®šä¹? 视图的深度就不受限制了ã€?<br />对于某些与国家政沅R€ç»‹¹Žã€æŠ€æœ¯ã€å†›äº‹å’Œå®‰å…¨åˆ©ç›Šæœ‰å…³çš„信息系¾lŸï¼Œè§†å›¾çš„作用更加重要。这些系¾lŸçš„基本表完成物理设计之后,立即在基本表上徏立第一层视图,˜q™å±‚视图的个数和¾l“æž„åQŒä¸ŽåŸºæœ¬è¡¨çš„ä¸ªæ•°å’Œç»“æž„æ˜¯å®Œå…¨ç›¸åŒã€‚åÆˆä¸”è§„å®šï¼Œæ‰€æœ‰çš„½E‹åºå‘˜ï¼Œä¸€å¾‹åªå‡†åœ¨è§†å›¾ä¸Šæ“ä½œã€‚只有数据库½Ž¡ç†å‘˜ï¼Œå¸¦ç€å¤šä¸ªäººå‘˜å…±åŒæŽŒæ¡çš„“安全钥匙”,才能直接在基本表上操作ã€?<br /><br /><font size="4"><strong>11. 中间表、报表和临时è¡?/strong></font><br /><br />中间表是存放¾lŸè®¡æ•°æ®çš„表åQŒå®ƒæ˜¯äؓ数据仓库、输出报表或查询¾l“果而设计的åQŒæœ‰æ—¶å®ƒæ²¡æœ‰ä¸»é”®ä¸Žå¤–é”?数据仓库除外)。äÍ时表是程序员个äh设计的,存放临时记录åQŒäؓ个äh所用。基表和中间表由DBA¾l´æŠ¤åQŒäÍ时表ç”Þq¨‹åºå‘˜è‡ªå·±ç”¨ç¨‹åºè‡ªåŠ¨ç»´æŠ¤ã€?br /> <br /><font size="4"><strong>12. 完整性约束表现在三个斚w¢</strong></font> <br /><br />域的完整性:用Check来实现约束,在数据库设计工具中,对字ŒD늚„å–å€ÆDŒƒå›´è¿›è¡Œå®šä¹‰æ—¶åQŒæœ‰ä¸€ä¸ªCheck按钮åQŒé€šè¿‡å®ƒå®šä¹‰å­—ŒD늚„值城ã€?<br />参照完整性:用PK、FK、表¾U§è§¦å‘器来实现ã€?<br />用户定义完整性:它是一些业务规则,用存储过½E‹å’Œè§¦å‘器来实现ã€?<br /><br /><font size="4"><strong>13. 防止数据库设计打补丁的方法是“三ž®‘原则â€?</strong></font><br /><br />(1) 一个数据库中表的个数越ž®‘越好。只有表的个数少了,才能说明¾pȝ»Ÿçš„EåQR囑ְ‘而精åQŒåŽ»æŽ‰äº†é‡å¤çš„å¤šä½™çš„å®žä½“åQŒåŞ成了对客观世界的高度抽象åQŒè¿›è¡Œäº†¾pȝ»Ÿçš„æ•°æ®é›†æˆï¼Œé˜²æ­¢äº†æ‰“补丁式的设计åQ?<br />(2) 一个表中组合主键的字段个数­‘Šå°‘­‘Šå¥½ã€‚å› ä¸ÞZ¸»é”®çš„作用åQŒä¸€æ˜¯å¾ä¸»é”®ç´¢å¼•åQŒäºŒæ˜¯åšä¸ºå­è¡¨çš„外键åQŒæ‰€ä»¥ç»„合主键的字段个数ž®‘了åQŒä¸ä»…节省了˜qè¡Œæ—‰™—´åQŒè€Œä¸”节省了烦引存储空é—ß_¼› <br />(3) 一个表中的字段个数­‘Šå°‘­‘Šå¥½ã€‚只有字ŒD늚„个数ž®‘了åQŒæ‰èƒ½è¯´æ˜Žåœ¨¾pȝ»Ÿä¸­ä¸å­˜åœ¨æ•°æ®é‡å¤åQŒä¸”很少有数据冗余,更重要的是督促读者学会“列变行”,˜q™æ ·ž®±é˜²æ­¢äº†ž®†å­è¡¨ä¸­çš„å­—ŒD‰|‹‰å…¥åˆ°ä¸»è¡¨ä¸­åŽ»åQŒåœ¨ä¸»è¡¨ä¸­ç•™ä¸‹è®¸å¤šç©ºä½™çš„字段。所谓“列变行”,ž®±æ˜¯ž®†ä¸»è¡¨ä¸­çš„一部分内容拉出去,另外单独å»ÞZ¸€ä¸ªå­è¡¨ã€‚这个方法很½Ž€å•,有的人就是不习惯、不采纳、不执行ã€?<br /><br />数据库设计的实用原则是:在数据冗余和处理速度之间扑ֈ°åˆé€‚çš„òqŒ™¡¡ç‚V€‚“三ž®‘”是一个整体概念,¾l¼åˆè§‚点åQŒä¸èƒ½å­¤ç«‹æŸä¸€ä¸ªåŽŸåˆ™ã€‚è¯¥åŽŸåˆ™æ˜¯ç›¸å¯¹çš„åQŒä¸æ˜¯ç»å¯¹çš„。“三多”原则肯定是错误的。试惻I¼šè‹¥è¦†ç›–ç³»¾lŸåŒæ ïLš„功能åQŒä¸€ç™¾ä¸ªå®žä½“(å…׃¸€åƒä¸ªå±žæ€? çš„EåQR图,肯定比二百个实体(å…׃ºŒåƒä¸ªå±žæ€?çš„EåQR图,要好得多ã€?<br /><br />提倡“三ž®‘”原则,是叫读者学会利用数据库设计技术进行系¾lŸçš„æ•°æ®é›†æˆã€‚数据集成的步骤是将文äšg¾pȝ»Ÿé›†æˆä¸ºåº”用数据库åQŒå°†åº”ç”¨æ•°æ®åº“é›†æˆäØ“ä¸»é¢˜æ•°æ®åº“ï¼Œž®†ä¸»é¢˜æ•°æ®åº“集成为全局¾l¼åˆæ•°æ®åº“。集成的½E‹åº¦­‘Šé«˜åQŒæ•°æ®å…±äº«æ€§å°±­‘Šå¼ºåQŒä¿¡æ¯å­¤å²›çŽ°è±¡å°±­‘Šå°‘åQŒæ•´ä¸ªä¼ä¸šä¿¡æ¯ç³»¾lŸçš„全局E—R图中实体的个数、主键的个数、属性的个数ž®×ƒ¼š­‘Šå°‘ã€?<br /><br />提倡“三ž®‘”原则的目的åQŒæ˜¯é˜²æ­¢è¯»è€…利用打补丁技术,不断地对数据库进行增删改åQŒä‹É企业数据库变成了随意设计数据库表的“垃圑֠†â€ï¼Œæˆ–数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、äÍæ—¶è¡¨æ‚äØ•æ— ç« åQŒä¸è®¡å…¶æ•ŽÍ¼Œå¯ÆD‡´ä¼äº‹ä¸šå•位的信息¾pȝ»Ÿæ— æ³•¾l´æŠ¤è€Œç˜«ç—ªã€?<br /><br />“三多”原则ä“Q何äh都可以做刎ͼŒè¯¥åŽŸåˆ™æ˜¯â€œæ‰“è¡¥ä¸æ–ÒŽ(gu¨©)³•”设计数据库的歪理学说。“三ž®‘”原则是ž®‘而精的原则,它要求有较高的数据库设计技巧与艺术åQŒä¸æ˜¯ä“Q何ähéƒ½èƒ½åšåˆ°çš„ï¼Œå› äØ“è¯¥åŽŸåˆ™æ˜¯æœç»ç”¨â€œæ‰“è¡¥ä¸æ–ÒŽ(gu¨©)³•”设计数据库的理è®ÞZ¾æ®ã€?<br /><br /><font size="4"><strong>14. 提高数据库运行效率的办法</strong></font><br /><br />在给定的¾pȝ»Ÿ¼‹¬äšg和系¾lŸèÊY件条件下åQŒæé«˜æ•°æ®åº“¾pȝ»Ÿçš„运行效率的办法是: <br />(1) 在数据库物理设计æ—Óž¼Œé™ä½ŽèŒƒå¼åQŒå¢žåР冗ä½? ž®‘用触发å™? 多用存储˜q‡ç¨‹ã€?<br />(2) 当计½Ž—非常复杂、而且记录条数非常巨大æ—?例如一千万æ?åQŒå¤æ‚计½Ž—要先在数据库外面,以文件系¾lŸæ–¹å¼ç”¨C++语言计算处理完成之后åQŒæœ€åŽæ‰å…¥åº“˜q½åŠ åˆ°è¡¨ä¸­åŽ»ã€‚è¿™æ˜¯ç”µä¿¡è®¡è´¹ç³»¾lŸè®¾è®¡çš„¾léªŒã€?<br />(3) 发现某个表的记录太多åQŒä¾‹å¦‚è¶…˜q‡ä¸€åƒä¸‡æ¡ï¼Œåˆ™è¦å¯¹è¯¥è¡¨è¿›è¡Œæ°´òq›_ˆ†å‰ŒÓ€‚æ°´òq›_ˆ†å‰²çš„做法是,以该表主键PK的某个å€égؓ界线åQŒå°†è¯¥è¡¨çš„记录水òq›_ˆ†å‰²äؓ两个表。若发现某个表的字段太多åQŒä¾‹å¦‚è¶…˜q‡å…«åä¸ªåQŒåˆ™åž‚直分割该表åQŒå°†åŽŸæ¥çš„ä¸€ä¸ªè¡¨åˆ†è§£ä¸ÞZ¸¤ä¸ªè¡¨ã€?<br />(4) å¯ÒŽ(gu¨©)•°æ®åº“½Ž¡ç†¾pȝ»ŸDBMS˜q›è¡Œ¾pȝ»Ÿä¼˜åŒ–åQŒå³ä¼˜åŒ–各种¾pȝ»Ÿå‚æ•°åQŒå¦‚¾~“冲åŒÞZ¸ªæ•°ã€?<br />(5) 在ä‹É用面向数据的SQL语言˜q›è¡Œ½E‹åºè®¾è®¡æ—Óž¼Œž®½é‡é‡‡å–优化½Ž—法ã€?<br /><br />æ€ÖM¹‹åQŒè¦æé«˜æ•°æ®åº“çš„˜qè¡Œæ•ˆçއåQŒå¿…™åÖM»Žæ•°æ®åº“ç³»¾lŸçñ”优化、数据库设计¾U§ä¼˜åŒ–、程序实现çñ”优化åQŒè¿™ä¸‰ä¸ªå±‚次上同时下功夫ã€?<br />关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范å¼?现简单介¾l?NFåQˆç¬¬ä¸€èŒƒå¼åQ‰ï¼Œ2NFåQˆç¬¬äºŒèŒƒå¼ï¼‰åQ?NFåQˆç¬¬ä¸‰èŒƒå¼ï¼‰å’ŒBCNFåQŒå¦æœ‰ç¬¬å››èŒƒå¼å’Œ½W¬äº”范式留到以后再介¾lã€?在你设计数据库之æ—Óž¼Œè‹¥èƒ½½W¦åˆ˜q™å‡ ä¸ªèŒƒå¼ï¼Œä½ å°±æ˜¯æ•°æ®åº“设计的高手ã€?br /> <br />½W¬ä¸€èŒƒå¼åQ?NFåQ‰ï¼šåœ¨å…³¾pÀL¨¡å¼R中的每一个具体关¾p»r中,如果每个属性å€?都是不可再分的最ž®æ•°æ®å•位,则称R是第一范式的关¾p…R€‚例åQšå¦‚èŒå·¥åøP¼Œå§“名åQŒç”µè¯å·ç ç»„成一个表åQˆä¸€ä¸ªäh可能有一个办公室电话 和一个家里电话号码) è§„èŒƒæˆäØ“1NF有三¿Uæ–¹æ³•: ä¸€æ˜¯é‡å¤å­˜å‚¨èŒå·¥å·å’Œå§“åã€‚è¿™æ øP¼Œå…³é”®å­—只能是电话åïL ã€?äºŒæ˜¯èŒå·¥å·äØ“å…³é”®å­—ï¼Œç”µè¯åïL åˆ†äؓ单位电话和住宅电话两个属æ€?ä¸‰æ˜¯èŒå·¥å·äØ“å…³é”®å­—ï¼Œä½†å¼ºåˆ¶æ¯æ¡è®°å½•åªèƒ½æœ‰ä¸€ä¸ªç”µè¯å·ç ã€?以上三个æ–ÒŽ(gu¨©)³•åQŒç¬¬ä¸€¿Uæ–¹æ³•最不可取,按实际情况选取后两¿Uæƒ…å†üc€?<br /><br />½W¬äºŒèŒƒå¼ åQ?NFåQ‰ï¼šå¦‚果关系模式RåQˆUåQŒFåQ‰ä¸­çš„æ‰€æœ‰éžä¸Õd±žæ€§éƒ½å®Œå…¨ä¾èµ–于ä“Q意一个候选关键字åQŒåˆ™¿U°å…³¾p»R 是属于第二范式的ã€?例:选课关系 SCIåQˆSNOåQŒCNOåQŒGRADEåQŒCREDITåQ‰å…¶ä¸­SNOä¸ºå­¦åøP¼Œ CNO䏸™¯¾½E‹å·åQŒGRADEGE 为成¾l©ï¼ŒCREDIT 为学分ã€?ç”׃»¥ä¸Šæ¡ä»Óž¼Œå…³é”®å­—䨓¾l„合关键字(SNOåQŒCNOåQ?在应用中使用以上关系模式有以下问题: <br />a.数据冗余åQŒå‡è®‘֐Œä¸€é—¨è¯¾ç”?0个学生选修åQŒå­¦åˆ†å°± 重复40‹Æ¡ã€?<br />b.更新异常åQŒè‹¥è°ƒæ•´äº†æŸè¯„¡¨‹çš„学分,相应的元¾l„CREDIT值都要更斎ͼŒæœ‰å¯èƒ½ä¼šå‡ºçŽ°åŒä¸€é—¨è¯¾å­¦åˆ†ä¸åŒã€?<br />c.插入异常åQŒå¦‚计划开新课åQŒç”±äºŽæ²¡äººé€‰ä¿®åQŒæ²¡æœ‰å­¦å·å…³é”®å­—åQŒåªèƒ½ç­‰æœ‰äh选修才能把课½E‹å’Œå­¦åˆ†å­˜å…¥ã€?<br />d.删除异常åQŒè‹¥å­¦ç”Ÿå·²ç»¾l“业åQŒä»Žå½“前数据库删除选修记录。某些门评¡¨‹æ–°ç”Ÿž®šæœªé€‰ä¿®åQŒåˆ™æ­¤é—¨è¯„¡¨‹åŠå­¦åˆ†è®°å½•无法保存ã€?原因åQšéžå…³é”®å­—属性CREDIT仅函æ•îC¾èµ–于CNOåQŒä¹Ÿž®±æ˜¯CREDIT部分依赖¾l„合关键字(SNOåQŒCNOåQ‰è€Œä¸æ˜¯å®Œå…¨ä¾èµ–ã€?解决æ–ÒŽ(gu¨©)³•åQšåˆ†æˆä¸¤ä¸ªå…³¾pÀL¨¡å¼?SC1åQˆSNOåQŒCNOåQŒGRADEåQ‰ï¼ŒC2åQˆCNOåQŒCREDITåQ‰ã€‚新关系包括两个关系模式åQŒå®ƒä»¬ä¹‹é—´é€šè¿‡SC1中的外关键字CNO相联¾p»ï¼Œéœ€è¦æ—¶å†?˜q›è¡Œè‡ªç„¶è”接åQŒæ¢å¤äº†åŽŸæ¥çš„å…³¾p?</p> <p>½W¬ä¸‰èŒƒå¼åQ?NFåQ‰ï¼šå¦‚果关系模式RåQˆUåQŒFåQ‰ä¸­çš„æ‰€æœ‰éžä¸Õd±žæ€§å¯¹ä»ÖM½•候选关键字都不存在传递信赖, 则称关系R是属于第三范式的ã€?例:如S1åQˆSNOåQŒSNAMEåQŒDNOåQŒDNAMEåQŒLOCATIONåQ?å„å±žæ€§åˆ†åˆ«ä»£è¡¨å­¦åøP¼Œå§“名åQŒæ‰€åœ¨ç³»åQŒç³»åç§°åQŒç³»åœ°å€ã€?关键字SNO军_®šå„个属性。由于是单个关键字,没有部分依赖的问题,肯定æ˜?NF。但˜q™å…³¾p»è‚¯å®šæœ‰å¤§é‡çš„冗余,有关学生所在的几个属性DNOåQ?DNAMEåQŒLOCATIONž®†é‡å¤å­˜å‚¨ï¼Œæ’å…¥åQŒåˆ é™¤å’Œä¿®æ”¹æ—¶ä¹Ÿž®†äñ”生类ä¼ég»¥ä¸Šä¾‹çš„æƒ…å†üc€?原因åQšå…³¾pÖM¸­å­˜åœ¨ä¼ é€’依赖造成的。即SNO -> DNO。而DNO -> SNO却不存在åQŒDNO -> LOCATION,因此关键è¾?SNO å¯?LOCATION 函数军_®šæ˜¯é€šè¿‡ä¼ é€’依èµ?SNO -> LOCATION实现的。也ž®±æ˜¯è¯ß_¼ŒSNO不直接决定非ä¸Õd±žæ€§LOCATIONã€?解决目地åQšæ¯ä¸ªå…³¾pÀL¨¡å¼ä¸­ä¸èƒ½ç•™æœ‰ä¼ é€’依赖ã€?解决æ–ÒŽ(gu¨©)³•åQšåˆ†ä¸ÞZ¸¤ä¸ªå…³¾p?SåQˆSNOåQŒSNAMEåQŒDNOåQ‰ï¼ŒDåQˆDNOåQŒDNAMEåQŒLOCATIONåQ?注意åQšå…³¾p»S中不能没有外关键字DNO。否则两个关¾pÖM¹‹é—´å¤±åŽ»è”¾p…R€?/p> <p>BCNFåQ?如果关系模式RåQˆUåQŒFåQ‰çš„æ‰€æœ‰å±žæ€§ï¼ˆåŒ…括ä¸Õd±žæ€§å’Œéžä¸»å±žæ€§ï¼‰éƒ½ä¸ä¼ é€’依赖于Rçš„ä“Q何候选关键字åQŒé‚£ä¹ˆç§°å…³ç³»R是属于BCNF的。或是关¾pÀL¨¡å¼RåQŒå¦‚果每 个决定因素都包含关键字(而不是被关键字所包含åQ‰ï¼Œåˆ™RCNF的关¾pÀL¨¡å¼ã€?例:配äšg½Ž¡ç†å…³ç³»æ¨¡å¼ WPEåQˆWNOåQŒPNOåQŒENOåQŒQNTåQ‰åˆ†åˆ«è¡¨ä»“åº“åøP¼Œé…äšgåøP¼ŒèŒå·¥åøP¼Œæ•°é‡ã€‚有以下条äšg a.一个仓库有多个职工ã€?b.一个职工仅在一个仓库工作ã€?c.每个仓库里一¿Uåž‹åïLš„配äšgç”׃¸“äºø™´Ÿè´£ï¼Œä½†ä¸€ä¸ªäh可以½Ž¡ç†å‡ ç§é…äšgã€?d.同一¿Uåž‹åïLš„配äšg可以分放在几个仓库中ã€?分析åQšç”±ä»¥ä¸Šå¾?PNO 不能¼‹®å®šQNTåQŒç”±¾l„合属性(WNOåQŒPNOåQ‰æ¥å†›_®šåQŒå­˜åœ¨å‡½æ•îC¾èµ–(WNOåQŒPNOåQ?>ENO。由于每个仓库里的一¿Ué…ä»¶ç”±ä¸“ähè´Ÿè´£åQŒè€Œä¸€ä¸ªäh可以½Ž¡ç†å‡ ç§é…äšgåQŒæ‰€ä»¥æœ‰¾l„合属性(WNOåQŒPNOåQ‰æ‰èƒ½ç¡®å®šè´Ÿè´£ähåQŒæœ‰åQˆWNOåQ?PNOåQ?> ENO。因ä¸?一个职工仅在一个仓库工作,有ENO ->WNO。由于每个仓库里的一¿Ué…ä»¶ç”±ä¸“ähè´Ÿè´£åQŒè€Œä¸€ä¸ªèŒå·¥ä»…在一个仓库工作,æœ?åQˆENOåQŒPNOåQ?> QNTã€?找一下候选关键字åQŒå› ä¸ºï¼ˆWNOåQŒPNOåQ?-> QNTåQŒï¼ˆWNOåQŒPNOåQ?> ENO åQŒå› æ­¤ï¼ˆWNOåQŒPNOåQ‰å¯ä»¥å†³å®šæ•´ä¸ªå…ƒ¾l„,是一个候选关键字。根据ENO->WNOåQŒï¼ˆENOåQŒPNOåQ?>QNTåQŒæ•…åQˆENOåQŒPNOåQ?也能军_®šæ•´ä¸ªå…ƒç»„åQŒäؓ另一个候选关键字。属性ENOåQŒWNOåQŒPNOå‡äØ“ä¸Õd±žæ€§ï¼Œåªæœ‰ä¸€ä¸ªéžä¸Õd±žæ€§QNT。它对ä“Q何一个候选关键字都是完全函数依赖的,òq?且是直接依赖åQŒæ‰€ä»¥è¯¥å…³ç³»æ¨¡å¼æ˜?NFã€?分析一下主属性。因为ENO->WNOåQŒä¸»å±žæ€§ENO是WNO的决定因素,但是它本íw«ä¸æ˜¯å…³é”®å­—åQŒåªæ˜¯ç»„合关键字的一部分。这ž®±é€ æˆä¸Õd±žæ€§WNOå¯?另外一个候选关键字åQˆENOåQŒPNOåQ‰çš„éƒ?åˆ†ä¾èµ–ï¼Œå› äØ“åQˆENOåQŒPNOåQ?>ENO但反˜q‡æ¥ä¸æˆç«‹ï¼Œè€ŒP->WNOåQŒæ•…åQˆENOåQŒPNOåQ?> WNO 也是传递依赖ã€?虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来éºÈƒ¦ã€‚如一个新职工分配åˆîC»“库工作,但暂时处于实习阶ŒDµï¼Œæ²¡æœ‰ç‹¬ç«‹è´Ÿè´£å¯ÒŽ(gu¨©)Ÿäº›é…ä»¶çš„½Ž¡ç†ä»ÕdŠ¡ã€‚ç”±äºŽç¼ºž®‘关键字的一部分PNO而无法插入到该关¾pÖM¸­åŽ…R€‚又如某个ähæ”ÒŽ(gu¨©)ˆä¸ç®¡é…äšg了去负责安全åQŒåˆ™åœ¨åˆ é™¤é…ä»¶çš„同时该职å·?也会被删除ã€?解决办法åQšåˆ†æˆç®¡ç†EPåQˆENOåQŒPNOåQŒQNTåQ‰ï¼Œå…³é”®å­—是åQˆENOåQŒPNOåQ‰å·¥ä½œEWåQˆENOåQŒWNOåQ‰å…¶å…³é”®å­—是ENO ¾~ºç‚¹åQšåˆ†è§£åŽå‡½æ•°ä¾èµ–的保持性较差。如此例中,ç”׃ºŽåˆ†è§£,函数依赖åQˆWNOåQŒPNOåQ?> ENO 丢失äº?因而对原来的语义有所破坏。没有体现出每个仓库里一¿Uéƒ¨ä»¶ç”±ä¸“äh负责。有可能出现一部äšgç”׃¸¤ä¸ªäh或两个以上的人来同时½Ž¡ç†ã€‚因此,分解之后的关¾pÀL¨¡å¼é™ä½Žäº†éƒ¨åˆ†å®Œæ•´æ€§çº¦æŸã€?</p> <p>一个关¾pÕdˆ†è§£æˆå¤šä¸ªå…³ç³»åQŒè¦ä½¿å¾—分解有意义,èµïL çš„要求是分解后不丢失原来的信息。这些信息不仅包括数æ?本èínåQŒè€Œä¸”包括由函æ•îC¾èµ–æ‰€è¡¨ç¤ºçš„æ•°æ®ä¹‹é—´çš„ç›æ€º’制约。进行分解的目标是达到更高一¾U§çš„规范化程度,但是分解的同时必™å»è€ƒè™‘两个问题åQšæ— æŸè”æŽ¥æ€§å’Œä¿æŒå‡?æ•îC¾èµ–。有时往往不可能做到既有无损联接性,又完全保持函æ•îC¾èµ–。需要根据需要进行权衡ã€?</p> <p>1NF直到BCNF的四¿UèŒƒå¼ä¹‹é—´æœ‰å¦‚下关系åQ?BCNF包含äº?NF包含2NF包含1NF </p> <p>ž®ç»“åQšç›®åœŽÍ¼šè§„范化目的是使结构更合理åQŒæ¶ˆé™¤å­˜å‚¨å¼‚常,使数据冗余尽量小åQŒä¾¿äºŽæ’入、删除和更新原则åQšéµä»Žæ¦‚念单一åŒ?"一事一åœ?原则åQŒå³ä¸€ä¸ªå…³¾pÀL¨¡å¼æ˜qîC¸€ä¸ªå®žä½“或实体间的一¿Uè”¾p…R€‚规范的实质ž®±æ˜¯æ¦‚念的单一化ã€?æ–ÒŽ(gu¨©)³•åQšå°†å…³ç³»æ¨¡å¼æŠ•媄分解成两个或两个以上的关¾pÀL¨¡å¼ã€?要求åQšåˆ†è§£åŽçš„å…³¾pÀL¨¡å¼é›†åˆåº”当与原关¾pÀL¨¡å¼?½{‰ä­h(hu¨¢n)"åQŒå³¾lè¿‡è‡ªç„¶è”接可以恢复原关¾p»è€Œä¸ä¸¢å¤±ä¿¡æ¯åQŒåƈ保持属性间合理的联¾p…R€?</p> <p>注意åQ?一个关¾pÀL¨¡å¼ç»“˜q™åˆ†è§£å¯ä»¥å¾—åˆîC¸åŒå…³¾pÀL¨¡å¼é›†åˆï¼Œä¹Ÿå°±æ˜¯è¯´åˆ†è§£æ–ÒŽ(gu¨©)³•不是唯一的。最ž®å†—ä½™çš„è¦æ±‚å¿…é¡»ä»¥åˆ†è§£åŽçš„æ•°æ®åº“èƒ½å¤Ÿè¡¨è¾¾åŽŸæ¥æ•°æ®åº“æ‰€æœ‰ä¿¡æ¯äØ“å‰ææ¥å®ž 现。其æ ÒŽ(gu¨©)œ¬ç›®æ ‡æ˜¯èŠ‚çœå­˜å‚¨ç©ºé—ß_¼Œé¿å…æ•°æ®ä¸ä¸€è‡´æ€§ï¼Œæé«˜å¯¹å…³¾pÈš„æ“ä½œæ•ˆçއåQŒåŒæ—¶æ»¡­‘›_º”用需求。实际上åQŒåƈ不一定要求全部模式都辑ֈ°BCNF不可。有时故æ„?保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库¾pȝ»Ÿæ›´æ˜¯å¦‚æ­¤ã€?</p> <p>在关¾pÀL•°æ®åº“中,除了函数依赖之外˜q˜æœ‰å¤šå€ég¾èµ–,联接依赖的问题,从而提å‡ÞZº†½W¬å››èŒƒå¼åQŒç¬¬äº”范式等更高一¾U§çš„规范化要求ã€?/p> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/98396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-02-06 17:44 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用sql实现递归http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98391.htmlž®ç¥ž®ç¥Tue, 06 Feb 2007 09:24:00 GMThttp://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98391.htmlhttp://www.aygfsteel.com/ilovezmh/comments/98391.htmlhttp://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98391.html#Feedback5http://www.aygfsteel.com/ilovezmh/comments/commentRss/98391.htmlhttp://www.aygfsteel.com/ilovezmh/services/trackbacks/98391.html MS SQL Serverä¸?/strong>

tb_city表结构如�br />id      name      parentid
1      湖北      0
2      湖南      0
3      武汉      1
4      仙桃      1
5      长沙      2
6      蔡甸      3

定义函数
create function c_tree(@initid int)/*定义函数c_treeåQŒè¾“入参æ•îCؓ初始节点id*/
returns @t table(id int,name varchar(100),parentid int,lev int)/*定义表t用来存放取出的数�/
begin
  declare @i int/*标志递归¾U§åˆ«*/
  set @i=1
  insert @t select id,name,parentid,@i from tb_city where id=@initid
  while @@rowcount<>0
  begin
  set @i=@i+1
  insert @t select a.id,a.name,a.parentid,@i from tb_city as a,@t as b
 where b.id=a.parentid and b.lev=@i-1
  end
return
end

执行
使用函数
select * from c_tree(1) /*取湖北下面的子节�/

Oracle中的实现

select *  from TB_CITY
/*此处可写WHERE语句限制*/
start with ID=1
connect by prior ID=PARENTID



]]>
用jexcelè¯Õd†™excelçš?xlsæ–‡äšg的例å­?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98270.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Tue, 06 Feb 2007 05:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98270.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/98270.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98270.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/98270.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/98270.html</trackback:ping><description><![CDATA[ <p>有时候我们会需要做excel的报è¡?下面˜q™ä¸ªä¾‹å­è¯¦ç»†çš„ç»™å‡ÞZº†è¯Õd†™åŠå®šä¹‰æ ·å¼çš„æ–ÒŽ(gu¨©)³•ã€?br />(<a href="/Files/ilovezmh/jexcelapi.rar" target="_blank">jexcel下蝲</a>)<br />package com.test;</p> <p>import java.io.File;<br />import java.io.IOException;</p> <p>import jxl.Cell;<br />import jxl.Sheet;<br />import jxl.Workbook;<br />import jxl.format.Border;<br />import jxl.format.BorderLineStyle;<br />import jxl.format.Colour;<br />import jxl.read.biff.BiffException;<br />import jxl.write.Label;<br />import jxl.write.WritableCellFormat;<br />import jxl.write.WritableFont;<br />import jxl.write.WritableSheet;<br />import jxl.write.WritableWorkbook;<br />import jxl.write.WriteException;<br />import jxl.write.biff.RowsExceededException;</p> <p>/**<br /> * <br /> * CopyRight (C) <a href="/ilovezmh">www.aygfsteel.com/ilovezmh</a>  All rights reserved.<p><br /> * <br /> * WuHan Inpoint Information Technology Development,Inc.<p><br /> * <br /> * Author zhu<p><br /> *<br /> * @version 1.0    2007-2-6<br /> *<br /> * <p>Base on : JDK1.5<p><br /> *<br /> */</p> <p>public class JexcelSample {<br /> <br /> /**<br />  * 写excelæ–‡äšg<br />  *<br />  */<br /> public void writeExc(File filename){<br />  WritableWorkbook wwb = null;<br />  try <br />  { <br />   wwb = Workbook.createWorkbook(filename);   <br />  }<br />  catch (Exception e){ <br />   e.printStackTrace(); <br />  } <br />  <br />  //创徏Excel工作è¡?<br />  WritableSheet ws = wwb.createSheet("通讯å½?, 0);//创徏sheet<br />  try {<br />   ws.mergeCells(0, 0, 2, 1);//åˆåÆˆå•å…ƒæ ?左列åQŒå·¦è¡Œï¼Œå›_ˆ—åQŒå³è¡?从第1行第1列到½W?行第3åˆ?br />   Label header = new Label(0, 0, "通讯å½?191026ç?", getHeader()); <br />   ws.addCell(header);//写入å¤?br />   Label l = new Label(0, 2, "姓名", getTitle());//½W?è¡?br />   ws.addCell(l);<br />   l = new Label(1, 2, "电话", getTitle());<br />   ws.addCell(l);<br />   l = new Label(2, 2, "地址", getTitle());<br />   ws.addCell(l);<br />   l = new Label(0, 3, "ž®ç¥", getNormolCell());//½W?è¡?br />   ws.addCell(l);<br />   l = new Label(1, 3, "1314***0974", getNormolCell());<br />   ws.addCell(l);<br />   l = new Label(2, 3, "武汉武昌", getNormolCell());<br />   ws.addCell(l);<br />   l = new Label(0, 4, "ž®æ–½", getNormolCell());//½W?è¡?br />   ws.addCell(l);<br />   l = new Label(1, 4, "1347***5057", getNormolCell());<br />   ws.addCell(l);<br />   l = new Label(2, 4, "武汉武昌", getNormolCell());<br />   ws.addCell(l);<br />   ws.setColumnView(0,20);//讄¡½®åˆ—宽<br />   ws.setColumnView(1,20);<br />   ws.setColumnView(2,40);<br />   ws.setRowView(0,400);//讄¡½®è¡Œé«˜<br />   ws.setRowView(1,400);<br />   ws.setRowView(2,500);<br />   ws.setRowView(3,500);<br />   ws.setRowView(4,500);<br />  } catch (RowsExceededException e1) {<br />   e1.printStackTrace();<br />  } catch (WriteException e1) {<br />   e1.printStackTrace();<br />  }<br />  <br />  //输出‹¹?br />  try {<br />   wwb.write();<br />  } catch (IOException ex) {<br />   // TODO 自动生成 catch å?br />   ex.printStackTrace();<br />  }<br />  //关闭‹¹?br />  try {<br />   wwb.close();<br />  } catch (WriteException ex) {<br />   // TODO 自动生成 catch å?br />   ex.printStackTrace();<br />  } catch (IOException ex) {<br />   // TODO 自动生成 catch å?br />   ex.printStackTrace();<br />  }<br />  //outStream.close();<br />  System.out.println("写入成功åQ\n");<br /> }<br /> <br /> public void readExc(File filename) throws BiffException, IOException{</p> <p>    Workbook wb = Workbook.getWorkbook(filename);<br />    Sheet s = wb.getSheet(0);//½W?个sheet<br />    Cell c = null;<br />    int row = s.getRows();//总行æ•?br />    int col = s.getColumns();//æ€Õdˆ—æ•?br />    for(int i=0;i<row;i++){<br />     for(int j=0;j<col;j++){<br />      c = s.getCell(j,i);<br />      System.out.print(c.getContents()+"  ");<br />     }<br />     System.out.println();<br />    }   <br /> }<br /> <br /> /**<br />  * 讄¡½®å¤´çš„æ ·å¼<br />  * @return <br />  */<br /> public static WritableCellFormat getHeader(){<br />  WritableFont font = new  WritableFont(WritableFont.TIMES, 24 ,WritableFont.BOLD);//定义字体<br />  try {<br />   font.setColour(Colour.BLUE);//蓝色字体<br />  } catch (WriteException e1) {<br />   // TODO 自动生成 catch å?br />   e1.printStackTrace();<br />  }<br />  WritableCellFormat format = new  WritableCellFormat(font);<br />  try {<br />   format.setAlignment(jxl.format.Alignment.CENTRE);//左右居中<br />   format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中<br />   format.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);//黑色è¾ÒŽ(gu¨©)¡†<br />   format.setBackground(Colour.YELLOW);//黄色背景<br />  } catch (WriteException e) {<br />   // TODO 自动生成 catch å?br />   e.printStackTrace();<br />  }<br />  return format;<br /> }<br /> <br /> /**<br />  * 讄¡½®æ ‡é¢˜æ ·å¼<br />  * @return<br />  */<br /> public static WritableCellFormat getTitle(){<br />  WritableFont font = new  WritableFont(WritableFont.TIMES, 14);<br />  try {<br />   font.setColour(Colour.BLUE);//蓝色字体<br />  } catch (WriteException e1) {<br />   // TODO 自动生成 catch å?br />   e1.printStackTrace();<br />  }<br />  WritableCellFormat format = new  WritableCellFormat(font);<br />  <br />  try {<br />   format.setAlignment(jxl.format.Alignment.CENTRE);<br />   format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);<br />   format.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);<br />  } catch (WriteException e) {<br />   // TODO 自动生成 catch å?br />   e.printStackTrace();<br />  }<br />  return format;<br /> }<br /> <br /> /**<br />  * 讄¡½®å…¶ä»–单元格样å¼?br />  * @return<br />  */<br /> public static WritableCellFormat getNormolCell(){//12号字ä½?上下左右居中,带黑色边æ¡?br />  WritableFont font = new  WritableFont(WritableFont.TIMES, 12);<br />  WritableCellFormat format = new  WritableCellFormat(font);<br />  try {<br />   format.setAlignment(jxl.format.Alignment.CENTRE);<br />   format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);<br />   format.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);<br />  } catch (WriteException e) {<br />   // TODO 自动生成 catch å?br />   e.printStackTrace();<br />  }<br />  return format;<br /> }<br /> <br /> public static void main(String[] args) throws IOException, BiffException{<br />  JexcelSample js = new JexcelSample();<br />  File f = new File("D:\\address.xls");<br />  f.createNewFile();<br />  js.writeExc(f);<br />  js.readExc(f);<br /> }</p> <p>}<br /><br />生成的excel表格如下åQ?br /><img src="http://www.aygfsteel.com/images/blogjava_net/ilovezmh/19805/r_address.jpg" /></p> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/98270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-02-06 13:21 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/02/06/98270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java读配¾|®æ–‡ä»?xml、property)的简单例å­?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97326.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Thu, 01 Feb 2007 09:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97326.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/97326.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97326.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/97326.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/97326.html</trackback:ping><description><![CDATA[<p><font size="4"><strong>读propertyæ–‡äšg的例子:<br /> </strong></font><br /> package com.test;</p> <p>import java.io.InputStream;<br /> import java.util.Properties;</p> <p>/**<br />  * <br />  * CopyRight (C) <a href="http://www.aygfsteel.com/ilovezmh">www.aygfsteel.com/ilovezmh</a>  All rights reserved.<p><br />  * <br />  * WuHan Inpoint Information Technology Development,Inc.<p><br />  * <br />  * Author zhu<p><br />  *<br />  * @version 1.0    2007-2-2<br />  *<br />  * <p>Base on : JDK1.5<p><br />  *<br />  */</p> <p>public class ReadPro {<br />  <br />  public String getPara(String fileName) {<br />   <br />   Properties prop= new Properties();<br />   try {<br />    //ClassLoader cl = this.getClass().getClassLoader(); <br />    //InputStream is = cl.getResourceAsStream(fileName);<br />    InputStream is = this.getClass().getResourceAsStream(fileName);<br />    prop.load(is);<br />    if(is!=null) is.close();<br />   }<br />   catch(Exception e) {<br />    System.out.println(e+"file "+fileName+" not found");<br />   }<br />   return prop.getProperty("ip");<br />  }<br />  <br />  public static void main(String[] args) {<br />   ReadPro pro = new ReadPro();<br />   System.out.println(pro.getPara("ip.property"));<br />  }<br />  <br />  //-----------------------------------<br />  //ip.property内容如下åQ?br />  //ip:192.168.0.1<br />  <br /> }</p> <p><br /> 注意åQšä¸Šé¢ä‹É用Classå’ŒClassLoader都是可以的,只是使用的时候èµ\径需要注意下</p> <p>    Class是把classæ–‡äšgæ‰€åœ¨çš„ç›®å½•åšäØ“æ ¹ç›®å½•ï¼Œ</p> <p>    ClassLoader是把加蝲所有classpathçš„ç›®å½•äØ“æ ¹ç›®å½•ï¼Œä¹Ÿå°±æ˜?#8220;..../classes”ã€?/p> <p><span style="color: #000000">    å¦‚:</span></p> <p><span style="color: #000000">    ä½¿ç”¨ClassLoaderåQšthis.getClass().getClassLoader().getResourceAsStream("com/test/ip.property");</span></p> <p><span style="color: #000000">    ä½¿ç”¨ClassåQšthis.getClass().getResourceAsStream("/com/test/ip.property");</span></p> <p><span style="color: #000000">                        å¦‚æžœ¾cÖM¸Žé…ç½®æ–‡äšg在同一目录下,也可</span></p> <p><span style="color: #000000">                        this.getClass().getResourceAsStream("ip.property");</span></p> <p><br /> <font size="4"><strong>用jdom读xmlæ–‡äšg的例子:<br /> </strong></font>(<a href="http://www.aygfsteel.com/Files/ilovezmh/jdom-1.0.rar" target="_blank">jdom下蝲</a>)<br /> <br /> package com.test;<br /> import java.io.*;<br /> import java.util.*;</p> <p>import org.jdom.*;<br /> import org.jdom.input.*;<br /> import org.jdom.output.XMLOutputter;<br /> import org.jdom.output.Format;<br /> <br /> /**<br />  * <br />  * CopyRight (C) <a href="http://www.aygfsteel.com/ilovezmh">www.aygfsteel.com/ilovezmh</a> All rights reserved.<p><br />  * <br />  * WuHan Inpoint Information Technology Development,Inc.<p><br />  * <br />  * Author zhu<p><br />  *<br />  * @version 1.0    2007-2-1<br />  *<br />  * <p>Base on : JDK1.5<p><br />  *<br />  */<br />  public class XMLReader {<br />   <br />   public void createXML(){<br />    <br />    Element root=new Element("books");<br />    <br />    Document doc=new Document(root);<br />    Element book1 = new Element("book");<br />    //Element name1=new Element("name");<br />    //name1.setAttribute(new Attribute("hot","true"));<br />    //name1.addContent("½E‹åºå‘?);<br />    //Element price1=new Element("price");<br />    //price1.addContent("10.00");<br />    //book1.addContent(name1);<br />    //book1.addContent(price1); <br />    <br />    Element book2 = new Element("book");<br />    //Element name2=new Element("name");<br />    //name2.setAttribute(new Attribute("hot","false"));<br />    //name2.addContent("读è€?);<br />    //Element price2=new Element("price");<br />    //price2.addContent("3.00");<br />    //book2.addContent(name2);<br />    //book2.addContent(price2);<br />       <br />    book1.addContent(new Element("name").addContent("½E‹åºå‘?).setAttribute("hot","true"));<br />    book1.addContent(new Element("price").addContent("10.00"));<br />    book2.addContent(new Element("name").addContent("青年文摘").setAttribute("hot","false"));<br />    book2.addContent(new Element("price").addContent("3.00"));<br />    root.addContent(book1);<br />    root.addContent(book2);<br />    <br />    try<br />    {<br />     XMLOutputter outer=new XMLOutputter(Format.getPrettyFormat().setEncoding("gb2312"));<br />     outer.output(doc,new FileOutputStream("book.xml"));<br />    }catch(IOException e){<br />     e.printStackTrace();<br />    }<br />   }<br />   <br />   public void readXML() throws FileNotFoundException, IOException{<br />    <br />    Document myDoc=null;<br />    try<br />    {<br />     SAXBuilder sb=new SAXBuilder();<br />     myDoc=sb.build(new FileInputStream("book.xml"));<br />    }catch(JDOMException e){<br />     e.printStackTrace();<br />    }catch(NullPointerException e){<br />     e.printStackTrace();<br />    }<br />    <br />    Element root=myDoc.getRootElement(); //先得到根元素<br />    List books=root.getChildren();//root.getChildren("book"); <br />    for (Iterator iter1 = books.iterator();iter1.hasNext(); ) {<br />        Element book = (Element) iter1.next();<br />        System.out.println("bookname:"+book.getChild("name").getText());<br />        System.out.println("hot:"+book.getChild("name").getAttributeValue("hot"));<br />        System.out.println("price:"+book.getChild("price").getText());<br />    }<br />    <br />   }<br />    <br />   public static void main(String args[]) throws FileNotFoundException, IOException {<br />   <br />    XMLReader x=new XMLReader();<br />    x.createXML();<br />    x.readXML();</p> <p> }</p> <p>}<br /> <br /> 生成的book.xmlæ–‡äšg如下:<br /> <?xml version="1.0" encoding="gb2312"?><br /> <books><br />   <book><br />     <name hot="true">½E‹åºå‘?lt;/name><br />     <price>10.00</price><br />   </book><br />   <book><br />     <name hot="false">青年文摘</name><br />     <price>3.00</price><br />   </book><br /> </books><br /> </p> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/97326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-02-01 17:17 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用jdbc操作数据库的½Ž€å•例å­?/title><link>http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97247.html</link><dc:creator>ž®ç¥</dc:creator><author>ž®ç¥</author><pubDate>Thu, 01 Feb 2007 06:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97247.html</guid><wfw:comment>http://www.aygfsteel.com/ilovezmh/comments/97247.html</wfw:comment><comments>http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97247.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ilovezmh/comments/commentRss/97247.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ilovezmh/services/trackbacks/97247.html</trackback:ping><description><![CDATA[ <p>一个简单的用jdbc操作数据库的例子,有时候我们处理一些小问题的时候会发现很有ç”?<br /><br />˜q™æ˜¯ç”¨æ¥ä»Žä¸€ä¸ªAccess的数据库文äšgarea.mdb(一个全国省份城市的数据åº?中提取出我需要的信息到MS SQLServer 2000数据库里的例å­?<br /><br />package com.test;</p> <p>import java.io.IOException;<br />import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.PreparedStatement;<br />import java.sql.ResultSet;<br />import java.sql.SQLException;<br />import java.sql.Statement;</p> <p>/**<br /> * <br /> * CopyRight (C) <a href="/ilovezmh">http://www.aygfsteel.com/ilovezmh</a>  All rights reserved.<p><br /> * <br /> * WuHan Inpoint Information Technology Development,Inc.<p><br /> * <br /> * Author zhu<p><br /> *<br /> * @version 1.0    2007-1-17<br /> *<br /> * <p>Base on : JDK1.5<p><br /> *<br /> */</p> <p>public class City {<br /> <br /> static String driver1="sun.jdbc.odbc.JdbcOdbcDriver";<br /> static String driver2="net.sourceforge.jtds.jdbc.Driver";<br /> static String url1="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\TDdownload\\area\\area.mdb";<br /> static String url2="jdbc:jtds:sqlserver://localhost:1433/test;SelectMethod=cursor;characterEncoding=GBK";<br /> <br /> public static void main(String arg[]) throws IOException,SQLException{<br />  <br />  <br />  Connection conn1=null;<br />  Connection conn2=null;<br />  Statement ps1=null;<br />  //Statement ps2=null;<br />  ResultSet rs1=null;<br />  //ResultSet rs2=null;<br />  String sql1=null;<br />  String sql2=null;<br />  PreparedStatement pstmt =null;<br />  <br />  try{<br />   Class.forName(driver1);<br />   Class.forName(driver2);<br />   conn1 = DriverManager.getConnection(url1,"","");<br />   conn2= DriverManager.getConnection(url2,"sa","sa");<br />   ps1 = conn1.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);<br />   //ps2 = conn2.createStatement();<br />  }<br />  catch(ClassNotFoundException e){<br />   System.out.print(e);<br />  } <br />  catch (SQLException e) {<br />   // TODO 自动生成 catch å?br />   e.printStackTrace();<br />  }<br />  <br />  try{   <br />   sql1="select * from area";<br />   rs1 = ps1.executeQuery(sql1);<br />   sql2 = "insert into tbcity(code,name,parentid,type) values (?,?,?,?)";<br />   pstmt=conn2.prepareStatement(sql2);<br />   <br />   int code=0;<br />   int parentid=0;<br />   String name=new String();<br />   while(rs1.next()){    <br />    code=rs1.getInt(2);<br />    name=rs1.getString(3);<br />    parentid=rs1.getInt(4);<br />    //sql2="insert into TBCITY(code,name,parentid,type) values ("+code+",'"+name+"',"+parentid+",3)";<br />    //ps2.executeUpdate(sql2);<br />    pstmt.setInt(1,code); <br />    pstmt.setString(2, name);<br />    pstmt.setInt(3,parentid);<br />    pstmt.setInt(4, 3);<br />    pstmt.addBatch();<br />   }    <br />   pstmt.executeBatch();    <br />     <br />   System.out.println("转换完成!谢谢使用");<br />   ps1.close();<br />   //ps2.close();<br />   pstmt.close();<br />   conn1.close();<br />   conn2.close();<br />  }<br />  catch(Exception e){<br />   System.out.print(e);<br />  }<br />  <br /> }<br /> <br />}<br /></p> <img src ="http://www.aygfsteel.com/ilovezmh/aggbug/97247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ilovezmh/" target="_blank">ž®ç¥</a> 2007-02-01 14:09 <a href="http://www.aygfsteel.com/ilovezmh/archive/2007/02/01/97247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">»ÆÁêÏØ</a>| <a href="http://" target="_blank">ÒÊÄÏÏØ</a>| <a href="http://" target="_blank">ÈýËëÏØ</a>| <a href="http://" target="_blank">Ê©µéÏØ</a>| <a href="http://" target="_blank">ÔÆÄÏÊ¡</a>| <a href="http://" target="_blank">°¢¿ËÌÕÏØ</a>| <a href="http://" target="_blank">ÉîÛÚÊÐ</a>| <a href="http://" target="_blank">ÔÇÎ÷ÏØ</a>| <a href="http://" target="_blank">Ó¦Óñر¸</a>| <a href="http://" target="_blank">À¥Ã÷ÊÐ</a>| <a href="http://" target="_blank">ÎäÉ½ÏØ</a>| <a href="http://" target="_blank">ÎäÚìÏØ</a>| <a href="http://" target="_blank">ÆëºÓÏØ</a>| <a href="http://" target="_blank">¹ÅÕÉÏØ</a>| <a href="http://" target="_blank">ÍòÄþÊÐ</a>| <a href="http://" target="_blank">ÑôÐÂÏØ</a>| <a href="http://" target="_blank">¸ÊËàÊ¡</a>| <a href="http://" target="_blank">Çຣʡ</a>| <a href="http://" target="_blank">̨±±ÏØ</a>| <a href="http://" target="_blank">¸»Æ½ÏØ</a>| <a href="http://" target="_blank">ʦ×ÚÏØ</a>| <a href="http://" target="_blank">ÁijÇÊÐ</a>| <a href="http://" target="_blank">ÎÚÀ¼ºÆÌØÊÐ</a>| <a href="http://" target="_blank">ÎäÇåÇø</a>| <a href="http://" target="_blank">ºÍÆ½Çø</a>| <a href="http://" target="_blank">²ìÑÅÏØ</a>| <a href="http://" target="_blank">¶«ÏçÏØ</a>| <a href="http://" target="_blank">ƽºþÊÐ</a>| <a href="http://" target="_blank">ÇØ»ÊµºÊÐ</a>| <a href="http://" target="_blank">¶«ÎÚ</a>| <a href="http://" target="_blank">Îä³ÇÏØ</a>| <a href="http://" target="_blank">Ä«Öñ¹¤¿¨ÏØ</a>| <a href="http://" target="_blank">¹ðƽÊÐ</a>| <a href="http://" target="_blank">ÎäÏçÏØ</a>| <a href="http://" target="_blank">ÄϽ­ÏØ</a>| <a href="http://" target="_blank">ƽÀûÏØ</a>| <a href="http://" target="_blank">Ì쳤ÊÐ</a>| <a href="http://" target="_blank">ÄϳäÊÐ</a>| <a href="http://" target="_blank">ÎÅÏ²ÏØ</a>| <a href="http://" target="_blank">Íß·¿µêÊÐ</a>| <a href="http://" target="_blank">Ñ×ÁêÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>