有人可以解释一下Spring的web.xml文件吗?

14

我是Java Enterprise和Spring的新手,但我对标准Java有很好的掌握。我正在查看一个现有的Web应用程序项目。该项目使用Tomcat/Spring/Hibernate,我了解这是相当常见的组合。它还使用DWR进行远程方法调用。我发现有些难以分离各个组件的职责:Tomcat负责什么,Spring负责什么,请求如何从一个组件传递到另一个组件,以及Spring中的主要组件如何拼装在一起。我已经阅读了大量关于Spring的文档,特别是有关bean和bean工厂的内容,并仍在继续阅读。欢迎提供任何建议,但我将提供一些具体的问题。

问题1:web.xml文件在哪里(何时使用/调用以及从哪里调用)?

代码示例1:

    <servlet>
    <servlet-name>qrst</servlet-name>
        <display-name>qrst Servlet</display-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

上面的代码片段是做什么的(或者说会引起什么事情)?在我的 web 应用程序中,qrst.jsp 在某个时刻被使用;是 DispatcherServlet 使用 servlet 名称调用 qrst.jsp 吗?否则,servlet 名称的意义是什么?什么是启动时加载?

代码示例 2:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /someLocation/some-servlet.xml
    </param-value>
</context-param>

能否提供相关链接或解释上述代码的含义?从查看XML文件可以发现它包含了bean定义,我知道什么是bean以及它们如何使用,但我想了解更多细节。

代码示例3:

<servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <display-name>DWR</display-name>
  <servlet-class>
        org.directwebremoting.servlet.DwrServlet
</servlet-class>
    <init-param>
        <param-name>classes</param-name>
        <param-value>
            somepackage.someclass
        </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

根据我对beans的了解,我相信这些init-param元素只是在servlet的Java类中设置的参数。servlet名称的重要性是什么?启动时负载又如何呢?Web应用程序以某种方式“知道”何时发生AJAX(dwr)调用,而不是在首次加载Web应用程序时(在首次加载时,它应该使用qrst.jsp)。它是如何知道这一点的?它是如何决定将请求路由到DWR而不是qrst.jsp的?它在哪里执行此操作?

谢谢。

1个回答

19

Servlet是JavaEE用于响应HTTP请求的术语。您可以在Servlet中编写应用程序的行为,它将响应请求。

Tomcat是一个Servlet容器,这意味着您可以在Tomcat中部署应用程序,它将为您管理所有通信基础设施:它接受连接,管理数据库连接(*),并调用您的Servlet来处理传入的请求。

web.xml是任何JavaEE应用程序的一部分,而不是Spring。您的代码示例1声明您的应用程序将使用类org.springframework.web.servlet.DispatcherServlet的实例来处理传入请求。

尽管Servlet是JavaEE开发的基本基础,但不建议创建自己的Servlet;相反,使用Spring创建MVC控制器。然后DispatcherServlet将调用这些控制器来处理请求。这只是另一种间接方式(但非常强大!)

是DispatcherServlet使用servlet名称直接调用qrst.jsp吗?

不是直接的。您的Servlet和JSP文件具有相同的名称只是一个巧合。

启动时加载了什么?

代码示例2指示DispatcherServlet从文件/someLocation/some-servlet.xml加载bean。如果在此文件中有控制器bean,并根据您配置的url映射方式,该文件中的bean将响应传入的请求。请参见the reference

我相信这些init-param元素只是在servlet的java类中设置的参数

web.xml中的init-param元素是为servlet类而设的。

Web应用程序如何“知道”何时发生AJAX(dwr)调用和何时首次加载Web应用程序(首次加载时应使用qrst.jsp)? 它是如何知道的?

问题中缺少<servlet-mapping>元素(位于web.xml中)或url映射(位于spring文件中)。它们负责决定URL是否应由dispatcher servlet还是dwr servlet处理。

例如,具有以下servlet映射的情况:

<servlet-mapping>
    <servlet-name>qsrt</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>dwr</servlet-name>
    <url-pattern>*.dwr</url-pattern>
</servlet-mapping>

则所有以.do结尾的URL将由调度程序servlet回答,而以.dwr结尾的URL将由dwr servlet处理。这就是servlet名称重要的地方。
JSP文件是另一回事。容器将简单地使用它们来处理以*.jsp结尾的URL。不要为以*.jsp结尾的URL创建自己的servlet映射。这只会带来麻烦。这可能是未指定的行为。
编辑:
然而,浏览器地址栏中的URL始终相同:它将始终调用qrst servlet。
那么,您的servlet-mapping可能如此广泛(类似于:<url-pattern>/*</url-pattern>),以至于它将处理您在服务器上放置的任何内容,并从不给其他servlet处理的机会。
最后但并非最不重要的是,在使用DWR或任何Ajax技术时,请安装Firefox的HttpFox扩展,以便监视应用程序的Ajax调用。

非常感谢您的帮助。我已经为qrst和dwr-invoker都定义了servlet-mapping,所以您说的对我来说很有意义!然而,在浏览器地址栏中的URL始终看起来相同:它总是调用qrst servlet。DWR是否在发出请求之前在javascript代码中设置URL?我已经稍微查找了一下,但没有看到类似的东西,如果我走上了正确的道路,我会继续寻找。 - KyleM
在some-servlet.xml文件中,有两个元素带有一个包含“Controller”的属性。其中一个是主要的,另一个是用于DWR!因此,DispatcherServlet可能只是选择适当的元素进行调用,这听起来合理吗?我现在必须回家了,但我会在周一尽快查看您的链接。非常感谢您的帮助,我真的无法告诉您我有多么感激。 - KyleM
再次感谢您的所有帮助,我无法告诉您我有多么感激,由于您出色的帖子,我已经能够学习适当的主题。@所有人 - 使用HttpFox显示当ajax调用执行时,“/dwr”是要发布到的URL的一部分。Leonel关于servlet-mappings的说法是正确的。现在只是找出如何发布该URL(因为我不知道它在哪里设置...)。我正在使用一些有用的文档更新原始问题。 - KyleM
我在哪里可以找到web.xml的完整结构? - quangkid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接