Servlet与Web服务

2008-02-23 09:36:36来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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>

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:服务器是怎么要求客户端强行弹出身份验证窗口的

下一篇:read AppFuse 15-实践-建立Action续