WebService全面详解

article/2025/10/6 5:16:11

目录

1. 什么是WebService

2. WebService的三要素

   2.1 SOAP

2.1.1SOAP协议格式 

2.1.2 SOAP1.1协议:

2.13 SOAP1.2

2.1.4 SOAP1.1和SOAP1.2区别

2.2 WSDL

2.3 UDDI

3. WebService开发规范

3.1 JAX-WS

3.2 JAXM&SAAJ

3.3 JAX-RS

4. WebService应用场景

5. wsimport命令介绍

6. 发布第一个JAX-WS的Web Service服务

7. WebService的四种客户端调用方式 

7.1第一种通过wsimport生成客户端方式调用

7.2第二种通过Service编程调用方式

7.3第三种通过HttpURLConnection调用方式

7.4第四种,通过ajax方式调用服务端

8. CXF

8.1CXF介绍

8.2 CXF发布SOAP协议的服务

8.3 CXF+Spring整合发布SOAP协议的服务 

8.4 CXF发布REST的服务 

8.5 CXF+Spring整合发布REST的服务


1. 什么是WebService

         Web Service也称为web服务,它是一种跨编程语言和操作系统平台的远程调用技术。Web Service采用标准的SOAP协议传输(SOAP:Simple Object Access Protocol简单对象访问协议,soap属于w3c标准。并且soap协议是基于http的应用层协议传输xml数据)。Web Service采用WSDL作为描述语言,也就是Web Service 的使用说明书。并且W3C为Web Service制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何语言写的web Service 接口在发送数据的时候都要转换成WebService标准的XSD发送。
 

2. WebService的三要素

   2.1 SOAP

     SOAP也叫做简单对象访问协议,是一种简单的基于xml的协议,它使应用程序通过HTTP来交换数据,可以简单的理解为SOAP= http+xml。SOAP协议目前的主流版本为:SOAP1.1和SOAP1.2(soap1.2是被纳入w3c标准后的版本)。SOAP也不是WebService的专有协议,其它的应用程序也是用soap传输数据。例如:tr069也是使用soap协议来传输数据。

区分http请求和SOAP(SOAP=Http+XML)请求:

2.1.1SOAP协议格式 

  1. 必须有Envelope元素,此元素将整个xml文档表示为一条SOAP消息。
  2. 可选Header元素,包含头部信息。
  3. 必须有Body元素,包含所有的调用和响应信息。
  4. 可选的Fault元素,提供有关在处理此消息所发生的错误信息。

2.1.2 SOAP1.1协议:

  Jaxws支持SOAP1.1服务端发布:

     请求信息:

POST /weather HTTP/1.1Accept: text/xml, multipart/relatedContent-Type: text/xml; charset=utf-8SOAPAction: "http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"User-Agent: JAX-WS RI 2.2.4-b01Host: 127.0.0.1:54321Connection: keep-aliveContent-Length: 214<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather></S:Body></S:Envelope>

      响应信息:

HTTP/1.1 200 OKTransfer-encoding: chunkedContent-type: text/xml; charset=utf-8Date: Thu, 26 Nov 2015 03:14:29 GMT<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse></S:Body></S:Envelope>

2.13 SOAP1.2

      Jaxws不支持支持直接SOAP1.2服务端发布,直接发布会报ServiceRtException异常。

      那么该怎么发布SOAP1.2的服务端呢?1.需要导入第三方jar包(jaxws-ri-2.2.8)2.在实现类中添加@BindingType(SOAP12HTTP_BINDING)注解。

请求信息:
 

POST /weather HTTP/1.1Accept: application/soap+xml, multipart/relatedContent-Type: application/soap+xml; charset=utf-8;action="http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"User-Agent: JAX-WS RI 2.2.4-b01Host: 127.0.0.1:54321Connection: keep-aliveContent-Length: 212<?xml version="1.0" ?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"><S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather></S:Body></S:Envelope>

响应信息:

HTTP/1.1 200 OKTransfer-encoding: chunkedContent-type: application/soap+xml; charset=utf-8Date: Thu, 26 Nov 2015 03:25:24 GMT<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"><S:Body><ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse></S:Body></S:Envelope>

2.1.4 SOAP1.1和SOAP1.2区别

 相同点:

  1.  请求方式都是采用的POST方式
  2. 协议内容相同:都有Envelope和Body标签。

 不同的:

    1.数据格式不同:content-type不同。

         SOAP1.1:text/xml;charset=utf-8

         SOAP1.2:application/soap+xml;charset=utf-8

    2.命名空间不同。

         SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/

         SOAP1.2:http://www.w3.org/2003/05/soap-envelope
 

2.2 WSDL

        WSDL是基于XML的用于描述Web Service 及其函数(方法)、参数和返回值。也就是说wsdl是对发布出来的服务中的方法和返回值以及参数的描述(可以成为是WebService的使用说明书)。

     WSDL文档结构:

     WSDL文档主要包括5个标签:

  1. <service> :服务视图,WebService的服务结点,它包括服务端点。
  2. <binding> :为每个服务端点定义消息格式和协议细节。
  3. <portType> :服务端点,描述WebService可执行的操作方法,以及相关的消息,通过binding指向portType。
  4. <message> :定义一个操作(方法)的数据参数(可有多个参数)
  5. <type> :定义WebService使用的全部数据类型。
     

   WSDL文档阅读方式:从下往上。

2.3 UDDI

    UDDI是一种目录服务,通过它,企业可注册并搜集Web Service。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册Web Service服务,从而达到资源共享。UDDI旨在将全球的Web Service资源进行共享。

3. WebService开发规范

3.1 JAX-WS

    JAX-WS(Java API for XML-Based Web Service):一个远程调用可以转换为基于XML协议(例如:SOAP协议),在使用JAX-WS过程中,开发者不需要使用任何代码来编写生成和处理SAOP。JAX-WS运行时会自动将这些API调用转换为SAOP协议的消息。

    在服务端,用户只需要通过Java语言定义远程调用所需要实现的接口(SEI:Service EndPoit Interface),并对其提供相关的实现,通过调用JAX-WS的服务来发布接口就可以发布为Web Service 接口啦。

    在客户端,用户可以通过JAX-WS的API来创建一个代理来(用本地代理对象来替代远程的服务对象)实现远程服务端的调用。(在使用JAX-WS生成远程服务端的代理可以使用 wsimport(这个命令是jdk自带的)命令来自动生成,下面会对其进行具体讲解)

    从Java5开始就支持JAX-WS2.0版本,Java6以后的版本支持JAX-WS2.1版本,Java1.7支持JAX-WS2.2的版本。

3.2 JAXM&SAAJ

    JAXM(Java API for XML Message):主要定义了包含接收信息和发送信息所需要的API,SAAJ(SOAP With Attachment API For Java)是与JAXM搭配使用的API,为构建SOAP和解析SOAP包提供了重要的支持,支持附件传输等。

3.3 JAX-RS

   JAX-RS是Java针对REST(Representtation state Transfer)风格制定的一套Web服务规范,由于该规范推出来的较晚,因此该规范(JAX-WS的版本为1.0)并未随Java6一起发行。

4. WebService应用场景

适用场景:

    1.用于软件集成和复用。

    2.用于接口服务,不考虑客户端类型,不考虑性能。

    3.服务端已经确定使用了WebService,客户端只能选择WebService使用。

不适用场景:

   1.对性能要求比较高(因为WebService是采用http发送soap协议的数据,该协议迭代了太多的标签,导致数据很多,因此性  能也有所降低)。

    2.同构程序之间不建议使用。

5. wsimport命令介绍

    wsimport命令是jdk自带的web service 客户端工具,可以根据wsdl文档生成对服务带代理类(客户端调用类),当然不管服务端是用什么语言写的,都可以生成调用WebService的客户端代码,服务端通过客户端调用WebService。

    wsimport命令常用参数为:

     -d<目录> :指定放置生成的输出文件的位置。

     -s<目录> :指定放置生成的源文件的位置。

     -p<包名> : 指定目标程序包。

      例如:wsimport -p com.test -s . http://webService.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
 

6. 发布第一个JAX-WS的Web Service服务

第一步创建SEI接口(本质上就是Java接口):

public interface WeatherInterface {public String querryWeather(String cityName);
}

第二步创建接口的实现类:

@WebService注解:表示该实现类是一个Web Service服务。

targetNamespace属性:指定命名空间。

name属性:指定portType的名称。

serviceName属性:服务名称。

@WebMethod注解:定义公共方法。

operationName属性:方法的名称。(也就是WSDL中的operation的名称)

exclude属性:如果设置为true表示该方法不是Web Service服务中的方法。反之则是WebService中的方法。默认也是false。

@WebResult注解:定义返回值。

name属性:返回结果值的名称

@WebParam注解:定义参数。

name属性:指定参数的名称。
 

@WebService(targetNamespace="http://service.cn_lc",name="WeatherWSSoap",portName="WeatherWSSoapPort",serviceName="WeatherWS"
)//只加这个注解就只能生成SAOP1.1的WSDL
//@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public class WeatherInterfaceImpl implements WeatherInterface {@WebMethod(operationName="getWeather",exclude=false)@Overridepublic @WebResult(name="resultWeather")String querryWeather(@WebParam(name="cityName")String cityName) {System.out.println("form client ..." + cityName);String weather = "晴";return weather;}}

第三步,通过Endpoint发布Web Service 服务(Endpoint只能发布实现类,而不能发布接口):

public class WeatherServer {public static void main(String[] args) {/*** 参数解释:* address:服务器地址* implementor:实现类*/Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherInterfaceImpl());}
}

第四步,测试服务是否发布成功,通过阅读发布服务的WSDL就可以验证。访问:http://127.0.0.1:12345/weather?wsdl(由于服务发布在本机上,所以地址是:127.0.0.1):

通过访问该地址浏览到WSDL就证明该服务发布成功:

7. WebService的四种客户端调用方式 

7.1第一种通过wsimport生成客户端方式调用

第一步:通过wsimport生成客户端代码:

             wsimport -p com.test.jaxws -s . http://127.0.0.1:12345/weather?wsdl

第二步:阅读使用说明书WSDL,使用生成客户端代码调用服务端:

public class WeatherClient {public static void main(String[] args) {//创建服务视图WeatherWS weatherInterfaceImplService = new WeatherWS();//通过服务视图对象获取服务实现类WeatherWSSoap weatherInterfaceImpl = weatherInterfaceImplService.getPort(WeatherWSSoap.class);//通过服务实现对象调用查询方法System.out.println(weatherInterfaceImpl.getWeather("北京"));}
}

采用wsimport生成客户端代码方式的特点:这种方式使用简单,但是一些关键的元素(比如wsdl地址、命名空间、服务类名等都写死在生成的客户端代码中)写死在代码中,不方便后期维护,可以用于测试。

7.2第二种通过Service编程调用方式

第一步:通过wsimport生成客户端代码:

             wsimport -p com.test.jaxws -s . http://127.0.0.1:12345/weather?wsdl

第二步:自己编写服务视图类,并通过该服务视图类来获取服务实现类实例:

public class WeatherClientDemo2 {public static void main(String[] args) throws IOException {//创建WSDL的URL,注意不是服务地址URL url = new URL("http://127.0.0.1:12345/weather?wsdl");//创建服务名称//namespaceURI:命名空间地址。//localPart:服务视图名。QName qname = new QName("http://service.cn_lc","WeatherWS");//创建服务视图//1.wsdlDocumentLocation - wsdl地址//2.serviceName - 服务名称Service service = Service.create(url, qname);WeatherWSSoap weatherWSSoap = service.getPort(WeatherWSSoap.class);String result = weatherWSSoap.getWeather("成都");System.out.println(result);}}

采用service编程方式特点:该种方式可以自定义关键元素,方便以后维护,是一种标准开发方式。

7.3第三种通过HttpURLConnection调用方式

第一步:创建服务地址。

第二步:打开一个通向服务地址的连接。

第三步:设置参数(例如请求方式为POST)。

第四步:组织SOAP数据发送数据。

第五步:接收服务端响应,并打印。

public class WeatherClientDemo3 {public static void main(String[] args) throws IOException {//第一步:创建服务地址URL url = new URL("http://127.0.0.1:54321/weather");//第二步:打开一个通向服务端地址的连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();//设置参数connection.setRequestMethod("POST");connection.setRequestProperty("content-type", "text/xml;charset=utf-8");//设置输入输出connection.setDoOutput(true);connection.setDoInput(true);//准备SOAP数据,发送请求String soapxml = getXML("成都"); OutputStream out = connection.getOutputStream();OutputStreamWriter writer = new OutputStreamWriter(out, "utf-8");writer.write(soapxml);writer.close();out.close();//第五步接收服务端响应并打印if(connection.getResponseCode()==HttpURLConnection.HTTP_OK) {InputStream input = connection.getInputStream();InputStreamReader reader = new InputStreamReader(input,"utf-8");BufferedReader buffered = new BufferedReader(reader);String temp = null;StringBuilder sb = new StringBuilder();while((temp=buffered.readLine())!=null) {sb.append(temp);}buffered.close();reader.close();input.close();System.out.println(sb.toString());}}public static String  getXML(String cityName) {return "<?xml version=\"1.0\" ?>"+ "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">"+ "<S:Body>"+ "<ns2:getWeather xmlns:ns2=\"http://service.cn_lc\">"+ "<cityName>"+cityName+"</cityName>"+ "</ns2:getWeather>"+ "</S:Body>"+ "</S:Envelope>";}
}

7.4第四种,通过ajax方式调用服务端

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>查询天气</title><script type="text/javascript">function querryWeather(){var xhr = new XMLHttpRequest();xhr.open("post","http://127.0.0.1:12345/weather",true);//设置数据类型xhr.setRequestHeader("content-type","text/xml;charset=utf-8");//设置回调函数if(4==xhr.readState && 200 == xhr.status){alert(xhr.responseText);}//组织数据var soapXml = "<?xml version=\"1.0\" ?>"+ "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">"+ "<S:Body>"+ "<ns2:getWeather xmlns:ns2=\"http://service.cn_lc\">"+ "<cityName>"+document.getElementById("cityName").value+"</cityName>"+ "</ns2:getWeather>"+ "</S:Body>"+ "</S:Envelope>";alert(soapXml);//发送数据xhr.send(soapXml);}</script>
</head>
<body><center>天气查询:<input type="text" id="cityName" /><input type="button" value="查询" οnclick="javascript:querryWeather();" /></center>
</body>
</html>

8. CXF

8.1CXF介绍

第一:CXF是一个开源的Web Service 框架,提供了很多完善的功能,可以实现快速开发。

第二:CXF支持的协议有SOAP1.1/SOAP1.2,REST。

第三:CXF支持数据格式有XML,JSON(仅在REST方式下支持,不在SOAP方式下支持,因为SOAP是http+xml)

CXF的下载位置:http://cxf.apache.org/

CXF的安装和配置环境变量就不做详细介绍了,可以参考百度


8.2 CXF发布SOAP协议的服务

服务端:

第一步:导入下载下来的CXF文件下的lib文件下所有的jar包。

第二步:创建SEI接口,并在SEI接口上加@WebService注解表示当前接口为WebService的服务。

其它注解和上文中一样。

@WebService
//@BindingType(SOAPBinding.SOAP12HTTP_BINDING)//发布SOAP1.2协议的服务
public interface WeatherInterface {public @WebResult(name="weatherResult")String querryWeather(@WebParam(name="cityName")String cityName);
}

第三步:创建SEI的实现类。

public class WeatherInterfaceImpl implements WeatherInterface{@Overridepublic String querryWeather(String cityName) {System.out.println("from client ..." + cityName);return "晴";}}

第四步:通过JaxWsServiceFactoryBean来发布服务。使用JaxWsServiceFactoryBean来发布服务需要设置接口、实现类和服务地址。也可以在发布之前添加拦截器。(Endpoint仅支持发布实现类,JaxWsServiceFactoryBean支持发布接口)

public class WeatherServer {public static void main(String[] args) {//通过JaxWsServerFactoryBean来发布服务JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();//设置接口jaxWsServerFactoryBean.setServiceClass(WeatherInterface.class);//设置实现类jaxWsServerFactoryBean.setServiceBean(new WeatherInterfaceImpl());//设置服务地址jaxWsServerFactoryBean.setAddress("http://127.0.0.1:12345/weather");//加入拦截器jaxWsServerFactoryBean.getInInterceptors().add(new LoggingOutInterceptor());jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingInInterceptor());//发布服务jaxWsServerFactoryBean.create();}
}

第五步:测试发布服务是否成功。通访问WSDL地址是否存在。

客户端:

第一步:通过wsdl2java命令生成客户端代码。

1. wsdl2java命令是CXF提供的生成客户端的工具,他和wsimport类似,可以根据WSDL生成客户端代码。

2. wsdl2java常用参数:

-d指定输出目录。

-p指定包名,如果不指定该参数,默认包名就按命名空间的倒序。

-wsdl2java支持SOAP1.1和SOAP1.2(wsimport仅支持SOAP1.1)。

第二步:使用说明书,使用第一步生成的代码调用服务端。通过JaxWsProxyFactoryBean来获取服务端接口实例。在使用JaxWsProxyFactoryBean获取服务端接口实例需要设置服务端接口和设置服务端地址。
 

public class WeatherClient {public static void main(String[] args) {//通过JaxWsProxyFactoryBean来调用服务端JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();//设置服务端接口jaxWsProxyFactoryBean.setServiceClass(WeatherInterface.class);//设置服务端地址jaxWsProxyFactoryBean.setAddress("http://127.0.0.1:12345/weather");//获取服务接口实例WeatherInterface weatherInterface =jaxWsProxyFactoryBean.create(WeatherInterface.class);//调用查询方法String weather = weatherInterface.querryWeather("北京");System.out.println(weather);}
}

8.3 CXF+Spring整合发布SOAP协议的服务 

服务端:

第一步:创建web项目并引用cxf相关的包。

第二步:创建SEI接口。

@WebService
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public interface WeatherInterface {public @WebResult(name="weatherResult")String querryWeather(@WebParam(name="cityName")String cityName);
}

第三步:创建SEI实现类。

public class WeatherInterfaceImpl implements WeatherInterface{@Overridepublic String querryWeather(String cityName) {System.out.println("from client ..." + cityName);return "晴";}}

第四步:配置Spring配置文件applicationContext.xml来发布服务。

在Spring文件中配置发布服务是采用<jaxws:server>标签(也可以使用<jaxws:endpoint>标签来发布,该标签时对EndPoint的封装)来配置(jaxws标签就是JaxWsServiceFactoryBean的封装,因此在标签中需要设置服务地址和服务接口以及服务接口实现类。),因此需要给Spring的配置文件加载头信息。
 

xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
http://cxf.apache.org/
http://cxf.apache.org/schemas/jaxrs.
http://cxf.apache.org/
http://cxf.apache.org/schemas/jaxws.xsd

Spring配置文件内容为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"><!-- 通过jaxws:server标签发布SOAP协议的服务。 该标签是对JaxWsServerFactoryBean的封装--><jaxws:server address="/weather" serviceClass="com.lc.cxf_jaxws.WeatherInterface"><jaxws:serviceBean><ref bean="WeatherInterface"/></jaxws:serviceBean><!-- 添加拦截器 --><jaxws:inInterceptors><ref bean="inIntercepter"/></jaxws:inInterceptors><jaxws:outInterceptors><ref bean="outIntercepter"/></jaxws:outInterceptors></jaxws:server><!-- 配置拦截器 --><bean id="inIntercepter" class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean><bean id="outIntercepter" class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean><!-- 配置服务实现类 --><bean id="WeatherInterface" class="com.lc.cxf_jaxws.WeatherInterfaceImpl"></bean>				            
</beans>

第五步:配置web.xml。在web.xml中主要配置Spring的配置文件地址和Spring监听器和CXFServlet。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>ws_2_cxf_spring_server</display-name><!-- 配置Spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置Spring的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置CXF的Servlet --><servlet><servlet-name>CXF</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class></servlet><servlet-mapping><servlet-name>CXF</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>
</web-app>

第六步:启动tomcat,并测试服务是否发布成功。(通过访问wsdl地址是否有使用说明书来判断是否发布成功:http://127.0.0.1:8080/spring_cxf_demo1(项目名称)/ws/weather?wsdl)。

客户端:

第一步:引入jar包。

第二步:采用wsdl2java命令生成客户端代码。

第三步:配置Spring的配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"><!-- 通过jaxws:client标签编写客户端。 该标签是对JaxWsClientProxyFactoryBean的封装--><jaxws:client id="weather" address="http://127.0.0.1:12345/weather" serviceClass="com.lc.cxf_weather.WeatherInterface"/>
</beans>

第四步:从Spring上下文件中获得服务实现类,并调用查询方法。 

public class WeatherClient {public static void main(String[] args) {//初始化spring的上下文ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");WeatherInterface  weatherInterface = (WeatherInterface) context.getBean("weather");String weather = weatherInterface.querryWeather("成都");System.out.println(weather);}
} 

8.4 CXF发布REST的服务 

什么是REST的服务:REST就是一种编程风格,它可以精确定位网上资源(服务接口、方法、参数)

REST支持数据格式:XML、JSON

REST支持发送方式:GET、POST。

这里就通过查询一个学生和查询多个学生来演示CXF发布REST服务。

服务端:

第一步:导入CXF的jar包。

第二步:创建学生Pojo类,并且在学生类上加上@XmlRootElement注解代表该类可以实现和XML数据之间的转换。

@XmlRootElement(name="student")//注解@XmlRootElement可以实现对象和xml数据的转换,name属性是改变xml数据的根标签
public class Student {private long id;private String name;private Date date;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}}

第二步:创建SEI接口。

@WebService注解代表该类为WebService的服务。

@Path("/student")注解表示将接口映射到/student地址中。

@POST注解指定该方式是采用POST方式请求。

@Produces(String)注解指定服务数据类型。(也就是说服务是以xml还是其他方式来展示数据,一般都是设置为xml和json)

@Path("/querry/{id}/{name})注解表示把querry方法映射到/querry地址中,把参数映射到/{id}地址中。

@WebService
@Path("/student")//注解@Path就是将/student路径映射到接口上
public interface StudentInterface {//查询一个学生@POST@Produces(MediaType.APPLICATION_XML)//指定服务数据类型@Path("/query/{id}")//注解@Path就是将请求路径/query映射到query方法上,并且把id映射到参数上多个参数以/分开,参数是写在{}中。public Student query(@PathParam("id")long id);//查询多个学生@GET@Produces({"application/xml","application/json;charset=utf-8"})@Path("/queryList/{name}")public List<Student> queryList(@PathParam("name")String name);//根据多条件查询一个学生@GET@Produces("application/xml")@Path("/query/{id}/{name}")public Student query(@PathParam("id")long id,@PathParam("name")String name);
}

第三步:创建SEI的实现类。

public class StudentInterfaceImpl implements StudentInterface{@Overridepublic Student query(long id) {Student st = new Student();st.setId(id);st.setName("张三");st.setDate(new Date());return st;}@Overridepublic List<Student> queryList(String name) {Student st = new Student();st.setId(100);st.setName("张三");st.setDate(new Date());Student st1 = new Student();st1.setId(110);st1.setName("张三");st1.setDate(new Date());List<Student> list = new ArrayList<Student>();list.add(st);list.add(st1);return list;}@Overridepublic Student query(long id, String name) {Student st = new Student();st.setId(id);st.setName(name);st.setDate(new Date());return st;}}

 第四步:通过JAXRSServiceFactoryBean发布服务,需要设置服务实现类、设置资源类、服务地址。

public class StudentServer {public static void main(String[] args) {//JAXRSServerFactoryBean 来发布服务JAXRSServerFactoryBean jaxRSServerFactoryBean = new JAXRSServerFactoryBean();//设置实现类jaxRSServerFactoryBean.setServiceBean(new StudentInterfaceImpl());//设置资源类jaxRSServerFactoryBean.setResourceClasses(StudentInterfaceImpl.class);//设置服务地址jaxRSServerFactoryBean.setAddress("http://127.0.0.1:12345/user");//发布服务jaxRSServerFactoryBean.create();}
}

第五步:测试服务是否发布成功。通过浏览器访问GET请求方式的方法,就用queryList方法为例:http://127.0.0.1:12345/user/student/queryList/张三。

客户端:

客户端可以通过HttpUrlConnection来访问,也可以通过ajax方式来访问,也可以通过HttpClient方式来访问(HttpClient是apahce的开源项目)

这里采用HttpUrlConnection来开发客户端:

public class StudentClient {public static void main(String[] args) throws IOException {//创建URL连接URL url = new URL("http://127.0.0.1:12345/user/student/query/132");//打开连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();//设置请求方式connection.setRequestMethod("POST");//设置可输入connection.setDoInput(true);//获取数据if(connection.getResponseCode()==HttpURLConnection.HTTP_OK) {InputStream in = connection.getInputStream();InputStreamReader reader = new InputStreamReader(in,"utf-8");BufferedReader bReader = new BufferedReader(reader);String line = null;StringBuilder sb = new StringBuilder();while((line=bReader.readLine())!=null) {sb.append(line);}in.close();reader.close();bReader.close();System.out.println(sb.toString());}}
}

8.5 CXF+Spring整合发布REST的服务

服务端:

第一步:创建web工程并导入jar包

第二步:创建pojo类(上同)

第三步:创建SEI接口(上同)

第四步:创建SEI接口类的实现(上 同)

第五步:配置Spring的配置文件。采用<jaxrs:server>标签来配置发布REST服务,需要设置服务地址和服务实现类。(不需要设置资源类。)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"><!-- 通过jaxrs:server标签发布REST的服务。 该标签是对JAXRSServerFactoryBean的封装--><jaxrs:server address="/user"><jaxrs:serviceBeans><ref bean="studentInterface"/></jaxrs:serviceBeans></jaxrs:server><bean id="studentInterface" class="com.lc.ws_rest.server.StudentInterfaceImpl"></bean>
</beans>

第六步:配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>ws_4_cxf_rest_spring_server</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><!-- 配置Spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置Spring的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置CXF的Servlet --><servlet><servlet-name>CXF</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class></servlet><servlet-mapping><servlet-name>CXF</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping>
</web-app>

第七步:启动Tomcat服务器,并测试服务是否发布成功。通过浏览器访问GET方式的方法。例如:http://127.0.0.1:8080/spring_cxf_rest(项目名称)/ws/user/student/queryList/张三。


客户端:

客户端同样可以采用HttpUrlConnection或者HttpClient或者ajax方式来访问。这里同样采用HttpUrlConnection方式来编写客户端:
 

public class StudentClient {public static void main(String[] args) throws IOException {//创建URL连接URL url = new URL("http://127.0.0.1:8080/spring_cxf_rest/ws/user/student/query/1");//打开连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();//设置请求方式connection.setRequestMethod("POST");//设置可输入connection.setDoInput(true);//获取数据if(connection.getResponseCode()==HttpURLConnection.HTTP_OK) {InputStream in = connection.getInputStream();InputStreamReader reader = new InputStreamReader(in,"utf-8");BufferedReader bReader = new BufferedReader(reader);String line = null;StringBuilder sb = new StringBuilder();while((line=bReader.readLine())!=null) {sb.append(line);}in.close();reader.close();bReader.close();System.out.println(sb.toString());}}
}

————————————————
版权声明:本文为CSDN博主「巧笑情兮_美目盼兮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ITITII/article/details/79609073


http://chatgpt.dhexx.cn/article/b6ljaGjT.shtml

相关文章

jQuery来实现一个ajax实例

下面介绍使用jQuery来实现一个简单的ajax实例 主要的效果是使用ajax来实现书籍的价格随着书籍的数量变化&#xff0c;有一个增加按钮和一个减少按钮 jsp页面代码 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <…

jsp+ajax实例

下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验&#xff08;校验方式多种&#xff0c;包括提取数据库信息&#xff0c;校验用户名是否重复等&#xff09;&#xff0c;异步在JSP表单页面显示校验结果信息的基本过程。 一、说明&#xff1a; 1.由于本…

Ajax的简单实例

AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部…

Ajax例子

Ajax实现无刷新三联动下拉框 1.html代码 < HTML > < HEAD > < title > Ajax实现无刷新三联动下拉框 </ title > < meta content "Microsoft Visual Studio .NET 7.1" name "GENERATOR" > < meta content "C#"…

javaweb+jQuery ajax实例

什么是ajax AJAX即“Asynchronous Javascript And XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。 AJAX 异步 JavaScript和XML&#xff08;标准通用标记语言的子集&#xff09;。 AJAX 是一种用于创建快速动态网…

原生js的Ajax实例

与jQuery不同&#xff0c;原生js的ajax的实现相比来说复杂一些&#xff0c;因为jquery中的$.ajax()方法已经把js的实现封装起来&#xff0c;使用起来更加方便。但是&#xff0c;原生js的实现过程&#xff0c;对于理解ajax&#xff0c;好像更清晰一些。 之前写过的jQuery的ajax…

Ajax最简单实例(java)

总体介绍&#xff0c;不感兴趣的请跳过&#xff1a;以下内容是关于DWR来实现Ajax的方法。 一、 Ajax的介绍。 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 …

Ajax学习(二)—— 一个简单的Ajax实例

通过上篇博客认识Ajax之后,我们通过一个简单的实例来消化消化理论知识,一睹Ajax的庐山真面目。 1.实例功能: 当用户输入用户名,文本框失去焦点后,通过异步调用来判断该用户名是否已经存在。若存在,则在上图中红框处显示提示。当用户名可用时,提交按钮变为可用状态。 2.…

Ajax实例(JAVA)

这是一个用于留言板留言提交与读取的简单实例&#xff0c;不包括回复、编辑与删除等其它管理功能。 本实例的目的在于用一个简单的例子展示如果在java web应用中&#xff0c;用javascript开发Ajax应用。 一、web页面 msbord.jsp 1、本页面用于留言显示 2、本页面提供留言功能…

原生js实现Ajax实例讲解

Ajax简介 ajax 异步 JavaScript 和 XML。 ajax是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。我们知道&#xff0c;传统的网页&#xff08;不使用ajax&#xff09;如果需要更新内容&#xff0c;必须重新加载整个网页。Ajax的出现&#xff0c;使…

jsp ajax实例讲解

下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验&#xff08;校验方式多种&#xff0c;包括提取数据库信息&#xff0c;校验用户名是否重复等&#xff09;&#xff0c;异步在JSP表单页面显示校验结果信息的基本过程。 一、说明&#xff1a; 1.由于本…

jqueryajax实例

运用ajax结合dom写的小实例&#xff0c;其中记录了过程中遇到的问题和解决方法 任务要求&#xff1a; 模拟“请求用户列表”&#xff0c;向后台请求&#xff0c;后台会去数据库中将你的用户列表全部查出来&#xff0c;返回很多条记录&#xff0c;现在将记录显示在页面上用表格打…

Ajax简介和实例

目录 什么是 AJAX &#xff1f; AJAX实例 ajax-get无参 ajax-get有参 对象和查询字符串的互转 ajax-post ajax-post 表单 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 什么是 AJAX &#xff1f; 菜鸟教程是这样介绍的&#xff1a…

Ajax实例讲解与技术原理

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 摘要&#xff1a;AJAX即“Asynchronous Javascript And XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。AJAX 是一种用于创建快速动态网页的…

jQuery的Ajax实例(附完整代码)

目录 写在前边什么是AjaxAjax基本结构实例实例1实例2 小结 写在前边 作为一个前端刚入门没多久的小白&#xff0c;想在这里分享一下我的学习内容&#xff0c;就算是学习笔记了。因为前端的大部分学习都是通过网站上的教程&#xff0c;所以遇到不懂得问题&#xff0c;也只有求助…

Ajax技术 实例篇

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;本篇文章通过HtmlAjaxnode技术实现一个简单的Ajax请求案例&#xff0c;为加强对Ajax技术的了解和实操经验 实现效果 这是请求前的前端页面&#xff0c;点击两个Button按钮分别发起不…

Ajax-Ajax基础实例

实例一&#xff1a;点击一个按钮&#xff0c;然后将信息显示到指定的div内。 1、创建一个JAVA web工程&#xff0c;命名为AjaxTest。在webRoot创建一个HTML页面&#xff0c;命名为FirstTest.html&#xff0c;FirstTest.html代码如下&#xff1a; <html><head><t…

Ajax最实用的小例子集合

今天我为大家带来了几个非常实用的ajax小例子&#xff0c;都是在工程中经常用到的实用的例子。适合有基础的同学&#xff0c;废话也不多说了&#xff0c;看代码 哦&#xff0c;对了&#xff0c;所有的例子都是用servletjsp实现的 至于三大框架的&#xff0c;我相信&#xff0c;…

Java 网络编程(大全)

前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 一、1网络通信的基本模式分为两种 1.CS模式&#xff08;Client---客户端&#xff0c;Server---服务端&#xff09; 客户端是需要程序员去开发的&#xff0c;例如日常使用的各种的APP&#xff0c…

java游戏编程:三路兵线,BOSS走位,代码和视频

一、基本功能&#xff1a; 坦克大战&#xff1a;三路兵线的走&#xff0c;停&#xff0c;走&#xff0c;停。四个版本的飞机大战&#xff1a;多种运动方式。都有代码和视频下载地址。 二、后续改进&#xff1a; 走&#xff0c;停发起攻击&#xff0c;走&#xff0c;停发起攻击…