web.xml中<context-param>与<init-param>的差别及各自的读取方式

Categories: Java; Tagged with: ; @ February 13th, 2009 19:40

事由: 最近几天看了点Servlet, 打算写一个小程序, 需要在application启动时从web.xml中加载一个参数, 由于仅在Login这个Servlet中使用, 于是我是这样实现的:

  
    
    Login
    Login
    com.insprise.servletstu.Login
    
      maxNumber
      maxNumber
      3
    
  
  
    Login
    /Login
  
  

然后在Login中重写init()方法, 如下:

Calc.MAX_CALCULATION_TIMES_PER_SESSION = Integer.parseInt(this.getInitParameter(Calc.MAX_CALCULATIONAS_PER_SESSION));

功能以实现, 将最大值从web.xml中读取出来, 赋值给一个Global的变量.

===============================承上启下的分割线==============================================

但随着学习的深入, 发现容器并不一定会保持Servlet一直存活, 也许会在Request介绍后Destory掉Login Servlet, 然后如果再次Request Login, 则会重新init(), 于是重新读取web.xml, 重新赋值–明显第一次有效的, 后面的都是无用功.

从逻辑上分析, 该最大值应属于ServletContext级别的数据, 于是应使用Listener, 监听Application初始化, 在Application初始化时读取.

于是我没有改动web.xml, 设置了监听函数:

    public void contextInitialized(ServletContextEvent sce) {
        log.info("Context Started!" + sce.getServletContext());
        ServletContext context = sce.getServletContext();
        Calc.MAX_CALCULATION_TIMES_PER_SESSION = Integer.parseInt(context.getInitParameter(Calc.MAX_CALCULATIONAS_PER_SESSION));
    }

但不论如何都会有NullPoint的错误. 于是意识到该应在web.xml使用<context-param>设定参数, 而非某个<Servlet>下的<init-param>标签. 修改后的web.xml:

 
           maxNumber
           3

=====================================总结性的分割线============================================

总而言之:

使用ServletContext.getInitParameter()方法 可以获得web.xml中的<context-param>参数 – 使用范围很广, 能getServletContext就可以使用.

在Servlet的init()函数中使用this.getInitParameter()获得web.xml的<init-param>参数 – 较为局限的参数. 注意逻辑上的层次划分

使用Eclipse打包Java工程成为Jar

Categories: Java; Tagged with: ; @ February 12th, 2009 15:36

1. Eclipse中右键 Export,

2. 选择Java> Runnable JAR File

3. 选择Launch configuration及输出目录,

finish.

我是一棵秋天的树

Categories: 垃圾山 February 6th, 2009 21:51

听张雨生最多的, 是04年冬末.

大一第一学期, 我的高数挂了. 于是刚过完年, 就赶回学校, 参加重修班, 住在四号楼一楼一个阴暗晦涩的朝东的房间. 外面是一个大树, 不远处以及很远处 目力所及的都是白压压的雪, 如果不是树干上隐约露出来的疤痕, 这棵树便纯粹的融进了这片白中.

那时候的生活很简单, 思想也简单, 宿舍里能玩的东西不多, 只有一台CD, 放了一张张雨生的CD, 不断的放, 有两位从南校区赶来的同胞也很安静, 我们时常不说话, 躺在床上, 不去上课, 只是听歌.

宿舍很简朴, 床是嘎吱嘎吱响的床, 人都是安静消沉的人, 那时候的校园除了肉团般的麻雀,就是零零散散的重修生, 大家都不是很在意时间, 似乎在这个冬季, 都变得与世无争.

说不出来四号楼的味道, 但每次听到张雨生的这首歌, 似乎一下子站在了那个宿舍的窗前, 看外面的麻雀, 在这棵老树上跳来跳去, 屋子里有些暖和, 甚至有些热, 有人躺在床上臆想, 有人趴在桌子上看书, 有人坐在窗前听CD, 他们很安静. 微微打开的窗子传来一麻雀的叫声, 侧开的门传来水房的杂音, 时间, 似乎总是停滞的.

后来有人抱来一台小电视, 白天大家都懒的看, 晚上大家围在一起, 现在已然忘记演的什么电视, 看得什么情节, 只是依稀记得那时候的我们很单纯, 很简单.

05, 06, 07, 08 , 09, 时间像火车一样压了过来, 后来大家再也没有联系, 不知道几年过去了, 大家都变成什么样了?

那个有些腼腆的高个少年, 因为考的不够优秀自愿参加补考, 后来知道他是经济学的高材生, 那个大大咧咧说话满嘴往外喷沫子的哥们再也没有见过, 那个躺在床板上谈古论今的历史系同学也没有了联系, 终于大家都熬完了大学, 四散而去.

继续理解Java基本数据类型, 直接数, Boxing/UnBoxing

Categories: Java; Tagged with: ; @ February 5th, 2009 17:23

Java Types:

Primitive Types: boolean, char, byte, short, int, long, float, double.

Reference Types

直接数:

整数, 浮点数, 单引号括起来的char, 双引号括起来的String, true, false, null;

所有的Primitive Types 在java.lang中都有对应的包装类. 如下:

int i = 1;

使用直接数赋值, 可理解为直接在栈区内使用int, 没有任何Object的创建. 而如果使用new int()进行创建, 则会创建额外无用的Object.

int i = new Integer(1);

在经过JVM编译后, 等同于下:

int i = (new Integer(1)).intValue();

此举将创建一个int的Object, 并将这个Object的intValue()传给i. 此后该对象将废弃不用,等待垃圾回收.

因此, 在多数情况下, 应使用直接数赋值.

	private static Integer getInt() {
		return 1;
	}

	private static int getInitP() {
		return new Integer(1);
	}

以上代码在编译之后的Class文件反编译后的代码, 可立即理解Boxing 与Unboxing :

    private static Integer getInt()
    {
        return Integer.valueOf(1);
    }

    private static int getInitP()
    {
        return (new Integer(1)).intValue();
    }

Java – Final修饰符到底修饰了什么

Categories: Java; Tagged with: ; @ February 5th, 2009 15:09

Final 修饰符在修饰基本数据类型时, 能保证其值不被改变, 但在修饰对象时, Final保证引用本身不变, 而不能保证引用对象的不变.

如下:

		
		final StringBuilder sb = new StringBuilder("Final SB");
		System.out.println(sb.toString());
		StringBuilder sb2 = new StringBuilder(" USB");
		//sb = sb2 //试图修改sb的引用. 编译出错, final变量不可被更改
		sb.append(sb2); //修改sb引用对象, final不能保证引用对象不被改变. 编译通过.
		System.out.println(sb.toString());

输出:

Final SB

Final SB USB

Newer Posts <-> Older Posts



// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.