WebService学习之路一 :http://trylin.iteye.com/blog/1906819
WebService学习之路二 :http://trylin.iteye.com/blog/1907883
WebService学习之路三 :http://trylin.iteye.com/blog/1908269
WebService学习之路四:http://trylin.iteye.com/blog/1910979
根据契约优先原则开发WS
其实前面的方式 我们都可以看作是使用代码优先的模式开发的WS端(代码优先,先开发代码生成WS,然后才有根据WS生成的WSDL;契约优先,先开发规则WSDL,在根据规则生成代码)。
在第二章简单的分析过WSDL的元素,WSDL的元素规律很像java代码中的之间的引用。试着手写出一个符合要求的WSDL。
首先 新建一个WS_WEB的动态WEB项目(我使用的是eclipse,如果用的myeclipse直接新建web项目),这里用WEB项目是为了稍后能够发布到tomcat上启动我们的WS。
然后新建test和resource两个源码包 ,并且在resource下 建立wsdl包,然后在wsdl包下创建UserService.wsdl文件(wsdl文件格式,eclipse可以直接创建,newàotherà输入wsdl选中即可,创建过程,默认就行)。创建后 出现的系统默认的wsdl格式 。
项目结构:
UserService.wsdl
这些个格式,看着应该很熟悉了吧.。。。
好了 ,我们开始手动写WSDL ,先把definitions节点下的所有节点删除,并且修改definitions的默认命名空间。
然后,我们开始定义元素类型和元素。(如果忘记WSDL格式,可以打开之前的项目,然后作为参考,多看几遍,记下来)
定义types
定义 portType和 binding
定义服务项
如上,我们就手动写了一个WSDL,测试的时候,最好还是手动的敲。。。动手实践才是关键。
然后,我们用wsimport命令 ,根据此wsdl生成java类 。
wsimport –d d:/webservice –keep –verbose E:\work\WS_WEB\resource\wsdl\UserService.wsdl
运行命令后,查看d:/webservice 是不是生成了这些文件,这就表示,我们手写的WSDL已经成功了。
然后这里我们需要做两步操作,第一步,将IUserService接口类复制到我们的服务端,第二步,新建一个客户端,然后将所有的java类放到客户端的代码中。
Copy到客户端,这个容易理解,我们做客户端调用需要这些类,但是服务端为什么也要这样copy呢,而且只需要copy一个java类。
这就是契约优先。我们之前先定义了一个WSDL的接口规范,规范定好了,服务端和客户端就可以同时按照WSDL定义的标准进行开发wsdl是xml格式,解释成java代码就服务端copy的接口类(这里是 IUserService),然后服务端就可以根据接口开发对应的功能呢。。。
开发服务端:
IUserService copy到服务端后,会报错,有个错误的引用,把引用的注解删除。
新建一个IUserService的实现类UserService类
@WebService(name="UserService",serviceName="UserService",endpointInterface="com.trylin.service.IUserService" , targetNamespace = "http://service.trylin.com") @WebServiceRef(wsdlLocation="wsdl/UserService.wsdl") public class UserService implements IUserService { @Override public int add(int a, int b) { System.out.println(a+"+"+b+"="+(a+b)); return a+b; } @Override public int minus(int a, int b) { System.out.println(a+"-"+b+"="+(a-b)); return a-b; } }
注意类上面的注解 :
@WebService serviceName 表示服务名
@WebServiceRef wsdlLocation 本地wsdl文件的引用
然后创建main启动服务
/** * @param args */ public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:8888/WS", new UserService()); }
浏览器中输入 http://127.0.0.1:8888/WS?wsdl,是不是和之前生成的WSDL一样一样的。。。。
然后在客户端创建测试代码调用(客户端的代码我就不写出来了,和之前的差不多,文章结尾会有测试源码)
@Test public void test01() throws Exception{ /*IUserService iUser = new UserService().getUserServicePort();*/ //这里使用另外的一种方式调用 手动传QName 这样我们可以指定URL,如果项目迁移,或者是服务换端口,默认的地址就会失效 //所以这里用下这种方式调用 URL url = new URL("http://127.0.0.1:8888/WS"); QName qname = new QName("http://service.trylin.com","UserService"); IUserService iUser = new UserService(url,qname).getUserServicePort(); System.out.println(iUser.add(1, 2)); System.out.println(iUser.minus(3, 2)); }
普通类型的完成,试试复杂类型的创建哦。
主要测试自定义类型User 和 List<User>
首先在节点中添加User对象和List对象,并且新增login方法和getList方法
然后使用 wsimport重新生成 java类,服务端覆盖原有的接口,并且从新实现,由于这里用到的自定义类型User,所以服务端,我们需要自己在建立一个user对象。
<!--EndFragment-->
<spay�ye(�j��ze:10.0pt; font-family:"courier="" new";color:black;mso-font-kerning:0pt'=""> 节点中添加User对象和List对象,并且新增login方法和getList方法
Public class User{ private String userName; private String userPwd; private String age; private String nickName; }
UserService新增方法
@Override public List<User> getList() { List<User> lu = new ArrayList<User>(); Set<String> keySet = DBUser.keySet(); Iterator<String> key_it = keySet.iterator(); while(key_it.hasNext()){ String key = key_it.next(); lu.add(DBUser.get(key)); } return lu; } @Override public User login(String userName, String userPwd) { User user = DBUser.get(userName); if(null!=user && userPwd!=null && userPwd.equals(user.getUserPwd())){ return user; } return null; }
重新发布:
public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:8080/UserService", new UserService()); }
客户端调用:
@Test public void test02(){ IUserService iUser = new UserService().getUserServicePort(); List<User> userList = iUser.getList(); for (User user : userList) { System.out.println("nickName :"+user.getNickName()); } User loginUser = iUser.login("zhangsan", "123456"); if(loginUser == null ){ System.out.println("登录失败"); }else{ System.out.println(loginUser.getNickName()); } }
这样我们的自定义类型也就发布成功了。。。
源代码在下方,欢迎下载,希望看到不足的地方,留下你们的金玉良言。。。
下一章会把基于 tomcat发布的写出来。今天太困了。。。撤退。。。
相关推荐
webservice是跨语言的远程调用技术,把对象的方法让远程可以调用 2.soap协议 3.服务端要提供wsdl文件,wsdl文件的作用 4.客户端调用原理,5.服务器端实现原理
在WebService使用Md5和SHA1加密技术对用户密码进行加密处理,从而增加用户安全性。登陆判断同样通过Md5和SHA1加密密码然后和数据库经过加密密码进行比较来(它们可都是二进制滴哦!)验证用户是否存在 很好滴东西 ...
今天特意将项目中用Axis2集成SSH实现WebService的过程记录下来,一方面做一下笔记,另一方面,方便广大码农朋友,希望能跟大家交流学习。 本文介绍用Axis2集成SSH搭建WebService。会达到的效果: 1.按照传统我们用...
什么是 Web 服务? 2, 什么是SOAP?... 4, Axis相比Soap v2的优点5, 什么是WSDL? 6, 什么是WSDD? 7, 什么是UDDI? 8, AXIS的几种服务类型二, 开发,部署Web服务: 三, 在IDE下开发Web服务:
一、新建一个Web项目 二、Web发布 三、IIS设定 四、新建一个控制台项目 五、添加Web Service引用 六、调试应用
JavaEE5学习笔记09-将EJB发布成WebService总结。
MuleESB集成webservice+restful(sprintboot+mybatis+mysql)+activeMQ+javamail,五天的研究成果,集成了我所关注的点,希望有更多的朋友一起学习进步。
一、WebService.asmx: 处理业务数据,在GetList方法中产生泛型集合数据,供JqueryRequest.aspx调用,代码如下: [WebMethod] 代码如下: public List<string> GetList() { List<string> list = new List();...
软件开发与项目管理-1期 KC02_模块五_模块案例_Restful_WebService实现对比.docx 学习资料 复习资料 教学资源
##### 5.待完善 | 功能 |说明| | ------------- |:-------------:| |值域验证|字典值域验证,筛选| |字段验证|字段类型,格式验证| # xml格式 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况...
项目Maven构建,真实大型互联网...13. Maven项目构建,您可以直接做架构,可以提升自己的学习能力,使您成为真正的架构师。 版本支持: 支持版本: jdk 1.6、1.7、1.8 Web容器: Tomcat 6、7、 8 数据库: mysql
java调用net开发的webservice实例下载 问题终于解决了,之前加上?wsdl的时候报如下错: - I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect - Retrying ...
5:脚本录制之 badboy 6:脚本录制之 jmeter 代理 7:脚本录制之移动端APP录制 8:Fiddler抓包实战 9:移动端抓包实战 10:脚本增强之参数化(多方式实现) 11:脚本增强之高级参数化 12:脚本增强之...
内含知识文档,学习视频,ppt,示例(原代码),非常好!!!!!!
个人收藏经典及大量的java Web Service 实例项目,基本上都可以正常运行,适合正在学习Web Service技术的你 大量的java Web Service 实例项目,基本上都可以正常运行,适合正在学习Web Service技术的你,里面有10几...
6.2配置BlazeDS,并使之正常运作 34 6.3创建一个Java项目,用来充当Server 34 6.4配置BlazeDS 35 6.5 新建一个Flex应用程序,测试连接 35 6.6 实际应用 37 7 Cairngrom框架 38 8 实例:Simple Note Management 40 8.1...
5 分布式开发,支持多线程,可靠安全健壮; 一次编写,处处运行,可以更容易的发布软件; 3、主要的开源网站: ①www.Java.net ②www.apache.org ③www.sourceforge.net ④www.theserverside.com ⑤...
1.3例程 建立聊天室: 5 第二章:JAVA设计模式 18 2.1:创建型设计模式 19 2.2:结构型设计模式 32 2.3:行为型设计模式 83 第三章:JAVA基本语法 118 3.1:语言基础知识 118 3.2:声明和访问控制 120 3.3:运算符和...