??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成av人片一区二区三区,亚洲一区二区三区免费视频,亚洲国产精品一区http://m.tkk7.com/larry/hibernate、spring、webwork、struts、Portal、ajax技术交?/description>zh-cnTue, 13 May 2025 18:36:36 GMTTue, 13 May 2025 18:36:36 GMT60Java中抽象类和接口的区别http://m.tkk7.com/larry/archive/2008/11/26/242753.htmllarryjavalarryjavaWed, 26 Nov 2008 03:24:00 GMThttp://m.tkk7.com/larry/archive/2008/11/26/242753.htmlhttp://m.tkk7.com/larry/comments/242753.htmlhttp://m.tkk7.com/larry/archive/2008/11/26/242753.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/242753.htmlhttp://m.tkk7.com/larry/services/trackbacks/242753.html  在Java语言中, abstract class 和interface 是支持抽象类定义的两U机制。正是由于这两种机制的存在,才赋予了Java强大?面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的怼性,甚至可以怺替换Q因此很多开发者在q?行抽象类定义时对于abstract class和interface的选择昑־比较随意。其实,两者之间还是有很大的区别的Q对于它们的选择甚至反映出对 于问题领域本质的理解、对于设计意囄理解是否正确、合理。本文将对它们之间的区别q行一番剖析,试图l开发者提供一个在二者之间进行选择的依据?

  理解抽象c?/strong>

  abstract class和interface在Java语言中都是用来进行抽象类Q本?中的抽象cdƈ非从abstract class译而来Q它表示的是一个抽象体Q而abstract class为Java语言中用于定义抽象类的一U方法, 误者注意区分)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q?/p>

  ?面向对象的概念中Q我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是 所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l一个具体的对象Q这Lcd是抽象类。抽象类往往用来表征我们在对问题领域q行分析?设计中得出的抽象概念Q是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:如果我们q行一个图形编辑Y件的开发,׃发现问题领域存在着圆?三角形这样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它是一个抽象概c正是因为抽象的概念 在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?/p>

  在面向对象领域,抽象cM要用来进行类型隐藏?我们可以构造出一个固定的一l行为的抽象?qͼ但是q组行ؓ却能够有L个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一?抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟悉OCP的读者一定知 道,Z能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在?/p>

  从语法定义层面看abstract class ?interface

  在语法层面,Java语言对于abstract class和interfacel出了不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同?/p>

  使用abstract class的方式定义Demo抽象cȝ方式如下Q?/p>

abstract class Demo?br /> abstract void method1();
abstract void method2();

?br />   使用interface的方式定义Demo抽象cȝ方式如下Q?/p>

interface Demo{
void method1();
void method2();

}
  在abstract class方式中,Demo可以有自q数据成员Q也可以有非 abstract的成员方法,而在interface方式的实CQDemo只能够有静态的不能被修改的数据成员Q也是必须是static final 的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的。从某种意义上说Qinterface是一U特DŞ式的 abstract class?/p>

  从编E的角度来看Qabstract class和interface都可以用来实?"design by contract" 的思想。但是在具体的用上面还是有一些区别的?/p>

  首先Qabstract class ?Java 语言中表C的是一U承关p,一个类只能使用一ơ承关p?因ؓJava不支持多l承 -- 转注)。但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?/p>

  其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这会增加一些复杂性,有时会造成很大的麻烦?/p>

  ?抽象cM不能定义默认行ؓq存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因 为如果后来想修改cȝ界面Q一般通过 abstract class 或者interface来表C)以适应新的情况Q比如,d新的Ҏ或者给已用的方法中?加新的参敎ͼӞ׃非常的麻烦,可能要花费很多的旉Q对于派生类很多的情况,ؓ如此Q。但是如果界面是通过abstract class来实现的Q那 么可能就只需要修改定义在abstract class中的默认行ؓ可以了?/p>

  同样Q如果不能在抽象cM定义默认行ؓQ就会导致同LҎ实现出现在该抽象cȝ每一个派生类中,q反?"one ruleQone place" 原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心?/p>

  从设计理念层面看 abstract class ?interface

  上面主要从语法定义和~程的角度论qCabstract class和interface的区 别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?/p>

  前面已经提到q,abstract class在Java语言中体C一U承关p,要想使得 l承关系合理Q父cdzcM间必d?is-a"关系Q即父类和派生类在概忉|质上应该是相同的。对于interface来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q?仅仅是实Cinterface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明?/p>

  考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:

  使用abstract class方式定义DoorQ?/p>

abstract class Door{
abstract void open();
abstract void close()Q?br /> }
  使用interface方式定义DoorQ?/p>

interface Door{
void open();
void close();
}
  其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?/p>

  如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中, 主要是ؓ了展C?abstract class 和interface 反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)Q下面将|列出可能的?x案,q从设计理念层面对这些不同的Ҏq行分析?/p>

  解决Ҏ一Q?/strong>

  单的在Door的定义中增加一个alarmҎQ如下:

abstract class Door{
abstract void open();
abstract void close()Q?br /> abstract void alarm();
}
  或?/p>

interface Door{
void open();
void close();
void alarm();
}
  那么h报警功能的AlarmDoor的定义方式如下:

class AlarmDoor extends Door{
void open(){…}
void close(){…}
void alarm(){…}
}
  或?/p>

class AlarmDoor implements Door?br /> void open(){…}
void close(){…}
void alarm(){…}
?br />   q种Ҏq反了面向对象设计中的一个核心原?ISP (Interface Segregation Principle)Q在Door的定义中把Door概念本n固有的行为方法和另外一个概?报警?的行为方 法؜在了一赗这样引L一个问题是那些仅仅依赖于Doorq个概念的模块会因ؓ"报警?q个概念的改变(比如Q修改alarmҎ的参敎ͼ而改变,?之依然?/p>

  解决Ҏ二:

  既然open、close和alarm属于两个不同的概念,ҎISP原则应该把它们分别定 义在代表q两个概늚抽象cM。定义方式有Q这两个概念都?abstract class 方式定义Q两个概念都使用interface方式定义Q一个概?使用 abstract class 方式定义Q另一个概念用interface方式定义?/p>

  昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?/p>

  如果两个概念都用interface方式来定义,那么反映出两个问题Q?、我们可能没?理解清楚问题领域QAlarmDoor在概忉|质上到底是Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:我们通过对于问题领域的分 析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均?interface方式定义Q反映不Zq含义?/p>

  如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报 警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关p?在本质上?is-a"关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,?明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所C:

abstract class Door{
abstract void open();
abstract void close()Q?br /> }
interface Alarm{
void alarm();
}
class Alarm Door extends Door implements Alarm{
void open(){…}
void close(){…}
void alarm(){…}
}
  q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其 实abstract class表示的是"is-a"关系Qinterface表示的是"like-a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?/p>

  结

  1.abstract class ?Java 语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface?/p>

  2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员Q也是必须是static final的,不过?interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的?/p>

  3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系Qinterface表示的是"like-a"关系?

  4.实现抽象cd接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现Ҏ?/p>

  5.接口中定义的变量默认是public static final 型,且必ȝ其初|所以实现类中不能重新定义,也不能改变其倹{?/p>

  6.抽象cM的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋倹{?

  7.接口中的Ҏ默认都是 public,abstract cd的?/p>

  l论

  abstract class ?interface ?Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概 忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ它们表现了概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望读者朋友能够细l体会?/p>

larryjava 2008-11-26 11:24 发表评论
]]>
面试记录http://m.tkk7.com/larry/archive/2008/11/26/242752.htmllarryjavalarryjavaWed, 26 Nov 2008 03:23:00 GMThttp://m.tkk7.com/larry/archive/2008/11/26/242752.htmlhttp://m.tkk7.com/larry/comments/242752.htmlhttp://m.tkk7.com/larry/archive/2008/11/26/242752.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/242752.htmlhttp://m.tkk7.com/larry/services/trackbacks/242752.html1.Z么要用抽象类实现接口
   {:

抽象cd接口比v来,有一个好处,是某些函数可以实现具体的方法,而ƈ不一定是声明抽象的方法,而接口只能声明抽象方法,所以用一个抽象类来实现某个接口可以实C些通用的方法,而这些具体实现的Ҏ里还可以调用抽象ҎQ所以减了子类中的重复代码?/p>

java库里也有不少q这L设计Q?/p>

比如java.util.AbstractList实现了java.util.List,而其实某些方法就是调用了抽象Ҏ?/p>

q有一个好处就是可以给子类一个默认的实现Q而不必给所有的子类实现所有的Ҏ?/p>

另外q有一个好处就是可以提供一些公用的Ҏl子cM用?/p> 2.

larryjava 2008-11-26 11:23 发表评论
]]>
spring+quartz的定时器功能http://m.tkk7.com/larry/archive/2008/11/06/239068.htmllarryjavalarryjavaThu, 06 Nov 2008 09:06:00 GMThttp://m.tkk7.com/larry/archive/2008/11/06/239068.htmlhttp://m.tkk7.com/larry/comments/239068.htmlhttp://m.tkk7.com/larry/archive/2008/11/06/239068.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/239068.htmlhttp://m.tkk7.com/larry/services/trackbacks/239068.html

W二通过spring中的SimpleTrigger单触发器实现


参考:
        http://www.javaeye.com/topic/115666
       http://www.javaeye.com/topic/117244




larryjava 2008-11-06 17:06 发表评论
]]>
教你一步步搭徏功能强大的开源邮件服?/title><link>http://m.tkk7.com/larry/archive/2008/09/19/230016.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Fri, 19 Sep 2008 12:41:00 GMT</pubDate><guid>http://m.tkk7.com/larry/archive/2008/09/19/230016.html</guid><wfw:comment>http://m.tkk7.com/larry/comments/230016.html</wfw:comment><comments>http://m.tkk7.com/larry/archive/2008/09/19/230016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/larry/comments/commentRss/230016.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/larry/services/trackbacks/230016.html</trackback:ping><description><![CDATA[在这里希望和大家分n iRedMail 开源邮件方案的详细安装、配|文档,希望对大家有所帮助?br /> <br /> Z Postfix + MySQL 的文档:<a target="_blank">http://www.iredmail.org/wiki/index.php/IRedMail-doc-MySQL-0.2</a><br /> Z Postfix + OpenLDAP 的文档:<a target="_blank">http://www.iredmail.org/wiki/index.php/IRedMail-doc-OpenLDAP-0.2</a><br /> <br /> Extmail webmailpȝ  <a >http://www.extmail.org/</a> <br /> Postfix  <a >http://www.postfix.org.cn</a> <img src ="http://m.tkk7.com/larry/aggbug/230016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/larry/" target="_blank">larryjava</a> 2008-09-19 20:41 <a href="http://m.tkk7.com/larry/archive/2008/09/19/230016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate sum 函数的?/title><link>http://m.tkk7.com/larry/archive/2008/05/09/199470.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Fri, 09 May 2008 05:17:00 GMT</pubDate><guid>http://m.tkk7.com/larry/archive/2008/05/09/199470.html</guid><wfw:comment>http://m.tkk7.com/larry/comments/199470.html</wfw:comment><comments>http://m.tkk7.com/larry/archive/2008/05/09/199470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/larry/comments/commentRss/199470.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/larry/services/trackbacks/199470.html</trackback:ping><description><![CDATA[<h3>使用Hibernate的sum函数q行数据的统计时,出现一个错? </h3> <p> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">select SUM(nf.fee) from CFee as nf where   nf.adminAccount='testaccount' </span><span style="color: #000000">"</span><span style="color: #000000">;   <br /> <img id="Codehighlighter1_138_405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_405_Open_Text.style.display='none'; Codehighlighter1_138_405_Closed_Image.style.display='inline'; Codehighlighter1_138_405_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_138_405_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_138_405_Closed_Text.style.display='none'; Codehighlighter1_138_405_Open_Image.style.display='inline'; Codehighlighter1_138_405_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span><span style="color: #000000"> getListSqlCountsLong(String sql) </span><span id="Codehighlighter1_138_405_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_138_405_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        beginTransaction();   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        List li </span><span style="color: #000000">=</span><span style="color: #000000"> getSession().createQuery(sql).list();   <br /> <img id="Codehighlighter1_273_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_273_311_Open_Text.style.display='none'; Codehighlighter1_273_311_Closed_Image.style.display='inline'; Codehighlighter1_273_311_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_273_311_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_273_311_Closed_Text.style.display='none'; Codehighlighter1_273_311_Open_Image.style.display='inline'; Codehighlighter1_273_311_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (li </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">||</span><span style="color: #000000"> li.isEmpty()) </span><span id="Codehighlighter1_273_311_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_273_311_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;   <br /> <img id="Codehighlighter1_318_396_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_396_Open_Text.style.display='none'; Codehighlighter1_318_396_Closed_Image.style.display='inline'; Codehighlighter1_318_396_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_318_396_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_318_396_Closed_Text.style.display='none'; Codehighlighter1_318_396_Open_Image.style.display='inline'; Codehighlighter1_318_396_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span id="Codehighlighter1_318_396_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_318_396_Open_Text"><span style="color: #000000">{                        </span><span style="color: #0000ff">return</span><span style="color: #000000"> ((Integer) li.get(</span><span style="color: #000000">0</span><span style="color: #000000">)).longValue();   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"> </span></div> q样使用报null错误. <br /> List的size明明{于1,但li.get(0)q是为空.(数据库中查询的̎号sum本来׃ؓnull??可能?) <br /> 解决Ҏ:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">select SUM(nf.fee) from CFee as nf where   nf.adminAccount='testaccount' </span><span style="color: #000000">"</span><span style="color: #000000">;   <br /> <img id="Codehighlighter1_138_491_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_491_Open_Text.style.display='none'; Codehighlighter1_138_491_Closed_Image.style.display='inline'; Codehighlighter1_138_491_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_138_491_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_138_491_Closed_Text.style.display='none'; Codehighlighter1_138_491_Open_Image.style.display='inline'; Codehighlighter1_138_491_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span><span style="color: #000000"> getListSqlCountsLong(String sql) </span><span id="Codehighlighter1_138_491_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_138_491_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        beginTransaction();   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        List li </span><span style="color: #000000">=</span><span style="color: #000000"> getSession().createQuery(sql).list();   <br /> <img id="Codehighlighter1_273_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_273_311_Open_Text.style.display='none'; Codehighlighter1_273_311_Closed_Image.style.display='inline'; Codehighlighter1_273_311_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_273_311_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_273_311_Closed_Text.style.display='none'; Codehighlighter1_273_311_Open_Image.style.display='inline'; Codehighlighter1_273_311_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (li </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">||</span><span style="color: #000000"> li.isEmpty()) </span><span id="Codehighlighter1_273_311_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_273_311_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;   <br /> <img id="Codehighlighter1_318_482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_482_Open_Text.style.display='none'; Codehighlighter1_318_482_Closed_Image.style.display='inline'; Codehighlighter1_318_482_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_318_482_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_318_482_Closed_Text.style.display='none'; Codehighlighter1_318_482_Open_Image.style.display='inline'; Codehighlighter1_318_482_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span id="Codehighlighter1_318_482_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_318_482_Open_Text"><span style="color: #000000">{       <br /> <img id="Codehighlighter1_366_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_366_412_Open_Text.style.display='none'; Codehighlighter1_366_412_Closed_Image.style.display='inline'; Codehighlighter1_366_412_Closed_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_366_412_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_366_412_Closed_Text.style.display='none'; Codehighlighter1_366_412_Open_Image.style.display='inline'; Codehighlighter1_366_412_Open_Text.style.display='inline';" alt="" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="color: #0000ff">if</span><span style="color: #000000"> (li.get(</span><span style="color: #000000">0</span><span style="color: #000000">) </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) </span><span id="Codehighlighter1_366_412_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_366_412_Open_Text"><span style="color: #000000">{   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> ((Integer) li.get(</span><span style="color: #000000">0</span><span style="color: #000000">)).longValue();   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000">   <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000">  <br /> <img alt="" src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span></div> 解决Ҏ很简?是增加一个判断就可以?如果li.get(0)为空,则返?,不ؓI?q回? <img src ="http://m.tkk7.com/larry/aggbug/199470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/larry/" target="_blank">larryjava</a> 2008-05-09 13:17 <a href="http://m.tkk7.com/larry/archive/2008/05/09/199470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JavaScript的gzip静态压~方?http://m.tkk7.com/larry/archive/2008/02/22/181333.htmllarryjavalarryjavaFri, 22 Feb 2008 03:32:00 GMThttp://m.tkk7.com/larry/archive/2008/02/22/181333.htmlhttp://m.tkk7.com/larry/comments/181333.htmlhttp://m.tkk7.com/larry/archive/2008/02/22/181333.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/181333.htmlhttp://m.tkk7.com/larry/services/trackbacks/181333.html传统的JS压羃(删除注释,删除多余I格{?提供的压~率有时q是不尽不意,q怺现在的浏览器都支持压~传?通过讄http header的Content-Encoding=gzip),可以通过服务器的配置(如apache)Z的js提供压羃传输,或是appfuse中用的GZipFilter使tomcat也提供这U能?

现在的问题是q种动态的压羃会导致服务器CPU占用率过?现在我想到的解决辨法是通过提供静态压~?是js预先通过gzip.exe压羃?

一.下面描述在tomcat中的应用

1.prototype.js通过gzip.exe压羃保存成prototype.gzjs
2.讄header,我编写了一个简单的AddHeadersFilter来将所有以gzjsl尾的文件增加设|header Content-Encoding=gzip
web.xml中的配置
	<filter>
<filter-name>AddHeaderFilter</filter-name>
<filter-class>
badqiu.web.filter.AddHeaderFilter
</filter-class>
<init-param>
<param-name>headers</param-name>
<param-value>Content-Encoding=gzip</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AddHeaderFilter</filter-name>
<url-pattern>*.gzjs</url-pattern>
</filter-mapping>


试prototype.js是否正常的代?
<html>
<head>
<!-- type="text/javascript"不可?有些览器缺这个不能运?具体已经忘记?-->
<script src="prototype.gzjs" type="text/javascript"></script>
</head>
<body>
<input id="username" name="username" value="badqiu"/><br />
<input id="email" value="badqiu@gmail.com"/>
<script>
<!-- 试prototype的方法是否正?->
alert($F('username'))
</script>
</body>
</html>


在Apache httpd中可以直接通过在httpd.conf增加AddEncoding x-gzip .gzjs来映?gzjs文g的header

?相关压羃率数?
1. prototype.js 1.5.0_rc0原始大小56KB,未经M处理直接使用gzip压羃?2KB,d~率79%
2. 通过js压羃工具压羃q的protytype.js?0KB,使用gzip压羃?0KB,d~率?3%
3. 实际目中的多个js合ƈ成的文g 439KB,直接通过gzip压羃?5KB,d~率81%
4. 439KBl过js压羃?65KB,再经qgzip压羃?5KB,d~率86%

基本上你都可以忽略js压羃工具的压~率,直接使用gzip压羃

gzip下蝲地址 http://www.gzip.org
tomcat的压~配|示例下载地址: http://m.tkk7.com/Files/badqiu/gziptest.rar

larryjava 2008-02-22 11:32 发表评论
]]>
Apache + Tomcat + Linux 集群和均衡负?QSession 同步复制Q?配置实践指南http://m.tkk7.com/larry/archive/2008/01/13/175024.htmllarryjavalarryjavaSun, 13 Jan 2008 12:48:00 GMThttp://m.tkk7.com/larry/archive/2008/01/13/175024.htmlhttp://m.tkk7.com/larry/comments/175024.htmlhttp://m.tkk7.com/larry/archive/2008/01/13/175024.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/175024.htmlhttp://m.tkk7.com/larry/services/trackbacks/175024.htmll过我的多次试实践Q在linux和window下测试通过Qwin的比较简单,因ؓ在默认的情况下,l播已l打开?br /> 1 在linux 下同一台服务器上测试通过Q注意端口不要冲H。特别要注意那个tcpListenPort=”4001″ Q?br /> 2 在window下的同一台服务器上测试通过Q注意要点同?br /> 3 window下多C同主Z试通过Q没有什么好注意点,可以完全备䆾一个tomcat
4.linux多台不同tomcat服务器上试通过。这个也是最后实玎ͼ最实际的方案。(一般不用在win下部|tomcatweb应用。呵c我觉得)

q里讲下W四中情?/p>

先讲一下环境:都是在Red Hat Linux AS4上测试通过
Apache:ip:192.168.1.11 (一? 版本:2.0/2.2 Q做均换负蝲服务器)
Tomcat:ip1:192.168.1.12 ip2:192.168.1.13 Q两? 版本Q?.0?.5 Qweb应用的Real ServerQ?br /> Jdk:版本1.5 安装?192.168.1.12 ?92.168.1.13上的tomcat服务器上

安装tomcat和apache ,在这里就不讲了?br /> 软g都可以在www.apache.org 的网站上扑ֈ(apache,tomcat,mod_jk)

1.下蝲mod_jk.so 文g攑ֈapache 下的modules?br /> 地址Qhttp://apache.mirror.phpchina.com/tomcat/tomcat-connectors/jk/binaries/ 请选择正确的操作系l和Apache的版本?br /> 2.在apache的conf下徏立文件workers.properties

d内容Q?/p>

#
# workers.properties
#

# list the workers by name
worker.list=tomcatlb, status

# localhost server 1
# ------------------------
worker.tomcat12.port=8009
worker.tomcat12.host=192.168.1.12
worker.tomcat12.type=ajp13
worker.tomcat12.lbfactor=1
worker.tomcat12.connection_pool_timeout=750
worker.tomcat12.socket_keepalive=0
worker.tomcat12.socket_timeout=300000
worker.tomcat12.connect_timeout=10000
worker.tomcat12.reply_timeout=330000

# localhost server 3
# ------------------------
worker.tomcat13.port=8009
worker.tomcat13.host=192.168.1.13
worker.tomcat13.type=ajp13
worker.tomcat13.lbfactor=1
worker.tomcat13.connection_pool_timeout=750
worker.tomcat13.socket_keepalive=0
worker.tomcat13.socket_timeout=300000
worker.tomcat13.connect_timeout=10000
worker.tomcat13.reply_timeout=330000

worker.tomcatlb.type=lb
worker.retries=3
worker.tomcatlb.balanced_workers=tomcat12,tomcat13
worker.tomcatlb.sticky_session=1

worker.status.type=status

3.在conf下添加一个mod_jk.conf文g

LoadModule    jk_module  modules/mod_jk.so

#configure mod_jk
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug

4.增加一个虚拟机配置文gvhosts.conf Q这个不是必ȝQ可以将JkMount 的写其他的配|文件中Q?/p>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/google
    ServerName my.linuxcoffee.org
    ErrorLog logs/my.linuxcoffee.org-error_log
    CustomLog logs/my.linuxcoffee.org-access_log common
    DirectoryIndex index.htm  index.html

JkMount /*.jsp tomcatlb
JkMount /*.action tomcatlb
JKMount /jkstatus status
</VirtualHost>

4.修改conf下的httpd.conf文g加上

Include conf/vhosts.conf
Include conf/mod_jk.conf

5.配置tomcat
讲Cluster 前的注释LQ启用tomcat集群功能?br /> 一般不需要修改什么东西,但在我这边,两台linux的tomcat是L找不到nodeQ而同L配置文g在window下的跑得很是正常?br /> 有个东西要说明下Q因为tomcat的session同步功能需要用到组播,windows默认情况下是开通组播服务的Q但是linux默认情况下ƈ没有开通,可以通过指o打开route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0Q如果需要服务器启动时即开通组播需?etc/sysconfig/static-routes文g内加入eht0 net 224.0.0.0 netmask 240.0.0.0。具体组播概念请查阅CCNP相关内容?br /> 可以通过netstate -g 来查看组播状态,也可以在route -e 命o中看?/p>

原来一直提C个问?br /> 信息: Manager [/clusterapp]: skipping state transfer. No members active in cluster group.
最后测试只要修改在Cluster之间的一D代?/p>

<Receiver         
className="
org.apache.catalina.cluster.tcp.ReplicationListener
"
                
tcpListenAddress="auto"
                
tcpListenPort="4001"
                
tcpSelectorTimeout="100"
                
tcpThreadCount="6"/>

改ؓ

<Receiver         
className="
org.apache.catalina.cluster.tcp.ReplicationListener
"
                
tcpListenAddress="192.168.1.12"
                
tcpListenPort="4001"
                
tcpSelectorTimeout="100"
                
tcpThreadCount="6"/>

?3的服务器上也这一D修改ؓ自己的ip

然后打开jvmRoute Q跟workers.properties 的两个tomcat名字相匹?br /> ip1

<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat12"/>

ip2

<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat13"/>

好了Qapache和tomcat的配|好了,可以讉K了?br /> q里Q再提供一个链接,可以监控和配|负载均衡的各种信息
http://192.168.1.11/jkstatus或http://my.linuxcoffee.org、jkstatus来访问网站?/p>

注:需要在web.xml的display-name后面 下加上一Dc?q个跟顺序有关的Q不Ӟxml文g会变U哦?/p>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>TomcatDemo</display-name>
<distributable/>
</web-app>

参考文章:
Tomcat 5 Home Page
Clustering Home Page on Tomcat site
Load Balancer Home Page on Tomcat site



larryjava 2008-01-13 20:48 发表评论
]]>
关闭览器窗口时事g http://m.tkk7.com/larry/archive/2007/12/11/166916.htmllarryjavalarryjavaTue, 11 Dec 2007 05:35:00 GMThttp://m.tkk7.com/larry/archive/2007/12/11/166916.htmlhttp://m.tkk7.com/larry/comments/166916.htmlhttp://m.tkk7.com/larry/archive/2007/12/11/166916.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/166916.htmlhttp://m.tkk7.com/larry/services/trackbacks/166916.html
  

<script language="javascript">
  g_blnCheckUnload 
= true;
  
function RunOnBeforeUnload() {
     
if (g_blnCheckUnload) {window.event.returnValue = 'You will lose any unsaved content';   
     }
  
  }

</script>
<body  onbeforeunload="RunOnBeforeUnload()">
</body>
二?br />
<script>
function window.onbeforeunload()
{
    
if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey)
    
{
        window.event.returnValue
="定上传完成?";
    }
else
    
{
        alert(
"你在h");
    }

}

</script>


larryjava 2007-12-11 13:35 发表评论
]]>
更新记录后关闭子H口q刷新父H口的Javascript http://m.tkk7.com/larry/archive/2007/12/05/165521.htmllarryjavalarryjavaWed, 05 Dec 2007 07:04:00 GMThttp://m.tkk7.com/larry/archive/2007/12/05/165521.htmlhttp://m.tkk7.com/larry/comments/165521.htmlhttp://m.tkk7.com/larry/archive/2007/12/05/165521.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/165521.htmlhttp://m.tkk7.com/larry/services/trackbacks/165521.html
<a href="javascript:void(0)" onclick="window.open('child.html','child','width=400,height=300,left=200,top=200');">打开子窗?/span></a>


子窗口代?
<script language="JavaScript" type="text/javascript"> <!-- function refreshParent() {     window.opener.location.href = window.opener.location.href;     if (window.opener.progressWindow)     {         window.opener.progressWindow.close();     }     window.close(); } //--> </script>  <a href="javascript:void(0)" onclick="refreshParent()">h父窗口ƈ关闭当前H口</a> 


Ҏ查看CZ

larryjava 2007-12-05 15:04 发表评论
]]>
限制用户在文本框输入的字?http://m.tkk7.com/larry/archive/2007/09/17/145816.htmllarryjavalarryjavaMon, 17 Sep 2007 05:09:00 GMThttp://m.tkk7.com/larry/archive/2007/09/17/145816.htmlhttp://m.tkk7.com/larry/comments/145816.htmlhttp://m.tkk7.com/larry/archive/2007/09/17/145816.html#Feedback0http://m.tkk7.com/larry/comments/commentRss/145816.htmlhttp://m.tkk7.com/larry/services/trackbacks/145816.html 

<script language=javascript> 

function gbcount(message,total,used,remain)
{
var max;
max 
= total.value;
if (message.value.length > max) {
message.value 
= message.value.substring(0,max);
used.value 
= max;
remain.value 
= 0;
alert(
"内容不允许超q?nbsp;1000 个字!");
}

else {
  
var iLength = 0;
 
for(var i = 0;i<message.value.length;i++)
 
{
 
if(message.value.charCodeAt(i) >255)//字母数字的ascii~码都小?55而汉字的~码肯定大于255
 {
 iLength 
+= 2;
 }
else if(message.value.charCodeAt(i)==32)//I格
 {
   iLength 
+= 0;
 }
else//字母或数?/span>
  {
    iLength 
+= 1;
  }

 }

used.value
=iLength;
//used.value = message.value.length;
remain.value = max - used.value;
}

}

</script>
<form>
<textarea    onkeydown=gbcount(this.form.contents,this.form.total,this.form.used,this.form.remain); onkeyup=gbcount(this.form.contents,this.form.total,this.form.used,this.form.remain); cols="80" rows="8" wrap="VIRTUAL" id="contents">
</textarea>
最多字敎ͼ
<INPUT  disabled maxLength=4 name=total size=3 value=1000> 
已用字数Q?/span><INPUT  disabled maxLength=4 name=used size=3 value=0> 
可用字数Q?/span><INPUT  disabled maxLength=4 name=remain size=3 value=1000>
</form>

<htmel><title>字数</title>
<script language="javascript">
function gbcount(message,total,used,remain)
{
var max;
max=total.value;
if(message.value.length > max){
message.value = message.value.substring(0,max);
used.value = max;
remain.value = 0;
alert('不能过300个字!');
}
else{
used.value = message.value.length;
remain.value = max - used.value;
}
}
</script>

<body><form>
<textarea  cols="60" rows="8" id="memo1" onkeydown="gbcount(this.form.memo1,this.form.total1,this.form.used1,this.form.remain1);"  onkeyup="gbcount(this.form.memo1,this.form.total1,this.form.used1,this.form.remain1);"></textarea>
<br>
最多字敎ͼ<INPUT disabled maxLength=4 name=total1 size=3 value=500>
已用字数Q?lt;INPUT disabled maxLength=4 name=used1 size=3 value=0>
剩余字数Q?lt;INPUT disabled maxLength=4 name=remain1 size=3 value=500> </form>
</body></html>



larryjava 2007-09-17 13:09 发表评论
]]>
վ֩ģ壺 3dѶ߹ۿ| ߹ۿƵѹ| ѸƵ| ŷŮƵ| XXX2߹ۿƵ| ޸Դ߹ۿ| ձ޿һ| 97ѹۿƵ| һƵ| ޳˾þ| ŷ޴Ƭ| aaaëƬƵѹۿ| С˵ͼۺ| ޾ƷĻ| þþƷһ| igaoƵ| ˳ӰԺ77777| Ʒþþ| ѿbbb| Ƶ߹ۿƵվWWW| avպav߹ۿ | ձѲv| þþþӰԺŮ| ޵һƷӰ| ƷۺרƬþþ | Ƭ߹ۿ| ԻȫƵվ| gayˬˬƵ| ɫһۺ| þþƷƷް| xvideosַ| Ѱvվ߹ۿg| ɫtvվѿ| ձƵѹۿ| ۺϹ˶¼| һ| AVרAWWW| պëƬ| վƵA˫| 91㽶߹ۿȫ| aëƬ߻վ|