WebService之XFire和SOAP实例(基于JAVA)
开发环境:jdk1.6 + Tomcat7 + MyEclipse10
源码下载地址张贴在文章最后面:首先是使用WSDL协议实现:这里使用XFire
XFire一个免费、开源的SOAP框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,其原理是以接口反射机制自动取得远程方法的
WSDL是一个用来描述Web服务和说明如何与Web服务通信的XML语言
准备:开发之前请先下载xfire-distribution-1.2.6.zip并解压缩
(1)、新建一个Web项目(服务端),名称为XFireWebService,其目的是为了测试WebService服务端
为工程添加XFire支持的类库,把xfire-1.2.6里lib所有jar和xfire-all-1.2.6.jar拷贝到工程lib里
(2)、把XFire加载到系统中来,增加web.xml的配置信息
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>XFireServlet</servlet-name>
- <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>XFireServlet</servlet-name>
- <url-pattern>/servlet/XFireServlet/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>XFireServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
(3)、创建Web服务接口,声明该Web服务对外暴露的接口
- package com.test.ws;
- import java.util.List;
- /**
- * <p>Title: IHelloService</p>
- * <p>Description: 定义接口</p>
- */
- public interface IHelloService {
- public String getTestString(String str);
- public ExceedVO getTestObject(EnterVO vo);
- public List getTestList(List list);
- }
(4)、创建Web服务实现类,为Web服务接口提供实现
- package com.test.ws;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * <p>Title: HelloServiceImpl</p>
- * <p>Description: 接口实现</p>
- */
- public class HelloServiceImpl implements IHelloService {
- @Override
- public String getTestString(String str) {
- return "Hello" + str;
- }
- @Override
- public ExceedVO getTestObject(EnterVO vo) {
- ExceedVO revo = new ExceedVO();
- revo.setDescStr("名称:"+vo.getName()+"年龄:"+vo.getAge());
- return revo;
- }
- @Override
- public List getTestList(List list) {
- List<EnterVO> users = new ArrayList<EnterVO>();
- for(int i=0; i<9; i++){
- EnterVO user = new EnterVO("姓名"+i, i);
- users.add(user);
- }
- return users;
- }
- }
(5)、这两个类是具体的业务实现类,对业务方法的具体实现放在里面
- package com.test.ws;
- import java.io.Serializable;
- /**
- * <p>Title: EnterVO</p>
- * <p>Description: 入参对象</p>
- */
- public class EnterVO implements Serializable {
- private static final long serialVersionUID = 1L;
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public EnterVO(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public EnterVO() { }
- }
- package com.test.ws;
- import java.io.Serializable;
- /**
- * <p>Title: ExceedVO</p>
- * <p>Description: 出参对象</p>
- */
- public class ExceedVO implements Serializable {
- private static final long serialVersionUID = 1L;
- private String descStr;
- public String getDescStr() {
- return descStr;
- }
- public void setDescStr(String descStr) {
- this.descStr = descStr;
- }
- }
(6)、在src目录下新建一个META-INF/xfire/services.xml,该文件是XFire框架的服务发布文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 服务发布文件 -->
- <beans xmlns="http://xfire.codehaus.org/config/1.0">
- <service> <!-- service标签和它所包含的xml内容为发布成Web服务的POJO提供完整的描述 -->
- <name>HelloService</name> <!-- Web服务被发布时所采用的唯一名称 -->
- <namespace>http://test/HelloService</namespace> <!-- Web服务发布时所使用的命名空间 -->
- <serviceClass>com.test.ws.IHelloService</serviceClass> <!-- Web服务接口类的全名 -->
- <implementationClass>com.test.ws.HelloServiceImpl</implementationClass> <!-- Web服务实现类的全名 -->
- <!-- 不需要接口时,把业务写在serviceClass标签中 -->
- </service>
- </beans>
(7)、注意:当用到List等集合类型时,需要定义Mapping关系
必须与接口同名后缀.aegis.xml,而且要与接口同一位置
- <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">
- <!-- XFire可以支持基本类型,但针对集合类型时需要特殊配置 -->
- <mapping>
- <method name="getTestList"> <!-- 需要配置的方法名 -->
- <!-- index="0"代表方法的参数的序号0即第一个参数,componentType属性代表集合参数内包含的类型 -->
- <parameter index="0" componentType="java.lang.String" />
- <!-- 配置返回类型,componentType属性代表返回的集合中所包含的类 -->
- <return-type componentType="com.test.ws.EnterVO" />
- </method>
- </mapping>
- </mappings>
web.xml和service.xml都可以通过IDE自动生成,也可以手写
(8)、到这步webService服务端就基本完成
部署项目,启动Tomcat,测试一下wsdl,访问http://localhost:8080/XFireWebService/services/HelloService?wsdl
如果能正确显示wsdl文件,说明刚才的部署成功了!!!
9WKZKVKF)D.jpg)
9WKZKVKF)D.jpg)
(9)、再建一个Web项目(客户端),名称为XFireWebClient,其目的是用来调用一个webService服务
将XFire的库文件拷贝到Web项目的WEB-INF\lib目录下,同时需要将服务器端发布的服务打包发布给客户端,发布给客户端的代码只需要打包接口和参数类即可,实现类不必打包到客户端
这里发布的jar包名称为IHelloService.jar,里面包含IHelloService、EnterVO、ExceedVO这三个类
(10)、在这个Web项目里面新建一个Servlet作为测试的Servlet,名称为ClientTestServlet.java
在web.xml里面配置好这个Servlet后,就可以在Servlet里面写webService调用的代码了
- package com.test.ws;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.codehaus.xfire.XFire;
- import org.codehaus.xfire.XFireFactory;
- import org.codehaus.xfire.client.XFireProxyFactory;
- import org.codehaus.xfire.service.Service;
- import org.codehaus.xfire.service.binding.ObjectServiceFactory;
- /**
- * <p>Title: ClientTestServlet</p>
- * <p>Description: 测试Servlet</p>
- */
- public class ClientTestServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);
- XFire xfire = XFireFactory.newInstance().getXFire();
- XFireProxyFactory factory = new XFireProxyFactory(xfire);
- String serviceUrl = "http://localhost:8080/XFireWebService/services/HelloService";
- IHelloService client = null;
- try {
- client = (IHelloService) factory.create(serviceModel, serviceUrl);
- } catch (MalformedURLException e) {
- e.printStackTrace();
- }
- String str = client.getTestString("Beijing");
- request.setAttribute("str", str);
- EnterVO enterVO = new EnterVO();
- enterVO.setName("Yaodi");
- enterVO.setAge(26);
- ExceedVO vo = client.getTestObject(enterVO);
- request.setAttribute("vo", vo);
- List<String> al = new ArrayList<String>();
- al.add("111");
- al.add("222");
- al.add("333");
- List list = client.getTestList(al);
- request.setAttribute("list", list);
- request.getRequestDispatcher("/result.jsp").forward(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
客户端的web.xml如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>ClientTestServlet</servlet-name>
- <servlet-class>com.test.ws.ClientTestServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ClientTestServlet</servlet-name>
- <url-pattern>/ClientTest.do</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>ClientTest.do</welcome-file>
- </welcome-file-list>
- </web-app>
(11)、注意:XFireWebService项目里的IHelloService.aegis.xml文件,也要放到XFireWebClient项目中来,位置与ClientTestServlet.java同级
(12)、Servlet返回的结果页面:result.jsp
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <%@ page isELIgnored="false"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>测试客户端</title>
- </head>
- <body>
- 测试客户端!!!<br>
- String:${str} <br>
- Object:${vo.descStr} <br>
- List:<br>
- <c:forEach items="${list}" var="list">
- ${list.name} --- ${list.age} <br>
- </c:forEach>
- </body>
- </html>
(13)、同样将这个Web项目发布,同时启动XFireWebService和XFireWebClient这两个应用,然后在地址栏里面输入http://localhost:8080/XFireWebClient/
此时会调用客户端的Servlet,然后调用其doGet方法,如果正常的话,可以看到页面输出结果了(*^__^*)
注:参考文章地址http://di201yao.iteye.com/blog/310292
源码下载地址(测试通过,下载时需要修改tomcat服务器的端口,我用的端口是18080):http://download.csdn.net/detail/carboncomputer/8445449
WebService之XFire和SOAP实例(基于JAVA)的更多相关文章
- Java调用webservice接口方法(SOAP message、xfire、axis)
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...
- JAX-WS 学习一:基于java的最简单的WebService服务
JAVA 1.6 之后,自带的JAX-WS API,这使得我们可以很方便的开发一个基于Java的WebService服务. 基于JAVA的WebService 服务 1.创建服务端WebService ...
- 转载 基于JAVA每月运势api调用代码实例
代码描述:基于JAVA每月运势api调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/58 原文链接:http://outofmemory.cn/code-snip ...
- soap实例入门(转)
SOAP的HelloWord实例- - 1.1 前言 2005-3-2公司开会并分给我一个任务:写一个程序从福建移动的BOSS系统取出一些相关数据.我得到的资料仅仅有一个“福建移动BOSS与业务增值 ...
- 基于java自身技术实现消息方式的系统间通信
这篇博客基本照搬了分布式java应用基础与实践一书的内容 java自带的远程调用分两种一种是rmi,一种是webservice 我们先看rmi(remote method invoke)# 使用rmi ...
- php soap实例讲解
一,什么是soap,什么是wsdl,为什么要用他们 SOAP是基于XML和HTTP通信协议,xml各种平台,各种语言都支持的一个种语言.http呢它得到了所有的因特网浏览器及服务器的支持. WSDL ...
- JVM学习(1)——通过实例总结Java虚拟机的运行机制
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...
- spring实战六之使用基于java配置的Spring
之前接触的都是基于XML配置的Spring,Spring3.0开始可以几乎不使用XML而使用纯粹的java代码来配置Spring应用.使用基于java配置的Spring的步骤如下: 1. 创建基于ja ...
- 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写
基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作 ...
随机推荐
- CI框架下nginx重写规则
因为: server { listen ; server_name 222.73.130.124; location / { index index.html index.htm index.php; ...
- asp.net 完善注册登录+sqlite数据库
结合sqlite数据库,完善asp.net制作的web网页中的注册和登录操作. 1. Account-Register.aspx <%@ Page Title="" Lang ...
- 浅析C#中 ConcurrentDictionary的实现
简单画了一张图 (灵魂画手 →_→) 如图 ConcurrentDictionary 其中有个tables 对象主要存储,而这个 tables 是一个 很多区块的 数组 ,每个区块 又是一个node的 ...
- DEDECMS 添加栏目图片
当我们一个栏目列表都用缩略图来表示产,而不仅仅只是文字,如果没有这项功能会非常麻烦,网上有很多这方面的资料,但是都试过了有很多问题,自己研究一下,测试基本通过.需要新加字段 typeimg 后台执行S ...
- 计算机系统监控 PerformanceCounter
PerformanceCounter 컴퓨터 성능 머니터링 CUP Processor 메모리 하터웨어 DB (CPU,User Connection,Batch Request,Blocking ...
- Memcache集群安装与配置
Memcache集群的安装和配置 :http://blog.163.com/asd_wll/blog/static/210310402013084405481/
- Java并发编程(一):并发与高并发等基础概念
并发概念 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时存在的,每个线程都处于执行过程中的某个状态.如果运行在多核处理器上,程序中的每个线程都将 ...
- js setInterval()函数 [倒计时用]
定义和用法: setInterval() 方法用于在指定的毫秒数后调用函数或计算表达式.它与setTimeout()方法不同的是前者可以无限的循环,不会受调用函数的限制,要想退出此循环可 ...
- 多线程-ThreadPoolExecutor
线程池 线程池是可以控制线程创建.释放.并通过某种策略尝试复用线程去执行任务的一种管理框架,从而实现线程资源与任务之间的一种平衡. 类图 Executor Executor是最基本的执行接口:“执行者 ...
- [svc]linux文件特殊权限
这是老以前写的文章, 断断续续的可见那时候的心态还是不稳的. 生产使用: g1,g2组2个组的员工, g2组要访问g1组/home下的文件,rx权限. 这个setfacl就有用. 方法1: 修改普 ...