国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用JWSDP完成Web Service

  Web Service在java領(lǐng)域,AXIS因其容易使用,很多項目都使用了它,對于Sun提供的Web Service技術(shù),則不多使用,現(xiàn)更新有關(guān)版本,重新使用了一下Sun提供的JWSDP,并寫了這篇入門.供需要者參考.

  Sun公司的Web Service

  Web服務(wù)是基于web的使用開放的基于xml標(biāo)準(zhǔn)的企業(yè)應(yīng)用,是和調(diào)用客戶端交換數(shù)據(jù)的傳輸協(xié)議,Java技術(shù)和WEB服務(wù)被組織成這些亞類:

  Java Web Services Developer Pack (Java WSDP) 
  Java API for XML-Based RPC (JAX-RPC) 
  Java API for XML Registries (JAXR) 
  Java API for XML Processing (JAXP) 
  Java Architecture for XML Binding (JAXB) 
  SOAP with Attachments API for Java (SAAJ) 
  XML and Web Services Security
 

  JAX-RPC代表基于xml遠(yuǎn)程過程調(diào)用的java API,是一項為構(gòu)建使用RPC和XML的Web服務(wù)和客戶端的技術(shù),通常用于分布式的CS模式中,它是一種RPC機制能使客戶端執(zhí)行其他系統(tǒng)上的過程.

  在JAX-RPC中,一個RPC由基于XML協(xié)議如SOAP表示,這個SOAP規(guī)范定義了一個信封結(jié)構(gòu),編碼規(guī)則以及為代表遠(yuǎn)程調(diào)用和響應(yīng)的協(xié)定.這些調(diào)用和響應(yīng)作為SOAP消息在HTTP上傳輸.

  盡管SOAP消息復(fù)雜,但JAX-RPC API向應(yīng)用開發(fā)者隱藏了這些復(fù)雜性.在服務(wù)器端,開發(fā)者指定那個調(diào)用過程是通過用java語言寫的接口定義的方法, 開發(fā)者還要編碼一個或多個實現(xiàn)這些方法的類.客戶端程序也容易編碼:一個客戶端創(chuàng)建一個代理(一個代表服務(wù)的本地對象),然后簡單的在那個代理上調(diào)用那個方法.使用JAX-RPC,開發(fā)者不用生成或分析SOAP消息,這是JAX-RPC運行時系統(tǒng)做的事情:它在來往的API調(diào)用和響應(yīng)到SOAP消息之間進(jìn)行轉(zhuǎn)換.

  使用JAX-RPC,客戶端和web services有一個巨大的好處:java編程語言的平臺獨立性.此外,JAX-RPC沒有限制: 一個JAX-RPC客戶端能訪問一個并不在java平臺上運行的web服務(wù),反之亦然.這個靈活性是可能的以為JAX-RPC使用由W3C定義的技術(shù):HTTP, SOAP,WSDL. WSDL為把一個服務(wù)在消息上描述為一套端點操作指定了一個XML格式.
 

 

  二 SUN提供的WEB服務(wù)構(gòu)建工具

  J2EE提供了APIs和創(chuàng)建,發(fā)布可互操作WS和客戶端的工具,其中JAX-RPC(SI)標(biāo)準(zhǔn)實現(xiàn)提供了wscompile 和 wsdeploy 工具,使你開發(fā),發(fā)布,調(diào)用Web Service:

  1  wscompile可接受兩種輸入:WSDL和Service Endpoint Interface,輸出為可移植制品和model文件.

  2  wsdeploy只有一種輸入:包括wscompile輸入和輸出再加上一個部署描述符文件,輸出是可發(fā)布的特定平臺上的web service.

  這些工具同Java WSDP一起打包可供使用,java web服務(wù)開發(fā)包是一個免費的集成工具箱,用它構(gòu)建,測試,發(fā)布XML應(yīng)用,web服務(wù)以及帶有最新web服務(wù)技術(shù)和標(biāo)準(zhǔn)實現(xiàn)的web應(yīng)用.

  (一) wscompile工具

  1 工具介紹

  它生成由JAX-RPC運行時需要的各種客戶端和服務(wù)端制品以供開發(fā),部署,調(diào)用一個Web服務(wù). 這個工具有兩種使用形式:批處理和Ant構(gòu)建腳本.

  wscompile -gen -classpath lib/foo.jar;lib/bar.jar -d generated config.xml
  wscompile -gen  -f:infix:Name -d generated config.xml
  wscompile -define -f:nodatabinding -f:novalidation config.xml
  wscompile -import -f:explicitcontext config.xml

  Ant腳本,在Ant中使用這個任務(wù)前要先定義:

<taskdef name="wscompile" classname="com.sun.xml.rpc.tools.ant.Wscompile">
    <classpath path="${classpath}"/>
</taskdef>

  其中的類路徑要指向以下檔案庫:

jaxrpc-api.jar
jaxrpc-impl.jar
jaxrpc-spi.jar
saaj-api.jar
saaj-impl.jar
jaxp-api.jar
dom.jar
sax.jar
xalan.jar
xercesImpl.jar
activation.jar
mail.jar
jax-qname.jar
namespace.jar
xsdlib.jar
relaxngDatatype.jar

  例子:

 (二) wsdeploy工具

  1 工具介紹

  這個工具和wscompile協(xié)同工作來生成一個能在任何servlet容器中發(fā)布的war文件,它授受一個生WAR文件,它包括一個SEI,一個SEI實現(xiàn),一些值類型,一些服務(wù)特定的異常,一個model文件,一個部署描述符(jaxrpc-ri.xml), 和一些可選的其它實現(xiàn)特定的制品.工具處理生的war文件并生成一個實現(xiàn)特定的熟的war文件.這個過程包括生成串行化器,連接(TIEs),運行時描述符以及其它為了成功的發(fā)布WS需要的制品. 這個工具也有兩種使用形式:批處理和Ant構(gòu)建腳本.

  批的例子:

wsdeploy -o target.war myapp.war
Ant腳本,在Ant中使用這個任務(wù)前要先定義:
<taskdef name="wsdeploy" classname="com.sun.xml.rpc.tools.ant.Wsdeploy">
    <classpath path="${classpath}"/>
</taskdef>
其中的類路徑指向同wscompile相同:
<wsdeploy  classpath="xyz.jar"  tmpdir="${tmp}"  outWarFile="stock.war"  inWarFile="stock-raw.war"/>
<wsdeploy  keep="true" outWarFile="stock.war" inWarFile="stock-raw.war"><classpath refid="compile.classpath"/></wsdeploy>
<wsdeploy fork="true" source="1.0.3" outWarFile="stock.war"  inWarFile="stock-raw.war"></wsdeploy>

  2 wscompile的配置文件(部署描述符 jaxrpc-ri.xml)

  它被打包在生的WAR文件中,并由wsdeploy工具使用來生成熟的WAR文件.這個描述符提供了wsdeploy工具向web容器中發(fā)布WS的信息.

  該文件主要是使用endpoint和endpointMapping兩個元素來定義端點和服務(wù)影射,把SEI及其實現(xiàn)聚集在一起,連同model文件提供給發(fā)布工具.

  三 編寫一個Hello例子

  IDE環(huán)境:Eclipse,插件sysdeo,發(fā)布環(huán)境:Tomcat559.

  使用類庫:Sun公司的參考實現(xiàn).

本例要使用的材料:

  1  HelloIF.java,一個SEI接口,它擴展了Remote接口.

  2  HelloImpl.java,實現(xiàn)了SEI接口.

  3  web.xml ,這個文件可以是你的任何Web應(yīng)用的部署描述符文件,這個例子可以發(fā)布到你的現(xiàn)有Web應(yīng)用,只需要把那個應(yīng)用的部署描述符文件放在開發(fā)環(huán)境的WEB-INF文件夾下.

  4  config-interface.xml,描述SEI接口.

  5  config-wsdl.xml,使用WSDL描述服務(wù)接口,本例不介紹這個文件的使用方法,通常這個使用場景多是為訪問服務(wù)生成客戶端stub文件.另一個場景就是加入自定義的java類型到SOAP類型的影射等等很多細(xì)微的控制,或者是完全替代SEI接口.

  以上文件的位置,可參看下圖:

  1 編寫SEI,HelloIF:

package helloservice;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloIF extends Remote {
    public String sayHello(String s) throws RemoteException;
}

  2 實現(xiàn)SEI:

package helloservice;
public class HelloImpl implements HelloIF {
    public String message ="Hello";
    public String sayHello(String s) {
        return message + s;
    }
}

  3 配置文件 config-interface.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
 <service name="MyHelloService" targetNamespace="urn:Foo"
  typeNamespace="urn:Foo" packageName="helloservice">
  <interface name="helloservice.HelloIF"
   servantName="helloservice.HelloImpl" />
 </service>
</configuration>

4 構(gòu)建服務(wù),下面是一個Ant構(gòu)建腳本.

<?xml version="1.0" encoding="GBK"?>
<project name="webservice" default="build" basedir=".">
 <property name="jaxrpc.lib.dir" value="D:\Sun\AppServer\lib">
 </property>
 <property name="classes.dir" value=".\build\classes">
 </property>
 <property name="src.dir" value=".\build\src">
 </property>
 <property name="war.file" value="hello_raw.war">
 </property>
 <property name="nonclass.dir" value=".\build\nonclass">
 </property>
 <property name="build" value="${nonclass.dir}">
 </property>
 <property name="assemble" value=".\assemble">
 </property>
 <property name="assemble.war" value=".\assemble\war">
 </property>
 <property name="assemble.ear" value=".\assemble\ear">
 </property>
 <path id="jaxrpc-classpath">
  <fileset dir="${jaxrpc.lib.dir}">
   <include name="**/*.jar" />
  </fileset>
  <fileset dir="D:\jdbc\postgresql">
   <include name="*.jar" />
  </fileset>
 </path>
 <path id="compile.classpath">
  <fileset dir="${jaxrpc.lib.dir}">
   <include name="**/*.jar" />
  </fileset>
  <fileset dir="D:\jwsdp-1.5\jaxrpc\lib">
   <include name="**/*.jar" />
  </fileset>
 </path>
 <taskdef name="wscompile" classpathref="jaxrpc-classpath" classname="com.sun.xml.rpc.tools.ant.Wscompile">
 </taskdef>
 <taskdef name="wsdeploy" classpathref="jaxrpc-classpath" classname="com.sun.xml.rpc.tools.ant.Wsdeploy">
 </taskdef>
 <target name="prepare">
  <mkdir dir="${src.dir}" />
  <mkdir dir="${nonclass.dir}" />
  <mkdir dir="${classes.dir}" />
  <mkdir dir="${assemble}" />
  <mkdir dir="${assemble.war}" />
  <mkdir dir="${assemble.ear}" />
 </target>
 <target name="build" depends="prepare" description="生成java制品,如生成可供wsdeploy使用的web檔案,稱為生war,就象作菜一樣,先順菜,以及model,wsdl文件,這里生成的WSDL文件,wsdeploy并不使用">
  <echo message="build the WAR...." />
  <wscompile import="false" define="true" gen="false" keep="true" base="${classes.dir}" sourceBase="${src.dir}" classpath=".\classes" nonClassDir="${nonclass.dir}" model="model.xml.gz" xPrintStackTrace="true" config="config-interface.xml" verbose="true">
   <classpath refid="compile.classpath" />
  </wscompile>
 </target>
 <target name="deploy" description="生成可供發(fā)布的web檔案,稱為煮熟的war,這個階段也生成了WSDL文件并被直接打包了">
  <echo message="deploy the WAR...." />
  <wsdeploy keep="false" verbose="true" tmpDir=".\tmp" outWarFile="skysoft.war" inWarFile="hello_raw.war">
   <classpath refid="compile.classpath" />
  </wsdeploy>
 </target>
 <target name="create-war" description="打包由wscompile生成的制品,以及所有發(fā)布所用的材料">
  <echo message="Creating the WAR...." />
  <delete file="${assemble.war}/${war.file}" />
  <delete dir="${assemble.war}/WEB-INF" />
  <copy todir="${assemble.war}/WEB-INF/classes/">
   <!--fileset dir="${build}/" includes="**/*.class" excludes="**/*Client.class, **/*.wsdl, **/*mapping.xml" /-->
   <fileset dir="./classes" includes="**/*.class" excludes="**/*Client.class, **/*.wsdl, **/*mapping.xml" />
  </copy>
  <copy todir="${assemble.war}/WEB-INF/lib/">
   <fileset dir="./lib" includes="**/*.jar" excludes="**/*Client.class, **/*.wsdl, **/*mapping.xml" />
  </copy>
  <copy file="jaxrpc-ri.xml" todir="${assemble.war}/WEB-INF" />
  <copy file="model.xml.gz" todir="${assemble.war}/WEB-INF" />
  <war destfile="${assemble.war}/${war.file}" webxml="./web.xml" filesonly="true">
   <fileset dir="${assemble.war}" includes="WEB-INF/**, build/**" />
  </war>
  <copy file="${assemble.war}/${war.file}" todir="." />
 </target>
 <target name="genstaticstub" description="生成靜態(tài)樁,供靜態(tài)的調(diào)用服務(wù)">
  <echo message="gen statics tub" />
  <wscompile client="true" keep="true" base="." sourceBase="." xPrintStackTrace="true" config="config-wsdl.xml" verbose="true">
   <classpath refid="compile.classpath" />
  </wscompile>
 </target>
 <target name="generate-dynamic-interface" description="根據(jù)WSDL文件生成SEI及其它材料,供動態(tài)調(diào)用">
  <echo message="generate dynamic interface" />
  <wscompile import="true" keep="true" features="norpcstructures" base="./dynmicstub" sourceBase="./dynmicstub" xPrintStackTrace="true" config="config-wsdl.xml" verbose="true">
   <classpath refid="compile.classpath" />
  </wscompile>
 </target>
</project>

  其中的各個任務(wù)都有說明.

  注意,如果你使用JAX-RPC1.1.2的話,wsdeploy生成web.xml文件有些小錯誤,需要手工更改,這個問題在1.1.3中已經(jīng)修正.

  好了,在Eclipse中運行各個任務(wù),把最后得到的skysoft.war,作為一個新的應(yīng)用發(fā)布,也可發(fā)布到你現(xiàn)有的應(yīng)用,需要解壓這個文件,然后拷貝需要的文件以及庫文件到你的應(yīng)用中即可.

  (四) 調(diào)用服務(wù)

  調(diào)用服務(wù)的方式有三種:靜態(tài)調(diào)用,動態(tài)調(diào)用,動態(tài)調(diào)用接口.

  1 靜態(tài)調(diào)用,使用了wscompile生成的靜態(tài)樁文件.

package hello;
import javax.xml.rpc.Stub;
import staticstub.*;
public class HelloClient {
 private String endpointAddress;
 public static void main(String[] args) {
  args=new String[]{"http://localhost:8080/skysoft/hello?WSDL"};
  System.out.println("Endpoint address = " + args[0]);
  try {
   Stub stub = createProxy();
   stub._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY,
     args[0]);
   HelloIF hello = (HelloIF) stub;
   System.out.println(hello.sayHello("Duke!"));
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
 private static Stub createProxy() {
  // Note: MyHelloService_Impl is implementation-specific.
  return (Stub) (new MyHelloService_Impl().getHelloIFPort());
 }
}

  2 動態(tài)調(diào)用,主要是使用ServiceFactory來執(zhí)行調(diào)用.

package hello;
import java.net.URL;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
//import dynamicproxy.HelloIF;
import staticstub.HelloIF;
public class DynClient {
 public static void main(String[] args) {
  try {
   args = new String[] { "http://localhost:8080/skysoft/hello" };
   String UrlString = args[0] + "?WSDL";
   String nameSpaceUri = "urn:Foo";
   String serviceName = "MyHelloService";
   String portName = "HelloIFPort";
   System.out.println("UrlString = " + UrlString);
   URL helloWsdlUrl = new URL(UrlString);
   ServiceFactory serviceFactory = ServiceFactory.newInstance();
   Service helloService = serviceFactory.createService(helloWsdlUrl,
     new QName(nameSpaceUri, serviceName));
   HelloIF myProxy = (HelloIF) helloService.getPort(new QName(
     nameSpaceUri, portName), HelloIF.class);
   System.out.println(myProxy.sayHello("Buzz"));
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
}

 3 動態(tài)調(diào)用接口(DII),這種方式不需要任何附加代碼,根據(jù)WSDL提供的調(diào)用方法的元描述,動態(tài)確定方法及其參數(shù)返回類型,有些類似于CORBA的接口池提供的服務(wù).

package hello;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.ParameterMode;
public class DiiClient {
 private static String qnameService = "MyHelloService";
 private static String qnamePort = "HelloIF";
 private static String BODY_NAMESPACE_VALUE = "urn:Foo";
 private static String ENCODING_STYLE_PROPERTY = "javax.xml.rpc.encodingstyle.namespace.uri";
 private static String NS_XSD = "http://www.w3.org/2001/XMLSchema";
 private static String URI_ENCODING = "http://schemas.xmlsoap.org/soap/encoding/";
 public static void main(String[] args) {
  args=new String[]{"http://localhost:8080/skysoft/hello?WSDL"};
  System.out.println("Endpoint address dii = " + args[0]);
  try {
   ServiceFactory factory = ServiceFactory.newInstance();
   Service service = factory.createService(new QName(qnameService));
   QName port = new QName(qnamePort);
   Call call = service.createCall(port);
   call.setTargetEndpointAddress(args[0]);
   call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
   call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
   call.setProperty(ENCODING_STYLE_PROPERTY, URI_ENCODING);
   QName QNAME_TYPE_STRING = new QName(NS_XSD, "string");
   call.setReturnType(QNAME_TYPE_STRING);
   call.setOperationName(new QName(BODY_NAMESPACE_VALUE, "sayHello"));
   call.addParameter("String_1", QNAME_TYPE_STRING, ParameterMode.IN);
   String[] params = { "Murph!" };
   String result = (String) call.invoke(params);
   System.out.println(result);
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
}

  到此,這個Web Service入門描述就結(jié)束了,它提供了WS的Sun描述,以及在tomcat上發(fā)布服務(wù)的過程和一個構(gòu)建腳本,借助jsp插件,使用Eclipse完成了一個簡單的Web服務(wù)開發(fā),發(fā)布,并用三種方式進(jìn)行了測試.

 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
舊情復(fù)燃webservice
編寫一個Web service客戶端
[收藏]REST WebService與SOAP WebService的比較
WebService學(xué)習(xí),開發(fā)總結(jié)--唐木之無線觀察
JAVA6開發(fā)WebService (一)
Java開發(fā)中經(jīng)常使用到的幾種WebService技術(shù)實現(xiàn)方案
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服