Professional Documents
Culture Documents
Update Date:
Control No:
声明:本文可以任意免费转载、复制、传播。但您务必保持其完整性!
Modify Record
日期 作者 版本 更改参考
Approved
姓名 职位 签字
Distribute
编码 姓名 地点和位置
1
2
3
4
Preface 4
Other Notes 36
http://www.w3school.com.cn/
Concept
WebService 让一个程序可以透明地调用互联网的程序,不用管具体的实现细节。只要
WebService公开了服务接口,远程客户端就可以调用服务。WebService是基于http 协议的组件
服务,WebService 是分散式应用程序的发展趋势。
在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
1.XML:描述数据的标准方法.
XML
XML 元素:指的是从(且包括)开始标签直到(且包括)结束标签的部分。
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
<book category="WEB">
category就是book元素的属性。
WSDL
1、类型:定义复合数据类
2、消息:由类型组合成消息(可以作为下面操作的参数)
3、操作:其中定义可以调用的操作,每个操作的参数。操作的集合对外呈现一个接口
4、绑定:定义每个操作具体的调用方式,数据的编码方式()
5、服务:对外呈现服务,可以包含多个绑定
6、端口:远程地址
其中,1,2,3被称为逻辑的描述; 4,5,6用来描述具体的服务地址和参数编码方式
WSDL示例:
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>
依赖于SOAP协议的Web Service,在WEB2.0互联网中显得过于臃肿。于是REST就诞生了。
RESTful HTTP核心操作包括:
Ø GET - 该操作返回已标识资源的状态表示。您可以通过大量的上下文要素来确定状态,例如
谁正在提交请求、操作的参数(传入的参数如 HTTP 头或者查询字符串参数)和服务提供
方维护的当前会话状态。
Ø POST - 该操作执行对已标识资源的一些特定于应用程序形式的更新。该操作行为完全依赖
于实现它的服务。由该操作返回的数据也完全依赖于应用程序。举例来说,像 GET 操作一
样,它可以返回一个状态表示,它还可以选择根本不返回任何数据。
Ø PUT - 该操作在已标识位置(URI)创建新资源。操作输入必须包括一个资源的状态表示。
它完全依赖服务来创建基于这个状态表示的资源。
Download
下载JDK1.6:http://www.oracle.com/technetwork/java/javase/downloads/index.html
下载Tomcat5.5:http://tomcat.apache.org/download-55.cgi
下载Axis1.4:http://www.apache.org/dyn/closer.cgi/ws/axis/1_4
Configure
JDK1.6
安装JDK1.6,略
Tomcat5.5
1.解压Tomcat。
2.配置好JAVA环境变量。有两方法:
方法一:在系统环境变量,设置JAVA_HOME、CLASS_PATH变量。
在window的命令行,执行
注:set命令只能在当前的dos窗体生效。要永久生效,必须使用setx命令。
方法二:修改catalina.bat文件
修改apache-tomcat-5.5.33\bin目录下catalina.bat,加入红色部分(JDK的安装目录)。
3.启动tomcat:apache-tomcat-5.5.33\bin\startup.bat
访问tomcat:http://127.0.0.1:8080/
1.解压Axis压缩包,目录如下:
2.将webapps目录下的axis目录复制到tomcat服务器的webapps目录下。
3.测试是否安装成功。
测试地址:http://127.0.0.1:8080/axis/
上述信息表达axis安装成功。另外两可选组件,可根据业务需要进行安装。
4.本文根据上述链接下载javamail1_4_4.zip、xml-security-bin-1_4_4.zip
解压javamail1_4_4.zip、xml-security-bin-1_4_4.zip。分别将javamail-1.4.4\lib\mailapi.jar、
xml-security-1_4_4\libs\xmlsec-1.4.4.jar复制到
apache-tomcat-5.5.33\webapps\axis\WEB-INF\lib目录下。
注:JDK1.6以下版本,配置Java Mail时无须下载JAF包。
5.3.4重启tomcat,再验证一次。所有包都安装正确啦。
http://localhost:8080/axis/services/Version?method=getVersion
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
10
Test a JWS Endpoint
http://localhost:8080/axis/EchoHeaders.jws?method=list
Instant Deployment
即时发布提供了一种非常快速发布方式。只要有Java源代码(也就是.java文件),然后把其后 缀
名 改 成 jws 拷 贝 到%TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。
AXIS的编译引擎会处理接下来的所有事情。
1.编写WS服务端Java类:Calculator.java
注:即时发布不支持带有包的j ava类,并且必须要有Java类源码.
2.将Calculator.java复制到apache-tomcat-5.5.33\webapps\axis目录下,并重命名为
Calculator.jws
3.重启tomcat,然后访问:http://127.0.0.1:8080/axis/Calculator.jws
4.编写客户端代码,调用Web Service。
JAVA:CalcClient.java
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
public class CalcClient
{
public static void main(String [] args) throws Exception {
Options options = new Options(args);
String endpoint = "http://localhost:" + options.getPort() +"/axis/Calculator.jws";
args = options.getRemainingArgs();
编译CalcClient.java类时,要指定asix的Jar包。
javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CalcClient.java
执行
java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CalcClient -p8080 add 20 50
调用Web Service结果如下:
Custom Deployment
1.编写WS服务端Java类:CusCalculator.java
package webservice.axis.wsdd;
public class CusCalculator {
public float add(float i1, float i2)
{
return i1 + i2;
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
13
}
public float subtract(float i1, float i2)
{
return i1 - i2;
}
}
然后将编译好CusCalculator.class类复制到
apache-tomcat-5.5.33\webapps\axis\WEB-INF\classes目录。
2.编写WSDD文件。
在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录下,新建文件:deploy.wsdd,并加入以
下内容:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- define the service, using the log handler we just defined -->
<service name="CusCalculatorService" provider="java:RPC">
<parameter name="className" value="webservice.axis.wsdd.CusCalculator"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="request"/>
</service>
</deployment>
3.执行发布命令。
切到cmd窗口,切到apache-tomcat-5.5.33\webapps\axis\WEB-INF目录
cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
执行成功后,会在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录生成server-config.wsdd
文件。
注:发布时,要保持tomcat在startup状态。
5.编写客户端代码,调用Web Service。
JAVA:CusCalcClient.java
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
public class CusCalcClient
{
public static void main(String [] args) throws Exception {
String endpoint = "http://127.0.0.1:8080/axis/services/CusCalculatorService";
Float i1 = new Float(20.32);
Float i2 = new Float(100.67);
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
//调用哪个方法
call.setOperationName(new QName("add"));
//传入参数的类型
call.addParameter( "op1", XMLType.XSD_FLOAT, ParameterMode.IN );
call.addParameter( "op2", XMLType.XSD_FLOAT, ParameterMode.IN );
//设置WS返回类型
call.setReturnType( XMLType.XSD_FLOAT );
//调用WS
Float ret = (Float) call.invoke( new Object [] { i1, i2 });
System.out.println("Got result : " + ret);
}
}
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
15
注:定制发布与即时发布的代码基本相同,除了URL链接。
编译CalcClient.java类时,要指定asix的Jar包。
javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CusCalcClient.java
执行
java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib CusCalcClient
调用Web Service结果如下:
RMI
除了上述两种方法外,还可以通过RMI方式调用WebService。
具体页言,在本地实现一个Remote接口,其中包含远程WS的方法(同名、同返回类型、同参数
类型),然后通过Service可以获得一个对远程WS对象的引用。用该引用可以直接像调用本地方
法一样调用远程方法。服务端不用做任何设置和调整。
1.服务端与Custom Deployment例子一样。
2.编写客户端RMI接口
3.编写客户端代码:ClientRMIWS.java
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
直接调用WebService与通过RMI调用WebService结果:
编译ClientRMIWS.java类时,要指定asix的Jar包。
javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientRMIWS.java
执行
java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientRMIWS
Cancel Deployment
取消发布Web Service。
1.编写undeploy.wsdd文件。
<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
<service name="CusCalculatorService" />
</undeployment>
2.执行发布命令。
切到cmd窗口,切到apache-tomcat-5.5.33\webapps\axis\WEB-INF目录
cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd
执行成功后,会在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录生成server-config.wsdd
文件。
注:取消发布时,要保持tomcat在startup状态。
Handle
Chain
前面的例子都是客户端向WebService传送简单的数据类型。本例实现客户端向Web Service传
递、获取自定义对象。
1.创建服务端JavaBean。
import java.io.Serializable;
public class Order implements Serializable {
private static final long serialVersionUID = 8590864216374509536L;
public int getOrderId() {
return OrderId;
}
public void setOrderId(int orderId) {
OrderId = orderId;
注:传递的自定义对象必须是可序列化的。
2.创建WS服务端Java类:
package webservice.axis.wsdd;
import java.util.HashMap;
import java.util.Map;
将上述编译好的Java class类复制到%tomcat%目录。
注:传送自定义对象后,在布署axis时,要将wsdl4j-1.5.1.jar一起布署到tomcat的lib目录.
3.编写WSDD文件
在apache-tomcat-5.5.33\webapps\axis\WEB-INF目录下。新建文件:deploy.wsdd,并加入以
下内容:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="OrderManager" provider="java:RPC">
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
20
<parameter name="className" value="webservice.axis.wsdd.OrderManager"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNSD:Order" xmlns:myNSD="urn:OrderManager"
languageSpecificType="java:webservice.axis.wsdd.Order"/>
<parameter name="scope" value="request"/>
</service>
</deployment>
然后执行发布命令。
切到cmd窗口,切到apache-tomcat-5.5.33\webapps\axis\WEB-INF目录
cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
注:发布时,要保持tomcat在startup状态。
访问:http://127.0.0.1:8080/axis/services/OrderManager?wsdl 可查看到axis自动生成的wsdl
4.创建客户端JavaBean,与服务端的JavaBean保持一致即可。
import java.io.Serializable;
4. 3.创建客户端调用Web Service:
import java.util.HashMap;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
hashMap= (HashMap)call.invoke(s);
System.out.println("WS HashMap size:"+hashMap.size());
for(Iterator it = hashMap.keySet().iterator();it.hasNext();){
Integer key = (Integer)it.next();
Order order = (Order)hashMap.get(key);
System.out.println("*******************************");
System.out.println("OrderID="+order.getOrderId());
System.out.println("OrderNum="+order.getOrderNum());
System.out.println("OrderDate="+order.getOrderDate());
System.out.println("OrderItem="+order.getOrderItem());
System.out.println("OrderQty="+order.getOrderQty());
}
}catch(ServiceException ex){
ex.printStackTrace();
}catch(MalformedURLException ex){
ex.printStackTrace();
}catch(RemoteException ex){
ex.printStackTrace();
}
return hashMap;
}
try{
Call call = (Call)service.createCall();
//传入urn:OrderManager、Order参数应与WSDD中beanMapping定义的
一致。
QName qn = new QName("urn:OrderManager","Order");
BeanSerializerFactory sfClass = new
BeanSerializerFactory(Order.class,qn);
BeanDeserializerFactory dfClass = new
BeanDeserializerFactory(Order.class,qn);
call.registerTypeMapping(Order.class, qn, sfClass, dfClass);
call.setTargetEndpointAddress(new java.net.URL(url));
//指明WS调用的类及方法
call.setOperationName(new QName("OrderManager","setOrderMap"));
call.addParameter( "map", XMLType.XSD_ANYTYPE,
ParameterMode.IN );
call.setReturnType(XMLType.XSD_STRING);
String sReturn = (String)call.invoke(new Object[]{order});
System.out.println("Transfer Object:"+sReturn);
}catch(ServiceException ex){
ex.printStackTrace();
}catch(MalformedURLException ex){
ex.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
编译ClientOrder.java类时,要指定asix的Jar包。
javac
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientOrder.java
执行
java
-Djava.ext.dirs=F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\W
EB-INF\lib ClientOrder
调用Web Service结果如下:
WSDL2Java
在很多实际WS项目开发过程中,往往对方只提供了WSDL文件,没有提供其他数据,甚至连WS
测试环境也没提供。这样就可以利用WSDL2Java分别生成服务端、客户端代码。
1.生成服务端代码。
cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p WSServer -s
PaymentService.wsdl
说明:-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生
成的Java类的包名。
2.发布到axis1.4服务器。
cd F:\ProgramFiles\WebServiceTools\apache-tomcat-5.5.33\webapps\axis\WEB-INF
java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p WSClient PaymentService.wsdl
1.通过使用第三方的Web Service组件来实现。如:Axis。
2.通过Oracle Database数据端实现。
尽管Oracle10开始,已经内置SYS.UTL_DBWS包,但相应的Jar包却没有默认安装好。
下载Jar包:http:
//download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callo
ut-utility-10131.zip
解压dbws-callout-utility-10131.zip包。
根据数据库的版本,将相应的Jra包上传到Oracle数据库服务器$ORACLE_HOME/sqlj/lib目录
1.由于SYS.UTL_DBWS包使用是JAVA,因此将JAVA_POOL设置大一些。
2.载入Oracle数据库
# cd $ORACLE_HOME/sqlj/lib
# loadjava -u sys/apps -r -v -f -s -grant public -genmissing dbwsclientws.jar
# loadjava -u sys/apps -r -v -f -s -grant public -genmissing dbwsclientdb102.jar
Permission
以sys用户登陆Oracle,给apps用户授权
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','http.proxySet','write')
;
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','http.proxyHost',
Author:JarWang (王重东) QQ:jarwang@sina.com Copyright(R):Jarwang
28
'write');
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','http.proxyPort',
'write');
execute dbms_java.grant_permission('APPS','SYS:java.lang.RuntimePermission',
'accessClassInPackage.sun.util.calendar','');
execute
dbms_java.grant_permission('APPS','SYS:java.lang.RuntimePermission','getClassLoader','');
execute
dbms_java.grant_permission('APPS','SYS:java.net.SocketPermission','*','connect,resolve');
execute
dbms_java.grant_permission('APPS','SYS:java.util.PropertyPermission','*','read,write');
execute
dbms_java.grant_permission('APPS','SYS:java.lang.RuntimePermission','setFactory','');
1.首先得创建一个Web Service外部服务,以供Oracle调用。本例使用前面AXIS
CusCalculatorService例子。WSDL见附件:CusCalculatorService.wsdl
2.创建Package,调用WebService.
RETURN ANYDATA.AccessNumber(l_result);
end;
end cux_invoke_ws;
3.执行结果:
本例实现通过OC4J将PL/SQL Package发布为WebService,以供第三方系统使用。
创建数据库Package:CUX_INVOICE_WS
点击完成。
Integration Repository
在R12中,EBS已经高度集成了Web Service。
Oracle EBS-报表开发工具之闲碎:
Oracle10g OCP学习笔记:http://www.itpub.net/thread-1229073-1-1.html
Oracle10g RAC安装:http://www.itpub.net/thread-1194959-1-1.html
Oracle10g 基于ASM存储的异机恢复:http://www.itpub.net/thread-1208926-1-1.html
PL/SQL操作EXCEL:http://www.itpub.net/thread-1101710-1-1.html
MySQL5开发笔记:http://www.itpub.net/thread-1158177-1-1.html
Redhat系统管理员笔记:http://www.itpub.net/thread-1353773-1-1.html
RHEL5.2内核升级:http://www.itpub.net/thread-1145199-1-1.html