隨筆 - 40, 文章 - 0, 評論 - 20, 引用 - 0
          數(shù)據(jù)加載中……

          2005年6月1日

          J2me開發(fā)


          一些資料:




          http://www.csdn.net/subject/j2meTools/


          http://news.csdn.net/news/newstopic/24/24127.shtml



          posted @ 2006-11-01 15:30 月亮 閱讀(213) | 評論 (0)編輯 收藏

          游戲

          有個輸家,就一定有個贏家。我是輸家,但我四周望了一圈,卻沒看到半個贏家,我想,贏家應(yīng)該也是我了,你說呢?

          posted @ 2006-09-12 15:35 月亮 閱讀(208) | 評論 (1)編輯 收藏

          vi命令詳解

          vi命令是unix下常用而重要命令,可在全屏幕方式下編輯一個或多個文件。若在vi執(zhí)行時?
          沒有指定一個文件,那么vi命令會自動產(chǎn)生一個無名的空的工作文件。若指定的文件不存在,?
          那么就按指定的文件名創(chuàng)建一個新的文件。若對文件的修改不保存的話,v?i命令并不改變原?
          來文件的內(nèi)容。?

            注意:vi命令并不鎖住所編輯的文件,因此多個用戶可能在同時編輯一個文件,那么最后?
          保存的文件版本將被保留。?

          下面是vi命令使用的一些選項及含義:??????????

            -c?sub-command?在對指定的文件編輯前,先執(zhí)行指定的命令?sub-command?.?

            -r?filename?恢復(fù)指定的文件filename?.??????????

            -R?將指定的文件以只讀的方式放入編輯器中,這樣不會保存對文件的任何修?改。?

            -y?number?將編輯窗口的大小設(shè)為number行。??????????

            下面是vi編輯所處的三種模式:??????????

            .命令模式?進(jìn)入vi時所處的模式。在此模式下用戶可輸入各種子命令對進(jìn)行*作,如刪除行、?
          粘貼行、移向下一個字、移向不同行等。?

            .文本輸入模式?在此模式下可以修改一行的內(nèi)容并增添新行。在命令模式下鍵入a?、i?或?
          c鍵可進(jìn)入文本輸入模式,按Escape鍵可返回命令模式。?

            .命令項模式?在此模式下,可以通過子命令輸入更多的參數(shù)。如:w子命令要求輸入一文?
          件名,"/"子命令要求輸入一個查找項。用戶使用Escape鍵返回命令模式。?


          下面是自命令模式下執(zhí)行的,在同一行上移動的自命令:??????????

            h?將光標(biāo)左移一格。??????????

            l?將光標(biāo)右移一格。??????????

            j?將光標(biāo)下移一格。??????????

            k?將光標(biāo)上移一格。??????????

            w?將光標(biāo)移到下一個小字的前面。??????????

            W?將光標(biāo)移到下一個大字的前面。??????????

            b?將光標(biāo)移到前一個小字的前面。??????????

            B?將光標(biāo)移到前一個大字的前面。??????????

            e?將光標(biāo)移到下一個小字的后面。??????????

            E?將光標(biāo)移到前一個大字的后面。??????????

            fc?把光標(biāo)移到同一行的下一個c字符處。??????????

            Fc?把光標(biāo)移到同一行的前一個c字符處。??????????

            tc?把光標(biāo)移到同一行的下一個字符c的前一格。??????????

            Tc?把光標(biāo)移到同一行的前一個字符c的后一格。??????????

            number|?把光標(biāo)移到遞number列上。??????????

          下面是命令模式下在行間移動的子命令:??????????

            +或Enter?把光標(biāo)移至下一行第一個非空白字符。??????????

            -?把光標(biāo)移至上一行第一個非空白字符。??????????

            0?把光標(biāo)移到當(dāng)前行的第一個字符處。??????????

            $?把光標(biāo)移到當(dāng)前行的最后一個字符處。??????????

            H?把光標(biāo)移到屏幕最頂端一行。??????????

            L?把光標(biāo)移到屏幕最底端一行。??????????

            M?把光標(biāo)移到屏幕中間。??????????

          下面是命令模式下改變屏幕顯示的子命令:??????????

            z-?把當(dāng)前行作為屏幕的最后一行,并重新顯示屏幕。??????????

            z.?把當(dāng)前行作為屏幕的中間一行,并重新顯示屏幕。??????????

            Ctrl+l?重新顯示屏幕當(dāng)前內(nèi)容。??????????

            /pattern/z-?尋找pattern的下一個位置,并把所在行設(shè)為屏幕的最后一行。?

          下面是在命令模式下用來顯示頁面的子命令:??????????

            Ctrl?+?f向后滾一頁。??????????

            Ctrl?+?d向后滾半頁。??????????

            Ctrl?+?b向前滾一頁。??????????

            Ctrl?+?u向前滾半頁。??????????

            Ctrl?+?e屏幕向下滾一行。??????????

            Ctrl?+?y屏幕項上滾一行。??????????

          下面是在命令模式下用來查找字符串所使用的子命令:??????????

            /pattern?向后尋找指定的pattern?,若遇到文件尾,則從頭再開始。?

            ?pattern?向前尋找指定的pattern?,若遇到文件頭,則從尾再開始。?

            n?在上次指定的方向上,再次執(zhí)行上次定義的查找。??????????

            N?在上次指定的方向的相反方向上,再次執(zhí)行上次定義的查找。??????????

            /pattern/+number?將光標(biāo)停在包含pattern的行后面第number行上。?

            /pattern/-number?將光標(biāo)停在包含pattern的行前面第number行上。?

            %?移到匹配的"()"或"{}"上。??????????

          下面是在文本輸入模式下用來輸入文本的子命令(用戶可在任何時候按Escape返回到命令模式):?

            a?在光標(biāo)之后開始輸入文本。??????????

            A在行尾開始輸入文本。??????????

            i在光標(biāo)之前開始輸入文本。??????????

            I在行首第一個非空白字符前輸入文本。??????????

            o在光標(biāo)所在行后插入一空行。??????????

            O在光標(biāo)所在行前插入一空行。??????????

          下面是在命令模式下改變文本所使用的子命令(用戶可在任何的時候按Escape鍵返回到命令模式):?

            cc或S?修改一整行。??????????

            C?改變一行光標(biāo)位置以后的部分。??????????

            cw?改變光標(biāo)所在單詞。??????????

            dd刪除當(dāng)前行。??????????

            D?刪除光標(biāo)所在行光標(biāo)后面的內(nèi)容。??????????

            dw刪除光標(biāo)所在的單詞。??????????

            J?把下一行內(nèi)容加到本行行尾。??????????

            rc把光符所在字符替換成c?.??????????

            R?覆蓋本行內(nèi)容。??????????

            u恢復(fù)上一次的修改。??????????

            x刪除光標(biāo)所在的字符。??????????

            ~?改變光標(biāo)所在出字符的大小寫。??????????

            .?重復(fù)上一個*作。??????????

            <<把當(dāng)前行移到左邊。??????????

            >>把當(dāng)前行移到右邊。??????????

          下面是用于文件中拷貝文本的字命令:??????????

            p?將緩沖區(qū)內(nèi)容取到光標(biāo)所在行的下面一行。??????????

            P?將緩沖區(qū)內(nèi)容取到光標(biāo)所在行的上面一行。??????????

            "bd?將文本刪除至有名緩沖區(qū)b?.??????????

            "bp?張貼有名緩沖區(qū)b中內(nèi)容。??????????

            yy把當(dāng)前行放入緩沖區(qū)。??????????

            Y?把當(dāng)前行放入緩沖區(qū)。??????????

            Yw把光標(biāo)所在的單詞放入緩沖區(qū)。??????????

          下面是用于保存文件的子命令:??????????

            :w?回寫修改后的文件。??????????

            :w?filename?當(dāng)filename不存在時,把修改后的文件存為文件filename?,當(dāng)文件filename?
          存在時,報錯。?

            !w?filename?如果文件filename存在時,把修改后的文件保存為文件filename?.?

          下面列出了在vi編輯的多個文件之間切換所用的子命令:??????????

            :n開始編輯vi激活的文件列表中的下一個文件。??????????

            :n?filenames?指定將被編輯的新的文件列表。??????????

          下面列出了用于在當(dāng)前文件和另外一個文件間切換的子命令:??????????

            :e?filename?使用filename激活vi?(在vi中裝入另一個文件filename)。?

            e!重新裝入當(dāng)前文件,若當(dāng)前文件有改動,則丟棄以前的改動。??????????

            :e+filename?使用filename激活vi?,并從文件尾部開始編輯。?

            :e+number?filename?使用filename激活vi?,并在第number行開始編輯。?

            :e#?開始編輯另外一個文件。??????????

          下面是在本文件中加入其他文件代碼所使用的子命令:??????????

            :r?filename讀取filename文件,并將其內(nèi)容加到當(dāng)前文件后。???

            :r?!?command執(zhí)行command文件,并將其輸出加到當(dāng)前文件后。???

          下面是vi中其他的子命令:??????????

            ctrl+g?取得正在編輯文件的有關(guān)信息。??????????

            :sh啟動sh?,從sh中返回可用exit或ctrl+d?.??????????

            :!?Command?執(zhí)行命令command?.??????????

            !!重新執(zhí)行上次的:!?Command子命令。??????????

            :q退出vi?,若用戶對編輯的文件有所修改,系統(tǒng)不會讓用戶使用q命令退出。???

            :q!退出vi而不管是否對文件有改動。??????????

            ZZ或:wq?保存對文件的修改并退出vi?.??????????

            用戶可在一個特殊的文件.exrc中定義特殊的vi命令。在vi中使用這些命令時,必須在該?
          命令前加上一個冒號(?:)?。

          posted @ 2006-05-13 15:13 月亮 閱讀(344) | 評論 (0)編輯 收藏

          精通Log4j

          ?log4j雖然總的來說是比較容易使用的,但是要是想比較精通的操縱它還是有很多地方值得探討的。
          ??? 這幾天有空,把項目中大家用到的log4j實現(xiàn)的功能分了一下類,大致分為下面三類:
          ??? <1>所有的日志信息都輸出到log.log.
          ??? <2>對于一些特殊的日志(如啟動時候的日志),輸出到log/startup/startup.log.
          ??? <3>對于某些特殊包下面的日志,如com.aspire包下面的error信息都輸出到error.log???
          ??? 有了這幾個功能,相信對于大部分的系統(tǒng)都是夠用的了,下面這個例子就是實現(xiàn)了這幾個功能:
          ??? (至于其他的一些配置,如格式這些的就不說明,有很多這種資料)
          ???
          ??? ***********? log4j 配置文件? ************???
          ???
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
          <log4j:configuration xmlns:log4j="

          <appender name="file" class="org.apache.log4j.RollingFileAppender">
          ?<param name="File" value="log.log"/>
          ?<layout class="org.apache.log4j.PatternLayout">
          ?<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n"/>
          ?</layout>
          </appender>

          <appender name="error" class="org.apache.log4j.RollingFileAppender">
          ??<param name="File" value="error.log"/>
          ??<param name="MaxBackupIndex" value="300"/>
          ??<param name="Encoding" value="GB2312"/>
          ??<param name="MaxFileSize" value="20MB"/>
          ??<layout class="org.apache.log4j.PatternLayout">
          ???<param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/>
          ??</layout>
          ??? <filter class="org.apache.log4j.varia.LevelRangeFilter">
          ??<!-- 過濾,只記錄error信息-->
          ??<param name="LevelMin" value="error"/>
          ??<param name="LevelMax" value="error"/>
          ??<param name="acceptOnMatch" value="true"/>
          ??? </filter>
          </appender>
          <appender name="startup" class="com.aspire.TimeSizeRollingFileAppender">
          ??<!--該類使自己從FileAppender派生,可以自己控制輸出文件的路徑 -->
          ??<param name="File" value="log/startup/startup.log" />
          ??<param name="Encoding" value="GBK" />
          ??<layout class="org.apache.log4j.PatternLayout">
          ???<param name="ConversionPattern" value="%m %d{ISO8601}- %m%n %p %l%n" />
          ??</layout>
          </appender>

          <logger name="biz.startup">
          <!--Logger logger = Logger.getLogger("biz.startup") 可以這樣來調(diào)用本logger-->
          ??<level value="debug" />
          ??<appender-ref ref="startup" />
          </logger>

          <logger name="com.aspire" additivity="false">
          <!--Log log = LogFactory.getLog(TestLog4j.class) 此時如果TestLog4j
          ??? 位于com.aspire包下面,那么使用本logger
          ?-->
          ??<level value="debug"/>
          ??<appender-ref ref="error"/>
          </logger>
          <root>
          <level value="info"/>
          <!-- 默認(rèn)輸出到log.log-->
          <appender-ref ref="file"/>
          </root>
          </log4j:configuration>

          ***********? log4j 配置文件結(jié)束 ************

          **********? 派生的TimeSizeRollingFileAppender類*****
          package com.aspire;

          import org.apache.log4j.FileAppender;
          import org.apache.log4j.spi.ErrorCode;
          import java.io.File;
          import java.io.IOException;

          public class TimeSizeRollingFileAppender
          ??? extends FileAppender
          ??? implements ErrorCode {

          ? private final static String FS = System.getProperty("file.separator");
          ? public TimeSizeRollingFileAppender() {
          ? }
          ? public void setFile(String file) {
          ??? String val = file.trim();
          ??? File domain = new File(".");
          ??? try {
          ????? fileName = domain.getCanonicalPath() + FS + val;
          ??? }
          ??? catch (IOException ex) {
          ????? ex.printStackTrace();
          ??? }
          ? }
          }

          ********** TimeSizeRollingFileAppender 類結(jié)束 ******

          ************ 調(diào)用示例 TestLog4j類 **************
          package com.aspire;

          import org.apache.log4j.Logger;
          import org.apache.log4j.LogManager;
          import org.apache.commons.logging.LogFactory;
          import org.apache.log4j.xml.DOMConfigurator;
          import org.apache.commons.logging.Log;

          public class TestLog4j {
          ? private Logger logger = Logger.getLogger("biz.startup");
          ? private Log log = LogFactory.getLog(TestLog4j.class);

          ? public static void config(){
          ??? DOMConfigurator.configure("conf\\log4jConf.xml");
          ? }
          ? public void Test(){
          ??? /**
          ???? * error > warn > info > debug
          ???? */
          ??? logger.error("*****error*****");
          ??? logger.debug("****debug*****");
          ??? logger.warn("*****warn******");
          ??? logger.info("*****info******");
          ??? log.error("中華之崛起!");
          ? }
          ? public static void main(String [] argv){
          ??? TestLog4j t = new TestLog4j();
          ??? TestLog4j.config();
          ??? t.Test();
          ? }
          }

          ***************? TestLog4j end ***********

          posted @ 2006-04-26 12:59 月亮 閱讀(403) | 評論 (0)編輯 收藏

          23種經(jīng)典的設(shè)計模式_Prototype模式(原形模式)

          很多時候,創(chuàng)建對象的時候,只是在某些屬性值上有區(qū)別,而大部分都很相似,但是這樣的對象的初始化相對來說比較復(fù)雜,而且
          需要耗費較長的時間或資源,這種情況下,我們可以考慮使用Prototype模式。我覺得這種模式實用于這樣的情況:如果該類的用戶對于該
          類的對象是怎么創(chuàng)建的,對類的內(nèi)部結(jié)構(gòu)這些都不關(guān)心的情況,并且該類的創(chuàng)建過程比較費時或資源時,可以考慮使用該模式。下面是該模式的
          一個例子:

          Prototype 類

          package com.moonsoft;

          import java.lang.Cloneable;
          public class Prototype implements Cloneable {
          ?
          ?public String myname;
          ?
          ?Prototype(){
          ??System.out.println("start:"+System.currentTimeMillis());
          ??for( int i=0; i< 9999999; i++){???
          ??}
          ??System.out.println("end:"+System.currentTimeMillis());
          ?}
          ?
          ?public Object clone(){
          ??Object o = null;
          ??try{
          ???o = super.clone();???
          ??}
          ??catch(CloneNotSupportedException ex){
          ???ex.printStackTrace();
          ??}
          ??return o;
          ?}
          ?
          ?public void whoami(){
          ??System.out.println(myname);
          ?}
          }


          測試類

          package com.moonsoft;

          public class Test {
          ?
          ?public static void main(String [] argv){
          ??Prototype? p = new Prototype();
          ??p.whoami();
          ??p.myname = "loucy";
          ??Prototype? p1 = (Prototype)p.clone();
          ??p1.whoami();?
          ??
          ?}
          }

          posted @ 2006-04-16 15:21 月亮 閱讀(559) | 評論 (0)編輯 收藏

          小技巧_jsp緩存問題的解決

          如果一直為jsp的緩存問題困擾的話,可以試試在jsp中加入以下幾句話:

          <head>
          <meta http-equiv="Cache-Control" content="max-age=0" forua="true" />
          <meta http-equiv="Cache-Control" content="no-cache" forua="true"/>
          <meta http-equiv="Cache-Control" content="must-revalidate" forua="true" />
          </head>

          max-age=30 就表示緩存的最長存在時間是30s,no-cache表示無緩存,must-revalidate表示每次訪問必須重新驗證是否有更新!

          posted @ 2006-04-04 15:11 月亮 閱讀(666) | 評論 (0)編輯 收藏

          用Java實現(xiàn)的Html web服務(wù)器

          ? 馬上就要開始轉(zhuǎn)到新的項目組,做一個全新的項目了,對于HTTP協(xié)議需要一定的了解,所以周末自己用Java寫了一個簡單的web服務(wù)器試試,只能實現(xiàn)簡單的html文件瀏覽。

          主要包括三個類:WebServer(監(jiān)聽瀏覽器請求),SocketThread(處理瀏覽器請求的進(jìn)程),StringUtil(實現(xiàn)一些公共的操作),下面是三個類的代碼.


          ----WebServer----
          import java.io.IOException;
          import java.net.ServerSocket;
          import java.net.Socket;

          public class WebServer {
          ?
          ?public static void main(String[] argv) throws IOException {
          ??ServerSocket servSocket = new ServerSocket(StringUtil.LISTENING_PORT);
          ??try {
          ???while (true) {
          ????Socket socket = servSocket.accept();
          ????new SocketThread(socket).start();
          ???}
          ??} finally {
          ???servSocket.close();
          ??}
          ?}
          }

          ---SocketThread------
          import java.io.BufferedReader;
          import java.io.BufferedWriter;
          import java.io.File;
          import java.io.InputStreamReader;
          import java.io.OutputStreamWriter;
          import java.io.PrintStream;
          import java.io.Writer;
          import java.net.Socket;

          public class SocketThread extends Thread {
          ?private Socket socket = null;

          ?public SocketThread(Socket s) {
          ??this.socket = s;
          ?}

          ?public void run() {
          ??try {
          ???if (socket == null) {
          ????throw new Exception("==>SOCKET為空<==");
          ???}
          ???BufferedReader reader = new BufferedReader(new InputStreamReader(
          ?????socket.getInputStream()));
          ???String fileName = "";
          ???while (true) {
          ????String str = reader.readLine();
          ????if (str == null || str.length() <= 0) {
          ?????break;
          ????}
          ????//System.out.println("===>"+str);
          ????if (StringUtil.isGetRequestInfo(str)) {
          ?????fileName = StringUtil.getFileName(str);
          ?????break;
          ????}
          ???}
          ???//System.out.println("===>客戶機(jī)IP==>"+socket.getInetAddress().toString());
          ???//System.out.println("===>客戶機(jī)端口==>"+socket.getPort());???
          ???/*
          ??? BufferedWriter writer = new BufferedWriter(new
          ??? OutputStreamWriter(socket.getOutputStream()));
          ??? */
          ???PrintStream outputStream = new PrintStream(socket.getOutputStream());
          ???File file = new File(StringUtil.WEBPATH + fileName);
          ???if (file.exists()) { //如果文件存在
          ????StringUtil.sendHttpHead(outputStream, file);
          ????StringUtil.sendFile(outputStream, file);
          ????outputStream.flush();
          ???} else { //文件沒找到,返回404頁面
          ????StringUtil.send404Page(outputStream);
          ????outputStream.flush();
          ???}
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????socket.close();
          ???} catch (Exception e) {
          ???}
          ??}
          ?}

          }



          ---StringUtil-----
          import java.io.DataInputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.PrintStream;

          /**
          ?* @author xiaoliang
          ?*/
          public class StringUtil {

          ?// 服務(wù)器監(jiān)聽的端口
          ?public static final int LISTENING_PORT = 8080;

          ?// 服務(wù)器文件的位置
          ?public static final String WEBPATH = "E:";

          ?/**
          ? * 判斷該字符串是不是瀏覽器發(fā)送過來的請求頭信息
          ? * @param str
          ? * @return
          ? */
          ?public static boolean isGetRequestInfo(String str) {
          ??if (str == null || str.length() <= 0)
          ???return false;
          ??boolean isGetStr = true;
          ??if (str.indexOf("GET") != 0) {
          ???isGetStr = false;
          ??}
          ??if (str.indexOf("HTTP/") <= 0) {
          ???isGetStr = false;
          ??}
          ??return isGetStr;
          ?}

          ?/**
          ? * 獲得請求信息中的文件名,默認(rèn)為index.html
          ? *
          ? * @param str
          ? * @return
          ? */
          ?public static String getFileName(String str) {
          ??String fileName = "index.html", s;
          ??int httpIndex = str.lastIndexOf("HTTP/");
          ??s = str.substring(3, httpIndex);
          ??s = s.trim();
          ??if (s != null && s.length() > 0 && s.indexOf(".") > 0) {
          ???fileName = s;
          ??}
          ??return fileName;
          ?}

          ?/**
          ? * 發(fā)送文件到客戶端
          ? *
          ? * @param out
          ? * @param file
          ? */
          ?public static void sendFile(PrintStream out, File file) {
          ??try {
          ???DataInputStream in = new DataInputStream(new FileInputStream(file));
          ???int length = (int) file.length();
          ???byte[] buffer = new byte[length];
          ???in.readFully(buffer);
          ???out.write(buffer, 0, length);
          ???in.close();
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ?}

          ?/**
          ? * 發(fā)送返回的頭部信息
          ? * @param out
          ? */
          ?public static void sendHttpHead(PrintStream outputStream, File file) {
          ??try {
          ???outputStream.println("HTTP/1.0200OK");
          ???outputStream.println("Content_Type:text/htm1");
          ???outputStream.println("Content_Length:" + file.length());
          ???outputStream.println("Server:moon webserver 1.0");
          ???outputStream.println("");
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ?}

          ?/**
          ? * 返回404頁面
          ? * @param out
          ? */
          ?public static void send404Page(PrintStream out) {
          ??try {
          ???out.println("HTTP /1.0 404 no found");
          ???out.println("Content_type:text/html");
          ???out.println("");
          ???out.println("Error404:file not found!");
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ?}
          ?
          ?public static void main(String[] argv) {
          ??String str = "GET /11.html HTTP/1.1";
          ??str = StringUtil.getFileName(str);
          ??System.out.println("==>" + str + "<==");
          ??File file = new File(StringUtil.WEBPATH + str);
          ??if (file.exists()) {
          ???System.out.println("exists");
          ??} else {
          ???System.out.println("not exists");
          ??}
          ?}

          }

          posted @ 2006-03-28 13:55 月亮 閱讀(456) | 評論 (0)編輯 收藏

          Apache FileUpload 使用

          FileUpload 組件使用注意:
          1>
          首先創(chuàng)建一個HTML頁面。注意,凡是要上載文件的表單都必須設(shè)置enctype屬性,且屬性的值必須是multipart/form-data,同時請求方法必須是POST.
          <form name="myform" action="fileuploaddemo.jsp"  method="post" enctype="multipart/form-data">
           
          2>commons-fileupload-1.1.jar和commons-io-1.1.jar 兩個包都要引入,
          因為在parseRequest(request)的類有關(guān)繼承于DiskFileItem類。

          3>示例
                //檢查表單是否正確
                boolean isMultipart = FileUpload.isMultipartContent(request);
                DiskFileItemFactory  factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                //文件最大,設(shè)為-1表示不受限制
                upload.setSizeMax(4096);
                //解析請求,把解析的結(jié)果放在一個List里面
                List items = upload.parseRequest(request);
                //緩存大小,設(shè)為-1表示不受限制
                factory.setSizeThreshold(4096);
                //設(shè)置臨時目錄
                factory.setRepository(new File("D:\\temp"));
                Iterator iter = items.iterator();
                while( iter.hasNext() ){
                  FileItem item  = (FileItem)iter.next();
                  //檢查是一個普通的表單域還是File組件
                  if( !item.isFormField() ){
                    System.out.println("FileName:==>"+item.getName());
                    System.out.println("FieldName:==>"+item.getFieldName());
                    System.out.println("Size:==>"+item.getSize());
                    //item.getName 返回的是完整的文件名,如:E:\\xx\11.doc
                    //所以這里用一個fullFile來取文件名
                    File fullFile  = new File(item.getName());
                    File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
                    item.write(uploadedFile);
                  }
                }

          posted @ 2006-03-06 12:33 月亮 閱讀(1851) | 評論 (1)編輯 收藏

          EJB QL

          從一個表users中查詢記錄,如果是寫成
          select  i from  users as  i  where i.name=?1則編譯EJB的時候會報錯,但是如果把users 首字母大寫就OK了。
          select  i from  Users as  i  where i.name=?1

          posted @ 2006-02-27 23:34 月亮 閱讀(247) | 評論 (0)編輯 收藏

          EJb 會話Bean

          在EJB容器中,SessionBean主要有兩種:無狀態(tài)(stateless)和有狀態(tài)(stateful)。
          1、無狀態(tài)EJB,類似Servlet,它只提供一個引用(Bean instance),被所有客戶端使用,不保留某個客戶的單獨信息。
          例如:在某無狀態(tài)EJB中,有一個數(shù)據(jù)成員(變量) i_count (整型,用于訪問計數(shù),初始值為0,訪問一次累加1),它是公共的。某客戶端訪問后,值累加為1。另一個客戶端訪問時是已經(jīng)變化了的值為1。

          2、有狀態(tài)EJB,類似數(shù)據(jù)庫的Connect鏈接,也類似線程守護(hù),它提供引用池(Bean instance pool),每個客戶端會有單獨的信息。
          例如:在某有狀態(tài)EJB中,有一個數(shù)據(jù)成員(變量) i_count (整型,用于訪問計數(shù),初始值為0,訪問一次累加1),它對每個客戶端來說是隔離的。某客戶端訪問后,值累加為1。另一個客戶端訪問時還是原來的值為0。

          這里提到的數(shù)據(jù)成員(變量) i_count ,在EJB規(guī)范中稱作:conversational state 。對它的要求也很多的,例如類型為 Serializable objects。還有,還要在ejbActivate(),ejbPassivate(),ejbRemove()等生命周期約定的方法中處理。詳見EJB規(guī)范吧。

          我的感想:在看第一遍書時,還一點感覺都沒有,根本就看不明白SessionBean中的session與Servlet容器中的session有什么區(qū)別。
          動手編程后,才感覺到EJB只是比Servlet更規(guī)范,更重量而已。真正的區(qū)別就是接口協(xié)議一個是基于HTTP,一個是基于RMI/IIOP。Servlet與無狀態(tài)的SessionBean在Session上是一樣的控制。Servlet中的Session對象與有狀態(tài)的SessionBean是一樣的控制。
          對于應(yīng)用,例如有一個購物車,要記錄正在采購的物品信息,沒有EJB時,我們一般是存在Servlet容器中的session中。有了EJB,則可以存儲在有狀態(tài)的SessionBean中,并且該次有狀態(tài)的sessionBean的instance還得保存在Servlet的session中。這樣的好處是:至少可以減輕Servlet容器的負(fù)載。



          轉(zhuǎn)自:
          http://zengabo.blogchina.com/blog/527365.html

          posted @ 2006-02-22 16:35 月亮 閱讀(256) | 評論 (0)編輯 收藏

          Ibatis示例


          1.將ibatis 的jar 包添加到工程中

          2.先新建一個xml文件 SqlMap.xml,在這個文件中定義使用了哪些ibatis資源文件
          <?xml version="1.0" encoding="gb2312"?>
          <!DOCTYPE sql-map-config PUBLIC "-//iBATIS.com//DTD SQL Map Config 1.0//EN"
              "<sql-map-config>
            <sql-map  resource="com/montersoft/ibatis/common/monter.xml"/>
          </sql-map-config>

          3.定義資源文件monter.xml
          <?xml version="1.0" encoding="gb2312"?>
          <!DOCTYPE sql-map
              PUBLIC "-//iBATIS.com//DTD SQL Map 1.0//EN"
              "
          <sql-map name="monter">
             <result-map name="monterInfo" class="java.util.HashMap">
               <property name="id"  column="id" type="VARCHAR"/>
               <property name="name" column="name" type="VARCHAR"/>
               <property name="age"  column="age"  type="NUMBERIC"/>
             </result-map>  
             <dynamic-mapped-statement name="monter_getByPk" result-map="monterInfo">
             select id,name,age from monter where id = #id#
             </dynamic-mapped-statement>
          </sql-map>

          **注意dynamic-mapped-statement的name 必須唯一

          4.定義一個公共類來生成SqlMap
          package com.montersoft.ibatis.common;
          import java.io.Reader;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import com.ibatis.common.resources.Resources;
          import com.ibatis.db.sqlmap.SqlMap;
          import com.ibatis.db.sqlmap.XmlSqlMapBuilder;
          public class SqlMapUtil { 
           private static Log loger = LogFactory.getLog(SqlMapUtil.class);
           public  static SqlMap  sqlMap ; 
           public static SqlMap loadSqlMap(){
            Reader reader = null;
            try{
             reader = Resources.getResourceAsReader("com/montersoft/ibatis/common/SqlMap.xml");
             return XmlSqlMapBuilder.buildSqlMap(reader);
            }
            catch(Exception e){   
             loger.error("there is a error=>"+e.getMessage());
            }
            return null;
           } 
           public static SqlMap getSqlMap(){
            if( sqlMap == null )
             sqlMap = loadSqlMap();
            return sqlMap;
           } 
          }
          5.再新建DAO,Vo,
          public interface  IVO { 
          }
          public class MonterVo implements IVO{ 
           public String id ;
           public String name;
           public int age;
           ...省去 get ,set 方法
          }
          public class MonterDao { 
             public IVO getBkPK(Connection conn,IVO vo) throws Exception{
              try{    
              Object map  =  SqlMapUtil.getSqlMap().
                 getMappedStatement("monter_getByPk").executeQueryForObject(conn,vo);
              return   copyMap2Vo(map);
              }
              catch(Exception e){       
                  throw new Exception(e.getMessage());
              }
             }  
             private IVO copyMap2Vo(Object map){
              MonterVo vo = new MonterVo();
            try{
             BeanUtils.copyProperties(vo,map);
            }
            catch(Exception e){
             e.printStackTrace();
            }
            return vo;
           }
          }

          6.至此就建立了一個簡單的ibatis示例.

          posted @ 2006-01-06 16:39 月亮 閱讀(331) | 評論 (0)編輯 收藏

          通過weblogic的數(shù)據(jù)源獲得數(shù)據(jù)庫連接的方法

          通過weblogic的數(shù)據(jù)源獲得數(shù)據(jù)庫連接的方法:

          package com.moonsoft.datasource;

          import javax.naming.NamingException;
          import java.util.Hashtable;
          import javax.naming.InitialContext;
          import java.sql.Connection;
          import javax.sql.DataSource;
          import java.sql.SQLException;
          import java.sql.PreparedStatement;
          import java.sql.ResultSet;

          public class TestDataSource {

            public static String WEB_URL = "t3://localhost:9000";
            public static String DATA_SOURCE = "JDBCDS";
            public static String weblogic_context_factory =
                "weblogic.jndi.WLInitialContextFactory";
            public TestDataSource() {
            }
            public static Object lookUp() throws NamingException {
              Hashtable env = new Hashtable();
              env.put(InitialContext.INITIAL_CONTEXT_FACTORY, weblogic_context_factory);
              env.put(InitialContext.PROVIDER_URL, WEB_URL);
              InitialContext tempContext = new InitialContext(env);
              return tempContext.lookup(DATA_SOURCE);
            }
            public static Connection getConnection() throws SQLException {
              Connection conn = null;
              try {
                DataSource ds = (DataSource) lookUp();
                if (ds == null) {
                  throw new SQLException("查詢到空數(shù)據(jù)源!");
                }
                conn = ds.getConnection();
              }
              catch (NamingException ex) {
                ex.printStackTrace();
              }
              return conn;
            }
            public static void releaseConnection(Connection conn, PreparedStatement sta,
                                                 ResultSet rs) {
              try {
                if (rs != null) {
                  rs.close();
                }
                if (sta != null)
                  sta.close();
                if (conn != null)
                  conn.close();
              }
              catch (Exception ex) {
                ex.printStackTrace();
              }
            }
            public static void testSearch() {
              Connection conn = null;
              PreparedStatement sta = null;
              ResultSet rs = null;
              try {
                conn = getConnection();
                String sql = "select * from admin_config where config_name like ?";
                sta = conn.prepareStatement(sql);
                sta.setString(1,"%Sms%");
                rs = sta.executeQuery();
                if (rs != null) {
                  while (rs.next()) {
                    System.out.println(rs.getString(1));
                  }
                }
              }
              catch (Exception ex) {
                ex.printStackTrace();
              }
              finally {
                releaseConnection(conn,sta,rs);
              }
            }
            public static void main(String [] argv){
              testSearch();
            }
          }

          posted @ 2006-01-05 10:51 月亮 閱讀(1241) | 評論 (0)編輯 收藏

          一個設(shè)計中使用比較多的模式

          如果是在需求還沒確定或者是在兩個類實現(xiàn)相近功能時候,會大量使用下面的方式:
          --抽象類,注意其中的newInstance方法的實現(xiàn)
          package com.moonsoft.design;
          public  abstract class Moon {
            public static Moon newInstance(String classStr){
              Class re;
              try {
                re =  Class.forName(classStr);
                return (Moon)re.newInstance();
              }
              catch (Exception ex) {
                ex.printStackTrace();
              }
              return null;
            }
            public abstract void  println();
          }
          --從Moon類派生出來的一個字類,提供println方法的一種實現(xiàn)方式
          package com.moonsoft.design;
          public class Moon1 extends Moon {
            public void println(){
              System.out.println("I am moon1");
            }
            public void myprintln(){
              System.out.println("I am moon1 myprintln");
            }
          }
          --從Moon類派生出來的另一個字類,提供println方法的另一種實現(xiàn)方式
          package com.moonsoft.design;
          public class Moon2 extends Moon {
             public void println(){
              System.out.println("I am moon2!");
            }
          }
          --調(diào)用
           Moon moon = Moon.newInstance("com.moonsoft.design.Moon1");
           moon.println();
           或
           Moon moon = Moon.newInstance("com.moonsoft.design.Moon2");
           moon.println();

          posted @ 2006-01-04 16:41 月亮 閱讀(101) | 評論 (0)編輯 收藏

          JSP標(biāo)簽的使用方法


          如要在JSP頁面上有一個鏈接,Url值是通過參數(shù)輸入的,用JSP標(biāo)簽的實現(xiàn)步驟(當(dāng)然實際中不會用標(biāo)簽來完成這么簡單的功能):

          <一>.先從javax.servlet.jsp.tagext.BodyTagSupport派生一個新的類,并重載它的doStartTag()方法.如果是想要傳入?yún)?shù)的話,則還要在Bean中加入想要的變量,如這里要傳入一個url值,所以添加一個參數(shù):linkUrl. 最后代碼如下:

          package com.moonsoft.jsptag;
          import javax.servlet.jsp.tagext.BodyTagSupport;
          import javax.servlet.jsp.JspTagException;
          import javax.servlet.jsp.JspException;
          public class UrlLinkTag extends BodyTagSupport  {
            private String linkUrl;
            public UrlLinkTag() {
            }
            public String getLinkUrl() {
              return linkUrl;
            }
            public void setLinkUrl(String linkUrl) {
              this.linkUrl = linkUrl;
            }
            public int doStartTag() throws JspException{
              try {
                this.pageContext
                    .getOut().print("<a href=\'"+linkUrl+"\' >"+linkUrl+"</a>");
              }
              catch (Exception ex) {
                ex.printStackTrace();
              }
              return 0;
            }
          }

          <二>新建一個tld文件,內(nèi)容如下:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
           " <taglib>
                  <tlibversion>1.0</tlibversion>
           <jspversion>1.1</jspversion>
           <shortname>buttons</shortname>
           <uri>http://www.borland.com/jbuilder/internetbeans.tld</uri>
           <info>
           JSP tag extensions for InternetBeans Express
            </info>
              <tag>
           <name>urllink</name>
           <tagclass>com.moonsoft.jsptag.UrlLinkTag</tagclass>
           <bodycontent>jsp</bodycontent>
           <attribute>
            <name>linkUrl</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
           </attribute>
              </tag>
             </taglib>
            
          <三>在web.xml中引入這個taglib,在其中加入:

          <taglib>
              <taglib-uri>/moon</taglib-uri>
              <taglib-location>/WEB-INF/classes/com/moonsoft/jsptag/UrlLinkTag.tld</taglib-location>
          </taglib>


          <四>在jsp中引入這個標(biāo)簽
          <%@ taglib uri="/moon" prefix="mylinkurl" %>
          這里uri是和web.xml中配置的taglib-uri對應(yīng)的,prefix值只是在本jsp頁面作為標(biāo)示用.

          下面就可以在jsp中使用這個標(biāo)簽了:

          <mylinkurl:urllink linkUrl="

          這里面的mylinkurl為在本jsp頁面中設(shè)置的prefix值,urllink為tld文件中tag name,linkUrl為輸入的參數(shù)

          這樣就在jsp頁面上加入了一個:
          <a >http://www.baidu.com</a>鏈接

          posted @ 2005-12-29 13:47 月亮 閱讀(1432) | 評論 (0)編輯 收藏

          Java Excel 使用攻略

           現(xiàn)在正在做的項目中涉及大量的Excel文件導(dǎo)出導(dǎo)入操作,都是使用Java Excel來操作。

          Java Excel是一開放源碼項目,通過它Java開發(fā)人員可以讀取Excel文件的內(nèi)容、創(chuàng)建新的Excel文件、更新已經(jīng)存在的Excel文件。下面我寫了一個簡單的例子,展示基本的讀取,新建,更新(包括常見格式的設(shè)置:字體,顏色,背景,合并單元格),拷貝操作,有這些其實已經(jīng)基本足夠應(yīng)付大部分問題了。下面是例的源代碼:

          import java.io.*;
          import java.util.Date;

          import jxl.*;
          import jxl.format.Colour;
          import jxl.format.UnderlineStyle;
          import jxl.read.biff.BiffException;
          import jxl.write.*;
          import jxl.format.UnderlineStyle;
          import jxl.format.CellFormat;;

          public class OperateExcel {
           
           /**
            * Read data from a excel file
            */
           public static void  readExcel(String excelFileName){
            Workbook  rwb = null;  
            try{
             InputStream stream = new FileInputStream(excelFileName);
             rwb = Workbook.getWorkbook(stream);
             Sheet  sheet = rwb.getSheet(0);
             Cell   cell  = null;
             int columns = sheet.getColumns();
             int rows    = sheet.getRows();
             for( int i=0 ; i< rows ; i++ )
              for( int j=0 ; j< columns ; j++){
               //attention: The first parameter is column,the second parameter is row.  
               cell = sheet.getCell(j,i);    
               String str00 = cell.getContents();
               if( cell.getType() == CellType.LABEL )
                 str00 += " LAEBL";
               else if( cell.getType() == CellType.NUMBER)
                 str00 += " number";
               else if( cell.getType() == CellType.DATE)
                 str00 += " date"; 
               System.out.println("00==>"+str00);
              } 
             stream.close();
            }
            catch(IOException e){  
             e.printStackTrace();
            }
            catch(BiffException e){
             e.printStackTrace();
            } 
            finally{  
             rwb.close();
            }
           }
           /**
            * create a new excelFile
            * @param excelFileName create name
            */
           public static void createExcelFile(String excelFileName){
            try{
             WritableWorkbook wwb = Workbook.createWorkbook(new File(excelFileName));
             WritableSheet     ws  = wwb.createSheet("sheet1",0);
             //also,The first parameter is  column,the second parameter is row.
             // add normal label data
             Label label00 = new Label(0,0,"Label00");
             ws.addCell(label00);
             //add font formating data   
             WritableFont  wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD , true);
             WritableCellFormat wff = new WritableCellFormat(wf);
             Label label10 = new Label(1,0,"Label10",wff);
             ws.addCell(label10);
             //add color font formating data
             WritableFont wf_color = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,UnderlineStyle.DOUBLE_ACCOUNTING,Colour.RED);
             WritableCellFormat wff_color = new WritableCellFormat(wf_color);
             wff_color.setBackground(Colour.GRAY_25); //set background coloe to gray  
             Label label20 = new Label(2,0,"Label20",wff_color);   
             ws.addCell(label20);
             
             //合并單元格
             WritableFont wf_merge = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,UnderlineStyle.DOUBLE_ACCOUNTING,Colour.GREEN);
             WritableCellFormat wff_merge = new WritableCellFormat(wf_merge);
             wff_merge.setBackground(Colour.BLACK);
             Label label30 = new Label(3,0,"Label30",wff_merge);   
             ws.addCell(label30);
             Label label40 = new Label(4,0,"Label40");
             ws.addCell(label40);
             Label label50 = new Label(5,0,"Label50");
             ws.addCell(label50);
               //合并 (0,3) (4,0)
               //attention : 如果合并后面的列不為空,那么就把后面格的內(nèi)容清空,格式也是按前一個單元格的格式
             ws.mergeCells(3,0,4,0);
             
             //添加Number格式數(shù)據(jù)
             jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
             ws.addCell(labelN);
             
             //添加帶有formatting的Number對象
             jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
             jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
             jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
             ws.addCell(labelNF);
             
             //添加Boolean對象
             jxl.write.Boolean labelBoolean = new jxl.write.Boolean(2,1,false);
             ws.addCell(labelBoolean);
             
             //添加DateTime對象
             DateTime labelDT = new DateTime(3,1,new Date());
             ws.addCell(labelDT);
             
             //添加帶有格式的DataTime數(shù)據(jù)
             DateFormat dtf = new DateFormat("yyyy-MM-dd hh:mm:ss");
             WritableCellFormat wcfDt = new WritableCellFormat(dtf);   
             wcfDt.setBackground(Colour.YELLOW);
             DateTime labelDT_format =  new DateTime(4,1,new java.util.Date(),wcfDt);
             ws.addCell(labelDT_format);
             ws.mergeCells(4,1,5,1); //比較長,用兩列來顯示     
             
             wwb.write();
             wwb.close();
            }
            catch(IOException e){
             e.printStackTrace();
            }
            catch(WriteException e){
             e.printStackTrace();
            }  
           }
           /**
            * 如何更新Excel文件
            * @param fileName
            */
           public static void updateExcel(String fileName){  
            try{
             jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(fileName));
             WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName),rw);
             //這里其實執(zhí)行的是一次copy操作,把文件先讀到內(nèi)存中,修改后再保存覆蓋原來的文件來實現(xiàn)update操作
             WritableSheet ws  = wwb.getSheet(0);
             WritableCell wc = ws.getWritableCell(0,0);
             if( wc.getType() == CellType.LABEL){
              Label l = (Label)wc;
              l.setString(wc.getContents()+"_new");
             }
             wwb.write();
             wwb.close();
            }
            catch(IOException e){
             e.printStackTrace();
            }
            catch(WriteException e){
             e.printStackTrace();
            } 
            catch(BiffException e){
             e.printStackTrace();
            }
           }
           /**
            * 如何copy Excel文件
            * @param fileName
            */
           public static void copyExcel(String sourFileName,String destFileName){  
            try{
             jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourFileName));
             WritableWorkbook wwb = Workbook.createWorkbook(new File(destFileName),rw);
             wwb.write();
             wwb.close();
            }
            catch(IOException e){
             e.printStackTrace();
            }
            catch(WriteException e){
             e.printStackTrace();
            } 
            catch(BiffException e){
             e.printStackTrace();
            }
           }
           
           public static void main(String [] argv){
            //OperateExcel.readExcel("E:\\test.xls");
            //OperateExcel.createExcelFile("E:\\test1.xls");
            //OperateExcel.updateExcel("E:\\test.xls");
            OperateExcel.copyExcel("E:\\test.xls","E:\\moon.xls");
           }

          }


          posted @ 2005-12-06 15:06 月亮 閱讀(2202) | 評論 (4)編輯 收藏

          執(zhí)行過程中動態(tài)執(zhí)行方法

          在編程中可能回碰到一些到實際運行時才指定要調(diào)用的方法的需要,最典型的是Struct的DispatchAction類,
          它能根據(jù)用戶頁面請求參數(shù)的不同來調(diào)用不同的方法來處理用戶請求。我下面寫了一個簡單的例子來簡單演示其
          實現(xiàn)方法:

          package learn;
          import java.lang.NoSuchMethodException;
          import java.lang.reflect.Method;
          import java.util.Date;

          public class TestMethod{
              protected Class clazz = this.getClass();
              protected Class[] no_parameter = {};  //方法無參數(shù)
              protected Class[] string_parameter = {String.class}; //以String 為參數(shù)
              protected Class[] int_parameter = {int.class};  //以int為參數(shù)
              protected Class[] multi_parameter = {String.class,Date.class}; //多個參數(shù),第一個為String,第二二個為Date   
             
              public void method1(){
                System.out.println("method1");
              }
             
              public void method2(String str){
                System.out.println("method2=>"+str);
              }
             
              public void method3(int i){
                System.out.println("method2=>"+i);
              }
             
              public void method4(String str,Date date){
                System.out.println("method4=>"+str+"==="+date.toLocaleString());
              }
             
              public void execute(String methodName,int type,java.util.List list) throws Exception{
                try {
                  Method  m = getMethod(methodName,type);
                  int size = (list != null )? list.size():0;
                  Object o [] = new Object[size];
                  for( int i =0 ; i< size ; i++ )
                    o[i] = list.get(i);  //準(zhǔn)備參數(shù)
                  m.invoke(this,o);
                }
                catch (Exception ex) {
                  ex.printStackTrace();
                  throw new Exception(ex.getMessage());
                }
              }
             
              private Method getMethod(String name,int type)throws NoSuchMethodException{
                  Method m = null;
                  switch(type){
                    case 1:
                      m = clazz.getMethod(name,no_parameter);
                      break;
                    case 2:
                      m = clazz.getMethod(name,string_parameter);
                      break;
                    case 3:
                      m = clazz.getMethod(name,int_parameter);
                      break;
                    case 4:
                      m = clazz.getMethod(name,multi_parameter);
                      break;
                    default:
                      m = clazz.getMethod(name,no_parameter);
                  }
                  return m;
              }
             
              public static void main(String [] argv){
                TestMethod testMethod = new TestMethod();
                try{
                  java.util.List list = new java.util.ArrayList();
                  testMethod.execute("method1", 1, list);
                  list.add("
          http://www.aygfsteel.com/minmoon");
                  testMethod.execute("method2", 2, list);
                  list.clear();
                  list.add("
          mailTo:xiaoliang@aspire-tech.com");
                  list.add(new Date());
                  testMethod.execute("method4",4,list);
                }
                catch(Exception e){
                  e.printStackTrace();
                }
              }
          }

          其中幾個關(guān)鍵的地方說明一下:
            clazz.getMethod(name,multi_parameter);  其中multi_parameter是要根據(jù)實際方法的參數(shù)來定義的。
            m.invoke(this,o);   o是要傳入方法的參數(shù)列表。

          posted @ 2005-11-23 00:18 月亮 閱讀(486) | 評論 (0)編輯 收藏

          23種面向?qū)ο蟮脑O(shè)計模式----Prototype模式


          原型模式定義:
          用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象.

          Prototype模式允許一個對象再創(chuàng)建另外一個可定制的對象,根本無需知道任何如何創(chuàng)建的細(xì)節(jié),工作原理是:通過將一個原型對象傳給那個要發(fā)動創(chuàng)建的對象,這個要發(fā)動創(chuàng)建的對象通過請求原型對象拷貝它們自己來實施創(chuàng)建。

          如何使用?
          因為Java中的提供clone()方法來實現(xiàn)對象的克隆,所以Prototype模式實現(xiàn)一下子變得很簡單.

          以勺子為例:

          public abstract class AbstractSpoon implements Cloneable
          {
            String spoonName;

            public void setSpoonName(String spoonName) {this.spoonName = spoonName;}
            public String getSpoonName() {return this.spoonName;}

            public Object clone()
            {
              Object object = null;
              try {
                object = super.clone();
              } catch (CloneNotSupportedException exception) {
                System.err.println("AbstractSpoon is not Cloneable");
              }
              return object;
            }
          }

          有個具體實現(xiàn)(ConcretePrototype):

          public class SoupSpoon extends AbstractSpoon
          {
            public SoupSpoon()
            {
              setSpoonName("Soup Spoon");
            }
          }

          調(diào)用Prototype模式很簡單:

          AbstractSpoon spoon = new SoupSpoon();
          AbstractSpoon spoon2 = spoon.clone();

          當(dāng)然也可以結(jié)合工廠模式來創(chuàng)建AbstractSpoon實例。

          在Java中Prototype模式變成clone()方法的使用,由于Java的純潔的面向?qū)ο筇匦裕沟迷贘ava中使用設(shè)計模式變得很自然,兩者已經(jīng)幾乎是渾然一體了。這反映在很多模式上,如Interator遍歷模式。



          原文出處:http://www.jdon.com/designpatterns/prototype.htm

          看看寫的很好,就拿來引用一下,不用自己寫的那么累^_^.

          posted @ 2005-11-20 20:32 月亮 閱讀(205) | 評論 (0)編輯 收藏

          23種面向?qū)ο蟮脑O(shè)計模式----Factory method模式


          Factory method,工廠方法模式,定義一個用于創(chuàng)建對象的接口,讓字類決定實例化哪一個類。也就是使一個類的實例化延遲到其子類,提供一種方法使對象創(chuàng)建變得多態(tài)。
          下面是我寫的一個例子,如有兩種工人,car worker和bus worker,所生成的產(chǎn)品分別是car 和 bus,我按照Factory method 的實現(xiàn)如下:


          --先定義car 和 bus 的父類,都是一種產(chǎn)品
          package Factory;
          public class Product {
           
           public  void whoami(){
            System.out.println("I am a product!");
           }
          }

          --Car 類
          package Factory;
          public class Car extends Product { 
           public Car() {
           } 
           public void whoami(){
            System.out.println("I am a car!");
           } 
          }
          --Bus 類
          package Factory;
          public class Bus extends Product { 
           public Bus() {
           } 
           public void whoami(){
            System.out.println("I am a bus!");
           }
          }
          --定義CarWorker和BusWorker的父類 worker
          package Factory;
          public abstract class Worker { 
           private Product theProduct;
           public abstract Product  createProduct(); 
           public void work(){
            theProduct = createProduct();
           }
           public void showMessage(){
            this.theProduct.whoami();
           }
          }
          --Carworker
          package Factory;
          public class CarWorker extends Worker { 
           public Product createProduct(){
             return new Car();
           }
          }
          --BusWorker
          package Factory;
          public class BusWorker extends Worker { 
           public Product  createProduct(){
            return new Bus();
           }
          }
          --下面看看具體的調(diào)用
          package Factory;
          public class TestAll {

           public static void main(String [] argv){ 
            Worker  worker = new CarWorker();
            worker.work();
            worker.showMessage();
            
            Worker  worker1 = new BusWorker();
            worker1.work();
            worker1.showMessage(); 
           } 
          }
          可以看到雖然這樣實現(xiàn)有一些麻煩,如新加一種產(chǎn)品時,就必須從Product類創(chuàng)建一個子類,但是這樣做的
          好處也是顯而易見的,會給你系統(tǒng)帶來更大的可擴(kuò)展性和盡量少的修改量,再添加一種產(chǎn)品一種工人的時候,對以前的代碼是不必做任何修改的。

          <個人觀點,僅作參考>

           

          posted @ 2005-11-13 21:35 月亮 閱讀(926) | 評論 (1)編輯 收藏

          23種面向?qū)ο蟮脑O(shè)計模式----Singleton模式

            Singleton模式為單態(tài)模式或者叫孤子模式,保證一個類只有一個實例,并提供一個訪問它的全局訪問點。
            Singleton模式的使用范圍比較廣泛,對于一些類來說,只有一個實例是很重要的。比如,你要論壇中

          的帖子計數(shù)器,每次瀏覽一次需要計數(shù),單態(tài)類能否保持住這個計數(shù),并且能synchronize的安全自動加

          1,如果你要把這個數(shù)字永久保存到數(shù)據(jù)庫,你可以在不修改單態(tài)接口的情況下方便的做到。
          下面是一個簡單的示例程序:
          package Singleton;
          public class TestSingleton { 
           private static TestSingleton  testSingleton = null;
           protected int  count = 0; 
           public static synchronized  TestSingleton getInstance(){
             if( testSingleton ==   null)
              testSingleton = new TestSingleton();
             return testSingleton;
           }
           public void addCount(){
            count ++;
           }
           public void showCount(){
            System.out.println("count :"+count);
           }  
          }
          我們還可以在這個基礎(chǔ)上做一個擴(kuò)展,如從上面例子中的TestSingleton類擴(kuò)展出多個子類,在

          getInstance方法中控制要使用的是哪個子類,具體實現(xiàn)代碼如下:

          -----TestSingleton.java
          package Singleton;
          public class TestSingleton { 
           private static TestSingleton  testSingleton = null;
           protected int  count = 0; 
           public static synchronized  TestSingleton getInstance(){
             if( testSingleton ==   null)
              testSingleton = new SubTestSingleton ();
             return testSingleton;
           }
           public void addCount(){
            count ++;
           }
           public void showCount(){
            System.out.println("TestSingleton count :"+count);
           }  
          }

          -----SubTestSingleton.java
          public class SubTestSingleton extends TestSingleton{
           public void showCount(){
            System.out.println("SubTestSingleton count :"+count);
           }
          }

          <以上為個人見解,歡迎大家評論!>

          posted @ 2005-11-13 15:54 月亮 閱讀(665) | 評論 (0)編輯 收藏

          面向?qū)ο蟮?3種設(shè)計模式

            最近對面向?qū)ο蟮脑O(shè)計的23種經(jīng)典的設(shè)計模式做了一個研究,接下來的Blog中我會按我的理解做個簡單介紹并提供我寫的示例代碼,歡迎大家的評論,共同提高.
            
             

          posted @ 2005-11-13 15:40 月亮 閱讀(758) | 評論 (0)編輯 收藏

          Oracle數(shù)據(jù)庫查詢一個月的記錄的sql語句

          Oracle數(shù)據(jù)庫查詢一個月的記錄的sql語句:

          select LASTUPDTIME from spprereg where
              (to_date('2005-5-1','YYYY-mm-dd')-LASTUPDTIME)<0  and
              (LAST_DAY(to_date('2005-5-1','YYYY-mm-dd'))-LASTUPDTIME)>0

          posted @ 2005-08-06 21:20 月亮 閱讀(2206) | 評論 (1)編輯 收藏

          抱著老板的心態(tài)去打工

          這是我的一個朋友寫的,轉(zhuǎn)給大家看看。

           從某種意義上來說,打工真是害人不淺,長期的打工固化了人的思維,淡化了人的責(zé)任感,扼殺了人的創(chuàng)新思維,沒有成本概念,缺乏長遠(yuǎn)規(guī)劃。最為關(guān)鍵的是,打工打得越久,看問題的視角就越悲觀,自己也就越自卑。
             
            一群老板聚在一起,大家所交流的話題大多是商業(yè)環(huán)境,以及如何更好地發(fā)展生意等等。向?qū)Ψ秸故镜囊彩亲约汗廨x燦爛的一面和發(fā)展的一面。
             
            一群打工者聚集在一起,牢騷往往占了多數(shù),罵老板刻薄,埋怨工作量大且與收入不對稱等等,很少有打工者對自己目前的狀況滿意的,向?qū)Ψ秸故镜囊哺嗟氖亲约簺]有得到重用沒有得到發(fā)揮的一面。當(dāng)然,有牢騷未必是不重視自己的工作,因為“嫌貨的才是買貨的”。留心一下你就會發(fā)現(xiàn),人在跳槽前反而異常平靜,而成天把跳槽掛嘴邊的人一般是那些一直做下去的人。
             
            為什么打工者會選擇用語言而不是實干來獲得心理平衡呢?這與打工者抱著一個什么樣的心態(tài)在打工密不可分。
             
            筆者從1994年出道,打了四年工,跳出來自己開公司當(dāng)老板,因根基不穩(wěn),一年后破產(chǎn),又出來打工,四年后,又跳出來開公司當(dāng)老板。在每次從打工者到老板,又由老板到打工者的轉(zhuǎn)換過程中,都難免要經(jīng)歷一次耗時數(shù)月的心態(tài)調(diào)整和角色轉(zhuǎn)換,逼著自己進(jìn)行換位思考,每次的轉(zhuǎn)換與脫一次皮也差不了多少。
             
            生意后來做大了,打算讓太太來幫我接管我原來的那家公司,我自己重開一家,可太太打了八年工,接管公司后卻把公司搞得亂七八糟。追查原因,原來太太還是按照打工的那一套在管理公司,我又足足花了兩年時間來幫助太太實現(xiàn)由一個打工者向老板的轉(zhuǎn)換。由此想到,如今報紙雜志電視上招商廣告到處飛,好像有點資本就可以當(dāng)老板了,好像老板可以速成?其實這就是許多創(chuàng)業(yè)以失敗告終的原因。
             
            根據(jù)自己在老板與打工者角色之間不斷轉(zhuǎn)換的過程,我總結(jié)出以下老板與打工者心態(tài)的幾點不同:
             
            長遠(yuǎn)目標(biāo)與短期行為
             
            作為一個真正意義上的老板,知道自己最終想要什么,要達(dá)到目標(biāo)需要經(jīng)過哪些過程,具備長遠(yuǎn)眼光,擁有戰(zhàn)略意識。而作為打工者,著眼點也就是當(dāng)前這兩三年,往往第一考慮的還是安全感,如何保住現(xiàn)有的飯碗,自然不會想得太遠(yuǎn),也不會太高。而且,很少有打工者能進(jìn)行換位思考,站到老板的角度去看問題和考慮問題。也就造成很多打工者很難與老板溝通。
             
            解決問題與完成工作
             
            老板對一件工作的完成定義是指把某件事徹底被解決,今天能搞定的一定不拖到明天。而打工者會習(xí)慣性地把工作按照天數(shù)來分解,每天只完成部分工作,下班時間一到心里就習(xí)慣性地想回家,剩下的工作明天再做,在公司里多待一分鐘都不愿意。
             
            單個環(huán)節(jié)與整個系統(tǒng)
             
            打工者接到一個指派工作任務(wù)后,進(jìn)行處理或是分解后轉(zhuǎn)交給其他同事,然后在他看來,這事就差不多算完了,反正他負(fù)責(zé)的這塊已經(jīng)做完了,至于轉(zhuǎn)交出去的工作是否被保質(zhì)保量按時完成,那就不是他要操心的范圍了。長此以往,許多打工者已經(jīng)習(xí)慣只管自己的二畝三分地,嚴(yán)重缺少整體系統(tǒng)概念。而老板常常看的是整個任務(wù)的完成。
             
            推脫責(zé)任與承擔(dān)失敗
             
            在一個企業(yè)或是公司里,我們最常見到的就是在出現(xiàn)事故后,老板要追查責(zé)任人,大家異常統(tǒng)一、步調(diào)一致地互相推卸責(zé)任,極少有人會站出來承認(rèn)自己工作的不足。打工打久了,遇到問題首先想到的是回避,然后就是設(shè)法推給別人。這樣一來,打工者也就愈加不可能從失敗和失利中學(xué)習(xí)、吸取教訓(xùn)。其實,老板們的成長就是從一個個自己承擔(dān)失敗,并從中總結(jié)分析了問題原因所在、積累經(jīng)驗而來的。
             
            個人意識與聯(lián)合力量
             
            很多的打工者腦海中都存在著個人英雄主義,總希望在一些事情上表露一下,在老板面前表表功,為了不被其他同事?lián)屃斯冢杂袝r候就會冒一定的風(fēng)險(當(dāng)然是以公司的資源為成本的)一個人單槍匹馬干點什么出來,當(dāng)然,要是出了婁子,最后還得由公司承擔(dān),很少有打工者們會從降低成本及風(fēng)險、或是提高效率的角度出發(fā),去主動聯(lián)合其他同事,共同完成某項任務(wù)。
             
            大手大腳與成本概念
             
            作為老板,公司的每一分錢的支出都會算作是成本,省下來的就是利潤,所以,精打細(xì)算是許多老板的習(xí)慣性思維和行為。而打工者們卻是大方得很,反正公司的資產(chǎn)是老板的,只要自己工作方便順手,浪費點又算什么,以至于許多打工者在自己做老板的時候,還改變不了在打工時養(yǎng)成的大手大腳的習(xí)慣。
             
            辦事一條線和思維多樣化
             
            條條大路通羅馬,完成工作不止一種方法,但打工者長期打工生涯下來,已經(jīng)習(xí)慣了用單一思維去考慮問題,A事就用A類解決辦法,B事就用B類解決辦法,很少會去用超越性的思維來從多角度多方向來探討問題的解決辦法。
             
            從某種意義上來說,打工真是害人不淺,長期的打工固化了人的思維,淡化了人的責(zé)任感,扼殺了人的創(chuàng)新思維,沒有成本概念,缺乏長遠(yuǎn)規(guī)劃。最為關(guān)鍵的是,打工打得越久,看問題的視角就越悲觀,自己也就越自卑。
             
            所以提醒各位,即使一時不能當(dāng)老板,也要抱著老板的心態(tài)去打工

          posted @ 2005-07-10 22:22 月亮 閱讀(288) | 評論 (0)編輯 收藏

          成為有錢人的25種方法

          “嫁個有錢人”不如自己成為有錢人,你想發(fā)財嗎?你知道如何成為有錢人嗎?

          1、做你真正感興趣的事——你會花很多時間在上面,因此你一定要感興趣才行,如果不是這樣的話,你不愿意把時間花在上面,就得不到成功。

          2、自己當(dāng)老板。為別人打工,你絕不會變成巨富,老板一心一意地縮減開支,他的目標(biāo)不是使他的職員變成有錢人。

          3、提供一種有實效的服務(wù),或一種實際的產(chǎn)品。你要以寫作、繪畫或作曲變成百萬富翁的機(jī)會可以說是無限小,而你要在營造業(yè)、房地產(chǎn)、制造業(yè)發(fā)大財?shù)臋C(jī)會比較大。記住,出版商賺的錢比作家多得多。

          4、如果你堅持要用自己的靈感來創(chuàng)業(yè)?最好選擇娛樂業(yè),在這方面,發(fā)財?shù)乃俣认喈?dāng)快,流行歌曲和電視最理想。

          5、不論你是演員或商人,盡量增加你的觀眾。在小咖啡館唱歌的人,所賺的錢一定比不上替大唱片公司灌唱片的人,地方性的商人,不會比全國性的商人賺的錢多。

          6、找出一種需要,然后滿足它。社會越變越復(fù)雜,人們所需要的產(chǎn)品和服務(wù)越來越多,最先發(fā)現(xiàn)這些需求而且滿足他們的人,是改進(jìn)現(xiàn)有產(chǎn)品和服務(wù)的人,也是最先成為富翁的人。

          7、不要不敢采用不同的方式——新的方法和新產(chǎn)品,會造成新的財富。但必須確定你的新方法比舊方法更理想,你的新方法必
          想致富,請栽搖錢 引爆數(shù)碼影像!
          中華川菜火鍋大聯(lián) 加盟樂可可天天樂

          須增進(jìn)產(chǎn)品外觀、效率、品質(zhì)、方便或者降低成本。

          8、如果你受過專業(yè)教育,或者有特殊才能,充分利用它。如果你燒得一手好菜,而卻要去當(dāng)泥水匠,那就太笨了。

          9、在你著手任何事情之前,仔細(xì)地對周圍的情形研究一番。政府機(jī)關(guān)和公共圖書館,可以提供不少資料,先做研究,可以節(jié)省你不少時間和金錢。

          10、不要一直都想著發(fā)大財,不如你想想如何改進(jìn)你的事業(yè),您應(yīng)該常常問自己的是:“我如何改良我的事業(yè)?”如何使事業(yè)進(jìn)行順利,財富就會跟著而來。

          11、可能的話,進(jìn)行一種家庭事業(yè),這種方法可以減少費用,增進(jìn)士氣,利潤的分配很簡單,利潤能夠得到充分的利用,整個事業(yè)控制也較容易。

          12、盡可能減少你的費用,但不能犧牲你的品質(zhì),否則的話,你等于是在慢性自殺,賺錢的機(jī)會不會大。

          13、跟同行的朋友維持友誼——他們可能對你很有幫助。

          14、把盡量多的時間花在事業(yè)上。一天12小時、一星期6天是最低要求,一天14小時到18小時很平常,一星期工作7天最好了。你必須先犧牲家庭和社會上的娛樂,直到你事業(yè)站穩(wěn)為止。也只有到那時候,你才能把責(zé)任分給別人。

          15、不要不敢自己下決心。聽聽別人的贊美和批評,但你自己要下決心。

          16、不要不敢說實話。拐彎抹角,只會浪費時間,心里想什么就說什么,而且要盡可能地直截了當(dāng)?shù)亍⒚鞔_地說出來。

          17、不要不敢承認(rèn)自己的錯誤。犯了錯誤并不是一種罪行,犯錯不改才是罪過。

          18、不要因為失敗就裹足不前。失敗是難免的,也是有價值的,從失敗中,你會學(xué)到正確的方法論。

          19、不要在不可行的觀念上打轉(zhuǎn)。一發(fā)現(xiàn)某種方法行不通,立即把它放棄。世界上有無數(shù)的方法,把時間浪費在那些不可行的方法上是無可彌補的損失。

          20、不要冒你承擔(dān)不起的風(fēng)險。如果你損失10萬元,若損失得起的話,就可以繼續(xù)下去,但如果你賠不起5萬元,而一旦失敗的話,你就完蛋了。

          21、一再投資,不要讓你的利潤空閑著,你的利潤要繼續(xù)投資下去,最好投資別的事業(yè)或你控制的事業(yè)上,那樣,才能錢滾錢,替你增加好幾倍的財富。

          22、請一位高明的律師——他會替你節(jié)約更多的金錢和時間,比起你所給予的將要多的多。

          23、請一位精明的會計師。最初的時候,你自己記賬,但除非你本身是個會計師,你還是請一位精明的會計師,可能決定你的成功和失敗——他是值得你花錢的。

          24、請專家替你報稅。一位機(jī)靈的稅務(wù)專家,可又替你免很多的稅。

          25、好好維持你的健康和你的平靜心靈——否則的話,擁有再多的錢也沒有什么意思。

          posted @ 2005-06-23 12:09 月亮 閱讀(280) | 評論 (0)編輯 收藏

          阻礙成功的幾個性格

          多疑,敏感,天真,猶豫不決,膽怯,多慮

          -如果有就趕快克服它。

           

          posted @ 2005-06-23 11:42 月亮 閱讀(250) | 評論 (0)編輯 收藏

          辦公室中的省時小秘訣

          1.了解你的精力充沛期。通常人們在早晨9點左右工作效率最高,可以把最困難的工作放到這時來完成。

            2.集中一天中的頭兩個小時來處理手頭的工作并不接電話、不開會、不受打擾。這樣可以事半功倍。

            3.立刻回復(fù)重要的郵件,將不重要的丟棄。若任它們積累成堆,反而更費時間。

            4.做個任務(wù)清單,將所有的項目和約定記在效率手冊中。手頭一定要帶著效率手冊以幫助自己按計劃行事。

            5.學(xué)會高效地利用零碎時間,用來讀點東西或是構(gòu)思一個文件,不要發(fā)呆或做白日夢。

            6.把瑣碎的工作寫在單子上,以便有零碎時間時馬上去做。

            7.并非每件工作都值得精工細(xì)做,有些事只要過得去就可以了。一遍又一遍地寫些瑣碎的備忘錄不是高效利用時間的做法。

            8.減少回電話的時間。如果你需要傳遞的只是一個信息,不妨在工作以外的時間在錄音電話上留言,或是發(fā)個電子郵件。

            9.如果有人在電話中喋喋不休地講話,你可以禮貌地結(jié)束電話。

            10.對可能打來的電話做到心中有數(shù),這樣在你接到所期待的電話后便可迅速找到所需要的各種材料,不必當(dāng)時亂翻亂找。

            11.學(xué)習(xí)上網(wǎng)高效搜尋的技能,以節(jié)省上網(wǎng)查詢的時間。把你經(jīng)常要瀏覽的網(wǎng)站收集起來以便隨時找到。

            12.用國際互聯(lián)網(wǎng)簡化商業(yè)旅行的安排。多數(shù)飯店和航線可以網(wǎng)上查詢和預(yù)訂。

            13.只要情況允許就可委派別人分擔(dān)工作。事必躬親會使自己疲憊不堪,而且永遠(yuǎn)也做不完。不妨請同事幫忙,或讓助手更努力地投入。

            14.做個靈活的日程表,當(dāng)你需要時便可以忙中偷閑。例如,在中午加班,然后早一小時離開辦公室去健身,或是每天工作10個小時,然后用星期五來赴約會、看醫(yī)生。

            15.在離開辦公室之前開列次日工作的清單,這樣第二天早晨一來便可以全力以赴。

          posted @ 2005-06-22 10:22 月亮 閱讀(244) | 評論 (0)編輯 收藏

          關(guān)于Java中方法重載的問題

          Java中支持方法名相同,但是方法參數(shù)不同而自動去選擇執(zhí)行哪一個方法,如print(int i)和print(String str),雖然方法名相同,但是參數(shù)不同。象這里的int和String 參數(shù)差異比較大所以看起來這種重載沒什么差別,但是如果是類型差別不大, 會出現(xiàn)什么情況呢?

             看下面的代碼:

              public void f(float i){
                  System.out.println("float");
              }

              public viod f(double i){
                 System.out.println("double");
             }

              那么執(zhí)行 f(5)會輸出什么呢?5是被認(rèn)為是float類型還是double類型還是會報錯呢?執(zhí)行結(jié)果是 float 。原來在這種情況下,該數(shù)據(jù)類型能被轉(zhuǎn)為一個較大的數(shù)據(jù)類型,比5較大的數(shù)據(jù)類型是float,其次才到double,所以輸出結(jié)果是float。還有一個特殊的情況就是如果輸入類型為char,如這里我們執(zhí)行f('a'),

          不要以為這會出錯,其實是不會出錯的,因為如果沒有發(fā)現(xiàn)一個準(zhǔn)確的char于它匹配,那么它就把這個char轉(zhuǎn)換成int類型,如果沒有int類型和它匹配,在去尋找較大的數(shù)據(jù)類型,這里它找到了float,所以這里執(zhí)行flaot('a')輸出的還是 float。

            下面再討論另外一種情況,譬如說下面這種情況:

             定義了下面一個方法:

            public void f(int i){
              System.out.println("int ");
          }

            如果執(zhí)行f(100.99)會不會在這種數(shù)據(jù)類型大于這種重載方法期待的變量時會怎么處理呢?會不會把這種較大的數(shù)據(jù)類型縮小到期待的數(shù)據(jù)類型?編譯一下,很遺憾出錯了,在這種情況下是出錯的。

          這么快就12點半了,睡覺了~~~不然明天早晨爬不起來了。

          posted @ 2005-06-10 00:20 月亮 閱讀(366) | 評論 (0)編輯 收藏

          Java中的"goto"語句

          雖然Java中g(shù)oto語句只是java的一個保留字,沒有起任何作用,但是我今天在使用continue和break語句時,還是發(fā)現(xiàn)了其中又goto語句的影子。因為continue和break語句都支持跳到一個Label的位置。下面是具體的用法:

            inner:
            for( int  i = 0 ; i<3 ;i++ ){
             System.out.println("iiii===>"+i); 
             for( int j =0 ; j<5; j++ ){
              if( j == 1 )
                continue  inner;
              System.out.println("j===>"+j); 
             }
            }

          上面一段語句的輸出為

          iiii===>0
          j===>0
          iiii===>1
          j===>0
          iiii===>2
          j===>0

          一般的 continue語句都是跳出當(dāng)前循環(huán),但是這個會跳出到標(biāo)記inner的位置。

          posted @ 2005-06-08 23:28 月亮 閱讀(2228) | 評論 (2)編輯 收藏

          Java對象比較

           

          Java中檢查兩個對象是否相等,這個看起來很簡單的事情但是實際做起來不一定是一個簡單的事情。我們可能首先想到的是==運算符號,但是這個運算符真的能比較兩個對象么?我們先看下面一段代碼:

             public static void main(String [] argv ){

                  Integer    A = new Integer(47);

                 Integer     B = new Integer(47);

                System.out.println( A == B ) ;

               System.out.println( A != B );

          }

          可能你覺得輸出的結(jié)果是true false ,但是結(jié)果正好相反,是:false,true。不要覺得奇怪,因為==實際比較的是兩個對象的句柄,而不是對象的內(nèi)容,所以 A==B輸出為false,    而A != B  輸出為false.

          可能以為equals方法能幫我們解決這個問題,那么來試一下,

          class Value {
            int i;
          }

          public class EqualsMethod2 {
            public static void main(String[] args) {
              Value v1 = new Value();
              Value v2 = new Value();
              v1.i = v2.i = 100;
              System.out.println(v1.equals(v2));
            }
          } ///:~
          結(jié)果輸出的并不是我們所希望的true,而是false,這是因為類默認(rèn)的equal方法是直接比較句柄的,而不是我們所希望的比較內(nèi)容,所以我們不得不發(fā)現(xiàn)我們要比較兩個類的內(nèi)容我們不得不在類中重寫equal()方法來實現(xiàn)比較兩個類的內(nèi)容。

           

          posted @ 2005-06-08 21:26 月亮 閱讀(449) | 評論 (0)編輯 收藏

          Java編程規(guī)則(轉(zhuǎn)自CSDN)

          原出處:http://dev.csdn.net/article/20/20614.shtm

          (1) 類名首字母應(yīng)該大寫。字段、方法以及對象(句柄)的首字母應(yīng)小寫。對于所有標(biāo)識符,其中包含的所有單詞都應(yīng)緊靠在一起,而且大寫中間單詞的首字母。例如:
          ThisIsAClassName
          thisIsMethodOrFieldName
          若在定義中出現(xiàn)了常數(shù)初始化字符,則大寫static final基本類型標(biāo)識符中的所有字母。這樣便可標(biāo)志出它們屬于編譯期的常數(shù)。
          Java包(Package)屬于一種特殊情況:它們?nèi)际切懽帜福幢阒虚g的單詞亦是如此。對于域名擴(kuò)展名稱,如com,org,net或者edu等,全部都應(yīng)小寫(這也是Java 1.1和Java 1.2的區(qū)別之一)。

          (2) 為了常規(guī)用途而創(chuàng)建一個類時,請采取“經(jīng)典形式”,并包含對下述元素的定義:

          equals()
          hashCode()
          toString()
          clone()(implement Cloneable)
          implement Serializable

          (3) 對于自己創(chuàng)建的每一個類,都考慮置入一個main(),其中包含了用于測試那個類的代碼。為使用一個項目中的類,我們沒必要刪除測試代碼。若進(jìn)行了任何形式的改動,可方便地返回測試。這些代碼也可作為如何使用類的一個示例使用。

          (4) 應(yīng)將方法設(shè)計成簡要的、功能性單元,用它描述和實現(xiàn)一個不連續(xù)的類接口部分。理想情況下,方法應(yīng)簡明扼要。若長度很大,可考慮通過某種方式將其分割成較短的幾個方法。這樣做也便于類內(nèi)代碼的重復(fù)使用(有些時候,方法必須非常大,但它們?nèi)詰?yīng)只做同樣的一件事情)。

          (5) 設(shè)計一個類時,請設(shè)身處地為客戶程序員考慮一下(類的使用方法應(yīng)該是非常明確的)。然后,再設(shè)身處地為管理代碼的人考慮一下(預(yù)計有可能進(jìn)行哪些形式的修改,想想用什么方法可把它們變得更簡單)。
          (6) 使類盡可能短小精悍,而且只解決一個特定的問題。下面是對類設(shè)計的一些建議:
          ■一個復(fù)雜的開關(guān)語句:考慮采用“多形”機(jī)制
          ■數(shù)量眾多的方法涉及到類型差別極大的操作:考慮用幾個類來分別實現(xiàn)
          ■許多成員變量在特征上有很大的差別:考慮使用幾個類

          (7) 讓一切東西都盡可能地“私有”——private。可使庫的某一部分“公共化”(一個方法、類或者一個字段等等),就永遠(yuǎn)不能把它拿出。若強行拿出,就可能破壞其他人現(xiàn)有的代碼,使他們不得不重新編寫和設(shè)計。若只公布自己必須公布的,就可放心大膽地改變其他任何東西。在多線程環(huán)境中,隱私是特別重要的一個因素——只有private字段才能在非同步使用的情況下受到保護(hù)。

          (8) 謹(jǐn)惕“巨大對象綜合癥”。對一些習(xí)慣于順序編程思維、且初涉OOP領(lǐng)域的新手,往往喜歡先寫一個順序執(zhí)行的程序,再把它嵌入一個或兩個巨大的對象里。根據(jù)編程原理,對象表達(dá)的應(yīng)該是應(yīng)用程序的概念,而非應(yīng)用程序本身。

          (9) 若不得已進(jìn)行一些不太雅觀的編程,至少應(yīng)該把那些代碼置于一個類的內(nèi)部。

          (10) 任何時候只要發(fā)現(xiàn)類與類之間結(jié)合得非常緊密,就需要考慮是否采用內(nèi)部類,從而改善編碼及維護(hù)工作(參見第14章14.1.2小節(jié)的“用內(nèi)部類改進(jìn)代碼”)。

          (11) 盡可能細(xì)致地加上注釋,并用javadoc注釋文檔語法生成自己的程序文檔。

          (12) 避免使用“魔術(shù)數(shù)字”,這些數(shù)字很難與代碼很好地配合。如以后需要修改它,無疑會成為一場噩夢,因為根本不知道“100”到底是指“數(shù)組大小”還是“其他全然不同的東西”。所以,我們應(yīng)創(chuàng)建一個常數(shù),并為其使用具有說服力的描述性名稱,并在整個程序中都采用常數(shù)標(biāo)識符。這樣可使程序更易理解以及更易維護(hù)。

          (13) 涉及構(gòu)建器和異常的時候,通常希望重新丟棄在構(gòu)建器中捕獲的任何異常——如果它造成了那個對象的創(chuàng)建失敗。這樣一來,調(diào)用者就不會以為那個對象已正確地創(chuàng)建,從而盲目地繼續(xù)。

          (14) 當(dāng)客戶程序員用完對象以后,若你的類要求進(jìn)行任何清除工作,可考慮將清除代碼置于一個良好定義的方法里,采用類似于cleanup()這樣的名字,明確表明自己的用途。除此以外,可在類內(nèi)放置一個boolean(布爾)標(biāo)記,指出對象是否已被清除。在類的finalize()方法里,請確定對象已被清除,并已丟棄了從RuntimeException繼承的一個類(如果還沒有的話),從而指出一個編程錯誤。在采取象這樣的方案之前,請確定finalize()能夠在自己的系統(tǒng)中工作(可能需要調(diào)用System.runFinalizersOnExit(true),從而確保這一行為)。

          (15) 在一個特定的作用域內(nèi),若一個對象必須清除(非由垃圾收集機(jī)制處理),請采用下述方法:初始化對象;若成功,則立即進(jìn)入一個含有finally從句的try塊,開始清除工作。

          (16) 若在初始化過程中需要覆蓋(取消)finalize(),請記住調(diào)用super.finalize()(若Object屬于我們的直接超類,則無此必要)。在對finalize()進(jìn)行覆蓋的過程中,對super.finalize()的調(diào)用應(yīng)屬于最后一個行動,而不應(yīng)是第一個行動,這樣可確保在需要基礎(chǔ)類組件的時候它們依然有效。

          (17) 創(chuàng)建大小固定的對象集合時,請將它們傳輸至一個數(shù)組(若準(zhǔn)備從一個方法里返回這個集合,更應(yīng)如此操作)。這樣一來,我們就可享受到數(shù)組在編譯期進(jìn)行類型檢查的好處。此外,為使用它們,數(shù)組的接收者也許并不需要將對象“造型”到數(shù)組里。

          (18) 盡量使用interfaces,不要使用abstract類。若已知某樣?xùn)|西準(zhǔn)備成為一個基礎(chǔ)類,那么第一個選擇應(yīng)是將其變成一個interface(接口)。只有在不得不使用方法定義或者成員變量的時候,才需要將其變成一個abstract(抽象)類。接口主要描述了客戶希望做什么事情,而一個類則致力于(或允許)具體的實施細(xì)節(jié)。

          (19) 在構(gòu)建器內(nèi)部,只進(jìn)行那些將對象設(shè)為正確狀態(tài)所需的工作。盡可能地避免調(diào)用其他方法,因為那些方法可能被其他人覆蓋或取消,從而在構(gòu)建過程中產(chǎn)生不可預(yù)知的結(jié)果(參見第7章的詳細(xì)說明)。

          (20) 對象不應(yīng)只是簡單地容納一些數(shù)據(jù);它們的行為也應(yīng)得到良好的定義。

          (21) 在現(xiàn)成類的基礎(chǔ)上創(chuàng)建新類時,請首先選擇“新建”或“創(chuàng)作”。只有自己的設(shè)計要求必須繼承時,才應(yīng)考慮這方面的問題。若在本來允許新建的場合使用了繼承,則整個設(shè)計會變得沒有必要地復(fù)雜。

          (22) 用繼承及方法覆蓋來表示行為間的差異,而用字段表示狀態(tài)間的區(qū)別。一個非常極端的例子是通過對不同類的繼承來表示顏色,這是絕對應(yīng)該避免的:應(yīng)直接使用一個“顏色”字段。

          (23) 為避免編程時遇到麻煩,請保證在自己類路徑指到的任何地方,每個名字都僅對應(yīng)一個類。否則,編譯器可能先找到同名的另一個類,并報告出錯消息。若懷疑自己碰到了類路徑問題,請試試在類路徑的每一個起點,搜索一下同名的.class文件。

          (24) 在Java 1.1 AWT中使用事件“適配器”時,特別容易碰到一個陷阱。若覆蓋了某個適配器方法,同時拼寫方法沒有特別講究,最后的結(jié)果就是新添加一個方法,而不是覆蓋現(xiàn)成方法。然而,由于這樣做是完全合法的,所以不會從編譯器或運行期系統(tǒng)獲得任何出錯提示——只不過代碼的工作就變得不正常了。

          (25) 用合理的設(shè)計方案消除“偽功能”。也就是說,假若只需要創(chuàng)建類的一個對象,就不要提前限制自己使用應(yīng)用程序,并加上一條“只生成其中一個”注釋。請考慮將其封裝成一個“獨生子”的形式。若在主程序里有大量散亂的代碼,用于創(chuàng)建自己的對象,請考慮采納一種創(chuàng)造性的方案,將些代碼封裝起來。

          (26) 警惕“分析癱瘓”。請記住,無論如何都要提前了解整個項目的狀況,再去考察其中的細(xì)節(jié)。由于把握了全局,可快速認(rèn)識自己未知的一些因素,防止在考察細(xì)節(jié)的時候陷入“死邏輯”中。

          (27) 警惕“過早優(yōu)化”。首先讓它運行起來,再考慮變得更快——但只有在自己必須這樣做、而且經(jīng)證實在某部分代碼中的確存在一個性能瓶頸的時候,才應(yīng)進(jìn)行優(yōu)化。除非用專門的工具分析瓶頸,否則很有可能是在浪費自己的時間。性能提升的隱含代價是自己的代碼變得難于理解,而且難于維護(hù)。

          (28) 請記住,閱讀代碼的時間比寫代碼的時間多得多。思路清晰的設(shè)計可獲得易于理解的程序,但注釋、細(xì)致的解釋以及一些示例往往具有不可估量的價值。無論對你自己,還是對后來的人,它們都是相當(dāng)重要的。如對此仍有懷疑,那么請試想自己試圖從聯(lián)機(jī)Java文檔里找出有用信息時碰到的挫折,這樣或許能將你說服。

          (29) 如認(rèn)為自己已進(jìn)行了良好的分析、設(shè)計或者實施,那么請稍微更換一下思維角度。試試邀請一些外來人士——并不一定是專家,但可以是來自本公司其他部門的人。請他們用完全新鮮的眼光考察你的工作,看看是否能找出你一度熟視無睹的問題。采取這種方式,往往能在最適合修改的階段找出一些關(guān)鍵性的問題,避免產(chǎn)品發(fā)行后再解決問題而造成的金錢及精力方面的損失。

          (30) 良好的設(shè)計能帶來最大的回報。簡言之,對于一個特定的問題,通常會花較長的時間才能找到一種最恰當(dāng)?shù)慕鉀Q方案。但一旦找到了正確的方法,以后的工作就輕松多了,再也不用經(jīng)歷數(shù)小時、數(shù)天或者數(shù)月的痛苦掙扎。我們的努力工作會帶來最大的回報(甚至無可估量)。而且由于自己傾注了大量心血,最終獲得一個出色的設(shè)計方案,成功的快感也是令人心動的。堅持抵制草草完工的誘惑——那樣做往往得不償失。

          (31) 可在Web上找到大量的編程參考資源,甚至包括大量新聞組、討論組、郵寄列表等。下面這個地方提供了大量有益的鏈接:

          posted @ 2005-06-08 16:38 月亮 閱讀(224) | 評論 (0)編輯 收藏

          Java對象操作(自己體會,不一定說的正確,但是都是在程序中測試)

            Java中c中的指針的概念,但是我在使用中還是碰到過一些問題,如我把一個一個對象A賦值給對象B時,這兩個對象有一個改變,那么另外一個也相應(yīng)的改變。下面分別談?wù)勥@可能發(fā)生問題的幾種情況:

          <一>從“一個對象到另一個對象的賦值”,如:

                  Class  A = new Class();

                 Class  B  = A;

                 這種情況實際把句柄從一個地方復(fù)制到另外一個地方,這種情況下對象B和A實際指向的是同一個句柄,更新B會影響到A,同樣更新A也會影響到B。

          <二>把對象作為方法的參數(shù)傳遞到一個方法中。Java方法的參數(shù)傳遞可以分成兩種:一種是值傳遞,這種一般是簡單的數(shù)據(jù)類型,如int,long,double,char這些等;一種類似是c中的引用傳遞,就是把對象作為一個引用傳遞給方法參數(shù),在這種情況下,在方法中把這個傳入的參數(shù)對象改變,那么相應(yīng)的傳入這個參數(shù)引用的對象也相應(yīng)的改變。如:

               Number A = new Number();
               A.num   = 9;
               test(A);

               方法定義:

              public  void   test(Number n){
                n.num = 99;
              }

             那么A的num值會變成99.

          <三>;把對象保存在ArrayList中.如果把一個對象保存在一個AyyayList中,如果這個對象再發(fā)生改變,那么在這個ArrayList中保存的對象也會改變,說白了還是兩個還是公用同一個句柄.如:

             Number A = new Number();
               A.num = 100;
               java.util.ArrayList list = new ArrayList();
               list.add(A);
               A.num = 999;
               Number B = (Number)list.get(0);
               System.out.println(B.num);

          那么輸出為999,對象A的更改影響到了ArrayList中的保存的對象.

           

          posted @ 2005-06-08 00:19 月亮 閱讀(272) | 評論 (0)編輯 收藏

          人生就像一碗蔬菜湯

          你看過老鷹嗎?咱們生活在都市的人,大概很少有機(jī)會看到老鷹。根據(jù)鳥類生態(tài)學(xué)家的研究,老鷹是一種奇特的飛禽,因為它們都把窩巢筑在樹梢,或是懸崖陡巖上,通用動物很難直接攻擊它。

            可是,老鷹是怎么搭筑窩巢的呢?生態(tài)學(xué)家用望遠(yuǎn)鏡仔細(xì)觀察后發(fā)現(xiàn),母鷹先用尖嘴銜著一些荊棘放置在底層,再叼來一些尖銳的小石子鋪放在荊棘上面。乍看之下,總覺得用銳利的小石子當(dāng)材料來筑巢,是很突兀、怪異的,這怎么能筑出一個溫暖、舒適的窩巢呢?不過,母鷹后來又銜一些枯草、羽毛或獸皮覆蓋在小石子上,做成一個能孵蛋的窩。

            小鷹孵化、出生后,住在窩巢里,母鷹按時叼回來小蟲、肉食,喂入雛鷹嗷嗷待哺的小嘴中;母鷹天天供應(yīng)食物,也細(xì)心保護(hù),以防敵人入侵。后來,小鷹慢慢長大、羽毛漸豐,這時,母鷹認(rèn)為,該是小鷹學(xué)習(xí)"自我獨立"的時候了!

            可是,有什么辦法能讓小鷹不再眷戀始終被母鷹呵護(hù)、舒適無比的窩巢呢?有的,母鷹開始"攪動窩巢",讓巢上的枯草、羽毛掉落,而暴露出尖銳的小石子和荊棘;小鷹被刺痛得哇哇叫,可是母鷹又很無情地加以驅(qū)逐、揮趕,小鷹只好忍痛振起雙翅,離巢他飛。

            母鷹殘忍、無情嗎?不,母鷹深愛著它生養(yǎng)的小鷹!

            但是,母鷹更渴望它疼愛的小鷹能成為四處翱翔的飛鷹,因此,必須無情地逼著小鷹飛離舒適的窩,勇敢地學(xué)習(xí)獨立;即使小鷹在剛開始跌跌撞撞,母鷹仍偷偷地在旁照顧看護(hù)它,直到小鷹能展翅高飛、直上青天!

            我在美國念博士班時,常搭飛機(jī)來回美臺兩地。有一次,我匆忙地趕上臺北飛往舊金山的班機(jī),查找座位后,發(fā)現(xiàn)身旁已經(jīng)坐著一位30來歲的小姐。她身穿長褲,對著我微微一笑。漫長的飛行,我和她開始閑聊。她說,小時候家窮,父母又離異,所以國小畢業(yè)后就沒再讀書,只好跟人家學(xué)做裁縫;20多年過去了,現(xiàn)在經(jīng)濟(jì)能力好轉(zhuǎn),雖然想多念點書,可是沒學(xué)歷,不能念大學(xué),于是只好趁暑假時間到美國念暑期美語學(xué)校,藉此拓展視野。

            這小姐臉龐清秀,不疾不徐地對我說:"我們客家人有一句諺語━━窮人莫斷豬,富人莫斷書;我啊,現(xiàn)在不是窮人了,但也不是什么富人,只是覺得自己必須多讀點書,畢竟人生不像錄影帶、錄音帶,可以倒帶重來,所以我希望盡可能地多充實自己!"

            聊著聊著,飛機(jī)已經(jīng)飛行了3小時左右,這時,她禮貌地對著坐在走道旁的我說:"對不起,可不可以借我過一下,我想上洗手間?""噢,好!"我說,隨即起身讓她走過。

            只見這小姐用手扭轉(zhuǎn)一下長褲里的硬硬東西,然后慢慢地站起來……她一跛一跛地、緩緩地從我眼前走過,再跛著腳,走向前端的盥洗室。天哪,身軀嬌小的她,竟是一位小兒麻痹患者,她寬松的長褲里,裝著的是支撐她站起來走路的鐵鞋!

            當(dāng)她走回座位時,我對她說:"你可以請空姐幫你安排前面好一點的座位呀!""不用啦!我已經(jīng)習(xí)慣了,這小問題難不倒我!"她笑笑地對我說:"到美國念書3個月,要自己解決的問題還很多呢!"

            我常在想,有時,小鷹不一定都有母鷹喂食、呵護(hù),也不一定會有同樣殘酷無情的母鷹逼它離巢他飛,但是孤苦無依的小鷹必須懂得━━要含淚堅強地站起來,自己飛、不斷地飛,飛往屬于自己的一片晴空與藍(lán)天。

            其實,人生就如同"一大碗蔬菜湯",如果沒經(jīng)過攪動,鮮美好料就會"一直沉在碗底"。就像小鷹一樣,母鷹無情地攪動窩巢,才逼得它必須獨立展翅飛翔;可是,它不能搶劫超商、不能跳樓自殺,還是必須靠自己"獨立更生",才有食物吃啊!人,似乎很少聽說因為太勤勞、流汗太多,而被汗水淹沒的!

            我們必須辛勤地"攪動自己",讓鮮美的"蔬菜好料"浮現(xiàn)━━讓內(nèi)在的才華、能力美麗呈現(xiàn)。

            所以,告訴自己━━"我,一定要做最棒的我!"

          posted @ 2005-06-07 16:48 月亮 閱讀(377) | 評論 (1)編輯 收藏

          關(guān)于文檔的作用

                 今天看了一篇文章,覺得很有啟發(fā)。一個好的程序員不只是要寫出好的代碼,而且要學(xué)會寫寫文檔和與別人交流,如果不能寫文檔和與別人交流,那么再好的代碼別人也無法看懂。

                  還有可能是自己的一個弊病--自己感興趣的東西自己就喜歡做,但是自己不喜歡的東西就不喜歡做,但是工作中不可能都是自己喜歡的東西,喜歡的東西也要做好,那么才能是一個合格的程序員。

          posted @ 2005-06-06 20:17 月亮 閱讀(178) | 評論 (0)編輯 收藏

          abstract和interface類的區(qū)別和共同點

          * 1.定義方式的不同:
           *   <1>abstract類定義:
           *      public abstract class test{
           *          abstract void method1();
           *          abstarct void method2();
           *      }
           *   <2>interface類定義:
           *     public interface test{
           *         void method1();
           *         void method2();
           *     }
           * 2.abstract class類是表示一種繼承關(guān)系,一個類只能繼承一個abstract類,而一個類可以通過implements實現(xiàn)
           *   多個接口.
           *
           * 3.abstract類我們可以定義默認(rèn)的方法,如可以在里面定義一個方法:
           *   public abstract class test{
           *          abstract void method1();
           *          abstarct void method2();
           *          public void print(){
           *            System.out.println("print");
           *          }
           *      }
           *   但是interface里面的方法都不能有body.
           *
           * 4.在Interface類中,所有的數(shù)據(jù)成員都是靜態(tài)的不能被修改的。
           *   而abstract類可以有自己的數(shù)據(jù)成員

          posted @ 2005-06-02 14:59 月亮 閱讀(353) | 評論 (0)編輯 收藏

          Struct學(xué)習(xí)筆記1

          昨天開始學(xué)習(xí)structs,計劃用2周來大致上把握Structs,大致覺得structs的優(yōu)勢在于提高web開發(fā)的速度,尤其是在大型的項目中,但是前期的設(shè)計可能要花很多的時間來計劃每個頁面對應(yīng)到哪個ActionForm和Action,計劃好每個頁面跳轉(zhuǎn)的頁面。覺得其中主要的思想就是MVC,這種方式的好處就是:

          一。多個視圖可以公用一個模型,如同一個web程序可能有多種用戶界面,瀏覽器或wap。把邏輯層和表示層分開。提高代碼的重用性。

          二。控制器和視圖保持獨立,要更改控制,只要去更改控制器部分就可以了,與視圖無關(guān)。



          對例子看了一下實現(xiàn)的,覺得大致流程是這樣的:

          從頁面上的標(biāo)記.do的名稱,從struct-config.xml中取出對應(yīng)該Form處理的ActionForm,執(zhí)行取變量或Validate之后,再轉(zhuǎn)給Action來處理,執(zhí)行完畢后再跳轉(zhuǎn)到下一個頁面。



           加油,一定要2周搞定它.

          posted @ 2005-06-01 00:11 月亮 閱讀(420) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 汉中市| 于田县| 新沂市| 万荣县| 东平县| 蛟河市| 方正县| 和林格尔县| 额济纳旗| 常熟市| 大同县| 达孜县| 顺昌县| 建昌县| 福贡县| 延寿县| 锦屏县| 寿宁县| 安龙县| 女性| 邳州市| 广水市| 环江| 固始县| 梧州市| 罗平县| 玛纳斯县| 株洲市| 光山县| 定陶县| 竹山县| 义马市| 宣汉县| 项城市| 永修县| 偏关县| 凯里市| 肥东县| 山阴县| 古蔺县| 霍林郭勒市|