隨筆 - 40, 文章 - 0, 評論 - 20, 引用 - 0
          數據加載中……

          2005年12月6日

          J2me開發


          一些資料:




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


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



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

          游戲

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

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

          vi命令詳解

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

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

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

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

            -r?filename?恢復指定的文件filename?.??????????

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

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

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

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

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

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


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

            h?將光標左移一格。??????????

            l?將光標右移一格。??????????

            j?將光標下移一格。??????????

            k?將光標上移一格。??????????

            w?將光標移到下一個小字的前面。??????????

            W?將光標移到下一個大字的前面。??????????

            b?將光標移到前一個小字的前面。??????????

            B?將光標移到前一個大字的前面。??????????

            e?將光標移到下一個小字的后面。??????????

            E?將光標移到前一個大字的后面。??????????

            fc?把光標移到同一行的下一個c字符處。??????????

            Fc?把光標移到同一行的前一個c字符處。??????????

            tc?把光標移到同一行的下一個字符c的前一格。??????????

            Tc?把光標移到同一行的前一個字符c的后一格。??????????

            number|?把光標移到遞number列上。??????????

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

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

            -?把光標移至上一行第一個非空白字符。??????????

            0?把光標移到當前行的第一個字符處。??????????

            $?把光標移到當前行的最后一個字符處。??????????

            H?把光標移到屏幕最頂端一行。??????????

            L?把光標移到屏幕最底端一行。??????????

            M?把光標移到屏幕中間。??????????

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

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

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

            Ctrl+l?重新顯示屏幕當前內容。??????????

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

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

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

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

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

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

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

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

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

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

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

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

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

            /pattern/+number?將光標停在包含pattern的行后面第number行上。?

            /pattern/-number?將光標停在包含pattern的行前面第number行上。?

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

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

            a?在光標之后開始輸入文本。??????????

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

            i在光標之前開始輸入文本。??????????

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

            o在光標所在行后插入一空行。??????????

            O在光標所在行前插入一空行。??????????

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

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

            C?改變一行光標位置以后的部分。??????????

            cw?改變光標所在單詞。??????????

            dd刪除當前行。??????????

            D?刪除光標所在行光標后面的內容。??????????

            dw刪除光標所在的單詞。??????????

            J?把下一行內容加到本行行尾。??????????

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

            R?覆蓋本行內容。??????????

            u恢復上一次的修改。??????????

            x刪除光標所在的字符。??????????

            ~?改變光標所在出字符的大小寫。??????????

            .?重復上一個*作。??????????

            <<把當前行移到左邊。??????????

            >>把當前行移到右邊。??????????

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

            p?將緩沖區內容取到光標所在行的下面一行。??????????

            P?將緩沖區內容取到光標所在行的上面一行。??????????

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

            "bp?張貼有名緩沖區b中內容。??????????

            yy把當前行放入緩沖區。??????????

            Y?把當前行放入緩沖區。??????????

            Yw把光標所在的單詞放入緩沖區。??????????

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            :r?filename讀取filename文件,并將其內容加到當前文件后。???

            :r?!?command執行command文件,并將其輸出加到當前文件后。???

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

            ctrl+g?取得正在編輯文件的有關信息。??????????

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

            :!?Command?執行命令command?.??????????

            !!重新執行上次的:!?Command子命令。??????????

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

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

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

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

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

          精通Log4j

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

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

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

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

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

          ***********? log4j 配置文件結束 ************

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

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

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

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

          ********** TimeSizeRollingFileAppender 類結束 ******

          ************ 調用示例 TestLog4j類 **************
          package com.aspire;

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

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

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

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

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

          23種經典的設計模式_Prototype模式(原形模式)

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

          Prototype 類

          package com.moonsoft;

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


          測試類

          package com.moonsoft;

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

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

          小技巧_jsp緩存問題的解決

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

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

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

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

          用Java實現的Html web服務器

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

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


          ----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("===>客戶機IP==>"+socket.getInetAddress().toString());
          ???//System.out.println("===>客戶機端口==>"+socket.getPort());???
          ???/*
          ??? BufferedWriter writer = new BufferedWriter(new
          ??? OutputStreamWriter(socket.getOutputStream()));
          ??? */
          ???PrintStream outputStream = new PrintStream(socket.getOutputStream());
          ???File file = new File(StringUtil.WEBPATH + fileName);
          ???if (file.exists()) { //如果文件存在
          ????StringUtil.sendHttpHead(outputStream, file);
          ????StringUtil.sendFile(outputStream, file);
          ????outputStream.flush();
          ???} else { //文件沒找到,返回404頁面
          ????StringUtil.send404Page(outputStream);
          ????outputStream.flush();
          ???}
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??} finally {
          ???try {
          ????socket.close();
          ???} catch (Exception e) {
          ???}
          ??}
          ?}

          }



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

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

          ?// 服務器監聽的端口
          ?public static final int LISTENING_PORT = 8080;

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

          ?/**
          ? * 判斷該字符串是不是瀏覽器發送過來的請求頭信息
          ? * @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;
          ?}

          ?/**
          ? * 獲得請求信息中的文件名,默認為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;
          ?}

          ?/**
          ? * 發送文件到客戶端
          ? *
          ? * @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();
          ??}
          ?}

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

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

          }

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

          Apache FileUpload 使用

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

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

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

          EJB QL

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

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

          EJb 會話Bean

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

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

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

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



          轉自:
          http://zengabo.blogchina.com/blog/527365.html

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

          Ibatis示例


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

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

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

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

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

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

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

          通過weblogic的數據源獲得數據庫連接的方法

          通過weblogic的數據源獲得數據庫連接的方法:

          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("查詢到空數據源!");
                }
                conn = ds.getConnection();
              }
              catch (NamingException ex) {
                ex.printStackTrace();
              }
              return conn;
            }
            public static void releaseConnection(Connection conn, PreparedStatement sta,
                                                 ResultSet rs) {
              try {
                if (rs != null) {
                  rs.close();
                }
                if (sta != null)
                  sta.close();
                if (conn != null)
                  conn.close();
              }
              catch (Exception ex) {
                ex.printStackTrace();
              }
            }
            public static void testSearch() {
              Connection conn = null;
              PreparedStatement sta = null;
              ResultSet rs = null;
              try {
                conn = getConnection();
                String sql = "select * from admin_config where config_name like ?";
                sta = conn.prepareStatement(sql);
                sta.setString(1,"%Sms%");
                rs = sta.executeQuery();
                if (rs != null) {
                  while (rs.next()) {
                    System.out.println(rs.getString(1));
                  }
                }
              }
              catch (Exception ex) {
                ex.printStackTrace();
              }
              finally {
                releaseConnection(conn,sta,rs);
              }
            }
            public static void main(String [] argv){
              testSearch();
            }
          }

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

          一個設計中使用比較多的模式

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

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

          JSP標簽的使用方法


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

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

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

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

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


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

          下面就可以在jsp中使用這個標簽了:

          <mylinkurl:urllink linkUrl="

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

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

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

          Java Excel 使用攻略

           現在正在做的項目中涉及大量的Excel文件導出導入操作,都是使用Java Excel來操作。

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

          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 : 如果合并后面的列不為空,那么就把后面格的內容清空,格式也是按前一個單元格的格式
             ws.mergeCells(3,0,4,0);
             
             //添加Number格式數據
             jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
             ws.addCell(labelN);
             
             //添加帶有formatting的Number對象
             jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
             jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
             jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
             ws.addCell(labelNF);
             
             //添加Boolean對象
             jxl.write.Boolean labelBoolean = new jxl.write.Boolean(2,1,false);
             ws.addCell(labelBoolean);
             
             //添加DateTime對象
             DateTime labelDT = new DateTime(3,1,new Date());
             ws.addCell(labelDT);
             
             //添加帶有格式的DataTime數據
             DateFormat dtf = new DateFormat("yyyy-MM-dd hh:mm:ss");
             WritableCellFormat wcfDt = new WritableCellFormat(dtf);   
             wcfDt.setBackground(Colour.YELLOW);
             DateTime labelDT_format =  new DateTime(4,1,new java.util.Date(),wcfDt);
             ws.addCell(labelDT_format);
             ws.mergeCells(4,1,5,1); //比較長,用兩列來顯示     
             
             wwb.write();
             wwb.close();
            }
            catch(IOException e){
             e.printStackTrace();
            }
            catch(WriteException e){
             e.printStackTrace();
            }  
           }
           /**
            * 如何更新Excel文件
            * @param fileName
            */
           public static void updateExcel(String fileName){  
            try{
             jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(fileName));
             WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName),rw);
             //這里其實執行的是一次copy操作,把文件先讀到內存中,修改后再保存覆蓋原來的文件來實現update操作
             WritableSheet ws  = wwb.getSheet(0);
             WritableCell wc = ws.getWritableCell(0,0);
             if( wc.getType() == CellType.LABEL){
              Label l = (Label)wc;
              l.setString(wc.getContents()+"_new");
             }
             wwb.write();
             wwb.close();
            }
            catch(IOException e){
             e.printStackTrace();
            }
            catch(WriteException e){
             e.printStackTrace();
            } 
            catch(BiffException e){
             e.printStackTrace();
            }
           }
           /**
            * 如何copy Excel文件
            * @param fileName
            */
           public static void copyExcel(String sourFileName,String destFileName){  
            try{
             jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourFileName));
             WritableWorkbook wwb = Workbook.createWorkbook(new File(destFileName),rw);
             wwb.write();
             wwb.close();
            }
            catch(IOException e){
             e.printStackTrace();
            }
            catch(WriteException e){
             e.printStackTrace();
            } 
            catch(BiffException e){
             e.printStackTrace();
            }
           }
           
           public static void main(String [] argv){
            //OperateExcel.readExcel("E:\\test.xls");
            //OperateExcel.createExcelFile("E:\\test1.xls");
            //OperateExcel.updateExcel("E:\\test.xls");
            OperateExcel.copyExcel("E:\\test.xls","E:\\moon.xls");
           }

          }


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

          主站蜘蛛池模板: 库尔勒市| 丰宁| 方正县| 岳西县| 西贡区| 合江县| 潮安县| 博野县| 藁城市| 沙田区| 英德市| 广饶县| 承德市| 璧山县| 南通市| 平凉市| 思南县| 嘉定区| 瑞丽市| 阿巴嘎旗| 大竹县| 西乌珠穆沁旗| 蓝山县| 甘孜| 广昌县| 马关县| 翁牛特旗| 巴南区| 府谷县| 垣曲县| 溧水县| 沂源县| 宁德市| 南漳县| 平武县| 崇仁县| 弋阳县| 永安市| 安新县| 沙田区| 郑州市|