WebService的helloworld,服务器端与客户端的Demo(转)----自己建立的Web Project , 而不是Web Service Project,利用WSDD 自己发布

WebService的helloworld,服务器端与客户端的Demo

http://blog.csdn.net/angus_17/article/details/8032856

今天突然兴起,想学学webService,然后就找找资料,做了个简单的DEMO。先记录下来,以便日后使用。

首先,先说点理论上的东西。

WebService又是一种高级应用,与之前学习的Struts、Spring、Hibernate等框架不同。WebService是面向服务的架构(SOA),看起来像是比SSH框架要大。那么它到底是做什么用的?什么才是面向服务的架构?

让我们来看一种需求,集团公司可能具有多种WEB应用。比如,前年开发了个进销存系统、去年开发了一个ERP、今年又开发了一个OA。现在这家集团公司需要将这三个系统整合,难道需要重新编码将它们整合吗?而这三个系统又是用不同语言编写的,这种成本对公司来说无疑是一种浪费。WebService可以很好的解决这种需求。

WebService是可以进行跨语言、跨平台、分布式系统间整合的方案,WebService像是一条线将这些系统穿起来——企业服务总线(ESB)。WebService使用简单对象访问协议(SOAP)使用http协议传输xml数据(xml是最常用的,也有其他格式数据。)来完成系带间的整合。

什么是整合?当然是功能和数据的整合,也就是一个系统可以调用另一个系统的WebService接口来完成数据的交互。这样我们就需要知道,提供WebService服务功能的应用公开了哪些接口,我们可以通过WebService描述文档(WSDL)得知。WSDL不需要我们手动编写,Java的WebService实现可以为我们自动生成。JDK1.6新增支持WebService,但还不够成熟。所以我们使用Apache第三方开源组织提供的WebService实现——Axis。

Axis的当前版本是Java版本,它的C++版本正在开发中。Axis是一个功能强大的soap引擎,关于它们的详细信息在此就不做介绍了。下面,让我们来编写一个例子程序,以了解WebService的应用流程。

==================================================================================================================

下面开始编写服务端代码:

1.在MyEclipse中,建立一个WebProject。命名为WebService.

2.下载axis1.4的包,解压,里面有一些关于axis的资料和文件。

将webapps里面的,WEB-INF中的web.xml复制,替换到自己的WebService项目中。

如果你没有,可以将下如代码拷贝到你的web.xml中:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <display-name>Apache-Axis</display-name>
    
    <listener>
        <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
    </listener>
    
  <servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.AxisServlet
    </servlet-class>
  </servlet>

<servlet>
    <servlet-name>AdminServlet</servlet-name>
    <display-name>Axis Admin Servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.AdminServlet
    </servlet-class>
    <load-on-startup>100</load-on-startup>
  </servlet>

<servlet>
    <servlet-name>SOAPMonitorService</servlet-name>
    <display-name>SOAPMonitorService</display-name>
    <servlet-class>
        org.apache.axis.monitor.SOAPMonitorService
    </servlet-class>
    <init-param>
      <param-name>SOAPMonitorPort</param-name>
      <param-value>5001</param-value>
    </init-param>
    <load-on-startup>100</load-on-startup>
  </servlet>

<servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>

<servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
  </servlet-mapping>

<servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

<servlet-mapping>
    <servlet-name>SOAPMonitorService</servlet-name>
    <url-pattern>/SOAPMonitor</url-pattern>
  </servlet-mapping>

<!-- uncomment this if you want the admin servlet -->
 <!--
  <servlet-mapping>
    <servlet-name>AdminServlet</servlet-name>
    <url-pattern>/servlet/AdminServlet</url-pattern>
  </servlet-mapping>
 -->

<session-config>
        <!-- Default to 5 minute session timeouts -->
        <session-timeout>5</session-timeout>
    </session-config>

<!-- currently the W3C havent settled on a media type for WSDL;
    http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
    for now we go with the basic ‘it‘s XML‘ response -->
  <mime-mapping>
    <extension>wsdl</extension>
     <mime-type>text/xml</mime-type>
  </mime-mapping>
  
  <mime-mapping>
    <extension>xsd</extension>
    <mime-type>text/xml</mime-type>
  </mime-mapping>

<welcome-file-list id="WelcomeFileList">
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jws</welcome-file>
  </welcome-file-list>
</web-app>

然后,引入jar包,

在自己下的axis的jar包中,有一些jar包,可以将其全部引入。

我只引入了其中一部分axis.jar,axis-ant.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,jaxrpc.jar,log4j-1.2.8.jar,saaj.jar,wsdl4j-1.5.1.jar,xercesImpl-2.8.1.jar,xmlsec-1.4.5.jar。

然后,将项目部署,启动tomcat,输入http://10.64.59.12:8080/WebService/services,查看页面。

如果出现了

And now... Some Services

  • AdminService (wsdl)

    • AdminService
  • Version (wsdl)
    • getVersion

就表示你环境搭建工作已经完成了。可以进入真正的开发了。

3.在src中,建立类:HelloService.java

public class HelloService {
public String sayHello(){
return "hello";
}

public String sayHelloToPerson(String name){
if(name == "" || name.equals("")){
name = "nobody";
}
return "hello " + name;
}
}

4.其实开发工作就已经完成了,如此简单。下一步,就是将这个发布到webservice上。

编写一个文件:deploy.wsdd

内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"  xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">    
<service name="HelloServices" provider="java:RPC">        
<parameter name="className" value="HelloService"/>      //如果将类放在包下,value应写成packagename.className的形式    
<parameter name="allowedMethods" value="*"/>     
</service> 
</deployment>

把它放在F:\test下,

然后cmd,进入F:test,再输入:

java -cp F:\axis-1_4\lib\axis.jar;F:\axis-1_4\lib\axis-ant.jar;F:\axis-1_4\lib\commons-discovery-0.2.jar;F:\axis-1_4\lib\commons-logging-1.0.4.jar;F:\axis-1_4\lib\jaxrpc.jar;F:\axis-1_4\lib\log4j-1.2.8.jar;F:\axis-1_4\lib\mail-1.4.jar;F:\axis-1_4\lib\saaj.jar;F:\axis-1_4\lib\wsdl4j-1.5.1.jar;F:\axis-1_4\lib\xercesImpl-2.8.1.jar;F:\axis-1_4\lib\xml-apis-1.3.03.jar;F:\axis-1_4\lib\xmlsec-1.4.5.jar;F:\axis-1_4\lib\xmlsecSamples-1.4.5.jar;F:\axis-1_4\lib\xmlsecTests-1.4.5.jar org.apache.axis.client.AdminClient -lhttp://10.64.59.12:8080/WebService/services/AdminService deploy.wsdd

(自己编写的过程   :

回车,在窗口中下面出现:

Processing file deploy.wsdd
<Admin>Done processing</Admin>

就表示你发布成功了。

再在浏览器中输入http://10.64.59.12:8080/WebService/services时,看到

And now... Some Services

  • HelloServices (wsdl)

    • sayHello
    • sayHelloToPerson
  • AdminService (wsdl)
    • AdminService
  • Version (wsdl)
    • getVersion

则HelloServices就被成功发布了。

===================================================================================================================================

下面,就是客户端对webservice的访问

写个测试类:

import java.io.IOException;
import java.net.MalformedURLException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TestService {
private static final Log log = LogFactory.getLog(TestService.class);
private static final String HELLO_SERVICE_ENDPOINT = "http://10.64.59.12:8080/WebService/services/HelloServices?wsdl";

/**
 * 调用sayHello方法
 */
public void callSayHello() {
try {
Service service = new Service();
Call call = (Call) service.createCall();
//传递url
call.setTargetEndpointAddress(new java.net.URL(HELLO_SERVICE_ENDPOINT));
//调用方法名字
call.setOperationName(new QName("http://webservice.sinosoft.com/","sayHello"));
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try {
//ret即执行方法之后得到的返回值,此处不用传参,故不用写字符串
String ret = (String) call.invoke(new Object[] {});
System.out.println("The return value is:" + ret);
return;
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
log.error("call sayHello service error!");
}

/**
 * 调用sayHelloToPerson方法
 */
public void callSayHelloToPerson() {
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(HELLO_SERVICE_ENDPOINT));
call.setOperationName(new QName("http://webservice.sinosoft.com/","sayHelloToPerson"));
call.addParameter("name", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try {
//ret即执行方法之后得到的返回值,此处传了一个字符串做为参数,如果不写空,会报错
String ret = (String) call.invoke(new Object[] {"Seven"});
System.out.println("The return value is:" + ret);
return;
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
log.error("call sayHello service error!");
}

/**
 * 调用两个方法
 * @param args
 */
public static void main(String[] args) {
TestService tester = new TestService(); 
tester.callSayHello();
tester.callSayHelloToPerson();
}
}

会打印出:

The return value is:hello
The return value is:hello Seven

就表示 这个Demo做成功了。

此时,如果修改HelloService.java,执行测试类时,就可以即时响应HelloService.java中的变化了。

时间: 2024-10-17 09:51:45

WebService的helloworld,服务器端与客户端的Demo(转)----自己建立的Web Project , 而不是Web Service Project,利用WSDD 自己发布的相关文章

服务器端获取客户端的IP地址(当客户端调用由Axis开发的WebService)

一.前言 由于项目中一个小的模块需要获取客户端的IP地址以保证安全调用webservice接口,项目中客户端使用C#编写,服务器端使用Java编写,服务器端与客户端采用Axis开发的WebService进行通信.服务器端维护IP白名单列表,只有IP地址在白名单中的客户端才可以成功调用到接口,获得服务. 二.代码清单 若要成功获取客户端IP地址,需要如下Jar包的支持. servlet-api.jar axis.jar axis2-kernel-1.6.2.jar 获取IP地址的具体代码如下: i

利用Ajax+MSMQ(消息队列)+WebService实现服务器端向客户端的信息推送

需求: 每当数据库有数据更新时,推送到客户端 软需求: 1.服务器资源有限,要求资源占用尽可能小: 2.项目可控,不许调用第三方不可信不稳定的方法. 已有事例: 1.58到家采用的方法是TCP的长连接,对服务器压力较大: 2.redis等提供了订阅推送服务,开源,但是定制化对开发者其开发语言水平要求较高,笔者水平达不到 最终方案: 解释: ①②页面加载时第一次请求数据,返回数据,加载,调用ajax2 ③页面加载即发出请求,但是此时没有数据,于是就block,等待其他组件insert msg ④收

实现服务器端与客户端的高频实时通信 SignalR(2)

说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) 二.这篇文章介绍如何利用 VS2012 创建一个简单的实时高频反馈系统,建好后的样子如下:拖动某个窗口的红色框,其余窗口的红色框跟着运动. 三.Demo 创建 1.新建项目以及新建完成后的目录结构如上篇文章所示(项目名称为 MoveShape): 2.安装 SignalR 程序包,该包实现了服务端与

pushlet实现服务器端向客户端推送信息

使用Pushlet来实现服务器端向客户端推送信息 1.   实现方式: 有两种实现方式: 1.         通过配置文件来实现定时的从服务器端向客户端推送信息 2.         通过API主动向另外一端推送信息 以下分别给予介绍. 2.   特别注意 在开始测试之前,有三点非常重要,需要实现讲明,否则程序将会无法正常运行: 2.1.     JSP页面上的设定 JSP页面上必须添加以下代码以确保Pushlet能够正确的获得后台服务的地址: <base href="<%=req

基于C/S架构的3D对战网络游戏C++框架 _01服务器端与客户端需求分析

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

iOS socket Stream 服务器端 及 客户端 演示

iOS socket Stream 测试环境,mac osx 10.8 一:建立服务器端 由于mac osx10.8 已经集成 python2和 Twisted,我们可以直接利用此,构建一个简单的socket 服务器 如下测试一个简单的聊天 socket 并,定义,加入聊天时发送:iam:用户名 发送信息时:msg:信息 终端:vim server.py  回车,copy入如下代码 from twisted.internet.protocol import Factory, Protocol f

JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. 网络分层除了OSI模型分层,还有TCP/IP模型分层,将网络划分为四层,应用层.传输层.网际层

【转】Android Https服务器端和客户端简单实例

转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 Tomcat 6.0.18(免安装版) Android2.1开发环境(在Eclipse中配置好) 前提条件 JDK环境要使用我们自己安装的,笔者JDK安装目录为D:\Java\jdk1.6.0_22,在Eclipse的Window-preference-installedJREs中,只选用我们自己安

如何在服务器端获取客户端的数据

asp.net服务端代码如何获取客户端控件的值? 2009-09-27 15:47:02|  分类: PC|举报|字号 订阅 在login.aspx页面中有一个INPUT客户端控件 <input type="text" id="txtUserName" maxlength="20" /> 现在要在login.aspx.cs文件后台编码中获取这个txtuserName的value值. 有三种方法:   一.把txtUserName作为服