<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年12月29日

    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 月亮 閱讀(556) | 評(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 月亮 閱讀(245) | 評(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)編輯 收藏

    主站蜘蛛池模板: 亚洲精品乱码久久久久久下载| 免费毛片在线播放| 亚洲免费视频在线观看| 好男人资源在线WWW免费| 一区二区三区免费电影| 一级特黄录像免费播放中文版| 日韩精品视频在线观看免费| 国产成人亚洲午夜电影| 国产av无码专区亚洲av毛片搜 | 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲精品无码久久一线| 亚洲人成人一区二区三区| 亚洲AV无码码潮喷在线观看| 亚洲视频中文字幕| 亚洲人成人77777网站不卡| 天堂亚洲国产中文在线| 国产成人高清亚洲一区久久| 无码免费又爽又高潮喷水的视频 | 免费被黄网站在观看| 国产成人青青热久免费精品| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲精品成人av在线| 亚洲一区电影在线观看| 亚洲国产成人精品无码区花野真一 | 亚洲日本VA中文字幕久久道具| 激情小说亚洲色图| 黄床大片免费30分钟国产精品| 久久er国产精品免费观看2| xxxxx免费视频| 尤物永久免费AV无码网站| 亚洲国产一区二区三区| 亚洲国产精品VA在线看黑人| 亚洲福利一区二区三区| 色欲aⅴ亚洲情无码AV蜜桃| 两性色午夜视频免费播放| 91频在线观看免费大全| 亚洲国产午夜中文字幕精品黄网站 | 国产v精品成人免费视频400条| 免费a级毛片永久免费| 亚洲国产精品VA在线看黑人 | 亚洲国产精彩中文乱码AV|