分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

WebService使用介绍

发布时间:2023-09-06 01:21责任编辑:蔡小小关键词:Web

webservice是什么?

webservice即web服务,是一种跨平台远程调用技术,基于http的soap协议进行传输数据。

Webservice工作原理:(对比了Socket开发的原理)

wsdl是什么?

wsdl即网络服务描述语言,是webservice使用说明书,描述了service(服务视图)、binding、porttype、message、type(消息传输的数据类型。)

wsdl 说明书结构

<service>     整个webservice的服务视图,它包括了所有的服务端点

<binding>     为每个端口定义消息格式和协议细节

<portType>  描述 web service可被执行的操作,以及相关的消息,通过binding指向portType

<message>   定义一个操作(方法)的数据参数(可有多个参数)

<types>        定义 web service 使用的全部数据类型

wsdl 说明书阅读方式

 

从下往上读

先找到服务视图,通过binging找到protType,找到了protType就找到了我们要调用的webservice方法。

Wsimport介绍

wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。

wsimport.exe位于JAVA_HOME\bin目录下.

常用参数为:

-d<目录>  - 将生成.class文件。默认参数。

-s<目录> - 将生成.java文件。

-p<生成的新包名> -将生成的类,放于指定的包下。

(wsdlurl) - http://server:port/service?wsdl,必须的参数。

示例:

C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl

注意:-s不能分开,-s后面有个小点

使用方法:

如果wsdl文件在本地,可以这样使用:Wsimport –s . file:///d:\WeatherWebService.wsdl

注意:这里可能会遇到类似这样的错误:

我们可以把wsdl文件下载到本地,删除掉文件中所有的<s:element ref="s:schema"/>即可解决

客户端的编写方法:

第一种客户端编写方法; 全部使用的是wsimport生成的代码调用webservice。 问题:将webservice的地址固定写死在代码中了(硬编码),不利于系统维护。如果将要修改服务地址,客户端代码只能重新使用wsimport生成。不推荐使用

第二种客户端编写方法: 手动可以指定webservice 地址,使用service类来完成。  此处点!!!!!

public class WeatherClient2 { ???public static void main(String[] args) throws MalformedURLException { ???????//定义url,参数为wsdl地址 ???????URL url = new URL("http://192.168.1.100:1234/weather?wsdl"); ???????//定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名 ???????QName qName = new QName("http://impl.sei.jaxws.ws.itcast.cn/", "WeatherInterfaceImplService"); ???????//创建服务视图 ???????Service service = Service.create(url, qName); ???????//通过服务视图得到服务端点 ???????WeatherInterfaceImpl weatherInterfaceImpl =service.getPort(WeatherInterfaceImpl.class); ???????//调用webservice ???????System.out.println(weatherInterfaceImpl.queryWeather("郑州")); ???}}

soap:

soap即简单对象访问协议,基于http传输xml数据。

JAX-WS注解

WebService的注解都位于javax.jws包下:

@WebService-定义服务,在public class上边

targetNamespace:指定命名空间

name:portType的名称

portName:port的名称

serviceName:服务名称

@WebMethod-定义方法,在公开方法上边

operationName:方法名

exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法

@WebResult-定义返回值,在方法返回值前边

name:返回结果值的名称

@WebParam-定义参数,在方法参数前边

name:指定参数的名称

作用:

通过注解,可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改,为使用者提供一个更加清晰的wsdl文档。

当修改了WebService注解之后,会影响客户端生成的代码。调用的方法名和参数名也发生了变化

服务端代码演示:

@WebService(targetNamespace="http:// webservice.itcast.cn",serviceName="weatherService",portName="weatherServicePort",name="weatherServiceInterface")public class WeatherInterfaceImpl implements WeatherInterface { ???@Override ???public @WebResult(name="weatherResult")List<WeatherModel> queryWeather(@WebParam(name="cityName")String cityName) throws Exception { ???????????????//构造三天的天气结果 ???????Calendar calendar = Calendar.getInstance(); ???????int day = calendar.get(Calendar.DATE); ???????//第一天的天气 ???????WeatherModel weatherModel_1 = new WeatherModel(); ???????weatherModel_1.setDate(new Date()); ???????weatherModel_1.setDetail("晴朗"); ???????weatherModel_1.setTemperature_max(30); ???????weatherModel_1.setTemperature_min(23); ???????//第二天的天气 ???????WeatherModel weatherModel_2 = new WeatherModel(); ???????calendar.set(Calendar.DATE, day+1); ???????weatherModel_2.setDate(calendar.getTime()); ???????weatherModel_2.setDetail("晴转多云"); ???????weatherModel_2.setTemperature_max(28); ???????weatherModel_2.setTemperature_min(21); ???????//第三天的天气 ???????WeatherModel weatherModel_3 = new WeatherModel(); ???????calendar.set(Calendar.DATE, day+2); ???????weatherModel_3.setDate(calendar.getTime()); ???????weatherModel_3.setDetail("多云转小雨"); ???????weatherModel_3.setTemperature_max(25); ???????weatherModel_3.setTemperature_min(18); ???????????????List<WeatherModel> list = new ArrayList<WeatherModel>(); ???????list.add(weatherModel_1); ???????list.add(weatherModel_2); ???????list.add(weatherModel_3); ???????//返回三天的天气 ???????????return list; ???}}

使用jaxws将webservice在tomcat中发布:

第一步:下载jaxws-ri-2.2.8的扩展包

第二步:创建web工程

第三步:将jaxws-ri-2.2.8的jar包加入工程

第四步:编写服务端代码,编写方法如上服务端代码演示

如果需要生成soap1.2在@WebServer下添加:

@BindingType(value="http://www.w3.org/2003/05/soap/bindings/HTTP/")

第五步:使用wsgen生成wsdl 

使用wsimport工具生成代码是客户端调用 wsgen工具生成的代码是服务端使用

使用wsgen生成wsdl,需要提前生成wsdl,根据service接口实现类来生成wsdl.

进入工程根目录:执行如下:

wsgen -wsdl:soap1.1 -cp WebRoot\WEB-INF\classes cn.itcast.ws.jaxws.service.WeatherServiceImplSoap -r WebRoot\WEB-INF\wsdl

如果生成soap12,命令:

wsgen -wsdl:Xsoap1.2 -extension -cp WebRoot\WEB-INF\classes cn.itcast.ws.jaxws.service.WeatherServiceImplSoap12 -r WebRoot\WEB-INF\wsdl

wsdl:soap1.1 :生成soap1.1的使用说明书

-cp:指定classpath

cn.itcast.weather.server.ServerJws :service接口实现类

-r:将生成wsdl输出到哪个位置

第六步:配置sun-jaxws.xml

文件中配置你的service发布的选项:

<endpoint name=‘ServerJws‘ implementation=‘cn.itcast.weather.server.ServerJws‘ ???????wsdl=‘WEB-INF/wsdl/WeatherServerService.wsdl‘ ???????url-pattern=‘/ webservice /weather‘ />implementation:实现类全路径,wsdl :使用说明书,提前生成url-pattern:/ webservice /weather这个路径就是webservice地址soap12: ?<!-- 发布soap12 --> ????<endpoint name=‘weatherServiceSoap12‘ implementation=‘cn.itcast.ws.jaxws.service.WeatherServiceImplSoap12‘ ???????wsdl=‘WEB-INF/wsdl/WeatherServiceSoap12.wsdl‘ ???????url-pattern=‘/webservice/weathersoap12‘ />

第七步:配置web.xml

//webservice的监听<listener> ???????<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener> ??<servlet> ???????<servlet-name>webservice</servlet-name> ???????<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> ???????<load-on-startup>1</load-on-startup></servlet><servlet-mapping> ???????<servlet-name>webservice</servlet-name> ???????<url-pattern>/webservice/*</url-pattern></servlet-mapping>

WebService使用介绍

原文地址:http://www.cnblogs.com/lm970585581/p/7710878.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved