0

我已经创建并注册了一个 Web 服务。现在我想制作一个简单的网络应用程序来访问网络服务。我使用axis2作为Web服务服务器。客户端以xml格式文件(data.xml)的形式提供要由Web服务处理的数据。我的 jsp 表单有一个文本框(用于提供 data.xml 的位置)和一个“调用”按钮,可以访问调用 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将接收一个文件作为参数。这是正确的方法吗?谢谢
4

2 回答 2

1

由于您使用的是 Axis2,因此使用它生成客户端代理(wsdl2java 是您最好的朋友),并将为您的 Web 服务创建一个标准的 java 代理。无需手动创建 SOAP 信封……(至少在 99% 的情况下)。

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

关于如何使用代理...

恕我直言,来自 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 客户端文档。

于 2012-06-27T07:34:21.583 回答
0

除非您想手动完成,否则您应该使用 Web 服务堆栈。Apache CXF 和 Metro 是不错的选择。

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

  1. 取决于框架
  2. 你没有。这就是框架的用途。
  3. 如果您需要多部分支持,您应该四处寻找现成的 servlet。或者更好的是,使用 Spring 框架:)
于 2012-06-27T07:30:34.263 回答