<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>七月</title><link>http://www.mscenter.edu.cn/blog/leo/</link><description /><managingEditor>七月</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>七月</dc:creator><title>InvocationHandler 用于方法拦截</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/10/08/79534.html</link><pubDate>Sun, 08 Oct 2006 07:10:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/10/08/79534.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/79534.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/10/08/79534.html#Feedback</comments><slash:comments>307</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/79534.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/79534.html</trackback:ping><description>&lt;P&gt;&lt;BR&gt;public class LogHandler implements InvocationHandler {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;private Logger logger = Logger.getLogger(this.getClass().getName());&lt;/P&gt;
&lt;P&gt;&amp;nbsp;private Object delegater;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;public Object bind(Object delegater) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;this.delegater = delegater;&lt;BR&gt;&amp;nbsp;&amp;nbsp;return Proxy.newProxyInstance(delegater.getClass().getClassLoader(), delegater.getClass().getInterfaces(), this);&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("log");&lt;BR&gt;&amp;nbsp;&amp;nbsp;Object result = null;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;log("method starts ..." + method);&lt;BR&gt;&amp;nbsp;&amp;nbsp;result = method.invoke(delegater, args);&lt;BR&gt;&amp;nbsp;&amp;nbsp;log("method end ..." + method);&lt;BR&gt;&amp;nbsp;&amp;nbsp;return result;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;private void log(String string) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;logger.log(Level.INFO, string);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;}&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;public class CheckNullHandler implements InvocationHandler {&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;private Object delegater;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;public Object bind(Object delegater) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;this.delegater = delegater;&lt;BR&gt;&amp;nbsp;&amp;nbsp;return Proxy.newProxyInstance(delegater.getClass().getClassLoader(), delegater.getClass().getInterfaces(), this);&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("null point");&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;args.length;i++){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(args[i]==null){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new NullPointerException("arguments is null.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;Object result = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;result =&lt;FONT color=#ff0000&gt; &lt;STRONG&gt;method.invoke(delegater, args); //调用到上面的Handle所以return null，还是做一遍&lt;BR&gt;&amp;nbsp;&amp;nbsp;return null;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;}&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;public class ISayClass implements ISay{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;public void say(String name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("i say :"+name);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;public static void main(String[] args){&lt;BR&gt;&amp;nbsp;&amp;nbsp;LogHandler handler = new LogHandler();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;CheckNullHandler checkHandler = new CheckNullHandler();&lt;BR&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;ISay isay = (ISay) handler.bind(new ISayClass());&lt;BR&gt;&amp;nbsp;&amp;nbsp;isay = (ISay) checkHandler.bind(isay);&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;isay.say("哈哈！！");&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;}&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/79534.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>构造方法</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/09/05/50089.html</link><pubDate>Tue, 05 Sep 2006 10:17:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/09/05/50089.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/50089.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/09/05/50089.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/50089.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/50089.html</trackback:ping><description>构造方法只安全调用基类中final 方法（private方法也是，它们自动赋予final）.这些方法不能被重载&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/50089.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>反射技巧</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/09/05/50043.html</link><pubDate>Tue, 05 Sep 2006 06:08:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/09/05/50043.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/50043.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/09/05/50043.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/50043.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/50043.html</trackback:ping><description>&lt;FONT face=Arial size=2&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Method&amp;nbsp;method2&amp;nbsp;=&amp;nbsp;vv.getDeclaredMethod("hehe",&amp;nbsp;args);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[]&amp;nbsp;sss&amp;nbsp;=&amp;nbsp;{"sssss"};&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method2.setAccessible(true);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method2.invoke(tr,&amp;nbsp;sss);&lt;/P&gt;
&lt;P&gt;method2.setAccessible(true);使得调用该方法时，虚拟机不再检查访问权限，这样就可以在外部调用其私有方法，但是这样做显然破坏了封装性 &lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/50043.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>精妙Sql语句（转）</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/08/09/40433.html</link><pubDate>Wed, 09 Aug 2006 04:10:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/08/09/40433.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/40433.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/08/09/40433.html#Feedback</comments><slash:comments>79</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/40433.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/40433.html</trackback:ping><description>下列语句部分是Mssql语句，不可以在access中使用。&lt;BR&gt;&lt;BR&gt;SQL分类： &lt;BR&gt;DDL&amp;#8212;数据定义语言(CREATE，ALTER，DROP，DECLARE) &lt;BR&gt;DML&amp;#8212;数据操纵语言(SELECT，DELETE，UPDATE，INSERT) &lt;BR&gt;DCL&amp;#8212;数据控制语言(GRANT，REVOKE，COMMIT，ROLLBACK)&lt;BR&gt;&lt;BR&gt;首先,简要介绍基础语句：&lt;BR&gt;1、说明：创建数据库&lt;BR&gt;CREATE DATABASE database-name &lt;BR&gt;2、说明：删除数据库&lt;BR&gt;drop database dbname&lt;BR&gt;3、说明：备份sql server&lt;BR&gt;--- 创建 备份数据的 device&lt;BR&gt;USE master&lt;BR&gt;EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'&lt;BR&gt;--- 开始 备份&lt;BR&gt;BACKUP DATABASE pubs TO testBack &lt;BR&gt;4、说明：创建新表&lt;BR&gt;create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)&lt;BR&gt;根据已有的表创建新表： &lt;BR&gt;A：create table tab_new like tab_old (使用旧表创建新表)&lt;BR&gt;B：create table tab_new as select col1,col2&amp;#8230; from tab_old definition only&lt;BR&gt;5、说明：删除新表drop table tabname &lt;BR&gt;6、说明：增加一个列&lt;BR&gt;Alter table tabname add column col type&lt;BR&gt;注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。&lt;BR&gt;7、说明：添加主键： Alter table tabname add primary key(col) &lt;BR&gt;说明：删除主键： Alter table tabname drop primary key(col) &lt;BR&gt;8、说明：创建索引：create [unique] index idxname on tabname(col&amp;#8230;.) &lt;BR&gt;删除索引：drop index idxname&lt;BR&gt;注：索引是不可更改的，想更改必须删除重新建。&lt;BR&gt;9、说明：创建视图：create view viewname as select statement &lt;BR&gt;删除视图：drop view viewname&lt;BR&gt;10、说明：几个简单的基本的sql语句&lt;BR&gt;选择：select * from table1 where 范围&lt;BR&gt;插入：insert into table1(field1,field2) values(value1,value2)&lt;BR&gt;删除：delete from table1 where 范围&lt;BR&gt;更新：update table1 set field1=value1 where 范围&lt;BR&gt;查找：select * from table1 where field1 like &amp;#8217;%value1%&amp;#8217; ---like的语法很精妙，查资料!&lt;BR&gt;排序：select * from table1 order by field1,field2 [desc]&lt;BR&gt;总数：select count&amp;nbsp;*&amp;nbsp;as totalcount from table1&lt;BR&gt;求和：select sum(field1) as sumvalue from table1&lt;BR&gt;平均：select avg(field1) as avgvalue from table1&lt;BR&gt;最大：select max(field1) as maxvalue from table1&lt;BR&gt;最小：select min(field1) as minvalue from table1&lt;BR&gt;11、说明：几个高级查询运算词&lt;BR&gt;A： UNION 运算符 &lt;BR&gt;UNION 运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 &lt;BR&gt;B： EXCEPT 运算符 &lt;BR&gt;EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 &lt;BR&gt;C： INTERSECT 运算符&lt;BR&gt;INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。 &lt;BR&gt;注：使用运算词的几个查询结果行必须是一致的。 &lt;BR&gt;12、说明：使用外连接 &lt;BR&gt;A、left outer join： &lt;BR&gt;左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。 &lt;BR&gt;SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c&lt;BR&gt;B：right outer join: &lt;BR&gt;右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。 &lt;BR&gt;C：full outer join： &lt;BR&gt;全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。&lt;BR&gt;&lt;BR&gt;其次，大家来看一些不错的sql语句&lt;BR&gt;1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用)&lt;BR&gt;法一：select * into b from a where 1&amp;lt;&amp;gt;1&lt;BR&gt;法二：select top 0 * into b from a&lt;BR&gt;&lt;BR&gt;2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)&lt;BR&gt;insert into b(a, b, c) select d,e,f from b;&lt;BR&gt;&lt;BR&gt;3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)&lt;BR&gt;insert into b(a, b, c) select d,e,f from b in &amp;#8216;具体数据库&amp;#8217; where 条件&lt;BR&gt;例子：..from b in '"&amp;amp;Server.MapPath(".")&amp;amp;"\data.mdb" &amp;amp;"' where..&lt;BR&gt;&lt;BR&gt;4、说明：子查询(表名1：a 表名2：b)&lt;BR&gt;select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)&lt;BR&gt;&lt;BR&gt;5、说明：显示文章、提交人和最后回复时间&lt;BR&gt;select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b&lt;BR&gt;&lt;BR&gt;6、说明：外连接查询(表名1：a 表名2：b)&lt;BR&gt;select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c&lt;BR&gt;&lt;BR&gt;7、说明：在线视图查询(表名1：a )&lt;BR&gt;select * from (SELECT a,b,c FROM a) T where t.a &amp;gt; 1;&lt;BR&gt;&lt;BR&gt;8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括&lt;BR&gt;select * from table1 where time between time1 and time2&lt;BR&gt;select a,b,c, from table1 where a not between 数值1 and 数值2&lt;BR&gt;&lt;BR&gt;9、说明：in 的使用方法&lt;BR&gt;select * from table1 where a [not] in (&amp;#8216;值1&amp;#8217;,&amp;#8217;值2&amp;#8217;,&amp;#8217;值4&amp;#8217;,&amp;#8217;值6&amp;#8217;)&lt;BR&gt;&lt;BR&gt;10、说明：两张关联表，删除主表中已经在副表中没有的信息 &lt;BR&gt;delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )&lt;BR&gt;&lt;BR&gt;11、说明：四表联查问题：&lt;BR&gt;select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....&lt;BR&gt;&lt;BR&gt;12、说明：日程安排提前五分钟提醒 &lt;BR&gt;SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&amp;gt;5&lt;BR&gt;&lt;BR&gt;13、说明：一条sql 语句搞定数据库分页&lt;BR&gt;select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段&lt;BR&gt;&lt;BR&gt;14、说明：前10条记录&lt;BR&gt;select top 10 * form table1 where 范围&lt;BR&gt;&lt;BR&gt;15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)&lt;BR&gt;select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)&lt;BR&gt;&lt;BR&gt;16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表&lt;BR&gt;(select a from tableA ) except (select a from tableB) except (select a from tableC)&lt;BR&gt;&lt;BR&gt;17、说明：随机取出10条数据&lt;BR&gt;select top 10 * from tablename order by newid()&lt;BR&gt;&lt;BR&gt;18、说明：随机选择记录&lt;BR&gt;select newid()&lt;BR&gt;&lt;BR&gt;19、说明：删除重复记录&lt;BR&gt;Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)&lt;BR&gt;&lt;BR&gt;20、说明：列出数据库里所有的表名&lt;BR&gt;select name from sysobjects where type='U' &lt;BR&gt;&lt;BR&gt;21、说明：列出表里的所有的&lt;BR&gt;select name from syscolumns where id=object_id('TableName')&lt;BR&gt;&lt;BR&gt;22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。&lt;BR&gt;select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type&lt;BR&gt;显示结果：&lt;BR&gt;type vender pcs&lt;BR&gt;电脑 A 1&lt;BR&gt;电脑 A 1&lt;BR&gt;光盘 B 2&lt;BR&gt;光盘 A 2&lt;BR&gt;手机 B 3&lt;BR&gt;手机 C 3&lt;BR&gt;&lt;BR&gt;23、说明：初始化表table1&lt;BR&gt;TRUNCATE TABLE table1&lt;BR&gt;&lt;BR&gt;24、说明：选择从10到15的记录&lt;BR&gt;select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc&lt;BR&gt;　　&lt;BR&gt;随机选择数据库记录的方法（使用Randomize函数，通过SQL语句实现）&lt;BR&gt;　　对存储在数据库中的数据来说，随机数特性能给出上面的效果，但它们可能太慢了些。你不能要求ASP&amp;#8220;找个随机数&amp;#8221;然后打印出来。实际上常见的解决方案是建立如下所示的循环： &lt;BR&gt;Randomize &lt;BR&gt;RNumber = Int(Rnd*499) +1 &lt;BR&gt;　&lt;BR&gt;While Not objRec.EOF &lt;BR&gt;If objRec("ID") = RNumber THEN &lt;BR&gt;... 这里是执行脚本 ... &lt;BR&gt;end if &lt;BR&gt;objRec.MoveNext &lt;BR&gt;Wend &lt;BR&gt;　&lt;BR&gt;　　这很容易理解。首先，你取出1到500范围之内的一个随机数（假设500就是数据库内记录的总数）。然后，你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495，那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些，但相比更为稳固的企业解决方案这还是个小型数据库了，后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了？ &lt;BR&gt;　　采用SQL，你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset，如下所示： &lt;BR&gt;Randomize &lt;BR&gt;RNumber = Int(Rnd*499) + 1 &lt;BR&gt;　&lt;BR&gt;SQL = "SELECT * FROM Customers WHERE ID = " &amp;amp; RNumber &lt;BR&gt;　&lt;BR&gt;set objRec = ObjConn.Execute(SQL) &lt;BR&gt;Response.WriteRNumber &amp;amp; " = " &amp;amp; objRec("ID") &amp;amp; " " &amp;amp; objRec("c_email") &lt;BR&gt;　&lt;BR&gt;　　不必写出RNumber 和ID，你只需要检查匹配情况即可。只要你对以上代码的工作满意，你自可按需操作&amp;#8220;随机&amp;#8221;记录。Recordset没有包含其他内容，因此你很快就能找到你需要的记录这样就大大降低了处理时间。 &lt;BR&gt;再谈随机数 &lt;BR&gt;　　现在你下定决心要榨干Random 函数的最后一滴油，那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 &lt;BR&gt;　　为了取出几条随机选择的记录并存放在同一recordset内，你可以存储三个随机数，然后查询数据库获得匹配这些数字的记录： &lt;BR&gt;SQL = "SELECT * FROM Customers WHERE ID = " &amp;amp; RNumber &amp;amp; " OR ID = " &amp;amp; RNumber2 &amp;amp; " OR ID = " &amp;amp; RNumber3 &lt;BR&gt;　&lt;BR&gt;　　假如你想选出10条记录（也许是每次页面装载时的10条链接的列表），你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成，但是 SELECT 语句只显示一种可能（这里的ID 是自动生成的号码）： &lt;BR&gt;SQL = "SELECT * FROM Customers WHERE ID BETWEEN " &amp;amp; RNumber &amp;amp; " AND " &amp;amp; RNumber &amp;amp; "+ 9" &lt;BR&gt;&lt;BR&gt;　　注意：以上代码的执行目的不是检查数据库内是否有9条并发记录。&lt;BR&gt;&lt;BR&gt;　&lt;BR&gt;随机读取若干条记录，测试过&lt;BR&gt;Access语法：SELECT top 10 * From 表名 ORDER BY Rnd(id)&lt;BR&gt;Sql server:select top n * from 表名 order by newid()&lt;BR&gt;mysql&lt;IMG alt="" src="file:///C:/Documents%20and%20Settings/King/桌面/博客园%20-%20灯烛之火-日月争辉%20-%20精妙Sql语句.files/8.gif" onload="javascript:if(this.width&gt;550)this.style.width=550; if(this.height&gt;550)this.style.width=(this.width*550)/this.height;"&gt;elect * From 表名 Order By rand() Limit n&lt;BR&gt;Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)&lt;BR&gt;语法&lt;IMG alt="" src="file:///C:/Documents%20and%20Settings/King/桌面/博客园%20-%20灯烛之火-日月争辉%20-%20精妙Sql语句.files/8.gif" onload="javascript:if(this.width&gt;550)this.style.width=550; if(this.height&gt;550)this.style.width=(this.width*550)/this.height;"&gt;elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...&lt;BR&gt;使用SQL语句 用...代替过长的字符串显示&lt;BR&gt;语法：&lt;BR&gt;SQL数据库：select case when len(field)&amp;gt;10 then left(field,10)+'...' else field end as news_name,news_id from tablename&lt;BR&gt;Access数据库：SELECT iif(len(field)&amp;gt;2,left(field,2)+'...',field) FROM tablename; &lt;BR&gt;　&lt;BR&gt;Conn.Execute说明&lt;BR&gt;Execute方法&lt;BR&gt;　　该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集，该方法的使用格式分为以下两种：&lt;BR&gt;　　　　1．执行SQL查询语句时，将返回查询得到的记录集。用法为：&lt;BR&gt;　　　　Set 对象变量名=连接对象.Execute("SQL 查询语言")&lt;BR&gt;　　　Execute方法调用后，会自动创建记录集对象，并将查询结果存储在该记录对象中，通过Set方法，将记录集赋给指定的对象保存，以后对象变量就代表了该记录集对象。&lt;BR&gt;&lt;BR&gt;　　　　2．执行SQL的操作性语言时，没有记录集的返回。此时用法为：&lt;BR&gt;　　　　连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]&lt;BR&gt;　　　　　　&amp;#183;RecordAffected 为可选项，此出可放置一个变量，SQL语句执行后，所生效的记录数会自动保存到该变量中。通过访问该变量，就可知道SQL语句队多少条记录进行了操作。&lt;BR&gt;　　　　　　&amp;#183;Option 可选项，该参数的取值通常为adCMDText，它用于告诉ADO，应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数，可使执行更高效。&lt;BR&gt;&lt;BR&gt;&amp;#183;BeginTrans、RollbackTrans、CommitTrans方法&lt;BR&gt;　　这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物；RollbackTrans用于回滚事务；CommitTrans用于提交所有的事务处理结果，即确认事务的处理。&lt;BR&gt;　　事务处理可以将一组操作视为一个整体，只有全部语句都成功执行后，事务处理才算成功；若其中有一个语句执行失败，则整个处理就算失败，并恢复到处里前的状态。&lt;BR&gt;　　BeginTrans和CommitTrans用于标记事务的开始和结束，在这两个之间的语句，就是作为事务处理的语句。判断事务处理是否成功，可通过连接对象的Error集合来实现，若Error集合的成员个数不为0，则说明有错误发生，事务处理失败。Error集合中的每一个Error对象，代表一个错误信息。&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/40433.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>编写Java程序最容易犯的21种错误</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/08/02/38779.html</link><pubDate>Wed, 02 Aug 2006 10:35:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/08/02/38779.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/38779.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/08/02/38779.html#Feedback</comments><slash:comments>176</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/38779.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/38779.html</trackback:ping><description>1.Duplicated Code&lt;BR&gt;
&lt;P&gt;　　代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　2.Long method&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　它是传统结构化的&amp;#8220;遗毒&amp;#8221;。一个方法应当具有自我独立的意图，不要把几个意图放在一起。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　3.Large Class&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　大类就是你把太多的责任交给了一个类。这里的规则是One Class One Responsibility.&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　4.Divergent Change&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　一个类里面的内容变化率不同。某些状态一个小时变一次，某些则几个月一年才变一次；某些状态因为这方面的原因发生变化，而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　5.Shotgun Surgery&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　6.Feature Envy&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get 方法存取其他类的状态进行计算，那么你要考虑把行为移到涉及状态数目最多的那个类。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　7.Data Clumps&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　某些数据通常像孩子一样成群玩耍：一起出现在很多类的成员变量中，一起出现在许多方法的参数中，这些数据或许应该自己独立形成对象。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　8.Primitive Obsession&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围，他们会使用两个数字。对于Money，他们会用一个浮点数来表示。因为你没有使用对象来表达问题中存在的概念，这使得代码变的难以理解，解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型，用小对象来表示范围、金额、转化率、邮政编码等等。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　9.Switch Statement&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　基于常量的开关语句是OO 的大敌，你应当把他变为子类、state或strategy.&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　10. Parallel Inheritance Hierarchies&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　并行的继承层次是shotgun surgery的特殊情况。因为当你改变一个层次中的某一个类时，你必须同时改变另外一个层次的并行子类。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　11. Lazy Class&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　一个干活不多的类。类的维护需要额外的开销，如果一个类承担了太少的责任，应当消除它。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　12. Speculative Generality&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　一个类实现了从未用到的功能和通用性。通常这样的类或方法唯一的用户是testcase.不要犹豫，删除它。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　13. Temporary Field&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　一个对象的属性可能只在某些情况下才有意义。这样的代码将难以理解。专门建立一个对象来持有这样的孤儿属性，把只和他相关的行为移到该类。最常见的是一个特定的算法需要某些只有该算法才有用的变量。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　14. Message Chain&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　消息链发生于当一个客户向一个对象要求另一个对象，然后客户又向这另一对象要求另一个对象，再向这另一个对象要求另一个对象，如此如此。这时，你需要隐藏分派。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　15. Middle Man&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　对象的基本特性之一就是封装，而你经常会通过分派去实现封装。但是这一步不能走得太远，如果你发现一个类接口的一大半方法都在做分派，你可能需要移去这个中间人。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　16. Inappropriate Intimacy&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　某些类相互之间太亲密，它们花费了太多的时间去砖研别人的私有部分。对人类而言，我们也许不应该太假正经，但我们应当让自己的类严格遵守禁欲主义。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　17. Alternative Classes with Different Interfaces&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　做相同事情的方法有不同的函数signature，一致把它们往类层次上移，直至协议一致。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　18. Incomplete Library Class&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　要建立一个好的类库非常困难。我们大量的程序工作都基于类库实现。然而，如此广泛而又相异的目标对库构建者提出了苛刻的要求。库构建者也不是万能的。有时候我们会发现库类无法实现我们需要的功能。而直接对库类的修改有非常困难。这时候就需要用各种手段进行Refactoring.&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　19. Data Class&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　对象包括状态和行为。如果一个类只有状态没有行为，那么肯定有什么地方出问题了。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　20. Refused Bequest&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　超类传下来很多行为和状态，而子类只是用了其中的很小一部分。这通常意味着你的类层次有问题。&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　21. Comments&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;　　经常觉得要写很多注释表示你的代码难以理解。如果这种感觉太多，表示你需要Refactoring。&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/38779.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>JDK5与JDK1.4 类初始化编译的过程差别</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/31/38109.html</link><pubDate>Mon, 31 Jul 2006 01:46:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/31/38109.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/38109.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/31/38109.html#Feedback</comments><slash:comments>367</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/38109.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/38109.html</trackback:ping><description>&lt;TABLE class="fixedTable blogpost" cellSpacing=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=ellipse&gt;&lt;SPAN class=bvTitle id=subjcns!69D05DFD4294F487!440&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;JDK5与JDK1.4编译的不同效果&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=bvh8&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD id=msgcns!69D05DFD4294F487!440&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;跑跑一下代码，注意一下JDK5编译后运行效果和JDK1.4的区别。&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;import java.util.Date;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;public class Language {&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;public final static Language[] languages;&lt;BR&gt;&amp;nbsp;public final static Language C = new Language("C");&lt;BR&gt;&amp;nbsp;public final static Language JAVA = new Language("java");&lt;BR&gt;&amp;nbsp;public final static Language FORTRAN = new Language("FORTRAN");&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&amp;nbsp;static{&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("in static block");&lt;BR&gt;&amp;nbsp;&amp;nbsp;languages = new Language[]{C, JAVA, FORTRAN};&lt;BR&gt;&amp;nbsp;&amp;nbsp;Main.date = new Date();&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("leave static block");&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;private String name;&lt;BR&gt;&amp;nbsp;private Language(String name){&lt;BR&gt;&amp;nbsp;&amp;nbsp;this.name = name;&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("create '" + name + "' language");&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;public String toString(){&lt;BR&gt;&amp;nbsp;&amp;nbsp;return this.name;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;}&lt;BR&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;import java.util.Date;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;public class Main {&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&amp;nbsp;public static Date date = null;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;public static void main(String[] args) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println(Language.class);&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("------------");&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("date:" + date);&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println("------------");&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println(Language.JAVA);&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;－－－－－－－－－－－－－－－－－－－－－－&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;--- JDK 1.4 Compiler ---&lt;BR&gt;create 'C' language&lt;BR&gt;create 'java' language&lt;BR&gt;create 'FORTRAN' language&lt;BR&gt;in static block&lt;BR&gt;leave static block&lt;BR&gt;class Language&lt;BR&gt;------------&lt;BR&gt;date:Thu Mar 09 23:58:23 CST 2006&lt;BR&gt;------------&lt;BR&gt;java&lt;BR&gt;－－－－－－－－－－－－－－－－－－－－－－&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;--- JDK 5 Compiler ---&lt;BR&gt;class Language&lt;BR&gt;------------&lt;BR&gt;date:null&lt;BR&gt;------------&lt;BR&gt;create 'C' language&lt;BR&gt;create 'java' language&lt;BR&gt;create 'FORTRAN' language&lt;BR&gt;in static block&lt;BR&gt;leave static block&lt;BR&gt;java&lt;BR&gt;－－－－－－－－－－－－－－－－－－－－－－&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;通过以上运行结果可知，在JDK5的编译环境下调用时Language.class时static{&amp;#215;&amp;#215;&amp;#215;}的代码还没有被运行过，只有在真正使用到Language对象时才开始运行初始化staic{&amp;#215;&amp;#215;&amp;#215;}，但是在JDK1.4的编译环境下，只要Language.class被调用到时内部的static{&amp;#215;&amp;#215;&amp;#215;}代码会首先初始化好，所以JDK5的运行结果会导致Main.date为空。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000099&gt;1.类的初始化一般过程：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一.初始化基类的静态变量和块（static块和static变量一样，看代码书写前后），&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 二.初始化子类静态变量和块&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 三.基类一般变量和块（变量和块一样，看代码书写前后）+ 构造函数&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 四.子类一般变量和块 + 构造函数&lt;/FONT&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#000099&gt;2.**静态变量和块只再第一次构造时初始化**&lt;BR&gt;&lt;BR&gt;3.在第一次调用类的静态变量时，也会触发类的静态变量和块的初始化（但不触发类的构造）&lt;BR&gt;且：&lt;BR&gt;System.out.println("b4:"+Cupboard.b5.getClass());&lt;BR&gt;先执行Cupboard的静态变量初始化，再打印b4&lt;BR&gt;***************************************************************&lt;BR&gt;new 的优先级比较高！！！！！&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/38109.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>Integer.valueOf(××)</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/31/38105.html</link><pubDate>Mon, 31 Jul 2006 01:27:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/31/38105.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/38105.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/31/38105.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/38105.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/38105.html</trackback:ping><description>&lt;TABLE class="fixedTable blogpost" cellSpacing=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=ellipse&gt;&lt;SPAN class=bvTitle id=subjcns!69D05DFD4294F487!524&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;300 != 300&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=bvh8&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD id=msgcns!69D05DFD4294F487!524&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;code:&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;int value = 100;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Integer a = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Integer b = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println(a + "==" + b + " ? " + (a == b));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;value = 300;&lt;BR&gt;&amp;nbsp;&amp;nbsp;a = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;b = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;System.out.println(a + "==" + b + " ? " + (a == b));&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;-----------------------------------------------------------------------------&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;output:&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&amp;nbsp;100==100 ? true&lt;BR&gt;&amp;nbsp;300==300 ? false&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;-----------------------------------------------------------------------------&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;decompile code:&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int value = 100;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Integer a = Integer.valueOf(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Integer b = Integer.valueOf(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println((new StringBuilder()).append(a).append("==").append(b).append(" ? ").append(a == b).toString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = 300;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = Integer.valueOf(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = Integer.valueOf(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println((new StringBuilder()).append(a).append("==").append(b).append(" ? ").append(a == b).toString());&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;-----------------------------------------------------------------------------&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;JDK&amp;nbsp;source:&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static Integer valueOf(int i) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; final int offset = 128;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i &amp;gt;= -128 &amp;amp;&amp;amp; i &amp;lt;= 127) { // must cache&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return IntegerCache.cache[i + offset];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new Integer(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;-----------------------------------------------------------------------------&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#000000&gt;原来1.5的box和unboxing功能只是个面具，编译器最终还是用了原来1.4的规则进行实现，不过1.5的Integer增加了 public static Integer valueOf(int i)的函数，内部实现了对-128到127之间的Integer对象的缓存，其用意和Boolean.valueOf一样避免过多的创建对象。看&lt;FONT color=#ff0000&gt;来我们今后应该避免写出new Integer(&amp;#215;&amp;#215;)的代码了，应该都用Integer.valueOf(&amp;#215;&amp;#215;)的方式。&lt;/FONT&gt;同时还有个StringBuilder的细节指的我们注意，这是1.5引入功能等同于StringBuffer的新类，只不过StringBuilder不再考虑线程安全的情况，看来1.5还是有不少针对效率的小细节优化，值得我们注意甚至是对编码习惯的更正。&lt;/FONT&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/38105.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>也起setEdit(false)的作用</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/29/37452.html</link><pubDate>Sat, 29 Jul 2006 02:43:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/29/37452.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/37452.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/29/37452.html#Feedback</comments><slash:comments>237</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/37452.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/37452.html</trackback:ping><description>&amp;nbsp;txtID.setInputVerifier(new JTextFieldInputVerifier("[a-zA-Z0-9]*", false));&lt;BR&gt;&lt;BR&gt;InputVerifier&lt;BR&gt;此类的用途是通过带文本字段的 GUI 帮助客户端支持流畅的焦点导航。在允许用户导航到文本字段以外之前，这类 GUI 常常需要确保用户输入的文本是有效的（例如，文本具有正确的格式）。为做到这一点，客户端要使用 &lt;CODE&gt;JComponent&lt;/CODE&gt; 的 &lt;CODE&gt;setInputVerifier&lt;/CODE&gt; 方法创建 &lt;CODE&gt;InputVerifier&lt;/CODE&gt; 的子类，并将其子类的实例附加到想要验证其输入的 &lt;CODE&gt;JComponent&lt;/CODE&gt; 中。在将焦点转移到另一个请求它的 Swing 组件之前，要调用输入验证器的 &lt;CODE&gt;shouldYieldFocus&lt;/CODE&gt; 方法。只在该方法返回 &lt;CODE&gt;true&lt;/CODE&gt; 时才转移焦点。&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/37452.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>新名词</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/24/35344.html</link><pubDate>Mon, 24 Jul 2006 04:41:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/24/35344.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/35344.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/07/24/35344.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/35344.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/35344.html</trackback:ping><description>&lt;P&gt;struts:经典的老框架，历经6年多的发展，是目前用户数最多、开发团队和社区最火热的框架，适用于中小型项目的快速开发，问题是...它太老了。&lt;BR&gt;tapestry:一个组件式的、事件驱动的框架，理念很先进，想实现类似于桌面程序开发的那种便捷模式。但是它的学习曲线比较陡峭，要花不少时间才能掌握它。它适合大型项目开发，随着组件的积累，开发越到后期可复用的组件越多，开发速度越快。&lt;BR&gt;spring mvc:spring提供的东东，使用了spring的IoC，并且也非常强大，但是感觉它比较接近低层，要关注的东西很多。&lt;BR&gt;jsf:j2ee的标准框架，事件驱动。没有使用过它，但是无论如何它是j2ee标准的东西，跟着它走基本不会错。&lt;BR&gt;webwork:和struts一样经典的框架，而且比struts更易于使用，但是社群就不如struts那么强大了。&lt;BR&gt;struts2:struts和webwork合并后的东东，还没有正式发布，不知道会不会是个怪胎。&lt;/P&gt;
&lt;P&gt;这些框架基本不依赖特定的服务器，tomcat、jboss、weblogic都没有问题。&lt;BR&gt;tomcat:轻量小巧的web容器，如果你不是使用ejb开发，那就可以用它，快速方便。&lt;BR&gt;jboss:其中的web容器就是用tomcat，不过支持了ejb，速度慢一些，不适合开发阶段，可以用于真实运行环境（免费）。&lt;BR&gt;weblogic:强大的服务器，不适合开发阶段，太慢了，适合于运行环境（收费）。&lt;/P&gt;
&lt;P&gt;开发工具么，eclipse+myeclipse几乎可以满足上述所有开发的需要。也可以根据需要找到某个框架的特定插件，但是myeclipse本身就集成了各种插件，更方便易用。&lt;/P&gt;
&lt;P&gt;其他相关的技术么：&lt;BR&gt;urlrewrite:URL重写转换，让前端用户通过静态路径访问服务，后台自动转为动态路径。&lt;BR&gt;sitemesh:简化页面开发，让页面开发模板化，公用相同的区域。&lt;BR&gt;acegi安全框架:拦截并校验用户访问的url，确定用户是否有权访问。功能不仅如此，很强大。&lt;BR&gt;displaytag:列表显示，自动实现翻页、数据导出等功能。&lt;BR&gt;dtree:树形显示，简单易用。&lt;BR&gt;jfreechat:统计图表生成。&lt;BR&gt;dwr:适合java的ajax开发框架，新版本中实现了服务器推模式，颠覆传统的客户端拉模式。&lt;BR&gt;FCKeditor:网页的所见即所得编辑器，漂亮的外观，多语言支持等，很强大。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/35344.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>七月</dc:creator><title>equal方法</title><link>http://www.mscenter.edu.cn/blog/leo/archive/2006/05/31/13677.html</link><pubDate>Wed, 31 May 2006 10:41:00 GMT</pubDate><guid>http://www.mscenter.edu.cn/blog/leo/archive/2006/05/31/13677.html</guid><wfw:comment>http://www.mscenter.edu.cn/blog/leo/comments/13677.html</wfw:comment><comments>http://www.mscenter.edu.cn/blog/leo/archive/2006/05/31/13677.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.mscenter.edu.cn/blog/leo/comments/commentRss/13677.html</wfw:commentRss><trackback:ping>http://www.mscenter.edu.cn/blog/leo/services/trackbacks/13677.html</trackback:ping><description>&amp;nbsp;public boolean equals(Object o){&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(o == null){//谨慎&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(o == this){//优化&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(!(o instanceof LinkListDemo)){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;if( s!=(LinkListDemo)o.s){//直接比较内存&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}if(!s.equals(o.s)){//比较内容&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;return true;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;img src ="http://www.mscenter.edu.cn/blog/leo/aggbug/13677.html" width = "1" height = "1" /&gt;</description></item></channel></rss>