WebService学习总结(二)--使用JDK开发WebService
一、WebService的开发方法
使用java的WebService时可以使用一下两种开发手段
使用jdk开发(1.6及以上版本)
使用CXF框架开发(工作中)
二、使用JDK开发WebService
2.1、开发WebService服务器端
1、定义一个interface,使用@WebService注解标注接口,使用@WebMethod注解标注接口中定义的所有方法,如下所示:
package com.myl.ws; import javax.jws.WebMethod; import javax.jws.WebService; /** * * @author maoyl * @version 2018.4.14 * 定义SEI(WebService EndPoint Interface(终端)) * */ //使用@WebService注解标注WebServiceI接口 @WebService public interface WebServiceInf { @WebMethod public String sayHello(String name); @WebMethod public String save(String name, String pwd); }
2、编写interface的实现类,使用@WebService注解标注实现类,实现接口中定义的所有方法,如下所示:
package com.myl.ws.impl; import javax.jws.WebService; import com.myl.ws.WebServiceInf; /** * * @author myl * 具体实现 * */ @WebService public class WebServiceInfImpl implements WebServiceInf { @Override public String sayHello(String name) { System.out.println("WebService :" + name + ", 欢迎您"); return name + "欢迎您"; } @Override public String save(String name, String pwd) { System.out.println("name:" + name + ",password:" + pwd + "登录成功"); return name + "登录成功"; } }
3、使用Endpoint(终端)类发布webservice,代码如下:
package com.myl.ws; import javax.xml.ws.Endpoint; import com.myl.ws.impl.WebServiceInfImpl; /** * * @author maoyl * @version 2018.4.14 * 测试 * */ public class WebServicePublish { public static void main(String[] args) { String address = "http://192.168.1.2:5555/WS_Server/Webservice"; Endpoint.publish(address, new WebServiceInfImpl()); System.out.println("发布成功"); } }
运行WebServicePublish类,就可以将编写好的WebService发布好了,WebService的访问URL是:http://192.168.1.2:5555/WS_Server/Webservice?wsdl
,如下图所示
这里我们编写了一个WebServicePublish类来发布WebService,如果是Web项目,那么我们可以使用监听器或者Servlet来发布WebService,如下:
1.使用监听器发布
package com.myl.ws.ulistener; import javax.jws.WebService; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.xml.ws.Endpoint; import com.myl.ws.impl.WebServiceInfImpl; /** * * @author maoyl * @version 2018.4.14 * 使用监听器发布 * */ @WebService public class WebServicePublishListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent arg0) { String address = "http://192.168.1.2:5555/WS_Server/Webservice"; Endpoint.publish(address, new WebServiceInfImpl()); System.out.println("使用ServletContextListener发布成功---------"); } }
监听器在web.xml中配置:
<listener> <listener-class>com.myl.ws.ulistener.WebServicePublishListener</listener-class> </listener>
在此环境下报错
解决方法:
在@WebService标注的类上加上 @SOAPBinding(style = Style.RPC)即可解决
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService @SOAPBinding(style = Style.RPC) public interface WebServiceInf {...} //---------------
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService @SOAPBinding(style = Style.RPC) public class WebServiceInfImpl implements WebServiceInf {...}
查看资料:将jdk升级到jdk 1.6u17以上版本不加@SOAPBinding(style = Style.RPC)也不会有错了,(貌似试了一下jdk1.7也要加,ps:如果报上面的错误就加上就好了)
2.使用Servlet发布WebService
package com.myl.ws.usevlet; import javax.servlet.http.HttpServlet; import javax.xml.ws.Endpoint; import com.myl.ws.impl.WebServiceInfImpl; /** * * @author myl * 用于发布WebService的Servlet */ public class WebServicePublishServlet extends HttpServlet { public void init (){ String address = "http://192.168.1.2:5555/WS_Server/Webservice"; Endpoint.publish(address, new WebServiceInfImpl()); System.out.println(address + "-------------------"); } }
servlet在web.xml配置
<servlet> <servlet-name>webservicepublish</servlet-name> <servlet-class>com.myl.ws.usevlet.WebServicePublishServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
如果不在web.xml配置,则需要在servlet实现类中加上 @WebServlet(value="",loadOnStartup=0)
/** * * @author myl * 用于发布WebService的Servlet */ //将value属性设置为空字符串,这样WebServicePublishServlet就不提供对外访问的路径 //loadOnStartup属性设置WebServicePublishServlet的初始化时机 @WebServlet(value="",loadOnStartup=0) public class WebServicePublishServlet extends HttpServlet {...}
将Web应用部署到服务器运行时,在初始化WebServicePublishServlet时,就会发布WebService了。如下图所示:
同时用listener和servlet则显示
关于发布WebService主要就是通过javax.xml.ws.Endpoint类提供的静态方法publish进行发布,如果是普通的java项目,那么可以专门写一个类用于发布WebService,如果是Web项目,那么可以使用ServletContextListener或者Servlet进行发布。
2.2、开发WebService客户端
1、借助jdk的wsimort.exe工具生成客户端代码,wsimort.exe工具位于Jdk的bin目录下,如下图所示:
执行命令:wsimport -keep url(url为wsdl文件的路径)生成客户端代码。
注:-s 选择生成文件的位置
-p 在该位置创建生成的文件夹作为生成位置
如果不用-s -p 则在当前文件夹下生成生成客户端代码
如: wsimport -s F:\MyeclipseWorkspace\WebServlet\src -p com.myl.webservice.service -keep http://192.168.1.2:5555/WS_Server/Webservice?wsdl
显示如上 则表示生成成功
2、 借助生成的代码编写调用WebService对外提供的方法
wsimport工具帮我们生成了好几个java类,但我们只需要关心 WebServiceInfImplService 类和 WebServiceInfImpl 接口的使用即可,如下所示:
package com.myl.webservice.client; import com.myl.webservice.service.WebServiceInfImpl; import com.myl.webservice.service.WebServiceInfImplService; /** * * @author myl * @version 2018.4.14 * 调用WebService的客户端 */ public class Test { public static void main(String[] args) { //创建一个用于产生WebServiceInfImpl实例的工厂,WebServiceInfImplService类是wsimport工具生成的 WebServiceInfImplService factory = new WebServiceInfImplService(); //通过工厂生成一个WebServiceInfImpl实例,WebServiceInfImpl是wsimport工具生成的 WebServiceInfImpl wsImpl = factory.getWebServiceInfImplPort(); //调用WebService的sayHello方法 String resResult = wsImpl.sayHello("maoyl"); System.out.println("调用WebService的sayHello方法返回的结果是:"+resResult); //调用WebService的save方法 resResult = wsImpl.save("maoyal", "123"); System.out.println("调用WebService的save方法返回的结果是:"+resResult); } }
客户端返回结果
服务器端接收到结果
从调用返回的结果显示,借助wsimport工具生成的客户端代码已经成功调用到了WebService中的方法。以上就是使用JDK开发WebService的相关内容。
2.生成客户端代码也可以通过Myeclipse编辑器生成
创建客户端项目,右击项目 new -Other.. 选择 Web Service Client
Next
Next
Next -- Finish
此方法生成的客户端代码和 wsimport -keep url 生成的一样,调用方法也一样