精华内容
下载资源
问答
  • webservice 远程调用

    2016-09-22 17:12:15
    webservice 远程调用技术 1.1 webservice 组成及原理:    Webservice是一种使用http传输SOAP协议的数据远程调用技术  wsdl:是一个xml文件 简单的说就是webservice的说明书  soap:简单对象访问协议  ...

     

      

    webservice 远程调用技术

    1.1 webservice 组成及原理:

          

              Webservice是一种使用http传输SOAP协议的数据远程调用技术

         wsdl:是一个xml文件  简单的说就是webservice的说明书

          soap:简单对象访问协议

         uudi:一种目录 (不重要)

       xml文件的阅读规则:

      

     targetNamespaces  名称空间

     portType 标签下的 name属性是实现类  massage属性是方法名称

     service 标签下的 name属性是service

    1.2 webservice 的入门案例:

                               服   务   端 

       第一步:  导入jar包

    /**
     * 创建接口
     * @author Administrator
     *
     */
    public interface WeatherInterface {
      public String getWeather(String str);
    }

      第二步:

    /**
     * 创建实现类  实现类要加 @WebService 表签
     * @author Administrator
     *
     */
    @WebService
    public class WeatherInterfaceImpl implements WeatherInterface {
    
    	@Override
    	public String getWeather(String str) {
    		System.out.println("我来了。。。。");
    		return str;
    	}
    }

      第三步:

    import javax.xml.ws.Endpoint;
    /**
     * 发布服务
     * @author Administrator
     *
     */
    public class WeatherServer {
      public static void main(String[] args) {
           //第一个参数服务地址
           //第二个参数实现类
    	Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
    }
    }

      第四步:测试服务是否发布成功    打开wsdl 阅读xml 文件

                    测试地址:http://127.0.0.1:12345/weather?wsdl

                                 客  户  端

       说明:dom 中

       命令wsimportjdk提供根据WSDL地址生成客户端代码的工具

       命令wsimport位置%JAVA_HOME%/bin

       命令wsimport常用的参数:

         -d指定生成*.class默认参数

         -s,指定生成*.java文件

         -p,指定代码生成包名,如果不加该参数,默认包名WSDL命名空间的倒序

                  命令wsimport仅支持SOAP1.1客户端生成

     第一步:wsimport生成代码   wsimport  -s  .  http://127.0.0.1:weather?wsdl              建立一个项目 导入生成的代码 导入jar包

      第二步:

    import test00.WeatherInterfaceImpl;
    import test00.WeatherInterfaceImplService;
    /**
     * 客户端
     * @author Administrator
     */
    public class WeatherClient {
      public static void main(String[] args) {
    	//创建service对象
    	WeatherInterfaceImplService weatherInterfaceService=new WeatherInterfaceImplService();
    	//获取实现类
    	WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceService.getPort(WeatherInterfaceImpl.class);
    	//调用方法
    	String weather = weatherInterfaceImpl.getWeather("晴");
    	System.out.println(weather);
    }
    }

     

    1.3 webservice 的四种客户端调用:

       说明:公网地址

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

         wsimport -s . http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl   生成查询天气的代码

       建一个项目  导入生成的代码  导入jar包

       第一种方式:

     

    import cn.com.webxml.ArrayOfString;
    import cn.com.webxml.WeatherWS;
    import cn.com.webxml.WeatherWSSoap;
    /**
     * 入门案例中就是用的这种
     * @author Administrator
     */
    public class demo01 {
    
    	public static void main(String[] args) {
    		WeatherWS weatherWS=new WeatherWS();
    		WeatherWSSoap weatherWSSoap = weatherWS.getPort(WeatherWSSoap.class);
    		ArrayOfString weather = weatherWSSoap.getWeather("北京", "");
    		List<String> list = weather.getString();
    		StringBuffer yp=new StringBuffer();
    		for(String str:list){
    			yp.append(str+" ");
    		}
    		System.out.println(yp);
    	}
    }

      第二种方式:

     

    /**
     * 用服务地址获取实现类  灵活
     * @author Administrator
     */
    public class demo02 {
    	
        public static void main(String[] args) throws MalformedURLException {
        	//服务地址
    	URL url=new URL("http://ws.webxml.com.cn/WebServices/WeatherWS.asmx");
    	//第一个参数名称空间   第二个参数是service标签的name属性
        	QName name=new QName("http://WebXml.com.cn/","WeatherWS");
        	Service service=Service.create(url, name);
        	//获取实现类
        	WeatherWSSoap weatherWSSoap = service.getPort(WeatherWSSoap.class);
        	//调用方法
        	ArrayOfString weather = weatherWSSoap.getWeather("原平", "");
        	List<String> list = weather.getString();
        	for(String str:list){
        		System.out.println(str);
        	}
    	}
    }

      第三种方式:

     

    /**
     * 利用HttpURLConnection实现调用
     * @author Administrator
     */
    public class demo03 {
        public static void main(String[] args) throws Exception {
        	//服务地址
    	URL url=new URL("http://ws.webxml.com.cn/WebServices/WeatherWS.asmx");
    	//打开链接
    	HttpURLConnection connection=(HttpURLConnection)url.openConnection();
    	//设置请求方式
    	connection.setRequestMethod("POST");
    	//设置mime类型  这是soap1.1的    soap1.2的是 "application/soap+xml;chartset=utf-8"
    	connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
    	//设置输入输出
    	connection.setDoOutput(true);
    	connection.setDoInput(true);
    	//输出请求体
    	OutputStream outputStream = connection.getOutputStream();
    	outputStream.write(getXml("太原").getBytes());
    	//如果响应成功
    	int i = connection.getResponseCode();
    	if(i==200){
    		InputStream inputStream = connection.getInputStream();
    		BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
    		String but=null;
    		StringBuilder der=new StringBuilder();
    		while(null!=(but=reader.readLine())){
    			der.append(but);
    	         }
    		byte[] bytes = der.toString().getBytes();
    		System.out.println(new String(bytes,"utf-8"));
    		reader.close();
    		inputStream.close();
    		}
    		outputStream.close();
    	}
        //请求体
        public static String getXml(String str){
        	String xmlSpoat="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    		          +" <soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
    			  +"  <soap:Body>"
    			  +"    <getWeather xmlns=\"http://WebXml.com.cn/\">"
    		          +"      <theCityCode>"+str+"</theCityCode>"
    		          +"      <theUserID></theUserID>"
    			  +"    </getWeather>"
    		          +"  </soap:Body>"
    		       +"</soap:Envelope>";
        	return xmlSpoat;
        }
    }

      第四种方式:基于ajax

     

    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<script >
    			function getMobile(){
    				alert(999);
    				var xml=new XMLHttpRequest();
    				
    				xml.open("post","http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl",true);
    				xml.setRequestHeader("context-type","text/html;charset=utf-8");
    				xml.onreadystatechange=function(){
    					if(xml.status==200 && xml.readyState==4){
    						var div=document.getElementById("div");
    						div.innerHTML(xml.responseText);
    					}
    				}
    				var soapXml='<?xml version="1.0" encoding="utf-8"?>'
           						+'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
    							+'	  <soap:Body>'
    							+'	    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">'
    							+'	      <mobileCode>"+document.getElementById("dd")+"</mobileCode>'
    							+'	      <userID></userID>'
    							+'	    </getMobileCodeInfo>'
    							+'	  </soap:Body>'
    							+'	</soap:Envelope>';
    				xml.send(soapXml);
    			}
    			
    		</script>
    	</head>
    	<body>
    		电话:<input type="text" id="dd" /><br/>
    		<input type="button" οnclick="getMobile()" /><br/>
    		<div id="div"></div>
    	</body>
    </html>
    

     

    1.3 webservice 基于cxf框架:

       1.3.1 cxf的介绍

        cxf:一个开源的webservice框架,提供很多成熟的功能,帮助我们快速开发

        cxf:支持的协议:SOAP1.1/1.2REST

                   cxf:支持的数据格式:XMLJSON(仅在REST支持)

      1.3.2 cxf的下载  安装

             http://cxf.apache.org/download.html

                第一步:安装前必须安装jdk 最好是1.7版本的  配置jdk的环境变量

                第二步: 解压下载完毕的apache-cxf-2.7.11

                第三步:配置cxf的环境变量

            



     

     

              第四步:
    测试是否配置成功在一个新的cmd窗口中输入wsdl2java -h

          

        
    1.3.3 cxf服务端和客户端代码

                     服    务    端     导入jar包

         第一步:

    /**
     * 接口  @BindingType(SOAPBinding.SOAP12HTTP_BINDING)  
     * 说明是soap1.2
     * @author Administrator
     */
    @WebService
    @BindingType(SOAPBinding.SOAP12HTTP_BINDING)
    public interface WeatherInterface {
       public String getWeather(String str);
    }

       第二步: 

    /**
     * 实现类
     * @author Administrator
     */
    public class WeatherInterfaceImpl implements WeatherInterface {
    	public String getWeather(String str) {
    		System.out.println("我来了。。。。");
    		return str;
    	}
    }

        第三步:

    /**
     * 基于cxf 的发布服务
     * @author Administrator
     */
    public class WeatherServer {
       public static void main(String[] args) {
    	  JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
    	  factoryBean.setServiceClass(WeatherInterface.class);
    	  factoryBean.setServiceBean(new WeatherInterfaceImpl());
    	  //设置服务地址
    	  factoryBean.setAddress("http://127.0.0.1:1314/weather");
    	  //发布
    	  factoryBean.create();
    }
    }

     

                         客    户    端

         说明:

        wsdl2java命令生成客户端代码
        命令wsdl2javaCXF提供的根据WSDL地址生成客户端代码的工具

        命令wsdl2java位置%CXF_HOME%\bin

        命令wsdl2java常用参数:

                      -d,生成java代码,指定代码的存放目录

                     -p指定代码生成包名,不指定该参数,默认包名WSDL命名空间的倒序

        命令wsdl2java支持SOAP1.1SOAP1.2生成

      

                 E:\workspace\wsimport\src>wsdl2java  -p  cn.itcast.cxf -d . http://127.0.0.1:12345/weather?wsd

         建一个新项目 导入生成的代码 导入jar包

         

    /**
     * 客户端 使用JaxWsProxyFactoryBean类获取
     * @author Administrator
     *
     */
    public class WeatherClient {
        public static void main(String[] args) {
    		JaxWsProxyFactoryBean factoryBean=new JaxWsProxyFactoryBean();
    		factoryBean.setServiceClass(WeatherInterface.class);
    		factoryBean.setAddress("http://127.0.0.1:1314/weather?wsdl");
    		//获取接口
    		WeatherInterface weatherInterface = factoryBean.create(WeatherInterface.class);
    		//调用方法
    		String weather = weatherInterface.getWeather("小风吹的凉爽");
    		System.out.println(weather);
    	}
    }

     1.3.4 cxf与spring的整合

          服务端:建一个项目 导入jar包
         第一步   web.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
    	xmlns="http://java.sun.com/xml/ns/javaee" 
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <!-- 加载applicationContext.xml -->
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      	<listener>
      	   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      	</listener>
      	
      	<!-- cxf服务 -->
      	<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.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    
       第二步: config下面的applicationContext.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"
    	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">
    	<!-- <jaxws:server>发布服务  -->
    	<jaxws:server address="/weather" serviceClass="cn.xebest.weather.WeatherInterface">
    		<jaxws:serviceBean>
    			<ref bean="weatherInterface"/>
    		</jaxws:serviceBean>
    		
    		<jaxws:inInterceptors>
    			<ref bean="inInterceptor"/>
    		</jaxws:inInterceptors>
    		<jaxws:outInterceptors>
    			<ref bean="outInterceptor"/>
    		</jaxws:outInterceptors>
    	</jaxws:server>
    	<!-- 配置拦截器 -->
    	<bean id="inInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
    	<bean id="outInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    	
    	<!-- 配置实现类的bean -->
    	<bean id="weatherInterface" class="cn.xebest.weather.WeatherInterfaceImpl"/>
    	
    </beans>
      第三步:接口
    /**
     * 接口  @BindingType(SOAPBinding.SOAP12HTTP_BINDING)  
     * 说明是soap1.2
     * @author Administrator
     */
    @WebService
    @BindingType(SOAPBinding.SOAP12HTTP_BINDING)
    public interface WeatherInterface {
       public String getWeather(String str);
    }
       第四步:实现类
    /**
     * 实现类
     * @author Administrator
     */
    public class WeatherInterfaceImpl implements WeatherInterface {
    	public String getWeather(String str) {
    		System.out.println("我来了。。。。");
    		return str;
    	}
    }
       
      客户端:
       在dom 中 用命令 wsdl2java  生成代码
       建一个项目 导入生成的代码 导入jar包
      第一步: config 下的 applicationContext.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"
    	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">
    	<jaxws:client id="weatherInterface" address="http://127.0.0.1:8090/webservice00/ws/weather?wsdl"
    	 serviceClass="cn.xebest.weather.WeatherInterface"/>
    	
    </beans>
      第二步:获取配置文件
    /**
     * 获取xml 文件
     * @author Administrator
     */
    public class test05 {
       public static void main(String[] args) {
    	 ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    	 WeatherInterface weatherInterface = (WeatherInterface) context.getBean("weatherInterface");
    	 String weather = weatherInterface.getWeather("原平的天气也很好");
    	 System.out.println(weather);
    }
    }
      
     1.3.5 cxf与spring的综合案例
        说明:根据地址:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl 先获取到手机的服务 再把获取到的手机服务发布
        在dom中用命令生成 天气服务http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl的代码 导入项目中  导入所需jar包

       第一步:接口 MobileInterface

     

    /**
     * 接口
     * @author Administrator
     */
    @WebService
    @BindingType(SOAPBinding.SOAP12HTTP_BINDING)
    public interface MobileInterface {
       public String getMobile(String str);
    }

       第二步:实现类 MobileInterfaceImpl

     

    /**
     * 实现类
     * @author Administrator
     */
    public class MobileInterfaceImpl implements MobileInterface {
    	//声明要获取的天气的实现类
    	public MobileCodeWSSoap mobileCodeWSSoap;
    	//set方法是为了能在配置文件中给这个属性赋值
    	public void setMobileCodeWSSoap(MobileCodeWSSoap mobileCodeWSSoap) {
    		this.mobileCodeWSSoap = mobileCodeWSSoap;
    	}
        //要发布的方法
    	public String getMobile(String str) {
    		return mobileCodeWSSoap.getMobileCodeInfo(str, "");
    	}
    
    }

       第三步:定义servlet类 Mobile

     

    /**
     * 自定义的servlet类  继承HttpServlet
     * @author Administrator
     *
     */
    public class Mobile extends HttpServlet {
        //get的请求
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    	}
    	//post请求
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		MobileInterfaceImpl mobileInterfaceImpl;
            WebApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
            mobileInterfaceImpl=(MobileInterfaceImpl) context.getBean("mobileInterfaceImpl");
            
            request.setCharacterEncoding("utf-8");
            String num=request.getParameter("mobileNum");
            num=mobileInterfaceImpl.getMobile(num);
            request.setAttribute("num",num);
            request.getRequestDispatcher("/form.jsp").forward(request, response);
    		System.out.println("请求来了");
    	}
    }
    

     

      第四步:配置web.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
    	xmlns="http://java.sun.com/xml/ns/javaee" 
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>	
      <!-- 加载spring 配置文件 -->
      <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!-- 加载cxf服务 -->
      <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>/mobile/*</url-pattern>
      </servlet-mapping>
      <!-- 配置自定义的servlet -->
       <servlet>
        <servlet-name>Mobile</servlet-name>
        <servlet-class>cn.xebest.mobile.Mobile</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Mobile</servlet-name>
        <url-pattern>/mobile.action</url-pattern>
      </servlet-mapping>
      
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

      第五步:config 下的applicationContext.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"
    	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">
    	<!-- 服务端 -->
    	<jaxws:server id="mobileInterface" serviceClass="cn.xebest.mobile.MobileInterface" address="/address">
    	    <jaxws:serviceBean>
    	       <ref bean="mobileInterfaceImpl"/>
    	    </jaxws:serviceBean>
    	</jaxws:server>
    	<!-- 给属性赋值 -->
    	<bean id="mobileInterfaceImpl" class="cn.xebest.mobile.MobileInterfaceImpl">
    	   <property name="mobileCodeWSSoap" ref="mobileCodeWSSoap" />
    	</bean>
    	
    	<!-- 客户端  获取公网的数据-->
    	<jaxws:client id="mobileCodeWSSoap" address="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl" serviceClass="cn.com.webxml.MobileCodeWSSoap"></jaxws:client>			            
    </beans>				            

     第六步:form.jsp

     

    <%@ 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>
    </head>
    <body>
    <form action="${pageContext.request.contextPath}/mobile.action" method="post" οnsubmit="return sub()">
      <input type="text" name="mobileNum"  />
      <input type="submit" value="submit">
    </form>
    ${num}
    </body>
    </html>

       127.0.0.1:8090/项目名/mobile/address?wsdl

     

    1.4 webservice 基于cxf框架的rest风格:(cxf是能实现rest风格的框架)

        1.4.1 普通的发布:

         建立项目  导入jar包

       第一步:实体类

     

    /**
     * 在这个类上面必须有此标签 name 的值谁编写
     * @author Administrator
     */
    @XmlRootElement(name="student")
    public class Student implements Serializable{
    	 private String name;
    	    private String sex;
    	    private String age;
    		public String getName() {
    			return name;
    		}
    		public void setName(String name) {
    			this.name = name;
    		}
    		public String getSex() {
    			return sex;
    		}
    		public void setSex(String sex) {
    			this.sex = sex;
    		}
    		public String getAge() {
    			return age;
    		}
    		public void setAge(String age) {
    			this.age = age;
    		}
    }

      第二步:接口

     

    @WebService
    @Path("/student")//类的路径
    public interface StudentInterface {
        
    	@GET//get请求
    	@Path("/string/{id}")//方法的路径  id是参数  在方法中用@PathParam获取
    	@Produces(MediaType.APPLICATION_XML)//xml格式
    	public Student getString(@PathParam("id")String id);
    		
    	@GET
    	@Path("/list/{id}")
    	//可以是xml 也可以是 json
        @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
    	public List<Student> getList(@PathParam("id")String id);
    }

      第三步: 实现类

     

    public class StudentInterfaceImpl implements StudentInterface{
    
    	@Override
    	public Student getString(String id) {
    		Student t=new Student();
    		t.setName("小刚");
    		t.setAge("18");
    		t.setSex("男");
    		if(StringUtils.isNotBlank(id)){
    			return t;
    		}
    		return null;
    	}
    
    	@Override
    	public List<Student> getList(String id) {
    		Student t1=new Student();
    		t1.setName("小刚");
    		t1.setAge("18");
    		t1.setSex("男");
    		Student t2=new Student();
    		t2.setName("小刚");
    		t2.setAge("18");
    		t2.setSex("男");
    		Student t3=new Student();
    		t3.setName("小刚");
    		t3.setAge("18");
    		t3.setSex("男");
    		@SuppressWarnings("unused")
    		List<Student> list=new ArrayList<Student>();
    		list.add(t1);
    		list.add(t2);
    		list.add(t3);
    		if(StringUtils.isNotBlank(id)){
    			return list;
    		}
    		return null;
    	}
    
    }

     第四步:发布服务

     

    /**
     * rest发布服务
     * @author Administrator
     *
     */
    public class StudentServer {
    
    	public static void main(String[] args) {
    		//rest框架的api
    		JAXRSServerFactoryBean factroyBean=new JAXRSServerFactoryBean();
    		factroyBean.setAddress("http://127.0.0.1:1232/server");
    		factroyBean.setResourceClasses(StudentInterfaceImpl.class);
    		factroyBean.create();
    	}
    }

       http:127.0.0.1:1232/server/student/list/99?_type=json   //获取json格式

       http:127.0.0.1:1232/server/student/list/99?_type=xml   //获取xml格式

       http:127.0.0.1:1232/server/student/string/99                //获取xml格式

       

      1.4.2 rest与spring整合的发布:

       建立项目  导入jar包

      第一步:实体类

     

    package cn.xebest.rest;
    
    import javax.xml.bind.annotation.XmlRootElement;
    /**
     * 实体类   
     * 此处必须有标签 @XmlRootElement
     * @author Administrator
     *
     */
    @XmlRootElement(name="student")
    public class Student {
    		private String name;
    		private String age;
    		private String sex;
    	   public Student() {
    			super();
    		}
    		public Student(String name,String age,String sex){
    			   this.name=name;
    			   this.age=age;
    			   this.sex=sex;
    		   }
    		public String getName() {
    			return name;
    		}
    		public void setName(String name) {
    			this.name = name;
    		}
    		public String getAge() {
    			return age;
    		}
    		public void setAge(String age) {
    			this.age = age;
    		}
    		public String getSex() {
    			return sex;
    		}
    		public void setSex(String sex) {
    			this.sex = sex;
    		} 
    		   
    }
    

     

       第二步:接口

      

    @WebService
    @Path("/student")
    public interface StudentInterface {
    
    	@GET
    	@Path("/string/{id}")
    	@Produces(MediaType.APPLICATION_XML)
    	public Student getStudent(@PathParam("id")String id);
    	
    	@GET
    	@Path("/list/{id}")
    	@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
    	public List<Student> getList(@PathParam("id")String dd);
    }

       第三步:实现类

     

    public class StudentInterfaceImpl implements StudentInterface {
    
    	public Student getStudent(String id) {
    		Student t=new Student("小明","21","男");
    		if(StringUtils.isNotBlank(id)){
    			return t;
    		}
    		return null;
    	}
    
    	public List<Student> getList(String dd) {
    		Student t1=new Student("小明","21","男");
    		Student t2=new Student("小明","21","男");
    		Student t3=new Student("小明","21","男");
    		List<Student> list=new ArrayList<Student>();
    		if(StringUtils.isNotBlank(dd)){
    			list.add(t1);
    			list.add(t2);
    			list.add(t3);
    			return list;
    		}
    		return null;
    	}
    
    }

     

     第四步:config下的 applicationContext.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"
    	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">
    	<jaxrs:server address="/address" >
    	    <jaxrs:serviceBeans>
    	      <ref bean="studentInterfaceImpl"/>
    	    </jaxrs:serviceBeans>
    	</jaxrs:server>
    	<bean id="studentInterfaceImpl" class="cn.xebest.server.StudentInterfaceImpl"></bean>			            
    </beans>				           

     第五步:web.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
    	xmlns="http://java.sun.com/xml/ns/javaee" 
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>	
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      
      <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>/server/*</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

       http:127.0.0.1:8090/项目名/server/address/student/string/99

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • webservice远程调用

    2018-09-29 17:11:12
    webservice就是远程调用技术,也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行...

    webservice

    webservice就是远程调用技术,也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

    XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

    Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

    WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
    WSDL 元素 [1] 基于XML语法描述了与服务进行交互的基本元素:
    Type(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD)。
    Message(消息):通信数据的抽象类型化定义,它由一个或者多个 part 组成。
    Part:消息参数
    Operation(操作):对服务所支持的操作进行抽象描述,WSDL定义了四种操作: 1.单向(one-way):端点接受信息;2.请求-响应(request-response):端点接受消息,然后发送相关消息;3.要求-响应(solicit-response):端点发送消息,然后接受相关消息;4.通知(notification [2] ):端点发送消息。
    Port Type(端口类型):特定端口类型的具体协议和数据格式规范。
    Binding:特定端口类型的具体协议和数据格式规范。
    Port:定义为绑定和网络地址组合的单个端点。
    Service:相关端口的集合,包括其关联的接口、操作、消息等。

    1.实现如下功能 客户端输入手机号,调用服务器端 返回对应的运营商 。

    package com.neusoft.server;
    
    public interface WebServiceTest {
    
    	public String yunyingshang(String phonenum);
    }
    
    
    package com.neusoft.server;
    
    import javax.jws.WebService;
    
    @WebService
    public class WebServiceTestImpl implements WebServiceTest{
    
    	
    	public String yunyingshang(String phonenum) {
    		String yys=null;
    		if(phonenum.startsWith("138")) {
    			yys=phonenum+":中国移动";
    		}else if(phonenum.startsWith("133")) {
    			yys=phonenum+":中国电信";
    		}else if(phonenum.startsWith("186")) {
    			yys=phonenum+":中国联通";
    		}else {
    			yys=phonenum+":未知运营商";
    		}
    		return yys;
    	}
    
    
    }
    
    
    package com.neusoft;
    
    import javax.xml.ws.Endpoint;
    
    import com.neusoft.server.WebServiceTest;
    import com.neusoft.server.WebServiceTestImpl;
    
    public class StartApp {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//供外界访问的url地址
    		String url="http://127.0.0.1:8082/webservice/server1";
    		WebServiceTest ws=new WebServiceTestImpl();
    		Endpoint.publish(url,ws );
    		System.out.println("webserviceserver1 发布成功");
    	}
    
    }
    
    

    访问对应的发布地址可以看到wsdl xml格式的信息
    在这里插入图片描述

    新建一个客户端

    找到客户端文件目录位置
    在这里插入图片描述

    打开cmd命令 执行 wsimport -s 我们这个项目的src路径 -keep 我们发布的webservice地址
    在这里插入图片描述

    eclipse中刷新项目,就会发现系统自动帮我们生成了许多类
    接着我们写一个测试客户端类。

    在这里插入图片描述

    展开全文
  • webService远程调用报错设置.doc
  • java项目REST方式使用Jersey技术实现webservice远程调用,内附使用说明文档和Jersey包,方便学习和查阅,最重要的是我的资源优势就是物美价廉哟~~
  • Webservice使用http传输SOAP协议的数据的一种远程调用技术 Webservice入门程序 服务端 第一步:创建SEI接口 第二步:创建SEI实现类,加入@WebService 第三步:发布服务,用Endpoint
    1       课程回顾
    • 什么是webservice
    • 远程调用技术:系统和系统之间的调用,获取远程系统里的业务数据
    • Webservice使用http传输SOAP协议的数据的一种远程调用技术
    • Webservice入门程序
    • 服务端
      • 第一步:创建SEI接口
      • 第二步:创建SEI实现类,加入@WebService
      • 第三步:发布服务,用Endpoint的publish方法,两个参数,1.服务地址;2.实现类
      • 第四步:测试服务,通过阅读使用说明书,确定接口、方法、参数和返回值存在,说明书服务发布成功
        • WSDL地址:服务地址+?wsdl
        • WSDL阅读方式:从下往上,service>binding>portType>方法、参数和返回值
    • 客户端
      • 第一步:使用wsimport命令生成客户端代码
      • 第二步:创建服务视图,从service的name属性获取
      • 第三步:获取服务类,从portType的name属性获取
      • 第四步:调用查询方法,从operation标签的name属性获取
    • Webservice优缺点:
      • 优点:使用http发送数据,跨防火墙;使用XML封装数据,跨平台;支持面向对象
      • 缺点:使用XML封装,需要额外传输标签,性能较差
    • Webservice应用场景
    • 宏观
      • 软件集成和复用
    • 微观
      • 适用场景:
        • 不考虑性能,不考虑客户端类型,建议使用webservice
        • 服务端已经确定webservice,客户端只能使用webservice
      • 不适用:
        • 考虑性能时,不建议使用webservice
        • 同构程序不建议使用webservice。
    • Webservice三要素
    • WSDL:
      • 定义:web服务描述语言,他是webservice服务端的使用说明书,说明服务、接口、方法、参数和返回值,他是伴随服务发布成功,自动生成,无需编写
      • 文档结构:
        • Service
        • Binding
        • portType
        • message
        • types
      • 阅读方式:从下往上
    • SOAP:
      • 定义:SOAP即简单对象访问协议,他是使用http传输XML格式的数据,跨平台,跨防火墙,他不是webservice专有协议
      • Soap=http+xml
      • 协议格式:
        • 必有:envelope和body
        • 非必有:header和fault
      • SOAP1.11.2区别
        • 相同点:
    都是用POST发送请求
    协议格式都相同:都有envelopebody标签
     
      • 不同点
    Content-type不同:
    SOAP1.1text/xml;charset=utf-8;SOAP1.2,application/soap+xml;charset=utf-8
    命名空间不同:
    • Webservice的四种客户端调用方式
    • 生成客户端的调用方式
    • Service编程调用方式
    • HttpURLConnecton调用方式
    • Ajax调用方式
    • 深入开发:用注解修改WSDL内容
    • @Webservice
    • @WebMethod
    • @WebParam
    • @WebResult
    • 修改完WSDL之后,需要重新生成客户端
     
    CXF
     
    2       课程安排:
    • CXF的介绍、安装和配置
    • CXF发布SOAP协议的服务
    • CXF+Spring整合发布SOAP的服务
    • CXF发布REST服务
    • 什么是REST
    • CXF+Spring整合发布REST服务
    • 综合案例
     
    3       CXF介绍、安装和配置
    3.1   CXF介绍
    • CXF是一个开源的webservice框架,提供很多完善功能,可以实现快速开发
    • CXF支持的协议:SOAP1.1/1.2REST
    • CXF支持数据格式:XMLJSON(仅在REST方式下支持)
     
    3.2   CXF的安装和配置
    • 下载地址
    http://cxf.apache.org/download.html
    • 包结构介绍
    • 安装和配置
     
    • 第一步:安装JDK,建议1.7
    • 第二步:解压apache-cxf-2.7.11.zip到指定目录,创建CXF_HOME
    • 第三步:把CXF_HOME加入到Path路径下
    • 第四步:测试,在cmd下加入wsdl2java –h
     
     
    • 如果不想使用IDE(比如Eclipse),需要在环境变量下配置如下信息
     
     
    4       CXF发布SOAP协议的服务
    4.1   需求
    服务端:发布服务,接收客户端的城市名,返回天气数据给客户端
    客户端:发送城市名给服务端,接收服务端的响应信息,打印
     
    4.2   实现
    4.2.1  服务端
    开发步骤:
    第一步:导入Jar
    第二步:创建SEI接口,要加入@WebService
    package cn.itcast.ws.cxf.server;
    importjavax.jws.WebService;
    /**
    *
    * <p>Title: WeatherInterface.java</p>
    * <p>Description:SEI接口</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日上午9:47:43
    * @version 1.0
    */
    @WebService
    publicinterface WeatherInterface {
    public String queryWeather(String cityName);
    }
     
    第三步:创建SEI实现类
    package cn.itcast.ws.cxf.server;
    /**
    *
    * <p>Title: WeatherInterfaceImpl.java</p>
    * <p>Description:SEI实现类</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日上午9:50:59
    * @version 1.0
    */
    publicclass WeatherInterfaceImpl implements WeatherInterface {
    @Override
    public String queryWeather(String cityName) {
    System.out.println("from client..."+cityName);
    if("北京".equals(cityName)){
    return"冷且霾";
    } else {
    return"暖且晴";
    }
    }
    }
     
     
    第四步:发布服务,JaxWsServerFactoryBean发布,设置3个参数,1.服务接口;2.服务实现类;3.服务地址;
    endpoint仅支持发布实现类,JaxWsServerFactoryBean支持发布接口。
     
    package cn.itcast.ws.cxf.server;
    import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
    importorg.apache.cxf.tools.java2wsdl.processor.internal.jaxws.generator.JaxwsServerGenerator;
    /**
    *
    * <p>Title: WeatherServer.java</p>
    * <p>Description:服务端</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日上午9:51:36
    * @version 1.0
    */
    publicclass WeatherServer {
    publicstaticvoid 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.create();
    }
    }
     
     
    第五步:测试服务是否发布成功,阅读使用说明书,确定关键点
    如果在CXF发布的服务下,直接访问服务地址,会如下异常
    此时直接访问使用说明书地址即可
     
    4.2.1.1        发布SOAP1.2的服务端
    • 在接口上加入如下注解:
    @BindingType(SOAPBinding.SOAP12HTTP_BINDING)
    • 重新发布服务端
     
    4.2.1.2        拦截器
    • 原理:
    • 拦截器可以拦截请求和响应
    • 拦截器可以有多个
    • 拦截器可以根据需要自定义
     
    • 使用
    • 拦截器必须加到服务端,在服务端发布之前
     
    • 获取拦截器列表,将自己的拦截器加入列表中
     
     
     
    4.2.2  客户端
    第一步:生成客户端代码
    • Wsdl2java命令是CXF提供的生成客户端的工具,他和wsimport类似,可以根据WSDL生成客户端代码
    • Wsdl2java常用参数:
             -d,指定输出目录
             -p,指定包名,如果不指定该参数,默认包名是WSDL的命名空间的倒序
    • Wsdl2java支持SOAP1.1SOAP1.2
     
    第二步:使用说明书,使用生成代码调用服务端
             JaxWsProxyFactoryBean调用服务端,设置2个参数,1.设置服务接口;2.设置服务地址
     
    package cn.itcast.cxf.client;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import cn.itcast.cxf.weather.WeatherInterface;
    /**
    *
    * <p>Title: WeatherClient.java</p>
    * <p>Description:客户端</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日上午10:12:24
    * @version 1.0
    */
    publicclass WeatherClient {
    publicstaticvoid 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.queryWeather("保定");
    System.out.println(weather);
    }
    }
     
     
    5       CXF+Spring整合发布SOAP协议的服务
    5.1   服务端
    开发步骤:
    第一步:创建web项目(引入jar包)
     
    第二步:创建SEI接口
     
    第三步:创建SEI实现类
     
    第四步:配置spring配置文件,applicationContext.xml<jaxws:server标签发布服务,设置1.服务地址;2.设置服务接口;3设置服务实现类
    <?xmlversion="1.0"encoding="UTF-8"?>
    <beansxmlns="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">
    <!-- <jaxws:server发布SOAP协议的服务,对JaxWsServerFactoryBean类封装-->
    <jaxws:serveraddress="/weather"serviceClass="cn.itcast.ws.cxf.server.WeatherInterface">
    <jaxws:serviceBean>
    <refbean="weatherInterface"/>
    </jaxws:serviceBean>
    </jaxws:server>
    <!-- 配置服务实现类 -->
    <beanname="weatherInterface"class="cn.itcast.ws.cxf.server.WeatherInterfaceImpl"/>
    </beans>
     
     
    第五步:配置web.xml配置spring配置文件地址和加载的listener,配置CXFservlet
    <?xmlversion="1.0"encoding="UTF-8"?>
    <web-appxmlns: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_3_0.xsd"id="WebApp_ID"version="3.0">
    <display-name>ws_2_cxf_spring_server</display-name>
    <!-- 设置spring的环境 -->
    <context-param>
    <!--contextConfigLocation是不能修改的 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <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下,启动tomcat
     
    第七步:测试服务,阅读使用说明书
             WSDL地址规则:http://ip:端口号/项目名称/servlet拦截路径/服务名称?wsdl
     
     
    5.1.1  拦截器配置
    配置applicationContext.xml中。
     
    5.1.2  Endpoint标签发布服务
    <jaxws:endpoint>标签
     
    package cn.itcast.ws.cxf.server;
    import javax.jws.WebService;
    /**
    *
    * <p>Title: HelloWorld.java</p>
    * <p>Description:简单类</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日上午11:11:10
    * @version 1.0
    */
    @WebService
    publicclass HelloWorld {
    public String sayHello(String name){
    return"hello,"+name;
    }
    }
     
     
     
     
    5.2   客户端
    开发步骤:
    第一步:引入jar
     
    第二步:生成客户端代码
     
    第三步:配置spring配置文件,applicationContent.xml
    <?xmlversion="1.0"encoding="UTF-8"?>
    <beansxmlns="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">
    <!-- <jaxws:client实现客户端,对JaxWsProxyFactoryBean类封装-->
    <jaxws:clientid="weatherClient"address="http://127.0.0.1:8080/ws_2_cxf_spring_server/ws/weather" serviceClass="cn.itcast.cxf.weather.WeatherInterface"/>
    </beans>
     
    第四步:从spring上下文件获取服务实现类
     
    第五步:调用查询方法,打印
     
    package cn.itcast.cxf.client;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    importcn.itcast.cxf.weather.WeatherInterface;
    publicclass WeatherClient {
    publicstaticvoid main(String[] args) {
    //初始化spring的上下文
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    WeatherInterfaceweatherInterface = (WeatherInterface) context.getBean("weatherClient");
    String weather = weatherInterface.queryWeather("保定");
    System.out.println(weather);
    }
    }
     
     
     
    6       上午课程回顾
    • CXF的介绍、安装和配置
    • CXF是一个开源的webservice的框架,提供很多成熟的功能,实现快速开发
    • CXF支持的协议:SOAP1.1/1.2REST
    • CXF支持的数据格式:XMLJSON
    • 安装和配置
    • 安装JDK,建议1.7
    • 解压cxf压缩包到指定目录,配置CXF_HOME
    • CXF_HOME加入Path
    • 测试成功,在cmd中输入wsdl2java –h
     
    • CXF发布SOAP协议的服务
    • 服务端
      • 第一步:引入jar包
      • 第二步:创建SEI接口,加入@WebService注解
      • 第三步:创建SEI实现类
      • 第四步:发布服务,JaxWsServerFactoryBean发布服务,设置3个参数,1.服务接口;2.服务实现类;3.服务地址
      • 第五步:测试服务
     
    • 客户端
      • 第一步:引入jar包
      • 第二步:生成客户端代码
      • 第三步:JaxWSProxyFactoryBean调用服务端,设置2个参数,1.服务接口;2.服务地址
      • 第四步:获取实现类的实例,调用查询方法
     
    • CXF+Spring整合发布SOAP协议的服务
    • 服务端
      • 第一步:创建web项目(引入jar包)
      • 第二步:创建SEI接口
      • 第三步:创建SEI实现类
      • 第四步:配置Spring配置文件,applicationContext.xml,<jaxws:server,
      • 第五步:配置web.xml,spring配置文件,listener,cxf的servlet
      • 第六步:部署tomcat下,启动tomcat
      • 第七步:测试服务是否发布成功
     
    • 客户端
      • 第一步:引入jar包
      • 第二步:生成客户端
      • 第三步:配置spring的配置文件,applicationContext.xml,<jaxws:client>
      • 第四步:初始化spring上下文,获取接口实现类,调用查询方法
     
    7       CXF发布REST的服务
                                                 
    7.1   什么是REST
    • 定义:REST就是一种编程风格,它可以精确定位网上资源(服务接口、方法、参数)
    • REST支持数据格式:XMLJSON
    • REST支持发送方式:GETPOST
     
    7.2   需求
    • 第一个:查询单个学生
    • 第二个:查询多个学生
     
    7.3   实现
    7.3.1  服务端
    开发步骤:
    第一步:导入jar
     
    第二步:创建学生pojo,要加入@XmlRootElement
    package cn.itcast.ws.rest.pojo;
    import java.util.Date;
    import javax.xml.bind.annotation.XmlRootElement;
    /**
    *
    * <p>Title: Student.java</p>
    * <p>Description:学生实体类</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日下午3:00:17
    * @version 1.0
    */
    @XmlRootElement(name="student")//@XmlRootElement可以实现对象和XML数据之间的转换
    publicclass Student {
    privatelongid;
    private String name;
    private Date birthday;
    publiclong getId() {
    returnid;
    }
    publicvoid setId(longid) {
    this.id = id;
    }
    public String getName() {
    returnname;
    }
    publicvoid setName(String name) {
    this.name = name;
    }
    public Date getBirthday() {
    returnbirthday;
    }
    publicvoid setBirthday(Date birthday) {
    this.birthday = birthday;
    }
    }
     
    第三步:创建SEI接口
    package cn.itcast.ws.rest.server;
    import java.util.List;
    import javax.jws.WebService;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import cn.itcast.ws.rest.pojo.Student;
    /**
    *
    * <p>Title: StudentInterface.java</p>
    * <p>Description:学生接口</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日下午3:03:08
    * @version 1.0
    */
    @WebService
    @Path("/student")//@Path("/student")就是将请求路径中的“/student”映射到接口上
    publicinterface StudentInterface {
    //查询单个学生
    @GET//指定请求方式,如果服务端发布的时候指定的是GET(POST),那么客户端访问时必须使用GET(POST)
    @Produces(MediaType.APPLICATION_XML)//指定服务数据类型
    @Path("/query/{id}")//@Path("/query/{id}")就是将“/query”映射到方法上,“{id}”映射到参数上,多个参数,以“/”隔开,放到“{}”中
    public Student query(@PathParam("id")longid);
    //查询多个学生
    @GET//指定请求方式,如果服务端发布的时候指定的是GET(POST),那么客户端访问时必须使用GET(POST)
    @Produces(MediaType.APPLICATION_XML)//指定服务数据类型
    @Path("/queryList/{name}")//@Path("/queryList/{name}")就是将“/queryList”映射到方法上,“{name}”映射到参数上,多个参数,以“/”隔开,放到“{}”中
    public List<Student> queryList(@PathParam("name")String name);
    }
     
    第四步:创建SEI实现类
    package cn.itcast.ws.rest.server;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import cn.itcast.ws.rest.pojo.Student;
    /**
    *
    * <p>Title: StudentInterfaceImpl.java</p>
    * <p>Description:学生的实现类</p>
    * <p>Company: www.itcast.com</p>
    * @author 传智.at
    * @date 2015年11月27日下午3:12:54
    * @version 1.0
    */
    public class StudentInterfaceImpl implements StudentInterface {
    @Override
    public Student query(long id) {
    Student st = new Student();
    st.setId(110);
    st.setName("张三");
    st.setBirthday(new Date());
    return st;
    }
    @Override
    public List<Student> queryList(String name) {
    Student st = new Student();
    st.setId(110);
    st.setName("张三");
    st.setBirthday(new Date());
    Student st2 = new Student();
    st2.setId(120);
    st2.setName("李四");
    st2.setBirthday(new Date());
    List<Student> list = new ArrayList<Student>();
    list.add(st);
    list.add(st2);
    return list;
    }
    }
     
    第五步:发布服务,JAXRSServerFactoryBean发布服务,3个参数,1:服务实现类;2.设置资源类;3.设置服务地址
    package cn.itcast.ws.rest.server;
    import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
    importcn.itcast.ws.rest.pojo.Student;
    /**
    *
    * <p>Title: StudentServer.java</p>
    * <p>Description:服务端</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日下午3:16:06
    * @version 1.0
    */
    publicclass StudentServer {
    publicstaticvoid main(String[] args) {
    //JAXRSServerFactoryBean发布REST的服务
    JAXRSServerFactoryBean jaxRSServerFactoryBean = new JAXRSServerFactoryBean();
    //设置服务实现类
    jaxRSServerFactoryBean.setServiceBean(new StudentInterfaceImpl());
    //设置资源类,如果有多个资源类,可以以“,”隔开。
    jaxRSServerFactoryBean.setResourceClasses(StudentInterfaceImpl.class);
    //设置服务地址
    jaxRSServerFactoryBean.setAddress("http://127.0.0.1:12345/user");
    //发布服务
    jaxRSServerFactoryBean.create();
    }
    }
     
    第六步:测试服务
     
    http://127.0.0.1:12345/user/student/query/110查询单个学生,返回XML数据
    <student>
    <birthday>2015-11-27T15:22:14.240+08:00</birthday>
    <id>110</id>
    <name>张三</name>
    </student>
     
    {"student":[{"birthday":"2015-11-27T15:24:21.565+08:00","id":110,"name":"张三"},{"birthday":"2015-11-27T15:24:21.565+08:00","id":120,"name":"李四"}]}
     
    <students>
    <student>
    <birthday>2015-11-27T15:30:33.754+08:00</birthday>
    <id>110</id>
    <name>张三</name>
    </student>
    <student>
    <birthday>2015-11-27T15:30:33.754+08:00</birthday>
    <id>120</id>
    <name>李四</name>
    </student>
    </students>
     
     
     
    如果服务端发布时指定请求方式是GETPOST),客户端必须使用GETPOST)访问服务端,否则会报如下异常
     
    如果在同一方法上同时指定XMLJSON媒体类型,在GET请求下,默认返回XML,在POST请求下,默认返回JSON
     
     
    7.3.2  客户端
    可以自学一下httpclient
    http://hc.apache.org/httpclient-3.x/
     
     
    package cn.itcast.cxf.client;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    /**
    *
    * <p>Title: HttpClient.java</p>
    * <p>Description:HttpURLConnection调用方式</p>
    * <p>Company: www.itcast.com</p>
    * @author 传智.at
    * @date 2015年11月26日下午3:58:57
    * @version 1.0
    */
    public class HttpClient {
    public static void main(String[] args) throws IOException {
    //第一步:创建服务地址,不是WSDL地址
    URL url = new URL("http://127.0.0.1:12345/user/student/query/110");
    //第二步:打开一个通向服务地址的连接
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //第三步:设置参数
    //3.1发送方式设置:POST必须大写
    connection.setRequestMethod("POST");
    //3.2设置数据格式:content-type
    //3.3设置输入输出,因为默认新创建的connection没有读写权限,
    connection.setDoInput(true);
    //第五步:接收服务端响应,打印
    int responseCode = connection.getResponseCode();
    if(200 == responseCode){//表示服务端响应成功
    InputStream is = connection.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    StringBuilder sb = new StringBuilder();
    String temp = null;
    while(null != (temp = br.readLine())){
    sb.append(temp);
    }
    System.out.println(sb.toString());
    //dom4j解析返回数据,课下作业
    is.close();
    isr.close();
    br.close();
    }
    }
    }
     
     
    8       CXF+Spring整合发布REST的服务
    8.1   服务端
    开发步骤:
    第一步:创建web项目(引入jar包)
     
    第二步:创建POJO
     
    第三步:创建SEI接口
     
    第四步:创建SEI实现类
     
    第五步:配置Spring配置文件,applicationContext.xml<jaxrs:server,设置1.服务地址;2.服务实现类
    <?xmlversion="1.0"encoding="UTF-8"?>
    <beansxmlns="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">
    <!-- <jaxrs:server发布REST的服务,对JAXRSServerFactoryBean类封装-->
    <jaxrs:serveraddress="/user">
    <jaxrs:serviceBeans>
    <refbean="studentInterface"/>
    </jaxrs:serviceBeans>
    </jaxrs:server>
    <!-- 配置服务实现类 -->
    <beanname="studentInterface"class="cn.itcast.ws.rest.server.StudentInterfaceImpl"/>
    </beans>
     
    第六步:配置web.xml
    <?xmlversion="1.0"encoding="UTF-8"?>
    <web-appxmlns: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_3_0.xsd"id="WebApp_ID"version="3.0">
    <display-name>ws_2_cxf_spring_server</display-name>
    <!-- 设置spring的环境 -->
    <context-param>
    <!--contextConfigLocation是不能修改的 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <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下,启动tomcat
     
    第八步:测试服务
             REST服务的使用说明书地址:
    http://127.0.0.1:8080/ws_4_cxf_rest_spring_server/ws/user?_wadl
     
     
    8.2   客户端
    <!doctype html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
    function queryStudent(){
    //创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //打开连接
    xhr.open("get","http://127.0.0.1:8080/ws_4_cxf_rest_spring_server/ws/user/student/queryList/110?_type=json",true);
    //设置回调函数
    xhr.onreadystatechange=function(){
    //判断是否发送成功和判断服务端是否响应成功
    if(4 == xhr.readyState && 200 == xhr.status){
    alert(eval("("+xhr.responseText+")").student[0].name);
    }
    }
    //发送数据
    xhr.send(null);
    }
    </script>
    </head>
    <body>
    <input type="button" value="查询" οnclick="javascript:queryStudent();"/>
    </body>
    </html>
     
     
    9       综合案例
    9.1   需求:
    • 集成公网手机号归属地查询服务
    • 对外发布自己的手机号归属地查询服务
    • 提供查询界面
     
    9.2   分析
     
    9.3   实现
     
    开发步骤:
    第一步:创建web项目(引入jar包)
     
    第二步:生成公网客户端代码
     
    第三步:创建SEI接口
    package cn.itcast.mobile.server;
    importjavax.jws.WebService;
    /**
    *
    * <p>Title: MobileInterface.java</p>
    * <p>Description:SEI接口</p>
    * <p>Company: www.itcast.com</p>
    * @author传智.at
    * @date 2015年11月27日下午4:21:24
    * @version 1.0
    */
    @WebService
    publicinterface MobileInterface {
    public String queryMobile(String phoneNum);
    }
     
    第四步:创建SEI实现类
    package cn.itcast.mobile.server;
    import cn.itcast.mobile.MobileCodeWSSoap;
    publicclass MobileInterfaceImpl implements MobileInterface {
    private MobileCodeWSSoap mobileClient;
    @Override
    public String queryMobile(String phoneNum) {
    returnmobileClient.getMobileCodeInfo(phoneNum, "");
    }
    public MobileCodeWSSoap getMobileClient() {
    returnmobileClient;
    }
    publicvoid setMobileClient(MobileCodeWSSoap mobileClient) {
    this.mobileClient = mobileClient;
    }
    }
     
    第五步:创建queryMobile.jsp
    <%@pagelanguage="java"contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <metahttp-equiv="Content-Type"content="text/html; charset=utf-8">
    <title>手机号归属查询网站</title>
    </head>
    <body>
    <formaction="queryMobile.action"method="post">
    手机号归属地查询:<inputtype="text"name="phoneNum"/><inputtype="submit"value="查询"/><br/>
    查询结果:${result}
    </form>
    </body>
    </html>
     
    第六步:创建MobileServlet.java
     
    package cn.itcast.mobile.server.servlet;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.context.ApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    importcn.itcast.mobile.server.MobileInterface;
    /**
    *
    * <p>
    * Title: MobileServlet.java
    * </p>
    * <p>
    * Description:MobileServlet
    * </p>
    * <p>
    * Company: www.itcast.com
    * </p>
    *
    * @author传智.at
    * @date 2015年11月27日下午4:42:23
    * @version 1.0
    */
    publicclassMobileServletextends HttpServlet {
    privateMobileInterfacemobileServer;
    publicvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String phoneNum = request.getParameter("phoneNum");
    if(null != phoneNum&& !"".equals(phoneNum)){
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    mobileServer = (MobileInterface) context.getBean("mobileServer");
    String result = mobileServer.queryMobile(phoneNum);
    request.setAttribute("result", result);
    }
    request.getRequestDispatcher("/WEB-INF/jsp/queryMobile.jsp").forward(request, response);
    }
    publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
    }
    }
     
     
    第七步:配置spring配置文件,applicationContext.xml
     
    <?xmlversion="1.0"encoding="UTF-8"?>
    <beansxmlns="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">
    <!-- <jaxws:server发布服务-->
    <jaxws:serveraddress="/mobile"serviceClass="cn.itcast.mobile.server.MobileInterface">
    <jaxws:serviceBean>
    <refbean="mobileServer"/>
    </jaxws:serviceBean>
    </jaxws:server>
    <!-- 配置服务实现类 -->
    <beanname="mobileServer"class="cn.itcast.mobile.server.MobileInterfaceImpl">
    <propertyname="mobileClient"ref="mobileClient"/>
    </bean>
    <!-- 配置公网客户端 -->
    <jaxws:clientid="mobileClient"address="http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"
    serviceClass="cn.itcast.mobile.MobileCodeWSSoap"/>
    </beans>
     
     
    第八步:配置web.xml
     
    <?xmlversion="1.0"encoding="UTF-8"?>
    <web-appxmlns: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_3_0.xsd"id="WebApp_ID"version="3.0">
    <display-name>ws_2_cxf_spring_server</display-name>
    <!-- 设置spring的环境 -->
    <context-param>
    <!--contextConfigLocation是不能修改的 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <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>
    <!-- 配置mobileServlet -->
    <servlet>
    <servlet-name>mobileServlet</servlet-name>
    <servlet-class>cn.itcast.mobile.server.servlet.MobileServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>mobileServlet</servlet-name>
    <url-pattern>*.action</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下,启动tomcat
     
    第十步:测试
             测试服务是否发布成功
             测试查询界面
     
     
     
     
     
     
     
     
     
     
     
    展开全文
  • WebService远程调用技术

    2019-06-03 17:53:04
    何为远程调用远程调用就是一个系统远程调用另一个系统的服务,已达到获取远程系统的业务数据的目的。 为什么使用?...二、WebService如何实现远程调用?三要素在其中的作用 (1)WebService原理:WebSer...

    转载至:https://www.cnblogs.com/taotingkai/p/6694583.html

    何为远程调用?

    远程调用就是一个系统远程调用另一个系统的服务,已达到获取远程系统的业务数据的目的。

    为什么使用?

    基于安全性考虑,一般企业不会开放自己的数据库,只能使用远程调用技术。

    在这里插入图片描述
    二、WebService如何实现远程调用?三要素在其中的作用

    (1)WebService原理:WebService是一种使用http传输的SOAP协议的数据的远程调用技术。

    (2)WSDL作用:webService服务端的使用说明书

    (3)SOAP作用:规范XML标签

    (4)UDDI:提供webService服务端的搜索和注册功能。

    开发注意事项:

    1.开发webService的应用需要开发客户端和服务端

    2.发客户端需要参考webService服务端的使用说明书(WSDL)

    在这里插入图片描述

    三、WebService入门程序

    (1)服务端

    第一步:创建SEI(service endpoint interface)接口,本质就是Java接口

    public interface WeatherInterface{

    public String queryWeather(String name);

    }

    第二步:创建SEI实现类

    在该类上加上注解:@WebService
    该注解表示该类是一个webService的服务类,要发布该类下public方法     
       @WebService

    public class WeatherInterfaceImpl implements WeatherInterface{

    @Override

    public String queryWeather(String name){

    System.out.println(“from client…”+name);

    String weather = “晴”;

    return weather;

    }

    }

    第三步:发布服务

    用Endpoint类的publish方法发布服务
    方法publish两个参数:1.服务地址;2.服务实现类的实现    
       public class WeatherServer{

    public static void main(String[] args){

    //用Endpoint类的publish方法发布服务

    //端口号建议不要太短,容易被系统占用;不要太长,太长不支持

    Endpoint.publish(“http://127.0.0.1:12345/weather”,new WeatherInterfaceImpl());

    }

    }

    第四步:测试服务是否发布成功,通过阅读服务端的使用说明书,确定关键元素存在(类/ 方法/参数等),表示服务发布成功

    WSDL阅读方式:从下往上找到server标签,确定bingding属性

    注意:

    发布SOAP1.2服务端

    第一步:在实现类上加上如下注解

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

    第二步:引入第三方插件的jar包(jaxws-ri-2.2.8)

    第三步:重启服务端

    (2)客户端(好几种方法实现)

    开发步骤:

    第一步:wsimport命令生成客户端代码。

    wsimport -s . http://127.0.0.1:12345/weather?wsdl --------------------------

    第二步:创建服务视图,服务视图名的类从service标签的name属性获取

    第三步:通过服务视图获取对应服务实现类的实例,服务实现类的名称从portType的name属性获取

    第四步:调用查询方法,方法名从operation下的name属性获取

    public class WeatherClient{

    main方法{

    //创建服务视图

    WeatherInterfaceImplService wiis = new WeatherInterfaceImplService();

    //获取服务实现类的实例

    String weather = weatherInterfaceImpl.queryWeather(“北京”);

    System.out.println(weather);

    }

    }

    四、WebService优缺点

    优点:

    跨域防火墙,使用http协议,http协议的默认端口是80,防火墙默认是不拦截80端口

    跨平台,使用http和XML,这两个协议都是跨平台

    支持面向对象编程

    缺点:

    WebService使用XML标签传输数据,发送数据时XML标签也必须发送,标签又要遵循SOAP协议,随之SOAP协议的完善,标签越来越多,传输效率下降,性能差。

    五、使用场景

    发布一个服务,客户端类型未知,不考虑性能,建议使用webservice

    服务端已确定使用webservice,客户端无法更改

    不适用场景:

    考虑性能时不建议使用webService

    展开全文
  • Webservice远程调用

    2018-03-31 17:53:24
    WebService学习整理(一)——客户端...1, WebService是两个系统的远程调用,使两个系统进行数据交互,如应用: 天气预报服务、银行ATM取款、使用邮箱账号登录各网站等。 2, WebService之间的调用是跨语言的调用。J
  • webservice远程调用详解

    千次阅读 2014-12-03 14:38:15
    webservice是跨编程语言和跨平台的远程调用技术。常见的远程调用技术还有RMI,因为webservice跨平台和跨编程语言,因此应用更广泛,但性能略低。   远程调用:一台计算机a上的一个程序可以调用另一台计算机b上的...
  • 最近接触到了一些webservice远程调用的方案,在这里留个记号,以便查找。   Hessian与Axis都可以完成web service的远程调用,不同的是前者基于二进制,而后者基于SOAP协议,Hessian更适合自己为自己完成...
  • webservice远程调用,返回String数据并生成xml文件到本地工程,在通过SAX解析器把数据解析出来。这是webservice应用的一个简单的例子。根据该例子的思想,可以实现很多功能了。例如把client工程的sayHello方法改为...
  • 实现远程调用webservice对外开放的接口,可以采用xfire或axis. 1.下面是使用axis远程调用接口,通过反射机制,传参是Object数组,根据开发文档要求的传参格式传参。 private String getCallResult(String method...
  • 远程调用webservice 方法, 通过wsdl命令,生成webservice 对应asmx 文件的对应类(cs文件),然后将此cs文件引用到当前项目中,项目其他地方需要调用webservice方法,可以直接调用cs类中的对应方法就可以实现对...
  • 一、前言 在做接口对接的时候需要接口以HTTPS和... 上一篇博客讲了WebService实现远程调用,在博文的最后,自己阐述了关于那种客户端调用存在的问题,如大家有疑问,欢迎留言区指正。二、实现 废话上一篇博...
  • webservice远程调用方法

    千次阅读 2016-09-05 15:58:28
    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。今天搜索到了非常好的 webservice provider列表 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,432
精华内容 1,372
关键字:

webservice远程调用