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

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

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

    konhon

    忘掉過去,展望未來。找回自我,超越自我。
    逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

    Google

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

    #

    復制表結構的通用存儲過程

    -- Transfer對象的重要屬性

    -- 1. 屬性

    屬性名                            類型                描述
    --------------------------------- ------------------- --------------------
    CopyAllDefaults                Boolean    所有默認值
    CopyAllObjects                 Boolean    所有對象
    CopyAllRules                   Boolean    所有規則
    CopyAllStoredProcedures        Boolean    所有存儲過程
    CopyAllTables                  Boolean    所有表
    CopyAllTriggers                Boolean    所有觸發器
    CopyAllUserDefinedDatatypes    Boolean    所有用戶自定義類型
    CopyAllViews                   Boolean    所有視圖
    CopyData                       Boolean    所有數據
    DestDatabase                   String     目標對象數據庫
    DestLogin                      String     目標數據庫登陸用戶名
    DestPassword                   String     目標數據庫登陸密碼
    DestServer                     String     目標服務器
    DestUseTrustedConnection       Boolean    用戶信任連接
    DropDestObjectsFirst           Boolean    是否先刪除目標對象
    IncludeDependencies            Boolean    是否包含依靠對象
    ScriptType                     Boolean    腳本類型

    -- 2. 重要方法: 

    方法名稱                    功能描述
    --------------------------- --------------------------
    AddObject                   增加對象
    AddObjectByName             通過對象名稱增加對象

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[P_CopyDB]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[P_CopyDB]
    GO

    /*-- 在 SQLServer 中使用SQLDMO.Transfer 實現數據遷移
        存儲過程實現源數據庫到目標數據庫的對象和數據的復制
        要求源數據庫和目標數據庫在同一服務器
        如果是要實現不同服務器之間的復制,則需要增加驗證信息
    --鄒建 2005.07(引用請保留此信息)--*/

    /*--調用示例

        CREATE DATABASE test
        EXEC P_CopyDB @Source_DB='northwind',@Des_DB='test'
        DROP DATABASE test
    --*/
    CREATE PROCEDURE P_CopyDB     
    @Des_DB      sysname,           --目標數據庫
    @Obj_Type    nvarchar(4000)=N'',--復制的對象類型,可以是下列字符串列表:
                                    -- O 所有對象,D 默認值,R 規則,P 存儲過程
                                    -- T 表,TR 觸發器,DT 用戶定義數據類型
                                    -- V 視圖,DATA 數據,DEL 刪除目標對象
    @Source_DB   sysname=N'',       --源數據庫
    @ServerName  sysname=N'',       --服務器名
    @UserName    sysname=N'',       --用戶名,不指定則表示使用 Windows 身份登錄
    @pwd         sysname=N''        --密碼 
    AS
    SET NOCOUNT ON
    DECLARE @srvid int,@Dbid int,@S_dbid int,@D_dbid int,@TransferID int,
        @err int,@src varchar(255), @desc varchar(255)

    IF ISNULL(@ServerName,N'')=N'' SET @ServerName=@@SERVERNAME
    IF ISNULL(@Source_DB,N'')=N'' SET @Source_DB=DB_NAME()

    --創建sqldmo對象·
    EXEC @err=sp_oacreate 'sqldmo.sqlserver',@srvid OUT
    IF @err<>0 GOTO lb_Err

    --連接服務器
    IF ISNULL(@UserName,N'')=N'' --使用 Windows 身份登錄
    BEGIN
        EXEC @err=sp_oasetproperty @srvid,'loginsecure',-1
        IF @err<>0 GOTO lb_Err

        EXEC @err=sp_oamethod @srvid,'connect',NULL,@servername
    END
    ELSE
        EXEC @err=sp_oamethod @srvid,'connect',NULL,@servername,@UserName,@pwd

    IF @err<>0 GOTO lb_Err

    --獲取數據庫集
    EXEC @err=sp_oagetproperty @srvid,'databases',@Dbid OUT
    IF @err<>0 GOTO lb_Err

    --選擇源數據庫    
    EXEC @err=sp_oamethod @Dbid,'item',@S_dbid OUT,@Source_DB
    IF @err<>0 GOTO lb_Err

    --選擇目標數據庫    
    EXEC @err=sp_oamethod @Dbid,'item',@D_dbid OUT,@Des_DB
    IF @err<>0 GOTO lb_Err

    --設置復制的對象
    EXEC @err=sp_oacreate 'SQLDMO.Transfer',@TransferID OUT
    IF @err<>0 GOTO lb_Err

    --設置目標服務器信息
    EXEC @err=sp_oasetproperty  @TransferID,'DestServer',@ServerName
    IF @err<>0 GOTO lb_Err

      --設置連接用戶
    IF ISNULL(@UserName,N'')=N'' --使用 Windows 身份登錄
    BEGIN
        EXEC @err=sp_oasetproperty @TransferID,'DestUseTrustedConnection',1
        IF @err<>0 GOTO lb_Err
    END
    ELSE
    BEGIN
        EXEC @err=sp_oasetproperty @TransferID,'DestLogin',@UserName
        IF @err<>0 GOTO lb_Err

        EXEC @err=sp_oasetproperty @TransferID,'DestPassword',@pwd
        IF @err<>0 GOTO lb_Err
    END

      --設置復制對象信息
    EXEC @err=sp_oasetproperty @TransferID,'DestDatabase',@Des_DB
    IF @err<>0 GOTO lb_Err

    DECLARE tb CURSOR FAST_FORWARD LOCAL
    FOR
    SELECT Name FROM(
        SELECT KeyWord=N',D,',   Name=N'CopyAllDefaults' UNION ALL
        SELECT KeyWord=N',O,',   Name=N'CopyAllObjects' UNION ALL
        SELECT KeyWord=N',R,',   Name=N'CopyAllRules' UNION ALL
        SELECT KeyWord=N',P,',   Name=N'CopyAllStoredProcedures' UNION ALL
        SELECT KeyWord=N',T,',   Name=N'CopyAllTables' UNION ALL
        SELECT KeyWord=N',TR,',  Name=N'CopyAllTriggers' UNION ALL
        SELECT KeyWord=N',DT,',  Name=N'CopyAllUserDefinedDatatypes' UNION ALL
        SELECT KeyWord=N',V,',   Name=N'CopyAllViews' UNION ALL
        SELECT KeyWord=N',DATA,',Name=N'CopyData' UNION ALL
        SELECT KeyWord=N',DEL,', Name=N'DropDestObjectsFirst'
    )A WHERE CHARINDEX(KeyWord,
            CASE WHEN ISNULL(@Obj_Type,N'')='' THEN ',O,DATA,' ELSE @Obj_Type END)>0
    OPEN tb
    FETCH tb INTO @src
    WHILE @@FETCH_STATUS=0
    BEGIN
        EXEC @err=sp_oasetproperty @TransferID,@src,1
        IF @err<>0 GOTO lb_Err
        FETCH tb INTO @src
    END
    CLOSE tb
    DEALLOCATE tb

    --復制對象
    EXEC @err=sp_oamethod @S_dbid,'Transfer',null,@TransferID
    IF @err<>0 GOTO lb_Err

    --結束
    SET @err=0
    GOTO lb_Exit

    --錯誤處理
    lb_Err:
        EXEC sp_oageterrorinfo NULL, @src OUT, @desc OUT 
        RAISERROR(N'錯誤編號 %#x, 錯誤源 "%s", 錯誤描述 "%s"',16,1,@err,@src,@desc)
        RETURN -1

    lb_Exit:
        EXEC sp_OADestroy @Dbid  
        EXEC sp_OADestroy @srvid 
        EXEC sp_OADestroy @TransferID 
        RETURN @err
    GO

    posted @ 2005-09-16 19:42 konhon 優華 閱讀(885) | 評論 (0)編輯 收藏

     

    This stored procedure can be used to insert the result set of the
    particular select statement into Excel file (c:\ImportToExcel.xls,
    by default).
    You can pass the server name, user name, user password, the select
    statement to execute, and the file name to store the results set,
    as in the example below:

    EXEC ExportToExcel @server = '.',
                       @uname = 'sa',
                       @QueryText = 'SELECT au_fname FROM pubs..authors',
                       @filename = 'c:\ImportToExcel.xls'

    /*
    Version: SQL Server 7.0/2000
    Created by: Alexander Chigrik
    - all about MS SQL
    (SQL Server Articles, FAQ, Scripts, Tips and Test Exams).

    This stored procedure can be used to insert the result set of the
    particular select statement into Excel file (c:\ImportToExcel.xls,
    by default).
    You can pass the server name, user name, user password, the select
    statement to execute, and the file name to store the results set,
    as in the example below:

    EXEC ExportToExcel @server = '.',
                       @uname = 'sa',
                       @QueryText = 'SELECT au_fname FROM pubs..authors',
                       @filename = 'c:\ImportToExcel.xls'
    */

    IF OBJECT_ID('ExportToExcel') IS NOT NULL DROP PROC ExportToExcel
    GO

    CREATE PROCEDURE ExportToExcel (
      @server sysname = null,
      @uname sysname = null,
      @pwd sysname = null,
      @QueryText varchar(200) = null,
      @filename varchar(200) = 'c:\ImportToExcel.xls'
    )
    AS
    DECLARE @SQLServer int,
            @QueryResults int,
            @CurrentResultSet int,
            @object int,
            @WorkBooks int,
            @WorkBook int,
            @Range int,
            @hr int,
            @Columns int,
            @Rows int,
            @indColumn int,
            @indRow int,
            @off_Column int,
            @off_Row int,
            @code_str varchar(100),
            @result_str varchar(255)

    IF @QueryText IS NULL 
      BEGIN
        PRINT 'Set the query string'
        RETURN
      END

    -- Sets the server to the local server
    IF @server IS NULL SELECT @server = @@servername

    -- Sets the username to the current user name
    IF @uname IS NULL SELECT @uname = SYSTEM_USER

    SET NOCOUNT ON

    EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @SQLServer OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create SQLDMO.SQLServer'
        RETURN
    END

    --  Connect to the SQL Server
    IF @pwd IS NULL
      BEGIN
        EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname
        IF @hr <> 0
           BEGIN
             PRINT 'error Connect'
             RETURN
           END
      END
    ELSE
      BEGIN
        EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname, @pwd
        IF @hr <> 0
          BEGIN
            PRINT 'error Connect'
            RETURN
          END
      END

    SELECT @result_str = 'ExecuteWithResults("' + @QueryText + '")'
    EXEC @hr = sp_OAMethod @SQLServer, @result_str, @QueryResults OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error with method ExecuteWithResults'
        RETURN
    END

    EXEC @hr = sp_OAMethod @QueryResults, 'CurrentResultSet', @CurrentResultSet OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error get CurrentResultSet'
        RETURN
    END

    EXEC @hr = sp_OAMethod @QueryResults, 'Columns', @Columns OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error get Columns'
        RETURN
    END

    EXEC @hr = sp_OAMethod @QueryResults, 'Rows', @Rows OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error get Rows'
        RETURN
    END

    EXEC @hr = sp_OACreate 'Excel.Application', @object OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create Excel.Application'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @object, 'WorkBooks', @WorkBooks OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create WorkBooks'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @WorkBooks, 'Add', @WorkBook OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error with method Add'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @object, 'Range("A1")', @Range OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create Range'
        RETURN
    END

    SELECT @indRow = 1
    SELECT @off_Row = 0
    SELECT @off_Column = 1

    WHILE (@indRow <= @Rows)
    BEGIN
    SELECT @indColumn = 1

    WHILE (@indColumn <= @Columns)
    BEGIN

    EXEC @hr = sp_OAMethod @QueryResults, 'GetColumnString', @result_str OUT, @indRow, @indColumn
    IF @hr <> 0
    BEGIN
        PRINT 'error get GetColumnString'
        RETURN
    END

    EXEC @hr = sp_OASetProperty @Range, 'value', @result_str
    IF @hr <> 0
    BEGIN
        PRINT 'error set value'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @Range, 'Offset', @Range OUT, @off_Row, @off_Column
    IF @hr <> 0
    BEGIN
        PRINT 'error get Offset'
        RETURN
    END

    SELECT @indColumn = @indColumn + 1

    END

    SELECT @indRow = @indRow + 1
    SELECT @code_str = 'Range("A' + LTRIM(str(@indRow)) + '")'
    EXEC @hr = sp_OAGetProperty @object, @code_str, @Range OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create Range'
        RETURN
    END

    END

    SELECT @result_str = 'exec master..xp_cmdshell ''del ' + @filename + ''', no_output'
    EXEC(@result_str)
    SELECT @result_str = 'SaveAs("' + @filename + '")'
    EXEC @hr = sp_OAMethod @WorkBook, @result_str
    IF @hr <> 0
    BEGIN
        PRINT 'error with method SaveAs'
        RETURN
    END

    EXEC @hr = sp_OAMethod @WorkBook, 'Close'
    IF @hr <> 0
    BEGIN
        PRINT 'error with method Close'
        RETURN
    END

    EXEC @hr = sp_OADestroy @object
    IF @hr <> 0
    BEGIN
        PRINT 'error destroy Excel.Application'
        RETURN
    END

    EXEC @hr = sp_OADestroy @SQLServer
    IF @hr <> 0
    BEGIN
        PRINT 'error destroy SQLDMO.SQLServer'
        RETURN
    END
    GO

    posted @ 2005-09-16 19:41 konhon 優華 閱讀(751) | 評論 (0)編輯 收藏

    UML

    UML有三類主要的圖, 靜態圖(static diagrams),動態圖(dynamic diagrams),物理圖(physical diagrams)。

    靜態圖描述了那些不發生變化的軟件元素的邏輯結構,描繪了類、對象、數據結構及其存在于它們之間的關系。

    動態圖展示了在運行期間軟件實體的變化,描繪了執行流程、實體改變狀態的方式。

    物理圖顯示了軟件實體的不變化的物理結構,描繪的物理實體有源文件、庫文件、字節文件、數據文件等,以及存在于它們之間的關系。

    UML表示:

    1)長方形表示類、箭頭表示關系(一般用垂直方向的箭頭表示繼承關系, 水平方向的箭頭表示關聯);
    2)圖中所有的關系叫關聯(associations),關聯是簡單的數據關系,用來表示一個對象持有一個另外一個對象的引用,或是調用另外一個對象的方法;
    3)關系的名稱映射到持有的引用的變量名稱;
    4)挨著箭頭的數字通常用來說明關聯持有實例的數量,如果數字大于1說明采用了某些容器,通常是使用了一個數組;
    5)類圖標可以有多于一個的框格,最上面的框格永遠是表示類的名稱,其它的框格描述函數和變量;
    6)《interface》符號表示Comparable是一個接口(interface);
    7)大多數符號是可選的。
    8)在變量和函數的前面有一個字符,一個“-”表示變量或函數是私有(private),“#”表示變量或函數是受保護(protected)的,“+”表示變量或函數是公開的。

    posted @ 2005-09-08 21:27 konhon 優華 閱讀(384) | 評論 (0)編輯 收藏

    Java examples (example source code)

    http://www.java2s.com/ExampleCode/J2ME/CatalogJ2ME.htm
    posted @ 2005-09-08 19:37 konhon 優華 閱讀(573) | 評論 (0)編輯 收藏

    有關JSP/Servlet的重定向技術綜述如下[補充]

    1.RequestDispatcher.forward()
    是在服務器端起作用,當使用forward()時,Servlet engine傳遞HTTP請求從當前的Servlet or JSP到另外一個Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時form提交的所有信息在b.jsp都可以獲得,參數自動傳遞.
    但forward()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時forward()無法在后面帶參數傳遞,比如servlet?name=frank,這樣不行,可以程序內通過response.setAttribute("name",name)來傳至下一個頁面.

    重定向后瀏覽器地址欄URL不變.

    例:在servlet中進行重定向
    public void doPost(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException
    {

    response.setContentType(
    "text/html; charset=gb2312");

    ServletContext sc 
    = getServletContext();

    RequestDispatcher rd 
    = null;

    rd 
    = sc.getRequestDispatcher("/index.jsp"); //定向的頁面

    rd.forward(request, response);

    }

    通常在servlet中使用,不在jsp中使用。

    2.response.sendRedirect()
    是在用戶的瀏覽器端工作,sendRedirect()可以帶參數傳遞,比如servlet?name=frank傳至下個頁面,同時它可以重定向至不同的主機上,sendRedirect()可以重定向有frame.的jsp文件.
    重定向后在瀏覽器地址欄上會出現重定向頁面的URL
    例:在servlet中重定向
    public void doPost(HttpServletRequest request,HttpServletResponse response)

    throws ServletException,IOException

    {

    response.setContentType(
    "text/html; charset=gb2312");

    response.sendRedirect(
    "/index.jsp");

    }


    由于response是jsp頁面中的隱含對象,故在jsp頁面中可以用response.sendRedirect()直接實現重定位。
    注意:
    (1).使用response.sendRedirect時,前面不能有HTML輸出。
    這并不是絕對的,不能有HTML輸出其實是指不能有HTML被送到了瀏覽器。事實上現在的server都有cache機制,一般在8K(我是說JSP SERVER),這就意味著,除非你關閉了cache,或者你使用了out.flush()強制刷新,那么在使用sendRedirect之前,有少量的HTML輸出也是允許的。
    (2).response.sendRedirect之后,應該緊跟一句return;
    我們已經知道response.sendRedirect是通過瀏覽器來做轉向的,所以只有在頁面處理完成后,才會有實際的動作。既然你已經要做轉向了,那么后的輸出還有什么意義呢?而且有可能會因為后面的輸出導致轉向失敗。
    比較:
    (1).Request Dispatcher.forward()是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;
    (2).response.sendRedirect()則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。
    前者更加高效,在前者可以滿足需要時,盡量使用RequestDispatcher.forward()方法.

    注:在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用HttpServletResponse.sendRequest()方法。

    3.

    它的底層部分是由RequestDispatcher來實現的,因此它帶有RequestDispatcher.forward()方法的印記。


    如果在之前有很多輸出,前面的輸出已使緩沖區滿,將自動輸出到客戶端,那么該語句將不起作用,這一點應該特別注意。
    另外要注意:它不能改變瀏覽器地址,刷新的話會導致重復提交

    4.修改HTTP header的Location屬性來重定向
    通過設置直接修改地址欄來實現頁面的重定向。
    jsp文件代碼如下:

    <%
    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    String newLocn = "/newpath/jsa.jsp";
    response.setHeader("Location",newLocn);
    %>

    5.JSP中實現在某頁面停留若干秒后,自動重定向到另一頁面
    在html文件中,下面的代碼:

    它的含義:在5分鐘之后正在瀏覽的頁面將會自動變為target.html這一頁。代碼中300為刷新的延遲時間,以秒為單位。targer.html為你想轉向的目標頁,若為本頁則為自動刷新本頁。
    由上可知,可以通過setHeader來實現某頁面停留若干秒后,自動重定向到另一頁面。
    關鍵代碼:
    String content=stayTime+";URL="+URL;
    response.setHeader("REFRESH",content);

    如果總結得不夠全面,請各位發表自己的意見或經驗。
    posted @ 2005-09-08 19:06 konhon 優華 閱讀(864) | 評論 (3)編輯 收藏

    // 一個算物料計劃的存儲過程
    CREATE FUNCTION DBO.F_BomList
    (
          @PPartNo NVARCHAR(20),
          @PQuantity INT = 1,
          @PType BIT = 0
    )
    RETURNS @BomList TABLE(
       PartNo NVARCHAR(20),
       FUsage FLOAT,
       Raw_ID INT)
    AS 
    BEGIN
         DECLARE @BomListTmp TABLE(
               CPartNo NVARCHAR(20),
               PartNo NVARCHAR(20),
               FUsage FLOAT,
               _Level INT)
          --@Lev是層的定義
         DECLARE @LLevel INT, @LSample INT
         SET @LLevel  = 1
         SELECT @LSample = ISNULL(Sample, 1) FROM Bom WHERE CPartNo = @PPartNo
         IF @LSample = 0
              SET @LSample = 1
         --先取@PPartNo的第一層數據到#Temp
         INSERT INTO @BomListTmp (CPartNo, PartNo, FUsage, _Level)
                         SELECT CPartNo, CPartNo, 1, @LLevel FROM Bom WHERE CPartNo = @PPartNo
         --以循環方式取得所有的下層元件清單到#Temp
         WHILE EXISTS(SELECT CPartNo FROM @BomListTmp WHERE _Level = @LLevel)
         BEGIN
               SET @LLevel = @LLevel + 1
               INSERT INTO @BomListTmp (CPartNo, PartNo, FUsage, _Level)
                               SELECT a.CPartNo, a.PartNo,
                               CASE WHEN @LLevel = 2 THEN  a.FUsage * b.FUsage / @LSample ELSE a.FUsage * b.FUsage END, @LLevel
                               FROM BomDtl a, (SELECT PartNo, FUsage FROM @BomListTmp WHERE _Level + 1= @LLevel) b
                               WHERE a.CPartNo = b.PartNo
         END
         -- 計算總量
         INSERT INTO @BomList(PartNo, FUsage, Raw_ID)
                SELECT PartNo, SUM(FUsage) * @PQuantity FUsage, 0 FROM @BomListTmp WHERE _Level <> 1
                GROUP BY PartNo
         IF @PType = 0
               -- 標識非原材料
              UPDATE @BomList SET Raw_ID = 1
                    WHERE PartNo IN (SELECT DISTINCT CPartNo FROM BomDtl)
         RETURN
    End

     

    posted @ 2005-09-08 06:09 konhon 優華 閱讀(429) | 評論 (0)編輯 收藏

    剛開始撰寫JSP時,總是會被JSP的除錯訊息所困擾,如果沒有稍微瞭解JSP與Servlet之間運作關係的初學者,所看到的只是一堆除錯訊息,甚至例外發生的訊息,這些訊息雖然包括詳細的錯誤訊息,但對於初學者而言卻是不友善、不易閱讀理解的。基本上,只要瞭解JSP與Servlet之間的運作關係,並瞭解Java編譯訊息與例外處理,要瞭解在撰寫JSP網頁時,因錯誤而產生的錯誤報告頁面就不是件難事。

    我們知道JSP終究會轉換為Servlet,而運行時真正動作的是Servlet類,所以錯誤可能發生在兩個時候:一個是JSP轉換為 Servlet原始碼時,因為JSP語法錯誤而導致無法生成Servlet原始碼,或是已轉換為Servlet程式碼,但編譯時編譯器檢查出錯誤,這稱之為Translation Time Processing Errors;第二個錯誤發生的時期在於客戶請求執行Servlet時,因為程式邏輯或運行時未考慮到的錯誤而產生例外,這稱之為Client Request Time Processing Errors。

    如何在JSP運行時判別錯誤發生的種類?如果錯誤報告頁面出現"....encountered an internal error....",就有可能是轉換時期錯誤,或是"Generated servlet error: [javac] Compiling 1 source file....",就有可能是編譯器在編譯Servlet程式碼時發現錯誤,這個時候您必須檢查一下JSP語法是否有錯誤,或是程式邏輯有明顯可讓編譯器檢查出的錯誤。
    posted @ 2005-09-08 03:52 konhon 優華 閱讀(437) | 評論 (0)編輯 收藏

    為女朋友寫的一個小程序
    主要功能類似"中英字典", 不中英對照需要自己錄入才行.

    http://m.tkk7.com/Files/konhon/WordTip.rar

    錄入完後供查找.
    適用midp1.0的手機.

    軟件截圖:
    r_aa.JPG
    posted @ 2005-09-07 03:42 konhon 優華 閱讀(697) | 評論 (0)編輯 收藏


    Java的中文問題通常會困擾很多開發者,你可能在開發Web應用程序的時候遇到中文參數的傳遞問題,最后你可能選擇使用Filter把Request的編碼方式設置為GBK來解決。在J2ME的開發中我們同樣會遇到中文問題,比如在RMS中存儲中文、網絡傳輸中傳輸中文、從文件中讀取中文等問題。

        我們在解決中文問題的時候,用到的最多的一個詞就是UTF-8。我們知道ASCII碼是單字節編碼方式,可以解決英文的問題,但是中文的字庫非常龐大,用ASSII碼就難以解決了。Java語言是支持UNICODE編碼方式的,UNICODE是雙字節的編碼方式可以支持中文字庫,但是這多少帶來一些浪費,因為并不是所有的字符串都是非英文字符的。UTF-8編碼方式正好可以解決這個問題,只有當字符不是ASSII碼的時候他采用雙字節來表示,這樣就節省了空間。這里我只總結了三種J2ME常見的中文問題。


    網絡傳輸中的中文問題
        解決這個問題的關鍵是我們不采用InputStream或者OutputStream提供的方法按照字節來傳遞數據,而是把InputStream或者OutputStream封裝為DataInputStream和DataOutputStream。這樣我們就可以使用DataOutputStream中的writeUTF(String s)來送出數據了,同時可以使用DataInputStream提供的readUTF()來讀入數據。注意在這兩個方法搭配使用的時候要注意順序。比如我們在聯網的時候可能寫出這樣的代碼
      
        客戶端
      dos.writeInt(myint);
        dos.writeByte(mybyte);
        dos.writeUTF(myString);

        服務器端
        int i = dis.readInt();
        byte b = dis.readByte();
        String s = dis.readUTF();  
    RMS持久性存儲的中文問題
        由于RMS中的數據存儲都是按照byte[]的格式存儲的,因此我們需要稍微變化一下,但是基本上還是走UTF-8的思路。
        
        寫入數據
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        dos.writeUTF(myString);
        byte[] data = baos.toByteArray();
        rs.addRecord(data,0,data.length);

        讀出數據
        byte[] data = rs.getRecord(index);
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        DataInputStream dis = new DataInputStream(bais);
        String myString = dis.readUTF();
    讀取中文文件的問題
    在MIDP中并不支持文件系統,但是我們可以讀取jar包中的文件。如果文件中含有中文,那么我們需要進行一些特殊的處理,首先我們使用UE或者Notepad工具把相關的文件轉換文UTF-8格式編碼。我們在讀取文件的時候需要進行如下的簡單處理。下面是處理函數。

        public String readFromFile(String fileName)
        {
            String returnString = null;
            InputStream is = getClass().getResourceAsStream(fileName);
            if (is != null)
            {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int ch = 0;
                try
                {
                    while ((ch = is.read()) != -1)
                    {
                        baos.write(ch);
                    }
                    byte[] data = baos.toByteArray();
                    returnString = new String(data, "UTF-8");
                    is.close();
                    baos.close();

                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            return returnString;
        }

    posted @ 2005-09-05 03:11 konhon 優華 閱讀(441) | 評論 (0)編輯 收藏

    1. 具備良好的java語言基礎,不要還沒有學習java語言就拿起一本J2ME的書來看。這樣效果并不好,相反如果你有良好的java語言基礎的話,J2ME就顯得比較容易掌握!

    2. 如果你決定開始學習J2ME了,那么首先你應該清楚J2ME的體系結構是什么樣的。當你真正清楚了Configuration和Profile的關系、了解了CDC和CLDC的區別后,那么你可以開始編寫自己的HelloWorldMIDlet了

    3. 選擇優秀的開發環境,J2ME的開發環境比較靈活。我推薦使用Eclipse和EclipseME插件。因為Eclipse的插件非常豐富且靈活,當你開發聯網應用程序的時候安裝Lomboz就可以了。當然你也可以選擇Jbuilder等IDE,但是不推薦記事本!

    4. 在編寫代碼之前,應該多讀一下好的代碼。畢竟MIDlet的寫法和一般的java Application不是很一樣。推薦WTK中的Demo程序。

    5. MIDP的API doc比較少,每個類的方法也很少。如果有時間的話,每天看個4-5個。這會對你幫助很大。畢竟它的API和J2SE的并不一樣,只是它的子集,不應該想當然的使用。

    6. 清楚MIDP中高級UI和低級UI類的使用和區別,在你做用戶界面的之前,思考好什么符合你的要求,推薦使用高級UI,這樣更簡單、可移植性更好。但是需要使用Canvas的時候不要猶豫,大膽使用!清楚高級事件和低級事件處理的機制。

    7. 在開發應用程序的時候盡量使用MVC模式,這樣擴展性出色。

    8. 徹底掌握Record Management System,這是MIDP的一個重要子集。實現數據持久性存儲不可缺少的系統。善于使用RecordFilter和RecordEnumeration來簡化RMS的操作,在我的blog里面有一系列的關于RMS的文章,有時間就看看吧!

    9. 重視線程,如果你還不真正清楚線程的時候的話,那么趕快找資料看看吧。在J2ME的開發中,這非常的重要。具備了聯網的能力則給你的應用程序插上了翅膀,而聯網的時候為了避免堵塞一定要使用多線程技術。

    10. 時刻關注最新的技術,比如PIM,BlueTooth等都在慢慢的得到支持。你可以使用WTK2.2開發相關的程序了。

    11. 掌握Java中文問題,在J2ME中這個問題更加突出。你應該把你的應用程序放到手機上去測試這個問題而不是在模擬器上。

    12. IO不用我說你也必須清楚,在J2ME中提供的IO包中,類比較少你更應該注意。

    13. 不要因為聽說手機資源受限,在寫程序的時候就顧慮重重,不要犧牲代碼的可讀性和可維護性,但是也不能亂用。這個時候你的java語言的基礎起到了重要的作用!

    14. 如果想開發游戲,那么你應該多讀相關的書籍。我這里一本J2ME游戲開發的書籍(電子版).想看的話可以email聯系我,http://javap2p.nease.net/book/j2me_gamingbook_pdf.zip

    15. 如果有些問題想了很久都沒有明白的話,可以到論壇上去問問,但是不要一有問題就問,自己思考后得到正確答案效果更好。或者把問題放下幾天,也許自然而然就明白了!不是胡說。

    16. 多寫代碼!多多總結!簡單的八個字,非常重要:)
    posted @ 2005-09-05 03:04 konhon 優華 閱讀(460) | 評論 (0)編輯 收藏

    僅列出標題
    共21頁: First 上一頁 12 13 14 15 16 17 18 19 20 下一頁 Last 
    主站蜘蛛池模板: 亚洲av无码天堂一区二区三区| 日韩精品无码区免费专区| 国产成人免费a在线资源| 亚洲色大网站WWW永久网站| 日韩免费一区二区三区在线 | 亚洲精品无码久久久久| 边摸边吃奶边做爽免费视频网站| 国产成人免费网站在线观看| 亚洲精品无码成人| 亚洲Av无码乱码在线观看性色| 一级**爱片免费视频| 亚洲熟女少妇一区二区| 华人在线精品免费观看| 亚洲自偷精品视频自拍| 香蕉97超级碰碰碰免费公| 亚洲熟妇无码av另类vr影视| 日本高清色本免费现在观看| 羞羞视频免费网站含羞草| 亚洲中文字幕无码不卡电影| 成全高清在线观看免费| 亚洲成电影在线观看青青| 最近免费中文字幕大全视频 | 香蕉大伊亚洲人在线观看| 欧洲美熟女乱又伦免费视频| 日韩在线观看视频免费| 亚洲国产精品lv| 女人张开腿等男人桶免费视频| 欧洲美女大片免费播放器视频| 国产亚洲福利精品一区| 国产大片免费网站不卡美女 | 亚洲短视频男人的影院| 四虎国产精品免费久久| 青青青视频免费观看| 亚洲自偷精品视频自拍| 免费无遮挡无码永久在线观看视频| 中文字幕在线成人免费看| 亚洲精品在线网站| 免费在线精品视频| ww在线观视频免费观看| 立即播放免费毛片一级| 久久综合亚洲色一区二区三区|