首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> Javascript教程
Servlet与Web服务-JSP教程,Jsp/Servlet
作者:网友供稿 点击:11
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
 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目录):

<?xml version="1.0" encoding="utf-8"?>
<!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-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
</web-app>
invoker servlet 其实是:org.apache.catalina.servlets.invokerservlet
按类名提供小服务程序。例如,如果您调用 foo/servlet/helloservlet,
invoker servlet将装入该helloservlet(如果它在其类路径中的话)并执行。

初看上面的web.xml,好像只给出了一个servlet映射,而没有定义invoker servlet。
其实,invoker servlet 是在tomcat的conf目录中的web.xml中定义的::
 <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.invokerservlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
所以,如果抛开tomcat_home/conf/web.xml,我们这样定义一个web.xml,似乎更能清楚的说明问题:
<?xml version="1.0" encoding="utf-8"?>
<!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-name>myinvoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.invokerservlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myinvoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
</web-app>
即所有/servlet/* 模式的url,都会交给org.apache.catalina.servlets.invokerservlet来处理。
或者说,所有/servlet/* 模式的url,其实都是调用invokerservlet这个类,而invokerservlet本身也是
一个servlet,它也是从 httpservlet 继承而来的。
这样,我们自己的servlet就能够通过特定的url执行,即 /servlet/ourservlet。
当然,如果你高兴,可以定义任何的 url pattern,而不一定是 /servlet/*,这一点,正如我们后面
看到的axis处理soap消息的方法。

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

<?xml version="1.0" encoding="utf-8"?>
<!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-name>myinvoker2</servlet-name>
<servlet-class>
com.foo.myservlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myinvoker2</servlet-name>
<url-pattern>/anyname/*</url-pattern>
</servlet-mapping>
</web-app>
jsp也是一样的道理,有了上面的分析,
看看tomcat_home/conf/web.xml中的如下语句就可以jsp的处理方法了,这里就不再废话了:
....
<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.jspservlet</servlet-class>
        <init-param>
            <param-name>logverbositylevel</param-name>
            <param-value>warning</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>
....
进入正题。
我们先来看部署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
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

<?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="java:org.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来调用。
"*"表示所有的公共方法,我们也列出方法名字列表,可以空格或逗号分割它们。


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·基于cpld的数字触发电路的设计
·消息队列(Message Queue)简介及其使用-.NET教程,评论及其它
·session_register()出错的解决办法-PHP教程,其它文章
·卫星通信中tcp协议分析改进方法研究
·漫谈Java语言的接口与类型安全-JSP教程,Java技巧及代码
·SQL SERVER2005連接字串中的@3/29-.NET教程,数据库应用
·自创]JCreator安装学习使用方法-数据库专栏,SQL Server
·ASP.NET 数据绑定常用代码-.NET教程,Asp.Net开发
·如何在J2ME的低级界面中轻松实现各种文字的自然分行显示-JSP教程,J2ME开发
·通信设备pac模块式开关电源的原理与维修
最新文章
·photoshop将肖像照片处理为铅笔素描_photoshop教程
·个人网站做联盟广告的几点经验_网赚技巧
·适合与不适合做google adsense的站_网赚技巧
·gg网赚之:怎么样利用e文站轻松月入100刀_网赚技巧
·黄明明归国创业寻觅伙伴:人品好是必要条件_站长访谈
·最普通的7种软文类型_站长访谈
·第九城市ceo朱骏 网海中闯出一片天_站长访谈
·反波访谈:听keso乱弹琴_站长访谈
·人性和互联网_站长心得
·大型网站常用的五种推广方法_站长心得
相关主题
  • servlet实现访问次数的例子_jsp技巧
  • servlet动态产生jpeg图像的例子_jsp技巧
  • Servlet中jdbc应用高级篇-JSP教程,Jsp/Servlet
  • Servlet中如何捕获Session事件?-JSP教程,Jsp/Servlet
  • Servlet和JSP知识复习(2)Servlet基础-JSP教程,Jsp/Servlet
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭