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 优华 阅读(873) | 评论 (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 优华 阅读(734) | 评论 (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 优华 阅读(370) | 评论 (0)编辑 收藏

Java examples (example source code)

http://www.java2s.com/ExampleCode/J2ME/CatalogJ2ME.htm
posted @ 2005-09-08 19:37 konhon 优华 阅读(561) | 评论 (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 优华 阅读(854) | 评论 (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 优华 阅读(419) | 评论 (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 优华 阅读(421) | 评论 (0)编辑 收藏

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

http://www.blogjava.net/Files/konhon/WordTip.rar

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

軟件截圖:
r_aa.JPG
posted @ 2005-09-07 03:42 konhon 优华 阅读(684) | 评论 (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 优华 阅读(427) | 评论 (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 优华 阅读(450) | 评论 (0)编辑 收藏

仅列出标题
共21页: First 上一页 12 13 14 15 16 17 18 19 20 下一页 Last