前言

          Jive是一個開放的Java源代碼項目。其目標是建設一個開放結構的,強壯的,易于擴展的基于JSP的論壇。在其設計目標的指導下,其結構設計得非常得好,融合了很多新的觀念,比如Design Pattern,可更換的Skin,可插入Plug等等。詳細解讀其源代碼對于理解這些新的設計上的概念是很有裨益的。如果你對Design Pattern和Java語言有一定的了解,但是還是會時常迷惑于其中的話,不妨研究研究Jive源代碼,一定會對其中的很多概念有更深入的理解。這篇文章源于我的Jive源代碼研究筆記,希望能夠提綱挈領,帶領大家進入到這個美好的世界。當然,如果沒有時間仔細地看源代碼的話,看看這篇文章,我想也是會有一些幫助的。

          再開始之前,需要指出的是,Jive中對Design Pattern的應用,并沒有拘禮與GOF書中所給出的實現方法,而是有許多變通的地方。一方面,我想是由于具體的實際需要,另一方面,我想這也是設計觀念進化的結果吧。因而,這些變通的地方,將是我講解的重點。





          回頁首


          整體結構概敘

          基于一個OO的設計原則:面向接口編程,而不是針對實現編程。Jive在設計的時候,把其大部分的基本對象都設計為接口或者抽象類。在Jive中,基本的接口有Forum,ForumMessage,ForumThread,Group,User,Authorization和Query。我們可以很容易的從這些接口的名字來知道他們的功用,下面的類圖給出了這些類之間的一些靜態關系:



          圖1:Jive整體關系
          圖1:Jive整體關系

          你可能會有疑問,為什么會都是接口呢?這是基于擴展性考慮的。在Jive給出的實現中,所有的這些接口,Forum,ForumMessage,User等等,都使用數據庫來實現的,一條消息,或者一個用戶對應于數據庫中的一條消息Jive使用了DbForum,DbForumMessage,DbUser等類來實現這些接口,通過JDBC來操作數據庫,使之作為論壇的底層支撐。

          然而,有時候,或許我們并不想使用數據庫,比如我們想只是使用文件系統來作為論壇的底層支撐,這時候,我們需要做的只是編碼實現了Forum等等接口的諸如FileFroum,FileForumMessage等對象,然后嵌入Jive中即可,原有的任何代碼都可以不用改變!!!這就是面向接口編程的威力了!

          下面來看看具體的設計和編碼。






          AbstractFactory模式和可擴展性

          如果要實現較好的可擴展性,AbstractFactory模式確實是一件利器。如上面所說,如果要創建的Forum接口的不同實現,而又不想更改代碼的話,就需要用到抽象工廠了。再Jive中,AuthorizationFactory類是一個抽象類,用來創建Authorization對象。這是一個抽象工廠,可以通過不同的子類來創建不同的Authorization對象。這個工廠的實現方法是:

          在AuthorizationFactory中使用一個private static變量factory,用來引用具體的抽象工廠的實例:
          private static AuthorizationFactory factory = null;

          用一個private static的String,來指明具體的抽象工廠的子類類名:
          private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";

          然后是用一個private static的loadAuthorizationFactory方法來給這個factory變量賦值,生成具體的抽象工廠類:

             private static void loadAuthorizationFactory() {
                      if (factory == null) {
                      synchronized(className) {
                      if (factory == null) {
                      String classNameProp = PropertyManager.getProperty(
                      "AuthorizationFactory.className"
                      );
                      if (classNameProp != null) {
                      className = classNameProp;
                      }
                      try {
                      Class c = Class.forName(className);
                      factory = (AuthorizationFactory)c.newInstance();
                      }
                      catch (Exception e) {
                      System.err.println("Exception loading class: " + e);
                      e.printStackTrace();
                      }
                      }
                      }
                      }
                      }

          在static的getAuthorization方法返回一個Authorization的過程中,先初始化工廠類factory變量,然后用factory的createAuthorization方法來創建:

             public static Authorization getAuthorization(String username,
                      String password) throws UnauthorizedException
                      {
                      loadAuthorizationFactory();
                      return factory.createAuthorization(username, password);
                      }

          不同的子類有不同的createAuthorization方法的實現。比如在DbAuthorizationFactory這個AuthorizationFactory的數據庫實現子類中,createAuthorization方法是這樣實現的:

             public Authorization createAuthorization(String username, String password)
                      throws UnauthorizedException
                      {
                      if (username == null || password == null) {
                      throw new UnauthorizedException();
                      }
                      password = StringUtils.hash(password);
                      int userID = 0;
                      Connection con = null;
                      PreparedStatement pstmt = null;
                      try {
                      con = DbConnectionManager.getConnection();
                      pstmt = con.prepareStatement(AUTHORIZE);
                      pstmt.setString(1, username);
                      pstmt.setString(2, password);
                      ResultSet rs = pstmt.executeQuery();
                      if (!rs.next()) {
                      throw new UnauthorizedException();
                      }
                      userID = rs.getInt(1);
                      }
                      catch( SQLException sqle ) {
                      System.err.println("Exception in DbAuthorizationFactory:" + sqle);
                      sqle.printStackTrace();
                      throw new UnauthorizedException();
                      }
                      finally {
                      try {  pstmt.close(); }
                      catch (Exception e) { e.printStackTrace(); }
                      try {  con.close();   }
                      catch (Exception e) { e.printStackTrace(); }
                      }
                      return new DbAuthorization(userID);
                      }

          在這個類中,可以看到抽象類和具體的子類之間的關系,它們是如何協作的,又是如何劃分抽象方法和非抽象方法的,這都是值得注意的地方。一般的,抽象方法需要子類來實現,而抽象類中的非抽象方法應該所有子類所能夠共享的,或者可是說,是定義在抽象方法之上的較高層的方法。這確實是一個抽象工廠的好例子!雖然實現的方法已經和GOF中給出的實現相差較遠了,但思想沒變,這兒的實現,也確實是要巧妙的些。

          還有就是靜態方法的使用,使得這個類看起來有些Singleton的意味。這使得對于AbstractFactory的創建變得簡單。

          下面的類圖給出了這個AbstractFactory的實現的總體情況:



          圖2:AbstractFactory模式的實現類圖
          圖2:AbstractFactory模式的實現類圖

          在AuthorizationFactory中定義的其它方法,涉及到具體的如何創建Authorization,都是作為abstract方法出現,具體實現留給子類來完成。

          這樣,在需要生成一個Authorization的時候,只需要調用AuthorizationFactory的靜態方法getAuthorization就可以了,由子類實現了具體的細節。

          其它的,如同上面講到的,在創建Forum的時候用的ForumFactory,具有同上面一樣的實現,這就是模式之所以稱為模式的所在了。





          回頁首


          Proxy模式和權限控制

          Proxy模式的功能有很多,比如遠程代理,用來給遠程對象提供一個本地代表;虛代理,用來為創建開大開銷的對象提供緩沖,等等。在Jive中使用的是保護代理,為被保護的對象提供權限控制。

          我們都知道在一個論壇中,權限的控制是必須的,否則論壇就很可能會被搞得一團糟。Jive中引入Proxy對象,Authorization接口以及權限描敘屬類來提供對論壇的保護。

          以ForumFactory為例,一個額外的ForumFactoryProxy來處理權限認證的工作,它為某一個ForumFactory提供了一個代理,保證只有授權的用戶才能夠存取ForumFactory的某些操作。實際上ForumFactory在這兒不僅僅只是一個生成Forum的類的,它更像是一個Forum的管理類。提供了添加,刪除,枚舉等等一系列的功能,而有些功能不是什么樣的人都可以使用的,因而引入了另外的一個代理類來處理權限的問題。

          當然,代理類需要繼承ForumFactory,以使方法簽名一致: ForumFactoryProxy extends ForumFactory

          在它的構造方法中,就提供了一個ForumFactory對象,這是需要被代理的對象;一個Authorization對象,提供用戶信息;還有一個ForumPermissions,提供認證信息:

             public ForumFactoryProxy(ForumFactory factory, Authorization authorization,
                      ForumPermissions permissions)
                      {
                      this.factory = factory;
                      this.authorization = authorization;
                      this.permissions = permissions;
                      }

          一般的代理過程都是這樣的,在訪問某個方法之前,必須接受權限的檢查,以createForum為例:

             public Forum createForum(String name, String description)
                      throws UnauthorizedException, ForumAlreadyExistsException
                      {
                      if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
                      Forum newForum = factory.createForum(name, description);
                      return new ForumProxy(newForum, authorization, permissions);
                      }
                      else {
                      throw new UnauthorizedException();
                      }
                      }

          下面給出這個模式的類圖:



          圖3:Proxy模式的類圖
          圖3:Proxy模式的類圖

          這個模式的實現基本上和GOF中所給出的實現一致。在Jive中,幾乎所有的接口,Forum,ForumMessage,ForumThread等等,都會有一個相應的Proxy對象來進行權限控制。而在創建具體的對象的時候,都是用相應的Proxy對象來代替原有的對象返回的。例如在ForumFactory的getInstance()方法中需要返回一個Forum的時候,Jive是這樣做的:

          public static ForumFactory getInstance(Authorization authorization) {
                      ......
                      ForumFactoryProxy proxy = new ForumFactoryProxy(factory,authorization, factory.getPermissions(authorization));
                      return proxy;
                      }

          因而,所有被創建的對象實際上都是Proxy對象,抽象工廠保證了沒有權限驗證的對象根本不會客戶所得到,它們只會在Proxy的內部扮演角色,而永遠不會被外部對象所存取,這樣,就從根本上保證了論壇的安全。





          回頁首


          Decorator模式和過濾器

          一般的在OO設計中,而外功能的添加是通過繼承來實現的,但是繼承有的時候不夠靈活,而且當功能的組合很多的時候,繼承的子類就會成幾何級數增長,使得類多的難以控制。正是基于這樣的考慮,Decorator模式得以誕生。

          Decorator模式相當于封裝了某個特定的操作,當某個對象需要這個操作的時候,加上這個Decorator即可。并且,多個Decorator還可以組合,以提供更多的功能。

          在Jive中,Decorator模式應用在一些過濾器(Filter)中。Filter提供對ForumMessage對象內容的重新構造。比如,當一個ForumMessage對象流過一個名為FilterCodeHighlight的過濾器后,存在于消息中的所有Java源代碼文本,會被重新構造為具有語法高亮顯示的消息。在比如,當經過了語法高亮修飾的消息再流過一個名為FilterHtml的過濾器后,消息中的HTML片斷會被注釋可以在HTML內部顯示文本,這樣就防止了用戶輸入了HTML控制標簽后,使得頁面顯示不正常的問題。

          Jive中,所有的過濾器繼承于一個抽象類ForumMessageFilter,而ForumMessageFilter又實現了ForumMessage接口。也就是說,每一個過濾器實際上也是一個ForumMessage對象。

          ForumMessageFilter中還封裝一個ForumMessage對象。進行過濾的方法很簡單,使用的是getBody(),比如在FilterCodeHighlight這個類中:

             public String getBody() {
                      return highlightCode(message.getBody());
                      }

          highlightCode是一個private方法,實施具體的過濾的細節。getBody()方法實際上是定義在ForumMessage接口中的,當調用過濾器的getBody()方法時,就能夠得到結構重整后的ForumMessage對象了。這個對象可以被其他客戶引用,也可以在傳遞給另外的過濾器,實施進一步的操作。

          在實現一個具體的消息的過濾的時候,在Forum中有addForumMessageFilter(),applyFilters()方法,用來實現對過濾器的應用。

          對一個Forum,使用addForumMessageFilter()方法添加一個Filter的時候,并沒有指定一個具體的Message,而只是一個規則(Filter中封裝了過濾規則),然后applyFilter()方法中,實施這些規則:

             public ForumMessage applyFilters(ForumMessage message) {
                      //Loop through filters and apply them
                      for (int i=0; i < filters.length; i++) {
                      message = filters[i].clone(message);
                      }
                      return message;
                      }

          過濾器的clone()方法,為過濾器復制消息體。這個方法的使用,分離了在過濾器中對于消息體和過濾規則的初始化過程,這也是一個值得借鑒的技巧!

          下面給出Decorator模式的類圖:



          圖4:Decorator模式的類圖
          圖4:Decorator模式的類圖

          我們可以看到Decorator模式實際上和Proxy模式是很相近的,但是它們代表兩個不同的功能含義。Proxy模式提供一個對象的控制,而Decorator模式則是為對象提供額外的功能。





          回頁首


          Iterator模式和論壇的瀏覽

          Iterator模式用來分離數據結構和遍歷算法,降低兩者之間的耦合度,以使得同一個數據結構用不同的算法遍歷時,仍能夠具有相同的接口,另一方面,Iterator模式使得當改換遍歷算法后,不需要更改程序的代碼。

          在Java的JDK中本身就定義有一個Iterator接口,在Iterator接口中僅僅定義了三個方法,hasNext()判斷是否遍歷完最后一個元素,next()方法返回要遍歷的數據結構中一個對象,remove()則刪除當前對象。Jive中使用IteratorProxy抽象類繼承了這一接口。這兒Proxy的含義和上面一樣,也就是說,這個IteratorProxy出了會實現Iterator的遍歷功能外,還會有代理權限控制的功能。

          對于論壇中的基本對象Forum,ForumThread,ForumMessage,Group,User都有相應的遍歷器。比如對應于Forum接口有ForumIteratorProxy對象。這個ForumIteratorProxy遍歷器就相當于一個封裝了一系列Forum對象的集合類,通過定義好的接口hasNext()和next()可以方便的遍歷這個集合,而并不需要知道是如何遍歷這個集合的。遍歷的算法可能很簡單,也可能很復雜,但是對于外部的客戶而言,這并沒有任何的區別。

          而對于論壇中具體的遍歷方法,這取決于具體的實現,在Jive中給出的是數據庫的實現。

          我們就以MessageIteratorProxy為例,來講解Iterator模式的用法。

          DbThreadIterator對象實現了Iterator接口,是對于一個Thread中所有Message的遍歷器,我們來看看它是如何實現的。

          hasNext()判斷在這個Thread中是不是還有下一條Message:

          public boolean hasNext() {
                      if (currentIndex+1 >= messages.length) {
                      return false;
                      }
                      return true;
                      }

          next()方法從數據庫中取出與在這個Thread中的下一條Message:

             public Object next() throws java.util.NoSuchElementException {
                      ForumMessage message = null;
                      if (nextMessage != null) {
                      message = nextMessage;
                      nextMessage = null;
                      }
                      else {
                      message = getNextMessage();
                      if (message == null) {
                      throw new java.util.NoSuchElementException();
                      }
                      }
                      return message;
                      }

          這樣,通過對數據庫的操作,DbThreadIterator實現了對一個Thread中所有Message遍歷的方法。

          再ForumThread接口中有messages()方法,返回在這個Thread中的所有Message的一個遍歷器(Iterator),實際上也就是返回了一個Message的集合:
          public Iterator messages();

          在DbForumThread中實現了這個方法:
          public Iterator messages() {return new DbThreadIterator(this);}

          從DbForumThread的messages()方法中所返回的就是這個Thread中所有Message的一個遍歷器,通過這個遍歷器,我們就可以訪問Thread中的所有的Message了。當然,事情還沒有完,由于權限的問題,我們還需要構造這個遍歷器的Proxy對象,然后通過這個Proxy對象來訪問遍歷器。

          下面的類圖給出了在Jive中Iterator模式的實現方法:



          圖5:Jive中Iterator模式的實現
          圖5:Jive中Iterator模式的實現

          在Jive中,因為在一個Thread之下,Message是按樹形結構組織的,因而,當需要層級表示一個Thread中的Message之間的關系的時候,僅僅用上面講到的線性的Iterator是不夠的。這時候,對Iterator的概念進行推廣,就引入了TreeWalker接口。

          顧名思義,TreeWalker提供了遍歷一個樹和存取樹上節點的方法:

          public interface TreeWalker {
                      public ForumMessage getRoot();
                      public ForumMessage getChild(ForumMessage parent, int index);
                      public int getChildCount(ForumMessage parent);
                      public int getRecursiveChildCount(ForumMessage parent);
                      public int getIndexOfChild(ForumMessage parent, ForumMessage child);
                      public boolean isLeaf(ForumMessage node);

          TreeWalker只是Iterator的簡單推廣,并沒有Iterator應用的那么廣泛,而且,也可以很容易的在TreeWalker上面在套一層Iterator的借口,讓它在某些情況下行使Iterator的職責。這兒就不再多討論了。

          再此,Jive設計中所有涉及到的設計模式的地方,基本上都講完了,看完了之后,是不是對設計模式有了更進一步的了解了呢?

          下一部分的內容,將會涉及到具體的編碼,深入到JSP的內部,我們將會看到Jive中是如何實現可更換的Skin的,還會涉及Tag Library的一些內容。好了,這次就到這兒了。下次再見。

          posted @ 2007-05-18 15:09 edsonjava 閱讀(254) | 評論 (0)編輯 收藏
           
          現在越來越多的項目是基于Linux或Unix下的,而在Linux上給客戶上安裝一個項目,需要進行許多的安裝設置過程,比如數據庫的,WebLogic Server的。現寫下基于Red hat Linux7.1 +jdk1.3+WebLogic Server7.0 +oracle9.2 的安裝配置過程。

          一.安裝好linux ,安裝過程比較簡單,不在此敘述.

          二.JDK的安裝配置.
          一般以root用戶安裝。
          先從SUN網站上下載一個jdk.比如:j2sdk-1_3_1_06-linux-i586.bin,放到/usr/local
          下,
            chmod a+x j2sdk-1_3_0-linux.bin(添加執行權限)
            ./j2sdk-1_3_0-linux.bin

          安裝RPM文件格式:
            chmod a+x j2sdk-1_3_0-linux-rpm.bin
            ./j2sdk-1_3_0-linux-rpm.bin
            rpm -iv j2sdk-1_3_0-linux.rpm
            rpm -iv --force j2sdk-1_3_0-linux.rpm
            ./j2sdk-1_3_1_06-linux-i586.bin

          設置環境變量:
            # vi /etc/profile
          里面添加:
            export JAVA_HOME=/usr/local/jdk1.3.1_06/
            export CLASSPATH=.:/usr/local/ jdk1.3.1_06/lib
          PATH=$PATH:$JAVA_HOME/bin

          三、Oracle 9i的安裝配置
          1.從oracle網站下載oracle9i.
          2.解壓oracle文件
          gunzip Linux9i_Disk1.cpio.gz Linux9i_Disk2.cpio.gz Linux9i_Disk3.cpio.gz

          cpio -idmv < Linux9i_Disk1.cpio
          cpio -idmv < Linux9i_Disk2.cpio
          cpio -idmv < Linux9i_Disk3.cpio

          3.以root用戶登陸,創建oracle用戶,目錄,設置oracle環境變量.
            Create Oracle User Accounts
            # groupadd dba
            # groupadd oinstall
            # useradd -g oinstall -G dba oracle
            # passwd ********
            Create Oracle Directories
            # mkdir /opt/oracle
            # mkdir /opt/oracle/product
            # mkdir /opt/oracle/product/9.2.0
            # chown -R oracle.oinstall /opt/oracle
            # mkdir /var/opt/oracle
            # chown oracle.dba /var/opt/oracle
            # chmod 755 /var/opt/oracle
            Set Oracle Environments
            As the oracle user execute the following commands:
            # vi /home/oracle/.bash_profile添加

            export ORACLE_BASE=/usr/local/oracle
            export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
            export ORACLE_SID=orcl
            export ORACLE_TERM=xterm
            export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
            LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
            LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
            export LD_LIBRARY_PATH
            CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
            CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
            export CLASSPATH
            PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin

          調整內存
            Shared Memory
            su root
            # vi/etc/sysctl.conf里添加
            kernel.shmmax=1073741824
          4.安裝oracle
            進入Disk1目錄
            cd Disk1
            在控制臺窗口敲入
            ./runInstaller
          安裝完了以后,啟動數據庫
          oracle$ sqlplus /nolog
          SQL> connect / as sysdba
          SQL> startup

          oracle 的安裝過程比較復雜,而且如果你的開發包安裝的不夠全的話,會出現一些錯誤,具體請參考: http://www.puschitz.com/InstallingOracle9i.shtml

          5.設置oracle 自啟動

          (1)vi /etc/oratab
            orcl:/usr/local/oracle/product/9.2.0:Y
          (2)vi /home/oracle/.bash_profile
            ORACLE_SID=orcl
            ORAENV_ASK=NO
            export ORACLE_SID ORAENV_ASK
            . oraenv
          (3)在 /etc/rc.d/init.d 下創建一個dbora文件。
          內容如下:

            #!/bin/sh
            ORA_HOME=/usr/local/oracle/product/9.2.0
            ORA_OWNER=oracle
            if [ ! -f $ORA_HOME/bin/dbstart ]
            then
            echo "Oracle startup: cannot start"
            exit
            fi
            case "$1" in
            'start') #start oracle database and listeners
            su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart"
            su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
            ;;
            'stop') #stop oracle databse and listeners
            su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
            su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut"
            ;;
            esac

          把這個文件與下列文件聯接:
          ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc3.d/S99dbora
          ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc5.d/S99dbora
          ln -s /etc/rc.d/init.d/dbora /etc/rc.d/rc0.d/K10dbora

          (4)編輯dbstart文件
          以oracle用戶登陸
          vi /usr/local/oracle/product/9.2.0/bin/dbstart
          - add the following line:
          SPFILE=${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora
          after this line: PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora

          - change:
          if [ -f $PFILE ] ; then
          to:
          if [ -f $PFILE -o -f $SPFILE ] ; then
          重啟動服務器,檢查數據庫是否已經起來。

          四、WebLogic 配置。
          從bea網站上下載一個WebLogic Server.開始安裝。
          [test@linux2 download]$ chmod a+x server701_linux.bin
          [test@linux2 download]$ ./server701_linux.bin
          按照提示安裝即可。

          五.設置WebLogic Server 自啟動.
          以root用戶登陸。
          vi /etc/rc.d/rc.local
          把su - test -c "/home/test/bea/user_projects/mydomain/startWebLogic.sh 2>&1> /dev/null &"
          (這里的 test是你安裝WebLogic Server時候的用戶名.)
          放到/etc/rc.d/rc.local里就行了,不過這樣有一個缺點,你WebLogic Server啟動后一直在后臺運行,你不能看到上面的提示信息和出錯信息.

          六.調整你的WebLogic Server,便于用戶的使用。
          設置默認 Web Application,從
            mydomain> Servers> myserver>connection>http>Default Web Application
          選中你的web application即可。
          設置你的首頁,在你web application里面的web.xml里面添加一句
            
            你得頁面
            


          以上安裝過程在Red hat Linux7.1 +jdk1.3+WebLogic Server7.0 +oracle9.2下安裝測試通過。
          posted @ 2007-05-17 18:21 edsonjava 閱讀(313) | 評論 (0)編輯 收藏
           

          1.安裝JDK
          首先,到http://java.sun.com/j2se/1.5.0/download.jsp
          下載最新版本的Linux 平臺的JDK,建議下載RPM自解壓格式的例如本文所用jdk-1_5_0_06-linux-i586-rpm.bin,先下載文件到/tmp,打開終端,輸入:
          cd /tmp
          su
          輸入root密碼
          直接執行文件:
          ./jdk-1_5_0_06-linux-i586-rpm.bin
          然后會出現sun的協議(Sun Microsystems, Inc. Binary Code License Agreement),如果運行jdk-1_5_0_06-linux-i586-rpm.bin無效請給予其相應的運行權限。
          想查看完整協議,不斷點擊more就可以了。如果看完了,或者像我一樣看不懂^__^就直接按q吧。
          出現提示:Do you agree to the above license terms? [yes or no]
          如果同意協議,請輸入yes
          然后自動解壓出jdk-1_5_0_06-linux-i586.rpm,并且自動安裝,如果不是root用戶,可能會出現類似
          error: cannot get exclusive lock on /var/lib/rpm/Packages
          error: cannot open Packages index using db3 -
          不允許的操作 (1)
          error: cannot open Packages database in /var/lib/rpm
          的錯誤。
          最后顯示Done.安裝結束

          2.配置環境變量
          就像在windows下一樣,裝好JDK需要配置環境變量,否則系統找不到相應的程序。先查看當前系統環境變量中jdk的路徑:
          echo $JAVA_HOME
          如果安裝SuSE Linux時選擇了相應的java的包,則顯示/usr/lib/jvm/java。再看當前JDK版本:
          java -version
          我的機器上顯示如下信息:
          java version "1.4.2_06"
          Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_06-b03)
          Java HotSpot(TM) Client VM (build 1.4.2_06-b03, mixed mode)
          1.4.2_06版本,不是我們剛才安裝的版本(因為沒有修改環境變量嘛)。
          我們剛才安裝的版本默認在/usr/java/jdk1.5.0_06,我們把它加到環境變量。
          最簡單的辦法就是編輯/ect/profile,在文件最后的
          #
          # End of /etc/profile
          #
          上面添加如下文本:
          export JAVA_HOME=/usr/java/jdk1.5.0_06
          export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
          export JRE_HOME=$JAVA_HOME/jre
          export PATH=$JAVA_HOME/bin:$PATH
          作用分別是設置 JAVA_HOME , CLASSPATH , JRE_HOME , PATH 所指向的路徑。跟windows下的意義一樣。如果不懂可以查閱相關文檔或者直接把以上文本復制粘貼到你的/ect/profile 中即可。
          注銷一下,使更改生效。
          再查看一下當前的環境變量:
          echo $JAVA_HOME
          輸出:
          /usr/java/jdk1.5.0_06
          可以看到我們剛才裝的JDK生效了。
          然后輸入:
          java -version
          查看當前JDK版本。
          輸出:
          java version "1.5.0_06"
          Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
          Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)
          說明我們環境變量配置成功了。

          posted @ 2007-05-17 16:16 edsonjava 閱讀(5947) | 評論 (2)編輯 收藏
           

          1 環境的搭建

          要使用JAVA開發Web應用,必需要JAVA的運行環境,還有開發環境。當然Web開發少不了數據庫。Web程序要運行也少不了Web服務器。

          這里我們選用JAVA運行環境:J2SDk1.4

          數據庫:Mysql 4.0.15

          Web服務器:Tomcat 4.1.18

          1.1 JAVA的運行環境

          首先要搭建的是JAVA的運行環境。到Sun公司http://java.sun.com/j2se/1.4.2/download.html免費下載j2sdk-1_4_2_05-linux-i586.bin然后拷貝到安裝目錄

          執行二進制文件即可解壓縮文件:

          [root@localhost jdk]#./ j2sdk-1_4_2_05-linux-i586.bin

          解壓縮完成之后就可以在當前目錄下面找到j2sdk1.4.2_05目錄

          為了方便可以做一個簡單的連接到這個目錄

          [root@localhost jdk]#ln –s j2sdk1.4.2_05 jdk

          然后加入環境變量

          export JVAV_HOME=/var/jdk/jdk1.4

          export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:.

          export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

          現在JAVA運行環境就搭建好了,你可以試試寫一個java程序來驗證

          [root@localhost jdk]#vi HelloWorld.java

          輸入如下內容

          public class HelloWorld{

             public static void main(String args[]){

              System.out.println("HelloWrold");

             }

          }

          :wq

          寫盤并退出編輯器

          [root@localhost jdk]#javac HelloWorld.java

          沒有錯誤

          [root@localhost jdk]#java HelloWorld

          Hello,World

          恭喜,

          Kq[業Kk0+?bv

          你的JAVA運行環境搭建好了。現在進入下一步。

           

          1.2 Mysql數據庫安裝

          1下載數據庫安裝文件mysql-4.0.15a.tar.gz

          2建立MySLQL的用戶和組

          [root@localhost var]# groupadd mysql

          [root@localhost var]# useradd –g mysql mysql

          3修改根目錄下的root目錄下面的.bash_profile文件添加PATH環境變量

          [root@localhost root]#vi .bash_profile

          PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

          保存退出

          下面就可以看是安裝MySql

          4解壓縮文件

          [root@localhost jdk]#tar xzvf mysql-4.0.15a.tar.gz

          進入解壓縮得到的目錄

          [root@localhost var]# cd mysql-4.0.15a

          5配置發行版本并且編譯

          [root@localhost mysql-4.0.15a]#./configure --prefix=/usr/local/mysql

          [root@localhost mysql-4.0.15a]#make

          當你運行configure時,你可能想要指定一些選項,--prefix選項制定安裝mysql的目錄為/usr/local/mysql

          6安裝所有東西

          [root@localhost mysql-4.0.15a]#make install

          你可能需要root用戶來運行這個命令

          ok現在mysql數據庫服務器就安裝好了。接下來還有重要的步驟需要執行

          7創造MySQL授權表(只有你以前沒安裝MySQL是必需的):

          [root@localhost mysql-4.0.15a]#scripts/mysql_install_db

          8做完上面的步驟我們就可以啟動mysql進行操作了。

          [root@localhost mysql-4.0.15a]#cd /usr/local/mysql/bin

          [root@localhost bin]# ./mysqld_safe &

          如果沒有出錯提示,查看一下mysql進程

          [root@localhost bin]# ps aux|grep mysql

          root      1205 0.0 0.0 5388 168 ?        S    Apr22   0:00 /bin/sh /usr/loca

          l/mysql/bin/mysqld_safe

          mysql     1227 0.0 1.3 100316 13756 ?      S    Apr22   0:36 [mysqld]

          root     22956 0.0 0.0 4816 640 pts/1    S    10:41   0:00 grep mysql

          粗體的就是mysql的進程了。

          現在就可以使用mysql,root登陸MySQL服務器

          [root@localhost bin]#mysql –u root –p

          這里會提示輸入密碼默認的root用戶密碼為空。直接回車就可以了

          Enter password:

          Welcome to the MySQL monitor. Commands end with ; or \g.

          Your MySQL connection id is 95 to server version: 4.0.15a-log

           

          Type ''''help;'''' or ''''\h'''' for help. Type ''''\c'''' to clear the buffer.

           

          mysql>

          這樣就成功登陸MySQL服務器了。

          mysql> show databases;

          +----------+

          | Database |

          +----------+

          | cumt     |

          | mysql    |

          | test     |

          +----------+

          3 rows in set (0.01 sec)

          現在就可以建立數據庫了。這里就不介紹怎樣建立數據庫和建立表了。

          Root用戶沒有密碼是不安全的所以你需要修改root用戶的密碼

          [root@localhost bin]# mysqladmin -u root password ''''new-password''''

          ''''new-password''''換成你自己的密碼就可以了。

          注意:做完上面的我們就可以用mysqlbin目錄下的mysql來管理數據庫了。可是這還沒法在程序中使用數據庫。我在jsp中連接數據庫的時候出現如下錯誤:

          java.sql.SQLException: Data source rejected establishment of connection, message from server: "Host ''''localhost.localdomain''''is not allowed to connect to this MySQL server"

          這是MySQL的權限問題具體的講解請參考MySQL參考手冊的存取權限系統

          我們需要做的是讓root可以從localhost連接到數據庫,

          ,G專}Uc{|g[

          你也可以建立一個新用戶來連接

           

          登陸到mysql服務器

          mysql> GRANT ALL PRIVILEGES ON *.* TO cumt@localhost
                     IDENTIFIED BY ''''cumt'''' WITH GRANT OPTION;
          mysql> GRANT ALL PRIVILEGES ON *.* TO cumt@"%"
                     IDENTIFIED BY ''''cumt'''' WITH GRANT OPTION;

          這兩天語句添加用戶cumt使得它可以從任何地方連接服務器的一個完全的超級用戶,但是必須使用一個口令cumt做這個。現在我們就可以從程序中用cumt來連接數據庫了。

          但是在程序中還是沒有對表的寫權限。這是由于我們的數據庫用戶是root而不是我們建立的mysql組的mysql用戶。所以只有讀的權限而沒有寫的權限。我們需要把mysql目錄下面的var目錄下面的目錄和文件的所有者改成mysql組的myql用戶:

          [root@localhost bin]#chown -R mysql /usr/local/mysql/var

          [root@localhost bin]#cp support- files/my-medium.cnf /etc/my.cnf

          好了做完上面的我們就可以在程序中使用cumt連接數據庫和操作數據庫了。

          1.3 Web服務器tomcat安裝配置

          下載tomcat,

          件_:87VNLPI$

          jakarta-tomcat-4.1.18.tar.gz

           

          解壓縮

          root@localhost var]#tar xzvf jakarta-tomcat-4.1.18.tar.gz
          為方便操作:
          ln -s jakarta-tomcat-4.0.1 tomcat
          ln -s j2sdk1.4.0 jdk

          修改Tomcat/bin/startup.sh :

          export JAVA_HOME=/usr/local/jdk
          export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:.
          export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

          /usr/local/tomcat/bin/catalina.sh start


          啟動Tomcat/bin/startup.sh
          1.使用ps -ax | grep tomcat可以查詢出內存中存在tomcat程序
          使用http://你的服務器域名或IP地址或localhost:8080/可訪問

          2.
          如要求系統開機自動tomcat /etc/rc.d/rc.local中加入:
          /usr/local/tomcat/bin/startup.sh

          3.
          對于linux7.1系統, tomcat好象不能正常啟動,需要安裝:
          compat-libstdc++-6.2-2.9.0.14.i386.rpm

          rpm -i compat-libstdc++-6.2-2.9.0.14.i386.rpm

          4.
          如果希望以http://www.xxx.com:8080/myweb 訪問自己的jsp程序,以下步驟:
          (1).
          在任意地方建立目錄myweb 比如 /home/bqlr/myweb
          (2).
          myweb下建立 WEB-INF WEB-INF/classes目錄
          (3).
          tomcatconf目錄下修改server.xml:

          <!-- Tomcat Manager Context -->
          <Context path="/manager" docBase="manager" debug="0" privileged="true"/>

          <!--
          下面是自己加入的-->

          <Context path="/myweb" docBase="/home/bqlr/myweb" debug="0" reloadable="true"/>

          (4) tomcatwebapps目錄下,建立目錄連接myweb
          ln -s /home/bqlr/myweb /usr/local/tomcat/webapps/myweb

          (5)
          重新啟動Tomcat. class文件放在/home/bqlr/myweb/WEB-INF/classes目錄下 jsp文件放在/home/bqlr/myweb

          posted @ 2007-05-14 10:49 edsonjava 閱讀(394) | 評論 (0)編輯 收藏
           

          jfreechart是一個免費(文檔收費40$)創建圖片的java工具.可以創建如下圖形:
          餅圖(pie charts;)
          曲線圖(line charts )
          柱狀圖(horizontal/vertical bar charts)
          甘特圖(Gantt charts; )
          XY plots and scatter plots;
          time series, high/low/open/close charts and candle stick charts;
          combination charts;
          Pareto charts;
          bubble charts;
          wind plots, meter charts and symbol charts;

          必看的幾個貼:

          http://www-900.ibm.com/developerWorks/cn/wsdd/library/techarticles/yangyaping0307/waslinux.shtml

          http://www.lslnet.com/linux/docs/linux-2940.htm

          http://blog.blogchina.com/article_81038.344426.html

          在向linux移植的時候會顯示不出中文,出現方塊。

          解決方法:copy或引用/usr/share/fonts/zh_CN/TrueType目錄下的中文字體,修改/home/jdk/jre/lib/fonts.properties

          配置文件,如下:

          sansserif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          sansserif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          sansserif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          sansserif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          # Component Font Character Encodings
          #
          fontcharset.serif.0=sun.io.CharToByteISO8859_1
          fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK

          fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
          fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK

          fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
          fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK

          fontcharset.dialog.0=sun.io.CharToByteISO8859_1
          fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK

          fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
          fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK

          fontset.sansserif.plain=\
          -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          fontset.sansserif.italic=\
          -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          fontset.sansserif.bold=\
          -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

          fontset.sansserif.bolditalic=\
          -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1


          fontset.default=\
          -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1


          appendedfontpath=/usr/share/fonts/zh_CN/TrueType

          然后對自己基于jfreechart寫的程序進行重新編譯、運行:

          javac -encoding GBK   BarChartDemo.java //以GBK進行編碼
          java -Djava.awt.headless=true BarChartDemo//使用awt時不用調用x11的圖形環境

           

          在tomcat使用jfreechart時

          tomcat是5.0,在redhat8上,未啟動X,方法如下:
          1)終止你的tomcat。即:
          tomcat目錄/bin/shutdown.sh
          2)設置環境變量:
          CATALINA_OPTS="-Djava.awt.headless=true"
          export CATALINA_OPTS
          (如果你想每次開機自動生效,則可把這兩句寫入系統或者你的賬號啟動sh的.profile里)
          3)啟動你的tomcat。即:
          tomcat目錄/bin/startup.sh

          用的Web服務器resin時,

          修改resin/bin/下面的wrapper.pl中的一行
          $JAVA_ARGS="-Djava.awt.headless=true";


           

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

          最近項目中用到jfreechart,使用的版本是:jfreechart-0.9.8。
          如果不進行相關的font的設置,生成的統計圖表顯示的中文非常模糊。
          做了一個例子,可以解決這個問題。

          [該方法是將一般字體替換為“黑體”使中文更加清楚,

          因此必須保證你的OS上有該字體,并且jdk能夠識別得到]

          核心代碼如下:

          JFreeChart chart = ChartFactory.createVerticalBarChart3D(title, domain, range, dataset,true,true,false);

          chart.setBackgroundPaint(new GradientPaint(0.0F, 0.0F, Color.white, 1000F, 0.0F, Color.red));
          chart.setTitle(new TextTitle(title, new Font("隸書", Font.ITALIC, 15)));

          Font font=new Font("黑體",Font.TRUETYPE_FONT, 12);

          StandardLegend legend = (StandardLegend) chart.getLegend();
          legend.setItemFont(font);

          CategoryPlot plot = (CategoryPlot)chart.getPlot();
          plot.setForegroundAlpha(0.9F);

          CategoryAxis domain_axis = plot.getDomainAxis();
          domain_axis.setTickLabelFont(font);

          ValueAxis value_axis=plot.getRangeAxis();
          value_axis.setTickLabelFont(font);


          posted @ 2007-04-12 15:53 edsonjava 閱讀(262) | 評論 (0)編輯 收藏
           
               摘要: I'm using WebSphere 5.1 on windows, MyEclipse 3.8.4. I have the TraderX example app deployed (use package deploy, install the app with websphere console), and started. I can "buy" (i.e. use the app). ...  閱讀全文
          posted @ 2007-04-03 18:19 edsonjava 閱讀(1588) | 評論 (0)編輯 收藏
           


          Java基礎方面:

          1、作用域public,private,protected,以及不寫時的區別
          答:區別如下:
          作用域 當前類 同一package 子孫類 其他package
          public √ √ √ √
          protected √ √ √ ×
          friendly √ √ × ×
          private √ × × ×
          不寫時默認為friendly

          2、ArrayList和Vector的區別,HashMap和Hashtable的區別
          答:就ArrayList與Vector主要從二方面來說.
          一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
          二.數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半
          就HashMap與HashTable主要從三方面來說。
          一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
          二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
          三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

          3、char型變量中能不能存貯一個中文漢字?為什么?
          答:是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的

          4、多線程有幾種實現方法,都是什么?同步有幾種實現方法,都是什么?
          答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
          同步的實現方面有兩種,分別是synchronized,wait與notify

          5、繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什么?
          答:父類:
          package test;
          public class FatherClass
          {
          public FatherClass()
          {
          System.out.println("FatherClass Create");
          }
          }
          子類:
          package test;
          import test.FatherClass;
          public class ChildClass extends FatherClass
          {
          public ChildClass()
          {
          System.out.println("ChildClass Create");
          }
          public static void main(String[] args)
          {
          FatherClass fc = new FatherClass();
          ChildClass cc = new ChildClass();
          }
          }
          輸出結果:
          C:>java test.ChildClass
          FatherClass Create
          FatherClass Create
          ChildClass Create

          6、內部類的實現方式?
          答:示例代碼如下:
          package test;
          public class OuterClass
          {
          private class InterClass
          {
          public InterClass()
          {
          System.out.println("InterClass Create");
          }
          }
          public OuterClass()
          {
          InterClass ic = new InterClass();
          System.out.println("OuterClass Create");
          }
          public static void main(String[] args)
          {
          OuterClass oc = new OuterClass();
          }
          }
          輸出結果:
          C:>java test/OuterClass
          InterClass Create
          OuterClass Create
          再一個例題:
          public class OuterClass {
          private double d1 = 1.0;
          //insert code here
          }
          You need to insert an inner class declaration at line 3. Which two inner class declarations are

          valid?(Choose two.)
          A. class InnerOne{
          public static double methoda() {return d1;}
          }
          B. public class InnerOne{
          static double methoda() {return d1;}
          }
          C. private class InnerOne{
          double methoda() {return d1;}
          }
          D. static class InnerOne{
          protected double methoda() {return d1;}
          }
          E. abstract class InnerOne{
          public abstract double methoda();
          }
          說明如下:
          一.靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。 故 A、B 錯
          二.靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;return d1 出錯。

          故 D 錯
          三.非靜態內部類的非靜態成員可以訪問外部類的非靜態變量。 故 C 正確
          四.答案為C、E

          7、垃圾回收機制,如何優化程序?
          希望大家補上,謝謝

          8、float型float f=3.4是否正確?
          答:不正確。精度不準確,應該用強制類型轉換,如下所示:float f=(float)3.4

          9、介紹JAVA中的Collection FrameWork(包括如何寫自己的數據結構)?
          答:Collection FrameWork如下:
          Collection
          ├List
          │├LinkedList
          │├ArrayList
          │└Vector
          │ └Stack
          └Set
          Map
          ├Hashtable
          ├HashMap
          └WeakHashMap
          Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)
          Map提供key到value的映射

          10、Java中異常處理機制,事件機制?

          11、JAVA中的多形與繼承?
          希望大家補上,謝謝

          12、抽象類與接口?
          答:抽象類與接口都用于抽象,但是抽象類(JAVA中)可以有自己的部分實現,而接口則完全是一個標識(同時有多重繼承的功能)。

          13、Java 的通信編程,編程題(或問答),用JAVA SOCKET編程,讀服務器幾個字符,再寫入本地顯示?
          答:Server端程序:
          package test;
          import java.net.*;
          import java.io.*;

          public class Server
          {
          private ServerSocket ss;
          private Socket socket;
          private BufferedReader in;
          private PrintWriter out;
          public Server()
          {
          try
          {
          ss=new ServerSocket(10000);
          while(true)
          {
          socket = ss.accept();
          String RemoteIP = socket.getInetAddress().getHostAddress();
          String RemotePort = ":"+socket.getLocalPort();
          System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
          in = new BufferedReader(new

          InputStreamReader(socket.getInputStream()));
          String line = in.readLine();
          System.out.println("Cleint send is :" + line);
          out = new PrintWriter(socket.getOutputStream(),true);
          out.println("Your Message Received!");
          out.close();
          in.close();
          socket.close();
          }
          }catch (IOException e)
          {
          out.println("wrong");
          }
          }
          public static void main(String[] args)
          {
          new Server();
          }
          };
          Client端程序:
          package test;
          import java.io.*;
          import java.net.*;

          public class Client
          {
          Socket socket;
          BufferedReader in;
          PrintWriter out;
          public Client()
          {
          try
          {
          System.out.println("Try to Connect to 127.0.0.1:10000");
          socket = new Socket("127.0.0.1",10000);
          System.out.println("The Server Connected!");
          System.out.println("Please enter some Character:");
          BufferedReader line = new BufferedReader(new

          InputStreamReader(System.in));
          out = new PrintWriter(socket.getOutputStream(),true);
          out.println(line.readLine());
          in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          System.out.println(in.readLine());
          out.close();
          in.close();
          socket.close();
          }catch(IOException e)
          {
          out.println("Wrong");
          }
          }
          public static void main(String[] args)
          {
          new Client();
          }
          };

          14、用JAVA實現一種排序,JAVA類實現序列化的方法(二種)? 如在COLLECTION框架中,實現比較要實現什么樣的接口?
          答:用插入法進行排序代碼如下
          package test;
          import java.util.*;
          class InsertSort
          {
          ArrayList al;
          public InsertSort(int num,int mod)
          {
          al = new ArrayList(num);
          Random rand = new Random();
          System.out.println("The ArrayList Sort Before:");
          for (int i=0;i<num ;i++ )
          {
          al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
          System.out.println("al["+i+"]="+al.get(i));
          }
          }
          public void SortIt()
          {
          Integer tempInt;
          int MaxSize=1;
          for(int i=1;i<al.size();i++)
          {
          tempInt = (Integer)al.remove(i);
          if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())
          {
          al.add(MaxSize,tempInt);
          MaxSize++;
          System.out.println(al.toString());
          } else {
          for (int j=0;j<MaxSize ;j++ )
          {
          if

          (((Integer)al.get(j)).intValue()>=tempInt.intValue())
          {
          al.add(j,tempInt);
          MaxSize++;
          System.out.println(al.toString());
          break;
          }
          }
          }
          }
          System.out.println("The ArrayList Sort After:");
          for(int i=0;i<al.size();i++)
          {
          System.out.println("al["+i+"]="+al.get(i));
          }
          }
          public static void main(String[] args)
          {
          InsertSort is = new InsertSort(10,100);
          is.SortIt();
          }
          }
          JAVA類實現序例化的方法是實現java.io.Serializable接口
          Collection框架中實現比較要實現Comparable 接口和 Comparator 接口

          15、編程:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。
          答:代碼如下:
          package test;

          class SplitString
          {
          String SplitStr;
          int SplitByte;
          public SplitString(String str,int bytes)
          {
          SplitStr=str;
          SplitByte=bytes;
          System.out.println("The String is:′"+SplitStr+"′;SplitBytes="+SplitByte);
          }
          public void SplitIt()
          {
          int loopCount;


          loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/Split

          Byte+1);
          System.out.println("Will Split into "+loopCount);
          for (int i=1;i<=loopCount ;i++ )
          {
          if (i==loopCount){


          System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
          } else {


          System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
          }
          }
          }
          public static void main(String[] args)
          {
          SplitString ss = new SplitString("test中dd文dsaf中男大3443n中國43中國人

          0ewldfls=103",4);
          ss.SplitIt();
          }
          }

          16、JAVA多線程編程。 用JAVA寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出。
          希望大家補上,謝謝

          17、STRING與STRINGBUFFER的區別。
          答:STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法

          Jsp方面

          1、jsp有哪些內置對象?作用分別是什么?
          答:JSP共有以下9種基本內置組件(可與ASP的6種內部組件相對應):
           request 用戶端請求,此請求會包含來自GET/POST請求的參數
          response 網頁傳回用戶端的回應
          pageContext 網頁的屬性是在這里管理
          session 與請求有關的會話期
          application servlet 正在執行的內容
          out 用來傳送回應的輸出
          config servlet的構架部件
          page JSP網頁本身
          exception 針對錯誤網頁,未捕捉的例外

          2、jsp有哪些動作?作用分別是什么?
          答:JSP共有以下6種基本動作
          jsp:include:在頁面被請求的時候引入一個文件。
          jsp:useBean:尋找或者實例化一個JavaBean。
          jsp:setProperty:設置JavaBean的屬性。
          jsp:getProperty:輸出某個JavaBean的屬性。
          jsp:forward:把請求轉到一個新的頁面。
          jsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記

          3、JSP中動態INCLUDE與靜態INCLUDE的區別?
          答:動態INCLUDE用jsp:include動作實現
          <jsp:include page="included.jsp" flush="true" />它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數
          靜態INCLUDE用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面
          <%@ include file="included.htm" %>

          4、兩種跳轉方式分別是什么?有什么區別?
          答:有兩種,分別為:
          <jsp:include page="included.jsp" flush="true">
          <jsp:forward page= "nextpage.jsp"/>
          前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完后還會回來,相當于函數調用。并且可以帶參數.后者完全轉向新頁面,不會再回來。相當于go to 語句。

          Servlet方面

          1、說一說Servlet的生命周期?
          答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

          2、Servlet版本間(忘了問的是哪兩個版本了)的不同?
          希望大家補上,謝謝

          3、JAVA SERVLET API中forward() 與redirect()的區別?
          答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;后者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用sendRedirect()方法。

          4、Servlet的基本架構
          public class ServletName extends HttpServlet {
          public void doPost(HttpServletRequest request, HttpServletResponse response) throws
          ServletException, IOException {
          }
          public void doGet(HttpServletRequest request, HttpServletResponse response) throws
          ServletException, IOException {
          }
          }

          Jdbc、Jdo方面

          1、可能會讓你寫一段Jdbc連Oracle的程序,并實現數據查詢.
          答:程序如下:
          package hello.ant;
          import java.sql.*;
          public class jdbc
          {
          String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
          String theUser="admin";
          String thePw="manager";
          Connection c=null;
          Statement conn;
          ResultSet rs=null;
          public jdbc()
          {
          try{
          Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
          c = DriverManager.getConnection(dbUrl,theUser,thePw);
          conn=c.createStatement();
          }catch(Exception e){
          e.printStackTrace();
          }
          }
          public boolean executeUpdate(String sql)
          {
          try
          {
          conn.executeUpdate(sql);
          return true;
          }
          catch (SQLException e)
          {
          e.printStackTrace();
          return false;
          }
          }
          public ResultSet executeQuery(String sql)
          {
          rs=null;
          try
          {
          rs=conn.executeQuery(sql);
          }
          catch (SQLException e)
          {
          e.printStackTrace();
          }
          return rs;
          }
          public void close()
          {
          try
          {
          conn.close();
          c.close();
          }
          catch (Exception e)
          {
          e.printStackTrace();
          }
          }
          public static void main(String[] args)
          {
          ResultSet rs;
          jdbc conn = new jdbc();
          rs=conn.executeQuery("select * from test");
          try{
          while (rs.next())
          {
          System.out.println(rs.getString("id"));
          System.out.println(rs.getString("name"));
          }
          }catch(Exception e)
          {
          e.printStackTrace();
          }
          }
          }

          2、Class.forName的作用?為什么要用?
          答:調用該訪問返回一個以字符串指定類名的類的對象。

          3、Jdo是什么?
          答:JDO是Java對象持久化的新的規范,為java data object的簡稱,也是一個用于存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何數據底層上運行。JDBC只是面向關系數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,比如關系數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。

          4、在ORACLE大數據量下的分頁解決方法。一般用截取ID方法,還有是三層嵌套方法。
          答:一種分頁方法
          <%
          int i=1;
          int numPages=14;
          String pages = request.getParameter("page") ;
          int currentPage = 1;
          currentPage=(pages==null)?(1):{Integer.parseInt(pages)}
          sql = "select count(*) from tables";
          ResultSet rs = DBLink.executeQuery(sql) ;
          while(rs.next()) i = rs.getInt(1) ;
          int intPageCount=1;
          intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
          int nextPage ;
          int upPage;
          nextPage = currentPage+1;
          if (nextPage>=intPageCount) nextPage=intPageCount;
          upPage = currentPage-1;
          if (upPage<=1) upPage=1;
          rs.close();
          sql="select * from tables";
          rs=DBLink.executeQuery(sql);
          i=0;
          while((i<numPages*(currentPage-1))&&rs.next()){i++;}
          %>
          //輸出內容
          //輸出翻頁連接
          合計:<%=currentPage%>/<%=intPageCount%><a href="List.jsp?page=1">第一頁</a><a

          href="List.jsp?page=<%=upPage%>">上一頁</a>
          <%
          for(int j=1;j<=intPageCount;j++){
          if(currentPage!=j){
          %>
          <a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
          <%
          }else{
          out.println(j);
          }
          }
          %>
          <a href="List.jsp?page=<%=nextPage%>">下一頁</a><a href="List.jsp?page=<%=intPageCount%>">最后頁

          </a>


          Xml方面

          1、xml有哪些解析技術?區別是什么?
          答:有DOM,SAX,STAX等
          DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構占用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問SAX:不現于DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問
          STAX:Streaming API for XML (StAX)

          2、你在項目中用到了xml技術的哪些方面?如何實現的?
          答:用到了數據存貯,信息配置兩方面。在做數據交換平臺時,將不能數據源的數據組裝成XML文件,然后將XML文件壓縮打包加密后通過網絡傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數都存貯在XML文件中。

          3、用jdom解析xml文件時如何解決中文問題?如何解析?
          答:看如下代碼,用編碼方式加以解決
          package test;
          import java.io.*;
          public class DOMTest
          {
          private String inFile = "c:\people.xml";
          private String outFile = "c:\people.xml";
          public static void main(String args[])
          {
          new DOMTest();
          }
          public DOMTest()
          {
          try
          {
          javax.xml.parsers.DocumentBuilder builder =


          javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
          org.w3c.dom.Document doc = builder.newDocument();
          org.w3c.dom.Element root = doc.createElement("老師");
          org.w3c.dom.Element wang = doc.createElement("王");
          org.w3c.dom.Element liu = doc.createElement("劉");
          wang.appendChild(doc.createTextNode("我是王老師"));
          root.appendChild(wang);
          doc.appendChild(root);
          javax.xml.transform.Transformer transformer =
          javax.xml.transform.TransformerFactory.newInstance().newTransformer();
          transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
          transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");


          transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
          new

          javax.xml.transform.stream.StreamResult(outFile));
          }
          catch (Exception e)
          {
          System.out.println (e.getMessage());
          }
          }
          }

          4、編程用JAVA解析XML的方式.
          答:用SAX方式解析XML,XML文件如下:
          <?xml version="1.0" encoding="gb2312"?>
          <person>
          <name>王小明</name>
          <college>信息學院</college>
          <telephone>6258113</telephone>
          <notes>男,1955年生,博士,95年調入海南大學</notes>
          </person>
          事件回調類SAXHandler.java
          import java.io.*;
          import java.util.Hashtable;
          import org.xml.sax.*;
          public class SAXHandler extends HandlerBase
          {
          private Hashtable table = new Hashtable();
          private String currentElement = null;
          private String currentValue = null;
          public void setTable(Hashtable table)
          {
          this.table = table;
          }
          public Hashtable getTable()
          {
          return table;
          }
          public void startElement(String tag, AttributeList attrs)
          throws SAXException
          {
          currentElement = tag;
          }
          public void characters(char[] ch, int start, int length)
          throws SAXException
          {
          currentValue = new String(ch, start, length);
          }
          public void endElement(String name) throws SAXException
          {
          if (currentElement.equals(name))
          table.put(currentElement, currentValue);
          }
          }
          JSP內容顯示源碼,SaxXml.jsp:
          <HTML>
          <HEAD>
          <TITLE>剖析XML文件people.xml</TITLE>
          </HEAD>
          <BODY>
          <%@ page errorPage="ErrPage.jsp"
          contentType="text/html;charset=GB2312" %>
          <%@ page import="java.io.*" %>
          <%@ page import="java.util.Hashtable" %>
          <%@ page import="org.w3c.dom.*" %>
          <%@ page import="org.xml.sax.*" %>
          <%@ page import="javax.xml.parsers.SAXParserFactory" %>
          <%@ page import="javax.xml.parsers.SAXParser" %>
          <%@ page import="SAXHandler" %>
          <%
          File file = new File("c:\people.xml");
          FileReader reader = new FileReader(file);
          Parser parser;
          SAXParserFactory spf = SAXParserFactory.newInstance();
          SAXParser sp = spf.newSAXParser();
          SAXHandler handler = new SAXHandler();
          sp.parse(new InputSource(reader), handler);
          Hashtable hashTable = handler.getTable();
          out.println("<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>");
          out.println("<TR><TD>姓名</TD>" + "<TD>" +
          (String)hashTable.get(new String("name")) + "</TD></TR>");
          out.println("<TR><TD>學院</TD>" + "<TD>" +
          (String)hashTable.get(new String("college"))+"</TD></TR>");
          out.println("<TR><TD>電話</TD>" + "<TD>" +
          (String)hashTable.get(new String("telephone")) + "</TD></TR>");
          out.println("<TR><TD>備注</TD>" + "<TD>" +
          (String)hashTable.get(new String("notes")) + "</TD></TR>");
          out.println("</TABLE>");
          %>
          </BODY>
          </HTML>

          EJB方面

          1、EJB2.0有哪些內容?分別用在什么場合? EJB2.0和EJB1.1的區別?
          答:規范內容包括Bean提供者,應用程序裝配者,EJB容器,EJB配置工具,EJB服務提供者,系統管理員。這里面,EJB容器是EJB之所以能夠運行的核心。EJB容器管理著EJB的創建,撤消,激活,去活,與數據庫的連接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....

          2、EJB與JAVA BEAN的區別?
          答:Java Bean 是可復用的組件,對Java Bean并沒有嚴格的規范,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java Bean是被容器所創建(如Tomcat)的,所以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實現Serializable接口用于實現Bean的持久性。Java Bean實際上相當于微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創建和管理。客戶通過容器來訪問真正的EJB組件。

          3、EJB的基本架構
          答:一個EJB包括三個部分:
          Remote Interface 接口的代碼
          package Beans;
          import javax.ejb.EJBObject;
          import java.rmi.RemoteException;
          public interface Add extends EJBObject
          {
          //some method declare
          }
          Home Interface 接口的代碼
          package Beans;
          import java.rmi.RemoteException;
          import jaax.ejb.CreateException;
          import javax.ejb.EJBHome;
          public interface AddHome extends EJBHome
          {
          //some method declare
          }
          EJB類的代碼
          package Beans;
          import java.rmi.RemoteException;
          import javax.ejb.SessionBean;
          import javx.ejb.SessionContext;
          public class AddBean Implements SessionBean
          {
          //some method declare
          }

          J2EE,MVC方面

          1、MVC的各個部分都有那些技術來實現?如何實現?
          答:MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。

          2、應用服務器與WEB SERVER的區別?
          希望大家補上,謝謝


          3、J2EE是什么?
          答:Je22是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。

          4、WEB SERVICE名詞解釋。JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。
          答:Web Service描述語言WSDL
          SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用于交換XML編碼信息的輕量級協議。
          UDDI 的目的是為電子商務建立標準;UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊中心的實現標準規范,同時也包含一組使企業能將自身提供的Web Service注冊,以使別的企業能夠發現的訪問協議的實現標準。


          5、BS與CS的聯系與區別。
          希望大家補上,謝謝

          6、STRUTS的應用(如STRUTS架構)
          答:Struts是采用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。 采用Struts能開發出基于MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能:
          一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。
          二.JSP自由tag庫,并且在controller servlet中提供關聯支持,幫助開發員創建交互式表單應用。
          三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。

          設計模式方面

          1、開發中都用到了那些設計模式?用在什么場合?
          答:每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重復相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。


          2、UML方面
          答:標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行為圖,交互圖(順序圖,合作圖),實現圖,

          JavaScript方面

          1、如何校驗數字型?
          var re=/^d{1,8}$|.d{1,2}$/;
          var str=document.form1.all(i).value;
          var r=str.match(re);
          if (r==null)
          {
          sign=-4;
          break;
          }
          else{
          document.form1.all(i).value=parseFloat(str);
          }


          CORBA方面

          1、CORBA是什么?用途是什么?
          答:CORBA 標準是公共對象請求代理結構(Common Object Request Broker Architecture),由對象管理組織 (Object Management Group,縮寫為 OMG)標準化。它的組成是接口定義語言(IDL), 語言綁定(binding:也譯為聯編)和允許應用程序間互操作的協議。 其目的為:
          用不同的程序設計語言書寫
          在不同的進程中運行
          為不同的操作系統開發


          LINUX方面

          1、LINUX下線程,GDI類的解釋。
          答:LINUX實現的就是基于核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的管理在核外函數庫中實現。
          GDI類為圖像設備編程接口類庫。

          posted @ 2007-04-03 11:24 edsonjava 閱讀(283) | 評論 (0)編輯 收藏
           
          1。創建cvs

          系統管理員登陸CVS服務器,創建CVS庫的存放目錄,比如C:\cvs\cvsrep。使用“cvs -d /cvs/cvsrep init ”初始化目錄,該命令會自動創建CVSROOT,CVS等目錄。然后,在CVS的配置文件里,同時為該庫起一個別名,比如/cvs/cvsrep,以防止用戶知道系統的真實的目錄結果。別名的設置,在Unix下,是在/etc/cvsnt/PServer文件里;Windows下,可以通過CVSNT Control Panel來進行。

           

          了簡化操作,我們先設置環境變量,比如"set cvsroot=c:\cvs\cvsrep"。這樣,就不用每次指定CVSROOT的位置了。

           

          2。創建cvs庫管理員

          系統管理員使用passwd命令創建用戶(同時設置初始口令),然后把新建的用戶名列在CVSROOT/admin里,這些用戶就成為了CVS庫管理員。

           

          比如通過“cvs passwd -r cvsuser -u repadmin”創建一個叫repadmin的用戶。這里,cvs服務器上必須存在一個cvsuser的系統用戶,該用戶必須有對C:\cvs\cvsrep的完全訪問權限。cvsuser賬戶,可以為多個cvs庫用戶所共享。repadmincvs的遠程訪問,是以cvsuser的身份運行的。

           

          系統管理員使用chacl命令把根目錄的確省權限設為read,nowrite,nocontrol,nocreate,notag。當然,這些工作也可以交由cvs庫管理員來做。

          比如:cvs chacl -a read,nowrite,nocontrol,nocreate,notag

          如果子目錄不重新設置權限,自動繼承父目錄的權限。

           

           

          系統管理員通過emai把賬號、密碼以及CVSROOT的路徑發送給cvs庫管理員。

           

          cvs庫管理遠程訪問cvs庫,比如通過pserver協議。

           

          設置環境變量,set cvsroot=:pserver:repadmin@servername:/cvs/cvsrep.

           

          轉到工作目錄,登陸,并初始化當前目錄

          cd workdir

          cvs login

          cvs co .

           

          修改密碼

          cvs passwd

           

           

          3。創建普通用戶

          cvs庫管理員通過passwd創建用戶,同時設置初始密碼,然后通email告知相關信息。

          cvs passwd -a -r cvsuser -u testuser

           

           

          4。創建目錄樹

          cvs庫管理員通過importadd命令創建目錄樹,并使用chacl命令給用戶分配權限。

          可以通過lsacl命令來檢查權限的分配情況。

           

          添加一個目錄

          cvs add subdir

           

          testuser分配subdir的讀寫權限

          cvs chacl -a read,write -u testuser subdir

           

          5Check in / Check out

          現在普通用戶可以使用check out數據,并修改和提交了。

           

          set cvsroot=:pserver:testuser@servername:/cvs/cvsrep.

          cd workdir

          cvs co .

           

          …modify files…

           

          cvs commit -m "do some change"

           

          結論:

          1。我們不需要給cvs管理員以服務器的root賬號。而只需要一個公共的,可以訪問cvs庫目錄的賬號就可以。這個賬戶甚至不需要對外公布密碼,也不允許遠程登錄。

          2。我們不需要為每個cvs用戶創建cvs服務器的系統賬號,也無需依賴文件系統的訪問控制。

          3。我們可以為每個cvs庫指定庫管理員,由其對各自的cvs庫進行用戶的創建和權限分配。

          4。普通用戶可以自行修改cvs賬戶的密碼,無需管理員干預。

          5cvs服務器管理員的工作主要是創建cvs庫(可以創建特定的系統賬戶以負責cvs庫的創建和管理,不需要root賬戶),并負責服務器的日常維護,而日常的cvs管理由cvs庫各自的管理員完成。

          posted @ 2007-04-03 10:28 edsonjava 閱讀(313) | 評論 (0)編輯 收藏
           
          CVS服務器端和客戶端的配置:
          1、 下載并安裝CVS服務器。
          網址為:<http://www.cvsnt.com/cvspro/>,下載cvsnt 并安裝,我們用的版本號為:
          cvsnt-2.0.41.exe,
          參考:<http://www.devguy.com/fp/cfgmgmt/cvs/cvs_admin_nt.htm>

          2、 配置CVS服務器。
          啟動cvsnt控制面板Service control panel:
          切換到repositories控制版,點擊add按鈕,輸入你要建立的cvs服務器端文件保存的位置(最好輸入絕對路徑,例如:D:\cvs)。
          切換到Advance控制版,勾選Impersonation enable 和 Use local users for pserver authentication instead for domain users和 lock server listens local。
          注意:這樣就可以用CVS服務器的用戶名和密碼進行登陸。
          具體的添加用戶和權限的操作,請參考:
          <http://www.cvsnt.org/wiki/CvsCommand>
          <http://www.cvsnt.org/manual/>

          3、 安裝Eclipse客戶端。
          略。參見:www.eclipse.org

          4、 配置CVS客戶端。
          啟動eclipse,切換到CVS Repositories面板,右擊面板,選擇new/Repositor Location。出現Add CVS Repository 對話框。
          在對話框中填入:
          Host: 服務器Ip地址
          Repository path: cvs數據的路徑,如上為:D:\cvs (為配置CVS服務器時的路徑)
          User: 服務器的用戶名
          Password: 服務器的用戶名的密碼
          Connection type: pserver
          點擊Finish,完成建立過程。
          在建立的CVS Repositories面板中,選擇:head下的一個工程,即可進行各種操作。如:checkout
          將新建的工程上傳至cvs服務器:右擊工程,選擇:team-Share Project ,出現Share Project 對話框,然后選擇一個repositories地址,點擊next 下去,即可完成上傳。
          具體操作參考:<http://www.cvsnt.org/manual/>

          5、 命令方式訪問cvs服務器
          參加:<http://www.cvsnt.org/manual/>
          posted @ 2007-04-03 10:25 edsonjava 閱讀(790) | 評論 (1)編輯 收藏
           
               摘要: WAS6.1 +HIBERNATE+SPRING +MYECLIPSE5.1.1 整合 概述 Hibernate 是傳統的 Java 對象 ...  閱讀全文
          posted @ 2007-03-30 11:20 edsonjava 閱讀(3388) | 評論 (5)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          主站蜘蛛池模板: 上饶市| 简阳市| 股票| 上栗县| 长春市| 文安县| 封开县| 手游| 绥棱县| 阜宁县| 常宁市| 屏东县| 新绛县| 海淀区| 兴海县| 黑水县| 青海省| 当雄县| 长武县| 德保县| 德州市| 微山县| 南投市| 田东县| 长兴县| 元朗区| 遂平县| 辽源市| 江津市| 乌拉特中旗| 海兴县| 桂东县| 平罗县| 吴江市| 百色市| 永年县| 磐石市| 调兵山市| 高邮市| 昌邑市| 海宁市|