隨筆-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=">
          ????? </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 閱讀(1269) | 評論 (3)編輯 收藏
          西諺說:“年輕的本錢,就是有時間去失敗第二次。”等到我們老了,就已經沒人肯請我們去工作了,所以年輕時努力奮斗是很重要的。
            一位哲人說:“你的心態就是你真正的主人。”一位偉人說:“要么你去駕馭生命,要么是生命駕馭你。你的心態決定誰是坐騎,誰是騎師。”

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

            當你遇到挫折時,給你幾點小建議:
            找個地方喝點酒,沉醉一回
            找個迪廳跳跳舞,放松一下
            找幫朋友侃侃山,開懷一番
            積極行動起來,分析失敗的原因,找出行動的方法

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

          年輕不嘗試新的工作,就是扯淡。
          posted @ 2006-07-16 20:23 北國狼人的BloG 閱讀(431) | 評論 (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 閱讀(302) | 評論 (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 閱讀(6509) | 評論 (6)編輯 收藏
               摘要: 面試經常問一些模棱兩可的問題,也就是一些在一些條件成立時,才能給出確定答案的問題。比如問Java是否支持多繼承。那么回答要縝密,接口支持,類不支持。多繼承導致網狀繼承結構。? F????????????Fsoft????????? bed????softbedF這層的成員變量會在softbed會出現兩份。所以在C++中采用虛繼承來解決,達到了一種菱形結構。?????????Fsoft???????...  閱讀全文
          posted @ 2006-04-22 12:34 北國狼人的BloG 閱讀(547) | 評論 (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 閱讀(624) | 評論 (1)編輯 收藏
               摘要: <% @?page?contentType = " text/html;charset=gbk " ?pageEncoding = " gbk " ? %> ...  閱讀全文
          posted @ 2006-04-20 15:43 北國狼人的BloG 閱讀(597) | 評論 (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 閱讀(3676) | 評論 (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 閱讀(882) | 評論 (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 閱讀(562) | 評論 (0)編輯 收藏
          僅列出標題
          共17頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
          主站蜘蛛池模板: 章丘市| 金山区| 湘西| 内丘县| 资阳市| 谷城县| 获嘉县| 绥滨县| 衡阳市| 石屏县| 于田县| 桃园县| 黄石市| 永川市| 卫辉市| 钟祥市| 荣昌县| 杭州市| 灵璧县| 井冈山市| 遂昌县| 高平市| 商洛市| 南城县| 南汇区| 兴仁县| 阳城县| 从江县| 根河市| 遂平县| 申扎县| 太仓市| 泸定县| 莎车县| 新乐市| 阜城县| 莆田市| 濮阳县| 泰顺县| 苍南县| 武强县|