最近公司最近需要将以前提供出去的接口统一用一个标准来实现,考虑到webservice这个是标 准,因此我花时间大概学习了一下webservice,也对JAVA的几个webservice框架进行了一些小例子的学习。

JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊。但就算是伤心,我们也还是要完成的。JAVA也不乏比较好的实现,如xfire,jersey,CXF。有人会说axis2,那个东西,看着就伤心,它不包括在比较好里面,比较差里面反倒有它的一席之位。怎么差,这里先不说,我们慢慢地来看看这几个框架的实现。

今天我们就先一起来看一下xfire的实现,接下来的几天我们会慢慢一起来学习另外的框架。

1)首先,当然是要下包啦,这个普通人都知道。http://xfire.codehaus.org/Download可以到这里去下,可以下all也可以下distribution。但建议还是下all的,免得一堆奇怪的问题搞得你一点信心都没了。

包弄下来了那么怎么办呢?放进项目里啊。貌似废话,但很多人就是不知道下下来要干什么用。

建一个新项目,比较我的是xfireWebservice,这里当然是建web项目啦。

我这里是把它所有的包都放到这里面了,毕竟我们写例子,就没必要挑三拣四了,随便点吧,如果想看看异常信息的朋友可以不把全部放进去,慢慢地加入,以后遇到错误也好排除,但我们这里就不那么做了,毕竟一般缺少什么类那些的异常没什么难看的,大家可以自己排除。

2)我们首先来了解一下xfire与其他webservice框架的不同,它最大的不同之处在于它需要一个接口,而且如果需要用xfire来调用相应的webservice必须知道接口的定义,感觉这里有点限制了。但除了这点,xfire调用webservice,那是相当的方便,就跟调用本地方法一样。我们直接来看例子:

首先是最重要的接口:

  1. public interface IReaderService {
  2. public Reader getReader(String name,String password);
  3. public List<Reader> getReaders();
  4. }

有接口,当然也要有实现类,不然接口就没什么意义了。

  1. public class ReaderService implements IReaderService{
  2. public Reader getReader(String name,String password) {
  3. return new Reader(name,password);
  4. }
  5. public List<Reader> getReaders(){
  6. List<Reader> readerList = new ArrayList<Reader>();
  7. readerList.add(new Reader("shun1","123"));
  8. readerList.add(new Reader("shun2","123"));
  9. return readerList;
  10. }
  11. }

也看一下JAVABEAN,Reader类:

  1. public class Reader{
  2. private static final long serialVersionUID = 1L;
  3. private String name;
  4. private String password;
  5. public Reader(){}
  6. public Reader(String name,String password) {
  7. this.name = name;
  8. this.password = password;
  9. }
  10. //Get/Set方法省略
  11. public String toString(){
  12. return "Name:"+name+",Password:"+password;
  13. }
  14. }

注意,我们这里的Reader类实现了Serializable接口,为什么呢?这里,首先我们需要了解webservice的原理,对于JAVA来讲,如果我们需要在互联网上传对象,很多人当然会想到序列化,对了,这里就是序列化,因为我们需要把reader作为参数来传递。这在以前的版本中是需要强制实现,否则会报错,但现在的最新的版本(其实最新的也是07年的,因为xfire已经停止开发,被apache合并为CXF项目,这个我们之后再讲)已经不需要了,至于是用什么方式实现的,我们这里暂时不深究,因为它已经被合并到CXF中,我们如果要深入学习,应该学习CXF较好。

3)当我们完成上面的接口和JAVABEAN的编写后,很多人会问,我看很多webservice都会有WSDL文件,那你这个怎么来的?在讲这个之前,我们来讨论一下什么是WSDL。也许很多公司提供的接口都还是只是一个HTTP地址,返回XML这样的格式,我们的也是。这有一个好处,也有一个坏处。好处是我们开发的难度小了,而坏处是我们需要提供给用户一堆说明文件,每个返回的XML标签是什么意思,这倒也没啥,但就是比较烦而已。而webservice呢,坏处就是我们开发的东西稍微多了点,而好处是我们不用再写那么多说明文件,因为有一个统一的说明,叫WSDL,这个是webservice的说明文档,是统一的,无论什么语言都一样,所以不存在谁看不懂的问题。

而这里,当我们部署完成xfire后,它就可以帮我们生成WSDL文件。

问题是怎么部署,这个其实也简单。我们在src目录下新建一个文件夹META-INF,再建它的一个字文件夹xfire,里面建立文件services.xml。之后的结构如下:

有人会问为什么要建到src目录下,其实不是规定建到这里的,但因为我们需要让开发工具帮我们自己部署这几个文件,所以我们放到这里,eclipse就可以帮我们自己部署到tomcat或者其他的容器中。注意,这个文件所在文件夹层次是固定的,不可以修改。

我们直接看一下servics.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://xfire.codehaus.org/config/1.0">
  3. <service>
  4. <!-- webserviceq名称,调用时需要指定这个 -->
  5. <name>readerService</name>
  6. <!-- 这个一般是自己公司的网址,意义不大 -->
  7. <namespace>http://test/HelloService</namespace>
  8. <!-- 接口类 -->
  9. <serviceClass>com.xfire.servlet.IReaderService</serviceClass>
  10. <!-- 实现类 -->
  11. <implementationClass>com.xfire.servlet.ReaderService</implementationClass>
  12. </service>
  13. </beans>

看着注释一般都没问题的。

4)很多人以为这样就行了,不,还没行,你指定了这个,那别人怎么访问呢。怎么把相应的请求转发到xfire那里,让它进行处理呢。这里又需要修改web.xml了。
修改后如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <servlet>
  7. <servlet-name>XFireServlet</servlet-name>
  8. <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>XFireServlet</servlet-name>
  12. <url-pattern>/services/*</url-pattern>
  13. </servlet-mapping>
  14. </web-app>

其实也就是添加了一个servlet和对应的mapping。接下来,我们在浏览器上直接输入:
http://localhost:8080/xfireWebService/services/readerService?wsdl

我们可以看到:

这里显示的就是wsdl,它会显示我们定义的方法,返回的类型,这个文件我们这里就不分析了,http://webservices.group.iteye.com/group/topic/11467这位朋友在这里写得很清楚,想了解的朋友可以到这里看看。

5)上面四步完成后,我们就完成了webservice的部署了。别人就可以调用相应的webservice来访问我们的方法了。下面我们就用xfire提供的client来访问一下我们刚才发布的webservice:

  1. public class ReaderClient {
  2. public static void main(String[] args) {
  3. //这里是创建一个service,需要传入一个接口类,因为我们后面必须调用相应的接口方法
  4. Service srcModel = new ObjectServiceFactory().create(IReaderService.class);
  5. //代理工厂,这里是为了后面创建相应的接口类
  6. XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
  7. //webservice地址,不需要加wsdl
  8. String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService";
  9. try {
  10. //利用工厂返回相应的接口类
  11. IReaderService readerService = (IReaderService)factory.create(srcModel,readerServiceUrl);
  12. Reader reader = readerService.getReader("shun","123");
  13. System.out.println(reader);
  14. } catch (MalformedURLException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }

这样,我们看到输出结果为:

最新文章

  1. 036医疗项目-模块三:药品供应商目录模块——供货商药品目录(批量)添加药品的功能---------Action层
  2. mac 下安装 lua5.3 + cjson
  3. sass开发过程中遇到的几个坑
  4. andriod 新建Activity_ Form
  5. EF学习笔记(二)
  6. Python学习(3)——if语句
  7. HDU 5601 N*M bulbs 找规律
  8. Ext入门学习系列(五)表格控件(3)
  9. QT线程(一):线程类
  10. SFTP信任公钥配置及JSCH库
  11. [LeetCode] Maximum Length of Pair Chain 链对的最大长度
  12. java反射 概念
  13. Android 针对单个Activity设置状态栏颜色
  14. JavaScript的基础篇
  15. Spring Cloud Eureka
  16. ASP.NET MVC学习之模型验证详解
  17. Mybatis源代码分析之parsing包
  18. spring boot 在jdk 1.7下使用 commandLineRunner
  19. imooc-c++学习感悟
  20. Java集合框架2

热门文章

  1. ETL-Career RoadMap
  2. ZOJ 3511 不相交切切多边形 线段树求最大边数
  3. java 修改文件名
  4. poj2187 Beauty Contest(旋转卡壳)
  5. jQuery select 操作全集
  6. 表单控件之select
  7. 菜鸟做HTML5小游戏 - 翻翻乐
  8. bootstrapValidator Maximum call stack size exceeded
  9. C++第三课(2013.10.03 )
  10. linux 下 重启apache