WebService入门篇

首先新建一个webservice服务器端的程序。注意的是要使用jdk6及其以上版本。

 

将一个项目如下:

WebService入门篇        

内部代码如下:

package cn.itcast.server;

 

import javax.jws.WebService;

import javax.xml.ws.Endpoint;

 

@WebService

public class Hello {

      /**

       * Endpoint Web服务端点

       * 使用在此类定义的静态方法创建端点。一个端点总是绑定到一个Binding

       * 和一个实现者,这两项都是在创建端点时设置的。

       *

       * 端点要么处于已发布状态,要么处于未发布状态。可以使用publish方法

       * 开始发布端点,此时端点开始接受传入请求。相反,可以使用stop方法停

       * 止接受传入请求并取消端点。一旦停止,就不能再次发布端点。

       *

       * 可以在端点上设置Executor以便更好地控制用来指派传入请求的线程。例如

       * ,通过创建ThreadPoolExecutor并向端点注册可以启动带有特定参数的线程池。

       *

       * 处理程序链可以使用所含的Binding来设置。

       *

       * 端点可以使一个数据文档(如WSDL和XMLSchema文档)列表与之绑定。发布时,

       * JAX-WS实现将根据实现者上存在的注释,尽可能多地重用这些元数据,

       * 而不是生成新的数据

       *

       * address:一个URI,指定要使用的地址和传输协议

       * implementor:端点实现者,表示是哪个类实现的服务。

       */

      publicString sayHi(String name){

               System.out.println("姓名  name = " + name);

               return"欢迎访问我:hi!" + name;

      }

     

      publicstatic void main(String[] args) {

//这里的地址可以是随便写的,表示的意思是访问这个webservice的地址是多少。//当然也可以把这个地址改成一个确定的ip地址。

//注意后面的链接地址是在程序中定义的address,要注意的是端口号不能和本机程序中的端口号重名。

               Endpoint.publish("http://localhost:8888/one",new Hello());

      }

}

 

@WebService:说明把这个类发布出去的时候是以网络的方式发不出去的。

这个方法一定是public 的,并且还要是非静态的。

 

接着可以在浏览器地址上输入:http://localhost:8888/one,这时候就可以看到可以被访问到了,

WebService入门篇

当访问:http://localhost:8888/one?wsdl时可以看到webservice使用说明书。

WebService入门篇

常见错误:

错误1:

2013-6-12 11:01:53com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass

信息: Dynamically creating request wrapper Classcn.itcast.server.jaxws.SayHi

2013-6-12 11:01:53com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass

信息: Dynamically creating response wrapper bean Classcn.itcast.server.jaxws.SayHiResponse

Exception in thread"main" com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error:java.net.BindException: Address already in use: bind

      atcom.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(UnknownSource)

      at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(UnknownSource)

      atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(UnknownSource)

      atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(UnknownSource)

      at javax.xml.ws.Endpoint.publish(UnknownSource)

      at cn.itcast.server.Hello.main(Hello.java:35)

Caused by: java.net.BindException: Address already in use: bind

      at sun.nio.ch.Net.bind(Native Method)

      atsun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)

      at sun.nio.ch.ServerSocketAdaptor.bind(UnknownSource)

      atsun.net.httpserver.ServerImpl.<init>(Unknown Source)

      atsun.net.httpserver.HttpServerImpl.<init>(Unknown Source)

      atsun.net.httpserver.DefaultHttpServerProvider.createHttpServer(Unknown Source)

      at com.sun.net.httpserver.HttpServer.create(UnknownSource)

      ... 6 more

出现这种错误的原因是因为已经有一个在运行了,也就是说重新运行程序了。

       错误2

2013-6-12 11:01:53com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass

信息: Dynamically creating request wrapper Classcn.itcast.server.jaxws.SayHi

2013-6-12 11:01:53 com.sun.xml.internal.ws.model.RuntimeModelergetResponseWrapperClass

信息: Dynamically creating response wrapper beanClass cn.itcast.server.jaxws.SayHiResponse

Exception in thread "main" com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error:java.net.BindException: Address already in use: bind

      atcom.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(UnknownSource)

      atcom.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(UnknownSource)

      atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(UnknownSource)

      atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(UnknownSource)

      atjavax.xml.ws.Endpoint.publish(Unknown Source)

      atcn.itcast.server.Hello.main(Hello.java:35)

Caused by: java.net.BindException: Address already in use: bind

      atsun.nio.ch.Net.bind(NativeMethod)

      atsun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)

      atsun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)

      atsun.net.httpserver.ServerImpl.<init>(Unknown Source)

      atsun.net.httpserver.HttpServerImpl.<init>(Unknown Source)

      atsun.net.httpserver.DefaultHttpServerProvider.createHttpServer(Unknown Source)

      atcom.sun.net.httpserver.HttpServer.create(Unknown Source)

      ...6 more

关于jdk中的bin中,native2ascii.exe,这是一个转换ascii的工具。

(1)查看java的jdk是否是jdk6,可以在cmd命令中使用java –version.

(2)通过命令的方式进入jdkbin目录,命令如下:C:\Users\Administrator>setpath=C:\Program Files (x86)\java\jdk1.6.0_25\bin;

(3)进入之后点击:keytool,可以拥有加密。

 (4)如果使用webservice需要使用的是:wsimport.exe

 -d:在哪里生成输出文件

-p:指定目标包,通过-p可以生成一个自定义包结构

-s:指定在哪里生成源文件。

 

以下是将wsdl文件放置到指定目录下的方式,下面的命令表示的意思是将文件放在D:\ws目录中。

C:\Users\Administrator>D:

D:\>cdws

//下面使用jdk中的wsimport.exe工具将文件放在当前文件目录(当前目录通过”.”来表示)。

D:\ws>wsimport-d . http://localhost:8888/one?wsdl

 WebService入门篇

通过这种方式就可以生成class文件。D盘中的ws目录里的内容如下:

 WebService入门篇

获得java文件的方式:

在命令行中输入:D:\ws>wsimport-s . http://localhost:8888/one?wsdl

接着ws目录就可以看到如下:

 WebService入门篇

    通过这种方式就可以得到客户端的代码。

    创建客户端代码,然后将代码拷贝到src中,然后并移动到指定包下。

   

当想看webservice使用说明书的时候,最先看里面的<service name=“HelloService”>,表示的意思是使用HelloService来调用,如果看到上面使用的代码,是可以看到有一个HelloService.java类的。

<servicename="HelloService">

<portname="HelloPort"binding="tns:HelloPortBinding">

<soap:address location="http://localhost:8888/one"/>

</port>

</service>

如上表示的soap:address location=“http://localhost:8888/one”,表示的是注册地址。

 

提供webservice接口的网站:http://www.36wu.com/Service.aspx

下面的一个网站提供了很多接口服务

http://www.webxml.com.cn/zh_cn/information.aspx

 

下面是关于webservice方面的其它一些知识点

WebService

day01

1.概述

JDK1.6_1.3以上的版本才能使用

通过IE访问时,http请求行中:Connection:keep-Alive

webService的规范就是http规范+soap规范

WebService的框架:

    云计算、云查杀、SOA(面向服务的框架)

webService只采用http post方式传输数据,不使用get方式

    (http的contentType:applicaiton-x-www-urlencoded)

    根据contentType判断soap版本:

    Text/xml:charset=UTF-8   ==>soap1.1

    application/soap+xml ==>soap1.2

 

   

注意:wsimport.exe只能编译soap1.1的版本,不能编译soap1.2

2.helloworld

    1.一个类上添加注解@WebService

    @WebService的成员变量可以查看API。

    2.类中使用Endpoint,并调用Endpoint的publish()方法将此类发布

!!! 注意:要发布的这个类,至少包含一个public 且非static类型的方法.

    publish()中的参数可以指定发布的路径==>如:http://192.168.1.100:8888/one

    发布后会生成一个使用说明书(.xml文件)

    3.wsimport生成客户端代码

    4.通过客户端代码调用sayHi()

??? ...

    Hello  hello = new HelloService().getHelloPort();==>

    hello.sayHi("张无忌");

 

3.webService的使用说明书:

对象被发布后会生成一个使用说明书(.xml文件)

    http://192.168.1.249:8888/one?wsdl

    wsdl==>web servicedescript language

    1.<servicename="HelloService">

       <portname="HelloPort" binding="tns:HelloPortBean">

           <soap:addresslocation="http://192.168.1.100:8888/one" >

       </port>

    </service>

    2.<bindingname="" type="tns:Hello"/>

    3.<portTypename="">

      

    </portType>

 

weblogic和oracle装完之后默认会修改我们的环境变量(如jdk等).

所以JDK等的版本也会被更改,我们可以通过环境变量手工改过来.

4.jdk/bin/keytool.exe工具      

5.jdk/bin/keytool.exe/wsimport.exe工具

    使用方法: wsimport [options]<WSDL_URI>

    option:

       -p <pkg>       specifies the target package

       -d<directory>            specifywhere to place generated output files

       -s<directory>            specifywhere to place generated source files

    wsimport -d .http://...==>生成路径中对应的类的.class文件

    wsimport -s .http://...==>生成路径中对应的类的.java文件

 

!!! 注意:wsimport.exe只能编译soap1.1的版本,不能编译soap1.2

 

soap协议==>基于xml编码的文本协议

6.

webService只采用http post方式传输数据,不使用get方式

    (http的contentType:applicaiton-x-www-urlencoded)

    根据contentType判断soap版本:

    Text/xml:charset=UTF-8   ==>soap1.1

    application/soap+xml ==>soap1.2

webService传递参数

    (http中传递参数 ...get/?name=zhangsan&age=88)

    <? xmlversion=1.0?>

    <name>zhangsan</name>

    <age>88</age>

 

7.???外部程序访问我们的程序,访问的实际是Service层???11:42

 

 

8.

    1.找到查询手机归属地的说明书

       说明书中的<soap12..>或<soap>可以查看soap的版本

       wsimport只能编译1.1

    2.将说明书保存为phone.wsdl

    3.使用wsimport生成.java源文件

    (wsimport -s .http://192.168....)

    wsimport -s .F:\phone.wsdl

    4.新建一个工程,将生成.java文件复制到工程中

    5.工程中新建Main.java,里面新建main方法,方法中

   

    <wsdl:servicename="MobileCodeWS"..="">   ==>查看类名

    调用:

    MobileCodeWSSoapmobileCodeWSSoap = new MobileCodeWS().getMobileCodeWSSoap();

   

    <wsdl:operationname="getMobileCodeInfo"...>  ===>查看方法名

    调用:

    mobileCodeWSSoap.getMobileCodeInfo("15801551555",userId);

   

 

 

 

======================

API

javax.xml.ws.Endpoint类==>Web 服务端点。

    abstract  void publish(Object serverContext)

         在提供的服务器上下文中发布此端点。

    abstract  void publish(String address)

         在给定地址处发布此端点。

    static Endpointpublish(String address, Object implementor)

         在给定地址处针对指定的实现者对象创建并发布端点。

javax.jws.@WebService注解==>将 Java 类标记为实现Web Service,或者将 Java 接口标记为定义Web Service 接口。

    StringendpointInterface

         定义服务抽象 Web Service 协定的服务端点接口的完整名称。

    String name

         Web Service 的名称。

    String portName

         Web Service 的端口名称。

    String serviceName

         Web Service 的服务名称。

    String targetNamespace

         如果 @WebService.targetNamespace 注释是关于某一服务端点接口的,则 targetNamespace 用于 wsdl:portType(以及关联的 XML 元素)的名称空间。

    String wsdlLocation

         描述服务的预定义 WSDL 的位置

 

面试的时候会遇到的问题:

1、webservice就是在各个独立的应用程序之间架起了通讯的桥梁。

 

2、webservice的内部实现原理

WebService实质就是通过HTTP协议发格式的XML格式。我们将这种格式的XML数据叫做SOPA.

 

webservice的框架有:

CXF,axis,axis2,xfire

 

 

 

 

 

 

上一篇:w3c系列之CSS(三):CSS属性是如何被应用到元素上的


下一篇:SSH的编码 和 ajax乱码问题