day63-webservice 10.jquery的调用webservice小练习
客户端是采用jquery方式来做调用.但是这种调用,因为jquery这种调用你就得有消息体.我们得先拿到这种消息体.PersonService这个服务类有两个方法.
http://localhost:8080/cxf-web-server1/service/person?wsdl
http://localhost:8080/cxf-web-server1/service/person?wsdl是SOAP1.1才有用,SOAP1.2不行.
请求的消息体:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://person.web.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <q0:addPerson> <arg0> <address>北京</address> <gender>男</gender> <name>任亮</name> </arg0> </q0:addPerson> </soapenv:Body> </soapenv:Envelope>
响应的消息体,查询的时候的消息体.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getPersonAllResponse xmlns:ns2="http://person.web.rl.com/"><return><address>北京</address><gender>男</gender><name>任亮</name></return></ns2:getPersonAllResponse></soap:Body></soap:Envelope>
写客户端/cxf-web-4jquery-client/WebRoot/jquery_person_ws.html点添加的时候要调一次,点查询的时候又调一次.
服务的类的地址,服务的类的地址具体调哪一个方法.
上一节课的疑问,Ajax里面指定好了这是服务的类.但是没有指定具体我们要请求哪一个方法?直接从消息体就能分析出来我们是请求哪一个方法.
分析WSDL文档,从服务访问点集合PersonServiceService找到portType——PersonService之后.portType——PersonService就有了两个operation——addPerson和getPersonAll.每一个方法operation(报文)里面都有一个输入消息和输出消息.那么这个消息具体的约束是由谁约束?是由上面的这些Schema跟你做好了这种约束.那么它如何识别你调用哪个方法是根据消息来识别的.如果你传的是getPersonAll()这个消息,WebService它就知道能解析这个消息.addPerson正好对应着的是谁呢?它能解析addPerson这个东西.addPerson它代表了你调用的是哪个方法.
<arg0> <address>北京</address> <gender>男</gender> <name>任亮</name> </arg0>
<arg0></arg0>是方法main的参数.它是根据这个消息体addPerson来识别的.你在Ajax传这么一个消息它就知道你是调用addPerson这么一个消息.点添加添加成功之后
请求消息从这拿一下.getPersonAll的请求消息是
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://person.web.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <q0:getPersonAll/> </soapenv:Body> </soapenv:Envelope>
会一个其他都会了.append和appendTo啥区别呢?
新版chrome浏览器需要添加Chrome插件/扩展程序Charset.
<!DOCTYPE html> <html> <head> <meta name="content-type" content="text/html; charset=UTF-8"> <title>jquery_person_ws.html</title> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript"> $(function(){ $("#add").click(function (){ //获得Person基本数据 var name = $("#pname").val();//name还是采用id选择器. var gender = $("#gender").val(); var address = $("#address").val(); //组装消息体 var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://person.web.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' + '<soapenv:Body>' + '<q0:addPerson>' + ' <arg0> ' + ' <address>'+address+'</address>' + ' <gender>'+gender+'</gender>' + ' <name>'+name+'</name>' + ' </arg0>' + ' </q0:addPerson>' + '</soapenv:Body>' + '</soapenv:Envelope>';//消息体 $.ajax({ //JSON对象 url:'http://localhost:8080/cxf-web-server1/service/person',//服务的类的地址,服务的类的地址具体调哪一个方法.Ajax里面指定好了这是服务的类.但是没有具体指定我们要请求哪一个方法.具体要请求哪一个方法? type:'post',//请求方式 dataType:'xml',//返回值的数据类型 contentType:'text/xml;charset=UTF-8',//指定发送的数据类型 data:data,//发送的消息体 success:function(responseText){//返回的是XML文档类型. //解析消息体 //var returnObj = $(responseText).find("return");//通过$把responseText换成jquery文档类型,jquery的文档类型.jquery的文档类型你用jquery来查找就更简单了. //通过jquery的方法来找return元素 //alert(returnObj.text()); alert("添加成功");//返回值就是void }, error:function(){ alert('system error');//加分号规范一些 } }); });//点击事件 $("#select").click(function (){ //组装消息体 var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://person.web.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +'<soapenv:Body>' +'<q0:getPersonAll/>' +'</soapenv:Body>' +'</soapenv:Envelope>';//消息体 $.ajax({ //JSON对象 url:'http://localhost:8080/cxf-web-server1/service/person',//服务的类的地址,服务的类的地址具体调哪一个方法.Ajax里面指定好了这是服务的类.但是没有具体指定我们要请求哪一个方法.具体要请求哪一个方法? //不用变,依然是请求的是这个服务类. type:'post',//请求方式 dataType:'xml',//返回值的数据类型 contentType:'text/xml;charset=UTF-8',//指定发送的数据类型 data:data,//发送的消息体 success:function(responseText){//返回的是XML文档类型. //解析消息体 //把响应的消息解析一下,解析之后给它添加到这个div里面来. $("#tdiv").empty(); var jqueryObj = $(responseText)//把responseText先转换成jquery对象,使用$把responseText转换成jquery object var returns = jqueryObj.find("return");//每一个return它是一个对象 var result = ''; returns.each(function() { //循环它可以拿到每一个return,放到div里面去 //先把address等基本数据给它解析出来 var pname = $(this).find('name').text(); var address = $(this).find('address').text(); var gender = $(this).find('gender').text(); result = result + pname + " " +gender + " " + address + "<br>"; }); //returns不是一个对象,是一个数组 $("#tdiv").append(result);//根据id选择器拿到div }, error:function(){ alert('system error');//加分号规范一些 } }); });//点击事件 }); </script> </head> <body> 姓名:<input type="text" id="pname"><br> 性别:<input type="text" id="gender"><br> 地址 :<input type="text" id="address"><br> <input type="button" id="add" value="添加"> <input type="button" id="select" value="查询"> <div id="tdiv" style="border: 1px solid ;width: 400px;height: 400px;"> </div> </body> </html>
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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"> <!-- 使用Spring的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><!-- 初始化Spring的容器,cxf.xml本身就是一个Spring的容器.可以把cxf.xml作为Spring的容器进行加载. --> <!-- 能加载Spring文件的类,这个类叫什么? --> </listener> <context-param> <param-name>contextConfigLocation</param-name><!-- param-name不能再指定config-location,而是要指定ContextLoaderListener里面读取Spring文件的那个Key --> <param-value>classpath:cxf.xml</param-value> </context-param> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <!-- <init-param> <param-name>config-location</param-name> <param-value>classpath:cxf.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> --> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/service/*</url-pattern> <!-- 拦截这种请求 --> </servlet-mapping> </web-app>
<?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.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> <!-- 引入CXF Bean定义如下,早期的版本中使用 --> <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" /> <!-- =========================配置类的形式webservice服务================================== address:tomcat的host http://ip:port/projectName/service/后面的一端路径 implementor:指定具体的服务的类 --> <!-- <jaxws:endpoint id="hello" address="/hello" implementor="com.rl.web.server.HelloService"> --> <!-- 输入拦截器,打印输入的消息 --> <!-- <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:endpoint> --> <!-- =======================配置带有接口的webservice服务========================================= address:tomcat的host http://ip:port/projectName/service/后面的一端路径 http://ip:port/projectName/service/bye implementor:指定具体的服务的类 serviceClass:服务接口的类 --> <!-- <jaxws:server address="/bye" serviceClass="com.rl.web.server.inter.ByeInter"> --> <!-- 这里不是指定实例,而是指定实现类的类 服务接口的实现类 --> <!-- <jaxws:serviceBean> <bean class="com.rl.web.server.inter.ByeInterImpl"></bean> </jaxws:serviceBean> --> <!-- 输入拦截器,打印输入的消息 --> <!-- <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:server> --> <jaxws:server address="/person" serviceClass="com.rl.web.person.PersonService"> <!-- 这里不是指定实例,而是指定实现类的类 服务接口的实现类 --> <jaxws:serviceBean> <bean class="com.rl.web.person.PersonServiceImpl"></bean> </jaxws:serviceBean> <!-- 输入拦截器,打印输入的消息 --> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:server> </beans>
<?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.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> <!-- 引入CXF Bean定义如下,早期的版本中使用 --> <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" /> <!-- =========================配置类的形式webservice服务================================== address:tomcat的host http://ip:port/projectName/service/后面的一端路径 implementor:指定具体的服务的类 --> <!-- <jaxws:endpoint id="hello" address="/hello" implementor="com.rl.web.server.HelloService"> --> <!-- 输入拦截器,打印输入的消息 --> <!-- <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:endpoint> --> <!-- =======================配置带有接口的webservice服务========================================= address:tomcat的host http://ip:port/projectName/service/后面的一端路径 http://ip:port/projectName/service/bye implementor:指定具体的服务的类 serviceClass:服务接口的类 --> <!-- <jaxws:server address="/bye" serviceClass="com.rl.web.server.inter.ByeInter"> --> <!-- 这里不是指定实例,而是指定实现类的类 服务接口的实现类 --> <!-- <jaxws:serviceBean> <bean class="com.rl.web.server.inter.ByeInterImpl"></bean> </jaxws:serviceBean> --> <!-- 输入拦截器,打印输入的消息 --> <!-- <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:server> --> <!-- <jaxws:server address="/person" serviceClass="com.rl.web.person.PersonService"> --> <!-- 这里不是指定实例,而是指定实现类的类 服务接口的实现类 --> <!-- <jaxws:serviceBean> <bean class="com.rl.web.person.PersonServiceImpl"></bean> </jaxws:serviceBean> --> <!-- 输入拦截器,打印输入的消息 --> <!-- <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:server> --> </beans>