﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-My Rhythm</title><link>http://www.blogjava.net/redcoatjk/</link><description>万物皆对象 万事归节奏</description><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 06:28:22 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 06:28:22 GMT</pubDate><ttl>60</ttl><item><title>Oracle维护常用SQL</title><link>http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Mon, 03 Mar 2014 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/410543.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/410543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/410543.html</trackback:ping><description><![CDATA[<h3>--查询表空间、表空间大小及表空间对应物理路径</h3><p>select a.tablespace_name,b.file_name,a.block_size,a.block_size,b.bytes/1024</p><p>/1024 "Sum MB" from dba_tablespaces a,dba_data_files b where a.tablespace_name=b.tablespace_name;</p><h3>--查询表空间使用情况</h3><p>　　SELECT UPPER(F.TABLESPACE_NAME) "表空间名",</p><p>　　D.TOT_GROOTTE_MB "表空间大小(M)",</p><p>　　D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",</p><p>　　TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",</p><p>　　F.TOTAL_BYTES "空闲空间(M)",</p><p>　　F.MAX_BYTES "最大块(M)"</p><p>　　FROM (SELECT TABLESPACE_NAME,</p><p>　　ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,</p><p>　　ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES</p><p>　　FROM SYS.DBA_FREE_SPACE</p><p>　　GROUP BY TABLESPACE_NAME) F,</p><p>　　(SELECT DD.TABLESPACE_NAME,</p><p>　　 ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB</p><p>　　FROM SYS.DBA_DATA_FILES DD</p><p>　　GROUP BY DD.TABLESPACE_NAME) D</p><p>　　WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME</p><p>　　ORDER BY 1;</p><h3>--查询表空间的free space</h3><p>　　select tablespace_name,</p><p>　　count(*) as extends,</p><p>　　round(sum(bytes) / 1024 / 1024, 2) as MB,</p><p>　　sum(blocks) as blocks</p><p>　　from dba_free_space</p><p>group by tablespace_name;</p><p>&nbsp;</p><h3>--查询表空间的总容量</h3><p>　　select tablespace_name, sum(bytes) / 1024 / 1024 as MB</p><p>　　from dba_data_files</p><p>　　group by tablespace_name;</p><p>&nbsp;</p><p>&nbsp;</p><h3>--查询表空间使用率</h3><p>　　select total.tablespace_name,</p><p>　　round(total.MB, 2) as Total_MB,考试大论坛</p><p>　　round(total.MB - free.MB, 2) as Used_MB,</p><p>　　round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct</p><p>　　from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB</p><p>　　from dba_free_space</p><p>　　group by tablespace_name) free,</p><p>　　(select tablespace_name, sum(bytes) / 1024 / 1024 as MB</p><p>　　from dba_data_files</p><p>　　group by tablespace_name) total</p><p>　　where free.tablespace_name = total.tablespace_name;</p><p>&nbsp;</p><p>&nbsp;</p><h3>1.查找当前表级锁的SQL如下：</h3><p>select sess.sid,</p><p>&nbsp;&nbsp;&nbsp; sess.serial#,</p><p>&nbsp;&nbsp;&nbsp; lo.oracle_username,</p><p>&nbsp;&nbsp;&nbsp; lo.os_user_name,</p><p>&nbsp;&nbsp;&nbsp; ao.object_name,</p><p>&nbsp;&nbsp;&nbsp; lo.locked_mode</p><p>&nbsp;&nbsp;&nbsp; from v$locked_object lo,</p><p>&nbsp;&nbsp;&nbsp; dba_objects ao,</p><p>&nbsp;&nbsp;&nbsp; v$session sess</p><p>where ao.object_id = lo.object_id and lo.session_id = sess.sid;</p><p>&nbsp;</p><h3>2.杀掉锁表进程：</h3><p>alter system kill session '436,35123';</p><p>&nbsp;</p><h3>3.RAC环境中锁查找：</h3><p>SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')||sid sess,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id1, id2, lmode, request, type,block,ctime</p><p>FROM GV$LOCK</p><p>WHERE (id1, id2, type) IN</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT id1, id2, type FROM GV$LOCK WHERE request&gt;0)</p><p>ORDER BY id1, request;</p><p>&nbsp;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>4.监控当前数据库谁在运行什么SQL语句</h3><p>select osuser, username, sql_text&nbsp;</p><p>from&nbsp; v$session a, v$sqltext b</p><p>where&nbsp; a.sql_address =b.address order by address, piece;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>5.找使用CPU多的用户session</h3><p>select a.sid,spid,status,substr(a.program,1,40) prog, a.terminal,osuser,value/60/100 value</p><p>from&nbsp; v$session a,v$process b,v$sesstat c</p><p>where&nbsp; c.statistic#=12 and&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.sid=a.sid and&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.paddr=b.addr&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by value desc;</p><p>&nbsp;</p><p>&nbsp;</p><h3>6.查看死锁信息</h3><p>SELECT (SELECT username</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE SID = a.SID) blocker, a.SID, 'is blocking',</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT username</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM v$session</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE SID = b.SID) blockee, b.SID</p><p>&nbsp; FROM v$lock a, v$lock b</p><p>&nbsp;WHERE a.BLOCK = 1 AND b.request &gt; 0 AND a.id1 = b.id1 AND a.id2 = b.id2;</p><p>&nbsp;</p><p>&nbsp;</p><h3>7.具有最高等待的对象</h3><p>SELECT&nbsp;&nbsp; o.OWNER,o.object_name, o.object_type, a.event,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, dba_objects o</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.current_obj# = o.object_id</p><p>GROUP BY o.OWNER,o.object_name, o.object_type, a.event</p><p>ORDER BY total_wait_time DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>SELECT&nbsp;&nbsp; a.session_id, s.osuser, s.machine, s.program, o.owner, o.object_name,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_type, a.event,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, dba_objects o, v$session s</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.current_obj# = o.object_id</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.session_id = s.SID</p><p>GROUP BY o.owner,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_name,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_type,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.event,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.session_id,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.program,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.machine,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.osuser</p><p>ORDER BY total_wait_time DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>8.查询当前连接会话数</h3><p>select s.value,s.sid,a.username</p><p>from</p><p>v$sesstat S,v$statname N,v$session A</p><p>where</p><p>n.statistic#=s.statistic# and</p><p>name='session pga memory'</p><p>and s.sid=a.sid</p><p>order by s.value;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>9.等待最多的用户</h3><p>SELECT&nbsp;&nbsp; s.SID, s.username, SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, v$session s</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>GROUP BY s.SID, s.username</p><p>ORDER BY total_wait_time DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>10.等待最多的SQL</h3><p>SELECT&nbsp;&nbsp; a.program, a.session_id, a.user_id, d.username, s.sql_text,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM (a.wait_time + a.time_waited) total_wait_time</p><p>&nbsp;&nbsp;&nbsp; FROM v$active_session_history a, v$sqlarea s, dba_users d</p><p>&nbsp;&nbsp; WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.sql_id = s.sql_id</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.user_id = d.user_id</p><p>GROUP BY a.program, a.session_id, a.user_id, s.sql_text, d.username;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>11.查看消耗资源最多的SQL</h3><p>SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls</p><p>FROM V$SQLAREA</p><p>WHERE buffer_gets &gt; 10000000 OR disk_reads &gt; 1000000</p><p>ORDER BY buffer_gets + 100 * disk_reads DESC;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>12.查看某条SQL语句的资源消耗</h3><p>SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls</p><p>FROM V$SQLAREA</p><p>WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');</p><p>&nbsp;</p><p>&nbsp;</p><h3>13.查询会话执行的实际SQL</h3><p>SELECT&nbsp;&nbsp; a.SID, a.username, s.sql_text</p><p>&nbsp;&nbsp;&nbsp; FROM v$session a, v$sqltext s</p><p>&nbsp;&nbsp; WHERE a.sql_address = s.address</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.sql_hash_value = s.hash_value</p><p>&nbsp;&nbsp;&nbsp;&nbsp; AND a.status = 'ACTIVE'</p><p>ORDER BY a.username, a.SID, s.piece;</p><p>&nbsp;</p><p>&nbsp;</p><h3>14.显示正在等待锁的所有会话</h3><p>SELECT * FROM DBA_WAITERS;</p><p>&nbsp;</p><h2>DDL</h2><p>--------------------------------------------------------------</p><p>/*注意点：</p><p>&nbsp;</p><p>1.如果在PL/SQL 等工具里打开的话，直接修改下面的代码中[斜体加粗部分]执行</p><p>&nbsp;</p><p>2.确保路径存在，比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路径存在</p><p>&nbsp;</p><p>/*分为四步 */</p><p>&nbsp;</p><h3>/*第1步：创建临时表空间&nbsp; */</h3><p>&nbsp;</p><p>create temporary tablespace user_temp&nbsp;</p><p>&nbsp;</p><p>tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'</p><p>&nbsp;</p><p>size 50m&nbsp;</p><p>&nbsp;</p><p>autoextend on&nbsp;</p><p>&nbsp;</p><p>next 50m maxsize 20480m&nbsp;</p><p>&nbsp;</p><p>extent management local;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>/*第2步：创建数据表空间&nbsp; */</h3><p>&nbsp;</p><p>create tablespace user_data&nbsp;</p><p>&nbsp;</p><p>logging&nbsp;</p><p>&nbsp;</p><p>datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'</p><p>&nbsp;</p><p>size 50m&nbsp;</p><p>&nbsp;</p><p>autoextend on&nbsp;</p><p>&nbsp;</p><p>next 50m maxsize 20480m&nbsp;</p><p>&nbsp;</p><p>extent management local;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>/*第3步：创建用户并指定表空间&nbsp; */</h3><p>&nbsp;</p><p>create user username identified by password&nbsp;</p><p>&nbsp;</p><p>default tablespace user_data&nbsp;</p><p>&nbsp;</p><p>temporary tablespace user_temp;&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><h3>/*第4步：给用户授予权限&nbsp; */</h3><p>&nbsp;</p><p>grant connect,resource,dba to username;&nbsp;</p><img src ="http://www.blogjava.net/redcoatjk/aggbug/410543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2014-03-03 15:48 <a href="http://www.blogjava.net/redcoatjk/archive/2014/03/03/410543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浏览器事件监听</title><link>http://www.blogjava.net/redcoatjk/archive/2013/11/04/405972.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Mon, 04 Nov 2013 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2013/11/04/405972.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/405972.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2013/11/04/405972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/405972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/405972.html</trackback:ping><description><![CDATA[摘自: <a href="http://www.douban.com/note/235086917/">http://www.douban.com/note/235086917/</a><br /><a href="http://jackleechina.iteye.com/blog/1595397">http://jackleechina.iteye.com/blog/1595397</a><br /><br />为什么一般要采用事件监听而不是直接对元素的事件属性（如：onclick、onmouseover）赋值？<br /><br />原来用事件属性只能赋值一种方法，即：<br /><br />button1.onclick = function() { alert(1); };<br />button1.onclick = function() { alert(2); };<br /><br /><strong>这样后面的赋值语句就将前面的onclick属性覆盖了</strong><br /><br />而使用添加事件监听的方式就可以实现并行。特别是当团队合作时，事件并行的需求增多，比如：监听document对象的鼠标事件或者window对象的载入事件等。使用事件属性则很容易造成事件覆盖掉<br /><br />使用事件监听有两种方式：attachEvent和addEventListener<br /><br />attachEvent与addEventListener区别<br />适应的浏览器版本不同，同时在使用的过程中要注意<br />attachEvent方法 按钮onclick<br />addEventListener方法 按钮click<br />attachEvent方法， （ie系列）<br />addEventListener方法 Mozilla系列<br /><br />例子如下: 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_54_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_177_Open_Text.style.display='none'; Codehighlighter1_54_177_Closed_Image.style.display='inline'; Codehighlighter1_54_177_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_54_177_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_54_177_Closed_Text.style.display='none'; Codehighlighter1_54_177_Open_Image.style.display='inline'; Codehighlighter1_54_177_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">SCRIPT&nbsp;</span><span style="color: #ff0000">LANGUAGE</span><span style="color: #0000ff">="JavaScript"</span><span style="color: #0000ff">&gt;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_54_177_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_54_177_Open_Text"><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_73_94_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_94_Open_Text.style.display='none'; Codehighlighter1_73_94_Closed_Image.style.display='inline'; Codehighlighter1_73_94_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_73_94_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_73_94_Closed_Text.style.display='none'; Codehighlighter1_73_94_Open_Image.style.display='inline'; Codehighlighter1_73_94_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="background-color: #f5f5f5; color: #0000ff">function</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;method1()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_73_94_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_73_94_Open_Text"><span style="background-color: #f5f5f5; color: #000000">{<br /></span><span style="color: #008080">&nbsp;6</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">method1</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">&nbsp;7</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />}</span></span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_114_135_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_135_Open_Text.style.display='none'; Codehighlighter1_114_135_Closed_Image.style.display='inline'; Codehighlighter1_114_135_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_114_135_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_114_135_Closed_Text.style.display='none'; Codehighlighter1_114_135_Open_Image.style.display='inline'; Codehighlighter1_114_135_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="background-color: #f5f5f5; color: #0000ff">function</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;method2()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_114_135_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_114_135_Open_Text"><span style="background-color: #f5f5f5; color: #000000">{<br /></span><span style="color: #008080">&nbsp;9</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">method2</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">10</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />}</span></span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">11</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_155_176_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_176_Open_Text.style.display='none'; Codehighlighter1_155_176_Closed_Image.style.display='inline'; Codehighlighter1_155_176_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_155_176_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_155_176_Closed_Text.style.display='none'; Codehighlighter1_155_176_Open_Image.style.display='inline'; Codehighlighter1_155_176_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="background-color: #f5f5f5; color: #0000ff">function</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;method3()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_155_176_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_155_176_Open_Text"><span style="background-color: #f5f5f5; color: #000000">{<br /></span><span style="color: #008080">12</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">method3</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">13</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">14</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">SCRIPT</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000">&nbsp;&nbsp;value</span><span style="color: #0000ff">="dom&nbsp;元素事件属性绑定的按钮"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="button1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000">&nbsp;&nbsp;value</span><span style="color: #0000ff">="IE浏览器:&nbsp;attachEvent进行事件绑定的按钮"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="btn1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="button"</span><span style="color: #ff0000">&nbsp;&nbsp;value</span><span style="color: #0000ff">="火狐浏览器:&nbsp;addEventListener进行事件绑定的按钮"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="btn2"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_432_1146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_432_1146_Open_Text.style.display='none'; Codehighlighter1_432_1146_Closed_Image.style.display='inline'; Codehighlighter1_432_1146_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_432_1146_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_432_1146_Closed_Text.style.display='none'; Codehighlighter1_432_1146_Open_Image.style.display='inline'; Codehighlighter1_432_1146_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">SCRIPT&nbsp;</span><span style="color: #ff0000">LANGUAGE</span><span style="color: #0000ff">="JavaScript"</span><span style="color: #0000ff">&gt;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_432_1146_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_432_1146_Open_Text"><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">21</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_438_473_Open_Image" onclick="this.style.display='none'; Codehighlighter1_438_473_Open_Text.style.display='none'; Codehighlighter1_438_473_Closed_Image.style.display='inline'; Codehighlighter1_438_473_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_438_473_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_438_473_Closed_Text.style.display='none'; Codehighlighter1_438_473_Open_Image.style.display='inline'; Codehighlighter1_438_473_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_438_473_Closed_Text">/**/</span><span id="Codehighlighter1_438_473_Open_Text"><span style="background-color: #f5f5f5; color: #008000">/*</span><span style="background-color: #f5f5f5; color: #008000">*方法一:&nbsp;使用元素的事件属性.&nbsp;[这种方式事件只可绑定一次,最后绑定的执行]*</span><span style="background-color: #f5f5f5; color: #008000">*/</span></span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">22</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_506_522_Open_Image" onclick="this.style.display='none'; Codehighlighter1_506_522_Open_Text.style.display='none'; Codehighlighter1_506_522_Closed_Image.style.display='inline'; Codehighlighter1_506_522_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_506_522_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_506_522_Closed_Text.style.display='none'; Codehighlighter1_506_522_Open_Image.style.display='inline'; Codehighlighter1_506_522_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button1.onclick&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff">function</span><span style="background-color: #f5f5f5; color: #000000">()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_506_522_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_506_522_Open_Text"><span style="background-color: #f5f5f5; color: #000000">{&nbsp;alert(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">1-1</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);&nbsp;}</span></span><span style="background-color: #f5f5f5; color: #000000">;<br /></span><span style="color: #008080">23</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_559_575_Open_Image" onclick="this.style.display='none'; Codehighlighter1_559_575_Open_Text.style.display='none'; Codehighlighter1_559_575_Closed_Image.style.display='inline'; Codehighlighter1_559_575_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_559_575_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_559_575_Closed_Text.style.display='none'; Codehighlighter1_559_575_Open_Image.style.display='inline'; Codehighlighter1_559_575_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button1.onclick&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff">function</span><span style="background-color: #f5f5f5; color: #000000">()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_559_575_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_559_575_Open_Text"><span style="background-color: #f5f5f5; color: #000000">{&nbsp;alert(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">1-2</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);&nbsp;}</span></span><span style="background-color: #f5f5f5; color: #000000">;<br /></span><span style="color: #008080">24</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_580_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_580_648_Open_Text.style.display='none'; Codehighlighter1_580_648_Closed_Image.style.display='inline'; Codehighlighter1_580_648_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_580_648_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_580_648_Closed_Text.style.display='none'; Codehighlighter1_580_648_Open_Image.style.display='inline'; Codehighlighter1_580_648_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_580_648_Closed_Text">/**/</span><span id="Codehighlighter1_580_648_Open_Text"><span style="background-color: #f5f5f5; color: #008000">/*</span><span style="background-color: #f5f5f5; color: #008000">*方法二:&nbsp;使用attachEvent注册事件.&nbsp;格式如下object.attachEvent(event,function);*</span><span style="background-color: #f5f5f5; color: #008000">*/</span></span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">25</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff">var</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;btn1Obj&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;document.getElementById(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">btn1</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">26</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;btn1Obj.attachEvent(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">onclick</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">,&nbsp;method1);<br /></span><span style="color: #008080">27</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;btn1Obj.attachEvent(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">onclick</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">,&nbsp;method2);<br /></span><span style="color: #008080">28</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;btn1Obj.attachEvent(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">onclick</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">,&nbsp;method3);<br /></span><span style="color: #008080">29</span><span style="background-color: #f5f5f5; color: #000000"><img id="Codehighlighter1_830_913_Open_Image" onclick="this.style.display='none'; Codehighlighter1_830_913_Open_Text.style.display='none'; Codehighlighter1_830_913_Closed_Image.style.display='inline'; Codehighlighter1_830_913_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_830_913_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_830_913_Closed_Text.style.display='none'; Codehighlighter1_830_913_Open_Image.style.display='inline'; Codehighlighter1_830_913_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_830_913_Closed_Text">/**/</span><span id="Codehighlighter1_830_913_Open_Text"><span style="background-color: #f5f5f5; color: #008000">/*</span><span style="background-color: #f5f5f5; color: #008000">*方法三:&nbsp;addEventListener.&nbsp;格式如下element.addEventListener(type,listener,useCapture);*</span><span style="background-color: #f5f5f5; color: #008000">*/</span></span><span style="background-color: #f5f5f5; color: #000000"><br /></span><span style="color: #008080">30</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff">var</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;btn2Obj&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;document.getElementById(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">btn2</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">31</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;btn2Obj.addEventListener(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">click</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">,method1,</span><span style="background-color: #f5f5f5; color: #0000ff">false</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">32</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;btn2Obj.addEventListener(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">click</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">,method2,</span><span style="background-color: #f5f5f5; color: #0000ff">false</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">33</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;btn2Obj.addEventListener(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">click</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">,method3,</span><span style="background-color: #f5f5f5; color: #0000ff">false</span><span style="background-color: #f5f5f5; color: #000000">);<br /></span><span style="color: #008080">34</span><span style="background-color: #f5f5f5; color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #008000">//</span><span style="background-color: #f5f5f5; color: #008000">执行顺序为method1-&gt;method2-&gt;method3</span><span style="background-color: #f5f5f5; color: #008000"><br /></span><span style="color: #008080">35</span><span style="background-color: #f5f5f5; color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">SCRIPT</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">attachEvent按照注册倒叙执行:&nbsp;&nbsp;&nbsp;&nbsp;执行顺序为method3-&gt;method2-&gt;method1&nbsp;<br /></span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">addEventListener按照注册顺序执行:&nbsp;&nbsp;&nbsp;&nbsp;执行顺序为method1-&gt;method2-&gt;method3&nbsp;<br /></span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div><br />相关衍生阅读: 
<h1><span style="font-size: 14pt"><a style="font-family: Verdana; text-decoration: underline" href="http://www.html5jscss.com/js-attach-event-74.html">
<h1><span style="color: #0000ff; font-size: 14pt">JavaScript欲速则不达&#8212;&#8212;基本处理事件详解和阻止事件传播</span></h1></a></span></h1><img src ="http://www.blogjava.net/redcoatjk/aggbug/405972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2013-11-04 14:22 <a href="http://www.blogjava.net/redcoatjk/archive/2013/11/04/405972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Servlet过滤器介绍之原理分析</title><link>http://www.blogjava.net/redcoatjk/archive/2013/04/16/397932.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Tue, 16 Apr 2013 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2013/04/16/397932.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/397932.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2013/04/16/397932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/397932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/397932.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘自http://zhangjunhd.blog.51cto.com/113473/20629/ 1．Servlet过滤器1.1 什么是过滤器过滤器是一个程序，它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上，并且可以检查进入这些资源的请求信息。在这之后，过滤器可以作如下的选择：&#9312;以常规的方式调用资源（即，调...&nbsp;&nbsp;<a href='http://www.blogjava.net/redcoatjk/archive/2013/04/16/397932.html'>阅读全文</a><img src ="http://www.blogjava.net/redcoatjk/aggbug/397932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2013-04-16 17:28 <a href="http://www.blogjava.net/redcoatjk/archive/2013/04/16/397932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MySQL运行状态show status中文详解</title><link>http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Wed, 05 Sep 2012 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/387100.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/387100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/387100.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘自 http://www.sandzhang.com/blog/2010/04/07/mysql-show-status-explained-detail/要查看MySQL运行状态，要优化MySQL运行效率都少不了要运行show status查看各种状态，下面是参考官方文档及网上资料整理出来的中文详细解释：&nbsp;如有问题，欢迎指正状态名作用域...&nbsp;&nbsp;<a href='http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html'>阅读全文</a><img src ="http://www.blogjava.net/redcoatjk/aggbug/387100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-09-05 15:33 <a href="http://www.blogjava.net/redcoatjk/archive/2012/09/05/387100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Statement和PreparedStatement批量更新</title><link>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Fri, 20 Jul 2012 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/383599.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/383599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/383599.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 代码中反复开关自动提交没有必要. 其他方面写得还是很不错的.清晰.摘自 http://wangqinqin.iteye.com/blog/547277&nbsp;PreparedStatement：1）&nbsp;addBatch()将一组参数添加到PreparedStatement对象内部。2）&nbsp;executeBatch()将一批参数提交给数据库来执行，如果全部命令执行成功...&nbsp;&nbsp;<a href='http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html'>阅读全文</a><img src ="http://www.blogjava.net/redcoatjk/aggbug/383599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-07-20 15:04 <a href="http://www.blogjava.net/redcoatjk/archive/2012/07/20/383599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JDBC中Statement与PreparedStatement的区别</title><link>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Fri, 20 Jul 2012 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/383583.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/383583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/383583.html</trackback:ping><description><![CDATA[<div>摘自 <a href="http://neoremind.net/2010/12/preparedstatement_diff/">http://neoremind.net/2010/12/preparedstatement_diff/</a><br /><br />
<h1 class="post-title">JDBC中Statement与PreparedStatement的区别</h1>
<p><strong style="font-size: 14pt">1.</strong> statement每次执行sql语句，相关数据库都要执行sql语句的编译；preparedstatement是<span style="color: #ff0000"><strong>预编译</strong></span>的, 采用<strong><span style="color: #ff0000">Cache</span></strong>机制（预编译语句，放在Cache中，下次执行相同SQL语句时，则可以直接从Cache中取出来，有利于sql生成<span style="color: #ff0000"><strong>查询计划</strong></span>。），对于批量处理可以大大提高效率. 也叫JDBC存储过程。</p>
<p><span style="font-size: 14pt">例如，如果要执行两条sql语句</span></p>
<div style="padding-bottom: 0px" class="wp_syntax">
<div class="code"><pre style="font-family: monospace" class="sql"><span style="color: #993333; font-size: 14pt; font-weight: bold">SELECT</span><span style="font-size: 14pt"> colume </span><span style="color: #993333; font-size: 14pt; font-weight: bold">FROM</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">TABLE</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">WHERE</span><span style="font-size: 14pt"> colume</span><span style="color: #66cc66; font-size: 14pt">=</span><span style="color: #cc66cc; font-size: 14pt">1</span><span style="font-size: 14pt">;
</span><span style="color: #993333; font-size: 14pt; font-weight: bold">SELECT</span><span style="font-size: 14pt"> colume </span><span style="color: #993333; font-size: 14pt; font-weight: bold">FROM</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">TABLE</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">WHERE</span><span style="font-size: 14pt"> colume</span><span style="color: #66cc66; font-size: 14pt">=</span><span style="color: #cc66cc; font-size: 14pt">2</span><span style="font-size: 14pt">;</span></pre></div></div>
<p><span style="font-size: 14pt">会生成两个执行计划</span></p>
<p><span style="font-size: 14pt">一千个查询就生成一千个执行计划！</span></p>
<p><span style="font-size: 14pt">PreparedStatement用于使用绑定变量重用执行计划</span></p>
<div style="padding-bottom: 0px" class="wp_syntax">
<div class="code"><pre style="font-family: monospace" class="sql"><span style="color: #993333; font-size: 14pt; font-weight: bold">SELECT</span><span style="font-size: 14pt"> colume </span><span style="color: #993333; font-size: 14pt; font-weight: bold">FROM</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">TABLE</span> <span style="color: #993333; font-size: 14pt; font-weight: bold">WHERE</span><span style="font-size: 14pt"> colume</span><span style="color: #66cc66; font-size: 14pt">=</span><span style="font-size: 14pt">:x;</span></pre></div></div>
<p><span style="font-size: 14pt">通过set不同数据只需要生成一次执行计划，可以重用</span></p>
<p><span style="font-size: 14pt">是否使用绑定变量对系统影响非常大，生成执行计划极为消耗资源</span></p>
<p><span style="font-size: 14pt">两种实现 速度差距可能成百上千倍</span></p>
<p><span style="font-size: 14pt">后者使用了PreparedStatement对象，而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句，而且大多数情况下这个语句已经被预编译过，因而当其执行时，只需DBMS运行SQL语句，而不必先编译。当你需要执行Statement对象多次的时候，PreparedStatement对象将会大大降低运行时间，当然也</span><span style="color: #ff0000; font-size: 14pt"><strong>加快了访问数据库的速度</strong></span><span style="font-size: 14pt">。</span></p>
<p><span style="font-size: 14pt">这种转换也给你带来很大的便利，不必重复SQL语句的句法，而只需更改其中变量的值，便可重新执行SQL语句。选择PreparedStatement对象与否，在于相同句法的SQL语句是否执行了多次，而且两次之间的差别仅仅是变量的不同。</span><span style="font-size: 14pt; text-decoration: underline">如果仅仅执行了一次的话，在对数据库只执行一次性存取的时侯，用 Statement 对象进行处理，PreparedStatement 对象的开销比Statement大，对于一次性操作并不会带来额外的好处。</span></p>
<p><strong style="font-size: 14pt">2. </strong>PrepareStatement中执行的SQL语句中是可以<strong><span style="color: #ff0000">带参数</span></strong>的，也就是说可以替换变量，尽量采用使用<span style="color: #ff0000"><strong>？号</strong></span>的方式传递参数，增加代码的可读性又可以预编译加速；而Statement则不可以。</p>
<p><strong style="font-size: 14pt">3.</strong> <span style="color: #ff0000"><strong>防止SQL注入</strong></span>。在SQL中包含特殊字符或SQL的关键字(如：&#8217; or 1 or &#8216;)时，Statement将出现不可预料的结果（出现异常或查询的结果不正确），可用PreparedStatement来解决。</p>
<div id="_mcePaste"><span style="font-size: 14pt">SQL注入或者说SQL注入攻击就是利用Statement的漏洞完成的，例如用个用户登录，那么form表单有用户名和密码</span></div>
<div id="_mcePaste"><span style="font-size: 14pt">那么我提交时，在用户名输入框内 输入 &#8220;aaa&#8217; or &#8217;a&#8217;=&#8217;a&#8221; 密码框随便输入，那么这样意味着 sql的</span></div>
<div id="_mcePaste"><span style="font-size: 14pt">查询语言就是 &#8220;select * from 表 where 用户名=&#8217;aaa&#8217; or &#8217;a&#8217;=&#8217;a&#8217; and 密码=&#8217;123&#8217; &nbsp;&#8221;，这样查询出来所有的数据或者是混乱。那么不被授权的用户照样可以登录，岂不是被黑了？！实际中现在java程序员早都不用这种方式写查询了，一般都用PreparedStatement来查询，或干脆就用hibernate之类的持久层框架，这样通过sql注入就无从谈起了。</span></div></div><img src ="http://www.blogjava.net/redcoatjk/aggbug/383583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-07-20 11:14 <a href="http://www.blogjava.net/redcoatjk/archive/2012/07/20/383583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]如何修改mysql root密码 </title><link>http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Thu, 19 Jul 2012 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/383487.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/383487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/383487.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt">摘自:</span><a href="http://ryxxlong.iteye.com/blog/552884"><span style="font-size: 12pt">http://ryxxlong.iteye.com/blog/552884</span></a><br />
<p><span style="font-size: small"><font size="2"><span style="font-size: 12pt">如何修改mysql root密码</span><br /><span style="font-size: 12pt">&nbsp; 忘记MySQL ROOT密码是在MySQ使用中很常见的问题，可是有很多朋友并不会重置ROOT密码，那叫苦啊，特写此文章与大家交流：</span><br /><br /><span style="font-size: 12pt">1、编辑MySQL的配置文件：my.ini</span><br /><span style="font-size: 12pt">一般在MySQL安装目录下有my.ini即MySQL的配置文件。</span><br /><span style="font-size: 12pt">在此配置文件的最后添加如下一行：</span><br /><span style="font-size: 12pt">skip-grant-tables</span><br /><span style="font-size: 12pt">保存退出编辑。</span><br /><br /><span style="font-size: 12pt">2、然后重启MySQL服务</span><br /><span style="font-size: 12pt">在命令行下执行：</span><br /><span style="font-size: 12pt">net stop MySQL</span><br /><span style="font-size: 12pt">net start MySQL</span><br /><br /><span style="font-size: 12pt">3、设置新的ROOT密码</span><br /><span style="color: #3366ff; font-size: 12pt">然后用命令提示符cd到对应安装目录的bin下</span><span style="color: #3366ff; font-size: 12pt">执行：</span><br /><span style="font-size: 12pt">MySQL -u root -p MySQL或mysql -u root -p</span><br /><span style="font-size: 12pt">直接回车无需密码即可进入数据库了。</span><br /><span style="font-size: 12pt">此时,在命令行下执行 use mysql;</span><br /><span style="font-size: 12pt">现在我们执行如下语句把root密码更新为：</span><br /><span style="font-size: 12pt">update user set password=PASSWORD("root") where user='root';</span><br /><span style="font-size: 12pt">(注意:此时不用使用mysqladmin -u root -p password '你的新密码'这条命令修改密码,因为'skip-grant-tables'配置,</span><br /><span style="font-size: 12pt">不信的话,你可以试用一下,它肯定会报如下所示的错误:</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysqladmin -u root -p password 'root'</span><br /><span style="font-size: 12pt">Enter password:</span><br /><span style="font-size: 12pt">Warning: single quotes were not trimmed from the password by your command</span><br /><span style="font-size: 12pt">line client, as you might have expected.</span><br /><span style="font-size: 12pt">mysqladmin:</span><br /><span style="font-size: 12pt">You cannot use 'password' command as mysqld runs</span><br /><span style="font-size: 12pt">&nbsp;with grant tables disabled (was started with --skip-grant-tables).</span><br /><span style="font-size: 12pt">Use: "mysqladmin flush-privileges password '*'" instead)</span><br /><span style="font-size: 12pt">exit 退出MySQL。</span><br /><br /><span style="font-size: 12pt">4、还原配置文件并重启服务</span><br /><br /><span style="font-size: 12pt">然后修改MySQL配置文件把刚才添加的那一行'skip-grant-tables'删除。</span><br /><span style="font-size: 12pt">再次重起MySQL服务，密码修改完毕。</span><br /><span style="font-size: 12pt">用新密码root试一下吧，又能登入重新进入mysql了？</span><br /><br /><br /><br /><span style="font-size: 12pt">附mysql修改密码的一些方法:</span><br /><span style="font-size: 12pt">1. 用MYSQL的grant语句，例如</span><br /><span style="font-size: 12pt">mysql -h hostname &#8211;u root 命令登录到mysqld server 用grant 命令改变口令: </span><br /><span style="font-size: 12pt">mysql -h 192.168.1.101 -u root </span><br /><span style="font-size: 12pt">上边的192.168.1.101 是偶的mysqld 运行机器，你换成自己的，这样登录上去，就可以修改密码了,</span><br /><span style="font-size: 12pt">其实没必要这么麻烦,直接mysql -u root就可以了。 </span><br /><span style="font-size: 12pt">GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root' WITH GRANT OPTION </span><br /><br /><span style="font-size: 12pt">2. mysqladmin -u 用户名 -p 旧密码 password 新密码 </span><br /><span style="font-size: 12pt">例1：给root 加个密码root。首先进入cmd中，然后键入 </span><br /><span style="font-size: 12pt">以下命令,至于在CMD下能否使用mysqladmin，</span><br /><span style="font-size: 12pt">就要看你的Windows环境变量PATH中是否添加&#8220;E:\Program Files\MySQL\MySQL Server 5.1\bin;&#8221;（请改为你自己的安装路径）了。)</span><br /><span style="font-size: 12pt">mysqladmin -u root password root </span><br /><span style="font-size: 12pt">注：因为开始时root 没有密码，所以-p 旧密码一项就可以省略了。</span><br /><span style="font-size: 12pt">例2：再将root 的密码改为admin。 </span><br /><span style="font-size: 12pt">mysqladmin &#8211;u root -proot password admin(注意-p 不要和后面的密码分 </span><br /><span style="font-size: 12pt">开写，要写在一起,不然会出错,错误如下所示:</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysqladmin -u root -p root password admin</span><br /><span style="font-size: 12pt">Enter password: ****</span><br /><span style="font-size: 12pt">mysqladmin: Unknown command: 'root') </span><br /><span style="font-size: 12pt">当然你也可以这样写:mysqladmin &#8211;u root -p password admin回车,</span><br /><span style="font-size: 12pt">然后再输入你的旧密码,这样也是完全也可以的,看你的爱好了.</span><br /><span style="font-size: 12pt">例3:再将root用户的密码去掉.</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysqladmin -u root -p password&nbsp; ;</span><br /><span style="font-size: 12pt">Enter password: root</span><br /><span style="font-size: 12pt">此时,root用户又没有密码了.可以通过下面的方法设置:</span><br /><span style="font-size: 12pt">F:\Documents and Settings\long&gt;mysql -u root</span><br /><span style="font-size: 12pt">mysql&gt;set password for 'root'@'localhost'=password('root');(语法:SET PASSWORD FOR '用户名'@'主机' = PASSWORD('密码'))</span><br /><span style="font-size: 12pt">mysql&gt;set password for 'root'@'%'=password('root'); </span><br /><span style="font-size: 12pt">//本条可选,这是在配置mysql数据库,如果你选择了允许root通过远程登录进来时,你在mysql数据库下的user表中,</span><br /><span style="font-size: 12pt">use mysql;</span><br /><span style="font-size: 12pt">select * from user;可以看到有两条记录,如果你没有配置这一项的话,只会第一条记录!</span><br /><span style="font-size: 12pt">Host&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; User&nbsp;&nbsp;&nbsp;&nbsp; Password</span><br /><span style="font-size: 12pt">'localhost', 'root', '*9C9F4927129ECC3209D8550DC8B67156FDBF9418', ...</span><br /><span style="font-size: 12pt">'%', 'root', '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B', ...</span><br /><span style="font-size: 12pt">通过以上设置,root的密码将变为root这样就完成了根用户root密码的设置工作。</span><br /><br /><span style="font-size: 12pt">3. use mysql;</span><br /><span style="font-size: 12pt">&nbsp;update user set password =password('yourpass') where user='root' </span><br /><br /><span style="font-size: 12pt">(注:下面的这些方法我本人没有试过,不知对不对,我只是转载了一下:)</span><br /><span style="font-size: 12pt">下面的方法都在mysql提示符下使用，且必须有mysql的root权限： </span><br /><span style="font-size: 12pt">方法4 </span><br /><span style="font-size: 12pt">mysql&gt; INSERT INTO mysql.user (Host,User,Password) </span><br /><span style="font-size: 12pt">VALUES('%','jeffrey',PASSWORD('biscuit')); </span><br /><span style="font-size: 12pt">mysql&gt; FLUSH PRIVILEGES </span><br /><span style="font-size: 12pt">确切地说这是在增加一个用户，用户名为jeffrey，密码为biscuit。 </span><br /><span style="font-size: 12pt">在《mysql中文参考手册》里有这个例子，所以我也就写出来了。 </span><br /><span style="font-size: 12pt">注意要使用PASSWORD函数，然后还要使用FLUSH PRIVILEGES。 </span><br /><br /><span style="font-size: 12pt">方法5 </span><br /><span style="font-size: 12pt">和方法三一样，只是使用了REPLACE语句 </span><br /><span style="font-size: 12pt">mysql&gt; REPLACE INTO mysql.user (Host,User,Password) </span><br /><span style="font-size: 12pt">VALUES('%','jeffrey',PASSWORD('biscuit')); </span><br /><span style="font-size: 12pt">mysql&gt; FLUSH PRIVILEGES </span><br /><br /><span style="font-size: 12pt">方法6</span><br /><span style="font-size: 12pt">使用SET PASSWORD语句， </span><br /><span style="font-size: 12pt">mysql&gt; SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); </span><br /><span style="font-size: 12pt">你也必须使用PASSWORD()函数， </span><br /><span style="font-size: 12pt">但是不需要使用FLUSH PRIVILEGES。 </span><br /><br /><br /><span style="font-size: 12pt">方法7 </span><br /><span style="font-size: 12pt">使用GRANT ... IDENTIFIED BY语句 </span><br /><span style="font-size: 12pt">mysql&gt; GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; </span><br /><span style="font-size: 12pt">这里PASSWORD()函数是不必要的，也不需要使用FLUSH PRIVILEGES。</span><br /><br /><span style="font-size: 12pt">注:mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表，</span><br /><span style="font-size: 12pt">否则会出现拒绝访问，还有一种方法，就是重新启动mysql服务器，来使新设置生效。</span></font><br /></span></p><img src ="http://www.blogjava.net/redcoatjk/aggbug/383487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-07-19 10:54 <a href="http://www.blogjava.net/redcoatjk/archive/2012/07/19/383487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]怎么查看端口占用情况? </title><link>http://www.blogjava.net/redcoatjk/archive/2012/06/13/380682.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Wed, 13 Jun 2012 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/06/13/380682.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/380682.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/06/13/380682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/380682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/380682.html</trackback:ping><description><![CDATA[<h2><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/rabbit/archive/2008/03/12/185559.html"><font color="#009933">怎么查看端口占用情况?</font></a> </h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经常，我们在启动应用的时候发现系统需要的端口被别的程序占用，如何知道谁占有了我们需要的端口，很多人都比较头疼，下面就介绍一种非常简单的方法，希望对大家有用</p>
<p>假如我们需要确定谁占用了我们的9050端口</p>
<p>1、Windows平台<br />在windows命令行窗口下执行：</p>
<div><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: rgb(244,244,244); margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">C:\&gt;netstat -aon|findstr <span style="color: rgb(0,96,128)">"9050"</span><br /><br />TCP    127.0.0.1:9050         0.0.0.0:0              LISTENING       2016</pre></div>
<p><br />看到了吗，端口被进程号为2016的进程占用，继续执行下面命令：</p>
<div><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: rgb(244,244,244); margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">C:\&gt;tasklist|findstr <span style="color: rgb(0,96,128)">"2016"</span><br /><br />tor.exe                     2016 Console                 0     16,064 K</pre></div>
<p>很清楚吧，tor占用了你的端口。</p> <img src ="http://www.blogjava.net/redcoatjk/aggbug/380682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-06-13 13:51 <a href="http://www.blogjava.net/redcoatjk/archive/2012/06/13/380682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JSON 入门指南</title><link>http://www.blogjava.net/redcoatjk/archive/2012/02/27/370825.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Mon, 27 Feb 2012 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/02/27/370825.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/370825.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/02/27/370825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/370825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/370825.html</trackback:ping><description><![CDATA[JSON 即 JavaScript Object Natation，它是一种轻量级的数据交换格式，非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式，并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。<br />管有许多宣传关于 XML 如何拥有跨平台，跨语言的优势，然而，除非应用于 Web Services，否则，在普通的 Web 应用中，开发者经常为 XML 的解析伤透了脑筋，无论是服务器端生成或处理 XML，还是客户端用 JavaScript 解析 XML，都常常导致复杂的代码，极低的开发效率。实际上，对于大多数 Web 应用来说，他们根本不需要复杂的 XML 来传输数据，XML 的扩展性很少具有优势，许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比，返回 HTML 片段大大降低了系统的复杂性，但同时缺少了一定的灵活性。<br /><br />现在， JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么，同 XML 或 HTML 片段相比，JSON 提供了更好的简单性和灵活性。 <br />
<p><a name="N10072"><span class="atitle">JSON 数据格式解析 </span></a></p>
<p>和 XML 一样，JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的，因此，JSON 的数据格式非常简单，您可以用 JSON 传输一个简单的 String，Number，Boolean，也可以传输一个数组，或者一个复杂的 Object 对象。</p>
<p>String，Number 和 Boolean 用 JSON 表示非常简单。例如，用 JSON 表示一个简单的 String &#8220; abc &#8221;，其格式为：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">"abc"</pre></td></tr></tbody></table>
<p>这与绝大多数编程语言的表示方法一致，例如：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">12345（整数）<br /> -3.9e10（浮点数）</pre></td></tr></tbody></table><br />
<p>Boolean 类型表示为 <code>true</code> 或 <code>false</code> 。此外，JavaScript 中的 null 被表示为 <code>null</code>，注意，<code>true</code>、<code>false</code> 和 <code>null</code> 都没有双引号，否则将被视为一个 String 。</p>
<p>JSON 还可以表示一个数组对象，使用 <code>[]</code> 包含所有元素，每个元素用逗号分隔，元素可以是任意的 Value，例如，以下数组包含了一个 String，Number，Boolean 和一个 null：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">["abc",12345,false,null]</pre></td></tr></tbody></table><br />
<p>Object 对象在 JSON 中是用 <code>{}</code> 包含一系列无序的 Key-Value 键值对表示的，实际上此处的 Object 相当于 Java 中的 <code>Map&lt;String, Object&gt;</code>，而不是 Java 的 Class 。注意 Key 只能用 String 表示。</p>
<p>例如，一个 Address 对象包含如下 Key-Value：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">city:Beijing <br /> street:Chaoyang Road <br /> postcode:100025（整数）</pre></td></tr></tbody></table><br />
<p>用 JSON 表示如下：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}</pre></td></tr></tbody></table><br />
<p>其中 Value 也可以是另一个 Object 或者数组，因此，复杂的 Object 可以嵌套表示，例如，一个 Person 对象包含 name 和 address 对象，可以表示如下：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">{"name":"Michael","address":<br />    {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}<br />}</pre></td></tr></tbody></table><br />
<p><a name="N1010D"><span class="atitle">JavaScript 处理 JSON 数据 </span></a></p>
<p>上面介绍了如何用 JSON 表示数据，接下来，我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端，以及客户端如何使用 JavaScript 处理 JSON 格式的数据。</p>
<p>我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">function handleJson() { <br />  var j={"name":"Michael","address":<br />      {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}<br />  }; <br />  document.write(j.name); <br />  document.write(j.address.city); <br /> }</pre></td></tr></tbody></table><br />
<p>假定服务器返回的 JSON 数据是上文的：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">{"name":"Michael","address":<br />    {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}<br />}</pre></td></tr></tbody></table><br />
<p>只需将其赋值给一个 JavaScript 变量，就可以立刻使用该变量并更新页面中的信息了，相比 XML 需要从 DOM 中读取各种节点而言，JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求，然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力，例如 Prototype（一个流行的 JavaScript 库：http://prototypejs.org）提供了 <code>evalJSON()</code> 方法，能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">new Ajax.Request("http://url", { <br />  method: "get", <br />  onSuccess: function(transport) { <br />    var json = transport.responseText.evalJSON(); <br />    // TODO: document.write(json.xxx); <br />  } <br /> });</pre></td></tr></tbody></table><br />
<p><a name="N1012F"><span class="atitle">服务器端输出 JSON 格式数据 </span></a></p>
<p>下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例，我们将演示将一个 Java 对象编码为 JSON 格式的文本。</p>
<p>将 String 对象编码为 JSON 格式时，只需处理好特殊字符即可。另外，必须用 (<code>"</code>) 而非 (<code>'</code>) 表示字符串：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> static String string2Json(String s) { <br />    StringBuilder sb = new StringBuilder(s.length()+20); <br />    sb.append('\"'); <br />    for (int i=0; i&lt;s.length(); i++) { <br />        char c = s.charAt(i); <br />        switch (c) { <br />        case '\"': <br />            sb.append("\\\""); <br />            break; <br />        case '\\': <br />            sb.append("\\\\"); <br />            break; <br />        case '/': <br />            sb.append("\\/"); <br />            break; <br />        case '\b': <br />            sb.append("\\b"); <br />            break; <br />        case '\f': <br />            sb.append("\\f"); <br />            break; <br />        case '\n': <br />            sb.append("\\n"); <br />            break; <br />        case '\r': <br />            sb.append("\\r"); <br />            break; <br />        case '\t': <br />            sb.append("\\t"); <br />            break; <br />        default: <br />            sb.append(c); <br />        } <br />    } <br />    sb.append('\"'); <br />    return sb.toString(); <br /> }</pre></td></tr></tbody></table><br />
<p>将 Number 表示为 JSON 就容易得多，利用 Java 的多态，我们可以处理 Integer，Long，Float 等多种 Number 格式：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> static String number2Json(Number number) { <br />    return number.toString(); <br /> }</pre></td></tr></tbody></table><br />
<p>Boolean 类型也可以直接通过 <code>toString()</code> 方法得到 JSON 的表示：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> static String boolean2Json(Boolean bool) { <br />    return bool.toString(); <br /> }</pre></td></tr></tbody></table><br />
<p>要将数组编码为 JSON 格式，可以通过循环将每一个元素编码出来：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> static String array2Json(Object[] array) { <br />    if (array.length==0) <br />        return "[]"; <br />    StringBuilder sb = new StringBuilder(array.length &lt;&lt; 4); <br />    sb.append('['); <br />    for (Object o : array) { <br />        sb.append(toJson(o)); <br />        sb.append(','); <br />    } <br />    // 将最后添加的 ',' 变为 ']': <br />    sb.setCharAt(sb.length()-1, ']'); <br />    return sb.toString(); <br /> }</pre></td></tr></tbody></table><br />
<p>最后，我们需要将 <code>Map&lt;String, Object&gt;</code> 编码为 JSON 格式，因为 JavaScript 的 Object 实际上对应的是 Java 的 <code>Map&lt;String, Object&gt; </code>。该方法如下：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> static String map2Json(Map&lt;String, Object&gt; map) { <br />    if (map.isEmpty()) <br />        return "{}"; <br />    StringBuilder sb = new StringBuilder(map.size() &lt;&lt; 4); <br />    sb.append('{'); <br />    Set&lt;String&gt; keys = map.keySet(); <br />    for (String key : keys) { <br />        Object value = map.get(key); <br />        sb.append('\"'); <br />        sb.append(key); <br />        sb.append('\"'); <br />        sb.append(':'); <br />        sb.append(toJson(value)); <br />        sb.append(','); <br />    } <br />    // 将最后的 ',' 变为 '}': <br />    sb.setCharAt(sb.length()-1, '}'); <br />    return sb.toString(); <br /> }</pre></td></tr></tbody></table><br />
<p>为了统一处理任意的 Java 对象，我们编写一个入口方法 <code>toJson(Object)</code>，能够将任意的 Java 对象编码为 JSON 格式：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> public static String toJson(Object o) { <br />    if (o==null) <br />        return "null"; <br />    if (o instanceof String) <br />        return string2Json((String)o); <br />    if (o instanceof Boolean) <br />        return boolean2Json((Boolean)o); <br />    if (o instanceof Number) <br />        return number2Json((Number)o); <br />    if (o instanceof Map) <br />        return map2Json((Map&lt;String, Object&gt;)o); <br />    if (o instanceof Object[]) <br />        return array2Json((Object[])o); <br />    throw new RuntimeException("Unsupported type: " + o.getClass().getName()); <br /> }</pre></td></tr></tbody></table><br />
<p>我们并未对 Java 对象作严格的检查。不被支持的对象（例如 List）将直接抛出 RuntimeException 。此外，为了保证输出的 JSON 是有效的，<code>Map&lt;String, Object&gt;</code> 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归，例如，精心构造一个循环引用的 Map，就可以检测到 <code>StackOverflowException</code>：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> @Test(expected=StackOverflowError.class) <br /> public void testRecurrsiveMap2Json() { <br />    Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;(); <br />    map.put("key", map); <br />    JsonUtil.map2Json(map); <br /> }</pre></td></tr></tbody></table><br />
<p>好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象，因此，递归引用的可能性很小。</p>
<p>最后，通过 Servlet 或 MVC 框架输出 JSON 时，需要设置正确的 MIME 类型（application/json）和字符编码。假定服务器使用 UTF-8 编码，则可以使用以下代码输出编码后的 JSON 文本：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"><br /> response.setContentType("application/json;charset=UTF-8"); <br /> response.setCharacterEncoding("UTF-8"); <br /> PrintWriter pw = response.getWriter(); <br /> pw.write(JsonUtil.toJson(obj)); <br /> pw.flush();</pre></td></tr></tbody></table><br />
<p><a name="N10193"><span class="atitle">小结 </span></a></p>
<p>JSON 已经是 JavaScript 标准的一部分。目前，主流的浏览器对 JSON 支持都非常完善。应用 JSON，我们可以从 XML 的解析中摆脱出来，对那些应用 Ajax 的 Web 2.0 网站来说，JSON 确实是目前最灵活的轻量级方案。</p><img src ="http://www.blogjava.net/redcoatjk/aggbug/370825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-02-27 11:00 <a href="http://www.blogjava.net/redcoatjk/archive/2012/02/27/370825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JDNI入门</title><link>http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html</link><dc:creator>redcoatjk</dc:creator><author>redcoatjk</author><pubDate>Tue, 14 Feb 2012 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html</guid><wfw:comment>http://www.blogjava.net/redcoatjk/comments/369917.html</wfw:comment><comments>http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/redcoatjk/comments/commentRss/369917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/redcoatjk/services/trackbacks/369917.html</trackback:ping><description><![CDATA[JNDI是 Java 命名与目录接口（Java Naming and Directory Interface），在J2EE规范中是重要的规范之一，不少专家认为，没有透彻理解JNDI的意义和作用，就没有真正掌握J2EE特别是EJB的知识。 <br />那么，JNDI到底起什么作用？ <br /><br />要了解JNDI的作用，我们可以从&#8220;如果不用JNDI我们怎样做？用了JNDI后我们又将怎样做？&#8221;这个问题来探讨。 <br /><br />没有JNDI的做法： <br />程序员开发时，知道要开发访问MySQL数据库的应用，于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码，并通过使用适当的 JDBC URL 连接到数据库。 <br />就像以下代码这样： <br /><br />Connection conn=null; <br />try {Class.forName("com.mysql.jdbc.Driver",true, Thread.currentThread().getContextClassLoader()); <br />conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&amp;password=mingyue"); <br />/* 使用conn并进行SQL操作 */...... <br />conn.close(); <br />} <br />catch(Exception e) <br />{e.printStackTrace();} <br />finally {if(conn!=null) <br />{try {conn.close();} <br />catch(SQLException e) { <br />}}} <br /><br />这是传统的做法，也是以前非Java程序员（如Delphi、VB等）常见的做法。这种做法一般在小规模的开发过程中不会产生问题，只要程序员熟悉Java语言、了解JDBC技术和MySQL，可以很快开发出相应的应用程序。 <br /><br />没有JNDI的做法存在的问题： <br />1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变，由此引发JDBC URL需要修改； <br />2、数据库可能改用别的产品，如改用DB2或者Oracle，引发JDBC驱动程序包和类名需要修改； <br />3、随着实际使用终端的增加，原配置的连接池参数可能需要调整； <br />4、...... <br /><br />解决办法： <br />程序员应该不需要关心&#8220;具体的数据库后台是什么？JDBC驱动程序是什么？JDBC URL格式是什么？访问数据库的用户名和口令是什么？&#8221;等等这些问题，程序员编写的程序应该没有对 JDBC 驱动程序的引用，没有服务器名称，没有用户名称或口令 &#8212;&#8212; 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理，程序员只需要对这些配置和管理进行引用即可。 <br /><br />由此，就有了JNDI。 <br /><br />用了JNDI之后的做法： <br />首先，在在J2EE容器中配置JNDI参数，定义一个数据源，也就是JDBC引用参数，给这个数据源设置一个名称；然后，在程序中，通过数据源名称引用数据源从而访问后台数据库。 <br />具体操作如下（以JBoss为例）： <br />1、配置数据源 <br />在JBoss的 D:\jboss420GA\docs\examples\jca 文件夹下面，有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下，如 D:\jboss420GA\server\default\deploy。 <br />修改 mysql-ds.xml 文件的内容，使之能通过JDBC正确访问你的MySQL数据库，如下： <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;datasources&gt; <br />&lt;local-tx-datasource&gt; <br />&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;MySqlDS&lt;/jndi-name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;jdbc:mysql://localhost:3306/lw&lt;/connection-url&gt; <br />&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt; <br />&nbsp;&nbsp;&nbsp; &lt;user-name&gt;root&lt;/user-name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;password&gt;rootpassword&lt;/password&gt; <br />&lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;metadata&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;mySQL&lt;/type-mapping&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/metadata&gt; <br />&lt;/local-tx-datasource&gt; <br />&lt;/datasources&gt; <br /><br />这里，定义了一个名为MySqlDS的数据源，其参数包括JDBC的URL，驱动类名，用户名及密码等。 <br /><br />2、在程序中引用数据源： <br /><br />Connection conn=null; <br />try <br />{ <br />Context ctx=new InitialContext(); <br />Object datasourceRef=ctx.lookup("java:MySqlDS"); <br />//引用数据源 <br />DataSource ds=(Datasource)datasourceRef; <br />conn=ds.getConnection(); <br />/* 使用conn进行数据库SQL操作 */...... <br />c.close(); <br />} <br />catch(Exception e) <br />{e.printStackTrace();} <br />finally {if(conn!=null) <br />{ <br />try <br />{ <br />conn.close(); <br />} <br />catch(SQLException e) <br />{ <br />}}} <br />直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几，但是现在的程序可以不用关心具体JDBC参数了。 <br />在系统部署后，如果数据库的相关参数变更，只需要重新配置 mysql-ds.xml 修改其中的JDBC参数，只要保证数据源的名称不变，那么程序源代码就无需修改。 <br /><br />由此可见，JNDI避免了程序与数据库之间的紧耦合，使应用更加易于配置、易于部署。 <br /><br />JNDI的扩展： <br />JNDI在满足了数据源配置的要求的基础上，还进一步扩充了作用：所有与系统外部的资源的引用，都可以通过JNDI定义和引用。 <br /><br />所以，在J2EE规范中，J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多，其中包括资源引用（已经讨论过）、环境实体和 EJB 引用。特别是 EJB 引用，它暴露了 JNDI 在 J2EE 中的另外一项关键角色：查找其他应用程序组件。 <br /><br />EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中，这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理，从 EJB 组件到 JMS 队列和主题，再到简单配置字符串或其他对象，这可以降低随时间的推移服务变更所产生的维护成本，同时还可以简化部署，减少集成工作。 外部资源&#8221;。 <br /><br /><br />总结： <br />J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是&#8220;交换机&#8221; &#8212;&#8212; J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下，提供 JNDI 供应者的容器可以充当有限的数据存储，这样管理员就可以设置应用程序的执行属性，并让其他应用程序引用这些属性（Java 管理扩展（Java Management Extensions，JMX）也可以用作这个目的）。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层，这样组件就可以发现所需要的资源，而不用了解这些间接性。 <br /><br />在 J2EE 中，JNDI 是把 J2EE 应用程序合在一起的粘合剂，JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺，而且经过一些计划和预先考虑，这个承诺是完全可以实现的。<img src ="http://www.blogjava.net/redcoatjk/aggbug/369917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/redcoatjk/" target="_blank">redcoatjk</a> 2012-02-14 10:24 <a href="http://www.blogjava.net/redcoatjk/archive/2012/02/14/369917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>