访问Web服务

时间:2012-06-27 07:27:10

标签: java web-services

我创建并注册了一项Web服务。现在我想创建一个简单的Web应用程序来访问Web服务。我使用axis2作为Web服务服务器。向客户端提供要由Web服务以xml格式文件(data.xml)的形式处理的数据。我的jsp表单有一个文本框(用于提供data.xml的位置)和一个" invoke"将访问的按钮调用Web服务。我假设jsp将首先将请求发送到servlet,然后servlet将负责调用Web服务。 Web服务托管在PC1中,包含访问Web服务的JSP的Web应用程序在PC2中,而data.xml在PC3中。因此,用户将使用PC3,在PC3中打开Web浏览器访问PC2中的jsp,然后在PC1中调用Web服务。

  1. 从servlet调用Web服务的语法是什么?我想知道axis2是否可以在客户端使用。
  2. 如何构造SOAP请求(我假设SOAP请求是在servlet中构造的)?希望我不需要按字符串构造SOAP请求字符串。
  3. 关于data.xml,我假设jsp会将文件上传到servlet,因此servlet将接收一个文件作为参数。这是正确的方法吗? 感谢

2 个答案:

答案 0 :(得分:1)

由于您正在使用Axis2,因此使用它生成客户端代理(wsdl2java是您最好的朋友)并将为您的Web服务创建标准Java代理。没有必要手动创建SOAP信封......(至少在99%的情况下)。

只需生成一个WSDL(编写它或用java2wsdl生成它)然后用它来生成一个用于调用Web服务的java代理。

关于如何使用代理...

来自jsp的恕我直言是一个禁忌。最好让JSP收集数据并将它们发送到servlet,然后在servlet中执行WebService调用,管理响应(如果你使用Axis2框架将是一个纯java对象),处理错误然后转发到另一个JSP给出结果。

JSP有点容易编写,但从长远来看,最好将它们用于计划内容并将业务逻辑保存在servlet中

这里有两个用于执行WSDL和客户端生成的ant任务。

<!-- create the wsdl file -->
<target name="genwsdl">
    <echo message="Generate the WSDL file"/>
    <taskdef name="java2wsdl" classname="org.apache.ws.java2wsdl.Java2WSDLTask" classpathref="axis2.classpath"/>
    <java2wsdl className="org.stackoverflow.YourWebServiceClassName"
               servicename="YourServiceName"
               description="Whatever..."
               outputLocation="./wsdl"
               locationuri="http://localhost:8081/NameMe/CoolService">
            <classpath>
                <pathelement path="${axis2.classpath}"/>
                <pathelement location="./build/classes"/>
            </classpath>
    </java2wsdl>
    <echo message="Generation of the WSDL file complete"/>
</target>


<target name="genclient" depends="genwsdl">
    <taskdef name="axis2-wsdl2java" classname="org.apache.axis2.tool.ant.AntCodegenTask" classpathref="axis2.classpath"/>
    <axis2-wsdl2java wsdlfilename="./wsdl/YourWsdl.wsdl" output="./client overwrite="true"/>
</target>

生成客户端类(代理)后,可以使用它们来调用Web服务。

这将是:

YourServiceStub stub = new YourServiceStub(wsEndPointUrl);

然后在存根中,您将为每个远程发布的方法和包装的请求/响应对象的静态类提供方法。但是在这一点上,必须阅读一下Axis2客户端文档。

答案 1 :(得分:0)

除非您想手动执行,否则应使用Web服务堆栈。 Apache CXF和Metro是很好的候选者。

那就是说,我不知道你想用你的data.xml做什么。

  1. 取决于框架
  2. 你没有。这就是框架的用途。
  3. 如果您需要多部分支持,您应该浏览一下现成的servlet。或者更好的是,使用Spring框架:)