從整個B/S程序的運行結構來看,J2EE的表示層解決方案實際上是對“請求-響應”模式的一種實現。既然謂之“請求-響應”也就勢必存在着兩大溝通角色: 請求對象和響應對象。Servlet、SpringMVC、Struts2對請求-響應的實現是分別基於參數-參數模式、參數返回值、和POJO模式的,由於這兩大角色的承載載體和編程語言實現基礎都不同,因此三種模式的可謂風格迥異。
參數-參數模式 | 參數-返回值模式 | POJO模式 | |
請求方 | 方法參數 | 方法參數 | 屬性變量 |
響應方 | 方法參數 | 返回值 | 屬性變量 |
【參數-參數模式】
Servlet對象是運行在行爲模式(只有一系列方法的定義,而不包含屬性的定義),在Servlet中請求的內容和響應的內容分別被封裝在HttpServletRequest對象中和HttpServletResponse對象中,也就是說請求和響應均存在於方法的參數列表中,因此Servlet對象又叫“無狀態對象”。這 裏實際上有一點“數據與行爲分離”的意味。也就是說,在Servlet處理請求的過程中,其實也是Servlet中響應方法內部的邏輯執行過程中,如果需 要處理請求數據或者返回數據,那麼我們需要和HttpServletRequest打交道;如果需要處理執行完畢之後的響應結果,那麼我們需要和 HttpServletResponse打交道。 基於這種模式的請求-響應模式稱爲參數-參數模式。參數-參數模式是一種最爲基礎的請求響應實現機制,也是底層規範不得不採用的一種機制。也就是無論參數-返回值、POJO模式的實現都是依賴於依賴於參數-參數模式。
【參數-返回值模式】
而在SpringMVC的Controller使用的是使用參數-返回值實現模式,參數-返回值模式是一種最爲直觀的請求-響應實現模式,SpringMVC中對於Controller的定義如下:
方 法的參數(email和password)被視作是Http請求參數的概括。而在這裏,它們已經被SpringMVC的框架有效處理並屏蔽了內在的處理細 節,呈現出來的是與請求參數名稱一一對應的參數列表。而返回值ModelAndView則表示Http的響應是一個數據與視圖的結合體,表示Http的處 理結果。 而方法體本身,再其內部包含了邏輯處理的整個過程。
【POJO模式】
最後Struts2對請求-響應的實現是通過POJO對象,請求參數和響應內容全部以POJO內部屬性而存在,傳統Servlet模式中的禁地Controller中的屬性變量被合理利用了起來作爲請求處理過程中的數據部分。POJO模式顛覆了前兩種實現模式以java類中的方法的語法特性爲原型基礎進行請求響應的的傳統模式。POJO模式是對Servlet模式的一個重大改進。POJO實現模式是一種具有革命性意義的模式,因爲它能夠把解耦合這樣一個觀點發揮到極致。從面向對象的角度來看,POJO模式無疑也是所有程序員所追求的一個目標。這也就是Struts2那麼多年來經久不衰的一個重要原因。
三種不同實現模式存在着一些分歧,他們之間的主要分歧在於:不同的實現模式使用了不同的編程元素(方法參數、方法返回值、類的屬性)來表達請求-響應模式中不同的邏輯語義。