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

时间:2011-04-29 20:34:49

标签: spring dwr

我是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>

上面的代码片段做了什么(或者,它会导致什么事情发生)?在我的网络应用程序的某些时候,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>

从我读到的关于bean的内容来看,我相信那些init-param元素只是在servlet的java类中设置的参数。 servlet名称的重要性是什么,以及启动时的负载如何? Web应用程序以某种方式“知道”何时发生AJAX(dwr)调用,而不是第一次加载Web应用程序时(第一次加载时应该使用qrst.jsp)。怎么知道这个?它如何决定将请求路由到DWR而不是qrst.jsp?这是做什么的?

感谢。

1 个答案:

答案 0 :(得分:13)

Servlet是JavaEE回答HTTP requests的习惯用语。您可以在Servlet中编写应用程序的行为,该Servlet将响应请求。

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

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

虽然servlet是JavaEE开发的基础,但建议不要创建自己的;相反,使用Spring,您可以创建MVC controllers。然后DispatcherServlet将调用这些控制器来处理请求。这只是另一个间接(但非常强大!)

  

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

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

  

启动时加载了什么?

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

  

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

web.xml中的init-param元素用于servlet类。

  

Web应用程序以某种方式“知道”发生AJAX(dwr)调用时与第一次加载Web应用程序时(第一次加载时应使用qrst.jsp)。怎么知道这个?

缺少问题的是<servlet-mapping>元素(在web.xml中找到)或url映射(在spring文件中找到)。这些负责决定是否应该由调度程序servlet或dwr servlet处理URL。

例如,使用如下的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>

然后,调度程序servlet将回答以.do结尾的所有URL,而以.dwr结尾的URL将由dwr servlet处理。这里是servlet名称的重要部分。

JSP文件是另一回事。容器将简单地使用它们来处理以* .jsp结尾的URL。不要为以*.jsp结尾的URL创建onw servlet映射。这只会引起头痛。这可能是未指明的行为。

修改

  

但是,浏览器地址栏中的URL看起来总是一样:它总是会调用第一个servlet

然后你的servlet映射可能是如此宽泛(类似于:<url-pattern>/*</url-pattern>),它将处理你在服务器上抛出的任何内容,并且永远不会让其他servlet处理它。

最后但并非最不重要的是,在使用DWR或任何Ajax技术时,请安装HttpFox extension for Firefox,以便监视应用程序的Ajax调用。