我的Java知识库
随笔 - 21, 文章 - 10, 评论 - 4, 引用 - 0
数据加载中……

2007年3月12日

java获取当前系统时间

import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class SystemTime
{
    public static void main(String[] args)
    {
        Calendar cal=Calendar.getInstance();
        //-200代表200天前这个时候的时间
        cal.add(Calendar.DAY_OF_YEAR,-200);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowtime=sdf.format(cal.getTime());
        System.out.println(nowtime);
    }
}

posted @ 2008-07-14 16:45 yangrui 阅读(1318) | 评论 (0)编辑 收藏

批处理常用命令及用法大全

 



阅读本文需要一定的dos基础概念,象:盘符、文件、目录(文件夹)、子目录、根目录、当前目录
每个命令的完整说明请加 /? 参数参考微软的帮助文档可以看到,在 /? 帮助里,"命令扩展名"一词会经常出现"命令扩

展名"是指相对于win98的dos版本而言,每个命令新增的功能
命令测试环境win2000proSP4win98的命令功能太少,就不作研究了

注:如果对某一命令还不是很熟悉,可以在命令行窗口下输入:命令名/?的方式来获得帮助。
例如:对dir命令的应用不熟悉,可以在命令行窗口下输入:

dir /?

1 echo 和 @回显控制命令
@                    #关闭单行回显
echo off             #从下一行开始关闭回显
@echo off            #从本行开始关闭回显。一般批处理第一行都是这个
echo on              #从下一行开始打开回显
echo                 #显示当前是 echo off 状态还是 echo on 状态
echo.                #输出一个"回车换行",一般就是指空白行
echo hello world     #输出hello world
"关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果批处理开始和结束时,系统都会自动打开

回显
2 errorlevel程序返回码

echo %errorlevel%每个命令运行结束,可以用这个命令行格式查看返回码用于判断刚才的命令是否执行成功默认值为0,

一般命令执行出错会设 errorlevel 为1

3 dir显示目录中的文件和子目录列表
dir                 #显示当前目录中的文件和子目录
dir /a              #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
dir c: /a:d         #显示 C 盘当前目录中的目录
dir c:\ /a:-d       #显示 C 盘根目录中的文件dir d:\mp3 /b/p     #逐屏显示 d:\mp3 目录里的文件,只显示文件

名,不显示时间和大小
dir *.exe /s显示当前目录和子目录里所有的.exe文件其中 * 是通配符,代表所有的文件名,还一个通配符 ? 代表一个

任意字母或汉字如 c*.* 代表以 c 开头的所有文件?.exe 代表所有文件名是一个字母的.exe文件如果指定的目录或文件

不存在,将返回 errorlevel 为1;每个文件夹的 dir 输出都会有2个子目录 . 和 ... 代表当前目录.. 代表当前目录的

上级目录
dir .               #显示当前目录中的文件和子目录
dir ..              #显示当前目录的上级目录中的文件和子目录
其它参数可参考 dir /?

4 cd更改当前目录
cd mp3              #进入当前目录中的mp3 目录
cd ..               #进入当前目录中的上级目录
cd\                 #进入根目录
cd                  #显示当前目录
cd /d d:\mp3        #可以同时更改盘符和目录
cd "Documents and Settings"\All users文件名带空格,路径前需要加上引号!!如果更改到的目录不存在,则出错返

回 errorlevel=1

5 md创建目录
md abc              #在当前目录里建立子目录 abc
md d:\a\b\c         #如果 d:\a 不存在,将会自动创建

6 rd删除目录
rd abc              #删除当前目录里的 abc 子目录,要求为空目录
rd /s/q d:\temp     #删除 d:\temp 文件夹及其子文件夹和文件,不需要按 Y 确认

7 del删除文件
del d:\test.txt     #删除指定文件,不能是隐藏、系统、只读文件
del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认
del /q/a/f d:\temp\*.*删除 d:\temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f/s d:\temp\*.*删除 d:\temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录

8 ren文件重命名
ren 1.txt 2.bak     #把 1.txt 更名为 2.bak
ren *.txt *.ini     #把当前目录里所有.txt文件改成.ini文件
ren d:\temp tmp     #支持对文件夹的重命名

9 cls清屏

10 type显示文件内容
type c:\boot.ini    #显示指定文件的内容,程序文件一般会显示乱码
type *.txt          #显示当前目录里所有.txt文件的内容

11 copy拷贝文件
copy c:\test.txt d:\复制 c:\test.txt 文件到 d:\
copy c:\test.txt d:\test.bak复制 c:\test.txt 文件到 d:\ ,并重命名为 test.bak
copy c:\*.*复制 c:\ 所有文件到当前目录,不包括隐藏文件和系统文件不指定目标路径,则默认目标路径为当前目录
copy con test.txt从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件con代表屏幕,prn代表打印机

,nul代表空设备
copy 1.txt + 2.txt 3.txt合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件如果不指定 3.txt ,则保存到 1.txt
copy test.txt +复制文件到自己,实际上是修改了文件日期

12 title设置cmd窗口的标题
title 新标题        #可以看到cmd窗口的标题栏变了

13 ver显示系统版本

14 label 和 vol设置卷标
vol                 #显示卷标
label               #显示卷标,同时提示输入新卷标
label c:system      #设置C盘的卷标为 system

15 pause暂停命令
运行该命令时,将显示下面的消息:请按任意键继续 . . .
一般用于看清楚屏幕上显示的内容

16 rem 和 ::注释命令
注释行不执行操作

17 date 和 time日期和时间
date          #显示当前日期,并提示输入新日期,按"回车"略过输入
date/t        #只显示当前日期,不提示输入新日期
time          #显示当前时间,并提示输入新时间,按"回车"略过输入
time/t        #只显示当前时间,不提示输入新时间

18 goto 和 :跳转命令
:label        #行首为:表示该行是标签行,标签行不执行操作
goto label    #跳转到指定的标签那一行

19 find (外部命令)查找命令
find "abc" c:\test.txt在 c:\test.txt 文件里查找含 abc 字符串的行如果找不到,将设 errorlevel 返回码为1
find /i "abc" c:\test.txt查找含 abc 的行,忽略大小写
find /c "abc" c:\test.txt显示含 abc 的行的行数

20 more (外部命令)逐屏显示
more c:\test.txt    #逐屏显示 c:\test.txt 的文件内容

21 tree显示目录结构
tree d:\            #显示D盘的文件目录结构

22 &顺序执行多条命令,而不管命令是否执行成功
c: & cd\ & dir /w相当于把下面3行命令写到1行去了c:cd\dir /w

23 &&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
f: && cd\ && dir >c:\test.txt注意如果f盘不存在,那么后面2条命令将不会执行
find "ok" c:\test.txt && echo 成功如果找到了"ok"字样,就显示"成功",找不到就不显示

24 ||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

find "ok" c:\test.txt || echo 不成功如果找不到"ok"字样,就显示"不成功",找到了就不显示

25 |管道命令
前一个命令的执行结果输出到后一个命令
dir *.* /s/a | find /c ".exe"管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令该命令行结果:

输出当前文件夹及所有子文件夹里的.exe文件的个数
type c:\test.txt|more这个和 more c:\test.txt 的效果是一样的

26 > 和 >>输出重定向命令
> 清除文件中原有的内容后再写入>> 追加内容到文件末尾,而不会清除原有的内容主要将本来显示在屏幕上的内容输出

到指定文件中指定文件如果不存在,则自动生成该文件
echo hello world>c:\test.txt生成c:\test.txt文件,内容为hello world这个格式在批处理文件里用得很多,可以生成

.reg .bat .vbs 等临时文件
type c:\test.txt >prn屏幕上不显示文件内容,转向输出到打印机
echo hello world>con在屏幕上显示hello world,实际上所有输出都是默认 >con 的
copy c:\test.txt f: >nul拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
copy c:\test.txt f: >nul 2>nul不显示"文件复制成功"的提示信息,并且f盘不存在的话,也不显示错误提示信息
echo ^^W ^> ^W>c:\test.txt生成的文件内容为 ^W > W^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^

符号
27 <从文件中获得输入信息,而不是从屏幕上
一般用于 date time label 等需要等待输入的命令
@echo offecho 2005-05-01>temp.txtdate <temp.txtdel temp.txt这样就可以不等待输入直接修改当前日期

28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*命令行传递给批处理的参数
%0 批处理文件本身%1 第一个参数%9 第九个参数%* 从第一个参数开始的所有参数
在C盘根目录新建test.bat,内容如下:
@echo offecho %0echo %1echo %2echo %*
运行cmd,输入 c:\test.bat "/a" /b /c /d可以看出每个参数的含意
修改test.bat内容如下
@echo offecho %1echo %~1echo %0echo %~f0echo %~d0echo %~p0echo %~n0echo %~x0echo %~s0echo %~a0echo %

~t0echo %~z0
再运行cmd,输入 c:\test.bat "/a" /b /c /d可以参照 call/? 或 for/? 看出每个参数的含意注意这里可以对文件进行

日期比较和大小比较
echo load "%%1" "%%2">c:\test.txt生成的文件内容为 load "%1" "%2"批处理文件里,用这个格式把命令行参数输出到

文件

31 set设置变量
引用变量可在变量名前后加 % ,即 %变量名%
set                    #显示目前所有可用的变量,包括系统变量和自定义的变量
echo %SystemDrive%     #显示系统盘盘符。系统变量可以直接引用
set p                  #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
set p=aa1bb1aa2bb2     #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
echo %p%               #显示变量p代表的字符串,即aa1bb1aa2bb2
echo %p:~6%            #显示变量p中第6个字符以后的所有字符,即aa2bb2
echo %p:~6,3%          #显示第6个字符以后的3个字符,即aa2
echo %p:~0,3%          #显示前3个字符,即aa1
echo %p:~-2%           #显示最后面的2个字符,即b2
echo %p:~0,-2%         #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c%          #用c替换变量p中所有的aa,即显示c1bb1c2bb2
echo %p:aa=%           #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
echo %p:*bb=c%         #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
set p=%p:*bb=c%        #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
set /a p=39            #设置p为数值型变量,值为39
set /a p=39/10         #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3set /a p=p/10          #用 /a

参数时,在 = 后面的变量可以不加%直接引用set /a p="1&0"         #"与"运算,要加引号。其它支持的运算符参见

set/?
set p=                 #取消p变量
set /p p=请输入屏幕上显示"请输入",并会将输入的字符串赋值给变量p注意这条可以用来取代 choice 命令
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
@echo off
set p=aaa
if %p%==aaa (   
  echo %p%   
  set p=bbb   
  echo %p%    )
结果将显示aaaaaa因为在读取 if 语句时已经将所有 %p% 替换为aaa这里的"替换",在 /? 帮助里就是指"扩充"、"环境

变量扩充"可以启用"延缓环境变量扩充",用 ! 来引用变量,即 !变量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaaif %p%==aaa (  
  echo %p%   
set p=bbb   
echo !p!    )
ENDLOCAL
结果将显示aaabbb
还有几个动态变量,运行 set 看不到
%CD%                  #代表当前目录的字符串
%DATE%                #当前日期
%TIME%                #当前时间
%RANDOM%              #随机整数,介于0~32767
%ERRORLEVEL%          #当前ERRORLEVEL 值
%CMDEXTVERSION%       #当前命令处理器扩展名版本号
%CMDCMDLINE%          #调用命令处理器的原始命令行可以用echo命令查看每个变量值,如 echo %time%注意 %time%

精确到毫秒,在批处理需要延时处理时可以用到

32 start批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
start explorer d:\调用图形界面打开D盘
@echo offcd /d %~dp0regedit /s 劲舞团.regstart patcher.exe
不加 start 命令的话,"劲舞团"运行时,后面会有个黑乎乎的cmd窗口

33 call批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行有时有的应用程序用start调用出错的

,也可以call调用

34 choice (外部命令)选择命令让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……win98里

是choice.comwin2000pro里没有,可以从win98里拷过来win2003里是choice.exechoice /N /C y /T 5 /D y>nul延时5秒

下面是个 choice 语句的例子
@echo off
rem 以下在win2000pro运行通过,从win98里拷的chioce.com文件
choice /c:abc aaa,bbb,ccc
if errorlevel 3 goto ccc
if %errorlevel%==2 goto bbb
if errorlevel==1 goto aaa
rem 必须先判断数值高的返回码rem 可以看到 errorlevel 值的判断有3种写法,有时某种写法不好用,可以用另外的写法
rem 直接运行

chioce相当于运行
choice /c:yn:aaa
echo aaa
goto end
:bbb
echo bbb
goto end
:ccc
echo ccc
goto end
:end

35 assoc 和 ftype文件关联assoc 设置'文件扩展名'关联,关联到'文件类型'ftype 设置'文件类型'关联,关联到'执行程序和参数'当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开而是先判断.txt属于 txtfile '文件类型'再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1可以在"文件夹选项"→"文件类型"里修改这2种关联
assoc           #显示所有'文件扩展名'关联
assoc .txt      #显示.txt代表的'文件类型',结果显示 .txt=txtfile
assoc .doc      #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
assoc .exe      #显示.exe代表的'文件类型',结果显示 .exe=exefile
ftype           #显示所有'文件类型'关联
ftype exefile   #显示exefile类型关联的命令行,结果显示 exefile="%1" %* assoc .txt=Word.Document.8设置.txt为word类型的文档,可以看到.txt文件的图标都变了
assoc .txt=txtfile恢复.txt的正确关联 ftype exefile="%1" %*恢复 exefile 的正确关联

如果该关联已经被破坏,可以运行 command.com ,再输入这条命令

36 pushd 和 popd切换当前目录
@echo off
c: & cd\ & md mp3       #在 C:\ 建立 mp3 文件夹
md d:\mp4               #在 D:\ 建立 mp4 文件夹
cd /d d:\mp4            #更改当前目录为 d:\mp4
pushd c:\mp3            #保存当前目录,并切换当前目录为 c:\mp3
popd                    #恢复当前目录为刚才保存的 d:\mp4一般用处不大,在当前目录名不确定时,会有点帮助

32 subst (外部命令)映射磁盘。
subst z: \\server\d     #这样输入z:就可以访问\\server\d了
subst z: /d             #取消该映射
subst                   #显示目前所有的映

38  xcopy (外部命令)文件拷贝
xcopy d:\mp3 e:\mp3 /s/e/i/y复制 d:\mp3 文件夹、所有子文件夹和文件到 e:\ ,覆盖已有文件加 /i 表示如果 e:\ 没有 mp3 文件夹就自动新建一个,否则会有询问

39 一些不常用的内部命令
>& 将一个句柄的输出写入到另一个句柄的输入中
<& 从一个句柄读取输入并将其写入到另一个句柄输出中shift 命令行传递给批处理的参数不止9个时,用以切换参数color 设置cmd窗口的显示颜色
pormpt 更改命令提示符号,默认都是 盘符:\路径\> ,如 c:\>

40 format (外部命令)格式化硬盘
format c: /q/u/autotest/q表示快速格式化,/autotest表示自动格式化,不需要按 Y 确认/u表示每字节用

F6 覆盖硬盘数据,使其不可用软件恢复format c: /c格式化C盘,并检测坏道

41 fdisk (外部命令)硬盘分区win2000不带

该命令win98里的fdisk不支持80G以上大硬盘,winme里的支持fdisk/mbr重建硬盘分区表,一般用于清除引导区病毒、还

原精灵注意使用该命令不能从硬盘启动,必须软驱或光驱启动后直接运行

42 ping (外部命令)
ping -l 65500 -t 192.168.1.200不停的向192.168.1.200计算机发送大小为65500byte的数据包
ping -n 10 127.0.0.1>nulping自己10次,可用于批处理延时10秒

43 SC (外部命令)服务控制命令
sc create aaa displayname= bbb start= auto binpath= "C:\WINDOWS\System32\alg.exe"创建服务,服务名称aaa,显示名称bbb,启动类型:自动可执行文件的路径"C:\WINDOWS\System32\alg.exe"
sc description aaa "ccc"更改aaa的描述为ccc
sc config aaa start= disabled binpath= "C:\WINDOWS\System32\svchost.exe -k netsvcs"更改aaa的启动类型:已禁用更改aaa的可执行文件的路径"C:\WINDOWS\System32\svchost.exe -k netsvcs"
sc config aaa start= demand displayname= ddd更改aaa的启动类型:手动更改aaa的显示名称ddd
sc start aaa启动aaa服务
sc stop aaa停止aaa服务
sc delete aaa删除aaa服务

posted @ 2008-01-07 12:24 yangrui 阅读(1415) | 评论 (0)编辑 收藏

IBM Developerwprks上关于SLA的文章

http://www.ibm.com/developerworks/cn/webservices/ws-slafram/
http://www.ibm.com/developerworks/cn/webservices/ws-wssla/

AlphaWorks Web Services Toolkit
http://www.alphaworks.ibm.com/tech/webservicestoolkit

Apache MUSE Project
http://ws.apache.org/muse/

posted @ 2007-09-29 15:43 yangrui 阅读(263) | 评论 (0)编辑 收藏

CSDN上关于AXIS的文章

http://tag.csdn.net/tag/axis/1.html

AXIS主页(下载地址):
http://ws.apache.org/axis/

Xerces:
http://xerces.apache.org/xerces-j/

开发基于Java的Web服务入门之一:环境的配置 
http://blog.csdn.net/rackylin/archive/2005/02/01/275706.aspx

开发基于Java的Web服务入门之二:应用axis发布web服务(HelloWorld) 
http://blog.csdn.net/rackylin/archive/2005/02/01/275748.aspx

posted @ 2007-09-19 17:56 yangrui 阅读(251) | 评论 (0)编辑 收藏

TOMCAT上Web Service开发攻略[转载]

随着以.NETJ2EE为代表的WEB计算技术的兴起,WEB Service已经成为越来越重要的应用,WEB Service为应用系统间的集成提供了一种新型的交换方式,.NET,J2EE都相继支持WEB Service应用。

笔者不想对WEB Service概念和理论作过多的讨论和阐述,大家可以从下面相关的资料中进一步进行了解。

WEB服务概念性体系架构

http://www-900.ibm.com/developerWorks/cn/webservices/ws-wsca/index.shtml

XML Web Service

http://msdn.microsoft.com/webservices/

目前,Web Service应用一般都采用SOAP(Simple Object Access Protocol, 即简单对象访问协议)协议,和传统的DCOM/COM,CORBA相比,SOAP有以下优点:

首先,前者都是基于2进制流的数据交换,而SOAP是采用基于XML的文本数据交换,因此在数据交换上更容易,更方便。调试以SOAP为基础的应用程序更容易。

其次,SOAP采用HTTP协议,并非私有的协议,所以,能够更加安全的穿越防火墙。如今,MicrosoftIBMSUN都在各自的产品中添加了对SOAP协议的支持,所以,前者COM/DCOMCORBASOAP相比,简直不值得一提。正是SOAP的出现,使得采用不同架构技术的系统的协作、交互成为可能。

SOAP是一种新型的分布式计算技术。利用SOAP,同时结合其他技术,比如UDDIUniversal Discovery Description, and Integration)和WSDLWeb Services Description Language),在Web服务这一概念的支持下,从而可以实现未来商业应用跨越Web进行通信的方式。

那么,接下来,让我直接进入正题,谈一谈TOMCAT下,如何快速开发Web Service应用。

首先,要搭建一个环境, 笔者搭建的环境是: Windows2000 Server(中文版)+TOMCAT4

1 http://jakarta.apache.org/下载TOMCAT4,安装,并且配置好。启动TOMCAT4,在浏览器中输入http://localhost:8080。可以看到首页面,表示TOMCAT4已经配置好了。

2 http://xml.apache.org/dist/axis/1_1RC1/下载AXIS,解压缩到$TOMCAT_HOME/webapps/axis下面去。

在浏览器中运行http://localhost:8080/axis/index.html ,测试是否可以运行。

接下来,我们开始开发一个Web Service应用。编辑一个java文件

CalcService.java

public class CalcService {

 public int add(int p1, int p2) {

 

    return p1 + p2;

 }

 public int subtract(int p1, int p2) {

    return p1 - p2;

 }

}

复制CalcService.java文件到$TOMCAT_HOME/webapps/axis目录下,改名为CalcService.jws。在浏览器中,输入http://localhost:8080/axis/CalcService.jws,得到提示信息如下:

AxisCalcService.jws包装后,提供了一个WSDL的接口外露信息。可以输入http://localhost:8080/axis/CalcService.jws?WSDL察看WSDL的接口信息。通过WSDL接口,我们可以遍写一个VB程序来调用。

测试步骤如下:

1 http://www.microsoft.com上下载SOAP TOOLKIT 3.0,安装。

2 VB6中新建一个工程,添加一个FORM,FROM的界面如下。

3 分别在两个按钮cmdAddcmdMinus中写上如下代码

Private Sub cmdAdd_Click()

    '测试add方法

    On Error Resume Next

    Dim SoapClient As Object

   

    Set SoapClient = CreateObject("MSSOAP.SoapClient30")

    Call SoapClient.MSSoapInit2(Text1.Text, "", "", "CalcService", "")

    If Err.Number <> 0 Then

        MsgBox SoapClient.FaultString, vbExclamation

        Exit Sub

    End If

    ' Now the client can call an operation listed in the portType element

    ' specified when calling mssoapinit().

    Text4.Text = CStr(SoapClient.Add(Val(Text2.Text), Val(Text3.Text)))

   

    If Err.Number <> 0 Then

        MsgBox SoapClient.FaultString, vbExclamation

        Exit Sub

    End If

End Sub

Private Sub cmdMinus_Click()

    '测试substract方法

    On Error Resume Next

    Dim SoapClient As Object

   

    Set SoapClient = CreateObject("MSSOAP.SoapClient30")

    Call SoapClient.MSSoapInit2(Text1.Text, "", "", "CalcService", "")

    If Err.Number <> 0 Then

        MsgBox SoapClient.FaultString, vbExclamation

        Exit Sub

    End If

    ' Now the client can call an operation listed in the portType element

    ' specified when calling mssoapinit().

    Text7.Text = CStr(SoapClient.subtract(Val(Text5.Text), Val(Text6.Text)))

   

    If Err.Number <> 0 Then

        MsgBox SoapClient.FaultString, vbExclamation

        Exit Sub

    End If

End Sub

其中需要注意的是,MSSoapInit2方法简单地说明如下:

HRESULT MSSoapInit2(
          [in] VARIANT par_WSDLFile, 
          [in] VARIANT par_WSMLFile, 
          [in] BSTR par_ServiceName, 
          [in] BSTR par_Port, 
          [in] BSTR par_Namespace);
 
par_WSDLFile                  WSDL文件的位置,本例中为
http://localhost:8080/axis/CalcService.jws?wsdl
par_WSMLFile                  本例中为空
par_ServiceName              本例中为空
par_Port                     服务端口号,可以从wsdl文件中找到。
par_Namespace                本例中为空

关于Microsoft SOAP TOOLKIT 3.0的详细说明,我会以后,专门写文章介绍。

4 运行,并且测试。

总结,应用Web Service技术,我们已经看到了,用VB编写的程序一样可以享用JAVA技术,当然也可以享用.NET技术,当然java编写的应用一样可以享用VB6或.NET开发的WebService。这项技术的应用必将给信息系统的结构模式带来全新的改变。

posted @ 2007-09-19 17:50 yangrui 阅读(510) | 评论 (0)编辑 收藏

如何使用java.util.regex包

在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包。

  可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式。正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性。在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛。

  正则表达式的引擎已被许多普通的Unix工具所实现,包括grep,awk,vi和Emacs等。此外,许多使用比较广泛的脚本语言也支持正则表达式,比如Python,Tcl,JavaScript,以及最著名的Perl。

  我很早以前就是个Perl方面的黑客,如果你和我一样话,你也会非常依赖你手边的这些强大的text-munging工具。近几年来,像其他程序开发者一样,我也越来越关注Java的开发。

  Java作为一种开发语言,有许多值得推荐的地方,但是它一直以来没有自带对正则表达式的支持。直到最近,借助于第三方的类库,Java开始支持正则表达式,但这些第三方的类库都不一致、兼容性差,而且维护代码起来很糟糕。这个缺点,对我选择Java作为首要的开发工具来说,一直是个巨大的顾虑之处。

  你可以想象,当我知道Sun的Java JDK 1.40版本包含了java.util.regex(一个完全开放、自带的正则表达式包)时,是多么的高兴!很搞笑的说,我花好些时间去挖掘这个被隐藏起来的宝石。我非常惊奇的是,Java这样的一个很大改进(自带了java.util.regex包)为什么不多公开一点呢?!

  最近,Java双脚都跳进了正则表达式的世界。java.util.regex包在支持正则表达也有它的过人之处,另外Java也提供详细的相关说明文档。使得朦朦胧胧的regex神秘景象也慢慢被拨开。有一些正则表达式的构成(可能最显著的是,在于糅合了字符类库)在Perl都找不到。

  在regex包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。Pattern类是用来表达和陈述所要搜索模式的对象,Matcher类是真正影响搜索的对象。另加一个新的例外类,PatternSyntaxException,当遇到不合法的搜索模式时,会抛出例外。

  即使对正则表达式很熟悉,你会发现,通过java使用正则表达式也相当简单。要说明的一点是,对那些被Perl的单行匹配所宠坏的Perl狂热爱好者来说,在使用java的regex包进行替换操作时,会比他们所以前常用的方法费事些。

  本文的局限之处,它不是一篇正则表达式用法的完全教程。如果读者要对正则表达进一步了解的话,推荐阅读Jeffrey Frieldl的Mastering Regular Expressions,该书由O’Reilly出版社出版。我下面就举一些例子来教读者如何使用正则表达式,以及如何更简单地去使用它。

  设计一个简单的表达式来匹配任何电话号码数字可能是比较复杂的事情,原因在于电话号码格式有很多种情况。所有必须选择一个比较有效的模式。比如:(212) 555-1212, 212-555-1212和212 555 1212,某些人会认为它们都是等价的。

  首先让我们构成一个正则表达式。为简单起见,先构成一个正则表达式来识别下面格式的电话号码数字:(nnn)nnn-nnnn。

  第一步,创建一个pattern对象来匹配上面的子字符串。一旦程序运行后,如果需要的话,可以让这个对象一般化。匹配上面格式的正则表达可以这样构成:(\d{3})\s\d{3}-\d{4},其中\d单字符类型用来匹配从0到9的任何数字,另外{3}重复符号,是个简便的记号,用来表示有3个连续的数字位,也等效于(\d\d\d)。\s也另外一个比较有用的单字符类型,用来匹配空格,比如Space键,tab键和换行符。

  是不是很简单?但是,如果把这个正则表达式的模式用在java程序中,还要做两件事。对java的解释器来说,在反斜线字符(\)前的字符有特殊的含义。在java中,与regex有关的包,并不都能理解和识别反斜线字符(\),尽管可以试试看。但为避免这一点,即为了让反斜线字符(\)在模式对象中被完全地传递,应该用双反斜线字符(\)。此外圆括号在正则表达中两层含义,如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜线字符(\)。也就是像下面的一样:

  \\(\\d{3}\\)\\s\\d{3}-\\d{4}

  现在介绍怎样在java代码中实现刚才所讲的正则表达式。要记住的事,在用正则表达式的包时,在你所定义的类前需要包含该包,也就是这样的一行:

  import java.util.regex.*;

  下面的一段代码实现的功能是,从一个文本文件逐行读入,并逐行搜索电话号码数字,一旦找到所匹配的,然后输出在控制台。

  BufferedReader in;

  Pattern pattern = Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");

  in = new BufferedReader(new FileReader("phone"));

  String s;

  while ((s = in.readLine()) != null)

  {

  Matcher matcher = pattern.matcher(s);

  if (matcher.find())

  {

  System.out.println(matcher.group());

  }

  }

  in.close();

  对那些熟悉用Python或Javascript来实现正则表达式的人来说,这段代码很平常。在Python和Javascript这些语言中,或者其他的语言,这些正则表达式一旦明确地编译过后,你想用到哪里都可以。与Perl的单步匹配相比,看起来多多做了些工作,但这并不很费事。

  find()方法,就像你所想象的,用来搜索与正则表达式相匹配的任何目标字符串,group()方法,用来返回包含了所匹配文本的字符串。应注意的是,上面的代码,仅用在每行只能含有一个匹配的电话号码数字字符串时。可以肯定的说,java的正则表达式包能用在一行含有多个匹配目标时的搜索。本文的原意在于举一些简单的例子来激起读者进一步去学习java自带的正则表达式包,所以对此就没有进行深入的探讨。

  这相当漂亮吧! 但是很遗憾的是,这仅是个电话号码匹配器。很明显,还有两点可以改进。如果在电话号码的开头,即区位号和本地号码之间可能会有空格。我们也可匹配这些情况,则通过在正则表达式中加入\s?来实现,其中?元字符表示在模式可能有0或1个空格符。

  第二点是,在本地号码位的前三位和后四位数字间有可能是空格符,而不是连字号,更有胜者,或根本就没有分隔符,就是7位数字连在一起。对这几种情况,我们可以用(-|)?来解决。这个结构的正则表达式就是转换器,它能匹配上面所说的几种情况。在()能含有管道符|时,它能匹配是否含有空格符或连字符,而尾部的?元字符表示是否根本没有分隔符的情况。

  最后,区位号也可能没有包含在圆括号内,对此可以简单地在圆括号后附上?元字符,但这不是一个很好的解决方法。因为它也包含了不配对的圆括号,比如"(555" 或 "555)"。相反,我们可以通过另一种转换器来强迫让电话号码是否带有有圆括号:(\(\d{3}\)|\d{3})。如果我们把上面代码中的正则表达式用这些改进后的来替换的话,上面的代码就成了一个非常有用的电话号码数字匹配器:

  Pattern pattern =

  Pattern.compile("(\\(\\d{3}\\)|\\d{3})\\s?\\d{3}(-|)?\\d{4}");

  可以确定的是,你可以自己试着进一步改进上面的代码。

  现在看看第二个例子,它是从Friedl的中改编过来的。其功能是用来检查文本文件中是否有重复的单词,这在印刷排版中会经常遇到,同样也是个语法检查器的问题。

  匹配单词,像其他的一样,也可以通过好几种的正则表达式来完成。可能最直接的是\b\w+\b,其优点在于只需用少量的regex元字符。其中\w元字符用来匹配从字母a到u的任何字符。+元字符表示匹配匹配一次或多次字符,\b元字符是用来说明匹配单词的边界,它可以是空格或任何一种不同的标点符号(包括逗号,句号等)。

  现在,我们怎样来检查一个给定的单词是否被重复了三次?为完成这个任务,需充分利用正则表达式中的所熟知的向后扫描。如前面提到的,圆括号在正则表达式中有几种不同的用法,一个就是能提供组合类型,组合类型用来保存所匹配的结果或部分匹配的结果(以便后面能用到),即使遇到有相同的模式。在同样的正则表达中,可能(也通常期望)不止有一个组合类型。在第n个组合类型中匹配结果可以通过向后扫描来获取到。向后扫描使得搜索重复的单词非常简单:\b(\w+)\s+\1\b。

  圆括号形成了一个组合类型,在这个正则表示中它是第一组合类型(也是仅有的一个)。向后扫描\1,指的是任何被\w+所匹配的单词。我们的正则表达式因此能匹配这样的单词,它有一个或多个空格符,后面还跟有一个与此相同的单词。注意的是,尾部的定位类型(\b)必不可少,它可以防止发生错误。如果我们想匹配"Paris in the the spring",而不是匹配"Java's regex package is the theme of this article"。根据java现在的格式,则上面的正则表达式就是:Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b");

  最后进一步的修改是让我们的匹配器对大小写敏感。比如,下面的情况:"The the theme of this article is the Java's regex package.",这一点在regex中能非常简单地实现,即通过使用在Pattern类中预定义的静态标志CASE_INSENSITIVE :

  Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b",

  Pattern.CASE_INSENSITIVE);

  有关正则表达式的话题是非常丰富,而且复杂的,用Java来实现也非常广泛,则需要对regex包进行的彻底研究,我们在这里所讲的只是冰山一角。即使你对正则表达式比较陌生,使用regex包后会很快发现它强大功能和可伸缩性。如果你是个来自Perl或其他语言王国的老练的正则表达式的黑客,使用过regex包后,你将会安心地投入到java的世界,而放弃其他的工具,并把java的regex包看成是手边必备的利器。

posted @ 2007-09-06 10:14 yangrui 阅读(2869) | 评论 (0)编辑 收藏

Python完全新手教程

     摘要: Python完全新手教程 作者:taowen, billriceLesson 1 准备好学习Python的环境下载的地址是:www.python.org为了大家的方便,我在校内作了copy:http://10.1.204.2/tool/compiler&IDE/Python-2.3.2-1.exelinux版本的我就不说了,因为如果你能够使用linux并安装好说明你可以一切自己搞定的。...  阅读全文

posted @ 2007-06-15 14:42 yangrui 阅读(535) | 评论 (0)编辑 收藏

Telnet中ftp的基本命令

FTP:文件传输协议。先说说他的功能吧,主要就是从运行FTP服务器的计算机传输文件。可以交互使用。这里要注意,只有安装了tcp/ip协议的机器才能使用ftp命令。
命令格式:ftp [-v][-d][-i][-n][-g][-s:filename][-a][-w:windowsize][computer]

说说他们的含义吧。
-v 不显示远程服务器响应
-n 禁止第一次连接的时候自动登陆
-i 在多个文件传输期间关闭交互提示
-d 允许调试、显示客户机和服务器之间传递的全部ftp命令
-g 不允许使用文件名通配符,文件名通配符的意思是说允许在本地文件以及路径名中使用通配字符
-s:filename 指定包含ftp命令的文本文件。在ftp命令启动后将自动运行这些命令。在加的参数里不能有空格。
-a 绑定数据连接时,使用任何的本地端口
-w:windowsize 忽略默认的4096传输缓冲区
computer 指定要连接的远程计算机的ip地址


呵呵,理解了上面的,就说说一些具体的命令,我个人觉得虽然现在工具用起来很方便了,但懂这些命令在很多地方还是很有用的,就像现在nt下的命令提示符
1) ?
说明:显示ftp命令的说明。后面可以加参数,是加需要解释的命令名,不加则显示包含所有命令列表。

2) append
说明:使用当前文件类型设置,将本地文件附加到远程计算机中。大概格式是
append local-file [remote-file] 其中local-file是说指定要添加的本地文件。
remote-file是说指定要将local-file附加到远程计算机文件,要是省了这个,则是使用本地文件名做远程文件名。

3)ascii
说明:默认情况下,将文件传输类型设置为ASCII

4)bell
说明:响玲开关,意思是文件传输完成后是否有玲声提醒。默认是关闭的。

5)binary
说明:将文件传输类型设置为二进制。

6)bye
说明:结束和远程计算机的ftp会话,也就是安全断开,退出ftp.

7)cd
说明:更改远程计算机上的工作目录。如cd data 其中data是要进入的远程计算机的目录。

8)close
说明:结束与远程服务器的ftp会话,并返回命令解释程序。

9)dir
说明:显示远程的文件以及子目录列表。如dir data local-file
其中data是指定要查看列表的目录,没指定的话就是当前目录。local-file是指定要保存列表的本地文件,不指定的话就在屏幕输出。

10)debug
说明:调试开关,打开的时候打印每个发送到远程计算机的命令,命令前有——>
默认情况是关闭的。

11)disconnnect
说明:与远程计算机断开连接,但还保持着ftp命令提示符。

12)get
说明:使用当前文件传输类型,把远程的文件拷贝到本地计算机上。
如get remote-file local-file
remote-file是指定要复制的文件,local-file是指定本地计算机上的文件名,
没有指定的话则个remote-file同名。

13)glob
说明:文件名通配开关

14)hash
说明:转换每个传输数据快的散列标记打印(#).数据快的大小是2048字节。默认情况下是关闭的,

15)help
说明:显示ftp命令的解释,如help commmand 其中command就是你要解释的命令,如果不加command这个参数的话就会显示所有命令的列表

16)!
说明:这个命令差点忘记了功能是在本地计算机上运行指定命令。如! command 其中command就是你要运行的命令,如果不加command这个参数的话,则显示本地命令提示, 这时你输入exit命令就能返回到ftp了。

17)lcd
说明:更改本地计算机的本地目录,在默认的时候是启动ftp的目录.这个不要觉得没用啊,在你使用ftp的时候为了传递文件不是常改变本地和远程计算机的目录吗?
如lcd [directory] 其中[directory]是指定要进入的本地计算机的目录,如果你不加这个参数,就会显示出本地计算机的工作目录.

18)literal
说明:向远程ftp服务器发送协商参数,报告.
如lireral argument [...] 其中argument是指定要发送给远程服务器的协商参数。

19)ls
说明:显示远程目录的文件和字目录.
如ls remote-directory local-file
其中remote-directory是指要查看的列表的目录,不指定的话显示的是当前工作目录。local-file是指定要保存列表的本地文件.不指定的话是在屏幕上输出.

20)mdelete
说明:删除远程计算机上的文件.如mdelete remote-file ...
remote-file肯定是要删的文件啊,可以删除多个.

21)mdir
说明:显示远程目录的文件和子目录列表,他允许指定多个文件.
如mdir remote-file ... local-file
参数我想大家应该明白什么意思吧?不明白就看看前面的类似命令吧.

22)mget
说明:使用当前文件传输类型将多个远程文件复制到本地计算机.
如mget remote-files ...
其实remote-files可以指定多个,他就是指定要复制到本地计算机的远程文件.

23)mkdir
说明:创建远程目录.
如mkdir directory 这个命令和nt下的命令提示符中的md directory一样,不多说了.

24)mls
说明:显示远程目录的文件和目录简表
如mls remote-file ... local-file
其中remote-file这个参数是必须要加的,’’-’’是使用远程计算机的当前工作目录.

25)mput
说明:使用当前文件传输类型,将本地文件复制到远程计算机.
如mput local-files ...

26)open
说明:连接到指定ftp服务器上,
如open computer port 其中computer一般是远程计算机的ip地址,port不用说就是指定端口了。

27)prompt
说明:转换提示,在多个文件传输的时候,ftp提示可以有选择的检索或保存文件,如果关闭提示,则mget和mput命令传输所有文件,在默认情况下是打开的.

28)put
说明:使用当前文件传输类型将本地文件复制到远程计算机中,
如put local-file remote-file
其中local-file是指定要复制的本地文件,
remote-file是指定要复制的远程计算机上的文件名,不指定的话是和本地计算机上的文件名同名.

29)pwd
说明:显示远程呢感计算机上的当前目录.

30)quit
说明:结束与远程计算机的ftp会话,并退出ftp.

31)quote
说明:向远程ftp服务器发送协议,报告.期待ftp单码应答,这个命令的功能和literal相同.

32)recv
说明:使用当前文件传输类型将远程文件复制到本地计算机,他与get命令作用相同。

33)remotehelp
说明:显示远程命令的帮助.这个命令的用法和help,!一样可以参考他的用法.

34)rename
说明:更改远程计算机上的文件名。
这个命令和nt的命令提示符的ren一样,如rename filename newfilename

35)rmdir
说明:删除远程目录.
这个命令和nt的命令提示符的rm一样,如rmdir directory

36)send
说明:使用当前文件传输类型将本地文件复制到远程计算机.send和put命令的功能一样。
如send local-file remote-file

37)status
说明:显示ftp连接和转换的当前状态

38)trace
说明:转换报文跟踪,运行ftp的命令时,trace将显示没个报文的理由。

39)type
说明:设置或显示文件传输类型.
如type [type-name]
其中type-name 的意思是文件传输的类型,默认是ASCII,没加这个参数就是显示当前的传输类型.

40)user
说明:指定连接到远程计算机的用户.
如user user-name [passwd] [account]
其中user-name不用说都是用来登陆计算机的用户名了,
passwd是指定user-name的密码,不指定的话ftp会提示输入密码。
account是指定用来登陆计算机的帐号,如不指定,ftp会提示输入帐号.

41)verbose
说明:转换冗余模式。这里如果打开,会显示所有ftp响应,文件传输结束的时候会显示传输的效率和统计信息,默认的情况是打开的.

呵呵,命令就介绍这些了,可以自己熟悉一下,其实现在ftp的软件很多,很方便,但你说这些命令没用也是不可能的,就像windows下一样还保留着命令提示符._ 特别有些时候ftp软件很多地方做不到的,.? 什么地方。
打个比方,我看过一种觅名ftp用户得到admin的入侵列子,就的用到他.呵呵,这里不多说了,就写到这里了。

posted @ 2007-05-28 16:44 yangrui 阅读(2275) | 评论 (1)编辑 收藏

JDBC2.0 batch updates

JDBC2.0 batch updates

关键字:   JDBC 批量更新    
boolean isSupportBatchUpdates(Connection conn)
   DatabaseMetaData dbm = con.getMetaData();
   if(dbm.supportBatchUpdates())
     return true;
   //notice: catch SQLException,AbstractMethodError
   return false;
int[] batchUpdate(String[] sql)
   //make sure sql is not null!!!
   int res = new int[sql.length];
   if(isSupportBatchUpdates(conn)){
      for(int i = 0;i
        stmt.addBatch(sql[i]);
      res = stmt.executeBatch();
   } else {
      for(int i = 0 ;i
         if(!stmt.execute(sql[i]))
            res[i] = stmt.getUpdateCount();
         else throw new ....
      }
   }
   return res;

posted @ 2007-04-28 10:54 yangrui 阅读(254) | 评论 (0)编辑 收藏

WebSphere的默认管理员和口令

username: system
password: manager

posted @ 2007-03-27 10:01 yangrui 阅读(742) | 评论 (0)编辑 收藏

websphere部署时报java.lang.NoClassDefFoundError: org.jdom.Content

我的项目在RAD编译的时候,没有出错,但是在websphere部署的时候总是提示java.lang.NoClassDefFoundError: org.jdom.Content
但是我已经在项目引用的时候已经import了,要不然也不能正确编译。
这个问题困扰了我两天,最后在网上搜索的时候,一个大牛的发言提示了我。他的大体意思是这个问题是jdom.jar引用冲突造成的,所以我就在was的lib文件夹中删除了jdom.jar,果然it works。
希望跟我有同样问题的人能看到,少浪费点时间吧。

http://jspwiki.org/wiki/BugPluginManagerParseErrorInWebSphere

posted @ 2007-03-23 15:53 yangrui 阅读(3677) | 评论 (0)编辑 收藏

J2EE 类装入揭密

J2EE 类装入揭密

developerWorks

 

Tim deBoer (deboer@ca.ibm.com), WebSphere Studio 开发团队, IBM 多伦多实验室
Gary Karasiuk (karasiuk@ca.ibm.com), Java 解决方案设计师, IBM 多伦多实验室

2002 年 1 月 01 日

本文解释 J2EE 和 WebSphere Application Server 用来构建和装入类的复杂技术。学习当使用 WebSphere Studio Application Developer 构建项目时如何创建大部分 J2EE 规范以及如何避免 ClassNotFoundException。

©2001 International Business Machines Corporation. All rights reserved.

简介

一般 J2EE 尤其是 WebSphere® Application Server 使用复杂的技术来构建和装入类。象许多开发者一样,您可能想知道它们是如何组织在一起的,如何设计项目才能节省时间并且充分利用开发环境。

本文提供有关 J2EE 规范以及如何使用它在 WebSphere Studio Application Developer 中构建项目的信息。除了创建基本的 J2EE 应用程序,我们还将研究一些 Application Developer 的最佳实践和高级功能部件。最后,我们将为您提供一个扎实的基础以便处理“可怕的”ClassNotFoundException。





回页首


J2EE 模块

J2EE 规范描述三种类型的模块:Web 模块、EJB 模块和应用程序客户机模块。当部署到 J2EE 应用程序服务器时,通常会将所有这些模块都压缩到单个 J2EE 应用程序 EAR 文件中。在以下每一节中会讨论一种模块以及如何使用 Application Developer 来构建它。





回页首


Web 模块

Web 模块包含 HTML、图像、JSps™、Java™类和 servlet,以及创建 Web 应用程序所需的所有其它资源。象其它模块一样,Web 模块包含一个部署描述符。在 Web 模块中,部署描述符 web.xml 具有 servlet 初始化和映射信息以及用于在应用程序服务器中运行 Web 模块的其它设置。

Web 模块有两个特殊的 Java 代码文件夹: WEB-INF/classesWEB-INF/lib 。classes 文件夹可以包含“松散(loose)”Java 类(不在 JAR 文件中的类),并且可以将它用于 Web 应用程序范围内的 servlet 或实用程序类。通常对于这个文件夹使用特殊的类装入器,因此如果对类进行更改,则应用程序服务器会自动将它们重新装入。lib 文件夹可以包含也是由 Web 应用程序使用的 JAR 文件(而不是 ZIp 文件!)。应该将第三方 JAR 文件和其它实用程序 JAR 文件放入这个文件夹。如果 JAR 文件被其它 Web 或 EJB 模块使用,则按照下面的 企业应用程序一节中的说明将它们移动到“企业应用程序”项目中。

在 Application Developer 中,Web 模块由 Web 项目表示,它包含两个文件夹:source 和 webApplication。webApplication 文件夹包含扩展形式的完整 J2EE Web 模块。source 文件夹用于存放 .java 文件,因为它们常常不是部署的 Web 模块的一部分。当您在这个文件夹中创建 Java 资源时,会自动编译它们并将它们放入 webApplication/WEB-INF/classes 文件夹。这会使 Web 项目始终保持同步,并准备好测试或导出。

如果从 WAR 文件导入了 Web 模块,则可能注意到 lib 文件夹中的 projectname_classes.jar 文件。这个文件包含导入的 WAR 文件的原始内容。如果 WAR 文件包含源代码,则删除该文件,因为类将在 classes 文件夹中冗余地出现。





回页首


EJB 模块

EJB 模块包含 EJB bean、其特定于服务器的部署代码、部署描述符和助手类(可选的)。它们包含应用程序的业务逻辑,并且在一般情况下由 Web、Application Client 和其它 EJB 模块调用。

在 Application Developer 中,EJB 模块由 EJB 项目表示。这些项目还有两个文件夹,bin 和 ejbModule。EJB 模块的源代码保存在 ejbModule 文件夹中。当更改和生成部署代码时,将这个文件夹中的 Java 类编译到 bin 文件夹中。将剩余的资源(例如,部署描述符)也复制到 bin 文件夹中。与 Web 项目的 webApplication 文件夹类似,bin 文件夹总是包含完整的已部署的 EJB 模块。与 Web 项目不同的是,不应该以任何手工方式修改 bin 文件夹,否则可能丢失更改。在 ejbModule 文件夹中进行所有更改,将会自动编译这些更改或将它们复制到 bin 文件夹中。

如果从 EJB JAR 文件中导入 EJB bean,则可能注意到位于您项目根目录中的 Xxx_importedClasses.jar 文件。这个文件包含导入的 EJB JAR 文件的原始内容。如果 JAR 包含源代码,则删除该文件,因为类将在 bin 文件夹中冗余地出现。





回页首


应用程序客户机模块

使用应用程序客户机模块以包含全功能客户机 Java 应用程序(非基于 Web),它连接到并使用在服务器中定义的 J2EE 资源。通过将客户机代码放入应用程序客户机模块而不是简单 JAR 文件,应用程序客户机将得益于服务器的资源(它不需要将类路径重新指定到 J2EE 和服务器 jar 文件)以及更方便的 JNDI 查询(服务器填充初始上下文和其它参数)。

在 Application Developer 中,应用程序客户机模块由应用程序客户机项目表示。对于大部分模块来说,可以象在 Java 项目中创建独立的 Java 应用程序一样工作。





回页首


企业应用程序(J2EE 应用程序)

企业应用程序是一个或多个 Web、EJB 或应用程序客户机模块的组合。作为这些其它模块的超集,它可以包含可能是多个模块组合的完整的应用程序。除了是一个有效的组合机制外,企业应用程序还在完整的应用程序级别上部署和维护代码,与作为单个代码片段相比,这更加容易。企业应用程序也可以重设被包含的模块的部署描述符内部的设置,以更实用的方式来组合或部署它们。

企业应用程序可能包含所含模块使用的 JAR 文件。这允许在应用程序级别上共享代码,并且还是放置由多个 Web 或 EJB 模块使用的实用程序 JAR 文件的最佳位置。通过将这些 JAR 文件放入企业应用程序而不是全局类路径,它们同时也符合 J2EE 规范,在移动到新服务器时不需要特殊发布和设置。

在 Application Developer 中,企业应用程序是由企业应用程序项目表示的。因为没有直接将源代码构建到企业应用程序,所以这些项目没有子文件夹。





回页首


WebSphere 类装入器

WebSphere Application Server 使用几个类装入器来遵循 J2EE 规范。除了使用类路径环境变量定位并装入类的常规类装入器之外,还有许多正在工作的其它类装入器。

下面的图 1 显示了 WebSphere 中正在工作的类装入器的简化图。每个椭圆代表一个类装入器,方括号中的文本描述了类装入器在何处查找类。



图 1. WebSphere 类装入器
WebSphere 类装入器

在顶部,常规 Java 系统类装入器使用类路径环境变量来装入类。第二个类装入器是特定于 WebSphere 的并且使用 ws.ext.dirs 环境变量来装入类。(有关如何更改这个环境变量的信息,请参阅“发行版说明”。在刷新中,您将能在服务器实例编辑器中更改这个变量。)除了装入所有用户代码之外,这个装入器还装入在运行时所需的所有 WebSphere 和 J2EE 类。最后,由一个或多个模块类装入器来装入运行在服务器中的模块。它们遵循前面讨论的 J2EE 类装入规则来从应用程序装入类和 JAR 文件。

上面的图 1 中最重要的是将每个类装入器定义成其上面的类装入器的子类。无论何时需要装入类,类装入器通常将请求委派给其父类装入器。如果父类装入器无法找到该类,则原始类装入器试图装入该类。请求只能在树中上行而不能下行。如果请求 WebSphere 类装入器查找 J2EE 模块中的类,它不能下行至模块类装入器来查找该类,并且将出现 ClassNotFoundException。一旦由类装入器装入一个类,则它尝试要装入的任何新类将重用同一个类装入器,或者沿着该路径上行直到找到该类为止。

两种情况下,您可能遇到问题。

  • WebSphere、J2EE 和任何全局类无法“看见”包含在应用程序中的类。如果将 JAR 文件添加到全局类路径或 ws.ext.dirs 属性中,则它就不再取决于模块中的类了。

  • 如果需要全局地将数据库驱动程序或实用程序 JAR 添加到类路径,则必须将它们添加到 ws.ext.dirs 属性而不是添加到全局类路径。如果错误地将它们添加到全局类路径,则它们将无法装入(例如)J2EE JAR 文件中的连接池类。这将再次作为 ClassNotFoundException 出现在数据库驱动程序上,但是,对数据库驱动程序类而言,向下查看 J2EE 类是错误的。

查找资源(属性文件、图像等)的公共可移植技术是使用类装入器的 findResourceXX 方法。基于前面的讨论,您可以看出为什么对这个作业使用正确的类装入器是重要的。例如,如果使用 WebSphere 类装入器,您将不能在模块中找到任何资源。





回页首


WebSphere 类装入器隔离方式

正如前面提到的,WebSphere 使用几个类装入器来从部署到服务器的模块中装入应用程序代码。这些类装入器的数量和功能取决于已在 WebSphere 服务器配置中指定的类装入器隔离方式(也称为模块可见性方式)。有四种设置可供选择:

  • Server? 对于整个服务器都使用同一个类装入器。
  • Application? 对于每个企业应用程序使用独立的类装入器。
  • Module? 对每个模块使用单独的类装入器。
  • Compatibility-- 使用与 WebSphere Application Server 3.0.x 和 3.5.x 相同的类装入器模式。这允许代码具有跨越企业应用程序边界的可见性。不赞成使用该方式,除非您正在从旧的服务器中迁移代码。




回页首


构建更大的 ? 模块相互依赖性

当在企业应用程序内构建跨越多个模块的应用程序时,请确保一个模块中的类可以看到另一个模块中它所使用的类。对于想使用企业应用程序之外的 JAR 文件的模块来说也是如此,并且对于编译时和运行时都必须完成该操作。

在编译时,更新类路径是很简单的。您只需要编辑项目的属性然后更改 Java 构建路径以包含其它项目或 JAR 文件,但且慢动手!我们将介绍一种更简便的方法,它只用一步就在编译时和运行时更新它。常规情况下,不要手工更改 J2EE 项目的 Java 构建路径。下列步骤将自动更新并维护构建路径,然后与运行时保持同步。

在运行时,当引用其它模块时,应用程序必须遵循 J2EE 规范。如上面的“WebSphere 类装入器”所述,不要简单地将一个项目放在其中一个全局类路径上,因为这可能会对类装入产生严重影响,并且使所有其它应用程序都能看见您的代码,后果同样严重。

您也不应该依赖于 WebSphere 类装入器隔离方式。如果您的服务器以(例如)Application 方式运行,则可能不必做任何更改就能使应用程序在运行时工作。不要依赖于它!以后,可能需要将应用程序部署到在 module 方式下运行的服务器中,并且您将发现应用程序不再工作。无论使用哪种隔离方式,请遵循下面建议的步骤以确保您的应用程序正确。

解决方案将利用 J2EE 模块是 JAR 文件这一事实。所有 JAR 文件可能具有一个 META-INF 文件夹,它包含 MANIFEST.MF 文件,该文件可能包含引用其它 JAR 文件的类路径。通过将一个其它模块作为一个项加入清单的类路径,当前模块可以利用其包含的类。还可以从企业应用程序中将 JAR 文件添加到清单。对这个简单解决方案的唯一限制是,其它模块决不能依赖于 Web 模块中的类,因为 Web 模块不是用位于其根处的类构建的。换句话说,模块不可能使用清单以依赖 Web 模块中的类。

Application Developer 提供了更新清单文件的简单方法。在 Navigator 或 J2EE 视图中的 J2EE 项目上单击右键,然后选择 Edit Module Dependencies。这会产生一个对话框(参阅下面的图 2),它显示了一个复选框列表,其中包含这个项目可依赖的所有其它模块和 JAR 文件。通过选择列表中的模块或 JAR 文件,可以同时更新清单和构建路径。这确保清单和构建路径总是同步的,并且提供了更改您项目相互依赖性的更简便方法。



图 2. 编辑模块相互依赖性对话框
编辑模块相互依赖性对话框




回页首


应该将 JAR 文件放在哪里?

如果仅在单个 Web 应用程序中使用 JAR 文件,则应该总是将 JAR 文件放在 Web 项目的 webApplication/WEB-INF/lib 文件夹中。这个文件夹中的 JAR 文件将自动添加到 Java 构建路径,并且当移动到另一个服务器时,将不需要任何进一步的设置。

如果 JAR 文件由同一个应用程序中的多个模块使用,则将 JAR 文件放入企业应用程序中。您将需要使用 Edit Module Dependencies 功能部件来设置清单文件和 Java 构建类路径。

如果仍然想将 JAR 文件放置在全局类路径上,(我们强烈建议您不要使用这个方法)您必须确定它是否应该放在全局类路径或 ws.ext.dirs 上。这个判定很简单。如果 JAR 文件需要访问任何 J2EE 或 WebSphere 类或者已经添加到 ws.ext.dirs 中的任何其它 JAR,还必须将它放置在 ws.ext.dirs 属性上。否则,您可以自由使用这两种属性。

最后要记住的一件事是 JAR 文件在路径中的位置越高,其包含的内容就越少。如果与 JAR 文件有牢固的相互依赖性,则更新使用该 JAR 文件的每个项目的 Java 构建路径。将它添加到全局类路径或 ws.ext.dirs 属性还意味着,必须单独地从应用程序发布 JAR 文件,并且当移动到另一个服务器时,必须再次设置服务器类路径。

使用一个全局类路径的唯一好处是次要的 ? 您可以在服务器上节省少量的磁盘空间。重大的缺点是您的应用程序现在很脆弱,其他人可能更改您所依赖的类。例如,假设您依赖某些第三方记录类,并且因为几乎所有应用程序都使用这些记录类,所以您决定在全局类路径上部署它们。使用记录类的版本 1 来测试应用程序。六个月后,部署了另一个应用程序,它需要记录类的版本 2,因此更新了日志记录 JAR。现在,您的应用程序运行在一个从来没有测试过的环境中。





回页首


类还是 JAR?

您需要作出的另一个决定是使用松散类还是使用 JAR。使用松散类的一个很大的好处是容易调试和部署它们。使用松散类,可以通过按 Ctrl-S 进行更改,如果它在可重装入的类路径上(象 WEB-INF/classes ),则可以立即使用它。如果它不在一个可重装入的类路径上,并且如果您正在使用 WebSphere Application Server,则只需要重新启动项目,然后就可使更改生效了。要完成这个任务,在 Navigator 中的项目上单击右键,然后从弹出菜单中选择 Restart project

如果您正在使用 JAR 文件,则还需要完成收集所有类和重构建 JAR 文件的其它构建步骤。您的更改不能很快生效。使用 JAR 文件的好处是使部署更清晰一点,并且更接近期望的生产环境。

如果处于项目的早期阶段,此时经常更改助手类,则您会发现使用松散类将更方便。如果类仅由单个 Web 模块使用,则将类放入 WEB-INF/classes 文件夹。为了使用类,总是使用包,因为当 Java 规范处理缺省包中的类时是不精确的。

如果类由 EJB 使用,则让您的一个 EJB 项目保留助手类(将它们放在 ejbModule 文件夹下),让需要这些助手类的其它 EJB 模块依赖于该 EJB 项目。将您的所有助手类都收集到单个 EJB 项目中,因为在项目之间不建立循环相互依赖性是 非常重要的。好的项目结构规定相互依赖性必须始终采用树的形式。一旦助手类成熟并且没有太多更改时,就切换至 JAR 方法。

如果实用程序类由企业应用程序和常规 Java 应用程序共同使用将会怎样?最简单的方法是使用这些类的 JAR。您可以用一个更复杂的替代方法:

  1. 创建一个简单的 Java 项目以存储实用程序类。
  2. 手工更新依赖于这个项目的项目 Java 构建路径。
  3. 手工更新服务器实例以包含简单 Java 项目的 bin 文件夹。




回页首


开发时类路径对比运行时类路径

在编译时,Java 编译器需要知道您的代码引用的每个类或 JAR 文件,这样就可以安全地对这些类进行编译和类型检查。Java 编译器使用项目级别属性 Java Build path 作为这个信息的唯一源。其它操作(如 Edit Module Dependencies)会操纵构建路径,但是构建路径是权威性源。

在运行时,应用程序服务器使用完全不同的机制来查找和装入类。运行时不知道任何 Java 构建路径,因此您的应用程序可能正确编译,但是在运行时仍然有 ClassNotFoundException。我们希望本文可以揭开这个过程的一些秘密。



作者简介

Tim deBoer是 IBM 多伦多实验室的 WebSphere Studio Application Developer“服务器工具”团队的一名软件开发人员。与他的团队成员一起,他目前负责 WebSphere 和 Tomcat 测试环境和 EJB 测试客户机。可以通过 deboer@ca.ibm.com与 Tim 联系。


Gary Karasiuk目前是 WebSphere Studio Application Developer 的解决方案设计师。他已经在 IBM 多伦多实验室工作了二十多年,主要从事应用程序开发工具、面向对象的编程和咨询工作。可以通过 karasiuk@ca.ibm.com与 Gary 联系。

posted @ 2007-03-20 17:50 yangrui 阅读(250) | 评论 (0)编辑 收藏

org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge问题原因

在开发过程中,已经做好的程序出现了上述错误.
我的程序是用程序解析xml文件,然后用rmi返回结果.
在网上查了一下有这样的回复:

Most likely the object that the remote ejb client trying to marshall is not serializable or the object has changed meaning you might have added or deleted data member from that object. I had the later problem. Hope this helps.

然后我用以前生成的xml文件就没有出现这种错误,这说明是这个新生成的xml文件的问题.
到底问题出在哪,正在研究中.

其他的一些说法:
This problem occurs when you try to read from a EJB with a standalone client.

There at at least two causes for this:

1.) Either some class in your Bean interface is not serializable
or
2.) By using a JRE "incompatible" with WAS JRE when running your app with eclipse. ie. any other JRE than the WAS runs with...


You can correct these by
1.) checking your interface for unserializable classes, and classpath for any references for wrong version of the classes in the interface

2.) Add the WAS JRE to eclipse and use it as a default JRE
2.1) Select Window -> Preferences and JAVA -> Installed JRE's
2.2) Add {YOUR_WAS_HOME}/java/jre set it as a default
但是这种说法显然对我这种情况不适合!

posted @ 2007-03-12 13:35 yangrui 阅读(1876) | 评论 (0)编辑 收藏