??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品美女在线观看,亚洲精品中文字幕无乱码麻豆,亚洲国产精品白丝在线观看http://m.tkk7.com/ilovezmh/archive/2007/07/07/128720.htmlFri, 06 Jul 2007 16:12:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/07/07/128720.htmlhttp://m.tkk7.com/ilovezmh/comments/128720.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/07/07/128720.html#Feedback7http://m.tkk7.com/ilovezmh/comments/commentRss/128720.htmlhttp://m.tkk7.com/ilovezmh/services/trackbacks/128720.html阅读全文

2007-07-07 00:12 发表评论
]]>
关于复选框的验证与jsp取?/title><link>http://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/05/30/121004.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/121004.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/05/30/121004.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/121004.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovezmh/services/trackbacks/121004.html</trackback:ping><description><![CDATA[今天做一个类似邮件的多选操作时用到?jin)复选框Q有关验证与取g前也做过Q记的不是很清楚?jin),今天弄清白?jin)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>全选及(qing)验证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中取值如下:(x)</strong><br>String[] answer= request.getParameterValues("answer");//q里只取得了(jin)选中的项Q如果没有选中M一,则ؓ(f)null<br>if(answer!=null){<br>   for(String i:answer){<br>      System.out.println(i);<br>   }<br>}<br> <img src ="http://m.tkk7.com/ilovezmh/aggbug/121004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-05-30 22:04 <a href="http://m.tkk7.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://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/05/30/121000.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/121000.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/05/30/121000.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/121000.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovezmh/services/trackbacks/121000.html</trackback:ping><description><![CDATA[写了(jin)q么久了(jin)jspQ最常用的jsp头和ȝ存代码要手写q一时还写不出来。。。留个记念了(jin)<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://m.tkk7.com/ilovezmh/aggbug/121000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-05-30 21:48 <a href="http://m.tkk7.com/ilovezmh/archive/2007/05/30/121000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript学习(fn)W记(?Q-错误处理http://m.tkk7.com/ilovezmh/archive/2007/04/25/113370.htmlTue, 24 Apr 2007 16:58:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/25/113370.htmlhttp://m.tkk7.com/ilovezmh/comments/113370.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/25/113370.html#Feedback1http://m.tkk7.com/ilovezmh/comments/commentRss/113370.htmlhttp://m.tkk7.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()Ӟ׃(x)引发一个异常。这时会(x)弹出警告框显C?#8220;An error occurred.”不幸的是Q浏览器的错误信息也昄出来?jin),要从览器中隐藏它,onerror事g处理函数必须q回true|(x)如下
<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处理函数提供?jin)三U信息来定错误切的性质Q?br>错误信息Q-对于l定错误Q浏览器?x)显C同L(fng)信息?br>URLQ-在哪个文件中发生?jin)错误?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不存在)(j)Qerror事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处理函数不同Qimage的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>

注:(x)使用onerror事g处理函数的主要问题是Q它是BOM的一部分Q所以,没有M标准能控制它的行为。因此,不同的浏览器使用q个事g处理函数处理错误的方式有明显的不同。例如,在IE中发生error事gӞ正常的代码会(x)l箋执行Q所有的变量和数据都保存下来Qƈ可能qonerror事g处理函数讉K。然而在Mozilla中,正常的代码执行都?x)结束,同时所有错误发生之前的变量和数据都被销毁。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不同QECMAScript标准在try...catch语句中指定只能有一个catch子句。因为javascript是弱cdQ没办法指明catch子句中的异常的特定类型。不错误是什么类型,都由同一个catch子句处理。Mozilla对其q行?jin)扩展,可?f)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对象
cM于java有个用于抛出的基cExceptionQjavascript有个Error基类用于抛出。Error对象有以下特性:(x)
nameQ-表示错误cd的字W串?br>messageQ-实际的错误信息?br>Error对象的名U对象对应于它的c?因ؓ(f)Error只是一个基c?Q可以是以下g一Q?br>
c?/td> 发生原因
EvalError 错误发生在eval()函数?/td>
RangeError 数字的D出javascript可表C的范围
ReferenceError 使用?jin)非法的引?/td>
SyntaxError 在eval()函数调用中发生了(jin)语法错误。其他的语法错误由浏览器报告Q无法通过try...catch语句处理
TypeError 变量的类型不是预期所需?/td>
URIError 在encodeURI()或者decodeURI()函数中发生了(jin)错误

Mozilla和IE都扩展了(jin)Erro对象以适应各自的需求。Mozilla提供一个fileNameҎ(gu)来表示错误发生在哪一个文件中Q以?qing)一个stackҎ(gu)以包含到错误发生时的调用堆?IE提供?jin)一个numberҎ(gu)来表示错误代号?br>(3)判断错误cd
<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)抛出异常
ECMAScriptW三版还引入?jin)throw语句Q用于有目的的抛出异常。语法如下:(x)
throw error_object;      //error_object可以是字W串、数字、布?yu)(dng)值或者是实际的对象?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比如RangeErrorQ,所以区分浏览器抛出的错误和开发h员抛出的错误很简单,使用前面的技术就行了(jin)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);
   }
}
注意(g)查instanceof Error必须是if语句中的最后一个条Ӟ因ؓ(f)所有其他的错误c都l承于它Q所以在(g)instanceof Error旉q回trueQ?br>
所有的览器都可以报告开发h员抛出的错误Q但是错误消息的昄方式可能有所不同。IE6只会(x)在抛出Error对象Ӟ才显C错误信?其他情况下,它就只显CException thrown and not caughtQ而没有Q何详l内宏VMozilla则会(x)报告Error:uncaught exception:然后调用所抛出的对象的toString()Ҏ(gu)?

2007-04-25 00:58 发表评论
]]>
javascript学习(fn)W记(?Q-DOM基础http://m.tkk7.com/ilovezmh/archive/2007/04/24/113336.htmlTue, 24 Apr 2007 14:06:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/24/113336.htmlhttp://m.tkk7.com/ilovezmh/comments/113336.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/24/113336.html#Feedback4http://m.tkk7.com/ilovezmh/comments/commentRss/113336.htmlhttp://m.tkk7.com/ilovezmh/services/trackbacks/113336.html1.节点(node)层次
DocumentQ-最层的节点,所有的其他节点都是附属于它的?br>DocumentTypeQ-DTD引用Q?lt;!DOCTYPE>语法Q的对象表现形式Q它不能包含子节炏V?br>DocumentFragmentQ-可以像Document一h保存其他节点?br>ElementQ-表示起始标签和结束标{之间的内容Q例?lt;tag></tab>或?lt;tag/>。这是唯一可以同时包含Ҏ(gu)和子节点的节点cd?br>AttrQ-代表一对特性名和特性倹{这个节点类型不能包含子节点?br>TextQ-代表XML文档中的在v始标{֒l束标签之间Q或者CDataSection内包含的普通文本。这个节点类型不能包含子节点?br>CDataSectionQ-<![CDATA[]]>的对象表现Ş式。这个节点类型仅能包含文本节点Text作ؓ(f)子节炏V?br>EntityQ-表示在DTD中的一个实体定义,例如<!ENTITY foo"foo">。这个节点类型不能包含子节点?br>EntityReferenceQ-代表一个实体引用,例如&quot;。这个节点类型不能包含子节点?br>ProcessingInstructionQ-代表一个PI。这个节点类型不能包含子节点?br>CommentQ-代表XML注释。这个节点不能包含子节点?br>NotationQ-代表在DTD中定义的记号。这个很用到?br>
Node接口定义?jin)所有节点类型都包含的特性和Ҏ(gu)?br>
Ҏ(gu)?Ҏ(gu) cd/q回cd 说明
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ؓ(f)null
nextSibling Node 指向后一个兄弟节?如果q个节点是最后一个兄弟节点,那么该gؓ(f)null
hasChildNodes() Boolean 当childNodes包含一个或多个节点?q回?/td>
attributes NamedNodeMap 包含?jin)代表一个元素的Ҏ(gu)的Attr对象;仅用于Element节点
appendChild(node) Node noded到childNodes的末?/td>
removeChild(node) Node 从childNodes中删除node
replaceChild(newnode,oldnode) Node childNodes中的oldnode替换成newnode
insertBefore(newnode,refnode) Node 在childNodes中的refnode之前插入newnodd

除节点外QDOMq定义了(jin)一些助手对象,它们可以和节点一起用,但不是DOM文档必有的部分?br>NodeListQ-节点数组Q按照数D行烦(ch)?用来表示和一个元素的子节炏V?br>NamedNodeMapQ-同时使用数值和名字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):(x)
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 arrayQ用方括号标记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定义了(jin)document.body作ؓ(f)指向<body/>元素的指针?br>var oBody = ducument.body;
有了(jin)oHtml,oHead和oBodyq三个变量,可以尝试确定它们之间的关系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-noded到列表中Q按其nodeName属性进行烦(ch)?
item(pos)Q-像NodeList一Pq回在位|pos的节?
注:(x)误住这些方法都是返回一个Attr节点Q而非Ҏ(gu)倹{?br>
NamedNodeMap对象也有一个length属性来指示它所包含的节点的数量?br>当NamedNodeMap用于表示Ҏ(gu)时Q其中每个节炚w是Attr节点Q这的nodeName属性被讄为特性名Uͼ而nodeValue属性被讄为特性的倹{例如,假设有这样一个元素:(x)
<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(fng)微有些不直观Q?br>var sId = oP.attributes.item(1).nodeValue;
q可以通过lnodeValue属性赋新值来改变idҎ(gu):(x)
oP.attributes.getNamedItem("id").nodeValue="newId";
Attr节点也有一个完全等同于(同时也完全同步于)nodeValue属性的value属性,q且有name属性和nodeName属性保持同步。我们可以随意用这些属性来修改或变更特性?br>因ؓ(f)q个Ҏ(gu)有些累赘QDOM又定义了(jin)三个元素Ҏ(gu)来帮助访问特性:(x)
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()
核心(j)(XML) DOM定义?jin)getElementsByTagName()Ҏ(gu)Q用来返回一个包含所有的tagName(标签?Ҏ(gu)等于某个指定值的元素的NodeList。在Element对象中,tagNameҎ(gu)L{于于号之后紧跟随的名UͼQ例如,<img />的tagName?img"。下一行代码返回文档中所?lt;img />元素的列表:(x)
var oImgs = document.getElementsByTagName("img");
把所有图形都存于oImgs后,只需使用Ҏ(gu)h者Item()Ҏ(gu)QgetElementsByTagName()q回一个和childNodes一L(fng)NodeListQ,可以像讉K子节炚w样逐个讉Kq些节点?jin)?x)
alert(oImgs[0].tagName);      //outputs "IMG"
假如只想获取在某个页面第一个段落的所有图像,可以通过对第一个段落元素调用getElementsByTagName()来完成,像这P(x)
var oPs = document.getElementByTagName("p");
var oImgsInp = oPs[0].getElementByTagName("img");
可以使用一个星L(fng)Ҏ(gu)来获取document中的所有元素:(x)
var oAllElements = document.getElementsByTagName("*");
当参数是一个星L(fng)时候,IE6.0q不q回所有的元素。必M用document.all来替代它?br>(2)getElementsByName()
HTML DOM 定义?jin)getElementsByName()Q这用来获取所有nameҎ(gu)等于指定值的元素的?br>(3)getElementById()
q是HTML DOM定义的第二种Ҏ(gu)Q它?yu)返回idҎ(gu)等于指定值的元素。在HTML中,idҎ(gu)是唯一的-Q这意味着没有两个元素可以׃n同一个id。毫无疑问这是从文档?wi)中获取单个指定元素最快的Ҏ(gu)?br>注:(x)如果l定的ID匚w某个元素的nameҎ(gu),IE6.0q会(x)q回q个元素。这是一个bugQ也是必非常小?j)的一个问题?br>
5.创徏新节?br>最常用到的几个Ҏ(gu)?br>createDocumentFragment()Q-创徏文档片节点
createElement(tagname)Q-创徏标签名ؓ(f)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.bodyQ或者它的后代节点)(j)中,面׃(x)更新q反映出q个变化。对于少量的更新Q这是很好的Q然而,当要向documentd大量数据Ӟ如果逐个dq些变动Q这个过E有可能?x)十分缓慢。ؓ(f)解决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>大部分情况下QHTML DOM元素中包含的所有特性都是可作ؓ(f)属性?br>假设有如下图像元素:(x)
<img src = "mypicture.jpg" border=0 />
如果要用核?j)的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 DOMQ可以用同样名U的属性来获取和设|这些|(x)
alert(oImg.src);
alert(oImg.border);
oImg.src="mypicture2.jpg";
oImg.border ="1";
唯一的特性名和属性名不一L(fng)特例是class属性,它是用来指定应用于某个元素的一个CSSc,因ؓ(f)class在ECMAScript中是一个保留字Q在javascript中,它不能被作ؓ(f)变量名、属性名或都函数名。于是,相应的属性名变成了(jin)className;
注:(x)IE在setAttribute()上有很大的问题,最好尽可能使用属性?br>
7.tableҎ(gu)
Z(jin)协助建立表格QHTML DOMl?lt;table/>,<tbody/>?lt;tr/>{元素添加了(jin)一些特性和Ҏ(gu)?br>l?lt;table/>元素d?jin)以下内容?x)
Ҏ(gu)?Ҏ(gu) 说明
caption 指向<caption/>元素q将其放入表?/td>
tBodies <tbody/>元素的集?/td>
tFoot 指向<tfoot/>元素Q如果存在)(j)
tHead 指向<thead/>元素Q如果存在)(j)
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?jin)以下内?br>
Ҏ(gu)?Ҏ(gu) 说明
rows <tbody/>中所有行的集?/td>
deleteRow(position) 删除指定位置上的?/td>
insertRow(position) 在rows集合中的指定位置上插入一个新?/td>

<tr/>元素d?jin)以下内?br>
Ҏ(gu)?Ҏ(gu) 说明
cells <tr/>元素中所有的单元格的集合
deleteCell(postion) 删除l定位置上的单元?/td>
insertCell(postion) 在cells集合的给点位|上插入一个新的单元格

8.遍历DOM
NodeIteratorQTreeWalker
DOM Level2的功能,q些功能只有在Mozilla和Konqueror/Safari中才有,q里׃介绍?jin)?br>

2007-04-24 22:06 发表评论
]]>
javascript学习(fn)实践Q-新手上\Q-验证表单http://m.tkk7.com/ilovezmh/archive/2007/04/18/111783.htmlWed, 18 Apr 2007 15:36:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111783.htmlhttp://m.tkk7.com/ilovezmh/comments/111783.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111783.html#Feedback2http://m.tkk7.com/ilovezmh/comments/commentRss/111783.htmlhttp://m.tkk7.com/ilovezmh/services/trackbacks/111783.htmlq几天学?fn)javascriptQ就只在看书Q都没怎么实践Q?br>今天工作的时候要(g)验表单数据,属性N多,以前做的时候是Ҏ(gu)个属性都写四五句话来判断Q类?br>function checkData(){
   if(document.forms[0].username==""){
      alert("误入用户名");
      document.forms[0].username.focus();
      return false;
   }
   return true;
}
关于q种验证的实用性暂且不谈,现在一般的验证早已不用q个?jin)?br>只是Z(jin)在工作中偷偷懒,写了(jin)个方便点的CheckUtilQ如?br>



其实也可以方便的Ҏ(gu)需要更Ҏ(gu)C的方式?

2007-04-18 23:36 发表评论
]]>
javascript学习(fn)W记(?Q-资料http://m.tkk7.com/ilovezmh/archive/2007/04/18/111435.htmlTue, 17 Apr 2007 16:50:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111435.htmlhttp://m.tkk7.com/ilovezmh/comments/111435.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111435.html#Feedback4http://m.tkk7.com/ilovezmh/comments/commentRss/111435.htmlhttp://m.tkk7.com/ilovezmh/services/trackbacks/111435.html把整个文档放在这里算?jin),到时候需要再找?br>重要的地方再记录下了(jin)?br>注:(x)本资料ؓ(f)《javascript高E序设计》一书配套源代码。学?fn)笔C从本书摘录?br>
源代码下?/a>

2007-04-18 00:50 发表评论
]]>
javascript学习(fn)W记(?Q-事ghttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111430.htmlTue, 17 Apr 2007 16:18:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111430.htmlhttp://m.tkk7.com/ilovezmh/comments/111430.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/18/111430.html#Feedback2http://m.tkk7.com/ilovezmh/comments/commentRss/111430.htmlhttp://m.tkk7.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学习(fn)W记(?Q-(g)浏览器和操作系l?/title><link>http://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/04/18/111429.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/111429.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/04/18/111429.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/111429.html</wfw:commentRss><trackback:ping>http://m.tkk7.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://m.tkk7.com/ilovezmh/aggbug/111429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-04-18 00:13 <a href="http://m.tkk7.com/ilovezmh/archive/2007/04/18/111429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript学习(fn)W记(?Q-正则表达?http://m.tkk7.com/ilovezmh/archive/2007/04/17/111120.htmlMon, 16 Apr 2007 16:45:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/17/111120.htmlhttp://m.tkk7.com/ilovezmh/comments/111120.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/17/111120.html#Feedback7http://m.tkk7.com/ilovezmh/comments/commentRss/111120.htmlhttp://m.tkk7.com/ilovezmh/services/trackbacks/111120.html1.元字W?br>q里是正则表辑ּ用到的所有元字符
(  [  {  \  ^  $  |  )  ?  *  +  .
M时候要在正则表辑ּ中用这些元字符Q都必须对它们进行{义。因此要匚w一个问P正则表达式就该这栯C:(x)
var veQMark =/\?/;
或者这栯C:(x)
var veQMark=new RegExp("\\?");
注意当正则表辑ּ以第二种形式表示Ӟ所有的反斜杠都必须用两个反斜杠来替换,因ؓ(f)javascript字符串解析器?x)按照\n的方式尝试翻译\?。ؓ(f)?jin)保证不会(x)出现这个问题,在元字符的前面加上两个反斜杠Q双重{义)(j)。这个小的gotcha是多数开发者更偏好使用字面量语法的原因?br>
2.使用Ҏ(gu)字符
要用ASCII来表CZ个字W,则必L定一个两位的十六q制代码Qƈ有前面加上\x。例如字Wb的ASCII码ؓ(f)98Q等于十六进制的62Q因此,表示字符b可以使用\x62
另外也可以用八q制代替十六q制来指定字W代码,直接在反斜杠之后跟上八进制数|例如Qb{于八进制的142Q所以下面就该这?br>/\142/
如果要用Unicode来表C字W,必须指定字符串的四位十六q制表示形式Q因此b应该是\u0062
另外q有其他一些预定义的特D字W,如下表所?br>
字符 描述
\t 制表W?/td>
\n 换行W?/td>
\r 回RW?/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>要匹配除?jin)a和b的所有字W,那么q个字符是[^ab]
3.3范围c?br>[a-z]
[A-Z]
[0-9]
[^1-4]
3.4l合c?br>匚w所有从a~m的字母以?qing)?~4的数字,以及(qing)一个换行符
[a-m1-4\n]
3.5预定义类
代码 {同?/td> 匚w
. [^\n\r] 除了(jin)换行和回车之外的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ơ)(j)
{n} 一定出现n?/td>
{n,m} 臛_出现nơ但不超qm?/td>
{n,} 臛_出现n?/td>
4.2贪婪的、惰性的和支配性的量词
贪婪量词Q先看整个的字符串是不是一个匹配,如果没有发现匚wQ它L字符串中的最后一个字W,q再ơ尝试。直到发C个匹配字W或者字W串不剩M字符?br>惰性量词:(x)先看字符串中的第一个字U是不是一个匹配。如果单独这个字W还不够Q就d下一个字W,l成两个字符的字W串Q如果还是没有发现匹配,l箋d字会(x)直到发现一个或者整个字W都(g)查过也没有匹配。其工作方式恰好与贪婪相反?br>支配量词Q只试匚w整个字符丌Ӏ如果整个字W串不能产生匚wQ不做进一步尝试?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.分组
分组是通过一pd括号包围一pd字符、字W类以及(qing)量词来用的?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)|我们UC为反向引用?br>反向引用是按照从左到右遇到的左括号字W的序q行创徏和编L(fng)。例如表辑ּ(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行匚wQ像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完成了(jin)dQ但是十分冗ѝ还有另一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,我们UC为捕h分l。同时还有一U非捕获性分l,它不?x)创建反向引用。在较长的正则表辑ּ中,存储反向引用?x)降低匹配速度?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而不Ud其位|。同样存在正向前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(jin)几种可能的边?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选项。这?x)?边界匚w换行W?\n)以及(qing)字符串真正的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>globalQ-Boolean|表示g(全局选项)是否已设|?br>ignoreCaseQ-Boolean|表示i(忽略大小写选项)是否已设|?br>lastIndexQ-整数Q代表下ơ匹配将?x)从哪个字符位置开?只有当用exec()或test()函数才会(x)填入Q否则ؓ(f)0)?br>multilineQ-Boolean|表示m(多行模式选项)是否已设|?br>sourceQ-正则表达式的源字W串形式。例如表辑ּ/[ba]*/的source返?[ba]*"?br>
2.?rn)态属?br>?rn)态的RegExp属性对所有的正则表达式都有效?br>
长名 短名 描述
input $_ 最后用于匹配的字符?传递给exec()或test()的字W串)
lastMatch $& 最后匹配的字符
lastParen $+ 最后匹配的分组
leftContext $` 在上ơ匹配的前面的子?/td>
multiline $* 用于指定是否所有的表达式都使用多行模式的布?yu)(dng)?/td>
rightContext $' 在上ơ匹配之后的子串

IE和Operaq不支持RegExp.multilineQ所以最好单独的Ҏ(gu)个表辑ּ讄m选项而不要直接设|这个标记?/p>

2007-04-17 00:45 发表评论
]]>
javascript学习(fn)W记(?Q-l承http://m.tkk7.com/ilovezmh/archive/2007/04/16/111106.htmlMon, 16 Apr 2007 15:24:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/16/111106.htmlhttp://m.tkk7.com/ilovezmh/comments/111106.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/16/111106.html#Feedback4http://m.tkk7.com/ilovezmh/comments/commentRss/111106.htmlhttp://m.tkk7.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删除?jin)新?gu)的代码行后定义。否则,可能?x)覆盖超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和ClassYh相同的属性或Ҏ(gu)QClassYh高优先Q因为承的是最后的cR?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的对象和要传递参数的数组。例如:(x)
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只有超cM的参数顺序与子类中的参数序完全一致时才可以传递参数对象。如果不是,必dZ个单独的数组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库给ObjectcL加了(jin)两个Ҏ(gu)QinheritFrom()和instanceOf()
ClassB.prototype.inheritFrom(ClassA);
CalssB.instanceOf(ClassA);

2.xbObjects?br>可以?a );
         q里Q子cd类名都以字W串形式传进来,而不是指向它们的构造函数的指针。这个调用必L在指定子cȝ构造构函数前?br>W二步,在构造函数内调用defineClass()Ҏ(gu)Q传l它cd?qing)被ClaryUCؓ(f)原型函数的指针,该函数用于初始化对象的所有属性和Ҏ(gu)?br>?br>_classes.registerClass("ClassA");
function ClassA(color){
   _classes.defineClass("ClassA",prototypeFunction);

   function prototypeFunction(){
      //...
   }
}
W三步,cd建init()Ҏ(gu)。该Ҏ(gu)负责讄该类的所有属性,它必L受与构造函数相同的参数。作ZU规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学习(fn)W记(一)Q-对象http://m.tkk7.com/ilovezmh/archive/2007/04/16/111098.htmlMon, 16 Apr 2007 14:20:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/04/16/111098.htmlhttp://m.tkk7.com/ilovezmh/comments/111098.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/04/16/111098.html#Feedback4http://m.tkk7.com/ilovezmh/comments/commentRss/111098.htmlhttp://m.tkk7.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?jin)同一个函数?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样解决?jin)重复创建函数对象的问题Q但该函数看h不像对象的方法。所有这些问题引发了(jin)开发者定义的构造函数的出现?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(x)重复生成函数Qؓ(f)每个对象都创建独立的函数版本。不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();
它解决了(jin)前面两种方式存在的两个问题。但q不h意。首先,q个构造函数没有参数。用原型方式时Q不能通过构造函C递参数初始化属性的|q点很o(h)厌,但还没完Q真正的问题出现在属性指向的是对象,而不是函数时。考虑下面的例子:(x)
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般对象了(jin)。所有的非函数属性都有构造函C创徏Q意味着又可用构造函数的参数赋予属性默认g(jin)。因为只创徏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种方式使用newq算W,使它看v来像真正的构造函数?br>
7.采用哪种方式
   如前所qͼ目前使用最q泛的是混合的构造函?原型方式。些外,动态原型方法也很流行,在功能上与前者等P可以采用q两U方式中的Q何一U?br>
二、修改对?br>1.创徏新方?br>可以用prototype属性ؓ(f)M已有的类定义新方法,像处理自己的类一栗?br>例:(x)
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)。函数名只是指向函数的指针,因此可以LC它指向其他函数?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学习(fn)W记http://m.tkk7.com/ilovezmh/archive/2007/03/24/106037.htmlSat, 24 Mar 2007 04:18:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/03/24/106037.htmlhttp://m.tkk7.com/ilovezmh/comments/106037.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/03/24/106037.html#Feedback0http://m.tkk7.com/ilovezmh/comments/commentRss/106037.htmlhttp://m.tkk7.com/ilovezmh/services/trackbacks/106037.html
最q学?fn)webworkQ主要是《webwork in action》一书,以及(qing)一些其它的文档。书是看完了(jin)Qwebwork大致有所?jin)解Q还没有Z(x)和时间去?br />
c(din)记下了(jin)一些配|型的东西,方便以后查阅。还有很多东西没记录下来Q以后实늚话,再逐步完善?br />
文档q有炚wQ就用文件的形式?jin)?br />
下蝲地址

2007-03-24 12:18 发表评论
]]>
dEclipse插g的简单方?/title><link>http://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/03/12/103408.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/103408.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/03/12/103408.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/103408.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovezmh/services/trackbacks/103408.html</trackback:ping><description><![CDATA[q几天下?jin)很多Eclipse的插Ӟ参考Myeclipse插gQ发C(jin)一个很方便单的Ҏ(gu)Q方便安装和删除?br /><br />Eclipse插g都会(x)带有features和pluginsq两个文件夹Q一般的x都会(x)是直接把q两个文件添加到Eclipse中去。且不谈q样?x)不会(x)成功,当你要删除它的时候,要找到它的文仉?x)很ȝ?ch)?br /><br />下面介绍下我使用的方法,以jigloo_395QSWT/Swing的图形工P(j)Z?br /><br />首先当然是下载j(lu)igloo_395.zipQ解压后攑ֈ你想攄的位|,不用一定放在eclipse中,比如“D:\eclipse-plugs\jigloo_395”?br /><br />然后在它下面新徏一个文件夹命名为eclipseQ再features和pluginsq两个文件夹拖进厅R?br /><br />最后打开你安装的eclipse路径Q比如“D:\eclipse”,打开links文g夹,新徏文本文gQ在里面输入“path=D:\\eclipse-plugs\\jigloo_395”,最后将文g重命名ؓ(f)“jigloo_395.link”。OK?jin)。。?br /><br />重新打开Eclipse,你会(x)在窗?>首选项中看到这个插件了(jin)。具体用法请参考jigloo_395的用文档?br /><br /><img src ="http://m.tkk7.com/ilovezmh/aggbug/103408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-03-12 22:48 <a href="http://m.tkk7.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://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/02/06/98396.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/98396.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/02/06/98396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/98396.html</wfw:commentRss><trackback:ping>http://m.tkk7.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 />可以是一对一、一对多、多对多的关pR在一般情况下Q它们是一对一的关p:(x)即一张原始单据对应且只对应一个实体。在Ҏ(gu)情况下,它们可能是一对多或多对一的关p,即一张原始单据对应多个实体,或多张原始单据对应一个实体。这里的实体可以理解为基本表。明这U对应关pdQ对我们设计录入界面大有好处?<br /><br />〖例1〗:(x)一份员工历资料,在h力资源信息系l中Q就对应三个基本表:(x)员工基本情况表、社?x)关p表、工作简历表。这是“一张原始单据对应多个实体”的典型例子?<br /><br /><font size="4"><strong>2. 主键与外?/strong></font><br /><br />一般而言Q一个实体不能既无主键又无外键。在EQR 图中, 处于叶子部位的实? 可以定义主键Q也可以不定义主?因ؓ(f)它无子孙), 但必要有外?因ؓ(f)它有父亲)?<br />主键与外键的设计Q在全局数据库的设计中,占有重要C。当全局数据库的设计完成以后Q有个美国数据库设计专家_(d)(x)“键Q到处都是键Q除?jin)键之外Q什么也没有”,q就是他的数据库设计l验之谈Q也反映?jin)他对信息系l核?数据模型)的高度抽象思想。因为:(x)主键是实体的高度抽象Q主键与外键的配对,表示实体之间的连接?<br /><br /><font size="4"><strong>3. 基本表的性质</strong></font><br /><br />基本表与中间表、(f)时表不同Q因为它h如下四个Ҏ(gu):(x) <br />(1) 原子性。基本表中的字段是不可再分解的?<br />(2) 原始性。基本表中的记录是原始数据(基础数据Q的记录?<br />(3) 演绎性。由基本表与代码表中的数据,可以z出所有的输出数据?<br />(4) E_性。基本表的结构是相对E_的,表中的记录是要长期保存的?<br />理解基本表的性质后,在设计数据库Ӟp基本表与中间表、(f)时表区分开来?<br /><br /><font size="4"><strong>4. 范式标准</strong></font><br /><br />基本表及(qing)其字D之间的关系, 应尽量满第三范式。但是,满W三范式的数据库设计Q往往不是最好的设计。ؓ(f)?jin)提高数据库的运行效率,常常需要降低范式标准:(x)适当增加冗余Q达CI间换时间的目的?<br />〖例2〗:(x)有一张存攑֕品的基本表,如表1所C。“金额”这个字D늚存在Q表明该表的设计不满第三范式,因ؓ(f)“金额”可以由“单价”乘以“数量”得刎ͼ说明“金额”是冗余字段。但是,增加“金额”这个冗余字D,可以提高查询l计的速度Q这是以空间换旉的作法?在Rose 2002中,规定列有两种cdQ数据列和计列。“金额”这L(fng)列被UCؓ(f)“计列”,而“单价”和“数量”这L(fng)列被UCؓ(f)“数据列”?<br />? 商品表的表结?<br />商品名称 商品型号 单h(hun) 数量 金额 <br />?sh)视?29?2,500 40 100,000 <br /><br /><font size="4"><strong>5. 通俗地理解三个范?/strong></font><br /><br />通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中Qؓ(f)?jin)更好地应用三个范式Q就必须通俗地理解三个范?通俗地理解是够用的理解,q不是最U学最准确的理?Q?<br />W一范式Q?NF是对属性的原子性约束,要求属性具有原子性,不可再分解; <br />W二范式Q?NF是对记录的惟一性约束,要求记录有惟一标识Q即实体的惟一性; <br />W三范式Q?NF是对字段冗余性的U束Q即M字段不能由其他字D|生出来,它要求字D|有冗余?<br />没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时Z(jin)提高q行效率Q就必须降低范式标准Q适当保留冗余数据。具体做法是Q在概念数据模型设计旉守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字D,允许冗余?<br /><br /><font size="4"><strong>6. 要善于识别与正确处理多对多的关系</strong></font><br /><br />若两个实体之间存在多对多的关p,则应消除q种关系。消除的办法是,在两者之间增加第三个实体。这P原来一个多对多的关p,现在变ؓ(f)两个一对多的关pR要原来两个实体的属性合理地分配C个实体中厅R这里的W三个实体,实质上是一个较复杂的关p,它对应一张基本表。一般来Ԍ数据库设计工具不能识别多对多的关p,但能处理多对多的关系?br /> <br />〖例3〗:(x)在“图书馆信息pȝ”中Q“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关p,是一个典型的多对多关p:(x)一本图书在不同旉可以被多个读者借阅Q一个读者又可以借多本图书。ؓ(f)此,要在二者之间增加第三个实体Q该实体取名为“借还书”,它的属性ؓ(f)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前者比后者好。当P(yng)K是字D名的组合时Q徏议字D늚个数不要太多Q多?jin)不但?ch)引占用空间大Q而且速度也慢?<br /><br /><font size="4"><strong>8. 正确认识数据冗余</strong></font><br /><br />主键与外键在多表中的重复出现, 不属于数据冗余,q个概念必须清楚Q事实上有许多hq不清楚。非键字D늚重复出现, 才是数据冗余Q而且是一U低U冗余,即重复性的冗余。高U冗余不是字D늚重复出现Q而是字段的派生出现?<br />〖例4〗:(x)商品中的“单仗数量、金额”三个字D,“金额”就是由“单价”乘以“数量”派生出来的Q它?yu)是冗余Q而且是一U高U冗余。冗余的目的是ؓ(f)?jin)提高处理速度。只有低U冗余才?x)增加数据的不一致性,因ؓ(f)同一数据Q可能从不同旉、地炏V角色上多次录入。因此,我们提倡高U冗?z性冗?Q反对低U冗?重复性冗??<br /><br /><font size="4"><strong>9. EQR图没有标准答?/strong></font><br /><br />信息pȝ的EQR图没有标准答案,因ؓ(f)它的设计与画法不是惟一的,只要它覆盖了(jin)pȝ需求的业务范围和功能内容,是可行的。反之要修改EQR图。尽它没有惟一的标准答案,q不意味着可以随意设计。好的EQ图的标准是Q结构清晰、关联简z、实体个数适中、属性分配合理、没有低U冗余?<br /><br /><font size="4"><strong>10. 视图技术在数据库设计中很有?/strong></font><br /><br />与基本表、代码表、中间表不同Q视图是一U虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一UŞ? 是数据处理的一U方法,是用h据保密的一U手Dc(din)ؓ(f)?jin)进行复杂处理、提高运速度和节省存储空? 视图的定义深度一般不得超q三层?若三层视图仍不够? 则应在视图上定义临时? 在(f)时表上再定义视图。这样反复交q定? 视图的深度就不受限制?jin)?<br />对于某些与国家政沅R经、技术、军事和安全利益有关的信息系l,视图的作用更加重要。这些系l的基本表完成物理设计之后,立即在基本表上徏立第一层视图,q层视图的个数和l构Q与基本表的个数和结构是完全相同。ƈ且规定,所有的E序员,一律只准在视图上操作。只有数据库理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作?<br /><br /><font size="4"><strong>11. 中间表、报表和临时?/strong></font><br /><br />中间表是存放l计数据的表Q它是ؓ(f)数据仓库、输出报表或查询l果而设计的Q有时它没有主键与外?数据仓库除外)。(f)时表是程序员个h设计的,存放临时记录Qؓ(f)个h所用。基表和中间表由DBAl护Q(f)时表q序员自己用程序自动维护?br /> <br /><font size="4"><strong>12. 完整性约束表现在三个斚w</strong></font> <br /><br />域的完整性:(x)用Check来实现约束,在数据库设计工具中,对字D늚取D围进行定义时Q有一个Check按钮Q通过它定义字D늚值城?<br />参照完整性:(x)用PK、FK、表U触发器来实现?<br />用户定义完整性:(x)它是一些业务规则,用存储过E和触发器来实现?<br /><br /><font size="4"><strong>13. 防止数据库设计打补丁的方法是“三原则?</strong></font><br /><br />(1) 一个数据库中表的个数越越好。只有表的个数少?jin),才能说明pȝ的EQR囑ְ而精Q去掉了(jin)重复的多余的实体QŞ成了(jin)对客观世界的高度抽象Q进行了(jin)pȝ的数据集成,防止?jin)打补丁式的设计Q?<br />(2) 一个表中组合主键的字段个数少好。因Z键的作用Q一是徏主键索引Q二是做为子表的外键Q所以组合主键的字段个数了(jin)Q不仅节省了(jin)q行旉Q而且节省?jin)?ch)引存储空_(d) <br />(3) 一个表中的字段个数少好。只有字D늚个数了(jin)Q才能说明在pȝ中不存在数据重复Q且很少有数据冗余,更重要的是督?j)读者学?x)“列变行”,q样防止了(jin)子表中的字D|入到主表中去Q在主表中留下许多空余的字段。所谓“列变行”,是主表中的一部分内容拉出去,另外单独Z个子表。这个方法很单,有的人就是不?fn)惯、不采纳、不执行?<br /><br />数据库设计的实用原则是:(x)在数据冗余和处理速度之间扑ֈ合适的q炏V“三”是一个整体概念,l合观点Q不能孤立某一个原则。该原则是相对的Q不是绝对的。“三多”原则肯定是错误的。试惻I(x)若覆盖系l同L(fng)功能Q一百个实体(׃千个属? 的EQR图,肯定比二百个实体(׃千个属?的EQR图,要好得多?<br /><br />提倡“三”原则,是叫读者学?x)利用数据库设计技术进行系l的数据集成。数据集成的步骤是将文gpȝ集成为应用数据库Q将应用数据库集成ؓ(f)主题数据库,主题数据库集成为全局l合数据库。集成的E度高Q数据共享性就强Q信息孤岛现象就少Q整个企业信息系l的全局E—R图中实体的个数、主键的个数、属性的个数׃(x)少?<br /><br />提倡“三”原则的目的Q是防止读者利用打补丁技术,不断地对数据库进行增删改Q企业数据库变成了(jin)随意设计数据库表的“垃圑֠”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、(f)时表杂ؕ无章Q不计其敎ͼD企事业单位的信息pȝ无法l护而瘫痪?<br /><br />“三多”原则Q何h都可以做刎ͼ该原则是“打补丁Ҏ(gu)”设计数据库的歪理学说。“三”原则是而精的原则,它要求有较高的数据库设计技巧与艺术Q不是Q何h都能做到的,因ؓ(f)该原则是杜绝用“打补丁Ҏ(gu)”设计数据库的理Z据?<br /><br /><font size="4"><strong>14. 提高数据库运行效率的办法</strong></font><br /><br />在给定的pȝg和系lY件条件下Q提高数据库pȝ的运行效率的办法是:(x) <br />(1) 在数据库物理设计Ӟ降低范式Q增加冗? 用触发? 多用存储q程?<br />(2) 当计非常复杂、而且记录条数非常巨大?例如一千万?Q复杂计要先在数据库外面,以文件系l方式用C++语言计算处理完成之后Q最后才入库q加到表中去。这是电(sh)信计费系l设计的l验?<br />(3) 发现某个表的记录太多Q例如超q一千万条,则要对该表进行水q_剌Ӏ水q_割的做法是,以该表主键PK的某个gؓ(f)界线Q将该表的记录水q_割ؓ(f)两个表。若发现某个表的字段太多Q例如超q八十个Q则垂直分割该表Q将原来的一个表分解Z个表?<br />(4) Ҏ(gu)据库理pȝDBMSq行pȝ优化Q即优化各种pȝ参数Q如~冲Z数?<br />(5) 在用面向数据的SQL语言q行E序设计Ӟ量采取优化法?<br /><br />MQ要提高数据库的q行效率Q必M数据库系l优化、数据库设计U优化、程序实现优化Q这三个层次上同时下功夫?<br />关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范?现简单介l?NFQ第一范式Q,2NFQ第二范式)(j)Q?NFQ第三范式)(j)和BCNFQ另有第四范式和W五范式留到以后再介l?在你设计数据库之Ӟ若能W合q几个范式,你就是数据库设计的高手?br /> <br />W一范式Q?NFQ:(x)在关pL式R中的每一个具体关pr中,如果每个属性?都是不可再分的最数据单位,则称R是第一范式的关pR例Q如职工P姓名Q电(sh)话号码组成一个表Q一个h可能有一个办公室?sh)?和一个家里电(sh)话号码)(j) 规范成ؓ(f)1NF有三U方法:(x) 一是重复存储职工号和姓名。这P关键字只能是?sh)话L(fng)?二是职工号ؓ(f)关键字,?sh)话L(fng)分ؓ(f)单位?sh)话和住宅?sh)话两个属?三是职工号ؓ(f)关键字,但强制每条记录只能有一个电(sh)话号码?以上三个Ҏ(gu)Q第一U方法最不可取,按实际情况选取后两U情c(din)?<br /><br />W二范式 Q?NFQ:(x)如果关系模式RQUQFQ中的所有非d性都完全依赖于Q意一个候选关键字Q则U关pR 是属于第二范式的?例:(x)选课关系 SCIQSNOQCNOQGRADEQCREDITQ其中SNO为学P CNOE号QGRADEGE 为成l,CREDIT 为学分?׃上条Ӟ关键字ؓ(f)l合关键字(SNOQCNOQ?在应用中使用以上关系模式有以下问题:(x) <br />a.数据冗余Q假讑֐一门课?0个学生选修Q学分就 重复40ơ?<br />b.更新异常Q若调整?jin)某评的学分,相应的元lCREDIT值都要更斎ͼ有可能会(x)出现同一门课学分不同?<br />c.插入异常Q如计划开新课Q由于没人选修Q没有学号关键字Q只能等有h选修才能把课E和学分存入?<br />d.删除异常Q若学生已经l业Q从当前数据库删除选修记录。某些门评新生未选修Q则此门评?qing)学分记录无法保存?原因Q非关键字属性CREDIT仅函C赖于CNOQ也是CREDIT部分依赖l合关键字(SNOQCNOQ而不是完全依赖?解决Ҏ(gu)Q分成两个关pL?SC1QSNOQCNOQGRADEQ,C2QCNOQCREDITQ。新关系包括两个关系模式Q它们之间通过SC1中的外关键字CNO相联p,需要时?q行自然联接Q恢复了(jin)原来的关p?</p> <p>W三范式Q?NFQ:(x)如果关系模式RQUQFQ中的所有非d性对M候选关键字都不存在传递信赖, 则称关系R是属于第三范式的?例:(x)如S1QSNOQSNAMEQDNOQDNAMEQLOCATIONQ?各属性分别代表学P姓名Q所在系Q系名称Q系地址?关键字SNO军_各个属性。由于是单个关键字,没有部分依赖的问题,肯定?NF。但q关p肯定有大量的冗余,有关学生所在的几个属性DNOQ?DNAMEQLOCATION重复存储,插入Q删除和修改时也生类g上例的情c(din)?原因Q关pM存在传递依赖造成的。即SNO -> DNO。而DNO -> SNO却不存在QDNO -> LOCATION,因此关键?SNO ?LOCATION 函数军_是通过传递依?SNO -> LOCATION实现的。也是_(d)SNO不直接决定非d性LOCATION?解决目地Q每个关pL式中不能留有传递依赖?解决Ҏ(gu)Q分Z个关p?SQSNOQSNAMEQDNOQ,DQDNOQDNAMEQLOCATIONQ?注意Q关pS中不能没有外关键字DNO。否则两个关pM间失去联pR?/p> <p>BCNFQ?如果关系模式RQUQFQ的所有属性(包括d性和非主属性)(j)都不传递依赖于R的Q何候选关键字Q那么称关系R是属于BCNF的。或是关pL式RQ如果每 个决定因素都包含关键字(而不是被关键字所包含Q,则RCNF的关pL式?例:(x)配g理关系模式 WPEQWNOQPNOQENOQQNTQ分别表仓库P配gP职工P数量。有以下条g a.一个仓库有多个职工?b.一个职工仅在一个仓库工作?c.每个仓库里一U型L(fng)配g׃责,但一个h可以理几种配g?d.同一U型L(fng)配g可以分放在几个仓库中?分析Q由以上?PNO 不能定QNTQ由l合属性(WNOQPNOQ来军_Q存在函C赖(WNOQPNOQ?>ENO。由于每个仓库里的一U配件由专h负责Q而一个h可以理几种配gQ所以有l合属性(WNOQPNOQ才能确定负责hQ有QWNOQ?PNOQ?> ENO。因?一个职工仅在一个仓库工作,有ENO ->WNO。由于每个仓库里的一U配件由专h负责Q而一个职工仅在一个仓库工作,?QENOQPNOQ?> QNT?找一下候选关键字Q因为(WNOQPNOQ?-> QNTQ(WNOQPNOQ?> ENO Q因此(WNOQPNOQ可以决定整个元l,是一个候选关键字。根据ENO->WNOQ(ENOQPNOQ?>QNTQ故QENOQPNOQ?也能军_整个元组Qؓ(f)另一个候选关键字。属性ENOQW(xu)NOQPNO均ؓ(f)d性,只有一个非d性QNT。它对Q何一个候选关键字都是完全函数依赖的,q?且是直接依赖Q所以该关系模式?NF?分析一下主属性。因为ENO->WNOQ主属性ENO是WNO的决定因素,但是它本w不是关键字Q只是组合关键字的一部分。这造成d性WNO?另外一个候选关键字QENOQPNOQ的?分依赖,因ؓ(f)QENOQPNOQ?>ENO但反q来不成立,而P->WNOQ故QENOQPNOQ?> WNO 也是传递依赖?虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会(x)带来ȝ(ch)。如一个新职工分配C库工作,但暂时处于实?fn)阶D,没有独立负责Ҏ(gu)些配件的理d。由于缺关键字的一部分PNO而无法插入到该关pM厅R又如某个hҎ(gu)不管配g?jin)去负责安全Q则在删除配件的同时该职?也会(x)被删除?解决办法Q分成管理EPQENOQPNOQQNTQ,关键字是QENOQPNOQ工作EWQENOQW(xu)NOQ其关键字是ENO ~点Q分解后函数依赖的保持性较差。如此例中,׃分解,函数依赖QWNOQPNOQ?> ENO 丢失?因而对原来的语义有所破坏。没有体现出每个仓库里一U部件由专h负责。有可能出现一部g׃个h或两个以上的人来同时理。因此,分解之后的关pL式降低了(jin)部分完整性约束?</p> <p>一个关pd解成多个关系Q要使得分解有意义,L(fng)的要求是分解后不丢失原来的信息。这些信息不仅包括数?本nQ而且包括由函C赖所表示的数据之间的怺制约。进行分解的目标是达到更高一U的规范化程度,但是分解的同时必考虑两个问题Q无损联接性和保持?C赖。有时往往不可能做到既有无损联接性,又完全保持函C赖。需要根据需要进行权衡?</p> <p>1NF直到BCNF的四U范式之间有如下关系Q?BCNF包含?NF包含2NF包含1NF </p> <p>结Q目圎ͼ(x)规范化目的是使结构更合理Q消除存储异常,使数据冗余尽量小Q便于插入、删除和更新原则Q遵从概念单一?"一事一?原则Q即一个关pL式描qC个实体或实体间的一U联pR规范的实质是概念的单一化?Ҏ(gu)Q将关系模式投媄(jing)分解成两个或两个以上的关pL式?要求Q分解后的关pL式集合应当与原关pL?{h(hun)"Q即l过自然联接可以恢复原关p而不丢失信息Qƈ保持属性间合理的联pR?</p> <p>注意Q?一个关pL式结q分解可以得C同关pL式集合,也就是说分解Ҏ(gu)不是唯一的。最冗余的要求必须以分解后的数据库能够表达原来数据库所有信息ؓ(f)前提来实 现。其Ҏ(gu)目标是节省存储空_(d)避免数据不一致性,提高对关pȝ操作效率Q同时满_用需求。实际上Qƈ不一定要求全部模式都辑ֈBCNF不可。有时故?保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库pȝ更是如此?</p> <p>在关pL据库中,除了(jin)函数依赖之外q有多g赖,联接依赖的问题,从而提Z(jin)W四范式Q第五范式等更高一U的规范化要求?/p> <img src ="http://m.tkk7.com/ilovezmh/aggbug/98396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-02-06 17:44 <a href="http://m.tkk7.com/ilovezmh/archive/2007/02/06/98396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用sql实现递归http://m.tkk7.com/ilovezmh/archive/2007/02/06/98391.htmlTue, 06 Feb 2007 09:24:00 GMThttp://m.tkk7.com/ilovezmh/archive/2007/02/06/98391.htmlhttp://m.tkk7.com/ilovezmh/comments/98391.htmlhttp://m.tkk7.com/ilovezmh/archive/2007/02/06/98391.html#Feedback5http://m.tkk7.com/ilovezmh/comments/commentRss/98391.htmlhttp://m.tkk7.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_treeQ输入参Cؓ(f)初始节点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 I(yng)D=1
connect by prior ID=PARENTID



2007-02-06 17:24 发表评论
]]>
用jexceldexcel?xls文g的例?/title><link>http://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/02/06/98270.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/98270.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/02/06/98270.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/98270.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovezmh/services/trackbacks/98270.html</trackback:ping><description><![CDATA[ <p>有时候我们会(x)需要做excel的报?下面q个例子详细的给Z(jin)d?qing)定义样式的?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">m.tkk7.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, "?sh)?, 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://m.tkk7.com/images/blogjava_net/ilovezmh/19805/r_address.jpg" /></p> <img src ="http://m.tkk7.com/ilovezmh/aggbug/98270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-02-06 13:21 <a href="http://m.tkk7.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://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/02/01/97326.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/97326.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/02/01/97326.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/97326.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovezmh/services/trackbacks/97326.html</trackback:ping><description><![CDATA[<p><font size="4"><strong>读property文g的例子:(x)<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://m.tkk7.com/ilovezmh">m.tkk7.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所在的目录做ؓ(f)根目录,</p> <p>    ClassLoader是把加蝲所有classpath的目录ؓ(f)根目录,也就?#8220;..../classes”?/p> <p><span style="color: #000000">    如:(x)</span></p> <p><span style="color: #000000">    使用ClassLoaderQthis.getClass().getClassLoader().getResourceAsStream("com/test/ip.property");</span></p> <p><span style="color: #000000">    使用ClassQthis.getClass().getResourceAsStream("/com/test/ip.property");</span></p> <p><span style="color: #000000">                        如果cM配置文g在同一目录下,也可</span></p> <p><span style="color: #000000">                        this.getClass().getResourceAsStream("ip.property");</span></p> <p><br /> <font size="4"><strong>用jdom读xml文g的例子:(x)<br /> </strong></font>(<a href="http://m.tkk7.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://m.tkk7.com/ilovezmh">m.tkk7.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://m.tkk7.com/ilovezmh/aggbug/97326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-02-01 17:17 <a href="http://m.tkk7.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://m.tkk7.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://m.tkk7.com/ilovezmh/archive/2007/02/01/97247.html</guid><wfw:comment>http://m.tkk7.com/ilovezmh/comments/97247.html</wfw:comment><comments>http://m.tkk7.com/ilovezmh/archive/2007/02/01/97247.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://m.tkk7.com/ilovezmh/comments/commentRss/97247.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ilovezmh/services/trackbacks/97247.html</trackback:ping><description><![CDATA[ <p>一个简单的用jdbc操作数据库的例子,有时候我们处理一些小问题的时候会(x)发现很有?<br /><br />q是用来从一个Access的数据库文garea.mdb(一个全国省份城?jng)的数据?中提取出我需要的信息到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://m.tkk7.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://m.tkk7.com/ilovezmh/aggbug/97247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ilovezmh/" target="_blank">祝</a> 2007-02-01 14:09 <a href="http://m.tkk7.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"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ri9999.com" target="_blank">޹Ƭ߹ۿ</a>| <a href="http://socgl.com" target="_blank">ĻѿӰ</a>| <a href="http://yimintech.com" target="_blank">Ů18Ƶ</a>| <a href="http://hljc988.com" target="_blank">޾Ʒ˳鶹</a>| <a href="http://5tww.com" target="_blank">ĻĴȫƵ</a>| <a href="http://ksdhao.com" target="_blank">ľavרavëƬ</a>| <a href="http://3atv3523.com" target="_blank">99ƷƵѹۿ</a>| <a href="http://wwwwmmmm.com" target="_blank">Ļ</a>| <a href="http://www3ratcom.com" target="_blank">ŮպѲ </a>| <a href="http://cnlawedu.com" target="_blank">һƵ߹ۿİ</a>| <a href="http://wilbysec.com" target="_blank">޵һҳĻ</a>| <a href="http://am33318.com" target="_blank">һƵ</a>| <a href="http://cdhxfj.com" target="_blank">ҹӰ߹ۿ</a>| <a href="http://senimei9.com" target="_blank">99þ99ֻѷѾƷ</a>| <a href="http://xianfeng-motor.com" target="_blank">ŷձ߹ۿ</a>| <a href="http://yaboxxx125.com" target="_blank">69Ƶѹۿl</a>| <a href="http://pufenghotel.com" target="_blank">޹Ʒ˾þõӰ</a>| <a href="http://2499m.com" target="_blank">߹ۿվ</a>| <a href="http://sdsxyz.com" target="_blank">޲ӰԺҹ߹ۿ</a>| <a href="http://z88d.com" target="_blank">պӰ߹ۿƵ</a>| <a href="http://haichuanwangluo.com" target="_blank">WWWɫ.COM </a>| <a href="http://bz600.com" target="_blank">һƵ</a>| <a href="http://51cga.com" target="_blank">˳ɵӰվƷ</a>| <a href="http://xyyfamily.com" target="_blank">ɫAVɫһ</a>| <a href="http://416164.com" target="_blank">鴤һһgifƵ</a>| <a href="http://bjgelinhotel.com" target="_blank">AVҹӰԺʦӰԺ</a>| <a href="http://773311h.com" target="_blank">þҹ³Ƭ</a>| <a href="http://626632.com" target="_blank">޹˾þ77</a>| <a href="http://2499m.com" target="_blank">ҹӰѹۿ</a>| <a href="http://jinluffcl.com" target="_blank">ŮƵվa</a>| <a href="http://yangguang882.com" target="_blank">պɬɬҹ˽ӰԺ</a>| <a href="http://wanguoshan.com" target="_blank">Ļѿ</a>| <a href="http://wwwfac286.com" target="_blank">þ޹Ƶ</a>| <a href="http://199291.com" target="_blank">91ɫۺϾþѷ</a>| <a href="http://lidajc.com" target="_blank">պŷһ </a>| <a href="http://zmnhssn.com" target="_blank">պһ</a>| <a href="http://sztsa.com" target="_blank">ִִֺƵ</a>| <a href="http://kypbuy.com" target="_blank">aһëƬѸ</a>| <a href="http://tv695.com" target="_blank">þþþ޾ƷС˵</a>| <a href="http://606059.com" target="_blank">99һ</a>| <a href="http://xf002.com" target="_blank">޾Ʒavˮ</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>