<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    2005年6月6日

    J2me開(kāi)發(fā)


    一些資料:




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


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



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

    游戲

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

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

    vi命令詳解

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

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

    下面是vi命令使用的一些選項(xiàng)及含義:??????????

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    下面是命令模式下在行間移動(dòng)的子命令:??????????

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

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

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

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

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

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

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

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

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

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

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

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

    下面是在命令模式下用來(lái)顯示頁(yè)面的子命令:??????????

      Ctrl?+?f向后滾一頁(yè)。??????????

      Ctrl?+?d向后滾半頁(yè)。??????????

      Ctrl?+?b向前滾一頁(yè)。??????????

      Ctrl?+?u向前滾半頁(yè)。??????????

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

      Ctrl?+?y屏幕項(xiàng)上滾一行。??????????

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

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

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

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

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

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

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

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

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

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

      A在行尾開(kāi)始輸入文本。??????????

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

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

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

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

    下面是在命令模式下改變文本所使用的子命令(用戶(hù)可在任何的時(shí)候按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)所在出字符的大小寫(xiě)。??????????

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

      <<把當(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?回寫(xiě)修改后的文件。??????????

      :w?filename?當(dāng)filename不存在時(shí),把修改后的文件存為文件filename?,當(dāng)文件filename?
    存在時(shí),報(bào)錯(cuò)。?

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

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

      :n開(kāi)始編輯vi激活的文件列表中的下一個(gè)文件。??????????

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

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

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

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

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

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

      :e#?開(kāi)始編輯另外一個(gè)文件。??????????

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

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

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

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

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

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

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

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

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

      :q!退出vi而不管是否對(duì)文件有改動(dòng)。??????????

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

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

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

    精通Log4j

    ?log4j雖然總的來(lái)說(shuō)是比較容易使用的,但是要是想比較精通的操縱它還是有很多地方值得探討的。
    ??? 這幾天有空,把項(xiàng)目中大家用到的log4j實(shí)現(xiàn)的功能分了一下類(lèi),大致分為下面三類(lèi):
    ??? <1>所有的日志信息都輸出到log.log.
    ??? <2>對(duì)于一些特殊的日志(如啟動(dòng)時(shí)候的日志),輸出到log/startup/startup.log.
    ??? <3>對(duì)于某些特殊包下面的日志,如com.aspire包下面的error信息都輸出到error.log???
    ??? 有了這幾個(gè)功能,相信對(duì)于大部分的系統(tǒng)都是夠用的了,下面這個(gè)例子就是實(shí)現(xiàn)了這幾個(gè)功能:
    ??? (至于其他的一些配置,如格式這些的就不說(shuō)明,有很多這種資料)
    ???
    ??? ***********? 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">
    ??<!-- 過(guò)濾,只記錄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">
    ??<!--該類(lèi)使自己從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") 可以這樣來(lái)調(diào)用本logger-->
    ??<level value="debug" />
    ??<appender-ref ref="startup" />
    </logger>

    <logger name="com.aspire" additivity="false">
    <!--Log log = LogFactory.getLog(TestLog4j.class) 此時(shí)如果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類(lèi)*****
    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 類(lèi)結(jié)束 ******

    ************ 調(diào)用示例 TestLog4j類(lèi) **************
    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 月亮 閱讀(400) | 評(píng)論 (0)編輯 收藏

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

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

    Prototype 類(lèi)

    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);
    ?}
    }


    測(cè)試類(lèi)

    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 月亮 閱讀(555) | 評(píng)論 (0)編輯 收藏

    小技巧_jsp緩存問(wèn)題的解決

    如果一直為jsp的緩存問(wèn)題困擾的話(huà),可以試試在jsp中加入以下幾句話(huà):

    <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 就表示緩存的最長(zhǎng)存在時(shí)間是30s,no-cache表示無(wú)緩存,must-revalidate表示每次訪(fǎng)問(wèn)必須重新驗(yàn)證是否有更新!

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

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

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

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


    ----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("===>客戶(hù)機(jī)IP==>"+socket.getInetAddress().toString());
    ???//System.out.println("===>客戶(hù)機(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 { //文件沒(méi)找到,返回404頁(yè)面
    ????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)聽(tīng)的端口
    ?public static final int LISTENING_PORT = 8080;

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

    ?/**
    ? * 判斷該字符串是不是瀏覽器發(fā)送過(guò)來(lái)的請(qǐng)求頭信息
    ? * @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;
    ?}

    ?/**
    ? * 獲得請(qǐng)求信息中的文件名,默認(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ā)送文件到客戶(hù)端
    ? *
    ? * @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頁(yè)面
    ? * @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 月亮 閱讀(454) | 評(píng)論 (0)編輯 收藏

    Apache FileUpload 使用

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

    3>示例
          //檢查表單是否正確
          boolean isMultipart = FileUpload.isMultipartContent(request);
          DiskFileItemFactory  factory = new DiskFileItemFactory();
          ServletFileUpload upload = new ServletFileUpload(factory);
          //文件最大,設(shè)為-1表示不受限制
          upload.setSizeMax(4096);
          //解析請(qǐng)求,把解析的結(jié)果放在一個(gè)List里面
          List items = upload.parseRequest(request);
          //緩存大小,設(shè)為-1表示不受限制
          factory.setSizeThreshold(4096);
          //設(shè)置臨時(shí)目錄
          factory.setRepository(new File("D:\\temp"));
          Iterator iter = items.iterator();
          while( iter.hasNext() ){
            FileItem item  = (FileItem)iter.next();
            //檢查是一個(gè)普通的表單域還是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
              //所以這里用一個(gè)fullFile來(lái)取文件名
              File fullFile  = new File(item.getName());
              File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
              item.write(uploadedFile);
            }
          }

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

    EJB QL

    從一個(gè)表users中查詢(xún)記錄,如果是寫(xiě)成
    select  i from  users as  i  where i.name=?1則編譯EJB的時(shí)候會(huì)報(bào)錯(cuò),但是如果把users 首字母大寫(xiě)就OK了。
    select  i from  Users as  i  where i.name=?1

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

    EJb 會(huì)話(huà)Bean

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

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

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

    我的感想:在看第一遍書(shū)時(shí),還一點(diǎn)感覺(jué)都沒(méi)有,根本就看不明白SessionBean中的session與Servlet容器中的session有什么區(qū)別。
    動(dòng)手編程后,才感覺(jué)到EJB只是比Servlet更規(guī)范,更重量而已。真正的區(qū)別就是接口協(xié)議一個(gè)是基于HTTP,一個(gè)是基于RMI/IIOP。Servlet與無(wú)狀態(tài)的SessionBean在Session上是一樣的控制。Servlet中的Session對(duì)象與有狀態(tài)的SessionBean是一樣的控制。
    對(duì)于應(yīng)用,例如有一個(gè)購(gòu)物車(chē),要記錄正在采購(gòu)的物品信息,沒(méi)有EJB時(shí),我們一般是存在Servlet容器中的session中。有了EJB,則可以存儲(chǔ)在有狀態(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 月亮 閱讀(253) | 評(píng)論 (0)編輯 收藏

    Ibatis示例


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

    2.先新建一個(gè)xml文件 SqlMap.xml,在這個(gè)文件中定義使用了哪些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.定義一個(gè)公共類(lèi)來(lái)生成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.至此就建立了一個(gè)簡(jiǎn)單的ibatis示例.

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

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

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

    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("查詢(xún)到空數(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 月亮 閱讀(1239) | 評(píng)論 (0)編輯 收藏

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

    如果是在需求還沒(méi)確定或者是在兩個(gè)類(lèi)實(shí)現(xiàn)相近功能時(shí)候,會(huì)大量使用下面的方式:
    --抽象類(lèi),注意其中的newInstance方法的實(shí)現(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類(lèi)派生出來(lái)的一個(gè)字類(lèi),提供println方法的一種實(shí)現(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類(lèi)派生出來(lái)的另一個(gè)字類(lèi),提供println方法的另一種實(shí)現(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) | 評(píng)論 (0)編輯 收藏

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


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

    <一>.先從javax.servlet.jsp.tagext.BodyTagSupport派生一個(gè)新的類(lèi),并重載它的doStartTag()方法.如果是想要傳入?yún)?shù)的話(huà),則還要在Bean中加入想要的變量,如這里要傳入一個(gè)url值,所以添加一個(gè)參數(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;
      }
    }

    <二>新建一個(gè)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中引入這個(gè)taglib,在其中加入:

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


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

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

    <mylinkurl:urllink linkUrl="

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

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

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

    Java Excel 使用攻略

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

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

    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)容清空,格式也是按前一個(gè)單元格的格式
       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對(duì)象
       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對(duì)象
       jxl.write.Boolean labelBoolean = new jxl.write.Boolean(2,1,false);
       ws.addCell(labelBoolean);
       
       //添加DateTime對(duì)象
       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); //比較長(zhǎng),用兩列來(lái)顯示     
       
       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);
       //這里其實(shí)執(zhí)行的是一次copy操作,把文件先讀到內(nèi)存中,修改后再保存覆蓋原來(lái)的文件來(lái)實(shí)現(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 月亮 閱讀(2200) | 評(píng)論 (4)編輯 收藏

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

    在編程中可能回碰到一些到實(shí)際運(yùn)行時(shí)才指定要調(diào)用的方法的需要,最典型的是Struct的DispatchAction類(lèi),
    它能根據(jù)用戶(hù)頁(yè)面請(qǐng)求參數(shù)的不同來(lái)調(diào)用不同的方法來(lái)處理用戶(hù)請(qǐng)求。我下面寫(xiě)了一個(gè)簡(jiǎn)單的例子來(lái)簡(jiǎn)單演示其
    實(shí)現(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 = {};  //方法無(wú)參數(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}; //多個(gè)參數(shù),第一個(gè)為String,第二二個(gè)為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.tkk7.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();
          }
        }
    }

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

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

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


    原型模式定義:
    用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象.

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

    如何使用?
    因?yàn)镴ava中的提供clone()方法來(lái)實(shí)現(xiàn)對(duì)象的克隆,所以Prototype模式實(shí)現(xiàn)一下子變得很簡(jiǎ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;
      }
    }

    有個(gè)具體實(shí)現(xiàn)(ConcretePrototype):

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

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

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

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

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



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

    看看寫(xiě)的很好,就拿來(lái)引用一下,不用自己寫(xiě)的那么累^_^.

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

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


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


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

    --Car 類(lèi)
    package Factory;
    public class Car extends Product { 
     public Car() {
     } 
     public void whoami(){
      System.out.println("I am a car!");
     } 
    }
    --Bus 類(lèi)
    package Factory;
    public class Bus extends Product { 
     public Bus() {
     } 
     public void whoami(){
      System.out.println("I am a bus!");
     }
    }
    --定義CarWorker和BusWorker的父類(lèi) 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(); 
     } 
    }
    可以看到雖然這樣實(shí)現(xiàn)有一些麻煩,如新加一種產(chǎn)品時(shí),就必須從Product類(lèi)創(chuàng)建一個(gè)子類(lèi),但是這樣做的
    好處也是顯而易見(jiàn)的,會(huì)給你系統(tǒng)帶來(lái)更大的可擴(kuò)展性和盡量少的修改量,再添加一種產(chǎn)品一種工人的時(shí)候,對(duì)以前的代碼是不必做任何修改的。

    <個(gè)人觀點(diǎn),僅作參考>

     

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

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

      Singleton模式為單態(tài)模式或者叫孤子模式,保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)訪(fǎng)問(wèn)它的全局訪(fǎng)問(wèn)點(diǎn)。
      Singleton模式的使用范圍比較廣泛,對(duì)于一些類(lèi)來(lái)說(shuō),只有一個(gè)實(shí)例是很重要的。比如,你要論壇中

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

    1,如果你要把這個(gè)數(shù)字永久保存到數(shù)據(jù)庫(kù),你可以在不修改單態(tài)接口的情況下方便的做到。
    下面是一個(gè)簡(jiǎn)單的示例程序:
    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);
     }  
    }
    我們還可以在這個(gè)基礎(chǔ)上做一個(gè)擴(kuò)展,如從上面例子中的TestSingleton類(lèi)擴(kuò)展出多個(gè)子類(lèi),在

    getInstance方法中控制要使用的是哪個(gè)子類(lèi),具體實(shí)現(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);
     }
    }

    <以上為個(gè)人見(jiàn)解,歡迎大家評(píng)論!>

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

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

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

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

    Oracle數(shù)據(jù)庫(kù)查詢(xún)一個(gè)月的記錄的sql語(yǔ)句

    Oracle數(shù)據(jù)庫(kù)查詢(xún)一個(gè)月的記錄的sql語(yǔ)句:

    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 月亮 閱讀(2203) | 評(píng)論 (1)編輯 收藏

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

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

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

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

    成為有錢(qián)人的25種方法

    “嫁個(gè)有錢(qián)人”不如自己成為有錢(qián)人,你想發(fā)財(cái)嗎?你知道如何成為有錢(qián)人嗎?

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

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

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

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

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

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

    7、不要不敢采用不同的方式——新的方法和新產(chǎn)品,會(huì)造成新的財(cái)富。但必須確定你的新方法比舊方法更理想,你的新方法必
    想致富,請(qǐng)?jiān)該u錢(qián) 引爆數(shù)碼影像!
    中華川菜火鍋大聯(lián) 加盟樂(lè)可可天天樂(lè)

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

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

    9、在你著手任何事情之前,仔細(xì)地對(duì)周?chē)那樾窝芯恳环U畽C(jī)關(guān)和公共圖書(shū)館,可以提供不少資料,先做研究,可以節(jié)省你不少時(shí)間和金錢(qián)。

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

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

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

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

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

    15、不要不敢自己下決心。聽(tīng)聽(tīng)別人的贊美和批評(píng),但你自己要下決心。

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

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

    18、不要因?yàn)槭【凸悴磺啊J∈请y免的,也是有價(jià)值的,從失敗中,你會(huì)學(xué)到正確的方法論。

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

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

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

    22、請(qǐng)一位高明的律師——他會(huì)替你節(jié)約更多的金錢(qián)和時(shí)間,比起你所給予的將要多的多。

    23、請(qǐng)一位精明的會(huì)計(jì)師。最初的時(shí)候,你自己記賬,但除非你本身是個(gè)會(huì)計(jì)師,你還是請(qǐng)一位精明的會(huì)計(jì)師,可能決定你的成功和失敗——他是值得你花錢(qián)的。

    24、請(qǐng)專(zhuān)家替你報(bào)稅。一位機(jī)靈的稅務(wù)專(zhuān)家,可又替你免很多的稅。

    25、好好維持你的健康和你的平靜心靈——否則的話(huà),擁有再多的錢(qián)也沒(méi)有什么意思。

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

    阻礙成功的幾個(gè)性格

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

    -如果有就趕快克服它。

     

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

    辦公室中的省時(shí)小秘訣

    1.了解你的精力充沛期。通常人們?cè)谠绯?點(diǎn)左右工作效率最高,可以把最困難的工作放到這時(shí)來(lái)完成。

      2.集中一天中的頭兩個(gè)小時(shí)來(lái)處理手頭的工作并不接電話(huà)、不開(kāi)會(huì)、不受打擾。這樣可以事半功倍。

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

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

      5.學(xué)會(huì)高效地利用零碎時(shí)間,用來(lái)讀點(diǎn)東西或是構(gòu)思一個(gè)文件,不要發(fā)呆或做白日夢(mèng)。

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

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

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

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

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

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

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

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

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

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

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

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

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

       看下面的代碼:

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

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

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

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

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

       定義了下面一個(gè)方法:

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

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

    這么快就12點(diǎn)半了,睡覺(jué)了~~~不然明天早晨爬不起來(lái)了。

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

    Java中的"goto"語(yǔ)句

    雖然Java中g(shù)oto語(yǔ)句只是java的一個(gè)保留字,沒(méi)有起任何作用,但是我今天在使用continue和break語(yǔ)句時(shí),還是發(fā)現(xiàn)了其中又goto語(yǔ)句的影子。因?yàn)閏ontinue和break語(yǔ)句都支持跳到一個(gè)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); 
       }
      }

    上面一段語(yǔ)句的輸出為

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

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

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

    Java對(duì)象比較

     

    Java中檢查兩個(gè)對(duì)象是否相等,這個(gè)看起來(lái)很簡(jiǎn)單的事情但是實(shí)際做起來(lái)不一定是一個(gè)簡(jiǎn)單的事情。我們可能首先想到的是==運(yùn)算符號(hào),但是這個(gè)運(yùn)算符真的能比較兩個(gè)對(duì)象么?我們先看下面一段代碼:

       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 );

    }

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

    可能以為equals方法能幫我們解決這個(gè)問(wèn)題,那么來(lái)試一下,

    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,這是因?yàn)轭?lèi)默認(rèn)的equal方法是直接比較句柄的,而不是我們所希望的比較內(nèi)容,所以我們不得不發(fā)現(xiàn)我們要比較兩個(gè)類(lèi)的內(nèi)容我們不得不在類(lèi)中重寫(xiě)equal()方法來(lái)實(shí)現(xiàn)比較兩個(gè)類(lèi)的內(nèi)容。

     

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

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

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

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

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

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

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

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

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

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

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

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

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

    (11) 盡可能細(xì)致地加上注釋?zhuān)⒂胘avadoc注釋文檔語(yǔ)法生成自己的程序文檔。

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

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

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

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

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

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

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

    (19) 在構(gòu)建器內(nèi)部,只進(jìn)行那些將對(duì)象設(shè)為正確狀態(tài)所需的工作。盡可能地避免調(diào)用其他方法,因?yàn)槟切┓椒赡鼙黄渌烁采w或取消,從而在構(gòu)建過(guò)程中產(chǎn)生不可預(yù)知的結(jié)果(參見(jiàn)第7章的詳細(xì)說(shuō)明)。

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

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

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

    (23) 為避免編程時(shí)遇到麻煩,請(qǐng)保證在自己類(lèi)路徑指到的任何地方,每個(gè)名字都僅對(duì)應(yīng)一個(gè)類(lèi)。否則,編譯器可能先找到同名的另一個(gè)類(lèi),并報(bào)告出錯(cuò)消息。若懷疑自己碰到了類(lèi)路徑問(wèn)題,請(qǐng)?jiān)囋囋陬?lèi)路徑的每一個(gè)起點(diǎn),搜索一下同名的.class文件。

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

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

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

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

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

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

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

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

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

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

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

    <一>從“一個(gè)對(duì)象到另一個(gè)對(duì)象的賦值”,如:

            Class  A = new Class();

           Class  B  = A;

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

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

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

         方法定義:

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

       那么A的num值會(huì)變成99.

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

       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,對(duì)象A的更改影響到了ArrayList中的保存的對(duì)象.

     

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

    人生就像一碗蔬菜湯

    你看過(guò)老鷹嗎?咱們生活在都市的人,大概很少有機(jī)會(huì)看到老鷹。根據(jù)鳥(niǎo)類(lèi)生態(tài)學(xué)家的研究,老鷹是一種奇特的飛禽,因?yàn)樗鼈兌及迅C巢筑在樹(shù)梢,或是懸崖陡巖上,通用動(dòng)物很難直接攻擊它。

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

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

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

      母鷹殘忍、無(wú)情嗎?不,母鷹深?lèi)?ài)著它生養(yǎng)的小鷹!

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

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

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

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

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

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

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

      其實(shí),人生就如同"一大碗蔬菜湯",如果沒(méi)經(jīng)過(guò)攪動(dòng),鮮美好料就會(huì)"一直沉在碗底"。就像小鷹一樣,母鷹無(wú)情地?cái)噭?dòng)窩巢,才逼得它必須獨(dú)立展翅飛翔;可是,它不能搶劫超商、不能跳樓自殺,還是必須靠自己"獨(dú)立更生",才有食物吃啊!人,似乎很少聽(tīng)說(shuō)因?yàn)樘趧凇⒘骱固啵缓顾蜎](méi)的!

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

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

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

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

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

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

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

    主站蜘蛛池模板: 久久免费观看视频| 又大又硬又粗又黄的视频免费看| 很黄很污的网站免费| 亚洲毛片αv无线播放一区| 国产免费内射又粗又爽密桃视频| 四虎国产精品免费久久影院| 美女视频黄频a免费观看| 亚洲 综合 国产 欧洲 丝袜| 少妇亚洲免费精品| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久久久免费看黄a级试看| 亚洲av永久无码精品古装片| 免费观看久久精彩视频| 久久久亚洲欧洲日产国码是AV| 91久久成人免费| 亚洲国产欧美国产综合一区 | 亚洲香蕉成人AV网站在线观看| 九九99热免费最新版| 亚洲av无码不卡一区二区三区| 成年人网站免费视频| 亚洲国产精品无码观看久久| 亚洲精品成人片在线观看| 日本在线免费观看| 亚洲色大成WWW亚洲女子| 亚洲国产成人久久综合区| 国产va在线观看免费| 精品久久久久久亚洲精品| 又大又粗又爽a级毛片免费看| 国产美女视频免费观看的网站| 久久夜色精品国产噜噜噜亚洲AV | a毛片久久免费观看| 亚洲国产av高清无码| avtt亚洲天堂| 91在线手机精品免费观看| 国产AV无码专区亚洲AV蜜芽| 久久伊人久久亚洲综合| 四虎免费在线观看| 日本不卡免费新一区二区三区| 亚洲码和欧洲码一码二码三码| 亚洲日本一区二区三区在线| 日韩一区二区a片免费观看|