2011-04-29 32 views
5

我是Java Enterprise和Spring的新手,但對標準Java有很強的把握。我正在瀏覽一個現有的Web應用程序項目。該項目使用Tomcat/Spring/Hibernate,據我瞭解這是相當普遍的。它還使用DWR進行遠程方法調用。我發現將責任分開有點困難:Tomcat負責什麼,Spring負責什麼,請求如何從一個到另一個,以及Spring的主要部分如何組合在一起。我已經閱讀了大量關於Spring的文檔,特別是關於bean和bean的工廠,我仍然在閱讀更多內容。任何建議你們都會受到歡迎,但我會提供一些具體問題。有人可以解釋Spring web.xml文件嗎?

問題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被使用;它是使用servlet名稱調用qrst.jsp的DispatcherServlet嗎?否則,servlet名稱的意義是什麼?什麼是啓動時的負載?

代碼示例2:

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

鏈接或以上做什麼解釋?從查看包含bean定義的XML文件中我可以看到,我確實瞭解了哪些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> 

從我瞭解豆類,我相信那些INIT-param元素是獲得servlet的java類僅有的參數。 servlet名稱的意義是什麼,啓動時的負載如何? Web應用程序以某種方式「知道」什麼時候發生AJAX(dwr)調用,而不是第一次加載Web應用程序時(第一次加載應該使用qrst.jsp時)。它如何知道這一點?它如何決定將請求路由到DWR而不是qrst.jsp?它在哪裏做?

謝謝。

回答

10

Servlets是JavaEE用於回答的成語HTTP requests。你在一個Servlet中編寫應用程序的行爲,它將響應請求。

Tomcat是一個Servlet容器,這意味着您將應用程序部署在Tomcat中,它將爲您管理所有的通信基礎設施:它接受連接,管理數據庫連接(*)並調用servlet處理傳入請求。

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加載beans。如果在此文件中有控制器豆,並且根據如何配置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是否應該由調度程序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結束將由DWR的servlet處理。以下是servlet的名稱很重要的地方。

JSP文件是不同的故事。容器將簡單地使用它們來處理以* .jsp結尾的URL。不要爲以*.jsp結尾的URL創建你的servlet映射。這隻會導致頭痛。這可能是未指定的行爲。

編輯:

然而,在瀏覽器的地址欄中的URL看起來總是相同的:它總是調用QRST的servlet

那麼很可能是你的servlet映射是如此廣泛(如:<url-pattern>/*</url-pattern>),它將處理任何你在服務器上拋出的東西,並且永遠不會讓其他servlet處理它。

最後但並非最不重要,使用DWR或任何Ajax技術時,請安裝HttpFox extension for Firefox,以便您可以監視應用程序的Ajax調用。

+0

非常感謝您的幫助。我確實爲qrst和dwr-invoker定義了一個servlet映射,所以你說的話對我來說是有意義的!但是,瀏覽器地址欄中的URL總是看起來相同:它總是會調用第一個servlet。在提出請求之前,dwr可以在JavaScript代碼中設置URL嗎?我已經找到了這一點,但沒有看到這樣的事情,如果我在正確的軌道上,我會繼續尋找。 – KyleM 2011-04-29 21:43:18

+0

在some-servlet.xml中,有兩個元素的屬性「class」包含「Controller」。一個是主要的,另一個是DWR!因此,似乎DispatcherServlet可能只是選擇合適的一個來調用,這聽起來合理嗎?我現在必須回家,但我會在星期一儘快查看你的鏈接。感謝百萬人的幫助,我真的不能告訴你我多麼感激。 – KyleM 2011-04-29 21:49:17

+0

再次感謝所有的幫助,我無法告訴你我多麼感激,我已經能夠根據你的優秀帖子研究適當的主題。 @Everyone - 使用HttpFox顯示「/ dwr」是在執行ajax調用時發佈的URL的一部分。萊昂內爾關於servlet映射的說法很明顯。現在它只是找出如何將網址發佈到哪裏(因爲我沒有看到它在哪裏設置...)。我正在用一些有用的文檔更新原始問題。 – KyleM 2011-05-02 13:59:23