科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Web服务部署内幕3

Web服务部署内幕3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

配置一个Web服务的最简方法:为了能让web服务先跑起来,先给出一个Web服务的原型,以便于后面的讨论。我们从一个最简单的例子开始,本文只给出必须的东西。

来源:IT专家网 2008年5月12日

关键字: 部署 服务 web java

  • 评论
  • 分享微博
  • 分享邮件
下面进入正题。

我们先来看部署Web Service的web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>

<servlet>
<servlet-name>Axis</servlet-name>
<!--实际servlet程序,这里是AxisServlet-->
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>

<!-- ### 定义servlet和url的对应关系-->

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

</web-app>

所有 /services/* 模式的 url 都会交给org.apache.axis.transport.http.AxisServlet处理,
AxisServlet当然也是从HttpServlet继承而来的。这就是为什么我们部署的Web服务在调用时都要在
服务名称前加上 services/ 了。

可以说,AxisServlet是所有Web服务调用的入口。
那么AxisServlet在接手Web服务调用后都做了哪些工作呢?

客户端用call.invoke()调用web服务用的是POST,所以入口是AxisServlet.doPost...
而不是AxisServlet.doGet...

先来看看AxisServlet的doPost函数,这里只给出了关键语句及注释:

/**
* Process a POST to the servlet by handing it off to the Axis Engine.
* Here is where SOAP messages are received
* @param req posted request
* @param res respose
* @throws ServletException trouble
* @throws IOException different trouble
*/
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
msgContext = createMessageContext(engine, req, res);//获取客户请求信息

engine.invoke(msgContext); //调用客户端请求的服务

responseMsg = msgContext.getResponseMessage();//得到调用的返回结果

sendResponse(getProtocolVersion(req), contentType, res, responseMsg);//将结果送至客户端
}

这样一来,Web服务调用的来龙去脉就大致清楚了。。。

为了高清楚前面我们的三个url
http://192.168.0.1/test/services
http://192.168.0.1/test/services/sayHelloService?wsdl
ttp://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&aname=everybody

是怎样获得输出结果的,再来看看AxisServlet的doGet函数,这里只给出了流程框架及注释:

**
* Process GET requests. Because Axis does not support the GET-style
* pseudo execution of SOAP methods, this handler deals with queries
* of various kinds, not real SOAP actions.
*
* @todo for secure installations, dont stack trace on faults
* @param request request in
* @param response request out
* @throws ServletException
* @throws IOException
*/
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{

//如果路径为空,比如:http://localhost/wstk/services 或 http://localhost/wstk/services/ *
if((pathInfo == null || pathInfo.equals("")) && !realpath.endsWith(".jws"))

{
//从server-config.wsdd文件中读取所有部署的服务信息,向向客户端列出所有部署的服务,
//包括每个服务可调用的方法。

}else
//如果路径不为空,比如:http://localhost/wstk/services/sayHelloService
if(realpath != null)
{
//如果请求wsdl,比如:http://localhost/wstk/services/sayHelloService?wsdl
if(wsdlRequested)
{
//创建sayHelloService的WSDL文件并传送至客户端
} else
//这里是利用url调用Web服务的入口,比如http://192.168.0.1/test/services/sayHelloService?method=sayHelloTo&aname=everybody
if(req.getParameterNames().hasMoreElements())
{
//如果客户端调用的方法正确,则Axis会调用相应的JavaBean,并把JavaBean的返回结果
//封装为Soap消息流返回给客户端。
}
}
}

而Axis怎样找到我们所请求的JavaBean呢?答案是server-config.wsdd文件。

server-config.wsdd

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" xmlns="http://xml.apache.org/axis/wsdd/">

<service name="sayHelloService" provider="java:RPC">
<parameter name="className" value="sayHello"/>
<parameter name="allowedMethods" value="sayHelloTo"/>
</service>

<handler type="javarg.apache.axis.handlers.http.URLMapper" name="URLMapper"/>

<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>

</deployment>

WSDD是web service deployment descriptor的缩写。

最外面的<deployment>元素指示这是WSDD,并定义了java的名字空间。

接着的 <service>元素定义了service。一个service是一个目标链,包括请求request、内容提供者provider、响应response。
在这个例子中,我们指出service名字是sayHelloService ,provider是"java:RPC",它是axis 的标记,指示这是一个java的RPC service,
而处理它的真正的class是org.apache.axis.providers.java.RPCProvider。

接着我们要在<parameter>中告诉RPCProvider,它如何实例化并调用正确的class(如:com.foo.MyService)。
<parameter>元素的className指示class名,allowedMethods告诉引擎那些共用的方法要通过soap来调用。
"*"表示所有的公共方法,我们也列出方法名字列表,可以空格或逗号分割它们。


 

 

 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章