一、webService 初步讲解
1、xml 约束 schema 写法解读
<?xml version="1.0" encoding="UTF-8" ?> <!-- schema 约束文件 --> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.atguigu.com/bookSchema" elementFormDefault="qualified"> <!-- elementFormDefault 是否只关联跟标签 --> <element name="书架"> <complexType> <sequence maxOccurs="unbounded"> <element name="书"> <complexType> <sequence> <element name="书名" type="string" /> <element name="作者" type="string" /> <element name="售价" type="string" /> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema> <!-- schema规范中: 1. 所有标签和属性都需要有schema文件来定义,xsd规范定义中,xmlns="http://www.w3.org/2001/XMLSchema"-w3c提供; 2. 所有的schema文件都需要有targetNamespace,3. targetNamespace的值由什么来指定? 它的值是一个url(很有可能不存在),也就是在别人引用的时候要用的东西; 4. 如何引入一个Schema约束? 属性? : 用xmlns属性 属性值: 对应的schema文件的id(targetNamespace值) -->
<?xml version="1.0" encoding="UTF-8"?> <书架 xmlns="http://www.atguigu.com/bookSchema" xmlns:tt="http://www.w3.org/2001/XMLSchema-instance" tt:schemaLocation="http://www.atguigu.com/bookSchema book.xsd"> <书> <书名>JavaScript开发</书名> <作者>老佟</作者> <售价>28.00元</售价> </书> </书架> <!-- schema规范中: 1. 所有标签和属性都需要有schema文件来定义 2. 所有的schema文件都需要有一个id,但在这里它叫namespace,3. namespace的值由什么来指定? 由targetNamespace属性来指定,它的值是一个url(很有可能不存在) 4. 如何引入一个Schema约束? 属性? : 用xmlns属性 属性值: 对应的schema文件的id(namespace值) 5. 如果引入的schema不是w3c组织定义,必须指定schema文件的位置 6. schema文件的位置由什么属性来指定? 属性? : schemaLocation ? schemaLocation 由xmlns:tt来指定; 属性值: namespace path 7. 如果引入了N个约束,需要给n-1个取别名 -->
2、Http 协议 解析
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向
服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:
请求行
若干消息头
实体内容(可能没有,post有),如下所示 :
常用请求头(浏览器发送给服务器的数据,为了告诉服务器一些情况)
Accept: text/html,image/* 我支持的数据类型
Accept-Charset: utf-8 支持的数据的编码字符集
Accept-Encoding: gzip 支持的压缩方式
Accept-Language: en-us,zh-cn 支持的语言
Host: localhost:8888 请求的主机名
Referer: http://www.atguigu.com/index.jsp 发送请求的界面对应的url 防盗链
User-Agent: Mozilla/4.0 浏览器的相关信息
Connection: keep-Alive 请求完成后,到是断开呢还是连接着
Date: Tue,11 Jul 2000 18:23:51 GMT 发送请求的时间
Cookie: tt=123 //后面专门讲
响应头(浏览器发送给服务器的数据,为了告诉服务器一些情况):
Location: /day05/index.jsp 告诉浏览器重新定向到指定的路径
Server:apache tomcat 使用的什么web服务器
content-encoding: gzip 告诉浏览器我传给你的数据用的压缩方式
Content-Length: 80 响应体的字节数
Content-Language: zh-cn 响应体数据的语言
content-type: text/html; charset=GB2312 响应体内容的类型 html/ css / image
Last-Modified: Tue,11 Jul 2000 18:23:51 GMT 资源最后被修改的时间
Refresh: 1定时刷新
Content-disposition: attachment; filename=aaa.zip 提示用户下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 将cookie数据回送给ie
Expires: -1 告诉浏览器不要缓存起来
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive 是否保持连接
Date: Tue,11 Jul 2000 18:23:51 GMT 响应的时间
3、webService 四大术语解读
WSDL
直译 : WebService定义语言
1. 对应一种类型的文件.wsdl 2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式 |
SOAP:simple object access protocal
直译: 简单对象访问协议
1.是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据 2.soap消息:请求消息和响应消息 3.http+xml片断 |
SEI:WebService EndPoint Interface(终端)
直译: web service的终端接口,
就是WebService服务器端用来处理请求的接口 @Webservice @WebMethod |
CXF:Celtix + XFire
一个apache的用于开发webservice服务器端和客户端的框架 |
二、使用JDK原生发布webService服务
1、创建数据发布接口及实现类,并创建发布程序类
package com.bjsxt.web.ws.ws; import javax.jws.WebMethod; import javax.jws.WebService; /** * SEI 定义发布接口 */ @WebService public interface HelloWs { @WebMethod public String sayHello(String name); }
package com.bjsxt.web.ws.ws; import javax.jws.WebService; /** * SEI 定义发布接口实现 */ @WebService public class HelloWsImpl implements HelloWs { @Override public String sayHello(String name) { System.out.println("调用 webService 成功 ..."); return "welComn user :"+name; } }
package com.bjsxt.web.ws.ws; import javax.xml.ws.Endpoint; public class StartWebService { public static void main(String[] args) { String address = "http://localhost:8088/webService/HelloWs"; Endpoint.publish(address,new HelloWsImpl());//发布webService服务 System.out.println("发布webService成功..."); }}
2、使用JDK提供的 wsimport 实现创建client
① cmd →进入目录(存放生成文件的目录,该项目中使用了工作空间目录直接生成在了编译器中) D:\Workspaces\MyEclipse 8.6\webService\src\com\bjsxt\web\ws\client>wsimport -keephttp://localhost:8088/webService/HelloWs?wsdl
② 创建测试类
package com.bjsxt.web.ws.client; public class WebServiceTest { public static void main(String[] args) { HelloWsImplService implService = new HelloWsImplService(); HelloWsImpl impl = implService.getHelloWsImplPort(); System.out.println(impl.sayHello("admin")); } }
3、将上述从网络读取wsdl改为本地读取
① 将MyEclipse中的TCP/IP设置为监听
② 将请求到的网络中的wsdl文件中的内容复制在本地新建的一个wsdl文件中(注意改掉最后一行的端口)
③ 将上面一点钟的URL改为本地路径即可获得java类
三、使用公共天气预报(.net提供的webService)
1、Google”免费WebService”,找到提供天气预报Webservice的网络地址 –http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx.wsdl
2、在MyEclipse中新建weather.wsdl,将网络中的信息复制进去
3、问题存在:
说明: 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法: 1. 将对应的wsdl文档保存到本地 将 <s:element ref="s:schema" /><s:any /> 替换成<s:any minOccurs="2" maxOccurs="2"/> 备注: 这个是Java调用net的webservice都有的问题 |
4、使用JDK提供的wsimport生成客户端
四、支持多数据类型的入参(包括对象)
1、JDK自带webService开发中不支持多数据类型的开发,首先加入cxf的支持包:
下载地址:http://download.csdn.net/detail/u014201191/8661707
2、源码程序解析(没什么区别)
package com.atguigu.day01_ws.ws2; import java.util.List; import java.util.Map; import javax.jws.WebMethod; import javax.jws.WebService; import com.atguigu.day01_ws.bean.Student; @WebService public interface DataTypeWS { @WebMethod public boolean addStudent(Student s); @WebMethod public Student getStudentById(int id); @WebMethod public List<Student> getStudentsByPrice(float price); @WebMethod public Map<Integer,Student> getAllStudentsMap(); }
package com.atguigu.day01_ws.ws2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.jws.WebService; import com.atguigu.day01_ws.bean.Student; @WebService public class DataTypeWSImpl implements DataTypeWS { @Override public boolean addStudent(Student s) { System.out.println("server addStudent() "+s); return true; } @Override public Student getStudentById(int id) { System.out.println("server getStudentById() "+id); return new Student(id,"CAT",1000); } @Override public List<Student> getStudentsByPrice(float price) { System.out.println("server getStudentsByPrice() "+price); List<Student> list = new ArrayList<Student>(); list.add(new Student(1,"TOM1",price+1)); list.add(new Student(2,"TOM2",price+2)); list.add(new Student(3,"TOM3",price+3)); return list; } @Override public Map<Integer,Student> getAllStudentsMap() { System.out.println("server getAllStudentsMap() "); Map<Integer,Student> map = new HashMap<Integer,Student>(); map.put(1,new Student(1,"JACK1",2345)); map.put(3,new Student(3,"JACK3",2375)); map.put(2,new Student(2,"JACK2",12345)); return map; } }
package com.atguigu.day01_ws.bean; public class Student { private int id; private String name; private float price; public Student(int id,String name,float price) { super(); this.id = id; this.name = name; this.price = price; } public Student() { super(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Student [id=" + id + ",name=" + name + ",price=" + price + "]"; } }
package com.bjsxt.web.ws.ws.type; import javax.xml.ws.Endpoint; import com.atguigu.day01_ws.ws2.DataTypeWSImpl; public class StartWebService { public static void main(String[] args) { String address = "http://localhost:8888/day01_ws/datatypews"; Endpoint.publish(address,new DataTypeWSImpl()); System.out.println("发布成功"); } }
五、CXF拦截器
1、日志拦截器
在JDK中没有拦截器,导入cxf包后,引用拦截器,就和第四大点中的一样,更好的配合JDK开发.
拦截器分类
1.按所处的位置分:服务器端拦截器,客户端拦截器
2.按消息的方向分:入拦截器,出拦截器
3.按定义者分:系统拦截器,自定义拦截器
拦截器API
Interceptor(拦截器接口)
AbstractPhaseInterceptor(自定义拦截器从此继承)
LoggingInInterceptor(系统日志入拦截器类)
LoggingOutInterceptor(系统日志出拦截器类)
服务端拦截器:接口发布程序都一样,在终端启动的时候加入拦截器
package com.bjsxt.web.ws.ws; import java.util.List; import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.message.Message; public class StartWebService2 { public static void main(String[] args) { String address = "http://localhost:8088/webService/HelloWs"; Endpoint endpoint = Endpoint.publish(address,new HelloWsImpl());//发布webService服务 System.out.println(endpoint); EndpointImpl endpointImpl = (EndpointImpl) endpoint; //服务端的日志入拦截器 List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getininterceptors(); inInterceptors.add(new LoggingInInterceptor()); //服务端的日志出拦截器 List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getoutInterceptors(); outInterceptors.add(new LoggingOutInterceptor()); System.out.println("发布webService成功..."); }}
package com.bjsxt.web.ws.ws; import java.util.List; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.message.Message; public class Client { public static void main(String[] args) { HelloWsImplService implService = new HelloWsImplService(); HelloWsImpl impl = implService.getHelloWsImplPort(); //发送请求的客户端对象 org.apache.cxf.endpoint.Client client = ClientProxy.getClient(impl); //客户端的日志出拦截器 List<Interceptor<? extends Message>> outInterceptors = client.getoutInterceptors(); outInterceptors.add(new LoggingOutInterceptor()); //客户端的日志入拦截器 List<Interceptor<? extends Message>> inInterceptors = client.getininterceptors(); inInterceptors.add(new LoggingInInterceptor()); String result = impl.sayHello("BOB"); System.out.println("client "+result); } }
2、使用拦截器进行用户名密码校验
服务端启动器以及拦截器(前面的接口发布不变)
package com.atguigu.day01_ws.ws.server; import java.util.List; import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws22.EndpointImpl; import org.apache.cxf.message.Message; import com.atguigu.day01_ws.interceptor.CheckUserInterceptor; import com.atguigu.day01_ws.ws.HelloWSImpl; public class ServerTest4 { public static void main(String[] args) { String address = "http://192.168.10.165:8888/day01_ws/datatypews"; Endpoint endpoint = Endpoint.publish(address,new HelloWSImpl()); System.out.println(endpoint); EndpointImpl endpointImpl = (EndpointImpl) endpoint; //服务端的入拦截器 List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getininterceptors(); inInterceptors.add(new CheckUserInterceptor()); System.out.println("发布webservice成功!"); } }
package com.atguigu.day01_ws.interceptor; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.soapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; /** * 查检用户的拦截器 * @author xfzhang * */ public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public CheckUserInterceptor() { super(Phase.PRE_PROTOCOL);//在解析时候拦截 } /* <Envelope> <head> <atguigu> <name>xfzhang</name> <password>123456</password> </atguigu> <atguigu2> <name>xfzhang</name> <password>123456</password> </atguigu2> <head> <Body> <sayHello> <arg0>BOB</arg0> <sayHello> </Body> </Envelope> */ @Override public void handleMessage(SoapMessage message) throws Fault { Header header = message.getHeader(new QName("atguigu")); if(header!=null) { Element atguiguEle = (Element) header.getobject(); String name = atguiguEle.getElementsByTagName("name").item(0).getTextContent(); String password = atguiguEle.getElementsByTagName("password").item(0).getTextContent(); if("xfzhang".equals(name) && "123456".equals(password)) { System.out.println("Server 通过拦截器...."); return; } } //不能通过 System.out.println("Server 没有通过拦截器...."); throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码!")); } }
客户端
package com.atguigu.day01_ws_cxf_client.test; import java.util.List; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.message.Message; import com.atguigu.day01_ws.ws.HelloWS; import com.atguigu.day01_ws.ws.HelloWSImplService; import com.atguigu.day01_ws_cxf_client.interceptor.AddUserInterceptor; /* * 测试自定义拦截器 */ public class ClientTest4 { public static void main(String[] args) { HelloWSImplService factory = new HelloWSImplService(); HelloWS hellWS = factory.getHelloWSImplPort(); //发送请求的客户端对象 Client client = ClientProxy.getClient(hellWS); //客户端的自定义出拦截器 List<Interceptor<? extends Message>> outInterceptors = client.getoutInterceptors(); outInterceptors.add(new AddUserInterceptor("xfzhang","1234564")); String result = hellWS.sayHello("BOB"); System.out.println("client "+result); } }
package com.atguigu.day01_ws_cxf_client.interceptor; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.soapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.apache.xml.utils.DOMHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String name; private String password; public AddUserInterceptor(String name,String password) { super(Phase.PRE_PROTOCOL);//准备协议化时拦截 this.name = name; this.password = password; } /* <Envelope> <head> <atguigu> <name>xfzhang</name> <password>123456</password> </atguigu> <atguigu2> <name>xfzhang</name> <password>123456</password> </atguigu2> <head> <Body> <sayHello> <arg0>BOB</arg0> <sayHello> </Body> </Envelope> */ @SuppressWarnings("deprecation") @Override public void handleMessage(SoapMessage msg) throws Fault { List<Header> headers = msg.getHeaders(); /* <atguigu> <name>xfzhang</name> <password>123456</password> </atguigu> */ Document document = DOMHelper.createDocument(); Element rootEle = document.createElement("atguigu"); Element nameELe = document.createElement("name"); nameELe.setTextContent(name); rootEle.appendChild(nameELe); Element passwordELe = document.createElement("password"); passwordELe.setTextContent(password); rootEle.appendChild(passwordELe); headers.add(new Header(new QName("atguigu"),rootEle)); System.out.println("client handleMessage()...."); } }
六、基于CXF Spring 的webService开发
描述:本次讲解中使用了Spring Cxf 框架进行开发webService,目前没有纯cxf的开发,纯cxf开发只是加入包,辅助JDK的开发(传递数据格式,拦截器)
下面的源码中包含了第七大点和第八大点的项目清单
同时生成webService客户端文件还是一样方法 wsimport -keep url
Java包下载地址:http://download.csdn.net/detail/u014201191/8661707
1、服务端开发
① 项目清单
① 顺序源码
package com.atguigu.day01_ws.interceptor; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.soapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; /** * 查检用户的拦截器 * @author xfzhang * */ public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public CheckUserInterceptor() { super(Phase.PRE_PROTOCOL); System.out.println("CheckUserInterceptor()"); } /* <Envelope> <head> <atguigu> <name>xfzhang</name> <password>123456</password> </atguigu> <atguigu2> <name>xfzhang</name> <password>123456</password> </atguigu2> <head> <Body> <sayHello> <arg0>BOB</arg0> <sayHello> </Body> </Envelope> */ @Override public void handleMessage(SoapMessage message) throws Fault { Header header = message.getHeader(new QName("atguigu")); if(header!=null) { Element atguiguEle = (Element) header.getobject(); String name = atguiguEle.getElementsByTagName("name").item(0).getTextContent(); String password = atguiguEle.getElementsByTagName("password").item(0).getTextContent(); if("xfzhang".equals(name) && "123456".equals(password)) { System.out.println("Server 通过拦截器...."); return; } } //不能通过 System.out.println("Server 没有通过拦截器...."); throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码!")); } }
package com.atguigu.day02_ws_cxf_spring.bean; public class Order { private int id; private String name; private double price; public Order(int id,double price) { super(); this.id = id; this.name = name; this.price = price; } public Order() { super(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Order [id=" + id + ",price=" + price + "]"; } }
package com.atguigu.day02_ws_cxf_spring.ws; import javax.jws.WebMethod; import javax.jws.WebService; import com.atguigu.day02_ws_cxf_spring.bean.Order; @WebService public interface OrderWS { @WebMethod public Order getorderById(int id); }
package com.atguigu.day02_ws_cxf_spring.ws; import javax.jws.WebService; import com.atguigu.day02_ws_cxf_spring.bean.Order; @WebService public class OrderWSImpl implements OrderWS { public OrderWSImpl() { System.out.println("OrderWSImpl()"); } @Override public Order getorderById(int id) { System.out.println("server getorderById() "+id); return new Order(id,"飞机",10000000); } }
① bean.xml
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/jaxws"> <!-- 引cxf的一些核心配置 --> <import resource="classpath:meta-inf/cxf/cxf.xml" /> <import resource="classpath:meta-inf/cxf/cxf-extension-soap.xml" /> <import resource="classpath:meta-inf/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="orderWS" implementor="com.atguigu.day02_ws_cxf_spring.ws.OrderWSImpl" address="/orderws"> <!-- <jaxws:inInterceptors> <bean class="com.atguigu.day01_ws.interceptor.CheckUserInterceptor"></bean> </jaxws:inInterceptors> --> </jaxws:endpoint> </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"> <!-- 配置beans.xml --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <!-- 应用启动的一个监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 所有请求都会先经过cxf框架 --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
2、客户端开发
① 项目清单
① 顺序源码
package com.atguigu.day01_ws_cxf_client.interceptor; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.soapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.apache.xml.utils.DOMHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String name; private String password; public AddUserInterceptor(String name,String password) { super(Phase.PRE_PROTOCOL);//准备协议化时拦截 this.name = name; this.password = password; System.out.println("AddUserInterceptor()...."); } /* <Envelope> <head> <atguigu> <name>xfzhang</name> <password>123456</password> </atguigu> <atguigu2> <name>xfzhang</name> <password>123456</password> </atguigu2> <head> <Body> <sayHello> <arg0>BOB</arg0> <sayHello> </Body> </Envelope> */ @SuppressWarnings("deprecation") @Override public void handleMessage(SoapMessage msg) throws Fault { List<Header> headers = msg.getHeaders(); /* <atguigu> <name>xfzhang</name> <password>123456</password> </atguigu> */ Document document = DOMHelper.createDocument(); Element rootEle = document.createElement("atguigu"); Element nameELe = document.createElement("name"); nameELe.setTextContent(name); rootEle.appendChild(nameELe); Element passwordELe = document.createElement("password"); passwordELe.setTextContent(password); rootEle.appendChild(passwordELe); headers.add(new Header(new QName("atguigu"),rootEle)); System.out.println("client handleMessage()...."); } }
package com.atguigu.day02_ws_cxf_spring.test; import org.springframework.context.support.ClasspathXmlApplicationContext; import com.atguigu.day02_ws_cxf_spring.ws.Order; import com.atguigu.day02_ws_cxf_spring.ws.OrderWS; public class ClientTest { public static void main(String[] args) { ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[] {"client-beans.xml"}); OrderWS orderWS = (OrderWS) context.getBean("orderClient"); Order order = orderWS.getorderById(24); System.out.println(order); } }
① client-beans.xml
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/jaxws"> <jaxws:client id="orderClient" serviceClass= "com.atguigu.day02_ws_cxf_spring.ws.OrderWS" address= "http://localhost:8088/day02_ws_cxf_spring/orderws?wsdl"> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> <bean class="com.atguigu.day01_ws_cxf_client.interceptor.AddUserInterceptor"> <constructor-arg name="name" value="xfzhang"/> <constructor-arg name="password" value="123456"/> </bean> </jaxws:outInterceptors> </jaxws:client> </beans>
七、Ajax、jQuery、HttpUrlConnection请求webService
解析:在index.jsp这个页面中,js方法中有var data = '<soapenv:Envelope>' 这个就是我们在日志拦截器中打印得到的请求体,同样在js回调函数中,使用ajaxyq.responseXML获得响应体,直接就转换成了XML数据,获取其返回值;下面的jQuery和httpcontentservlet请求也在这个页面中包含了;
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> <script type="text/javascript" src="jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ $("#btn2").click(function(){ var name = document.getElementById("name").value; $.post( "HttpURLConnectionServlet","name="+name,function(msg) { //alert(msg); var $Result = $(msg); var value = $Result.find("return").text(); alert(value); },"xml" ); }); $("#btn").click(function(){ //回调函数 var name = document.getElementById("name").value; var data = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://ws.day01_ws.atguigu.com/"><arg0>'+name+'</arg0></ns2:sayHello></soap:Body></soap:Envelope>'; //alert(data); /* $.post( "http://192.168.10.165:8888/day01_ws/datatypews",data,function(msg){ alert("------"); var $Result = $(msg); var value = $Result.find("return").text(); alert(value); },"xml" ); */ $.ajax({ type : "post",url : "http://192.168.10.165:8888/day01_ws/datatypews",data : data,success : function(msg){ alert("------"); var $Result = $(msg); var value = $Result.find("return").text(); alert(value); },error : function(msg) { //alert("-----"+msg); },dataType : "xml" }); }); }); function reqWebService() { var name = document.getElementById("name").value; var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ws.day01_ws.atguigu.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><q0:sayHello><arg0>'+name+'</arg0></q0:sayHello></soapenv:Body></soapenv:Envelope>'; //XMLHttpRequest对象 var request = getRequest(); request.onreadystatechange = function(){ if(request.readyState==4 && request.status==200) { var result = request.responseXML; alert(result); var returnEle = result.getElementsByTagName("return")[0]; var value = returnEle.firstChild.data; alert(returnEle); alert(value); } }; request.open("POST","http://localhost:8888/day01_ws/datatypews"); request.setRequestHeader("Content-type","application/x-www-form-urlencoded"); request.send(data); } function getRequest() { var xmlHttp = null; try { // Firefox,Opera 8.0+,Safari chrome xmlHttp = new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp; } </script> </head> <body> 用户名: <input id="name" name="username" value="" /> <br> <button onclick="reqWebService()">AJax请求webservice</button> <button id="btn">Jquery请求webservice</button> <button id="btn2">HttpURLConnection请求webservice</button> </body> </html>
完结-------谢谢观看
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。