Web服务优点
互操作性:实现不同系统间的相互调用(语言无关、平台无关)
Web服务是什么
Web 服务是一类应用程序,是能够用编程的方法通过Web调用来实现某个功能的应用程序
Web服务的体系结构
Web服务需要遵守的技术标准
1. XML(描述WEB服务数据的标准方法)
2. SOAP(表示WEB服务信息交换的协议)
3. WSDL(WEB服务描述语言)
4. UDDI(统一描述发现和集成)
2. SOAP(表示WEB服务信息交换的协议)
3. WSDL(WEB服务描述语言)
4. UDDI(统一描述发现和集成)
这里关于WebService就不多加详细介绍了,如果有兴趣可以查看百度百科 WebService,我这里收藏了一份:
http://pan.baidu.com/s/1bnpLo43
Java中比较流行的两种Web服务开源框架axis和XFire比较
使用Web服务的一个例子
添加XFire用户库
点击工具Window→Preferences
Add JARs添加lib下的所以jar包和xfire-all-1.2.6.jar;
客户端调用Web服务
训练要点:掌握利用XFire创建客户端,调用Web服务
需求说明:
任意输入一个数字n,返回1+2+…+n的累加和, 并在控制台显示出来
实现思路:
1、创建服务接口SumService.java
2、创建客户端调用类Client.java
3、运行求数字累加和Web服务
4、运行客户端调用服务,传入参数,获得运行结果
创建Web Service Project
点击新建 Web Service Project :SumWebService
WebService选择第二个REST 点击Next
现在User Libraries 选择刚刚创建的XFire完成
配置web.xml
<servlet> <display-name>XFireServlet</display-name> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>services.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
新建接口和实现类:
新建接口:
cn.edu.hqu.service下SumService;
package cn.edu.hqu.service; public interface SumService { /** * 返回1-n的累加和 * @param n * @return */ public int getSum(int n); }
新建实现类 实现 SumService
cn.edu.hqu.service.impl下SumServiceImpl:package cn.edu.hqu.service.impl; import com.service.SumService; public class SumServiceImpl implements SumService { public int getSum(int n) { int sum = 0; for (int i = 1; i <= n; i++) { sum += i; } return sum; } }
在src下新建services.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>SumService</name> <serviceClass>cn.edu.hqu.service.SumService</serviceClass> <implementationClass>cn.edu.hqu.service.impl.SumServiceImpl</implementationClass> <style>wrapped</style> <use>literal</use> <scope>application</scope> </service> </beans>
部署到tomcat启动,访问localhost:8080/SumWebService/services
Web服务的调用
获取有效WSDL地址
新建一个客户端Web project: Client
引入服务端那个项目SumWebService
右击项目,Properties
引入服务端那个项目SumWebService
右击项目,Properties
引入自己建的XFire标签库:右击项目 build path →add libra..→User Library Next 选择XFire完成;
Client新建SumClinet类
Client新建SumClinet类
public static void main(String[] args) throws Exception { //加载xfire //创建服务 Service service = new ObjectServiceFactory().create(SumService.class); //WSDL地址 String url = "http://localhost:8080/SumWebService/services/SumService"; XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire()); SumService sumService = (SumService) factory.create(service, url); //保证服务端有开启 System.out.println(sumService.getSum(100)); }运行之前,webService服务端(SumWebService)要先部署启动;
运行main,控制台输出5050 ;
但是这样两个项目耦合在一起了;
另外一种方式 SumClinet:
另外一种方式 SumClinet:
public static void main(String[] args) throws Exception { String wsdlLocation = "http://localhost:8080/SumWebService/services/SumService?wsdl"; Client client = new Client(new URL(wsdlLocation)); Object[] o =client.invoke("getSum",new Object[]{100}); System.out.println(o[0]); }运行main输出结果;
补充说明:点击web.xml
下的org.codehaus.xfire.transport.http.XfireConfigurableServlet进到该类:
我们可以看到
private final static String CONFIG_FILE = "META-INF/xfire/services.xml";
默认路径是在META-INF/xfire/services.xml
源码里:
下的org.codehaus.xfire.transport.http.XfireConfigurableServlet进到该类:
我们可以看到
private final static String CONFIG_FILE = "META-INF/xfire/services.xml";
默认路径是在META-INF/xfire/services.xml
源码里:
private String getConfigPath() { if (configPath == null || configPath.length() == 0) { return CONFIG_FILE; } return configPath; }
一开始会得到这个路径,如果路径为空的话,就会使用默认的路径;
所以我们在wen.xml里买指定 configPath路径,src下直接写文件名
<init-param> <param-name>config</param-name> <param-value>services.xml</param-value> </init-param>这样就不会报错了,或者可以将services.xml放在新建的META-INF/xfire/services.xml下;
Xfire下载:http://pan.baidu.com/s/1ntx8yLF
代码:http://pan.baidu.com/s/1vmXtG