炫浪网络社区

 找回密码
 注册
搜索
查看: 2269|回复: 1
打印 上一主题 下一主题

[〖Java 技术〗] MyEclipse下开发Web_Service(Axis)

[复制链接]

该用户从未签到

跳转到指定楼层
楼主
发表于 2011-7-29 14:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、环境准备
使用Axis来开发Web services 需要准备 web 服务器,Axis API。本文使用的Web container 是Tomcat5.5, Axis API 采用版本2。
1.1软件下载准备
Axis标准包:
Axis War包:
Axis Eclipse plug-in(代码生成工具和打包工具):
Eclipse+MyEclipse:可以到官方网站下载(本文为3.2+5.0GA)
1.2安装
A.首先搭建开发环境,需要将下载到的Eclipse解压缩到一个目录。
B.将下载到的Axis 的两个plug-in解压缩到Eclipse安装目录下的plug-in子目录。
C.安装MyEclipse5.0GA。然后启动MyEclipse,并选择“File->New->Other可以找到下面的这些Wizards,这些将是本文中用到的很重要的工具。



D.下面开始搭建Web Services的部署环境。将下载的
          tomcat报解压缩到一个目录。完成web container

的安装。
        E.将axis2.war包拷贝到tomcat安装目录下的webapps

目录中。
F.启动Tomcat(windows 下为TOMCA_HOME/bin中的startup.bat;Linux,unix环境为startup.sh文件),打开浏览器输入并访问:http://ip:port/axis2来查看。(如果没有进行陪孩子文件的修改此地址应该为http://localhost:8080/axis),


二、Quick Start
环境准备好后,先从一个简单的例子开始。以便对使用Axis来开发Web services的大致流程有个了解。这个例子就是SayHello,请求端输入一个名字字符串,返回的将是一个问候语。
例如:输入了Tom,那么返回的事Hi,Tom.How are you?
2.1编写WSDL
A.启动MyEclipse,新建立一个WebApps(File->New->Project->Web Project),给Project Name 为SayHello,其他保持不改变。
B.选择File->New-Other菜单,进入后找到MyEclipse->Web Services并选择WSDL.
C. 选择“src目录作为“Enter or select the parent folder的值,“File name值给定为SayHello.wsdl。点击“Next进入下一步。
D.将目标命名空间设置为“http://ws.tonyzhangcn.org/SayHello/.在生成代码的时候一般以这个命名空间为package的名字,例如:org.tonyzhangcn.ws.sayhello。这些值可以按需要设置。
E.点击“Finish按钮就可以看到MyEclipse提供的WSDL 设计器的界面了。可以看到设计器为WSDL默认的添加了一个现操作。

即图中的“NewOperation。现在将其改名为SayHello,如下图:



之后点击设计界面中的“SourceTab来查看其代码。如下:可以看到我们定义了一个SayHello的Web Services,她提供了一个SayHello的方法,她能够接受一个String(事实上是tns:SayHelloRequest对象,她对String进行了封装)类型的输入参数SayHelloRequest并返回一个String(事实上是tns:SayHelloResponse对象,她对String进行了封装)类型的SayHelloResponse结果。更多关于WSDL的信息,请参考W3C的规范文档。

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.tonyzhangcn.org/SayHello/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SayHello" targetNamespace="http://ws.tonyzhangcn.org/SayHello/">
<wsdl:types>
<xsd:schema targetNamespace="http://ws.tonyzhangcn.org/SayHello/">
<xsd:element name="SayHelloResponse" type="xsd:string" />
<xsd:element name="SayHelloRequest" type="xsd:string" />
</xsd:schema>
</wsdl:types>
<wsdl:message name="SayHelloResponse">
<wsdl:part element="tns:SayHelloResponse" name="SayHelloResponse" />
</wsdl:message>
<wsdl:message name="SayHelloRequest">
<wsdl:part element="tns:SayHelloRequest" name="SayHelloRequest" />
</wsdl:message>
<wsdl:portType name="SayHello">
<wsdl:operation name="SayHello">
<wsdl:input message="tns:SayHelloRequest" />
<wsdl:output message="tns:SayHelloResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SayHelloSOAP" type="tns:SayHello">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="SayHello">
<soap:operation soapAction="http://ws.tonyzhangcn.org/SayHello/NewOperation" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SayHello">
<wsdl:port binding="tns:SayHelloSOAP" name="SayHelloSOAP">
<soap:address location="http://www.example.org/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
至此WSDL的编写已经完成。
2.2从WSDL生成Java代码
A.选择菜单“File->New->Other,从对话框中选取“Axis2 Wizards下面的“Axis2 Code Generator.点击“Next进入下一个页面,保持“Generate java source code from WSDL file被选中,点击“Next进入下一步。
B.点击“Browse来选取存放在src目录下的SayHello.wsdl文件,“Next进入下一步。

C.点击“next进入下一个页面,设置“Output path为本Project的src目录。点击“finish后代在SayHello项目上按F5刷新就可以看到有代码生成好了。但是能看到一堆红“x,这是由于没有将Axis2的jar包放入class path 中以及源代码的package不为org.tonyzhangcn.ws.sayhello引起的。
下面解决这个问题,首先选择“SayHello项目,并右击选择“Build path->Add External Archives..,选择上面部署在tomcat中的axis2 web应用WEB-INF/lib目录中的所有jar包。之后右击“src.org.tonyzhangcn.ws.sayhello项目,选择“Refactor->rename,做如下修改,并选择OK完成。


这个时候发现test.org.tonyzhangcn.ws.sayhello下面的SayHelloTest.java仍然存在问题。点击此文件中package 关键子前面的红“x,会提示有两个选项,我们选择下面的那个。


选择public class SayHelloTest前的红“x,选择第一项。


进行完这几个改动之后,生成的代码就没有问题了。其中
SayHelloRequest,SayHelloResponse是输入输出参数对象。
SayHelloSkeleton是服务端对象,用来编写业务逻辑调用。
SayHelloStub是客户端用来定位endpoint(就是发布的Web Services的地址)的类,客户端根据其提供的方法定位Web服务并发起调用
SayHelloMessageReceiverInOut是一个实现同步调用的web服务信息转换处理类。
Resources目录下的services.xml文件是webservices的描述文件。
SayHelloTest是一个客户端的TestCase示例,用户可以根据这个示例来编写自己的客户端调用类。
2.3编写业务代码
打开SayHelloSKeleton.java文件将其中的实现方法

public org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest param0)
{
// Todo fill this with the necessary business logic
throw
new java.lang.UnsupportedOperationException();
}

改为
public org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest request)
{
// Todo fill this with the necessary business logic
try
{
SayHelloResponse response = new SayHelloResponse();
response.setSayHelloResponse("Hi,"+request.getSayHelloRequest()+".How are you?");
return response;
}catch(UnsupportedOperationException e)
{
throw e;
}
}
2.4打包
A.选择菜单“File->New->Other,从对话框中选取“Axis2 Wizards下面的“Axis2 Services Archive.点击“Next进入下一个页面。
B.选择编译好的class文件所在目录(本项目应该是WebRoot下面WEB-INF/classes),“Next进入下一步。
C.选择WSDL文件所在目录,此处为src目录下的SayHello.wsdl文件。“Next,再“Next。选择services.xm文件,本文应该是生成再src/resources下面的services.xml文件。之后选取“Generate the services.xml automatically,然后再点击一下使其变为非选中状态,之后点击“Back按钮,再点击一次“Next。(注意:这里本应该不是这么来回折腾的,但是我的机器上只有这样操作finish按钮才能生效。怀疑这是一个bug,如果读到此文的用户没有这种情况,忽略此提示)
D.点击“Next,将记入最后一个页面,此处有两个选项,一个是输出目录一个是处处文件名称。我这里的输出文件名称给的是SayHello。点击“Finish完成。

2.5部署
A.将打包好的文件SayHello.jar(或者可以改名为SayHello.aar),拷贝到Tomcat中已经部署的Axis2应用的WEB-INF/services目录下面。
B.启动Tomcat(即点击Tomcat安装目录下的startup.bat,linux或unix下执行startup.sh)。
C.打开浏览器,输入http://ipaddress:port/axis2(一般为http://localhost:8080/axis2),并点击其中的“services链接


可以看到SayHello已经被部署。点击SayHello提供的连接可以看到与之对应的WSDL。
2.6调用测试
A.修改SayHelloTest.java文件中的方法testSayHello的内容为:
public void testSayHello() throws java.lang.Exception
{
String url="http://localhost:8080/axis2/services/SayHello";
org.tonyzhangcn.ws.sayhello.SayHelloStub stub = new org.tonyzhangcn.ws.sayhello.SayHelloStub(url); // the
org.tonyzhangcn.ws.sayhello.SayHelloRequest request = (org.tonyzhangcn.ws.sayhello.SayHelloRequest) getTestObject(org.tonyzhangcn.ws.sayhello.SayHelloRequest.class);
request.setSayHelloRequest("tonyzhangcn");
System.out.println(stub.SayHello(request).getSayHelloResponse());
// todo Fill in the param14 here
assertNotNull(stub.SayHello(request));
}
B.从菜单中选择“Run->Run as->JUnit Test


可以看到web 服务已经正确的返回了结果。那么,不用TestCase类可以调用WebServices吗?答案是肯定的,我们可以随便些一个带有main方法的类,并仿照SayHelloTest.java中的testSayHello()方法就可以达到调用Web Services的目的了。
回复

使用道具 举报

  • TA的每日心情
    无聊
    2019-1-13 22:08
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    沙发
    发表于 2018-2-6 23:26 来自手机 | 只看该作者
    帖子太老了,不知道有没有适用spring mvc框架的
    回复 支持 反对

    使用道具 举报

    快速回复 返回顶部 返回列表