热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Servlet与Web服务

下面根据配置文件,来说明一些底层与webservices的关系:回顾一下servlet的映射模式。我们知道,servlet是从javax.servlet.http.HttpServ

 Servlet在web services中起到很大的作用,负责解析soap文件(消息和附件封套),使用wsdl来校验soap消息等。作为基本的编程是可以用servlet来解析soap消息,尤其是对于带附件的soap消息,这样做很透明,但是servlet不能作为Web服务,当然拓展的JAXM是可以做到的。现在那些支持web services的项目都是通过底层上实现了servlet的功能,来完成HTTP+SOAP的通信,就不需要程序员考虑基于HTTP的SOAP消息的通信过程(不要有这样的误解,在java平台上HTTP的通信的服务程序是servlet/jsp,而现在你不用servlet和jsp来通信,岂不是矛盾?事实不矛盾,记住是底层已经实现了servlet功能,具体通信有底曾自己管理),直接上升到业务逻辑的服务编程。当然有时也可以编写解析SOAP消息的servlet,那就仅仅只是SOAP通信了(servlet无法作为服务来描述)。


     下面根据配置文件,来说明一些底层与web services的关系:


      回顾一下servlet的映射模式。我们知道,servlet是从javax.servlet.http.HttpServlet继承的,在服务器端被载入jvm执行,然后向客户端输出html流。
servlet的web.xml文件(位于 webapps/foo/WEB-INF目录):



                         “http://java.sun.com/J2EE/dtds/web-app_2.2.dtd”>


http://www.gaodaima.com/41993.htmlServlet与Web服务




invoker
/servlet/*


invoker servlet 其实是:org.apache.catalina.servlets.InvokerServlet
按类名提供小服务程序。例如,如果您调用 foo/servlet/HelloServlet,
invoker servlet将装入该HelloServlet(如果它在其类路径中的话)并执行。


初看上面的web.xml,好像只给出了一个servlet映射,而没有定义invoker servlet。
其实,invoker servlet 是在Tomcat的conf目录中的web.xml中定义的::
 
        invoker
        
          org.apache.catalina.servlets.InvokerServlet
        

        
            debug
            0
        

        2
    

所以,如果抛开Tomcat_HOME/conf/web.xml,我们这样定义一个web.xml,似乎更能清楚的说明问题:

                         “http://java.sun.com/j2ee/dtds/web-app_2.2.dtd”>

MyInvoker

org.apache.catalina.servlets.InvokerServlet


debug
0

2


MyInvoker
/servlet/*


即所有/servlet/* 模式的url,都会交给org.apache.catalina.servlets.InvokerServlet来处理。
或者说,所有/servlet/* 模式的url,其实都是调用InvokerServlet这个类,而InvokerServlet本身也是
一个servlet,它也是从 HttpServlet 继承而来的。
这样,我们自己的servlet就能够通过特定的url执行,即 /servlet/OurServlet。
当然,如果你高兴,可以定义任何的 url pattern,而不一定是 /servlet/*,这一点,正如我们后面
看到的Axis处理Soap消息的方法。


进一步,如果不想让 InvokerServlet 在中间“捣鬼”,我们当然可以直接定义自己的servlet:



                         “http://java.sun.com/j2ee/dtds/web-app_2.2.dtd”>

MyInvoker2

com.foo.MyServlet



MyInvoker2
/AnyName/*


JSP也是一样的道理,有了上面的分析,
看看Tomcat_HOME/conf/web.xml中的如下语句就可以JSP的处理方法了,这里就不再废话了:
….

        jsp
        org.apache.jasper.servlet.JspServlet
        
            logVerbosityLevel
            WARNING
        

        3


    jsp
    *.jsp

….
进入正题。
我们先来看部署Web Service的web.xml:




    Axis
    
    org.apache.axis.transport.http.AxisServlet




    Axis
    /services/*



所有 /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
http://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





  
  




  
    
  



WSDD是web service deployment descriptor的缩写。


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


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


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



欢迎大家阅读《Servlet与Web服务》,跪求各位点评,若觉得好的话请收藏本文,by




推荐阅读
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • andr ... [详细]
author-avatar
海哭的声音2602928847
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有