企业级开发WEB服务应用.ppt

上传人:小飞机 文档编号:5222262 上传时间:2023-06-15 格式:PPT 页数:46 大小:2.11MB
返回 下载 相关 举报
企业级开发WEB服务应用.ppt_第1页
第1页 / 共46页
企业级开发WEB服务应用.ppt_第2页
第2页 / 共46页
企业级开发WEB服务应用.ppt_第3页
第3页 / 共46页
企业级开发WEB服务应用.ppt_第4页
第4页 / 共46页
企业级开发WEB服务应用.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《企业级开发WEB服务应用.ppt》由会员分享,可在线阅读,更多相关《企业级开发WEB服务应用.ppt(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 amount:转帐的资金数目。String bankName:服务的银行名称。,XFire是一个免费的开源SOAP框架,它不仅可以极大方便地实现这样一个环境,并且可以提供许多Web Services规范中的高级特征,这些特征在多数的商业或者开源工具都没有提供。下面你将会看到使用XFire创建Web Services是多么的

3、简单。,接口的设计:,package;public interface IBankService public String transferFunds(String fromAccount,String toAccount,double amount,String bankName);,编写Java类简单的实现以上接口(代码省略),Web应用的部署描述符,首先,修改web.xml。我们需要增加下面的XFire servlet相关的条目,部分代码如下:,XFireServlet/servlet/XFireServlet/*XFireServlet/services/*,在Java中,Web应用

4、程序通常需要至少一个部署描述符对其进行配置。XFire本身是一个基于Servlet的应用程序。因此,我们需要增加必要的引用到描述符文件中。然后我们还必须配置将要创建的Web Services。我们使用一个称为services.xml的新文件来完成这件事。,services.xml,Web Services是由一个叫做services.xml的文件组成的,存放在META-INF/xfire目录下。该文件的部分配置代码如下:,BankServicewrappedliteralapplication,分析service.xml文件中的元素,,它可以是你提供任何的合法名字。这将会被客户端程序和其它需要

5、定位你的服务的组件用到。可以在浏览器上使用这个名字来查看WSDL。任何合法的XML名字都是可以的。用来唯一标识你的服务的各个参数。元素包含了Java类的名字,它指定了方法签名。在我们的例子中,它是接口IBankingService。如果Java类没有实现任何接口,就需要把类的名字放在这里。在你的Java类或者接口中可能有几个方法。只需要一个入口把它们全部发布为Web Services。保存了实现方法的Java类名。这是一个可选元素。如果上一个元素包含了一个接口,那么相应的实现类必须在这里指定。,基本的Web Services开发步骤,基本的Web Services开发步骤 如下:,1编写Jav

6、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 API for XML)处理XML文档。支持多种传

7、输协议,如HTTP、JMS(Java Message Service)和JVM内部传输。嵌入式,这是XFire的核心功能之一。丰富的API,它使XFire可高度自定义。兼容最新的标准例如SOAP1.1(没有加密远程工程调用,或者RPC)和1.2、WSDL1.1等。,其他开发Web服务的途径,一:使用EJB来暴露Web服务二:将Web工程发布为Web服务,查看Web服务,假如我们的Web服务是发布在JBoss服务器中的,我们可以通过JBoss管理平台查看刚才发布的Web Service,我们可以输入:“http:/localhost:8080/jbossws/”进入JBossWS的查看界面,点击

8、“View”连接后,可以查看已经发布的Web服务,两种实现Web服务的方法,1开始编写Java类,并让容器去生成WSDL及其它所需要的XML文档;2开始编写(或直接使用现成的)WSDL文件,并借助于开发工具生成所需要的Java类。,其他开发Web服务的途径,实现WEB服务客户,调用WebService的方法,在J2EE平台中,Web服务客户同EJB客户类似。如以下两种方式能够访问到Web服务:,1单独的JAX-WS客户。它们不借助于JNDI来访问Web服务。2J2EE客户(比如Web客户、J2EE应用客户)。它们借助于客户端的JNDI上下文访问Web服务。,分析:,第一种方式:不借助于JNDI

9、,即单独客户,比如那些未运行在应用服务器中的远程Java客户能够访问到Web服务。第二种方式:依赖于Dispatch对象。它在运行的时候以来动态调用接口(Dynamic Invocation Interface,DII)创建调用对象。,开发一个客户端,如以下代码:,/创建一个服务模型Service serviceModel=new ObjectServiceFactory().create(IBankService.class);,/获得服务的代理工厂XFire xfire=XFireFactory.newInstance().getXFire();XFireProxyFactory fact

10、ory=new XFireProxyFactory(xfire);,可以使用任何的SOAP工具创建客户端,例如,.Net或者Apache Axis,有很多种方法,使用从WSDL产生的stubs,使用动态代理等等。下面这个例子中,我们使用一个动态代理,以一个简单的Servlet形式,叫做WsClient.java。为了保持代码量最小,所有在屏幕显示的元素都放在了doGet()方法中。,String serviceUrl=http:/localhost:8080/BankWebService/services/BankService;IBankService client=null;,try cl

11、ient=(IBankService)factory.create(serviceModel,serviceUrl);catch(MalformedURLException e)log.error(WsClient.callWebService():出现异常:+e.toString();/调用服务String serviceResponse=;try serviceResponse=client.transferFunds(fromAccount,toAccount,amount,currency);catch(Exception e),/返回服务的调用结果return serviceResp

12、onse;,WEB服务的应用探讨,WebService的缺点,XML限制 无状态(stateless)的服务 数据绑定也存在一些不足 技术要求高,学习曲线较长,在体会到WebService自身的优点的同时,不要忘了WebService也存在很多的缺点:,什么应用适合Web Services?,基于WAN和Internet的应用 基于异构平台的应用 需要强安全特性的应用 EAI(企业应用集成)行业内部B2B应用,就目前来说,Web Services比较适合用于下列形式的应用:,提高Web Services的性能,要想提高Web Services应用的性能,需要对整个系统做全盘的考虑。一般来说,有

13、以下几点需要注意:,(1)Web Services的颗粒度,Web Services比较适用于大颗粒度的应用,在一个调用中便获得所有的信息(2)谨慎使用XML接口,避免不必要的XML文档的解析和效验;在处理XML的时候,尽量将XML转换成内部对象,XML的传递只会增加系统的开销。(3)最大可能性使用CACHE,可以使用CACHE(缓冲技术)。无论是客户端的CACHE还是服务器端的CACHE,都能大大提高系统的性能。,本章总结,WebService的各种创建和查看 实现WebService客户端 WebService的应用场合WebService的优点和缺点 WebService的性能优化,动手

14、实践:人数计算器,人数计数器,要开始本章的体验项目首先要做以下的准备工作:,(1)首先将本章体验项目下配置文件按照指定要求放到指定目录 下:C盘根目录下。(2)之后将体验项目部署到服务器中,并启动服务器。(3)最后在浏览器中输入以下地址:http:/localhost:8080/CounterWebService/counter.jsp 如果成功运行则会看到类似以下的画面,如图6-1所示:,图6-1 计数器页面,可以看到页面中成功的输出了当天的访问量以及当周的访问量和总访问量,当刷新页面的时候,会看到统计的数字依次加一。,实现步骤,(1)新建一个WebService工程,之后编写业务操作的接口

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

16、其它目录下新建一个文件counter.xml,用于保存记录的数字,counter.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)编写实现类CounterService

17、Impl,代码如下:package com.test.webservice;import 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:

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

19、ing userName,String password)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)下面我们一一实现以上的方法:open

20、Document()方法的实现:主要是使用SAXReader的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()方法的实现

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

22、 currdt=new java.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(us

23、erName.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.getI

24、nstance();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(本次登记时间:+DATE

25、FORMATER.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.DAY_OF_YEAR

26、)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(DATEFORMATER.format(curr

27、dt);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.counterservice.client;import

28、 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 counterarr;public

29、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:8080/CounterWebService/serv

30、ices/CounterService;,/填写你要调用的方法名称ICounterService srvc=(ICounterService)factory.create(srvcModel,endpointURL);String counter=srvc.counter(CounterName,password);counterarr=counter.split(;);flag=(counterarr!=null,/测试用的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代码如下:My JSP counter.jsp starting page计数器页面 今天访问量:本周访问量:总访问量:,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号