12

我是 Java Enterprise 和 Spring 的新手,但我对标准 Java 有很强的掌握。我正在浏览一个现有的 Web 应用程序项目。该项目使用 Tomcat/Spring/Hibernate,据我所知这是相当普遍的。它还使用 DWR 进行远程方法调用。我发现区分职责有些困难:Tomcat 负责什么,Spring 负责什么,请求如何从一个到另一个,以及 Spring 的主要部分如何组合在一起。我已经阅读了大量有关 Spring 的文档,尤其是有关 bean 和 bean factory 的文档,并且仍在阅读更多内容。欢迎大家提出任何建议,但我会提供一些具体问题。

问题 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 的某个时刻被使用;是使用 servlet 名称调用 qrst.jsp 的 DispatcherServlet 吗?否则 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?它在哪里做到这一点?

谢谢。

4

1 回答 1

17

Servlet 是 JavaEE 用于响应 HTTP 请求的惯用语。您在响应请求的 Servlet 中编写应用程序的行为。

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

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

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

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

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

启动时加载了什么?

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

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

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

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

问题中缺少<servlet-mapping>元素(在 web.xml 中找到)或 url 映射(在 spring 文件中找到)。它们负责决定 URL 应该由调度程序 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>

然后所有以 结尾的 URL.do将由调度程序 servlet 响应,而以结尾的 URL.dwr将由 dwr servlet 处理。这就是 servlet 的名称很重要的地方。

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

编辑:

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

那么您的 servlet 映射可能非常广泛(类似于 : <url-pattern>/*</url-pattern>),它会处理您在服务器上抛出的任何内容,而不会给其他 servlet 处理它的机会。

最后但同样重要的是,在使用 DWR 或任何 Ajax 技术时,请安装Firefox 的 HttpFox 扩展,以便您可以监控应用程序的 Ajax 调用。

于 2011-04-29T20:59:18.607 回答