??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成av人片一区二区三区,亚洲一区二区三区免费视频,亚洲国产精品一区 http://m.tkk7.com/larry/hibernate、spring、webwork、struts、Portal、ajax技术交?/description>zh-cn Tue, 13 May 2025 18:36:36 GMT Tue, 13 May 2025 18:36:36 GMT 60 Java中抽象类和接口的区别 http://m.tkk7.com/larry/archive/2008/11/26/242753.htmllarryjava larryjava Wed, 26 Nov 2008 03:24:00 GMT http://m.tkk7.com/larry/archive/2008/11/26/242753.html http://m.tkk7.com/larry/comments/242753.html http://m.tkk7.com/larry/archive/2008/11/26/242753.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/242753.html http://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>
]]>面试记录 http://m.tkk7.com/larry/archive/2008/11/26/242752.htmllarryjava larryjava Wed, 26 Nov 2008 03:23:00 GMT http://m.tkk7.com/larry/archive/2008/11/26/242752.html http://m.tkk7.com/larry/comments/242752.html http://m.tkk7.com/larry/archive/2008/11/26/242752.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/242752.html http://m.tkk7.com/larry/services/trackbacks/242752.html 1.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.
]]> spring+quartz的定时器功能 http://m.tkk7.com/larry/archive/2008/11/06/239068.htmllarryjava larryjava Thu, 06 Nov 2008 09:06:00 GMT http://m.tkk7.com/larry/archive/2008/11/06/239068.html http://m.tkk7.com/larry/comments/239068.html http://m.tkk7.com/larry/archive/2008/11/06/239068.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/239068.html http://m.tkk7.com/larry/services/trackbacks/239068.html
<!-- 要调度的对象 -->
< bean id ="job" class ="com.ApManager.util.TJob" >
< property name ="scheduler" ref ="schedulerFactory" />
< property name ="scheduleInfoManager" ref ="scheduleInfoManager" />
</ bean >
<!-- 定义目标bean和bean中的Ҏ -->
< bean id ="jobtask" class ="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
< property name ="targetObject" >
< ref local ="job" />
</ property >
< property name ="targetMethod" >
< value > doAuth </ value >
</ property >
< property name ="concurrent" value ="false" /> <!-- 对于相同的JobDetailQ当指定多个Trigger? 很可能第一个job完成之前Q第二个job开始了。指定concurrent设ؓfalseQ多个job不会q发q行Q第二个job不会在W一个job完成之前开?nbsp; -->
</ bean >
<!-- 定义触发的时?nbsp; -->
< bean id = "cron" class = "org.springframework.scheduling.quartz.CronTriggerBean" >
< property name ="jobDetail" >
< ref bean ="jobtask" />
</ property >
< property name ="cronExpression" >
< value > 0 * 11 * * ? </ value >
</ property >
</ bean >
<!-- ȝ?nbsp; -->
< bean autowire = "no" class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name ="triggers" > <!-- triggersQ通过再添加其他的ref元素可在list中放|多个触发器 -->
< list >
< ref local ="cron" />
</ list >
</ property >
</ bean >
W二通过spring中的SimpleTrigger单触发器实现
< bean id ="simpleTrigger" class ="org.springframework.scheduling.quartz.SimpleTriggerBean" >
< property name ="jobDetail" >
< ref bean ="methodInvokingJobDetail" />
</ property >
< property name ="startDelay" >
< value > 1000 </ value >
</ property >
< property name ="repeatInterval" >
< value > 3000 </ value >
</ property >
</ bean >
参考:
http://www.javaeye.com/topic/115666
http://www.javaeye.com/topic/117244
]]> 教你一步步搭徏功能强大的开源邮件服?/title> http://m.tkk7.com/larry/archive/2008/09/19/230016.htmllarryjava larryjava Fri, 19 Sep 2008 12:41:00 GMT http://m.tkk7.com/larry/archive/2008/09/19/230016.html http://m.tkk7.com/larry/comments/230016.html http://m.tkk7.com/larry/archive/2008/09/19/230016.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/230016.html http://m.tkk7.com/larry/services/trackbacks/230016.html
Z Postfix + MySQL 的文档:http://www.iredmail.org/wiki/index.php/IRedMail-doc-MySQL-0.2
Z Postfix + OpenLDAP 的文档:http://www.iredmail.org/wiki/index.php/IRedMail-doc-OpenLDAP-0.2
Extmail webmailpȝ http://www.extmail.org/
Postfix http://www.postfix.org.cn
]]> Hibernate sum 函数的?/title> http://m.tkk7.com/larry/archive/2008/05/09/199470.htmllarryjava larryjava Fri, 09 May 2008 05:17:00 GMT http://m.tkk7.com/larry/archive/2008/05/09/199470.html http://m.tkk7.com/larry/comments/199470.html http://m.tkk7.com/larry/archive/2008/05/09/199470.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/199470.html http://m.tkk7.com/larry/services/trackbacks/199470.html 使用Hibernate的sum函数q行数据的统计时,出现一个错?
String sql = " select SUM(nf.fee) from CFee as nf where nf.adminAccount='testaccount' " ;
public long getListSqlCountsLong(String sql) {
beginTransaction();
List li = getSession().createQuery(sql).list();
if (li == null || li.isEmpty()) {
return 0 ;
} else { return ((Integer) li.get( 0 )).longValue();
}
}
q样使用报null错误.
List的size明明{于1,但li.get(0)q是为空.(数据库中查询的̎号sum本来׃ؓnull??可能?)
解决Ҏ:
String sql = " select SUM(nf.fee) from CFee as nf where nf.adminAccount='testaccount' " ;
public long getListSqlCountsLong(String sql) {
beginTransaction();
List li = getSession().createQuery(sql).list();
if (li == null || li.isEmpty()) {
return 0 ;
} else {
if (li.get( 0 ) == null ) {
return 0 ;
}
return ((Integer) li.get( 0 )).longValue();
}
}
解决Ҏ很简?是增加一个判断就可以?如果li.get(0)为空,则返?,不ؓI?q回?
]]> 关于JavaScript的gzip静态压~方? http://m.tkk7.com/larry/archive/2008/02/22/181333.htmllarryjava larryjava Fri, 22 Feb 2008 03:32:00 GMT http://m.tkk7.com/larry/archive/2008/02/22/181333.html http://m.tkk7.com/larry/comments/181333.html http://m.tkk7.com/larry/archive/2008/02/22/181333.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/181333.html http://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
]]> Apache + Tomcat + Linux 集群和均衡负?QSession 同步复制Q?配置实践指南 http://m.tkk7.com/larry/archive/2008/01/13/175024.htmllarryjava larryjava Sun, 13 Jan 2008 12:48:00 GMT http://m.tkk7.com/larry/archive/2008/01/13/175024.html http://m.tkk7.com/larry/comments/175024.html http://m.tkk7.com/larry/archive/2008/01/13/175024.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/175024.html http://m.tkk7.com/larry/services/trackbacks/175024.html l过我的多次试实践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
]]> 关闭览器窗口时事g http://m.tkk7.com/larry/archive/2007/12/11/166916.htmllarryjava larryjava Tue, 11 Dec 2007 05:35:00 GMT http://m.tkk7.com/larry/archive/2007/12/11/166916.html http://m.tkk7.com/larry/comments/166916.html http://m.tkk7.com/larry/archive/2007/12/11/166916.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/166916.html http://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 >
]]> 更新记录后关闭子H口q刷新父H口的Javascript http://m.tkk7.com/larry/archive/2007/12/05/165521.htmllarryjava larryjava Wed, 05 Dec 2007 07:04:00 GMT http://m.tkk7.com/larry/archive/2007/12/05/165521.html http://m.tkk7.com/larry/comments/165521.html http://m.tkk7.com/larry/archive/2007/12/05/165521.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/165521.html http://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
]]> 限制用户在文本框输入的字? http://m.tkk7.com/larry/archive/2007/09/17/145816.htmllarryjava larryjava Mon, 17 Sep 2007 05:09:00 GMT http://m.tkk7.com/larry/archive/2007/09/17/145816.html http://m.tkk7.com/larry/comments/145816.html http://m.tkk7.com/larry/archive/2007/09/17/145816.html#Feedback 0 http://m.tkk7.com/larry/comments/commentRss/145816.html http://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>
]]>
վ֩ģ壺
3dѶ߹ۿ |
߹ۿƵѹ |
ѸƵ |
ŷŮƵ |
XXX2߹ۿƵ |
Դ߹ۿ |
ձһ |
97ѹۿƵ |
һƵ |
˾þ |
ŷƬ |
aaaëƬƵѹۿ |
С˵ͼۺ |
ƷĻ |
þþƷһ |
igaoƵ |
˳ӰԺ77777 |
Ʒþþ |
ѿbbb |
Ƶ߹ۿƵվWWW |
avպav߹ۿ
|
ձѲv |
þþþӰԺŮ |
һƷӰ |
ƷۺרƬþþ
|
Ƭ߹ۿ |
ԻȫƵվ |
gayˬˬƵ |
ɫһۺ |
þþƷƷް |
xvideosַ |
Ѱvվ߹ۿg |
ɫtvվѿ |
ձƵѹۿ |
ۺϹ˶¼ |
һ |
AVרAWWW |
պëƬ |
վƵA˫ |
91㽶߹ۿȫ |
aëƬվ |