如果使用GOOGLE、BAIDU等搜索工具,搜索WebService的相关知识,可以查到N多的网页,我就是通过这些网页的学习,逐渐掌握了些WebService的相关知识。这里对那些无私奉献知识的人一并表示感谢。
网上关于WebService的例子,多是一些简单得不能再简单的hello world的例子,简单得以至于你对WebService没有什么感觉。有了WebService的基本知识后,我一直再想,可以把什么样的即简单又实用的东东做成WebService,开展示一下其功能特点。今天终于想到一个:计数器,计数器用得比较多,功能比较独立,做成WebService可以一劳永逸为不同系统(不管是JSP还ASP,这是WebService的突出优点)、不同应用节省此类编码工作,可以说以后再也不用写计数器了。只要用就行了。
说了这么多废话,下面我们开始。本教程介绍一下WebService环境搭建、服务部署的相关知识,然后介绍一个计数器的开发。
运行图:
二、基础工作
1.开发环境 我使用axis做为Web Service引擎,它是Apache的一个开源web service引擎。它目前最为成熟的开源web service引擎之一。下面我主要介绍一下如何使用Axis搭建web service 服务的环境。 ①安装tomcat5.0应用服务器(也可以装5.5,不过我一直在用5.0); ②解压下载( http://ws.apache.org/Axis)后的axis包,将包中axis目录复制到tomcat目录下的webapps目录下; ③将axis/WEB-INF/lib目录下类文件复制到tomcat目录下的common/lib目录下; ④重新启动tomcat,访问http://localhost:8080/axis/happyaxis.jsp,如果能访问,表示安装成功; 注意,axis有几个可选的包,如email.jar....,你可以找来放到tomcat目录下的common/lib目录下,如果不使用相关的功能也可以不用。 这样,开发环境就搭建好了。
2.如何部署Web Service 部署有三种方式:Dynamic Invocation Interface(DII)、Stubs方式、Dynamic Proxy方式;这里就介绍一下简单,也是我使用的方式:DII。 DII方式中,先写好服务的JAVA文件(假设名字为helloworld.java),然后把它(注意是源文件)拷贝到webapps/axis目录中,后缀改成jws(此时文件名为:helloworld.jws),然后访问连接http://localhost:8080/Axis/helloworld.jws?wsdl,页面显示Axis自动生成的wsdl,这样一个Web Service就部署好了。怎么样,是不是很简。 我的计数器服务就是以这种方式部署的,下文中我会只说将计数器服务部署好,你可不要说:怎么部署,我不会呀。那在古代就要被打手板了。所以我想,古代只学四书五经也是件好事呀。现在要学这么多东西,半天学不会,手要被打烂了。
三、计数器服务的编写 计数器大家都知道了,比较简单。我的计数器也同样简单,有以下功能及特点:提供四种计数器(总数器、月计数器、周计数器及日计数器);考虑到Web Service要服务于多种应用,这个计数器还支持多个用户;使用XML文件来记录数据。 记录文件名为:d:\counter.xml。注意,此文件在服务里是硬编码,如果修改名字,请在服务程序中也进行相应的修改。文件内容格式如下: <?xml version="1.0" encoding="UTF-8"?> <counter> <item> <name>wallimn</name> <password>123</password> <dc>59</dc> <wc>59</wc> <mc>59</mc> <tc>59</tc> <rt>2007-4-16 16:01:29</rt> </item> <counter> 说是计数器服务,其实跟编写普通的JAVA应用没有什么两样。我的计数器代码比较简单,我就不做过多的介绍了,把它贴在下面,源码中有少量注释,相信大家不看注释也看得懂。服务有只有一个接口:Counter(String name, String password),以后在客户端拿来用就可以了。还多说一句,我和程序使用到了dom4j解析xml包,要调试的请自行准备好jar包。部署方法请参照上文。 import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /** *功能:提供计数器服务的WebService,可以为多用户提供服务。<br/> * @version : V1.0 * @author : 王力猛(Email: wallimn@sohu.com QQ: 54871876) * @date : 2007-4-16 下午04:32:45 */ public class WsCounterByWallimn { //计数器文档,注意名字名路径。 private final String FileN = "d:/counter.xml"; private final static DateFormat DATEFORMATER = DateFormat.getDateTimeInstance(); //出错的情况下返回的值 private final static String ERRORINFO="-1;-1;-1;-1"; public WsCounterByWallimn(){ }
/** *功能:打开计数器文档<br/> *编码:王力猛 时间:2007-4-16 下午04:44:29<br/> */ private Document openDocument(){ Document doc=null; SAXReader reader = new SAXReader(); try { File xmlfile = new File(FileN); doc = reader.read(xmlfile); xmlfile=null; } catch (DocumentException e) { e.printStackTrace(); } return doc; }
/** *功能:取指定名称计数器的详细信息,并设置计数器加1。<br/> *编码:王力猛 时间:2007-4-16 下午04:49:57<br/> */ private synchronized String countertick( String name, String password){ Document doc = openDocument(); Date currdt = new java.util.Date(); //mc:month counter(月计数器); dc: day counter(日计数器); //tc: total counter(总计数器); wc: week counter(周计数器); //rt: registe time登记时间 String mc="-1",dc="-1",tc="-1",wc="-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(name.equals(item.element("name").getText())){ selitem=item; String pwd = item.elementText("password"); if(!password.equals(pwd)){ return ERRORINFO;//密码不对,直接返回 } mc=item.element("mc").getText(); dc=item.element("dc").getText(); tc=item.element("tc").getText(); wc=item.element("wc").getText(); rt=item.element("rt").getText(); break; } }
//如果selitem为空,说明没有个名字的计数器。则添加一个。 if(selitem==null){ //System.out.println("没有找到这个名字的计数器:"+name); rt=DATEFORMATER.format(currdt); selitem = doc.getRootElement().addElement("item"); selitem.addElement("name").setText(name); selitem.addElement("tc").setText("0"); selitem.addElement("mc").setText("0"); selitem.addElement("wc").setText("0"); selitem.addElement("dc").setText("0"); selitem.addElement("rt").setText(rt); selitem.addElement("password").setText(password); mc="0"; wc="0"; dc="0"; tc="0"; }
//处理计数器加一操作。 Calendar currcr=Calendar.getInstance(); //总数器总是加1。 tc =String.valueOf(Integer.parseInt(tc)+1); selitem.element("tc").setText(tc); Date lastdt = null; try { 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("本次登记时间:"+DATEFORMATER.format(currdt)); if(lastcr.get(Calendar.YEAR)==currcr.get(Calendar.YEAR)){ //月相同,月计数加1 if(lastcr.get(Calendar.MONTH)==currcr.get(Calendar.MONTH)){ mc = String.valueOf(Integer.parseInt(mc)+1); } else{ mc="1"; } //日相同,日计数加1 if(lastcr.get(Calendar.DAY_OF_YEAR)==currcr.get(Calendar.DAY_OF_YEAR)) dc = String.valueOf(Integer.parseInt(dc)+1); else dc = "1";
if(lastcr.get(Calendar.WEEK_OF_YEAR)==currcr.get(Calendar.WEEK_OF_YEAR)) wc = String.valueOf(Integer.parseInt(wc)+1); else wc = "1"; } else{//年不一样,则月计数器、周计数器日计数器肯定也不一样。 mc="1"; dc="1"; wc="1"; } selitem.element("mc").setText(mc); selitem.element("wc").setText(wc); selitem.element("dc").setText(dc); //登记记录时间 selitem.element("rt").setText(DATEFORMATER.format(currdt));
try { XMLWriter xw = new XMLWriter(new FileWriter(FileN)); xw.write(doc); xw.close(); } catch (IOException e) { e.printStackTrace(); } return tc+";"+mc+";"+wc+";"+dc; } /** *功能:服务暴露的接口,也就是指定名称、密码,返回指定的计数,并将计数器加1。<br/> *编码:王力猛 时间:2007-4-17 上午10:05:22<br/> */ public String Counter(String name, String password){ if(password==null || name==null)return ERRORINFO; return countertick(name, password); } }
四、客户端编写 客户端是个页面,为了条理清晰,我先写个调用Web Service的类,其内容如下: package com.wallimn.WebService;//调试请注意包名
import org.apache.axis.client.Call; import org.apache.axis.client.Service;
public class CounterServiceClient { private String counterarr[];
public boolean getCounter(String CounterName, String password) { boolean res = false; try { String endpoint = "http://localhost:8080/axis/WsCounterByWallimn.jws";//此处注意,请与你的开发环境匹配 Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName("Counter"); // 填写你要调用的方法名称 String counter = (String) call.invoke(new Object[] { CounterName, password }); counterarr = counter.split(";"); res = (counterarr != null && counterarr.length == 4); } catch (Exception e) { } return res; }
public String getDc() { return counterarr[3]; }
public String getMc() { return counterarr[1]; }
public String getTc() { return counterarr[0]; }
public String getWc() { return counterarr[2]; } }
到页面(test.jsp)上就简单了,我也把它贴在下面: <%@ page language="java" import="com.wallimn.WebService.CounterServiceClient" pageEncoding="GB18030"%> <% CounterServiceClient client = new CounterServiceClient(); client.getCounter("hello","123"); %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>计数器测试页面</title>
<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="wallimn,计数器,WebService"> <meta http-equiv="description" content="计数器使用示例"> </head>
<body> <h2 align="center">计数器详情</h2> <hr/> 总访问量:<%=client.getTc()%> <br/> 今天访问量:<%=client.getDc()%> <br/> 本周访问量:<%=client.getWc()%> <br/> 本月访问量:<%=client.getMc()%> <br/> <hr/> <p>欢迎交流<br/>博客:http://blog.csdn.net/wallimn<br/>电邮:wallimn@sohu.com</p> </body> </html>
|
相关推荐
用友NC65-uapstudio webservice开发配置说明文档 用友NC65-erp开发工具uapstudio进行开发webservice时,需要对开发工具进行必要的设置。以下是uapstudio中的webservice开发配置说明: 一、UAPStudio中的webservice...
### WebService开发过程详解 #### 一、概述 本文将详细介绍如何使用Eclipse集成开发环境(IDE)结合Tomcat服务器及Axis框架来开发一个简单的WebService应用。对于初学者来说,这是一个很好的入门指南,通过本教程...
EAS-WebService开发指南 本文档旨在指导开发者如何使用EAS-WebService开发指南来构建Web服务。下面将对该指南中的每个步骤进行详细的解释和分析。 Step 1: 设计开发工具中新建一个Facade对象 在EAS-WebService...
提供的“pb11+webservice开发分布式三层应用.doc”文档很可能会包含详细的步骤、示例代码和注意事项,指导开发者如何实际操作这个项目。建议仔细阅读并按照文档进行实践。 **8. 使用说明** “下载使用说明.htm”...
本开发资料主要围绕.NET Framework下的WebService开发进行,包括C#语言的实现和源码分析。下面将详细阐述相关知识点。 1. **SOAP与WSDL** - SOAP(Simple Object Access Protocol)是WebService的核心协议,用于...
综上所述,"webservice开发所需要的包"指的是使用Spring和CXF框架开发Web服务时所需的Java库,这些库以JAR文件的形式存在,版本为3.1.16。理解这些概念和流程对于成功地创建、运行和维护Web服务至关重要。
WebService 开发手册 WebService开发指南
3. **生成客户端代理类**:使用WSDL文件,开发者可以使用各种开发工具(如Java的Axis、.NET的Wsdl.exe等)生成客户端代理类,这些类封装了调用Web Service的具体细节,简化了开发工作。 4. **配置安全认证**:金蝶...
本教程“pb11+webservice开发分布式三层应用”着重讲解如何利用PowerBuilder 11和Webservice来构建分布式三层架构的应用程序。三层架构通常包括表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和...
【WebService开发指南】这篇文章主要介绍了基于Java的Axis2框架如何进行WebService的开发。Axis2是Apache组织提供的一个用于构建和部署Web服务的高级框架,它作为Axis1的升级版,提供了更多的特性和优化。 首先,...
在本压缩包文件中,"pb12 WEBSERVICE 开发 源码" 提供的是使用PowerBuilder 12进行WEBSERVICE开发的相关源代码。下面我们将详细探讨PB12与WEBSERVICE开发的相关知识点。 1. PowerBuilder 12基础: - PowerBuilder ...
WebService开发手册 WebService开发手册是指使用Web Service技术开发应用程序的指南。Web Service是一种基于XML的,平台无关的,跨语言的分布式应用程序的架构。它允许不同的应用程序之间相互通信和交换数据,从而...
【Webservice开发手册.pdf】是关于Webservice开发的详细指南,涵盖了从项目构建到服务发布、客户端调用的全过程。以下是对手册中的关键知识点的详细解释: 1. **准备依赖库**: 开发Webservice时,需要引入必要的...
一旦安装完成,插件的相关功能将在Eclipse的菜单、工具栏或者右键快捷菜单中体现,为开发人员提供无缝的webservice开发体验。 总之,“NC57 webservice 开发插件”是针对用友NC57平台的一款强大工具,它极大地提升...
eclipse axis webservice 开发 eclipse下使用axis2 开发webservice系统