这是我调试成功的第一个实例,别看很长其实挺简单!
原文地址:http://www.java3z.com/cwbwebhome/article/article5/5770.html?id=1329
原文开始:
/***********本人原创,欢迎转载,转载请保留本人信息*/
作者:王力猛 (wallimn)
电邮:wallimn@sohu.com
博客:http://wallimn.bokee.com/
http://blog.csdn.net/wallimn
时间:2007-04-17
/***********本人原创,欢迎转载,转载请保留本人信息*************/
Java开发WebService实例--计数器
一、前言
本文假定你有一定的J2EE开发经验,这个教程没有过多的涉及基础知识和开发细节。如果在阅读过程出有什么问题,还请与我联系交流。
如果使用GOOGLE、BAIDU等搜索工具,搜索WebService的相关知识,可以查到N多的网页,我就是通过这些网页的学习,逐渐掌握了些WebService的相关知识。这里对那些无私奉献知识的人一并表示感谢。
网上关于WebService的例子,多是一些简单得不能再简单的hello world的例子,简单得以至于你对WebService没有什么感觉。有了WebService的基本知识后,我一直再想,可以把什么样的即简单又实用的东东做成WebService,开展示一下其功能特点。今天终于想到一个:计数器,计数器用得比较多,功能比较独立,做成WebService可以一劳永逸为不同系统(不管是JSP还ASP,这是WebService的突出优点)、不同应用节省此类编码工作,可以说以后再也不用写计数器了。只要用就行了。
说了这么多废话,下面我们开始。本教程介绍一下WebService环境搭建、服务部署的相关知识,然后介绍一个计数器的开发。
运行图:
[img]http://www.java3z.com/cwbwebhome/article/article5/img/9725623.gif
[/img]
二、基础工作
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>
五、结束语
至此一个完整计数器的Web Service开发、使用的程序的全部完成了。将上面的类、及页面部署到任意的一个上下文中,通过浏览器打开test.jsp,就可以看了结果了。
欢迎访问我的博客(http://blob.csdn.net/wallimn)留言或发邮件(wallimn@sohu.com)交流。
原文结束!
先感谢一下原创!
然后提醒其他朋友,原文地址提供实例下载,如果你采用页面拷贝的方式,请注意
counter.xml文件的<counter>标签没有关闭,会导致程序不识别xml出错!(本人查了好久才发现,害人不浅啊)
分享到:
相关推荐
总结来说,"mule使用SOAP工件发布和消费web Service的简单例子"是关于利用Mule ESB创建和使用SOAP服务的一个实践教程。通过"hello-ws"示例,我们可以深入理解SOAP服务的生命周期,从定义WSDL到编写服务逻辑,再到...
http://blog.csdn.net/qq_17284367/article/details/45480057这篇博客中的第三篇的例子的完全代码,如果想学web service请最好仔细看完一系列的博客
通过理解Web服务的工作原理,以及Android如何与之交互,开发者可以创建出类似"Web Service例子"的应用,实现各种跨平台的数据查询功能。这个例子是一个很好的起点,可以帮助初学者掌握Android与Web服务集成的关键...
Web服务是一种基于标准协议...总结,Java Web Service客户端的开发涉及多个步骤,从获取服务描述到生成客户端代码,再到编写应用程序进行调用。理解这些基本概念和技术将有助于你在实际项目中有效地集成和利用Web服务。
本资源包含了一个具体的Android Web服务示例的源代码,这对于开发者理解和实践Android与Web服务的集成非常有帮助。 首先,我们要理解什么是Web服务。Web服务是一种基于互联网标准(如SOAP、REST)的应用程序接口,...
在"xfire开发Web Service接口第一个程序"这个文件中,你可能会找到一个简单的示例,展示如何创建一个计算两个数相加的Web Service。这个例子可能包括定义服务接口、实现接口、配置服务以及启动服务的步骤。通过分析...
标题 "spring2.5+ibatis3+web service cxf 例子MyEclipse工程" 提供了一个关于如何在MyEclipse环境中集成Spring 2.5、iBatis 3和Web Service CXF的实例。这个工程是开发人员学习和实践这些技术的一个起点,通过它,...
本文通过一个具体的例子介绍了如何使用Java访问Web Service。该方法简单实用,适用于那些不需要复杂工具集的应用场景。通过理解SOAP请求的构建以及HTTP连接的管理,开发者可以灵活地与各种Web Service进行交互。此外...
【基于框架的Web开发-第一个SpringMVC例子】 在Web开发中,SpringMVC是一个流行的框架,用于构建高效、模块化的Web应用程序。本例子通过创建一个简单的用户注册流程,展示了SpringMVC的基本工作原理和核心组件。 ...
本篇文章将详细探讨几个常用Web Service接口的例子,以及它们在商业和贸易中的应用。 首先,股票行情数据WEB服务是一个非常实用的接口,尤其是对于金融领域的应用。它提供了香港、深圳、上海的股票、基金和债券的...
本讲堂重点探讨的是 Axis2,一个强大的Web Service框架,它是Apache软件基金会开发的第二代Web Service引擎。 一、什么是Axis2? Axis2是Apache Axis的升级版,它提供了更高效、更灵活的服务架构。Axis2基于模块化...
在这个实例"Ex16_05利用Web Service发送手机短信"中,我们将探讨如何利用Web服务技术来实现向手机发送短信的功能。这通常涉及到XML(可扩展标记语言)用于数据封装,SOAP(简单对象访问协议)用于通信协议,以及WSDL...
创建Web Service的第一步通常是定义接口。在这个例子中,可能会有一个名为"IWeatherService"的接口,其中声明了如"GetWeatherByCity"这样的方法,用于根据城市名称获取天气信息。然后,实现此接口的类...
"spring第一个学习的例子"旨在帮助初学者快速入门Spring框架,通过实际操作理解其基本概念和工作原理。 首先,Spring的核心特性之一是依赖注入(Dependency Injection,简称DI)。这个例子可能包含了如何在配置文件...
首先,我们来看第一个业务场景(Scenario 1:SAP (WebService) => XI => SAP (IDOC))。在这个场景中,一个SAP系统通过Web服务向XI发送请求,XI接收到请求后,通过映射(mapping)转换数据,然后以IDOC的形式将请求...
创建Web服务的第一步是在Eclipse或MyEclipse中新建一个Dynamic Web Project。在这个项目中,你需要定义你的服务接口,这通常是一个Java接口,包含了你的服务方法。例如,你可以创建一个名为`HelloWorldService`的...
在这个例子中,开发者可能使用了`NSURLSession`发送GET请求到微软的Web Service接口,然后解析返回的XML数据。 XML(Extensible Markup Language)是一种标记语言,常用于数据交换。解析XML数据,iOS提供了`...
通向架构师的道路(第十四天)Axis2 Web Service安全之rampart 本篇文章主要讲述了Axis2 Web Service安全之rampart的知识点,包括加密保护Web Service传输、基本概念、对称加密、非对称加密、数字签名等内容。 一...
这个修改自C#高级编程第5版本的例子,展示了如何将理论知识应用于实际问题解决,强化了对Web服务安全性和SOAP通信的理解。这样的实践有助于提升开发者在分布式系统和安全性方面的技能,对于构建可靠且安全的Web服务...
在第一天的学习中,我们已经了解到如何生成和部署Axis2的Web服务,以及四种不同类型的客户端调用方式:传统式、非阻塞式、双工模式和双工非阻塞。 2. **服务部署描述**: 在Axis2中,服务部署描述是通过XML文件来...