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两种,区别和配置以后再说):

package service;import java.util.Date;import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;/*** 作为测试的WebService接口* * @author Johness* */
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface SayHiService {/*** 执行测试的WebService方法*/@WebMethodvoid SayHiDefault();/*** 执行测试的WebService方法(有参)* * @param name*/@WebMethodvoid SayHi(@WebParam(name = "name") String name);/*** 执行测试的WebService方法(用于时间校验)* * @param clentTime 客户端时间* @return 0表示时间校验失败 1表示校验成功*/@WebMethod@WebResult(name = "valid")int CheckTime(@WebParam(name = "clientTime") Date clientTime);
}

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

package service.imp;import java.text.SimpleDateFormat;
import java.util.Date;import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;import service.SayHiService;/*** 作为测试的WebService实现类* * @author Johness* */
@WebService(endpointInterface = "service.SayHiService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class SayHiServiceImp implements SayHiService {@Overridepublic void SayHiDefault() {System.out.println("Hi, Johness!");}@Overridepublic void SayHi(String name) {System.out.println("Hi, " + name + "!");}@Overridepublic int CheckTime(Date clientTime) {// 精确到秒String dateServer = new java.sql.Date(System.currentTimeMillis()).toString()+ " "+ new java.sql.Time(System.currentTimeMillis());String dateClient = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(clientTime);return dateServer.equals(dateClient) ? 1 : 0;}}

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

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

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

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

package mian;import javax.xml.ws.Endpoint;import service.imp.SayHiServiceImp;public class Main {/*** 发布WebService* 简单*/public static void main(String[] args) {Endpoint.publish("http://localhost:8080/testjws/service/sayHi", new SayHiServiceImp());}}

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

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

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

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

<?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" version="2.5"><listener>  <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener  </listener-class></listener><servlet><servlet-name>SayHiService</servlet-name>  <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet  </servlet-class></servlet>  <servlet-mapping>  <servlet-name>SayHiService</servlet-name>  <url-pattern>/service/sayHi</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-list>
</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则被生成了一个代理类来调用服务,接下来我们看看使用情况:

package test;import java.util.Date;
import java.util.GregorianCalendar;import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;import testjws.client.SayHiService;
import testjws.client.SayHiServiceImpService;public class Main {public static void main(String[] args) throws DatatypeConfigurationException {// 获取serviceSayHiService service = new SayHiServiceImpService().getSayHiServiceImpPort();// sayhiservice.sayHiDefault();service.sayHi("Ahe");// checktime// 这里主要说一下时间日期的xml传递,方法还略显复杂GregorianCalendar calender = new GregorianCalendar();calender.setTime(new Date(System.currentTimeMillis()));XMLGregorianCalendar xmldate = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);System.out.println(service.checkTime(xmldate));}}

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

  

    

    成功了!

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

        

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

        

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

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

转字 https://www.cnblogs.com/coprince/p/5732822.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入门教程(服务端发布WebService)

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

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

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

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

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

  6. php高并发用什么框架,PHP有适用于高并发的WebService框架嘛?

    现在的nodejs项目很火,ruby语言也出现了像sinatra,Padrino之类的webservice框架,PHP语言有没有类似的框架啊? 回复内容: 现在的nodejs项目很火,ruby语言也出 ...

  7. Google 开源 AdaNet:快速灵活的轻量级 AutoML 框架

    雷锋网 AI 科技评论编者按:近期,Google 开源了轻量级 AutoML 框架-- AdaNet,该框架基于 TensorFlow,只需要少量的专家干预便能自动学习高质量模型,在提供学习保证(le ...

  8. 几种流行Webservice框架性能对比

    1      摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有30多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性 ...

  9. 众里寻他千百度-- 轻量级持久化框架

    初衷 纯JDBC 持久化框架 轻量级持久化框架 设计思路 怎么使用 依赖 数据库配置 正式使用 数据库表结构 Java Bean结构 从数据库获取一条记录并转为对象 高级版 数据库内记录 JavaBe ...

最新文章

  1. java 按行读取大文件文件内容_Java实现按行读取大文件
  2. BugKu:cookies 欺骗
  3. 332. 重新安排行程(回溯算法)
  4. redmine2.4.2 插件安装
  5. React入门教程第三课--gulp编译优化
  6. 【有奖征文】WEB前端大作战,走在技术最前端!
  7. android q哪些手机型号,华为公布8款安卓Q首批升级机型
  8. “sudo: apt-get:找不到命令”的解决方法
  9. 利用VB函数Dir()实现递归搜索目录
  10. windows——DOS命令集锦
  11. VMware故障:配置文件(.vmx)损坏修复
  12. 华为linux版能用ps,华为matebookd14能用ps吗
  13. ✨ StarRocks 6 月社区动态
  14. 服务器判断自动还是手动连接网络,ADSL拨号上网实现服务器自动与网络连接
  15. 达芬奇密码 第六章(3)
  16. 从RTE2022大会 看声网实时互动生态的未来
  17. ChatGPT爆火后,NLP技术不存在了?
  18. 喵了个咪!redux middleware居然如此简单
  19. android内存dump分析,[原创]梆梆加固之防内存dump分析
  20. 【Tools】SecureCRT8.7安装和注册教程

热门文章

  1. AAC ADTS头详解
  2. C语言调色板颜色渐变,VC++实现的OpenGL线性渐变色绘制操作示例
  3. 【Java修行之路】--Scanner类
  4. 用python-pptx库提取ppt中的全部备注
  5. Python数据分析师养成记
  6. IT人的学习方法论(全) 1
  7. 【论文笔记】ASTPN注意力空间池化网络
  8. Centos7 卸载 Nginx 并重新安装 Nginx
  9. 【计算机基础05】PowerPoint
  10. 短视频美颜sdk的漫画拍摄和慢动作的实现流程