企业级开发WEB服务应用

上传人:公**** 文档编号:590156902 上传时间:2024-09-12 格式:PPT 页数:46 大小:2.17MB
返回 下载 相关 举报
企业级开发WEB服务应用_第1页
第1页 / 共46页
企业级开发WEB服务应用_第2页
第2页 / 共46页
企业级开发WEB服务应用_第3页
第3页 / 共46页
企业级开发WEB服务应用_第4页
第4页 / 共46页
企业级开发WEB服务应用_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《企业级开发WEB服务应用》由会员分享,可在线阅读,更多相关《企业级开发WEB服务应用(46页珍藏版)》请在金锄头文库上搜索。

1、第六章第六章WEB服务(服务(WEB SERVICE)开发和应用)开发和应用课程内容课程内容WebService的各种创建和查看 实现WebService客户端 WebService的应用场合WebService的优点和缺点 WebService的性能优化 创建和查看创建和查看WEB服务服务Web Service软件的支持软件的支持 Web Service构建工具如下:构建工具如下: 微软微软.NET IBM的的WebSphere Borland的的JBuilder 开源的开源的Eclipse 总之,在总之,在Web Service开发上,开发上,.NET 和和Java都是很好的选择,尽管两者

2、都是很好的选择,尽管两者现在都有一些需要完善的地方,但是就目前来说,它们还是最好的开发手段现在都有一些需要完善的地方,但是就目前来说,它们还是最好的开发手段和技术。具体选择哪种开发工具,也是仁者见仁,智者见智的问题。和技术。具体选择哪种开发工具,也是仁者见仁,智者见智的问题。 使用使用XFire开发开发Web服务服务 一个一个Demo: 一个银行业应用程序,将资金从一个账户转到另外一个账户上。一个银行业应用程序,将资金从一个账户转到另外一个账户上。 它需要四个输入参数: String fromAccount:转帐的帐户帐号。 String toAccount:被转到的帐户帐号。 double

3、amount:转帐的资金数目。 String bankName:服务的银行名称。 XFire是一个免费的开源SOAP框架,它不仅可以极大方便地实现这样一个环境,并且可以提供许多Web Services规范中的高级特征,这些特征在多数的商业或者开源工具都没有提供。下面你将会看到使用XFire创建Web Services是多么的简单。 接口的设计:接口的设计: package com.test.webservice;public interface IBankService public String transferFunds(String fromAccount, String toAccou

4、nt, double amount, String bankName);编写编写Java类简单的实现以上接口(代码省略)类简单的实现以上接口(代码省略) Web应用的部署描述符应用的部署描述符 首先,修改首先,修改web.xml。我们需要增加下面的。我们需要增加下面的XFire servlet相关的条相关的条目,部分代码如下:目,部分代码如下: XFireServlet/servlet/XFireServlet/*XFireServlet/services/* 在Java中,Web应用程序通常需要至少一个部署描述符对其进行配置。XFire本身是一个基于Servlet的应用程序。因此,我们需要增

5、加必要的引用到描述符文件中。然后我们还必须配置将要创建的Web Services。我们使用一个称为services.xml的新文件来完成这件事。 services.xml Web Services是由一个叫做是由一个叫做services.xml的文件组成的,的文件组成的,存放在存放在META-INF/xfire目录下目录下 。该文件的部分配置代码如下:。该文件的部分配置代码如下:BankServicecom.test.webservice.IBankServicecom.test.webservice.BankServiceImplwrappedliteralapplication分析分析se

6、rvice.xml文件中的元素文件中的元素 ,它可以是你提供任何的合法名字。这将会被客,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要定位你的服务的组件用到。可以在浏户端程序和其它需要定位你的服务的组件用到。可以在浏览器上使用这个名字来查看览器上使用这个名字来查看WSDL。 。任何合法的。任何合法的XML名字都是可以的。名字都是可以的。用来唯一标识你的服务的各个参数。用来唯一标识你的服务的各个参数。 元素包含了元素包含了Java类的名字,它指定了方法类的名字,它指定了方法签名。在我们的例子中,它是接口签名。在我们的例子中,它是接口IBankingService。如果。如果Java类

7、没有实现任何接口,就需要把类的名字放在这里。类没有实现任何接口,就需要把类的名字放在这里。在你的在你的Java类或者接口中可能有几个方法。只需要一个入类或者接口中可能有几个方法。只需要一个入口把它们全部发布为口把它们全部发布为Web Services。 保存了实现方法的保存了实现方法的Java类名。这类名。这是一个可选元素。如果上一个元素是一个可选元素。如果上一个元素包含了一包含了一个接口,那么相应的实现类必须在这里指定。个接口,那么相应的实现类必须在这里指定。 基本的基本的Web Services开发步骤开发步骤 基本的基本的Web Services开发步骤开发步骤 如下:如下:1编写Jav

8、a类,类中的方法和默认构造函数确保为public。2增加XFire servlet相关条目到web.xml中。3创建services.xml,把它放到WEB-INF/classes/META-INF/xfire目 录下。4增加XFire和第三方包到你的Web应用的WEB-INF/lib文件夹中。XFire的其他高级特性的其他高级特性 本地数据绑定支持本地数据绑定支持POJOs(plain-old Java objects)、)、XMLBeans、JAXB(Java Architecture for XML Binding)、)、Castor等等。等等。 使用使用StAX(Streaming A

9、PI for XML)处理处理XML文档。文档。 支持多种传输协议,如支持多种传输协议,如HTTP、JMS(Java Message Service)和和JVM内部传输。内部传输。 嵌入式,这是嵌入式,这是XFire的核心功能之一。的核心功能之一。 丰富的丰富的API,它使,它使XFire可高度自定义可高度自定义 。兼容最新的标准例如兼容最新的标准例如SOAP1.1(没有加密远程工程调用,或者(没有加密远程工程调用,或者RPC)和)和1.2、WSDL1.1等。等。其他开发其他开发Web服务的途径服务的途径一:使用EJB来暴露Web服务二:将Web工程发布为Web服务 查看查看Web服务服务 假

10、如我们的Web服务是发布在JBoss服务器中的,我们可以通过JBoss管理平台查看刚才发布的Web Service,我们可以输入:“http:/localhost:8080/jbossws/”进入JBossWS的查看界面 ,点击“View”连接后,可以查看已经发布的Web服务 两种实现两种实现Web服务的方法服务的方法 1开始编写Java类,并让容器去生成WSDL及其它所需要的XML文档;2开始编写(或直接使用现成的)WSDL文件,并借助于开发工具生成所需要的Java类。 其他开发其他开发Web服务的途径服务的途径实现实现WEB服务客户服务客户调用调用WebService的方法的方法 在在J2

11、EE平台中,平台中,Web服务客户同服务客户同EJB客户类似。如以下两种方式能客户类似。如以下两种方式能够访问到够访问到Web服务:服务: 1单独的JAX-WS客户。它们不借助于JNDI来访问Web服务。2J2EE客户(比如Web客户、J2EE应用客户)。它们借助于客户端的JNDI上下文访问Web服务。 分析:分析:第一种方式:不借助于JNDI,即单独客户,比如那些未运行在应用服务器中的远程Java客户能够访问到Web服务。第二种方式:依赖于Dispatch对象。它在运行的时候以来动态调用接口(Dynamic Invocation Interface,DII)创建调用对象。 开发一个客户端开发

12、一个客户端 如以下代码: /创建一个服务模型创建一个服务模型Service serviceModel = new ObjectServiceFactory().create(IBankService.class);/获得服务的代理工厂获得服务的代理工厂XFire xfire = XFireFactory.newInstance().getXFire();XFireProxyFactory factory = new XFireProxyFactory(xfire); 可以使用任何的SOAP工具创建客户端,例如,.Net或者Apache Axis,有很多种方法,使用从WSDL产生的stubs,使

13、用动态代理等等。下面这个例子中,我们使用一个动态代理,以一个简单的Servlet形式,叫做WsClient.java。为了保持代码量最小,所有在屏幕显示的元素都放在了doGet()方法中。 String serviceUrl = http:/localhost:8080/BankWebService/services/BankService;IBankService client = null;try client = (IBankService) factory.create(serviceModel, serviceUrl); catch (MalformedURLException e)

14、 log.error(WsClient.callWebService(): 出现异常: + e.toString();/调用服务调用服务String serviceResponse = ;try serviceResponse = client.transferFunds(fromAccount, toAccount, amount, currency); catch (Exception e)/返回服务的调用结果返回服务的调用结果return serviceResponse; WEB服务的应用探讨服务的应用探讨WebService的缺点的缺点 XML限制限制 无状态(无状态(stateles

15、s)的服务)的服务 数据绑定也存在一些不足数据绑定也存在一些不足 技术要求高,学习曲线较长技术要求高,学习曲线较长 在体会到在体会到WebService自身的优点的同时,不要忘了自身的优点的同时,不要忘了WebService也存在很多的缺点:也存在很多的缺点:什么应用适合什么应用适合Web Services? 基于基于WAN和和Internet的应用的应用 基于异构平台的应用基于异构平台的应用 需要强安全特性的应用需要强安全特性的应用 EAI(企业应用集成)(企业应用集成) 行业内部行业内部B2B应用应用 就目前来说,就目前来说,Web Services比较适合用于下列形式的应用:比较适合用于

16、下列形式的应用: 提高提高Web Services的性能的性能 要想提高要想提高Web Services应用的性能,需要对整个系统做全应用的性能,需要对整个系统做全盘的考虑。一般来说,有以下几点需要注意:盘的考虑。一般来说,有以下几点需要注意: (1)Web Services的颗粒度的颗粒度 ,Web Services比较适用于比较适用于大颗粒度的应用,在一个调用中便获得所有的信息大颗粒度的应用,在一个调用中便获得所有的信息 (2)谨慎使用)谨慎使用XML接口接口 ,避免不必要的,避免不必要的XML文档的解文档的解析和效验;在处理析和效验;在处理XML的时候,尽量将的时候,尽量将XML转换成内

17、部转换成内部对象,对象,XML的传递只会增加系统的开销。的传递只会增加系统的开销。 (3)最大可能性使用)最大可能性使用CACHE ,可以使用可以使用CACHE(缓冲缓冲技术技术)。无论是客户端的。无论是客户端的CACHE还是服务器端的还是服务器端的CACHE,都能大大提高系统的性能。,都能大大提高系统的性能。 本章总结本章总结WebService的各种创建和查看 实现WebService客户端 WebService的应用场合WebService的优点和缺点 WebService的性能优化 动手实践:人数计算器动手实践:人数计算器人数计数器人数计数器 要开始本章的体验项目首先要做以下的准备工作

18、:要开始本章的体验项目首先要做以下的准备工作: (1)首先将本章体验项目下配置文件按照指定要求放到指定目录)首先将本章体验项目下配置文件按照指定要求放到指定目录 下:下:C盘根目录下。盘根目录下。(2)之后将体验项目部署到服务器中,并启动服务器。)之后将体验项目部署到服务器中,并启动服务器。(3)最后在浏览器中输入以下地址:)最后在浏览器中输入以下地址: http:/localhost:8080/CounterWebService/counter.jsp 如果成功运行则会看到类似以下的画面,如图如果成功运行则会看到类似以下的画面,如图6-1所示:所示: 图6-1 计数器页面 可以看到页面中成功

19、的输出了当天的访问量以及当周的访问量和总访可以看到页面中成功的输出了当天的访问量以及当周的访问量和总访问量,当刷新页面的时候,会看到统计的数字依次加一。问量,当刷新页面的时候,会看到统计的数字依次加一。 实现步骤实现步骤(1)新建一个)新建一个WebService工程工程 ,之后编写业务操作的接口,之后编写业务操作的接口类:类:ICounterSerivce ; (2)实现该接口的业务)实现该接口的业务Bean :CounterServiceImpl (3)编写一个简单客户端是如何调用以上)编写一个简单客户端是如何调用以上Web服务服务 (4)在工程中新建一个)在工程中新建一个JSP页面:页面

20、:counter.jsp,通过客户端,通过客户端Bean应用该应用该Web服务服务 在开始开发在开始开发WebSerivce之前,我们首先要做的是在之前,我们首先要做的是在c盘下或者是其它目盘下或者是其它目录下新建一个文件录下新建一个文件-counter.xml,用于保存记录的数字,用于保存记录的数字 。(1)创建一个Web服务,实现对用户访问页面的次数进行分天或分周进行统计。(2)在Java中调用该Web服务,并在JSP页面中把结果显示出来。(1)在开始开发Web Serivce之前,我们首先要做的是在C盘下或者是其它目录下新建一个文件counter.xml,用于保存记录的数字,counte

21、r.xml文件内容如下:admin123456124562007-6-18 5:42:58(2)新建一个Web Services工程,命名为CounterWebSerivce,之后编写业务操作的接口类ICounterSerivce,代码如下:package com.test.webserivce;public interface ICounterSerivce public String counter(String userName,String password);(3)编写实现类CounterServiceImpl,代码如下:package com.test.webservice;imp

22、ort java.io.File;import java.io.FileWriter;import java.io.IOException;import java.text.DateFormat;import java.text.ParseException;import java.util.*;import org.dom4j.*;public class CounterServiceImpl implements ICounterService private final String filePath = c:/counter.xml;private final static DateF

23、ormat DATEFORMATER = DateFormat.getDateTimeInstance();private final String errorInfor=0;0;/* *功能:打开计数器文档 */private Document openDocument()/* *功能:对文档进行解析,之后进行加一操作,保存 *该方法为同步的 */public synchronized String doCount(String userName, String passWord)/public String counter(String userName,String password)

24、if(userName=null|password=null)return null;elsereturn doCount(userName,password);/测试用的main()方法,最后屏蔽该段代码/*public static void main(String args )CounterServiceImpl c=new CounterServiceImpl();String src=c.counter(admin, 123456);System.out.println(src);*/(4)下面我们一一实现以上的方法: openDocument()方法的实现:主要是使用SAXRead

25、er的read()方法来获得一个指定xml文件路径的Document文档对象。代码如下:private Document openDocument()Document doc=null;SAXReader reader = new SAXReader();try File xmlfile = new File(filePath);doc = reader.read(xmlfile);xmlfile=null;catch (DocumentException e) e.printStackTrace();return doc; doCount()方法的实现:该方法一定是要同步的,不然会导致数据的

26、不正确。该方法是主要的操作方法,通过openDocument()方法获取的Document对象doc来对XML文件进行解析,分别获取代表周访问量、日访问量、登记时间、总访问量的数据,并分别保存到wc、dc、rt、tc变量中,之后利用Date对象和Calendar对象和当前时间进行对比,从而修改XML文件的数据并将修改后的数据返回以供客户端调用。具体代码如下:public synchronized String doCount(String userName, String passWord)Document doc = openDocument();Date currdt = new java

27、.util.Date();/wc:month counter(周计数器); dc: day counter(日计数器); /rt: registe time登记时间;tc:Total counter(总计数器)String wc=-1,dc=-1,tc=-1,rt=-1;Element root = doc.getRootElement();Element selitem=null,item=null;for(Iterator it = root.elementIterator(item); it.hasNext();)item = (Element)it.next();if(userName

28、.equals(item.element(userName).getText() selitem=item;if(!passWord.equals(item.elementText(passWord)/密码不对,直接返回return errorInfor;dc=item.element(dc).getText();wc=item.element(wc).getText();tc=item.element(tc).getText();rt=item.element(rt).getText();break;/处理计数器加一操作。Calendar currcr=Calendar.getInstanc

29、e();Date lastdt = null;try /获得xml文件记录的登录时间lastdt = DATEFORMATER.parse(rt); catch (ParseException e) lastdt = new java.util.Date();Calendar lastcr = Calendar.getInstance();lastcr.setTime(lastdt);currcr.setTime(currdt);/System.out.println(上次登记时间:+DATEFORMATER.format(lastdt);/System.out.println(本次登记时间:

30、+DATEFORMATER.format(currdt);/对年判断是否相同if(lastcr.get(Calendar.YEAR)=currcr.get(Calendar.YEAR)/如果周相同,周计数加1if(lastcr.get(Calendar.WEEK_OF_YEAR)= =currcr.get(Calendar.WEEK_OF_YEAR)wc = String.valueOf(Integer.parseInt(wc)+1);elsewc=1;/如果日相同,日计数加1if(lastcr.get(Calendar.DAY_OF_YEAR)= =currcr.get(Calendar.D

31、AY_OF_YEAR)dc = String.valueOf(Integer.parseInt(dc)+1);elsedc = 1;/年不一样,则月计数器、周计数器日计数器肯定也不一样。elsedc=1; wc=1; tc =String.valueOf(Integer.parseInt(tc)+1);/总数器总是加1。selitem.element(wc).setText(wc);selitem.element(dc).setText(dc);selitem.element(tc).setText(tc);/登记记录时间selitem.element(rt).setText(DATEFORM

32、ATER.format(currdt); try XMLWriter xw = new XMLWriter(new FileWriter(filePath);xw.write(doc);xw.close();catch(IOException e) e.printStackTrace(); return dc+;+wc+;+tc;(5)以上代码主要涉及到了XML的读写操作和日期的判断,这些此处我们不必深究,主要是以上业务的逻辑操作掌握即可。下面我们看一下客户端是如何调用以上Web服务的:客户端Bean:CounterServiceClient.javapackage com.counterse

33、rvice.client;import org.codehaus.xfire.XFireFactory;import org.codehaus.xfire.client.XFireProxyFactory;import org.codehaus.xfire.service.Service;import org.codehaus.xfire.service.binding.ObjectServiceFactory;import com.test.webservice.ICounterService;public class CounterServiceClient private String

34、counterarr ;public boolean getCounter(String CounterName, String password) boolean flag = false;try Service srvcModel =new ObjectServiceFactory().create(ICounterService.class);XFireProxyFactory factory =new XFireProxyFactory(XFireFactory.newInstance().getXFire();String endpointURL = http:/localhost:

35、8080/CounterWebService/services/CounterService;/填写你要调用的方法名称ICounterService srvc = (ICounterService) factory.create(srvcModel,endpointURL);String counter=srvc.counter(CounterName, password);counterarr = counter.split(;);flag = (counterarr!=null&counterarr.length = 3);catch (Exception e) e.printStackT

36、race();return flag;public String getDc() return counterarr0;public String getWc() return counterarr1;public String getTc() return counterarr2;/测试用的main()方法,测试完毕后屏蔽该段代码/*public static void main(String args )CounterServiceClient cl=new CounterServiceClient();boolean b=cl.getCounter(admin, 123456);System.out.println(获得服务:+b);System.out.println(总访问量:+cl.counterarr2);*/(6)最后在工程中新建一个JSP页面:counter.jsp,通过客户端Bean应用该Web服务。counter.jsp代码如下:base href=My JSP counter.jsp starting page计数器页面 今天访问量: 本周访问量: 总访问量:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号