`

Java开发WebService实例--计数器(上)

阅读更多
一、前言


   本文假定你有一定的J2EE开发经验,这个教程没有过多的涉及基础知识和开发细节。如果在阅读过程出有什么问题,还请与我联系交流。

  如果使用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 : wallimn(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/>
	 *编码:wallimn 时间: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/>
	 *编码:wallimn 时间: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/>
	 *编码:wallimn 时间: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);
	}
}


/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn 电邮:wallimn@sohu.com 时间:2007-04-17
博客:http://wallimn.iteye.com
   http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.ys168.com
/***********文章发表请与本人联系,作者保留所有权利*************/
   

4
0
分享到:
评论

相关推荐

    Java开发WebService实例--计数器.mht

    Java开发WebService实例--计数器.mht

    Java开发WebService实例

    ### Java开发WebService实例详解 在IT领域,尤其是企业级应用开发中,WebService作为一种标准化的、跨平台的服务交互方式,被广泛应用于系统间的数据交换与服务调用。本文将基于给定的“Java开发WebService实例”...

    Myeclipse创建WebService实例-很好用.doc

    Myeclipse创建WebService实例-很好用.doc 验证成功

    WebService实例-天气预报

    对于WebService开发,Asp.Net提供了System.Web.Services命名空间,其中的WebService类是创建WebService的基础。 三、创建天气预报WebService 1. 新建项目:在Visual Studio中,选择"新建项目",然后选择"Asp.Net ...

    java调用WebService实例

    Java调用WebService是一种常见的在分布式系统中实现服务交互的方式,主要应用于不同系统间的数据共享和功能集成。在Java中,有多种库可以帮助我们完成这项任务,其中之一就是Apache Axis2。本篇文章将详细介绍如何...

    JAVA的WebService支持-CXF

    通过上述内容可以看出,Java平台提供了丰富的工具和技术来支持WebService的开发,Apache CXF作为一个全面且灵活的框架,能够很好地满足不同场景下的需求。开发者可以根据实际项目需求选择适合的技术栈来构建高效稳定...

    SAP&Java的Webservice实例

    SAP&Java的Webservice实例 Webservice 是一种基于 SOAP 传输协议,用 WSDL 描述,用 XML 封装数据的接口技术。由于其跨平台、跨防火墙、开发成本低、开发周期短等优势而被广泛应用,但也有局限性,包括传输负载大、...

    java实现webservice实例.doc

    "Java实现WebService实例" WebService是基于XML的、分布式的、跨语言的应用程序通信协议。它允许不同的应用程序之间进行交互和集成,从而实现业务逻辑的复杂交互。Java是其中一种常用的实现WebService的语言。 在...

    Java WebService 简单实例-客户端TheClient.rar

    Java WebService 简单实例 http://blog.csdn.net/kingmax54212008/article/details/49764401 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作。 一、准备工作(以下为本实例...

    webservice实例-简单图书馆

    利用Myeclipse+axis2+mysql实现的一个简单的webservice,这是一个简单的图书管理程序,有添加图书,删除图书和查询图书,还有简单的管理权限控制,是最为基础的一个webservice实例。

    java调用webservice实例

    ### Java调用WebService实例解析与知识点详解 #### 核心概念与原理 在现代软件开发中,服务端之间以及客户端和服务端之间的通信是至关重要的。Web Service作为一种标准的、跨平台的服务实现方式,允许不同语言编写...

    java webService接口开发案例

    综上所述,Java WebService接口开发涉及多个步骤,包括接口定义、服务实现、客户端代理生成、SOAP消息交换以及安全性和服务管理。掌握这些知识将有助于构建高效、可靠的分布式系统。通过实际案例的实践,你可以更...

    如何基于JAX-WS开发一个WebService实例

    本篇将深入讲解如何基于JAX-WS开发一个WebService实例。 首先,让我们了解JAX-WS的基本概念。JAX-WS提供了一种简单的方式来创建SOAP(Simple Object Access Protocol)Web服务,它集成了Java SE和Java EE平台,使得...

    webservice--javademo

    【标题】"webservice--javademo" 涉及的知识点主要集中在Java Web Services(JAX-WS)上,这是一种用于创建Web服务的技术。在Java领域,Web服务是一种允许不同应用程序之间交换数据的方式,它基于开放标准,如SOAP...

    java WebService Jax-WS创建

    JAX-WS(Java API for XML Web Services)是Java EE 5及更高版本中提供的标准API,用于简化Web服务的开发。 在【MyEclipse中创建WebService的方法文档】中,主要步骤如下: 1. **新建Web Service Project**:首先...

    Java WebService 简单实例 - 服务器端TheService.rar

    Java WebService 简单实例 http://blog.csdn.net/kingmax54212008/article/details/49764401 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作。 一、准备工作(以下为本实例...

    java webservice实例教程PPT

    java webservice实例教程ppt,共15讲,java webservice实例教程适合对象:想要学习SOA面向服务编程思想,学习Webservice技术,希望学习系统间通信设计的Java设计开发人员。java webservice实例教程适合于各个层次的...

    java调用webservice实例代码

    本实例将通过两个Web小项目,一个是客户端(Client),另一个是WebService服务器端,来阐述如何在Java中实现这一功能。 首先,理解WebService的核心概念是关键。WebService是一种基于开放标准(如XML、WSDL和SOAP)...

    eclipse+axis2=webservice实例-亲测

    eclipse+axis2学习webservice实例,亲测!

Global site tag (gtag.js) - Google Analytics