真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService

  WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷。知名的XFile(新的如CXF)、Axis1、Axis2等。

  而Sun公司也不甘落后,从早期的JAX-RPC到现在成熟的、支持RPC调用与消息传递的JAX-WS都经过了市场的考验,十分成熟,而且使用JAX-WS开发WebService的收益是很大的,它是轻量级的。

  

  我们使用JAX-WS开发WebService只需要很简单的几个步骤:写接口和实现=>发布=>生成客户端(测试或使用)。

  而在开发阶段我们也不需要导入外部jar包,因为这些api都是现成的。首先是接口的编写(接口中只需要把类注明为@WebService,把要暴露给客户端的方法注明为@WebMethod即可,其余如@WebResult、@WebParam等都不是必要的,而客户端和服务端的通信用RPC和Message-Oriented两种,区别和配置以后再说):

  

 1 package service;2 3 import java.util.Date;4 5 import javax.jws.WebMethod;6 import javax.jws.WebParam;7 import javax.jws.WebResult;8 import javax.jws.WebService;9 import javax.jws.soap.SOAPBinding;
10
11 /**
12  * 作为测试的WebService接口
13  *
14  * @author Johness
15  *
16  */
17 @WebService
18 @SOAPBinding(style = SOAPBinding.Style.RPC)
19 public interface SayHiService {
20
21     /**
22      * 执行测试的WebService方法
23      */
24     @WebMethod
25     void SayHiDefault();
26
27     /**
28      * 执行测试的WebService方法(有参)
29      *
30      * @param name
31      */
32     @WebMethod
33     void SayHi(@WebParam(name = "name") String name);
34
35     /**
36      * 执行测试的WebService方法(用于时间校验)
37      *
38      * @param clentTime 客户端时间
39      * @return 0表示时间校验失败 1表示校验成功
40      */
41     @WebMethod
42     @WebResult(name = "valid")
43     int CheckTime(@WebParam(name = "clientTime") Date clientTime);
44 }

  然后是实现类(注解@WebService及其endpointInterface属性是必要的):

  

 1 package service.imp;2 3 import java.text.SimpleDateFormat;4 import java.util.Date;5 6 import javax.jws.WebService;7 import javax.jws.soap.SOAPBinding;8 9 import service.SayHiService;
10
11 /**
12  * 作为测试的WebService实现类
13  *
14  * @author Johness
15  *
16  */
17 @WebService(endpointInterface = "service.SayHiService")
18 @SOAPBinding(style = SOAPBinding.Style.RPC)
19 public class SayHiServiceImp implements SayHiService {
20
21     @Override
22     public void SayHiDefault() {
23         System.out.println("Hi, Johness!");
24     }
25
26     @Override
27     public void SayHi(String name) {
28         System.out.println("Hi, " + name + "!");
29     }
30
31     @Override
32     public int CheckTime(Date clientTime) {
33         // 精确到秒
34         String dateServer = new java.sql.Date(System.currentTimeMillis())
35                 .toString()
36                 + " "
37                 + new java.sql.Time(System.currentTimeMillis());
38         String dateClient = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
39                 .format(clientTime);
40         return dateServer.equals(dateClient) ? 1 : 0;
41     }
42
43 }

  然后是发布(一般有两种方式):

  方式一(此方式只能作为调试,有以下bug:

    jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在service接口和实现类添加“@SOAPBinding(style = SOAPBinding.Style.RPC)”注解;

    访问受限,似乎只能本机访问(应该会绑定到publish的URL上,如下使用localhost的话就只能本机访问)……):

 1 package mian;2 3 import javax.xml.ws.Endpoint;4 5 import service.imp.SayHiServiceImp;6 7 public class Main {8 9     /**
10      * 发布WebService
11      * 简单
12      */
13     public static void main(String[] args) {
14         Endpoint.publish("http://localhost:8080/testjws/service/sayHi", new SayHiServiceImp());
15     }
16
17 }

  方式二(基于web服务器Servlet方式):

  以Tomcat为例,首先编写sun-jaxws.xml文件并放到WEB-INF下:

  

1 <?xml version="1.0" encoding="UTF-8"?>
2 <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
3     version="2.0">
4     <endpoint name="SayHiService"
5         implementation="service.imp.SayHiServiceImpl"
6         url-pattern="/service/sayHi" />
7 </endpoints>

  然后改动web.xml,添加listener和servlet(url-pattern要相同哦):

 1 <?xml version="1.0" encoding="UTF-8"?>2 <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" version="2.5">3     4     <listener>  5         <listener-class>6             com.sun.xml.ws.transport.http.servlet.WSServletContextListener  7         </listener-class>8     </listener>9     <servlet>
10         <servlet-name>SayHiService</servlet-name>
11         <servlet-class>
12             com.sun.xml.ws.transport.http.servlet.WSServlet
13         </servlet-class>
14     </servlet>
15     <servlet-mapping>
16         <servlet-name>SayHiService</servlet-name>
17         <url-pattern>/service/sayHi</url-pattern>
18     </servlet-mapping>
19
20     <welcome-file-list>
21         <welcome-file>index.html</welcome-file>
22         <welcome-file>index.htm</welcome-file>
23         <welcome-file>index.jsp</welcome-file>
24     </welcome-file-list>
25 </web-app>

  最后部署到Tomcat里,值得一提的是您可能需要添加以下jar包(因为Tomcat没有):

            

  启动Tomcat。

  

  服务端工作就完成了,注意两个事情。

  注意:项目需要使用UTF-8编码(至少sun-jaxws.xml必须是UTF-8格式的);

    对于MyEclipse的内置Tomcat,可能会出现不需要手动添加上述jar包,但独立部署时应该添加,因为它们使用的class-path不一样;

    多个不同路径的接口也要使用同一个WSServlet;

    最好加上@SOAPBinding(style = SOAPBinding.Style.RPC)注解。

  部署好了之后打开浏览器输入网址:http://localhost:8080/testjws/service/sayHi?wsdl。可以看到东西就证明发布成功了。

  附上项目树状图:

  

  最后是客户端使用,由于WebService是平台和语言无关的基于xml的,所以我们完全可以使用不同语言来编写或生成客户端。

  一般有三种方式来使用(对于Java语言而言):

    一,使用jdk自带工具wsimport生成客户端:

  

  jdk自带的wsimport工具生成,上图我是把客户端文件生成到了桌面src文件中(-d),并保留了源文件(-keep),指定了包名(-p)。

  然后我们就可以使用生成的文件来调用服务器暴露的方法了:

            

    值得一提的是你生成使用的jdk和你客户端的jre需要配套!

  从上面的目录结构我们可以发现:服务端的每个webmethod都被单独解析成为了一个类(如果使用了实体,实体也会被解析到客户端,并且是源码,所以建议使用实体时慎重)。

  

  (上面的图是旧图,只是为了表示一下jaxws是为每个webmethod生成类的情况)

  而我们的service则被生成了一个代理类来调用服务,接下来我们看看使用情况:

 1 package test;2 3 import java.util.Date;4 import java.util.GregorianCalendar;5 6 import javax.xml.datatype.DatatypeConfigurationException;7 import javax.xml.datatype.DatatypeFactory;8 import javax.xml.datatype.XMLGregorianCalendar;9
10 import testjws.client.SayHiService;
11 import testjws.client.SayHiServiceImpService;
12
13 public class Main {
14
15     public static void main(String[] args) throws DatatypeConfigurationException {
16         // 获取service
17         SayHiService service = new SayHiServiceImpService().getSayHiServiceImpPort();
18
19         // sayhi
20         service.sayHiDefault();
21         service.sayHi("Ahe");
22
23         // checktime
24         // 这里主要说一下时间日期的xml传递,方法还略显复杂
25         GregorianCalendar calender = new GregorianCalendar();
26         calender.setTime(new Date(System.currentTimeMillis()));
27         XMLGregorianCalendar xmldate = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
28         System.out.println(service.checkTime(xmldate));
29
30     }
31
32 }

  看看服务器的输出,我们是否调用成功:

  

    

    成功了!

    对于校验时间的方法客户端也收到反馈了:

        

    二,使用诸如MyEclipse(Eclipse for Jave EE也可以)创建一个Web Service Client的项目

        

    然后填入wsdl地址即可,后续步骤我就不贴出了。

    三,自己写代码-_-,其实这个方法不得不说是最好的。

欢迎您移步我们的交流群,无聊的时候大家一起打发时间:

或者通过QQ与我联系:

(最后编辑时间2014-03-08 00:23:18)

认真你就输了,一直认真你就赢了!

转载于:https://www.cnblogs.com/adolfmc/p/4383091.html

真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService相关推荐

  1. 【WebService笔记01】使用JWS实现WebService接口的发布和调用

    这篇文章,主要介绍如何使用JWS实现WebService接口的发布和调用. 目录 一.JWS实现WebService接口 1.1.JWS发布WebService接口 (1)编写接口 (2)编写实现类 ...

  2. 基于jws发布webservice服务

    基于jws发布webservice服务 用途 用于验证基于jws搭建的webservice服务端与客户端. WebService服务端 1.目录结构 D:. │ pom.xml # maven配置 │ ...

  3. 转 真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService

    WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷.知名的XFile(新的如CXF).Axis1.Axis2等. 而Sun公司也不甘落后,从早期的JAX-R ...

  4. WebService入门教程(服务端发布WebService)

    本篇内容过多,时间紧迫的朋友可以通过目录快速筛选自己想要看的内容,本人接触webservice也没多久,也处于学习阶段,如果有错误请指正,如果已经是大神请略过这篇文章,这篇文章不涉及webservic ...

  5. WebService学习总结十 使用Spring发布WebService并添加拦截器

    首先使用Spring方式发布成功WebService,再在客户端和服务器端引入出拦截器和入拦截器,引入的方式是写在配置文件中的. 客户端: 自定义的拦截器 package ws.client.inte ...

  6. Webservice入门教程_用JDK开发Webservice

    场景 项目专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/37726 实现 搭建服务端 打开Eclipse新建 Java proje ...

  7. spring和maven_具有Spring和Maven教程的JAX–WS

    spring和maven Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: ...

  8. 带有Spring和Maven教程的JAX–WS

    Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: 公开基于Servlet的 ...

  9. Maven项目集成cxf框架发布WebService

    关于Maven项目集成cxf框架发布和接收WebService 从网上找了很多,发现大多数都是类似"单机"版的发布,直到看了一篇博客,给我很大的启发. 在此感谢这位博客的作者:ht ...

  10. CXF框架发布WebService服务的例子

    1.CXF框架概念介绍 Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP.POST/HTTP.H ...

最新文章

  1. Spring5源码 - 08 BeanFactory和FactoryBean 源码解析 使用场景
  2. 在.c文件中调用cuda函数
  3. 做正确的事,正确的做事
  4. 一个支持Abort的BackgroundWorker
  5. C#将另一个应用程序的窗口移动到前端的问题
  6. SQL数据库“单个用户”不能访问,设置为多个用户的解决方法
  7. 【数字信号调制】基于matlab GUI AM+FM+DSB+SSB调制解调【含Matlab源码 1212期】
  8. 联想自带Y空间软件最好用的版本-可录屏无其它提示
  9. 联发科MT2503芯片资料MT2503原理图
  10. OpenDaylight Hydrogen版本应用SampleTap研究(一)
  11. 牛津高阶字典ld2_奶爸1.6G Mdict词库的补充及在Bluedict中使用的心得
  12. 【obs owt】屏幕采集创建DXGI
  13. windows无法新建计算机对象,教您activex部件不能创建对象怎么解决
  14. 坚果pro2刷回官方_锤子坚果Pro2刷魔趣、刷回官方踩坑记
  15. html手机保存图片不显示,手机保存的图片在相册显示不了解决方法
  16. Windows7双屏扩展及双屏桌面背景独立显示
  17. LSTM和循环网络RNN学习简记
  18. 2021Java不死我不倒,吊打面试官系列!
  19. Android生态系统进化论
  20. JavaEE初阶---网络原理初识+网络编程套接字+网络原理之TCP_IP

热门文章

  1. 如何将Eclipse中Web项目打成war包
  2. parse data from Nacos error
  3. MySQL数据库优化的几种方式
  4. 二叉树常见算法总结(java)
  5. springmvc执行流程_SpringMVC
  6. mysql连接报错3167_MySQL之使用过程中报错及处理记录(持续更新)
  7. (day06 dfs+剪枝)剑指 Offer 12. 矩阵中的路径
  8. activiti 工作流_JAVA-工作流引擎-activiti-Tasks-userTask动态绑定用户或用户组
  9. centos6配置mysql远程访问_一次成功的MySQL升级失败教训
  10. java传递json_JAVA中使用JSON进行数据传递示例