<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[JAVA FOR LIVE]]></title>
	  <link>http://blog.163.com/l_prince</link>
	  <description><![CDATA[JAVAEE工程师的成长日记 Information share]]></description>
	  <language>zh-CN</language>
	  <pubDate>Sat, 30 Aug 2008 15:42:56 +0800</pubDate>
	  <lastBuildDate>Sat, 30 Aug 2008 15:42:56 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[l_prince]]></managingEditor>
	  <webMaster><![CDATA[l_prince]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[JAVA FOR LIVE]]></title>
	  	<url>http://ava.blog.163.com/photo/jebrFDqyq9Mch4g_A1D43g==/2591540110575090198.jpg</url>
	  	<link>http://blog.163.com/l_prince</link>
	  </image>
  <item>
  	<title><![CDATA[Oracle 函数大全(字符串函数，数学函数，日期函数，逻辑运算函数，其他函数)志标题]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/779940820085114131581</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">Oracle 函数大全(字符串函数，数学函数，日期函数，逻辑运算函数，其他函数)</P>
<P style="TEXT-INDENT: 2em">关键词： <A href="http://tag.bokee.com/tag/Oracle%BA%AF%CA%FD">Oracle函数</A> &nbsp;&nbsp; <A href="http://tag.bokee.com/tag/%D7%D6%B7%FB%B4%AE%BA%AF%CA%FD">字符串函数</A> &nbsp;&nbsp; <A href="http://tag.bokee.com/tag/%CA%FD%D1%A7%BA%AF%CA%FD">数学函数</A> &nbsp;&nbsp; <A href="http://tag.bokee.com/tag/%C8%D5%C6%DA%BA%AF%CA%FD">日期函数</A> &nbsp;&nbsp; <A href="http://tag.bokee.com/tag/%C2%DF%BC%AD%D4%CB%CB%E3%BA%AF%CA%FD">逻辑运算函数</A> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">SQL中的单记录函数 </P>
<P style="TEXT-INDENT: 2em">1.ASCII </P>
<P style="TEXT-INDENT: 2em">返回与指定的字符对应的十进制数; </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select ascii(’A’) A,ascii(’a’) a,ascii(’0’) zero,ascii(’ ’) space from dual; </P>
<P style="TEXT-INDENT: 2em">A A ZERO SPACE </P>
<P style="TEXT-INDENT: 2em">--------- --------- --------- --------- </P>
<P style="TEXT-INDENT: 2em">65 97 48 32 </P>
<P style="TEXT-INDENT: 2em">2.CHR </P>
<P style="TEXT-INDENT: 2em">给出整数,返回对应的字符; </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select chr(54740) zhao,chr(65) chr65 from dual; </P>
<P style="TEXT-INDENT: 2em">ZH C </P>
<P style="TEXT-INDENT: 2em">-- - </P>
<P style="TEXT-INDENT: 2em">赵 A </P>
<P style="TEXT-INDENT: 2em">3.CONCAT </P>
<P style="TEXT-INDENT: 2em">连接两个字符串; </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select concat(’010-’,’88888888’)||’转23’ 高乾竞电话 from dual; </P>
<P style="TEXT-INDENT: 2em">高乾竞电话 </P>
<P style="TEXT-INDENT: 2em">---------------- </P>
<P style="TEXT-INDENT: 2em">010-88888888转23 </P>
<P style="TEXT-INDENT: 2em">4.INITCAP </P>
<P style="TEXT-INDENT: 2em">返回字符串并将字符串的第一个字母变为大写; </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select initcap(’smith’) upp from dual; </P>
<P style="TEXT-INDENT: 2em">UPP </P>
<P style="TEXT-INDENT: 2em">----- </P>
<P style="TEXT-INDENT: 2em">Smith </P>
<P style="TEXT-INDENT: 2em">5.INSTR(C1,C2,I,J) </P>
<P style="TEXT-INDENT: 2em">在一个字符串中搜索指定的字符,返回发现指定的字符的位置; </P>
<P style="TEXT-INDENT: 2em">C1 被搜索的字符串 </P>
<P style="TEXT-INDENT: 2em">C2 希望搜索的字符串 </P>
<P style="TEXT-INDENT: 2em">I 搜索的开始位置,默认为1 </P>
<P style="TEXT-INDENT: 2em">J 出现的位置,默认为1 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select instr(’oracle traning’,’ra’,1,2) instring from dual; </P>
<P style="TEXT-INDENT: 2em">INSTRING </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">9 </P>
<P style="TEXT-INDENT: 2em">6.LENGTH </P>
<P style="TEXT-INDENT: 2em">返回字符串的长度; </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst; </P>
<P style="TEXT-INDENT: 2em">NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL)) </P>
<P style="TEXT-INDENT: 2em">------ ------------ ---------------- ------------ --------- -------------------- </P>
<P style="TEXT-INDENT: 2em">高乾竞 3 北京市海锭区 6 9999.99 7 </P>
<P style="TEXT-INDENT: 2em">7.LOWER </P>
<P style="TEXT-INDENT: 2em">返回字符串,并将所有的字符小写 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select lower(’AaBbCcDd’)AaBbCcDd from dual; </P>
<P style="TEXT-INDENT: 2em">AABBCCDD </P>
<P style="TEXT-INDENT: 2em">-------- </P>
<P style="TEXT-INDENT: 2em">aabbccdd </P>
<P style="TEXT-INDENT: 2em">8.UPPER </P>
<P style="TEXT-INDENT: 2em">返回字符串,并将所有的字符大写 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select upper(’AaBbCcDd’) upper from dual; </P>
<P style="TEXT-INDENT: 2em">UPPER </P>
<P style="TEXT-INDENT: 2em">-------- </P>
<P style="TEXT-INDENT: 2em">AABBCCDD </P>
<P style="TEXT-INDENT: 2em">9.RPAD和LPAD(粘贴字符) </P>
<P style="TEXT-INDENT: 2em">RPAD 在列的右边粘贴字符 </P>
<P style="TEXT-INDENT: 2em">LPAD 在列的左边粘贴字符 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select lpad(rpad(’gao’,10,’*’),17,’*’)from dual; </P>
<P style="TEXT-INDENT: 2em">LPAD(RPAD(’GAO’,1 </P>
<P style="TEXT-INDENT: 2em">----------------- </P>
<P style="TEXT-INDENT: 2em">*******gao******* </P>
<P style="TEXT-INDENT: 2em">不够字符则用*来填满 </P>
<P style="TEXT-INDENT: 2em">10.LTRIM和RTRIM </P>
<P style="TEXT-INDENT: 2em">LTRIM 删除左边出现的字符串 </P>
<P style="TEXT-INDENT: 2em">RTRIM 删除右边出现的字符串 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select ltrim(rtrim(’ gao qian jing ’,’ ’),’ ’) from dual; </P>
<P style="TEXT-INDENT: 2em">LTRIM(RTRIM(’ </P>
<P style="TEXT-INDENT: 2em">------------- </P>
<P style="TEXT-INDENT: 2em">gao qian jing </P>
<P style="TEXT-INDENT: 2em">11.SUBSTR(string,start,count) </P>
<P style="TEXT-INDENT: 2em">取子字符串,从start开始,取count个 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select substr(’13088888888’,3,8) from dual; </P>
<P style="TEXT-INDENT: 2em">SUBSTR(’ </P>
<P style="TEXT-INDENT: 2em">-------- </P>
<P style="TEXT-INDENT: 2em">08888888 </P>
<P style="TEXT-INDENT: 2em">12.REPLACE(’string’,’s1’,’s2’) </P>
<P style="TEXT-INDENT: 2em">string 希望被替换的字符或变量 </P>
<P style="TEXT-INDENT: 2em">s1 被替换的字符串 </P>
<P style="TEXT-INDENT: 2em">s2 要替换的字符串 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select replace(’he love you’,’he’,’i’) from dual; </P>
<P style="TEXT-INDENT: 2em">REPLACE(’H </P>
<P style="TEXT-INDENT: 2em">---------- </P>
<P style="TEXT-INDENT: 2em">i love you </P>
<P style="TEXT-INDENT: 2em">13.SOUNDEX </P>
<P style="TEXT-INDENT: 2em">返回一个与给定的字符串读音相同的字符串 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; create table table1(xm varchar(8)); </P>
<P style="TEXT-INDENT: 2em">SQL&gt; insert into table1 values(’weather’); </P>
<P style="TEXT-INDENT: 2em">SQL&gt; insert into table1 values(’wether’); </P>
<P style="TEXT-INDENT: 2em">SQL&gt; insert into table1 values(’gao’); </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select xm from table1 where soundex(xm)=soundex(’weather’); </P>
<P style="TEXT-INDENT: 2em">XM </P>
<P style="TEXT-INDENT: 2em">-------- </P>
<P style="TEXT-INDENT: 2em">weather </P>
<P style="TEXT-INDENT: 2em">wether </P>
<P style="TEXT-INDENT: 2em">14.TRIM(’s’ from ’string’) </P>
<P style="TEXT-INDENT: 2em">LEADING 剪掉前面的字符 </P>
<P style="TEXT-INDENT: 2em">TRAILING 剪掉后面的字符 </P>
<P style="TEXT-INDENT: 2em">如果不指定,默认为空格符 </P>
<P style="TEXT-INDENT: 2em">15.ABS </P>
<P style="TEXT-INDENT: 2em">返回指定值的绝对值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select abs(100),abs(-100) from dual; </P>
<P style="TEXT-INDENT: 2em">ABS(100) ABS(-100) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">100 100 </P>
<P style="TEXT-INDENT: 2em">16.ACOS </P>
<P style="TEXT-INDENT: 2em">给出反余弦的值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select acos(-1) from dual; </P>
<P style="TEXT-INDENT: 2em">ACOS(-1) </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">3.1415927 </P>
<P style="TEXT-INDENT: 2em">17.ASIN </P>
<P style="TEXT-INDENT: 2em">给出反正弦的值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select asin(0.5) from dual; </P>
<P style="TEXT-INDENT: 2em">ASIN(0.5) </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">.52359878 </P>
<P style="TEXT-INDENT: 2em">18.ATAN </P>
<P style="TEXT-INDENT: 2em">返回一个数字的反正切值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select atan(1) from dual; </P>
<P style="TEXT-INDENT: 2em">ATAN(1) </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">.78539816 </P>
<P style="TEXT-INDENT: 2em">19.CEIL </P>
<P style="TEXT-INDENT: 2em">返回大于或等于给出数字的最小整数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select ceil(3.1415927) from dual; </P>
<P style="TEXT-INDENT: 2em">CEIL(3.1415927) </P>
<P style="TEXT-INDENT: 2em">--------------- </P>
<P style="TEXT-INDENT: 2em">4 </P>
<P style="TEXT-INDENT: 2em">20.COS </P>
<P style="TEXT-INDENT: 2em">返回一个给定数字的余弦 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select cos(-3.1415927) from dual; </P>
<P style="TEXT-INDENT: 2em">COS(-3.1415927) </P>
<P style="TEXT-INDENT: 2em">--------------- </P>
<P style="TEXT-INDENT: 2em">-1</P>
<P style="TEXT-INDENT: 2em">21.COSH </P>
<P style="TEXT-INDENT: 2em">返回一个数字反余弦值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select cosh(20) from dual; </P>
<P style="TEXT-INDENT: 2em">COSH(20) </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">242582598 </P>
<P style="TEXT-INDENT: 2em">22.EXP </P>
<P style="TEXT-INDENT: 2em">返回一个数字e的n次方根 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select exp(2),exp(1) from dual; </P>
<P style="TEXT-INDENT: 2em">EXP(2) EXP(1) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">7.3890561 2.7182818 </P>
<P style="TEXT-INDENT: 2em">23.FLOOR </P>
<P style="TEXT-INDENT: 2em">对给定的数字取整数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select floor(2345.67) from dual; </P>
<P style="TEXT-INDENT: 2em">FLOOR(2345.67) </P>
<P style="TEXT-INDENT: 2em">-------------- </P>
<P style="TEXT-INDENT: 2em">2345 </P>
<P style="TEXT-INDENT: 2em">24.LN </P>
<P style="TEXT-INDENT: 2em">返回一个数字的对数值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select ln(1),ln(2),ln(2.7182818) from dual; </P>
<P style="TEXT-INDENT: 2em">LN(1) LN(2) LN(2.7182818) </P>
<P style="TEXT-INDENT: 2em">--------- --------- ------------- </P>
<P style="TEXT-INDENT: 2em">0 .69314718 .99999999 </P>
<P style="TEXT-INDENT: 2em">25.LOG(n1,n2) </P>
<P style="TEXT-INDENT: 2em">返回一个以n1为底n2的对数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select log(2,1),log(2,4) from dual; </P>
<P style="TEXT-INDENT: 2em">LOG(2,1) LOG(2,4) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">0 2 </P>
<P style="TEXT-INDENT: 2em">26.MOD(n1,n2) </P>
<P style="TEXT-INDENT: 2em">返回一个n1除以n2的余数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select mod(10,3),mod(3,3),mod(2,3) from dual; </P>
<P style="TEXT-INDENT: 2em">MOD(10,3) MOD(3,3) MOD(2,3) </P>
<P style="TEXT-INDENT: 2em">--------- --------- --------- </P>
<P style="TEXT-INDENT: 2em">1 0 2 </P>
<P style="TEXT-INDENT: 2em">27.POWER </P>
<P style="TEXT-INDENT: 2em">返回n1的n2次方根 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select power(2,10),power(3,3) from dual; </P>
<P style="TEXT-INDENT: 2em">POWER(2,10) POWER(3,3) </P>
<P style="TEXT-INDENT: 2em">----------- ---------- </P>
<P style="TEXT-INDENT: 2em">1024 27 </P>
<P style="TEXT-INDENT: 2em">28.ROUND和TRUNC </P>
<P style="TEXT-INDENT: 2em">按照指定的精度进行舍入 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual; </P>
<P style="TEXT-INDENT: 2em">ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5) </P>
<P style="TEXT-INDENT: 2em">----------- ------------ ----------- ------------ </P>
<P style="TEXT-INDENT: 2em">56 -55 55 -55 </P>
<P style="TEXT-INDENT: 2em">29.SIGN </P>
<P style="TEXT-INDENT: 2em">取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select sign(123),sign(-100),sign(0) from dual; </P>
<P style="TEXT-INDENT: 2em">SIGN(123) SIGN(-100) SIGN(0) </P>
<P style="TEXT-INDENT: 2em">--------- ---------- --------- </P>
<P style="TEXT-INDENT: 2em">1 -1 0 </P>
<P style="TEXT-INDENT: 2em">30.SIN </P>
<P style="TEXT-INDENT: 2em">返回一个数字的正弦值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select sin(1.57079) from dual; </P>
<P style="TEXT-INDENT: 2em">SIN(1.57079) </P>
<P style="TEXT-INDENT: 2em">------------ </P>
<P style="TEXT-INDENT: 2em">1 </P>
<P style="TEXT-INDENT: 2em">31.SIGH </P>
<P style="TEXT-INDENT: 2em">返回双曲正弦的值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select sin(20),sinh(20) from dual; </P>
<P style="TEXT-INDENT: 2em">SIN(20) SINH(20) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">.91294525 242582598 </P>
<P style="TEXT-INDENT: 2em">32.SQRT </P>
<P style="TEXT-INDENT: 2em">返回数字n的根 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select sqrt(64),sqrt(10) from dual; </P>
<P style="TEXT-INDENT: 2em">SQRT(64) SQRT(10) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">8 3.1622777 </P>
<P style="TEXT-INDENT: 2em">33.TAN </P>
<P style="TEXT-INDENT: 2em">返回数字的正切值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select tan(20),tan(10) from dual; </P>
<P style="TEXT-INDENT: 2em">TAN(20) TAN(10) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">2.2371609 .64836083 </P>
<P style="TEXT-INDENT: 2em">34.TANH </P>
<P style="TEXT-INDENT: 2em">返回数字n的双曲正切值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select tanh(20),tan(20) from dual; </P>
<P style="TEXT-INDENT: 2em">TANH(20) TAN(20) </P>
<P style="TEXT-INDENT: 2em">--------- --------- </P>
<P style="TEXT-INDENT: 2em">1 2.2371609 </P>
<P style="TEXT-INDENT: 2em">35.TRUNC </P>
<P style="TEXT-INDENT: 2em">按照指定的精度截取一个数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual; </P>
<P style="TEXT-INDENT: 2em">TRUNC1 TRUNC(124.16666,2) </P>
<P style="TEXT-INDENT: 2em">--------- ------------------ </P>
<P style="TEXT-INDENT: 2em">100 124.16 </P>
<P style="TEXT-INDENT: 2em">36.ADD_MONTHS </P>
<P style="TEXT-INDENT: 2em">增加或减去月份 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(add_months(to_date(’199912’,’yyyymm’),2),’yyyymm’) from dual; </P>
<P style="TEXT-INDENT: 2em">TO_CHA </P>
<P style="TEXT-INDENT: 2em">------ </P>
<P style="TEXT-INDENT: 2em">200002 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(add_months(to_date(’199912’,’yyyymm’),-2),’yyyymm’) from dual; </P>
<P style="TEXT-INDENT: 2em">TO_CHA </P>
<P style="TEXT-INDENT: 2em">------ </P>
<P style="TEXT-INDENT: 2em">199910 </P>
<P style="TEXT-INDENT: 2em">37.LAST_DAY </P>
<P style="TEXT-INDENT: 2em">返回日期的最后一天 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(sysdate,’yyyy.mm.dd’),to_char((sysdate)+1,’yyyy.mm.dd’) from dual; </P>
<P style="TEXT-INDENT: 2em">TO_CHAR(SY TO_CHAR((S </P>
<P style="TEXT-INDENT: 2em">---------- ---------- </P>
<P style="TEXT-INDENT: 2em">2004.05.09 2004.05.10 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select last_day(sysdate) from dual; </P>
<P style="TEXT-INDENT: 2em">LAST_DAY(S </P>
<P style="TEXT-INDENT: 2em">---------- </P>
<P style="TEXT-INDENT: 2em">31-5月 -04 </P>
<P style="TEXT-INDENT: 2em">38.MONTHS_BETWEEN(date2,date1) </P>
<P style="TEXT-INDENT: 2em">给出date2-date1的月份 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select months_between(’19-12月-1999’,’19-3月-1999’) mon_between from dual; </P>
<P style="TEXT-INDENT: 2em">MON_BETWEEN </P>
<P style="TEXT-INDENT: 2em">----------- </P>
<P style="TEXT-INDENT: 2em">9 </P>
<P style="TEXT-INDENT: 2em">SQL&gt;selectmonths_between(to_date(’2000.05.20’,’yyyy.mm.dd’),to_date(’2005.05.20’,’yyyy.mm.dd’)) mon_betw from dual; </P>
<P style="TEXT-INDENT: 2em">MON_BETW </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">-60 </P>
<P style="TEXT-INDENT: 2em">39.NEW_TIME(date,’this’,’that’) </P>
<P style="TEXT-INDENT: 2em">给出在this时区=other时区的日期和时间 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(sysdate,’yyyy.mm.dd hh24:mi:ss’) bj_time,to_char(new_time </P>
<P style="TEXT-INDENT: 2em">2 (sysdate,’PDT’,’GMT’),’yyyy.mm.dd hh24:mi:ss’) los_angles from dual; </P>
<P style="TEXT-INDENT: 2em">BJ_TIME LOS_ANGLES </P>
<P style="TEXT-INDENT: 2em">------------------- ------------------- </P>
<P style="TEXT-INDENT: 2em">2004.05.09 11:05:32 2004.05.09 18:05:32 </P>
<P style="TEXT-INDENT: 2em">40.NEXT_DAY(date,’day’) </P>
<P style="TEXT-INDENT: 2em">给出日期date和星期x之后计算下一个星期的日期 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select next_day(’18-5月-2001’,’星期五’) next_day from dual; </P>
<P style="TEXT-INDENT: 2em">NEXT_DAY </P>
<P style="TEXT-INDENT: 2em">---------- </P>
<P style="TEXT-INDENT: 2em">25-5月 -01</P>
<P style="TEXT-INDENT: 2em">41.SYSDATE </P>
<P style="TEXT-INDENT: 2em">用来得到系统的当前日期 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(sysdate,’dd-mm-yyyy day’) from dual; </P>
<P style="TEXT-INDENT: 2em">TO_CHAR(SYSDATE,’ </P>
<P style="TEXT-INDENT: 2em">----------------- </P>
<P style="TEXT-INDENT: 2em">09-05-2004 星期日 </P>
<P style="TEXT-INDENT: 2em">trunc(date,fmt)按照给出的要求将日期截断,如果fmt=’mi’表示保留分,截断秒 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(trunc(sysdate,’hh’),’yyyy.mm.dd hh24:mi:ss’) hh, </P>
<P style="TEXT-INDENT: 2em">2 to_char(trunc(sysdate,’mi’),’yyyy.mm.dd hh24:mi:ss’) hhmm from dual; </P>
<P style="TEXT-INDENT: 2em">HH HHMM </P>
<P style="TEXT-INDENT: 2em">------------------- ------------------- </P>
<P style="TEXT-INDENT: 2em">2004.05.09 11:00:00 2004.05.09 11:17:00 </P>
<P style="TEXT-INDENT: 2em">42.CHARTOROWID </P>
<P style="TEXT-INDENT: 2em">将字符数据类型转换为ROWID类型 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select rowid,rowidtochar(rowid),ename from scott.emp; </P>
<P style="TEXT-INDENT: 2em">ROWID ROWIDTOCHAR(ROWID) ENAME </P>
<P style="TEXT-INDENT: 2em">------------------ ------------------ ---------- </P>
<P style="TEXT-INDENT: 2em">AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH </P>
<P style="TEXT-INDENT: 2em">AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN </P>
<P style="TEXT-INDENT: 2em">AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD </P>
<P style="TEXT-INDENT: 2em">AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES </P>
<P style="TEXT-INDENT: 2em">43.CONVERT(c,dset,sset) </P>
<P style="TEXT-INDENT: 2em">将源字符串 sset从一个语言字符集转换到另一个目的dset字符集 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select convert(’strutz’,’we8hp’,’f7dec’) "conversion" from dual; </P>
<P style="TEXT-INDENT: 2em">conver </P>
<P style="TEXT-INDENT: 2em">------ </P>
<P style="TEXT-INDENT: 2em">strutz </P>
<P style="TEXT-INDENT: 2em">44.HEXTORAW </P>
<P style="TEXT-INDENT: 2em">将一个十六进制构成的字符串转换为二进制 </P>
<P style="TEXT-INDENT: 2em">45.RAWTOHEXT </P>
<P style="TEXT-INDENT: 2em">将一个二进制构成的字符串转换为十六进制 </P>
<P style="TEXT-INDENT: 2em">46.ROWIDTOCHAR </P>
<P style="TEXT-INDENT: 2em">将ROWID数据类型转换为字符类型 </P>
<P style="TEXT-INDENT: 2em">47.TO_CHAR(date,’format’) </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_char(sysdate,’yyyy/mm/dd hh24:mi:ss’) from dual; </P>
<P style="TEXT-INDENT: 2em">TO_CHAR(SYSDATE,’YY </P>
<P style="TEXT-INDENT: 2em">------------------- </P>
<P style="TEXT-INDENT: 2em">2004/05/09 21:14:41 </P>
<P style="TEXT-INDENT: 2em">48.TO_DATE(string,’format’) </P>
<P style="TEXT-INDENT: 2em">将字符串转化为ORACLE中的一个日期 </P>
<P style="TEXT-INDENT: 2em">49.TO_MULTI_BYTE </P>
<P style="TEXT-INDENT: 2em">将字符串中的单字节字符转化为多字节字符 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_multi_byte(’高’) from dual; </P>
<P style="TEXT-INDENT: 2em">TO </P>
<P style="TEXT-INDENT: 2em">-- </P>
<P style="TEXT-INDENT: 2em">高 </P>
<P style="TEXT-INDENT: 2em">50.TO_NUMBER </P>
<P style="TEXT-INDENT: 2em">将给出的字符转换为数字 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select to_number(’1999’) year from dual; </P>
<P style="TEXT-INDENT: 2em">YEAR </P>
<P style="TEXT-INDENT: 2em">--------- </P>
<P style="TEXT-INDENT: 2em">1999 </P>
<P style="TEXT-INDENT: 2em">51.BFILENAME(dir,file) </P>
<P style="TEXT-INDENT: 2em">指定一个外部二进制文件 </P>
<P style="TEXT-INDENT: 2em">SQL&gt;insert into file_tb1 values(bfilename(’lob_dir1’,’image1.gif’)); </P>
<P style="TEXT-INDENT: 2em">52.CONVERT(’x’,’desc’,’source’) </P>
<P style="TEXT-INDENT: 2em">将x字段或变量的源source转换为desc </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select sid,serial#,username,decode(command, </P>
<P style="TEXT-INDENT: 2em">2 0,’none’, </P>
<P style="TEXT-INDENT: 2em">3 2,’insert’, </P>
<P style="TEXT-INDENT: 2em">4 3, </P>
<P style="TEXT-INDENT: 2em">5 ’select’, </P>
<P style="TEXT-INDENT: 2em">6 6,’update’, </P>
<P style="TEXT-INDENT: 2em">7 7,’delete’, </P>
<P style="TEXT-INDENT: 2em">8 8,’drop’, </P>
<P style="TEXT-INDENT: 2em">9 ’other’) cmd from v$session where type!=’background’; </P>
<P style="TEXT-INDENT: 2em">SID SERIAL# USERNAME CMD </P>
<P style="TEXT-INDENT: 2em">--------- --------- ------------------------------ ------ </P>
<P style="TEXT-INDENT: 2em">1 1 none </P>
<P style="TEXT-INDENT: 2em">2 1 none </P>
<P style="TEXT-INDENT: 2em">3 1 none </P>
<P style="TEXT-INDENT: 2em">4 1 none </P>
<P style="TEXT-INDENT: 2em">5 1 none </P>
<P style="TEXT-INDENT: 2em">6 1 none </P>
<P style="TEXT-INDENT: 2em">7 1275 none </P>
<P style="TEXT-INDENT: 2em">8 1275 none </P>
<P style="TEXT-INDENT: 2em">9 20 GAO select </P>
<P style="TEXT-INDENT: 2em">10 40 GAO none </P>
<P style="TEXT-INDENT: 2em">53.DUMP(s,fmt,start,length) </P>
<P style="TEXT-INDENT: 2em">DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; col global_name for a30 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; col dump_string for a50 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; set lin 200 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select global_name,dump(global_name,1017,8,5) dump_string from global_name; </P>
<P style="TEXT-INDENT: 2em">GLOBAL_NAME DUMP_STRING </P>
<P style="TEXT-INDENT: 2em">------------------------------ -------------------------------------------------- </P>
<P style="TEXT-INDENT: 2em">ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D </P>
<P style="TEXT-INDENT: 2em">54.EMPTY_BLOB()和EMPTY_CLOB() </P>
<P style="TEXT-INDENT: 2em">这两个函数都是用来对大数据类型字段进行初始化操作的函数 </P>
<P style="TEXT-INDENT: 2em">55.GREATEST </P>
<P style="TEXT-INDENT: 2em">返回一组表达式中的最大值,即比较字符的编码大小. </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select greatest(’AA’,’AB’,’AC’) from dual; </P>
<P style="TEXT-INDENT: 2em">GR </P>
<P style="TEXT-INDENT: 2em">-- </P>
<P style="TEXT-INDENT: 2em">AC </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select greatest(’啊’,’安’,’天’) from dual; </P>
<P style="TEXT-INDENT: 2em">GR </P>
<P style="TEXT-INDENT: 2em">-- </P>
<P style="TEXT-INDENT: 2em">天 </P>
<P style="TEXT-INDENT: 2em">56.LEAST </P>
<P style="TEXT-INDENT: 2em">返回一组表达式中的最小值 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select least(’啊’,’安’,’天’) from dual; </P>
<P style="TEXT-INDENT: 2em">LE </P>
<P style="TEXT-INDENT: 2em">-- </P>
<P style="TEXT-INDENT: 2em">啊 </P>
<P style="TEXT-INDENT: 2em">57.UID </P>
<P style="TEXT-INDENT: 2em">返回标识当前用户的唯一整数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; show user </P>
<P style="TEXT-INDENT: 2em">USER 为"GAO" </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select username,user_id from dba_users where user_id=uid; </P>
<P style="TEXT-INDENT: 2em">USERNAME USER_ID </P>
<P style="TEXT-INDENT: 2em">------------------------------ --------- </P>
<P style="TEXT-INDENT: 2em">GAO 25 </P>
<P style="TEXT-INDENT: 2em">58.USER </P>
<P style="TEXT-INDENT: 2em">返回当前用户的名字 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select user from dual; </P>
<P style="TEXT-INDENT: 2em">USER </P>
<P style="TEXT-INDENT: 2em">------------------------------ </P>
<P style="TEXT-INDENT: 2em">GAO </P>
<P style="TEXT-INDENT: 2em">59.USEREVN </P>
<P style="TEXT-INDENT: 2em">返回当前用户环境的信息,opt可以是: </P>
<P style="TEXT-INDENT: 2em">ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE </P>
<P style="TEXT-INDENT: 2em">ISDBA 查看当前用户是否是DBA如果是则返回true </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’isdba’) from dual; </P>
<P style="TEXT-INDENT: 2em">USEREN </P>
<P style="TEXT-INDENT: 2em">------ </P>
<P style="TEXT-INDENT: 2em">FALSE </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’isdba’) from dual; </P>
<P style="TEXT-INDENT: 2em">USEREN </P>
<P style="TEXT-INDENT: 2em">------ </P>
<P style="TEXT-INDENT: 2em">TRUE </P>
<P style="TEXT-INDENT: 2em">SESSION </P>
<P style="TEXT-INDENT: 2em">返回会话标志 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’sessionid’) from dual; </P>
<P style="TEXT-INDENT: 2em">USERENV(’SESSIONID’) </P>
<P style="TEXT-INDENT: 2em">-------------------- </P>
<P style="TEXT-INDENT: 2em">152 </P>
<P style="TEXT-INDENT: 2em">ENTRYID </P>
<P style="TEXT-INDENT: 2em">返回会话人口标志 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’entryid’) from dual; </P>
<P style="TEXT-INDENT: 2em">USERENV(’ENTRYID’) </P>
<P style="TEXT-INDENT: 2em">------------------ </P>
<P style="TEXT-INDENT: 2em">0 </P>
<P style="TEXT-INDENT: 2em">INSTANCE </P>
<P style="TEXT-INDENT: 2em">返回当前INSTANCE的标志 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’instance’) from dual; </P>
<P style="TEXT-INDENT: 2em">USERENV(’INSTANCE’) </P>
<P style="TEXT-INDENT: 2em">------------------- </P>
<P style="TEXT-INDENT: 2em">1 </P>
<P style="TEXT-INDENT: 2em">LANGUAGE </P>
<P style="TEXT-INDENT: 2em">返回当前环境变量 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’language’) from dual; </P>
<P style="TEXT-INDENT: 2em">USERENV(’LANGUAGE’) </P>
<P style="TEXT-INDENT: 2em">---------------------------------------------------- </P>
<P style="TEXT-INDENT: 2em">SIMPLIFIED CHINESE_CHINA.ZHS16GBK </P>
<P style="TEXT-INDENT: 2em">LANG </P>
<P style="TEXT-INDENT: 2em">返回当前环境的语言的缩写 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’lang’) from dual; </P>
<P style="TEXT-INDENT: 2em">USERENV(’LANG’) </P>
<P style="TEXT-INDENT: 2em">---------------------------------------------------- </P>
<P style="TEXT-INDENT: 2em">ZHS </P>
<P style="TEXT-INDENT: 2em">TERMINAL </P>
<P style="TEXT-INDENT: 2em">返回用户的终端或机器的标志 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select userenv(’terminal’) from dual; </P>
<P style="TEXT-INDENT: 2em">USERENV(’TERMINA </P>
<P style="TEXT-INDENT: 2em">---------------- </P>
<P style="TEXT-INDENT: 2em">GAO </P>
<P style="TEXT-INDENT: 2em">VSIZE(X) </P>
<P style="TEXT-INDENT: 2em">返回X的大小(字节)数 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select vsize(user),user from dual; </P>
<P style="TEXT-INDENT: 2em">VSIZE(USER) USER </P>
<P style="TEXT-INDENT: 2em">----------- ------------------------------ </P>
<P style="TEXT-INDENT: 2em">6 SYSTEM</P>
<P style="TEXT-INDENT: 2em">60.AVG(DISTINCT|ALL) </P>
<P style="TEXT-INDENT: 2em">all表示对所有的值求平均值,distinct只对不同的值求平均值 </P>
<P style="TEXT-INDENT: 2em">SQLWKS&gt; create table table3(xm varchar(8),sal number(7,2)); </P>
<P style="TEXT-INDENT: 2em">语句已处理。 </P>
<P style="TEXT-INDENT: 2em">SQLWKS&gt; insert into table3 values(’gao’,1111.11); </P>
<P style="TEXT-INDENT: 2em">SQLWKS&gt; insert into table3 values(’gao’,1111.11); </P>
<P style="TEXT-INDENT: 2em">SQLWKS&gt; insert into table3 values(’zhu’,5555.55); </P>
<P style="TEXT-INDENT: 2em">SQLWKS&gt; commit; </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select avg(distinct sal) from gao.table3; </P>
<P style="TEXT-INDENT: 2em">AVG(DISTINCTSAL) </P>
<P style="TEXT-INDENT: 2em">---------------- </P>
<P style="TEXT-INDENT: 2em">3333.33 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select avg(all sal) from gao.table3; </P>
<P style="TEXT-INDENT: 2em">AVG(ALLSAL) </P>
<P style="TEXT-INDENT: 2em">----------- </P>
<P style="TEXT-INDENT: 2em">2592.59 </P>
<P style="TEXT-INDENT: 2em">61.MAX(DISTINCT|ALL) </P>
<P style="TEXT-INDENT: 2em">求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select max(distinct sal) from scott.emp; </P>
<P style="TEXT-INDENT: 2em">MAX(DISTINCTSAL) </P>
<P style="TEXT-INDENT: 2em">---------------- </P>
<P style="TEXT-INDENT: 2em">5000 </P>
<P style="TEXT-INDENT: 2em">62.MIN(DISTINCT|ALL) </P>
<P style="TEXT-INDENT: 2em">求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select min(all sal) from gao.table3; </P>
<P style="TEXT-INDENT: 2em">MIN(ALLSAL) </P>
<P style="TEXT-INDENT: 2em">----------- </P>
<P style="TEXT-INDENT: 2em">1111.11 </P>
<P style="TEXT-INDENT: 2em">63.STDDEV(distinct|all) </P>
<P style="TEXT-INDENT: 2em">求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select stddev(sal) from scott.emp; </P>
<P style="TEXT-INDENT: 2em">STDDEV(SAL) </P>
<P style="TEXT-INDENT: 2em">----------- </P>
<P style="TEXT-INDENT: 2em">1182.5032 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select stddev(distinct sal) from scott.emp; </P>
<P style="TEXT-INDENT: 2em">STDDEV(DISTINCTSAL) </P>
<P style="TEXT-INDENT: 2em">------------------- </P>
<P style="TEXT-INDENT: 2em">1229.951 </P>
<P style="TEXT-INDENT: 2em">64.VARIANCE(DISTINCT|ALL) </P>
<P style="TEXT-INDENT: 2em">求协方差 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select variance(sal) from scott.emp; </P>
<P style="TEXT-INDENT: 2em">VARIANCE(SAL) </P>
<P style="TEXT-INDENT: 2em">------------- </P>
<P style="TEXT-INDENT: 2em">1398313.9 </P>
<P style="TEXT-INDENT: 2em">65.GROUP BY </P>
<P style="TEXT-INDENT: 2em">主要用来对一组数进行统计 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno; </P>
<P style="TEXT-INDENT: 2em">DEPTNO COUNT(*) SUM(SAL) </P>
<P style="TEXT-INDENT: 2em">--------- --------- --------- </P>
<P style="TEXT-INDENT: 2em">10 3 8750 </P>
<P style="TEXT-INDENT: 2em">20 5 10875 </P>
<P style="TEXT-INDENT: 2em">30 6 9400 </P>
<P style="TEXT-INDENT: 2em">66.HAVING </P>
<P style="TEXT-INDENT: 2em">对分组统计再加限制条件 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)&gt;=5; </P>
<P style="TEXT-INDENT: 2em">DEPTNO COUNT(*) SUM(SAL) </P>
<P style="TEXT-INDENT: 2em">--------- --------- --------- </P>
<P style="TEXT-INDENT: 2em">20 5 10875 </P>
<P style="TEXT-INDENT: 2em">30 6 9400 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select deptno,count(*),sum(sal) from scott.emp having count(*)&gt;=5 group by deptno ; </P>
<P style="TEXT-INDENT: 2em">DEPTNO COUNT(*) SUM(SAL) </P>
<P style="TEXT-INDENT: 2em">--------- --------- --------- </P>
<P style="TEXT-INDENT: 2em">20 5 10875 </P>
<P style="TEXT-INDENT: 2em">30 6 9400 </P>
<P style="TEXT-INDENT: 2em">67.ORDER BY </P>
<P style="TEXT-INDENT: 2em">用于对查询到的结果进行排序输出 </P>
<P style="TEXT-INDENT: 2em">SQL&gt; select deptno,ename,sal from scott.emp order by deptno,sal desc; </P>
<P style="TEXT-INDENT: 2em">DEPTNO ENAME SAL </P>
<P style="TEXT-INDENT: 2em">--------- ---------- --------- </P>
<P style="TEXT-INDENT: 2em">10 KING 5000 </P>
<P style="TEXT-INDENT: 2em">10 CLARK 2450 </P>
<P style="TEXT-INDENT: 2em">10 MILLER 1300 </P>
<P style="TEXT-INDENT: 2em">20 SCOTT 3000 </P>
<P style="TEXT-INDENT: 2em">20 FORD 3000 </P>
<P style="TEXT-INDENT: 2em">20 JONES 2975 </P>
<P style="TEXT-INDENT: 2em">20 ADAMS 1100 </P>
<P style="TEXT-INDENT: 2em">20 SMITH 800 </P>
<P style="TEXT-INDENT: 2em">30 BLAKE 2850 </P>
<P style="TEXT-INDENT: 2em">30 ALLEN 1600 </P>
<P style="TEXT-INDENT: 2em">30 TURNER 1500 </P>
<P style="TEXT-INDENT: 2em">30 WARD 1250 </P>
<P style="TEXT-INDENT: 2em">30 MARTIN 1250 </P>
<P style="TEXT-INDENT: 2em">30 JAMES 950 </P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/779940820085114131581</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/779940820085114131581</guid>
    <pubDate>Wed, 11 Jun 2008 16:13:01 +0800</pubDate>
    <dcterms:modified>2008-06-11T16:13:01+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Tomcat5.5.23设置支持中文目录]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/779940820085113263129</link>
    <description><![CDATA[<div><P>修改conf/service.xml:</P>
<P>&lt;Connector port="8080" maxHttpHeaderSize="8192"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" <STRONG><EM><FONT color=#ff0000>URIEncoding="UTF-8"</FONT><FONT color=#000000> /</FONT></EM></STRONG>&gt;</P>
<P>......</P>
<P>&lt;Connector port="8009" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" protocol="AJP/1.3" <STRONG><EM><FONT color=#ff0000>URIEncoding="UTF-8" </FONT><FONT color=#000000>/</FONT></EM></STRONG><FONT color=#000000>&gt;</FONT></P>
<P>红色为添加部分，这样就搞定了。</P>
<P>默认情况下，不允许直接访问目录而显示出此目录下所有文件信息。</P>
<P>修改：conf/web.xml</P>
<P>&lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;default&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;listings&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;<FONT color=#ff0000>true</FONT>&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/779940820085113263129</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/779940820085113263129</guid>
    <pubDate>Wed, 11 Jun 2008 15:26:31 +0800</pubDate>
    <dcterms:modified>2008-06-11T15:28:23+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[web service]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/7799408200722321346981</link>
    <description><![CDATA[<div><P>最近忙着学习,WEB SERVICE.</P>
<P>搞了两天了,终于有点WSDD门路了,却不知道原来实际开发中写的是WSDL.</P>
<P>哎,郁闷啊!</P>
<P>别的不说了,把一个成功的配置文件先凉出来:</P>
<P style="TEXT-INDENT: 2em">&lt;!-- Use this file to deploy some handlers/chains and services&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;!-- Two ways to do this:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;!--&nbsp;&nbsp; java org.apache.axis.client.AdminClient deploy.wsdd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;!--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; after the axis server is running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;!-- or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;!--&nbsp;&nbsp; java org.apache.axis.utils.Admin client|server deploy.wsdd&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;!--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from the same directory that the Axis engine runs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;deployment  xmlns="<A href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</A>"&nbsp; </P>
<P style="TEXT-INDENT: 2em">&nbsp; xmlns:java="<A href="http://xml.apache.org/axis/wsdd/providers/java">http://xml.apache.org/axis/wsdd/providers/java</A>"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp; &lt;service  provider="java:RPC"&gt; </P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter  value="test.webservice.Calculator" /&gt;&nbsp; </P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; &lt;operation  qname="createStudent" returnQName="ns:student" xmlns:ns="<A href="http://service/axis/services/AdminService">http://service/axis/services/AdminService</A>" soapAction="<A href="http://localhost:8080/axis/services/Calculator">http://localhost:8080/axis/services/Calculator</A>"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter qname="id" type="tns:int" xmlns:tns="<A href="http://service/axis/services/AdminService">http://service/axis/services/AdminService</A>"</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qname="ns:student"</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="java:test.webservice.entity.Student"</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; encodingStyle=""</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp; &lt;/service&gt; </P>
<P style="TEXT-INDENT: 2em">&lt;/deployment&gt;</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/7799408200722321346981</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/7799408200722321346981</guid>
    <pubDate>Fri, 23 Mar 2007 14:13:46 +0800</pubDate>
    <dcterms:modified>2007-03-23T14:13:46+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[缺少文件根组件]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/7799408200722045041844</link>
    <description><![CDATA[<div><P>在学WEBSERVICE时候,用AXIS来解析那deploy.wsdd的时候,出现缺少文件根组件的异常!</P>
<P>只要你的文件中没有中文,保存的时候以ANSI编码保存!</P>
<P>就不会有问题!</P>
<P>不要忘记配AXISSERVLET</P>
<P>妈的,老外的东西!</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/7799408200722045041844</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/7799408200722045041844</guid>
    <pubDate>Tue, 20 Mar 2007 16:50:41 +0800</pubDate>
    <dcterms:modified>2007-03-20T17:46:53+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[jar命令的一些问题]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/77994082007219113757603</link>
    <description><![CDATA[<div><P>jar -cvfm mainifest.mf *.*</P>
<P>特别值得注意的是mainnifest.mf</P>
<P>中的东东,Main-Class: yourmaincalss</P>
<P>注意Main-Class:后面必须有个空格,否则抛出:java.io.IOException:invalid header field</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/77994082007219113757603</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/77994082007219113757603</guid>
    <pubDate>Mon, 19 Mar 2007 11:37:57 +0800</pubDate>
    <dcterms:modified>2007-03-19T11:37:57+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[java,javascript执行dos命令]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/779940820072152757640</link>
    <description><![CDATA[<div><P>java中执行dos命令</P>
<P>package liu.ums.util;</P>
<P>import java.io.IOException;</P>
<P>public class ShowHelpText {<BR>&nbsp;public static void main(String[] args) throws Exception{<BR>&nbsp;&nbsp;Runtime runtime=Runtime.getRuntime();<BR>&nbsp;&nbsp;runtime.exec("hh help.chm");<BR>&nbsp;}<BR>}</P>
<P>hh help.chm在DOS环境下查看.chm文件.</P>
<P>javascript中执行dos命令(IE)</P>
<P>&lt;script&gt;<BR>&nbsp;&nbsp;function runCommand(){<BR>&nbsp;&nbsp;&nbsp;alert("g");<BR>&nbsp;&nbsp;&nbsp;var s=new ActiveXObject("wscript.shell");<BR>&nbsp;&nbsp;&nbsp;s.run("hh help.chm");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&lt;/script&gt;<BR>不过,在IE中如果采用默认的安全级别ActiveXObject("wscript.shell");</P>
<P>创建失败,若想成功必须将安全级别设置为低</P>
<P>&nbsp;</P>
<P>哈哈,累啊!不过还好了,学了点东西!</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/779940820072152757640</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/779940820072152757640</guid>
    <pubDate>Thu, 1 Mar 2007 17:27:57 +0800</pubDate>
    <dcterms:modified>2007-03-01T17:27:57+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Java经典老贴]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/77994082007125101846890</link>
    <description><![CDATA[<div><P >Java经典老贴</P>
<P ><FONT color=red>问题一：我声明了什么</FONT><BR>String s = "Hello world!" <BR>许多人都做过这样的事情，但是，我们到底声明了什么？回答通常是：一个String，内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答，一半的人大概会回答错误。这个语句声明的是一个指向对象的引用，名为“s”，可以指向类型为String的任何对象，目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象，我们只是声明了一个只能指向String对象的引用变量。所以，如果在刚才那句语句后面，如果再运行一句：<BR>String string = s;<BR>我们是声明了另外一个只能指向String对象的引用，名为string，并没有第二个对象产生，string还是指向原来那个对象，也就是，和s指向同一个对象。<BR><FONT color=red>问题二："=="和equals方法究竟有什么区别？</FONT><BR>==操作符专门用来比较变量的值是否相等。比较好理解的一点是：<BR>int a=10;<BR>int b=10;<BR>则a==b将是true。<BR>但不好理解的地方是：<BR>String a=new String("foo");<BR>String b=new String("foo");<BR>则a==b将返回false。<BR>根据前一帖说过，对象变量其实是一个引用，它们的值是指向对象所在的内存地址，而不是对象本身。a和b都使用了new操作符，意味着将在内存中产生两个内容为"foo"的字符串，既然是“两个”，它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值，所以使用"=="操作符，结果会是false。诚然，a和b所指的对象，它们的内容都是"foo"，应该是“相等”，但是==操作符并不涉及到对象内容的比较。对象内容的比较，正是equals方法做的事。<BR>看一下Object对象的equals方法是如何实现的：<BR>boolean equals(Object o){<BR>return this==o;<BR>}<BR>Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法，那你的类使用equals和使用==会得到同样的结果。同样也可以看出，Object的equals方法没有达到equals方法应该达到的目标：比较两个对象内容是否相等。因为答案应该由类的创建者决定，所以Object把这个任务留给了类的创建者。<BR>看一下一个极端的类：<BR>Class Monster{<BR>private String content;<BR>...<BR>boolean equals(Object another){ return true;}<BR><BR>}<BR>我覆盖了equals方法。这个实现会导致无论Monster实例内容如何，它们之间的比较永远返回true。<BR>所以当你是用equals方法判断对象的内容是否相等，请不要想当然。因为可能你认为相等，而这个类的作者不这样认为，而类的equals方法的实现是由他掌握的。如果你需要使用equals方法，或者使用任何基于散列码的集合（HashSet,HashMap,HashTable），请察看一下java doc以确认这个类的equals逻辑是如何实现的。<BR><FONT color=red>问题三：String到底变了没有？</FONT><BR>没有。因为String被设计成不可变(immutable)类，所以它的所有对象都是不可变对象。请看下列代码：<BR>String s = "Hello";<BR>s = s + " world!";<BR>s所指向的对象是否改变了呢？从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中，s原先指向一个String对象，内容是"Hello"，然后我们对s进行了+操作，那么s所指向的那个对象是否发生了改变呢？答案是没有。这时，s不指向原来那个对象了，而指向了另一个String对象，内容为"Hello world!"，原来那个对象还存在于内存之中，只是s这个引用变量不再指向它了。<BR>通过上面的说明，我们很容易导出另一个结论，如果经常对字符串进行各种各样的修改，或者说，不可预见的修改，那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变，所以对于每一个不同的字符串，都需要一个String对象来表示。这时，应该考虑使用StringBuffer类，它允许修改，而不是每个不同的字符串都要生成一个新的对象。并且，这两种类的对象转换十分容易。同时，我们还可以知道，如果要使用内容相同的字符串，不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化，把它设置为初始值，应当这样做：<BR>public class Demo {<BR>private String s;<BR>...<BR>public Demo {<BR>s = "Initial Value";<BR>}<BR>...<BR>}<BR>而非<BR>s = new String("Initial Value");<BR>后者每次都会调用构造器，生成新对象，性能低下且内存开销大，并且没有意义，因为String对象不可改变，所以对于内容相同的字符串，只要一个String对象来表示就可以了。也就说，多次调用上面的构造器创建多个对象，他们的String类型属性s都指向同一个对象。<BR>上面的结论还基于这样一个事实：对于字符串常量，如果内容相同，Java认为它们代表同一个String对象。而用关键字new调用构造器，总是会创建一个新的对象，无论内容是否相同。<BR>至于为什么要把String类设计成不可变类，是它的用途决定的。其实不只String，很多Java标准类库中的类都是不可变的。在开发一个系统的时候，我们有时候也需要设计不可变类，来传递一组相关的值，这也是面向对象思想的体现。不可变类有一些优点，比如因为它的对象是只读的，所以多线程并发访问也不会有任何问题。当然也有一些缺点，比如每个不同的状态都要一个对象来代表，可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本，即StringBuffer。<BR><FONT color=red>问题四：final关键字到底修饰了什么？</FONT><BR>final使得被修饰的变量"不变"，但是由于对象型变量的本质是“引用”，使得“不变”也有了两种含义：<BR>引用本身的不变，和引用指向的对象不变。<BR>引用本身的不变：<BR>final StringBuffer a=new StringBuffer("immutable");<BR>final StringBuffer b=new StringBuffer("not immutable");<BR>a=b;//编译期错误<BR>引用指向的对象不变：<BR>final StringBuffer a=new StringBuffer("immutable");<BR>a.append(" broken!"); //编译通过<BR>可见，final只对引用的“值”(也即它所指向的那个对象的内存地址)有效，它迫使引用只能指向初始指向的那个对象，改变它的指向会导致编译期错误。至于它所指向的对象的变化，final是不负责的。这很类似==操作符：==操作符只负责引用的“值”相等，至于这个地址所指向的对象内容是否相等，==操作符是不管的。<BR>理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象，不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改，一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final，意图使得它“永远不变”。其实那是徒劳的。<BR><FONT color=red>问题五：到底要怎么样初始化！</FONT><BR>本问题讨论变量的初始化，所以先来看一下Java中有哪些种类的变量。<BR>1. 类的属性，或者叫值域<BR>2. 方法里的局部变量<BR>3. 方法的参数<BR>对于第一种变量，Java虚拟机会自动进行初始化。如果给出了初始值，则初始化为该初始值。如果没有给出，则把它初始化为该类型变量的默认初始值。<BR>int类型变量默认初始值为0<BR>float类型变量默认初始值为0.0f<BR>double类型变量默认初始值为0.0<BR>boolean类型变量默认初始值为false<BR>char类型变量默认初始值为0(ASCII码)<BR>long类型变量默认初始值为0<BR>所有对象引用类型变量默认初始值为null，即不指向任何对象。注意数组本身也是对象，所以没有初始化的数组引用在自动初始化后其值也是null。<BR>对于两种不同的类属性，static属性与instance属性，初始化的时机是不同的。instance属性在创建实例的时候初始化，static属性在类加载，也就是第一次用到这个类的时候初始化，对于后来的实例的创建，不再次进行初始化。这个问题会在以后的系列中进行详细讨论。<BR>对于第二种变量，必须明确地进行初始化。如果再没有初始化之前就试图使用它，编译器会抗议。如果初始化的语句在try块中或if块中，也必须要让它在第一次使用前一定能够得到赋值。也就是说，把初始化语句放在只有if块的条件判断语句中编译器也会抗议，因为执行的时候可能不符合if后面的判断条件，如此一来初始化语句就不会被执行了，这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句，就可以通过编译，因为无论如何，总有至少一条初始化语句会被执行，不会发生使用前未被初始化的事情。对于try-catch也是一样，如果只有在try块里才有初始化语句，编译部通过。如果在catch或finally里也有，则可以通过编译。总之，要保证局部变量在使用之前一定被初始化了。所以，一个好的做法是在声明他们的时候就初始化他们，如果不知道要出事化成什么值好，就用上面的默认值吧！<BR>其实第三种变量和第二种本质上是一样的，都是方法中的局部变量。只不过作为参数，肯定是被初始化过的，传入的值就是初始值，所以不需要初始化。<BR><FONT color=red>问题六：instanceof是什么东东？</FONT><BR>instanceof是Java的一个二元操作符，和==，&gt;，&lt;是同一类东东。由于它是由字母组成的，所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例，返回boolean类型的数据。举个例子：<BR>String s = "I AM an Object!";<BR>boolean isObject = s instanceof Object;<BR>我们声明了一个String对象引用，指向一个String对象，然后用instancof来测试它所指向的对象是否是Object类的一个实例，显然，这是真的，所以返回true，也就是isObject的值为True。<BR>instanceof有一些用处。比如我们写了一个处理账单的系统，其中有这样三个类：<BR>public class Bill {//省略细节}<BR>public class PhoneBill extends Bill {//省略细节}<BR>public class GasBill extends Bill {//省略细节}<BR>在处理程序里有一个方法，接受一个Bill类型的对象，计算金额。假设两种账单计算方法不同，而传入的Bill对象可能是两种中的任何一种，所以要用instanceof来判断：<BR>public double calculate(Bill bill) {<BR>if (bill instanceof PhoneBill) {<BR>//计算电话账单<BR>}<BR>if (bill instanceof GasBill) {<BR>//计算燃气账单<BR>}<BR>...<BR>}<BR>这样就可以用一个方法处理两种子类。<BR>然而，这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现，这是面向对象变成应有的做法，避免回到结构化编程模式。只要提供两个名字和返回值都相同，接受参数类型不同的方法就可以了：<BR>public double calculate(PhoneBill bill) {<BR>//计算电话账单<BR>}<BR>public double calculate(GasBill bill) {<BR>//计算燃气账单<BR>}<BR>所以，使用instanceof在绝大多数情况下并不是推荐的做法，应当好好利用多态。</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/77994082007125101846890</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/77994082007125101846890</guid>
    <pubDate>Sun, 25 Feb 2007 10:18:46 +0800</pubDate>
    <dcterms:modified>2007-02-25T10:18:46+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[IO流的一点感受]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/7799408200711532934991</link>
    <description><![CDATA[<div><P>package spring.mvc;</P>
<P>import org.springframework.web.servlet.mvc.Controller;<BR>import org.springframework.web.servlet.ModelAndView;<BR>import javax.servlet.ServletException;<BR>import javax.servlet.http.HttpServletRequest;<BR>import javax.servlet.http.HttpServletResponse;<BR>import javax.xml.transform.TransformerFactory;<BR>import javax.xml.transform.Transformer;<BR>import javax.xml.parsers.DocumentBuilderFactory;<BR>import javax.xml.parsers.DocumentBuilder;<BR>import javax.xml.transform.Source;<BR>import javax.xml.transform.stream.StreamSource;<BR>import javax.xml.transform.stream.StreamResult;<BR>import javax.xml.transform.dom.DOMSource;<BR>import org.w3c.dom.Document;<BR>import java.io.File;<BR>import java.io.InputStream;<BR>import java.io.FileInputStream;<BR>import java.io.BufferedReader;<BR>import java.io.InputStreamReader;<BR>import java.io.StringWriter;<BR>public class SpringappController implements Controller{</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String greeting;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setGreeting(String greeting){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.greeting=greeting;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ModelAndView handleRequest(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response)throws Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(request!=null){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("student",toTransform());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ModelAndView("hello","message",greeting);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String toTransform()throws Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //build a transformerFactory by TransformerFactory</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransformerFactory tFactory=TransformerFactory.newInstance();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //build a DocumentBuilder by DocumentBuilderFactory<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //with your xsl file create a transformer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream fIn=SpringappController.class.getClassLoader().getResourceAsStream("student.xsl");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //File fIn=new File("student.xsl");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dFactory.setNamespaceAware(true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilder builder=dFactory.newDocumentBuilder();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document=builder.parse(fIn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(document);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Source source=new DOMSource(document);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transformer transformer=tFactory.newTransformer(source);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create a source for your xlm file<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create StringWriter to save transform result<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream in=SpringappController.class.getClassLoader().getResourceAsStream("student.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader xmlIn=new BufferedReader(new InputStreamReader(in));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Source xmlSource=new StreamSource(xmlIn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringWriter xmlOut=new StringWriter();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamResult result=new StreamResult(xmlOut);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transformer.transform(xmlSource,result);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return xmlOut.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)throws Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringappController sc=new SpringappController();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s=sc.toTransform();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P>InputStream in=SpringappController.class.getClassLoader().getResourceAsStream("student.xml");</P>
<P>in确切的类型是BufferedInputStream也就是包装过的字节流.在此程序中有必要把它转换为字符流.</P>
<P>通过桥转换InputStreamReader.还有一点值得注意的是,我在命令行中没有用SpringappController.class.getClassLoader().getResourceAsStream("student.xml");获得流对象,而只是直接的NEW,程序可以运行.可是我把他放在WEB应用下(TOMCAT4.1,JDK1.4)下则报错,说是找不到文件.</P>
<P>java.io.FileNotFoundException: C:\Documents and Settings\njeoms\student.xsl (系统找不到指定的文件。)从报错的内容来看,似乎TOMCAT默认去到user.home中寻找文件.</P>
<P>哈哈,现在发现自己真的成长了,解决问题的能力强了,努力中!!<BR></P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/7799408200711532934991</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/7799408200711532934991</guid>
    <pubDate>Thu, 15 Feb 2007 15:29:34 +0800</pubDate>
    <dcterms:modified>2007-02-15T15:31:19+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[JAXP解析XSL]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/77994082007115127212</link>
    <description><![CDATA[<div><P>student.xml</P>
<P>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;?xml-stylesheet href="student.xsl" type="text/xsl"?&gt;<BR>&lt;class&gt;<BR>&lt;student&gt;<BR>&lt;name&gt;lprince&lt;/name&gt;<BR>&lt;age&gt;23&lt;/age&gt;<BR>&lt;school&gt;南京大学&lt;/school&gt;<BR>&lt;/student&gt;</P>
<P>&lt;student&gt;<BR>&lt;name&gt;ifloveher&lt;/name&gt;<BR>&lt;age&gt;22&lt;/age&gt;<BR>&lt;school&gt;北京大学&lt;/school&gt;<BR>&lt;/student&gt;</P>
<P>&lt;student&gt;<BR>&lt;name&gt;chenll&lt;/name&gt;<BR>&lt;age&gt;21&lt;/age&gt;<BR>&lt;school&gt;天津大学&lt;/school&gt;<BR>&lt;/student&gt;</P>
<P>&lt;student&gt;<BR>&lt;name&gt;&lt;/name&gt;<BR>&lt;age&gt;&lt;/age&gt;<BR>&lt;school&gt;&lt;/school&gt;<BR>&lt;/student&gt;<BR>&lt;error&gt;<BR>&nbsp;&lt;name&gt;RuntimeException&lt;/name&gt;<BR>&nbsp;&lt;value&gt;no handed exception!&lt;/value&gt;<BR>&lt;/error&gt;<BR>&lt;/class&gt;</P>
<P>student.xsl</P>
<P style="TEXT-INDENT: 2em">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:stylesheet xmlns:xsl="<A href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</A>" version="1.0"&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:template match="/"&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;html&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;h1&gt;&lt;/h1&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;table align="center"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;tr bgcolor="#cccccc"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;Age&lt;/td&gt;&lt;td&gt;School&lt;/td&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;/tr&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:for-each select="/class/student"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;tr&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;xsl:copy&gt;&lt;xsl:value-of select="name"/&gt;&lt;/xsl:copy&gt;&lt;/td&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;xsl:value-of select="age"/&gt;&lt;/td&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;xsl:value-of select="school"/&gt;&lt;/td&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;/tr&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:for-each&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;tr&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:for-each select="class/error"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;td colspan="3"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;xsl:apply-templates/&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;/td&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:for-each&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;/tr&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;tr&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;td colspan="3"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;xsl:apply-templates select="class/error"/&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&lt;/td&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&lt;/tr&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/table&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/html&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:template&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:template match="//name"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;xsl:copy&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;xsl:value-of select="."/&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;/xsl:copy&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:template&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:template match="//value"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value:&lt;xsl:value-of select="."/&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:template&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;xsl:template match="//error"&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;xsl:value-of select="name"/&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&lt;xsl:value-of select="value"/&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:template&gt;</P>
<P style="TEXT-INDENT: 2em">&lt;/xsl:stylesheet&gt;</P>
<P style="TEXT-INDENT: 2em">解析程序(在SPRINGMVC中加的,因为先前在学习SPRINGMVC)
</P><P style="TEXT-INDENT: 2em">package spring.mvc;
</P><P style="TEXT-INDENT: 2em">import org.springframework.web.servlet.mvc.Controller;<BR>import org.springframework.web.servlet.ModelAndView;<BR>import javax.servlet.ServletException;<BR>import javax.servlet.http.HttpServletRequest;<BR>import javax.servlet.http.HttpServletResponse;<BR>import javax.xml.transform.TransformerFactory;<BR>import javax.xml.transform.Transformer;<BR>import javax.xml.parsers.DocumentBuilderFactory;<BR>import javax.xml.parsers.DocumentBuilder;<BR>import javax.xml.transform.Source;<BR>import javax.xml.transform.stream.StreamSource;<BR>import javax.xml.transform.stream.StreamResult;<BR>import javax.xml.transform.dom.DOMSource;<BR>import org.w3c.dom.Document;<BR>import java.io.File;<BR>import java.io.FileInputStream;<BR>import java.io.BufferedReader;<BR>import java.io.InputStreamReader;<BR>import java.io.StringWriter;<BR>public class SpringappController implements Controller{
</P><P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String greeting;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setGreeting(String greeting){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.greeting=greeting;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ModelAndView handleRequest(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response)throws Exception{
</P><P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ModelAndView("hello","message",greeting);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String toTransform()throws Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //build a transformer by TransformerFactory
</P><P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransformerFactory tFactory=TransformerFactory.newInstance();
</P><P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //build a DocumentBuilder from DocumentBuilderFactory<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //with your xsl file create a transformer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file=new File("student.xsl");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dFactory.setNamespaceAware(true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilder builder=dFactory.newDocumentBuilder();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document=builder.parse(file);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Source source=new DOMSource(document);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transformer transformer=tFactory.newTransformer(source);
</P><P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create a source for your xlm file<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream("student.xml")));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Source xmlSource=new StreamSource(in);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringWriter xmlOut=new StringWriter();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamResult result=new StreamResult(xmlOut);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transformer.transform(xmlSource,result);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return xmlOut.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)throws Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringappController sc=new SpringappController();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s=sc.toTransform();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>}
</P><P style="TEXT-INDENT: 2em">先前我是用记事本编辑的,用IE能正常打开,不过用程序解析不行.
</P><P style="TEXT-INDENT: 2em">抛以下异常:
</P><P style="TEXT-INDENT: 2em">错误：“Content is not allowed in prolog.”<BR>&nbsp;&nbsp; 错误：“com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.”<BR>Exception in thread "main" javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.ap<BR>ache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at spring.mvc.SpringappController.toTransform(SpringappController.java:53)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at spring.mvc.SpringappController.main(SpringappController.java:58)<BR>Caused by: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content i<BR>s not allowed in prolog.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getDOM(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... 4 more<BR>Caused by: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager.getDTM(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager.getDTM(Unknown Source)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... 5 more
</P><P style="TEXT-INDENT: 2em">呵呵,在百度搜索了一下,大体知道了:是因为编写工具的原因.
</P><P style="TEXT-INDENT: 2em">我换成写字板保存一下,果然成功了,呵呵,开心!只是有点惊喜,因为是刚开始一边看API一边学习JAXP,没想到那么顺利,呵呵,努力中!</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/77994082007115127212</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/77994082007115127212</guid>
    <pubDate>Thu, 15 Feb 2007 13:27:21 +0800</pubDate>
    <dcterms:modified>2007-02-15T13:27:21+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[jaxp(jdk1.4)]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/7799408200711441433245</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em"><A href="http://blog.donews.com/lizongbo/archive/2005/06/08/418679.aspx">在JDK1.4中使用JAXP1.3</A></P>
<P style="TEXT-INDENT: 2em">在JDK1.4中使用JAXP1.3</P>
<P style="TEXT-INDENT: 2em">由于JDK1.5以上已经自带jaxp了，而jdk1.4以下版本需要自己添加jaxp库文件。</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">1。下载</P>
<P style="TEXT-INDENT: 2em">因为jwsdp-1.5中带的jaxp是1.26版本，因此需要单独重新下载jaxp</P>
<P style="TEXT-INDENT: 2em"><A href="https://jaxp.dev.java.net/files/documents/913/7831/JAXP_RI_20041025.class">https://jaxp.dev.java.net/files/documents/913/7831/JAXP_RI_20041025.class</A></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">参考：</P>
<P style="TEXT-INDENT: 2em"><A href="https://jaxp.dev.java.net/">https://jaxp.dev.java.net</A></P>
<P style="TEXT-INDENT: 2em"><A href="http://java.sun.com/xml/jaxp/index.jsp">http://java.sun.com/xml/jaxp/index.jsp</A></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">2.安装:</P>
<P style="TEXT-INDENT: 2em">JAXP_RI_20041025.class所在的目录下,进入命令行，</P>
<P style="TEXT-INDENT: 2em">运行：java -cp . JAXP_RI_20041025</P>
<P style="TEXT-INDENT: 2em">然后屏幕上列出所有解压出来的文件名字。</P>
<P style="TEXT-INDENT: 2em">此时，在当前目录下会有一个叫jaxp-1_3的目录，里面有jaxp的jar文件和api文档。</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">3.jaxp需要用到的jar为(都在jaxp-1_3目录下)：</P>
<P style="TEXT-INDENT: 2em">dom.jar,jaxp-api.jar,sax.jar,xalan.jar,xercesImpl.jar</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">4.接下来就可以根据自己需要来使用jaxp1.3了</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">5.由于sun默认使用的解析器是经过其包装后的(基于Xerces version 2.6.0 和 XSLTC version 2.5.2),比如：</P>
<P style="TEXT-INDENT: 2em">com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl(可查看javax.xml.parsers.SAXParserFactory 的源代码),</P>
<P style="TEXT-INDENT: 2em">com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl(可查看javax.xml.transform.TransformerFactory 的源代码).</P>
<P style="TEXT-INDENT: 2em">因此在需要使用其它解析器的时候，需要通过设置系统属性值的方式，</P>
<P style="TEXT-INDENT: 2em">或者在$java.home/lib/jaxp.properties进行配置($java.home为System.getProperty("java.home")所得到的路径，具体可以查看javax.xml.parsers.FactoryFinder源代码中的 static Object find(String factoryId, String fallbackClassName) 方法)来选择具体的解析器实现。</P>
<P style="TEXT-INDENT: 2em">jaxp.properties中支持以下属性.</P>
<P style="TEXT-INDENT: 2em">示例文件如下(实际就是jaxp的默认值)：</P>
<P style="TEXT-INDENT: 2em">javax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl</P>
<P style="TEXT-INDENT: 2em">javax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl </P>
<P style="TEXT-INDENT: 2em">javax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl</P>
<P style="TEXT-INDENT: 2em">假如需要使用apache的解析器，那么如下操作 。</P>
<P style="TEXT-INDENT: 2em">a.下载<A href="http://www.apache.org/dist/xml/xerces-j/Xerces-J-bin.2.6.2.zip">http://www.apache.org/dist/xml/xerces-j/Xerces-J-bin.2.6.2.zip</A></P>
<P style="TEXT-INDENT: 2em"><A href="http://www.eu.apache.org/dist/xml/xalan-j/binaries/xalan-j_2_6_0-bin.zip">http://www.eu.apache.org/dist/xml/xalan-j/binaries/xalan-j_2_6_0-bin.zip</A></P>
<P style="TEXT-INDENT: 2em">(均为当前最新版本)</P>
<P style="TEXT-INDENT: 2em">b.解压获得相应的jar文件,放入classpath中。</P>
<P style="TEXT-INDENT: 2em">3.配置jaxp.properties为：</P>
<P style="TEXT-INDENT: 2em">javax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl</P>
<P style="TEXT-INDENT: 2em">#也可以使用</P>
<P style="TEXT-INDENT: 2em">#javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl</P>
<P style="TEXT-INDENT: 2em">javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl</P>
<P style="TEXT-INDENT: 2em">javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl </P>
<P style="TEXT-INDENT: 2em">javax.xml.datatype.DatatypeFactory=org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImp</P>
<P style="TEXT-INDENT: 2em">&nbsp;6.需要关于jaxp的调试信息，设置系统属性jaxp.debug为1即可</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp; System.setProperty("jaxp.debug","1");</P>
<P style="TEXT-INDENT: 2em">或者运行时的命令为： java -Djaxp.debug=1 com.lizongbo.TestJAXP</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/7799408200711441433245</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/7799408200711441433245</guid>
    <pubDate>Wed, 14 Feb 2007 16:14:33 +0800</pubDate>
    <dcterms:modified>2007-02-14T16:14:33+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[学习心得]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/7799408200711210211338</link>
    <description><![CDATA[<div><P>在Tomcat5.0.28运行SPRINGMVC可以直接用SPRING.JAR(SPRING-1.2.8),值得注意的是如果你单独一个一个放,必须包括SPRING-WEB.JAR文件.</P>
<P>从Tomcat5.5中把STRUTS.JAR放入TOMCAT5.0中,并不能运行STRUTS.将TOMCAT5.5中的所有JAR复制到TOMCAT5.0中</P></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/7799408200711210211338</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/7799408200711210211338</guid>
    <pubDate>Mon, 12 Feb 2007 10:02:11 +0800</pubDate>
    <dcterms:modified>2007-02-12T10:02:11+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[JS]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/77994082007164728342</link>
    <description><![CDATA[<div>按钮实现链接：<br>&lt;imput type="button" value="push" yourpage url\""&gt;<br><br></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/77994082007164728342</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/77994082007164728342</guid>
    <pubDate>Tue, 6 Feb 2007 16:07:28 +0800</pubDate>
    <dcterms:modified>2007-02-06T16:07:28+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[在Java中获取系统属性]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/779940820071510576825</link>
    <description><![CDATA[<div><table align="center" width="680">
<tbody>
<tr>
<td align="center">
<h2><font color="#0f3ccd">在Java中获取系统属性</font></h2><br><b>大庆油田有限责任公司 苏洋</b> 
</td></tr><tr>
<td align="right">01-5-22 上午 11:12:51<br>
<hr color="#f46240" size="1" width="660">
</td></tr></tbody></table><br>
<table align="center" width="620">
<tbody>
<tr>
<td>Java语言以其面向对象、跨平台、可移植性好、安全性高等优点，受到众多编程人员的青睐，越来越多的人将其作为应用软件开发语言的首选。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>在Java应用程序运行时，特别是需要在跨平台工作环境下运行时，需要确定操作系统类型、用户JDK版本和用户工作目录等随工作平台变化的信息，来保证程序正确运行。一般情况下，可以利用JDK提供的系统属性类（Properties）中的方法，快速地获取工作环境信息。另外，程序开发人员还可以定义与应用程序相关的系统属性文件，在用户程序执行过程中动态地加载程序员定义的属性文件来控制程序运行。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>本文通过对系统属性类的分析，结合实际例子介绍如何定义系统属性文件，并讨论安全策略文件的定义。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td><b>属性类</b></td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Java Properties类的继承关系如下：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>java.lang.Object</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>&#58853;＋－－java.util.Dictionary</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>&#58853;&#58853;&#58853;&#58853;＋－－java.util.Hashtable</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>&#58853;&#58853;&#58853;&#58853;&#58853;&#58853;&#58853;＋－－java.util.Properties</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>在应用程序开始执行时，程序首先读取系统的默认属性。如果定义了用户属性文件，则应用程序加载该属性文件。程序运行过程中可以根据执行情况动态地修改属性定义，并在程序结束运行前，保存属性文件。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>获取属性的方法：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●contains(Object value)、containsKey(Object 
key)：如果给定的参数或属性关键字在属性表中有定义，该方法返回True，否则返回False；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●getProperty(String key)、getProperty(String key, String 
default)：根据给定的属性关键字获取关键字值；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●list(PrintStream s)、list(PrintWriter w)： 在输出流中输出属性表内容；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●size()：返回当前属性表中定义的属性关键字个数。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>设置属性的方法：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●put(Object key, Object value) ：向属性表中追加属性关键字和关键字的值；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●remove(Object key) ：从属性表中删除关键字。</td></tr></tbody></table>
<table align="center" height="21" width="620">
<tbody>
<tr>
<td height="17"><b>获取系统属性</b></td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>系统属性是指与用户程序相关的操作系统配置信息以及软件信息。通常与用户程序相关的属性关键字包括：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●file.separator : 文件分隔符， Windows环境下为“\"，Unix环境下为“/”；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●user.home ：用户主目录；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●java.home ：Java实时运行环境的安装目录；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●java.ext.dirs ：JDK的安装目录；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●os.name ：操作系统名称；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●user.name ：用户登录名称；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●os.version ：操作系统版本；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●path.separator ：当前操作系统的路径分隔符；</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>●user.dir ：当前用户程序所在目录。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>下面结合例子说明获取系统属性的方法。</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>/＊getSystemProperties.java＊/</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>import java.util.Properties; </td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>public class getSystemProperties</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>public static void main(String args[])</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{ </td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//通过获得系统属性构造属性类 prop</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Properties prop = new Properties( </td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>System.getProperties() );</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//在标准输出中输出系统属性的内容</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>prop.list(System.out);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//根据获取的系统属性确定程序执行流程</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>……</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>上述程序执行后，在Windows环境中产生类似如下的输出：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>user.home=C:\WIN95</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>java.home=D:\JDK1.2\JRE</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>java.ext.dirs=D:\JDK1.2</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>os.name=Windows 95</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>user.name=Office</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>java.vm.name=Classic VM</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>os.version=4.10</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>path.separator=;</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>file.separator=\</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>user.dir=D:\JavaTest</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td><b>属性文件的操作方法</b></td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Java程序开发人员可以通过定义属性文件来设置程序运行的参数。属性文件是程序外部文件，在应用程序初始运行时，可以通过读取属性文件来获取有关程序运行的参数。例如，在程序运行时需要在程序外部控制程序的执行流程，这时可以通过定义属性文件的方法达到目的。下面结合例子说明属性文件的操作方法：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>/＊PropertyFile.java＊/</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//引入相关类</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>import java.io.＊;</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>import java.util.Properties;</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>public class PropertyFile</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//定义文件输入和输出流</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>static FileInputStream fis;</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>static FileOutputStream fos;</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>public static void main(String args[])</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{ </td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//生成新的属性对象</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Properties prop = new Properties();</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>try</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{ </td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//生成文件输入和输出流，输入流指向用户已经定义的属性文件，输出流指向由应用程序新定义的属性文件</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>fis = new FileInputStream</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>(“firstProp.txt”);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>fos = new FileOutputStream</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>(“secondProp.txt”);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>catch(FileNotFoundException e)</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>System.out.println(“Cannot create the file stream”);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>try</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//从输入文件加载系统属性</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>prop.load(fis);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//根据程序执行情况更改属性关键字的值</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>prop.put(“Switch”,“1”);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>//输出新属性文件secondProp.txt</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>prop .save ( fos ,“－－ a new properties file－”);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>catch(IOException e)</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>{</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>System.out.println(“Exception in repleace the 
keyword”);</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>}</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>在程序执行之前，用户必须首先定义属性文件firstProp.txt，该文件内容如下：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Switch= 0</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Version= 1.0</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Directory= JavaTest</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>程序运行后，输出新的属性文件secondProp.txt，该文件内容如下（注意观察两个文件关键字Switch内容的区别）：</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>＃－－a new properties file－－</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>＃Sun Mar 11 21:22:40 CST 2001</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Switch= 1</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Version= 1.0</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>Directory= JavaTest</td></tr></tbody></table>
<table align="center" width="620">
<tbody>
<tr>
<td>从上例可以看出，通过JDK提供的属性类Properties可以方便地在程序外部对应用程序的执行流程进行控制，从而简化了编程难度，使程序流程可控性更好</td></tr></tbody></table></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/779940820071510576825</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/779940820071510576825</guid>
    <pubDate>Mon, 5 Feb 2007 10:57:06 +0800</pubDate>
    <dcterms:modified>2007-02-05T10:57:06+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Java类装载体系中的隔离性 ]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/779940820071510857441</link>
    <description><![CDATA[<div><div >
<p align="center">作者：<a href="http://gceclub.sun.com.cn/yuanchuang/week-9/classloader.html#author">盛戈歆</a></p><a ></a>
<p><b>作者简介</b></p>
<p >盛戈歆，软件工程师，你可以通过<a href="mailto:shenggexin@topwaver.com">shenggexin@topwaver.com</a>与他联系。</p>
<p><b>正文</b></p>
<p >Java中类的查找与装载出现的问题总是会时不时出现在Java程序员面前，这并不是什么丢脸的事情，相信没有一个 
Java程序员没遇到过ClassNotException,因此不要为被人瞅见自己也犯这样的错误而觉得不自然，但是在如果出现了 
ClassNotFoundException后异常后一脸的茫然，那我想你该了解一下java的类装载的体制了，同时为了进行下面的关于类装载器之间的隔离性的讨论，我们先简单介绍一下类装载的体系结构。</p>
<p><b>1. Java类装载体系结构</b></p>
<p >装载类的过程非常简单：查找类所在位置，并将找到的Java类的字节码装入内存，生成对应的Class对象。 
Java的类装载器专门用来实现这样的过程，JVM并不止有一个类装载器，事实上，如果你愿意的话，你可以让JVM拥有无数个类装载器，当然这除了测试 
JVM外，我想不出还有其他的用途。你应该已经发现到了这样一个问题，类装载器自身也是一个类，它也需要被装载到内存中来，那么这些类装载器由谁来装载呢，总得有个根吧？没错，确实存在这样的根，它就是神龙见首不见尾的Bootstrap 
ClassLoader. 
为什么说它神龙见首不见尾呢，因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴，尽管你能时时刻刻体会到它的存在，因为java的运行环境所需要的所有类库，都由它来装载，而它本身是C++写的程序，可以独立运行,可以说是JVM的运行起点,伟大吧。在Bootstrap完成它的任务后，会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader，它用于装载Java运行环境扩展包中的类),这个类装载器才是我们经常使用的，可以调用ClassLoader.getSystemClassLoader() 
来获得，我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器，那么我们编写的所有java类通通会由它来装载，值得尊敬吧。 
AppClassLoader查找类的区域就是耳熟能详的Classpath，也是初学者必须跨过的门槛，有没有灵光一闪的感觉，我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况，当Java中出现新的类，AppClassLoader首先在类传递给它的父类类装载器，也就是 
Extion ClassLoader，询问它是否能够装载该类，如果能，那AppClassLoader就不干这活了，同样Extion 
ClassLoader在装载时，也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图，每个类装载器有自己的父亲，类装载器在装载类时，总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时，自己就会动手装载，如果它也装载不了，那么对不起，它会大喊一声： 
Exception，class not 
found。有必要提一句，当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类，如果你不去刻意改变，那么抛出的是 
ClassNotFoundException。</p>
<p >我们简短总结一下上面的讨论：</p>
<p >1.JVM类装载器的体系结构可以看作是树状结构。</p>
<p >2.父类装载器优先装载。在父类装载器装载失败的情况下再装载，如果都装载失败则抛出ClassNotFoundException或者NoClassDefFoundError异常。</p>
<p >那么我们的类在什么情况下被装载的呢？</p><b>2. 类如何被装载</b> 
<p >在java2中，JVM是如何装载类的呢，可以分为两种类型，一种是隐式的类装载，一种式显式的类装载。</p><b>2.1 
隐式的类装载</b> 
<p >隐式的类装载是编码中最常用得方式：</p><pre><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">A&nbsp;b&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;A();</span></div><br></pre>
<p >如果程序运行到这段代码时还没有A类，那么JVM会请求装载当前类的类装器来装载类。问题来了，我把代码弄得复杂一点点，但依旧没有任何难度，请思考JVM得装载次序：</p><pre><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;test;<br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">Public&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;A{<br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String&nbsp;args[]){<br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;b&nbsp;＝&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;B();<br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">}<br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;B{C&nbsp;c;}<br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;C{}</span></div><br></pre>
<p >揭晓答案，类装载的次序为A-&gt;B，而类C根本不会被JVM理会,先不要惊讶，仔细想想，这不正是我们最需要得到的结果。我们仔细了解一下JVM装载顺序。当使用Java 
A命令运行A类时，JVM会首先要求类路径类装载器(AppClassLoader)装载A类，但是这时只装载A，不会装载A中出现的其他类(B类)，接着它会调用A中的main函数，直到运行语句b 
＝ new 
B()时，JVM发现必须装载B类程序才能继续运行，于是类路径类装载器会去装载B类，虽然我们可以看到B中有有C类的声明，但是并不是实际的执行语句，所以并不去装载C类，也就是说JVM按照运行时的有效执行语句，来决定是否需要装载新类，从而装载尽可能少的类，这一点和编译类是不相同的。</p>
<p><b>2.2 显式的类装载</b></p>
<p >使用显示的类装载方法很多，我们都装载类test.A为例。</p>
<p >使用Class类的forName方法。它可以指定装载器，也可以使用装载当前类的装载器。例如：</p><pre><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Class.forName(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test.A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);</span></div><br>它的效果和<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Class.forName(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test.A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getClass().getClassLoader());</span></div><br>是一样的。<br></pre>
<p >使用类路径类装载装载.</p><pre><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">ClassLoader.getSystemClassLoader().loadClass(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test.A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);</span></div><br></pre>
<p >使用当前进程上下文的使用的类装载器进行装载，这种装载类的方法常常被有着复杂类装载体系结构的系统所使用。</p><pre><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Thread.currentThread().getContextClassLoader().loadClass(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test.A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)</span></div><br></pre>
<p >使用自定义的类装载器装载类</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;URLClassLoader{<br></span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader()&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;URL[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);<br></span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">}<br></span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">MyClassLoader&nbsp;myClassLoader&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader();<br></span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">myClassLoader.loadClass(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test.A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);</span></div>
<p >MyClassLoader继承了URLClassLoader类，这是JDK核心包中的类装载器，在没有指定父类装载器的情况下，类路径类装载器就是它的父类装载器，MyClassLoader并没有增加类的查找范围，因此它和类路径装载器有相同的效果。</p>
<p >我们已经知道Java的类装载器体系结构为树状，多个类装载器可以指定同一个类装载器作为自己的父类，每个子类装载器就是树状结构的一个分支，当然它们又可以个有子类装载器类装载器，类装载器也可以没有父类装载器，这时Bootstrap类装载器将作为它的隐含父类，实际上Bootstrap类装载器是所有类装载器的祖先，也是树状结构的根。这种树状体系结构，以及父类装载器优先的机制，为我们编写自定义的类装载器提供了便利，同时可以让程序按照我们希望的方式进行类的装载。例如某个程序的类装载器体系结构图如下：</p>
<p align="center"><img alt="" src="http://gceclub.sun.com.cn/yuanchuang/week-9/classloader.gif" border="0" height="287" width="427"></p>
<p align="center">图2：某个程序的类装载器的结构</p>
<p >解释一下上面的图，ClassLoaderA为自定义的类装载器，它的父类装载器为类路径装载器，它有两个子类装载器ClassLoaderAA和ClassLaderAB，ClassLoaderB为程序使用的另外一个类装载器，它没有父类装载器，但有一个子类装载器ClassLoaderBB。你可能会说，见鬼，我的程序怎么会使用这么复杂的类装载器结构。为了进行下面的讨论，暂且委屈一下。</p>
<p><b>3. 奇怪的隔离性</b></p>
<p >我们不难发现，图2中的类装载器AA和AB， 
AB和BB，AA和B等等位于不同分支下，他们之间没有父子关系，我不知道如何定义这种关系，姑且称他们位于不同分支下。两个位于不同分支的类装载器具有隔离性，这种隔离性使得在分别使用它们装载同一个类，也会在内存中出现两个Class类的实例。因为被具有隔离性的类装载器装载的类不会共享内存空间，使得使用一个类装载器不可能完成的任务变得可以轻而易举，例如类的静态变量可能同时拥有多个值（虽然好像作用不大），因为就算是被装载类的同一静态变量，它们也将被保存不同的内存空间，又例如程序需要使用某些包，但又不希望被程序另外一些包所使用，很简单，编写自定义的类装载器。类装载器的这种隔离性在许多大型的软件应用和服务程序得到了很好的应用。下面是同一个类静态变量为不同值的例子。</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;test;<br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;A&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;)&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">定义两个类装载器</span><span style="color: rgb(0, 128, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClassLoader&nbsp;aa</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader();<br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClassLoader&nbsp;bb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader();<br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">用类装载器aa装载testb.B类</span><span style="color: rgb(0, 128, 0);"><br></span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;clazz</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">aa.loadClass(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">testb.&nbsp;B</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br></span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;constructor</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;<br></span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz.getConstructor(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Class[]{Integer.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">});<br></span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;object&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;<br></span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor.newInstance(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Object[]{</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Integer(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)});<br></span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;<br></span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz.getDeclaredMethod(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">printB</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Class[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);<br></span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">用类装载器bb装载testb.B类</span><span style="color: rgb(0, 128, 0);"><br></span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;clazz2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">bb.loadClass(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">testb.&nbsp;B</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br></span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;constructor2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;<br></span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz2.getConstructor(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Class[]{Integer.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">});<br></span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;object2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;<br></span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor2.newInstance(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Object[]{</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Integer(</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)});<br></span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;<br></span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz2.getDeclaredMethod(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">printB</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Class[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);<br></span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">显示test.B中的静态变量的值&nbsp;</span><span style="color: rgb(0, 128, 0);"><br></span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(&nbsp;object,</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Object[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);<br></span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method2.invoke(&nbsp;object2,</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Object[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);<br></span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br></span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">}<br></span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Class&nbsp;B&nbsp;必须位于MyClassLoader的查找范围内，<br></span><span style="color: rgb(0, 128, 128);">38</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">而不应该在MyClassLoader的父类装载器的查找范围内。</span><span style="color: rgb(0, 128, 0);"><br></span><span style="color: rgb(0, 128, 128);">39</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;testb;<br></span><span style="color: rgb(0, 128, 128);">40</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;B&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;b&nbsp;;<br></span><span style="color: rgb(0, 128, 128);">42</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;B(Integer&nbsp;testb)&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">44</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;testb.intValue();<br></span><span style="color: rgb(0, 128, 128);">45</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">46</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">47</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;printB()&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">48</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">my&nbsp;static&nbsp;field&nbsp;b&nbsp;is&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;b);<br></span><span style="color: rgb(0, 128, 128);">49</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">50</span>&nbsp;<span style="color: rgb(0, 0, 0);">}<br></span><span style="color: rgb(0, 128, 128);">51</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">52</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">53</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;URLClassLoader{<br></span><span style="color: rgb(0, 128, 128);">54</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;File&nbsp;file&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;File(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">c:\\classes&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br></span><span style="color: rgb(0, 128, 128);">55</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">该路径存放着class&nbsp;B，但是没有class&nbsp;A</span><span style="color: rgb(0, 128, 0);"><br></span><span style="color: rgb(0, 128, 128);">56</span>&nbsp;<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">57</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;MyClassLoader()&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">58</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">(getUrl());<br></span><span style="color: rgb(0, 128, 128);">59</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">60</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">61</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;URL[]&nbsp;getUrl()&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">62</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">63</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;URL[]{file.toURL()};<br></span><span style="color: rgb(0, 128, 128);">64</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(&nbsp;MalformedURLException&nbsp;e&nbsp;)&nbsp;{<br></span><span style="color: rgb(0, 128, 128);">65</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;URL[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">];<br></span><span style="color: rgb(0, 128, 128);">66</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">67</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 128);">68</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div><br>程序的运行结果为： <pre>my static field b is 1<br>my static field b is 2<br></pre>
<p >程序的结果非常有意思，从编程者的角度，我们甚至可以把不在同一个分支的类装载器看作不同的java虚拟机，因为它们彼此觉察不到对方的存在。程序在使用具有分支的类装载的体系结构时要非常小心，弄清楚每个类装载器的类查找范围，尽量避免父类装载器和子类装载器的类查找范围中有相同类名的类（包括包名和类名），下面这个例子就是用来说明这种情况可能带来的问题。</p>
<p >假设有相同名字却不同版本的接口 A，</p><pre>版本 1：<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;test;<br>Intefer&nbsp;Same{&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getVersion();&nbsp;}</span></div><br>版本 2：<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Package&nbsp;test;<br>Intefer&nbsp;Same{&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getName();&nbsp;}</span></div><br></pre>
<p >接口A两个版本的实现：</p><pre>版本1的实现<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;test;<br></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Same1Impl&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Same&nbsp;{<br></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getVersion(){&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">A&nbsp;version&nbsp;1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;}<br>}</span></div><br>版本2的实现<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Same&nbsp;2Impl&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Same&nbsp;{<br></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getName(){&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">A&nbsp;version&nbsp;2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;}<br>}</span></div><br></pre>
<p >我们依然使用图2的类装载器结构，首先将版本1的Same和Same的实现类Same1Impl打成包 
same1.jar，将版本2的Same和Same的实现类Same1Impl打成包same2.jar。现在，做这样的事情，把same1.jar放入类装载器ClassLoaderA的类查找范围中，把same2.jar放入类装器ClassLoaderAB的类查找范围中。当你兴冲冲的运行下面这个看似正确的程序。</p>
<p >实际上这个错误的是由父类载器优先装载的机制造成，当类装载器ClassLoaderAB在装载Same2Impl 
类时发现必须装载接口test.Same，于是按规定请求父类装载器装载，父类装载器发现了版本1的test.Same接口并兴冲冲的装载，但是却想不到 
Same2Impl所希望的是版本2 的test.Same，后面的事情可想而知了，异常被抛出。</p>
<p >我们很难责怪Java中暂时并没有提供区分版本的机制，如果使用了比较复杂的类装载器体系结构，在出现了某个包或者类的多个版本时，应特别注意。</p>掌握和灵活运用Java的类装载器的体系结构，对程序的系统设计，程序的实现，已经程序的调试，都有相当大的帮助。希望以上的内容能够对您有所帮助.<br><br>转载自：http://gceclub.sun.com.cn/yuanchuang/week-9/classloader.html<br></div></div>]]></description>
	    <author><![CDATA[l_prince]]></author>
	    <comments>http://blog.163.com/l_prince/blog/static/779940820071510857441</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/l_prince/blog/static/779940820071510857441</guid>
    <pubDate>Mon, 5 Feb 2007 10:08:57 +0800</pubDate>
    <dcterms:modified>2007-02-05T10:08:57+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Informix 中interval]]></title>	
    <link>http://blog.163.com/l_prince/blog/static/779940820071224638644</link>
    <description><![CDATA[<div>Oracle<br>select &nbsp; * &nbsp; from &nbsp; (select &nbsp; * &nbsp; from &nbsp; table_name &nbsp; order &nbsp; by &nbsp; field_date &nbsp; 
desc) &nbsp; t &nbsp; where &nbsp; rownum&lt;=10&nbsp;  <br>Informix<br><span><h4 style="margin-bottom: 0px;">Informix中对于日期的运算备忘</h4><div><div>&nbsp;&nbsp;&nbsp; 日期运算在很多应用中都需要用。但是不同的数据库对于日期的运算也不尽相同。下面是Infomix中日期运算的一些方法：</div><div>&nbsp;&nbsp;&nbsp;&nbsp; 我们经常会需要将一个日期减去几天或几个小时。那么，我们需要用date或datetime和interval作加减运算。例如我们要查最近一个月的所有日志（时间字段为logti