[servlet] Listener 比 load-on-startup Servlet更早初始化
39917.55
我好土,真的。学用了四五年的JAVA,还从没用过 wait/notify,也不清楚它跟synchronized 关键字 相比有什么好处。今天查了些资料,终于明白了:wait/notify 机制是为了避免轮询带来的性能损失。 为了说清道理,我们用“图书馆借书”这个经典例子来作解释。 一本书同时只能借给一个人。现在有一本书,图书馆已经把这本书借了张三。 在简单的synchrnozed 同步机制下,李四如果想借,先要去图书馆查看书有没有还回来。李四是个心急的人,他每天都去图书馆查;而张三看书看得慢,过了半个月才把书还回来,结果李四在这半个月里全都白跑了,浪费了不少交通车费 而如果使用wait/notify机制,李四就不用白忙了。他第一次去图书馆时发现书已借走,就回家静静等待(wait);张三把书还掉后,通知(notify)李四,李四去图书馆拿书即可。整个过程中,李四没有白跑,没浪费钱。 回到计算机世界: 书 — 临界资源,需互斥地访问 张三,李四 — 两个竞争的线程 坐车去图书馆查书 — 轮询 车费 — CPU空间 等待 — wait 通知下一个借书者 — notify 也就是说,若使用简单的synchonized机制实现互斥,会导致线程主动发起轮询,若N次轮询没有成功,就产生了N次的CPU空间浪费;如果加上了 wait/notify机制,就可以避免这些无谓的轮询,节省CPU的消耗。
为什么禁止多重继承?大家都只能含糊其辞 那要继承多种身份,该怎么办? JAVA说 可以实现多个接口。 实现多个接口比继承多个抽象类好在哪?大家只能含糊其辞! 实现多个接口比继承多个抽象类坏在哪?大家心虚地说“没坏处”,或者只能再次含糊其辞! “组团忽悠! ”
假设你要给一个国家作网站,这个国家的第一级行政单位都叫“省”,你要介绍各个省的风土人情 如果不用ResourceBundle,就要将“省”字写在JSP里,或者数据库里,一个省一个JSP,或者一条数据库记录 有一天,翻译突然告诉你说:“不好意思,我译错了,不应叫‘省’,而应叫‘郡’”,那你就要改死了,一个JSP一个JSP地改,或者一条一条地更新数据库记录 如果用了ResourceBundle,就可以把所有的行政单位名都写在同一个文件中,当省变郡时,只需要在这个文件中批量替换一下就成,非常方便
这个方法是会抛出IOException的。 我们写代码调用这个方法时,调用者往往本身也是throws IOException,因此IDE不会提醒我们处理sendClientMsg()引起的异常,结果一旦sendClientMsg()出错,调用方法也整个地出错
统一为: 32位16进制数
否则的话,一个进程试图作日滚动时会报错:不能更改日志文件名。因为这个文件名被另一个进程锁住了
我们知道指定 display:columan 的 sortable=True时,默认是按display:column的tagBody的字典序来排序的;但是如果这个字段的值是数字类型的怎么办? 我们知道如果指定了sortProperty了,则按这个属性的值来排序;但是如果类集中的每个记录不是一个javabean(比如说一个数组),没有property怎么办? 看了文档,发现display:column有一个属性叫做 value,设置好这个value为字段的值,则排序时就按字段值来排序了
如果用XML来配,是这样的: <access-constraint> <ip-filter> <enable>true</enable> <allow-access>true</allow-access> <ip-collection> <client-ip-address>192.168.1.20</client-ip-address> </ip-collection> </ip-filter> </access-constraint> 如果用代码来写,就这样: AccessConstraintConfig accessConstraintConfig = new AccessConstraintConfig(); IpFilterConfig ipFilterConfig = new IpFilterConfig(); ipFilterConfig.setEnable(true); ipFilterConfig.setAllowAccess(true); ipFilterConfig.addClientIpAddress("192.168.1.20"); accessConstraintConfig.setIpFilterConfig(ipFilterConfig); server.setAccessConstraintConfig(accessConstraintConfig); 要注意,QuickServer中,本机实际地址和127.0.0.1这个地址是区别对待的。若本机IP是192.168.1.20: 1.若本机以 telnet 192.168.1.20 方式访问服务器,则应添加的IP是 192.168.1.20 2.若本机以 telnet localhost 方式访问服务器,则应添加的IP是 127.0.0.1
有这样一个配置: log4j.appender.fileAppender.File=theLog.log 问题:那么这个 theLog.log的绝对路径是什么呢? 答曰:${user.dir}/theLog.log 若当前运行的JAVA程序是tomcat应用,那它就是 ${catalina_home/bin/theLog.log