随笔-159  评论-114  文章-7  trackbacks-0
 

学习过程

1,首先了解Documentum的架构

2,了解Dfc是什么,Dmcl是什么,使用Dfc进行相应的开发。其使用习惯大概和Hibernate相似。

3,了解WDK开发过程,什么是组件,什么是Container,什么是Action,什么是Strings



为了开发wdk,必须使用Eclipse建立一个标准的web项目才能进行,所以必须要有个部署方便的策略

<?xml version="1.0" encoding="gb2312"?>

<!-- 
   Build file for "WebTop WDK FILE LIST FUNCTION" 
   Creation date : 2006-05-15 
   Updated date : 2006-05-15
   Author:  ljl
-->
<project name="BmccBaseSp" default="main" basedir=".">

     <property name="work.path"      value="C:/workspace"/>
  <property name="webtop.war.path"   value="C:/Program Files/WebSphere/AppServer/installedApps/10.4.7.140/webtop_war.ear/webtop.war"/>
     <property name="version"            value="1.0"/>
    
<!-- Tell ant to use my environment variables -->     
      <property name="productName"        value="FILE LIST for WORK FLOW"/>
      <property name="build.dir"          value="${basedir}/WebRoot/WEB-INF/classes" />
      <property name="src.dir"            value="${basedir}/src"/>
      <property name="docs.dir"           value="${basedir}/docs"/>
      <property name="custom.dir"    value="${basedir}/WebRoot/custom"/>
     
      <property name="encoding.name"      value="GB2312"/>
     
<!-- Win XP -->   
      <property name="deploy.WinXP.dir"   value="${work.path}/WinXP/deploy${version}"/>
      <property name="deploy.WebTop.dir"  value="${webtop.war.path}"/>

<!-- class path -->
      <path id="class.path">
          <fileset dir="${basedir}/WebRoot/WEB-INF/lib/">
              <include name="**/*.jar"/>
              <include name="**/*.zip"/>
          </fileset>
      </path>
     

<!-- clean dir -->
      <target name="remove">
          <delete dir="${build.dir}" includeEmptyDirs="true"/>
          <delete dir="${deploy.WinXP.dir}" includeEmptyDirs="true"/>
      </target>

<!-- construct dir -->
      <target name="makeDir">
          <mkdir dir="${build.dir}"/>
          <mkdir dir="${deploy.WinXP.dir}"/>
      </target>

<!-- compile -->     
      <target name="compile" depends="makeDir">
         <javac     srcdir="${src.dir}"
                    destdir="${build.dir}"
                    debug="on"
                    deprecation="off">
          <include   name="**/*.java"/>
          <classpath refid="class.path"/>
        </javac>
      </target>


<!-- start target task -->     
      <target name="main" depends="remove, makeDir, compile"/>
     
     

<!-- ============================================================= -->         
<!--                                api docs                       -->
<!-- ============================================================= --> 
<!-- remove old javadocs -->
      <target name="removeDocDir">
          <delete dir="${docs.dir}" includeEmptyDirs="true"/>
      </target>

<!-- make docs dir -->
      <target name="makeDocDir">
          <mkdir dir="${docs.dir}"/>
      </target>
     
<!-- create javadocs -->
      <target name="docs" depends="removeDocDir, makeDocDir">          
          <javadoc packagenames="com.documentum.custom.*"
               sourcepath="${basedir}"
               destdir="${docs.dir}"
               author="true"
               version="true"
               use="true"
               charset="${encoding.name}"
               windowtitle="${productName}: ${version}">
           </javadoc>
           <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
           <bottom><![CDATA[<i>Copyright &#169; 2006 Dummy Corp. All Rights Reserved.</i>]]></bottom>
           <link href="http://java.sun.com/j2se/1.4/docs/api/usr/web/work/j2se/1.4/docs/api"/>
      </target>
    

     
<!-- ============================================================= -->         
<!--                            WinXP deploy                       -->
<!-- ============================================================= --> 
     
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  -->
<!-- start deployWin2KBE task -->     
   <target name="deployWinXP" >
       <delete dir="${deploy.WinXP.dir}" includeEmptyDirs="true"/>         
       <mkdir  dir="${deploy.WinXP.dir}"/>    
 
 <!-- difference -->
       <copy    todir="${deploy.WinXP.dir}/classes">
                <fileset dir="${basedir}/WebRoot/WEB-INF/classes"
                         includes="**/**"/>
       </copy> 
       <copy    todir="${deploy.WinXP.dir}">
                <fileset dir="${basedir}/WebRoot/custom"
                         includes="**/**"
                         excludes="**/.bak"/>
       </copy>
 
   </target>
 
  <target name="deployTOwebtop">
     <copy  todir="${deploy.WebTop.dir}/WEB-INF/classes">
        <fileset dir="${basedir}/WebRoot/WEB-INF/classes"
                               includes="**/**"/>
     </copy>
     <copy     todir="${deploy.WebTop.dir}/custom">
            <fileset dir="${basedir}/WebRoot/custom"
                            includes="**/**"
                            excludes="**/.bak"/>
     </copy>
  </target>
       
<!-- run all tasks -->
     <target name="newDeployWin2k" depends="main, deployWinXP"/>
  <target name="realDeployWebTop" depends="deployTOwebtop"/>

</project>

posted @ 2006-07-18 17:32 北国狼人的BloG 阅读(1257) | 评论 (3)编辑 收藏
西谚说:“年轻的本钱,就是有时间去失败第二次。”等到我们老了,就已经没人肯请我们去工作了,所以年轻时努力奋斗是很重要的。
  一位哲人说:“你的心态就是你真正的主人。”一位伟人说:“要么你去驾驭生命,要么是生命驾驭你。你的心态决定谁是坐骑,谁是骑师。”

宁可去碰壁,也不要在家里面壁

  当你遇到挫折时,给你几点小建议:
  找个地方喝点酒,沉醉一回
  找个迪厅跳跳舞,放松一下
  找帮朋友侃侃山,开怀一番
  积极行动起来,分析失败的原因,找出行动的方法

找新工作嘛,怕什么呢!!!!

年轻不尝试新的工作,就是扯淡。
posted @ 2006-07-16 20:23 北国狼人的BloG 阅读(414) | 评论 (0)编辑 收藏
颈椎病是一种严重危害伏案工作者健康的疾病,它的表现多种多样。主要有颈背疼痛、上肢无力、手指发麻,头晕、恶心甚至视物模糊,吞咽模糊。 令人遗憾的是,到目前为止,全世界对这种令人头痛的疾病尚无有效方法。最近脚底研究专家发现。脚底集合了身体的全部器官司的反射区。通过治疗足底反射区即 可产生令人惊奇的疗效。

  颈椎在足部的反射区是:双足拇趾趾腹根部横纹处,双足外侧第五趾骨中部(足外侧最突出点中部),颈部肌肉反射区是:双足底肢趾后方的2cm宽区域。

  按摩方法是:用拇指指尖或指腹;也可用第二指或第三指的关节,以数毫米幅度移动。力度最初较轻,渐渐增强,以稍有痛感为宜,按摩时间可自选抽空进行。最好是每天早晚各一次,每次10-30分钟,坚持两周以后对一般颈椎病患者即可出现神奇效果。

  办公室工作人员如何预防颈椎病

  办公室工作人员首先在坐姿上尽可能保持自然的端坐位,头部略微前倾,保持头、颈、胸的正常生理曲线;尚可升高或降低桌面与椅子的高度比例以避免头颈部过度后仰或过度前屈;此外,定制一与桌面呈10~30度的斜面工作板,更有利于坐姿的调整。

  对于长期伏案工作者,应在1~2小时左右,有目的地让头颈部向左右转动数次,转动时应轻柔、缓慢,以达到该方向的最大运动范围为准;或行夹肩运动,两肩慢 慢紧缩 3~5秒钟,尔后双肩向上坚持3~5秒钟,重复6~8次;也可利用两张办公桌,两手撑于桌面,两足腾空,头往后仰,坚持5秒钟,重复3~5次。

  当长时间近距离看物,尤其是处于低头状态者,既影响颈椎,又易引起视力疲劳,甚至诱发屈光不正。因此,每当伏案过久后,应抬头向远方眺望半分钟左右。这样既可消除疲劳感,又有利于颈椎的保健。

  八式颈椎保健操

  这里特介绍八式颈椎保健操,以供大家在平时练习。

  前俯后仰:做操前,先自然站立,双目平视,双脚略分开,与两肩平行,然后双手叉腰。动作时先抬头后仰,同时吸气,双眼望天,停留片刻;然后缓慢向前胸部位 低头,同时呼气,双眼看地。做此动作时,要闭口,使下颌尽量紧贴前胸,停留片刻后,再上下反复做四次。动作要旨是:舒展、轻松、缓慢,以不感到难受为宜。

  举 臂转身:做操前,先自然站立,双目平视,双脚略分开,与肩同宽,双手自然下垂。动作时先举右臂,手掌向下,抬头目视手心,身体慢慢转向左侧,停留片刻。在 转身时,要注意脚跟转动45度,身体重心向前倾,然后身体再转向右后侧,旋转时要慢慢吸气,回转时慢慢呼气,整个动作要缓慢、协调。转动颈、腰部时,要尽 量转到不能转为止,停留片刻,回到自然式后,再换左臂。而换左臂时,放下的手要沿耳根慢慢压下,换好手臂后同样再做,来回反复做两次。

  左右旋转:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手叉腰。动作时先将头部缓慢转向左侧,同时吸气于胸,让右侧颈部伸直后,停留片刻,再 缓慢转向左侧,同时呼气,让左边颈部伸直后,停留片刻。这样反复交替做四次。要注意的是,整套动作要轻松、舒展,以不感到头晕为宜。

  提肩缩颈:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手自然下垂。动作时双肩慢慢提起,颈部尽量往下缩,停留片刻后,双肩慢慢放松地放下, 头颈自然伸出,还原自然,然后再将双肩用力往下沉,头颈部向上拔伸,停留片刻后,双肩放松,并自然呼气。注意在缩伸颈的同时要慢慢吸气,停留时要憋气,松 肩时要尽量使肩、颈部放松。回到自然式后,再反复做四次。

  左右摆动:做操前,先自然站立,双目平视,双脚略分开,与肩平行,双手叉腰。动作时头部缓缓向左户倾斜,使左耳贴于左肩,停留片刻后,头部返回中位;然后 再向右肩左耳贴于在左肩,停留片刻后,头部返回中位;然后再向右肩倾斜,同样右耳要贴近右肩,停留片刻后,再回到中位。这样左右摆动反复做四次,在头部摆 动时需吸气,回到中位时慢慢呼气,做操时双肩、颈部要尽量放松,动作以慢而稳为佳。

  波浪屈伸:做操前,先自然站立,双目平视,双腿略分开,与肩平行,双手自然下垂。动作时下颌往下前方波浪式屈伸,在做该动作时,下颌尽量贴近前胸,双肩扛 起,下颌慢慢屈起,胸部前挺,双肩往后上下慢慢运动。下颌屈伸时要慢慢吸气,抬头还原时慢慢呼气,双肩放松,做两次停留片刻;然后再倒过来做下颌伸屈运 动,由上往下时吸气,还原时呼气,做两次,正反各练两次。

  颈部活动的三种常见方法

  (1)颈项牵拉:先做立正姿式,两脚稍分开,两手撑腰。练习时:头、颈向右转,双目向右后方看;还原至预备姿式;低头看地,以下颌能触及胸骨柄为佳;还原。动作宜缓慢进行,以呼吸一次做一个动作为宜。左右交替运动。

  (2)往后观看:预备姿势同上,练习时:头颈向右转,双目向右后方看;还原至预备姿势;头颈向左转,双目向左后方看;还原。动作要配合呼吸,缓慢进行。

  (3)回头望月:预备姿势同上,练习时:头颈向右后上方尽力转,上身也随同略向右转,双目转视右后上方,仰望天空;还原至预备姿势;头颈向左后上方尽力转,上身也随同略向左转,双目转视左后上方,仰望天空;还原。呼吸一次做一个动作。

  以上三个动作,主要是练习颈部的伸屈与旋转功能。轻症患者可加练侧弯动作。眩晕型患者如做颈部旋转动作有副作用,宜暂停练习往后观看及回头望月动作。

posted @ 2006-06-29 07:23 北国狼人的BloG 阅读(282) | 评论 (0)编辑 收藏

我在参加一个比赛。

欢迎大家都来我的网站参观一下。

http://home.fego.cn/members/lhulcn2008/default.aspx

多谢支持!


当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:

       bootstrap classloader
                |
       extension classloader
                |
       system classloader

bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类。在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用- D选项指定sun.boot.class.path系统属性值可以指定附加的类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。大家可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库:
   URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
   for (int i = 0; i < urls.length; i++) {
     System.out.println(urls.toExternalform());
   }
在我的计算机上的结果为:
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/dom.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/sax.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xalan-2.3.1.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xercesImpl-2.0.0.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xml-apis.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xsltc.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/i18n.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/sunrsasign.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/jsse.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/jce.jar
文件:/C:/j2sdk1.4.1_01/jre/lib/charsets.jar
文件:/C:/j2sdk1.4.1_01/jre/classes
这时大家知道了为什么我们不需要在系统属性CLASSPATH中指定这些类库了吧,因为JVM在启动的时候就自动加载它们了。

extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。在这个实例上调用方法getParent()总是返回空值null,因为引导加载器bootstrap classloader不是一个真正的ClassLoader实例。所以当大家执行以下代码时:
   System.out.println(System.getProperty("java.ext.dirs"));
   ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
   System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());
结果为:
C:\j2sdk1.4.1_01\jre\lib\ext
the parent of extension classloader : null
extension classloader是system classloader的parent,而bootstrap classloader是extension classloader的parent,但它不是一个实际的classloader,所以为null。

system classloader -系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。总能通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。执行以下代码即可获得:
   System.out.println(System.getProperty("java.class.path"));
输出结果则为用户在系统属性里面设置的CLASSPATH。
classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;委托机制则是先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。


每个ClassLoader加载Class的过程是:
1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
2.如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
3.请求parent classloader载入,如果成功到8,不成功到5
4.请求jvm从bootstrap classloader中载入,如果成功到8
5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.
6.从文件中载入Class,到8.
7.抛出ClassNotFoundException.
8.返回Class.

其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

类加载器的顺序是:
先是bootstrap classloader,然后是extension classloader,最后才是system classloader。大家会发现加载的Class越是重要的越在靠前面。这样做的原因是出于安全性的考虑,试想如果system classloader“亲自”加载了一个具有破坏性的“java.lang.System”类的后果吧。这种委托机制保证了用户即使具有一个这样的类,也把它加入到了类路径中,但是它永远不会被载入,因为这个类总是由bootstrap classloader来加载的。大家可以执行一下以下的代码:
   System.out.println(System.class.getClassLoader());
将会看到结果是null,这就表明java.lang.System是由bootstrap classloader加载的,因为bootstrap classloader不是一个真正的ClassLoader实例,而是由JVM实现的,正如前面已经说过的。

下面就让我们来看看JVM是如何来为我们来建立类加载器的结构的:
sun.misc.Launcher,顾名思义,当你执行java命令的时候,JVM会先使用bootstrap classloader载入并初始化一个Launcher,执行下来代码:
  System.out.println("the Launcher's classloader is "+sun.misc.Launcher.getLauncher().getClass().getClassLoader());
结果为:
  the Launcher's classloader is null (因为是用bootstrap classloader加载,所以class loader为null)
Launcher 会根据系统和命令设定初始化好class loader结构,JVM就用它来获得extension classloader和system classloader,并载入所有的需要载入的Class,最后执行java命令指定的带有静态的main方法的Class。extension classloader实际上是sun.misc.Launcher$ExtClassLoader类的一个实例,system classloader实际上是sun.misc.Launcher$AppClassLoader类的一个实例。并且都是 java.net.URLClassLoader的子类。

让我们来看看Launcher初试化的过程的部分代码。

Launcher的部分代码:
public class Launcher  {
   public Launcher() {
       ExtClassLoader extclassloader;
       try {
           //初始化extension classloader
           extclassloader = ExtClassLoader.getExtClassLoader();
       } catch(IOException ioexception) {
           throw new InternalError("Could not create extension class loader");
       }
       try {
           //初始化system classloader,parent是extension classloader
           loader = AppClassLoader.getAppClassLoader(extclassloader);
       } catch(IOException ioexception1) {
           throw new InternalError("Could not create application class loader");
       }
       //将system classloader设置成当前线程的context classloader(将在后面加以介绍)
       Thread.currentThread().setContextClassLoader(loader);
       ......
   }
   public ClassLoader getClassLoader() {
       //返回system classloader
       return loader;
   }
}

extension classloader的部分代码:
static class Launcher$ExtClassLoader extends URLClassLoader {

   public static Launcher$ExtClassLoader getExtClassLoader()
       throws IOException
   {
       File afile[] = getExtDirs();
       return (Launcher$ExtClassLoader)AccessController.doPrivileged(new Launcher$1(afile));
   }
  private static File[] getExtDirs() {
       //获得系统属性“java.ext.dirs”
       String s = System.getProperty("java.ext.dirs");
       File afile[];
       if(s != null) {
           StringTokenizer stringtokenizer = new StringTokenizer(s, File.pathSeparator);
           int i = stringtokenizer.countTokens();
           afile = new File;
           for(int j = 0; j < i; j++)
               afile[j] = new File(stringtokenizer.nextToken());

       } else {
           afile = new File[0];
       }
       return afile;
   }
}

system classloader的部分代码:
static class Launcher$AppClassLoader extends URLClassLoader
{

   public static ClassLoader getAppClassLoader(ClassLoader classloader)
       throws IOException
   {
       //获得系统属性“java.class.path”
       String s = System.getProperty("java.class.path");
       File afile[] = s != null ? Launcher.access$200(s) : new File[0];
       return (Launcher$AppClassLoader)AccessController.doPrivileged(new Launcher$2(s, afile, classloader));
   }
}

看了源代码大家就清楚了吧,extension classloader是使用系统属性“java.ext.dirs”设置类搜索路径的,并且没有parent。system classloader是使用系统属性“java.class.path”设置类搜索路径的,并且有一个parent classloader。Launcher初始化extension classloader,system classloader,并将system classloader设置成为context classloader,但是仅仅返回system classloader给JVM。

  这里怎么又出来一个context classloader呢?它有什么用呢?我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.


好了,现在我们了解了classloader的结构和工作原理,那么我们如何实现在运行时的动态载入和更新呢?只要我们能够动态改变类搜索路径和清除classloader的cache中已经载入的Class就行了,有两个方案,一是我们继承一个classloader,覆盖loadclass方法,动态的寻找Class文件并使用defineClass方法来;另一个则非常简单实用,只要重新使用一个新的类搜索路径来new一个classloader就行了,这样即更新了类搜索路径以便来载入新的Class,也重新生成了一个空白的cache(当然,类搜索路径不一定必须更改)。噢,太好了,我们几乎不用做什么工作,java.netURLClassLoader正是一个符合我们要求的classloader!我们可以直接使用或者继承它就可以了!

这是j2se1.4 API的doc中URLClassLoader的两个构造器的描述:
URLClassLoader(URL[] urls)
         Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader.
URLClassLoader(URL[] urls, ClassLoader parent)
         Constructs a new URLClassLoader for the given URLs.
其中URL[] urls就是我们要设置的类搜索路径,parent就是这个classloader的parent classloader,默认的是system classloader。


好,现在我们能够动态的载入Class了,这样我们就可以利用newInstance方法来获得一个Object。但我们如何将此Object造型呢?可以将此Object造型成它本身的Class吗?

首先让我们来分析一下java源文件的编译,运行吧!javac命令是调用“JAVA_HOME/lib/tools.jar”中的“com.sun.tools.javac.Main”的compile方法来编译:

   public static int compile(String as[]);

   public static int compile(String as[], PrintWriter printwriter);

返回0表示编译成功,字符串数组as则是我们用javac命令编译时的参数,以空格划分。例如:
javac -classpath c:\foo\bar.jar;. -d c:\ c:\Some.java
则字符串数组as为{"-classpath","c:\\foo\\bar.jar;.","-d","c:\\","c:\\Some.java"},如果带有PrintWriter参数,则会把编译信息出到这个指定的printWriter中。默认的输出是System.err。

其中 Main是由JVM使用Launcher初始化的system classloader载入的,根据全盘负责原则,编译器在解析这个java源文件时所发现的它所依赖和引用的所有Class也将由system classloader载入,如果system classloader不能载入某个Class时,编译器将抛出一个“cannot resolve symbol”错误。

所以首先编译就通不过,也就是编译器无法编译一个引用了不在CLASSPATH中的未知Class的java源文件,而由于拼写错误或者没有把所需类库放到CLASSPATH中,大家一定经常看到这个“cannot resolve symbol”这个编译错误吧!

其次,就是我们把这个Class放到编译路径中,成功的进行了编译,然后在运行的时候不把它放入到CLASSPATH中而利用我们自己的 classloader来动态载入这个Class,这时候也会出现“java.lang.NoClassDefFoundError”的违例,为什么呢?

我们再来分析一下,首先调用这个造型语句的可执行的Class一定是由JVM使用Launcher初始化的system classloader载入的,根据全盘负责原则,当我们进行造型的时候,JVM也会使用system classloader来尝试载入这个Class来对实例进行造型,自然在system classloader寻找不到这个Class时就会抛出“java.lang.NoClassDefFoundError”的违例。

OK,现在让我们来总结一下,java文件的编译和Class的载入执行,都是使用Launcher初始化的system classloader作为类载入器的,我们无法动态的改变system classloader,更无法让JVM使用我们自己的classloader来替换system classloader,根据全盘负责原则,就限制了编译和运行时,我们无法直接显式的使用一个system classloader寻找不到的Class,即我们只能使用Java核心类库,扩展类库和CLASSPATH中的类库中的Class。

还不死心!再尝试一下这种情况,我们把这个Class也放入到CLASSPATH中,让system classloader能够识别和载入。然后我们通过自己的classloader来从指定的class文件中载入这个Class(不能够委托 parent载入,因为这样会被system classloader从CLASSPATH中将其载入),然后实例化一个Object,并造型成这个Class,这样JVM也识别这个Class(因为 system classloader能够定位和载入这个Class从CLASSPATH中),载入的也不是CLASSPATH中的这个Class,而是从 CLASSPATH外动态载入的,这样总行了吧!十分不幸的是,这时会出现“java.lang.ClassCastException”违例。

为什么呢?我们也来分析一下,不错,我们虽然从CLASSPATH外使用我们自己的classloader动态载入了这个Class,但将它的实例造型的时候是JVM会使用system classloader来再次载入这个Class,并尝试将使用我们的自己的classloader载入的Class的一个实例造型为system classloader载入的这个Class(另外的一个)。大家发现什么问题了吗?也就是我们尝试将从一个classloader载入的Class的一个实例造型为另外一个classloader载入的Class,虽然这两个Class的名字一样,甚至是从同一个class文件中载入。但不幸的是JVM 却认为这个两个Class是不同的,即JVM认为不同的classloader载入的相同的名字的Class(即使是从同一个class文件中载入的)是不同的!这样做的原因我想大概也是主要出于安全性考虑,这样就保证所有的核心Java类都是system classloader载入的,我们无法用自己的classloader载入的相同名字的Class的实例来替换它们的实例。

看到这里,聪明的读者一定想到了该如何动态载入我们的Class,实例化,造型并调用了吧!

那就是利用面向对象的基本特性之一的多形性。我们把我们动态载入的Class的实例造型成它的一个system classloader所能识别的父类就行了!这是为什么呢?我们还是要再来分析一次。当我们用我们自己的classloader来动态载入这我们只要把这个Class的时候,发现它有一个父类Class,在载入它之前JVM先会载入这个父类Class,这个父类Class是system classloader所能识别的,根据委托机制,它将由system classloader载入,然后我们的classloader再载入这个Class,创建一个实例,造型为这个父类Class,注意了,造型成这个父类 Class的时候(也就是上溯)是面向对象的java语言所允许的并且JVM也支持的,JVM就使用system classloader再次载入这个父类Class,然后将此实例造型为这个父类Class。大家可以从这个过程发现这个父类Class都是由 system classloader载入的,也就是同一个class loader载入的同一个Class,所以造型的时候不会出现任何异常。而根据多形性,调用这个父类的方法时,真正执行的是这个Class(非父类 Class)的覆盖了父类方法的方法。这些方法中也可以引用system classloader不能识别的Class,因为根据全盘负责原则,只要载入这个Class的classloader即我们自己定义的 classloader能够定位和载入这些Class就行了。

这样我们就可以事先定义好一组接口或者基类并放入CLASSPATH中,然后在执行的时候动态的载入实现或者继承了这些接口或基类的子类。还不明白吗?让我们来想一想Servlet吧,web application server能够载入任何继承了Servlet的Class并正确的执行它们,不管它实际的Class是什么,就是都把它们实例化成为一个Servlet Class,然后执行Servlet的init,doPost,doGet和destroy等方法的,而不管这个Servlet是从web- inf/lib和web-inf/classes下由system classloader的子classloader(即定制的classloader)动态载入。说了这么多希望大家都明白了。在applet,ejb等容器中,都是采用了这种机制.

对于以上各种情况,希望大家实际编写一些example来实验一下。

最后我再说点别的, classloader虽然称为类加载器,但并不意味着只能用来加载Class,我们还可以利用它也获得图片,音频文件等资源的URL,当然,这些资源必须在CLASSPATH中的jar类库中或目录下。我们来看API的doc中关于ClassLoader的两个寻找资源和Class的方法描述吧:
        public URL getResource(String name)
        用指定的名字来查找资源,一个资源是一些能够被class代码访问的在某种程度上依赖于代码位置的数据(图片,音频,文本等等)。
               一个资源的名字是以'/'号分隔确定资源的路径名的。
               这个方法将先请求parent classloader搜索资源,如果没有parent,则会在内置在虚拟机中的classloader(即bootstrap classloader)的路径中搜索。如果失败,这个方法将调用findResource(String)来寻找资源。
        public static URL getSystemResource(String name)
               从用来载入类的搜索路径中查找一个指定名字的资源。这个方法使用system class loader来定位资源。即相当于ClassLoader.getSystemClassLoader().getResource(name)。

例如:
   System.out.println(ClassLoader.getSystemResource("java/lang/String.class"));
的结果为:
   jar:文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar!/java/lang/String.class
表明String.class文件在rt.jar的java/lang目录中。
因此我们可以将图片等资源随同Class一同打包到jar类库中(当然,也可单独打包这些资源)并添加它们到class loader的搜索路径中,我们就可以无需关心这些资源的具体位置,让class loader来帮我们寻找了!

posted @ 2006-05-25 22:49 北国狼人的BloG 阅读(6477) | 评论 (6)编辑 收藏
     摘要: 面试经常问一些模棱两可的问题,也就是一些在一些条件成立时,才能给出确定答案的问题。比如问Java是否支持多继承。那么回答要缜密,接口支持,类不支持。多继承导致网状继承结构。  F            Fsoft          bed    softbedF这层的成员变量会在softbed会出现两份。所以在C++中采用虚继承来解决,达到了一种菱形结构。         Fsoft       ...  阅读全文
posted @ 2006-04-22 12:34 北国狼人的BloG 阅读(520) | 评论 (2)编辑 收藏

 
积极心态的力量之一:改变世界的力量

积极心态的力量之二:正确思考的力量

积极心态的力量之三:探索心理的力量

积极心态的力量之四:探索失败的力量

积极心态的力量之五:克服困难的力量

积极心态的力量之六:赢得幸福的力量

积极心态的力量之七:充满自信的力量

积极心态的力量之八:受人喜欢的力量

积极心态的力量之九:克服心理近视的力量

积极心态的力量之十:立即行动的力量

积极心态的力量之十一:激励自己和他人的力量

积极心态的力量之十二:吸引财富的力量

积极心态的力量之十三:投资理财的力量

积极心态的力量之十四:知足常乐的力量

积极心态的力量之十五:帮助他人的力量

积极心态的力量之十六:自我充电的力量

积极心态的力量之十七:健康长寿的力量

积极心态的力量之十八:克服心病的力量

积极心态的力量之十九:掌握至善的力量

积极心态的力量之二十:不屈不挠的力量

积极心态的力量之二十一:和平心态的力量

积极心态的力量之二十二:克服忙碌的力量

积极心态的力量之二十三:克服不安的力量

积极心态的力量之二十四:不知疲倦的力量

积极心态的力量之二十五:新奇想法的力量

世上唯一最重要的人只有一个——你自己!

我们往往把自己想象成什么样,就真的会成为什样子。

对于那些积极心态的人来说,每一种逆境都隐含着一种等量或更大的利益种子,有时你虽然身处逆境,说不定其中正隐藏着良机。

当你面临被别人误解的问题时,你必须首先从检查你自己开始。

相信有志者事竟成的人终将获得成功。

良好的想法紧跟以切实的行动,能把失败转变为成功。

播下一个行动,你将收获一种习惯;播下一种习惯,你将收获一种性格;播下一种性格,你将收获一种命运。

建功立业的秘诀就是:“立即行动”。

记住每天说句话:我健康!我快乐!我大有作为!

探索心理的力量:人的心理具有某种神秘的力量,要敢于探索这种心理力量;你的心理有两部分:有意识心理和下意识心理,二者相伴相随;你能用积极健康的暗示来帮助自己,也能阻止有害的、消极的暗示;学会使用适当的暗示区影响他人,学会应用正确的、有意识的自动暗示。做到了这两点,你就能在生理、心理和道德上获得健康、幸福与成功。

(一)保持积极的心态,并引导它为你的生活目标服务的话,你就能享受到良好的结果:1.为你带来成功环境和成功意识;2.生理和心理的健康;3.独立的经济;4.出于爱心而且能表达自我的工作;5.内心的平静;6.没有恐惧的自信心;7.长久的友谊;8.长寿而且平衡的生活;9.免于自我设限;10.了解自己和他人的智慧、长处。(二)如果你是抱一种消极的心态,工作和生活将会是另一种面貌:1.贫穷与凄惨的生活;2.生理和心理的疾病;3.自我设限——使你变得平庸;4.恐惧以及其它破坏性的结果;5.限制你帮助自己的方法;6.敌人多,朋友少;7.产生各种烦恼;8.成为所有负面影响的牺牲品;9.屈服于他人的意志;10.过着一种毫无意义的颓废生活。

如何培养积极心态:1.切断和你过去失败经验的所有关系,消除你脑海中的那些与积极心态背道而驰的所有不良因素;2.确定你需要的资源之后,便制定如何得到这些资源的计划,计划一定不要太过渡。记住,贪婪是使野心家失败的最主要因素;3.培养每天说或做一些使他人感到舒服的话或事;4.使你自己了解一点,打倒你的不是挫折,而是你面对挫折时所抱的心态;5.务必使自己养成精益求精的习惯,并以你的爱心和热情发挥这项习惯,努力把这种习惯变成一种嗜好;6.彻底盘点一次你的资产,你会发现你所拥有的最有价值的资产就是健全的思想;7.改掉你的坏习惯,连续一个月每天减少一项恶习,并在一周结束时反省一下成果;8.放弃想要控制别人的念头,转而把你的精力用来控制你自己;9.使自己多活动以保持自己的健康,生理上的疾病很容易造成心理上的失调;10.增加自己的耐性,并以开阔的心胸包容所有事物;11.把你的全部思想用来作你想做的事,而不要留半点思维空间给那些胡思乱想的念头;12.除非有人愿意以足够的证据证明他的建议具有一定的可靠性,否则别接受任何人的建议,你将会因谨慎而避免被误导,或被当成傻瓜;13.以相同或更多的价值回报给你好处的人。“报酬增加率”最后还会给你带来好处,而且可能会为你带来所有你应得到的东西的能力;14.对于善意的批评应采取接受的态度,而不应采取消极的反应,接受学习他人如何看待你的机会。别害怕批评,你应该勇敢的面对;15.避免任何具有负面意义的说话形态,尤其应根除吹毛求疵,闲言碎语、中伤他人名誉的行为;16.随时随地都表现出真实的自己,没有人会相信骗子;17.任何与你共事的人不值得你信任时,就表示你选错人了;18.…………

成功的17大原则:1.积极的心态;2.明确的目的;3.多走些路;4.正确的思考;5.自我控制;6.集体心理;7.具有信心;8.令人愉快的个性;9.富有首创的精神;10.充满热情;11.集中注意力;12.与他人协作;13.总结经验教训;14.创造性的见识;15.预算时间和金钱;16.保持身心健康;17.运用普遍规律的力量。

一个星期六的早晨,我要准备次日将要进行的讲道,妻子出去买东西了。那天在下雨,我的小儿子吵闹不休、令人讨厌。最后我在失望中拾起一本旧杂志,一页一页的翻阅,直到翻到一幅色彩鲜艳的大图画——一幅世界地图。我就从那本杂志上撕下这一页,再把它撕成碎片。丢在起居室的地上,对儿子说道:“小约翰,如果你能拼拢这些碎片,我就给你2角5分钱。”我以为这件事会使他打法掉上午的大部分时间。可是没过10分钟,就有人来敲门了,原来是我的儿子,他手里拿着一幅刚拼好的地图。我惊愕地看到约翰如此之快的拼好了一幅世界地图。“孩子,你怎样把这件事做的这样快?”我问道。“啊,”小约翰说,“这很容易。在另一方面有一个人的照片。我就照着这个人的照片拼到一起,然后把它翻过来。我想,如果这个人是正确的,那么这个世界也是正确的。”

posted @ 2006-04-21 14:35 北国狼人的BloG 阅读(597) | 评论 (1)编辑 收藏
     摘要: <% @ page contentType = " text/html;charset=gbk "  pageEncoding = " gbk "   %> ...  阅读全文
posted @ 2006-04-20 15:43 北国狼人的BloG 阅读(580) | 评论 (0)编辑 收藏
转:

今天试着把大虾写的系统登录模块加到我们现有的模块里来,他写的时候因为有些试验的成分,所以没有按照我们项目的配置来写,也没有按照我们的模块来划分配置,加过来以后重新配置了模块信息,结果居然无法正常运行。显示错误:“cannot retrieve action mapping  。废了九牛二虎之力,都无法解决。web.xml、struts-config、模块配置,一切看起来都无比的正常,但就是运行不了。真搞不清楚是哪里出了问题。还以为搞不定,晚上要加班了,谁知道,踏破铁鞋无觅处,柳暗花明又一村,在google上搜索关键字"action mapping 找不到",第一个链接居然就是问题的答案!(还从来没有只点一次就可以找到问题答案的经验,所以兴奋无比^O^)

        总的来说,问题的原因就在于,struts是在第一次收到对action的请求(注意:不包括jsp的请求)时,提取这个请求的url的路径信息,把相应模块的mapping信息设置到请求中去。如果在进入一个模块时,第一次访问的是一个jsp页面,而在这个jsp页面中提交到该模块的一个action,就会出现找不到action mapping的情况。这就是因为,在进到这个模块时,访问的是jsp,这个模块的任何一个action都没有被访问到,所以struts的ActionServlet还没有来得及把这个模块的mapping设置到请求中,自然找不到该模块的action。

        因此,这就引出一个约定,就是系统中尽量避免对Jsp的直接访问,如果要访问也要通过action来forward。虽然看起来麻烦一点,但是安全性、健壮性都会有所提高。

        关于以上提到的模块mapping的设置原理,具体的文章在这里(不长),值得收藏:

        原文链接:http://202.100.72.44/news/itschool/pro/pro44134.htm

posted @ 2006-04-19 18:27 北国狼人的BloG 阅读(3654) | 评论 (2)编辑 收藏
这类问题真是不容易,因为一般搞软件开发的,不会在自己上装一些不常见的字体。可是本人就是既精通Photoshop,又精通软件开发(Java)。

呵呵,让我郁闷了很多天,装不上 RSA。

看到有人因为装BEA WORKSHOP也出现莫名问题。给我了启示。

workshop fontmanager.dll 问题解决贴

http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=103&threadID=23679&messageID=173082

解决办法:

到控制面板,找到字体,找到文鼎字体,删之!

最后出现:

rsa.jpg

posted @ 2006-04-14 21:05 北国狼人的BloG 阅读(857) | 评论 (0)编辑 收藏

db2

 select * from recruit fetch first 5 rows only

经典oracle sql

select   *   from  ( select  newtable. * ,rownum rownum_  from  ( select   *   from  s_emp) newtable  where  rownum  <=   20 where  rownum_  >   5

rownum在用于大于号时,不可以,必须先造一个table把rownum这个伪列当作这个新造出的表中的一个字段,才能进行特定行之间的查询。



DML Data manipulation language
   insert update delete

DDL Data definition language
   create alter drop rename trancate

Transaction control
   commit rollback savepoint

DCL
   GRANT REVOKE

==========================

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(7)
 LAST_NAME                                 NOT NULL VARCHAR2(15)
 FIRST_NAME                                         VARCHAR2(15)
 USERID                                             VARCHAR2(8)
 START_DATE                                         DATE
 COMMENTS                                           VARCHAR2(15)
 MANAGER_ID                                         NUMBER(7)
 TITLE                                              VARCHAR2(20)
 DEPT_ID                                            NUMBER(7)
 SALARY                                             NUMBER(11,2)
 COMMISSION_PCT                                     NUMBER(4,2)

select last_name,salary, 12*salary + 100 from s_emp;

支持操作符

支持别名

select last_name ln from s_emp;

支持Concatenation,级联操作符

select first_name||last_name from s_emp


对于NULL值

select  last_name,title,salary * commission_pct / 100  COMM  from  s_emp;

这样查询会有很多NULL值

有一个NVL函数,以便在NULL出现时,给予一个默认值。

select  last_name,title, salary * NVL(commission_pct, 0 ) / 100  COMM  from  s_emp;

commission_pct,出现NULL,就会被0替换。

Eliminate duplicate rows by using distinct in select clause;

select   distinct  name  from  s_dept;


=============================================================

SQL> select name,salary,deptno from ( select concat(last_name,first_name) name,salary,department_id deptno,rank() over (partition by department_id order by salary desc) rnk from employees) where rnk = 2 or rnk = 3;

NAME                                              SALARY     DEPTNO
--------------------------------------------- ---------- ----------
FayPat                                              6000         20
KhooAlexander                                       3100         30
BaidaShelli                                         2900         30
WeissMatthew                                        8000         50
KauflingPayam                                       7900         50
ErnstBruce                                          6000         60
AustinDavid                                         4800         60
PataballaValli                                      4800         60
PartnersKaren                                      13500         80
ErrazurizAlberto                                   12000         80
KochharNeena                                       17000         90

NAME                                              SALARY     DEPTNO
--------------------------------------------- ---------- ----------
De HaanLex                                         17000         90
FavietDaniel                                        9000        100
ChenJohn                                            8200        100
GietzWilliam                                        8300        110

15 rows selected.

SQL>

SQL> desc employees;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                               NOT NULL NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                       VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)

SQL 排名问题

找出部门工资排名第二,三的员工

=====================

复习一下外连接Outer Join

SQL> desc s_emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(7)
 LAST_NAME                                 NOT NULL VARCHAR2(15)
 FIRST_NAME                                         VARCHAR2(15)
 USERID                                             VARCHAR2(8)
 START_DATE                                         DATE
 COMMENTS                                           VARCHAR2(15)
 MANAGER_ID                                         NUMBER(7)
 TITLE                                              VARCHAR2(20)
 DEPT_ID                                            NUMBER(7)
 SALARY                                             NUMBER(11,2)
 COMMISSION_PCT                                     NUMBER(4,2)

SQL> desc s_customer
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME                                      NOT NULL VARCHAR2(25)
 ZIP_CODE                                           VARCHAR2(20)
 CREDIT_RA                                          VARCHAR2(25)
 SAL                                                NUMBER
 ID                                                 NUMBER(5)

客户表里的SAL字段是s_emp的外键。表示该客户的销售代表。

那么要想查出所有客户(包括没有销售代表的)所对应的销售代表记录。

  1  select e.last_name,e.id,c.name
  2  from s_emp e,s_customer c
  3  where e.id(+) = c.sal
  4* order by e.id

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                  12 athletes attic
_dumas                  12 great athletes
_dumas                  12 bj athletics
_dumas                  12 athletic for all
_dumas                  12 sports,inc
                           athletics two
                           athletics one
                           shhes for sports
                           athletic attire
                           toms sporting goods

可以看到相应的部分客户并不存在销售代表也出现在结果集中,而用等值链接是不能查出的。

  1  select e.last_name,e.id,c.name
  2  from s_emp e,s_customer c
  3  where e.id = c.sal(+)
  4* order by e.id

查出所有销售代表所对应的客户。

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                   8
hui                      8
aaa                     10
%ss                     11
_dumas                  11
_dumas                  12 sports,inc
_dumas                  12 athletic for all
_dumas                  12 bj athletics
_dumas                  12 great athletes
_dumas                  12 athletes attic
_dumas                  13

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                  15
_dumas                  16
_dumas                  17
_dumas                  18
_dumas                  19
_dumas                  21
payn                    23
_dumas                  25
_dumas                  47
_dumas                  70
_dumas                  76

LAST_NAME               ID NAME
--------------- ---------- -------------------------
_dumas                  95
liganfeng              112
lgf                    122
lgf                    134
Biri                   333
qu                     555
_dumas                2271
tarena               25999
tarena               26999

空的旧更多了。

也就是哪边缺,哪边方加号。

这就是外连接。

posted @ 2006-03-30 23:46 北国狼人的BloG 阅读(541) | 评论 (0)编辑 收藏
仅列出标题
共17页: First 上一页 6 7 8 9 10 11 12 13 14 下一页 Last