Java

AppFuse 1.9.3 一个奇怪问题: 换了用户之后,看到的菜单项仍和原来看到的一样

估计是缓存的问题,待研究 已经可以排除以下原因:    1.退出时session没有置为无效    2.IE缓存里存放了菜单的源码    3.Appfuse中的userCache设置    最终的成功解决办法:   将struts-menu版本升级到 2.4.3,并将cssHorizontalMenu.vm 和 cssVerticalMenu.vm替换为 appFuse2.0中的版本。    因为struts-menu的官方主页说了 :All users are encouraged to upgrade to at least 2.4.2 as some major performance and security issues were solved in this release. Most of them only affect folks using the VelocityDisplayer.),  

extremeTable比displayTag好用

跟displayTag相比,有下列优点:   1.提供表内搜索功能,不需要手工开发搜索程序   2.排序时是整表排序,而不是像displayTag那样只能页内排序  

每个常数值都应该定义为一个常数变量,其他所有应用该常量的地方都应该通过该定义来存取

    就像C语言里的“宏”一样。如果需求变了,导致常量的值变了,只需要在定义处改一次即可。如果不遵循这个模式,在使用常量的地方直接使用它的值,那么一旦常量值有变,每个使用此值的地方都要变。    不但常量值这样,每种策略、每种规则都应该这样:只定义一次,并作为存取的唯一入口。

多线程程序中要注意捕获java.lang.ThreadDeath

    它的API DOC中写着:    The top-level error handler does not print out a message if ThreadDeath is never caught.     如果你的各个线程相继死去,并且没有报错,那很有可能就是这个东西引起的    程序应该在run()方法内部捕捉这个异常,才能保证Thread不死    Tomcat容器会捕获这个错误    如果在Eclipse内执行某个程序,也会捕获这个错误

用数据包装类比用原始类型作为成员变量的好处

以Integer 和 int 为例进行对比 1.如果成员变量的intValue还未确定,用Integer的话,只须令这个成员为NULL; 但如果用int的话,就必然存在问题,因为一个int成员变量的值总是确定的,即使你没给它赋任何值,它的值就是0 2.对一个对象运用反射机制时,比如setProperty()和getProperty(),都要将Field的值当作对象来处理。Integer成员可以直接用做对象,但int成员还要封装/解封才行 3.充当Map的key时,Integer比int更方便

为什么要用Class.forName() 来装载 JDBC的驱动

    因为Class.forName除了像ClassLoader一样装载驱动类,还会初始化这个驱动类。初始化的一个重要环节就是调用类的静态方法(static代码块)。驱动类在静态方法里将自己注册到DriverManager,只有注册了,驱动才能发生作用。因此,不用Class.forName(驱动类),就不会初始化这个类,这个驱动就会出错,使用驱动的程序就不能正确地执行