2012-04-24 222 views
1

是否可以在Spring中定義視圖命令的類型?正如現在這樣,我們改變我們的指揮課程是很危險的。視圖(path="myDto.persons[0].name")可以使用這些類的屬性,但如果命令類中的任何內容發生更改,視圖將僅在運行時失敗。彈簧視圖安全

我們MVC堆棧的所有其他部分都經過測試,所以我們可以在需要時安全地進行重構。唯一的問題在於視圖,因爲路徑「只是字符串」,並且我們無法以任何合理的方式搜索和替換我們使用特定命令的任何地方。

如果有某種方法可以告訴Spring命令的實際類型是什麼類型,那麼可以在我們對.jsp進行預編譯時進行驗證。編輯視圖時也會完成一項額外的好處,但我想這更像是一個IDE問題。

那麼,你們有沒有人知道如何以及如果這是可能的?

回答

1

如果您完全重新設計JSP文件(如果我自己可以這麼說的話,這是一種非常醜陋的方式),您可能會爲視圖添加類型安全性。

Servlets爲您提供了類型安全性,因爲這是Java代碼。如果你重構你的類並錯過了一些東西,編譯器會立即告訴你你錯過了它。但是,JSP取代了servlet作爲視圖技術,提供了更加動態/快速的開發速度(沒有更多的指令打開標籤,關閉它們,轉義引號等等)。

正如你注意到的那樣,EL表達式基本上是字符串,後來得到評估並在運行時失敗,如果某些東西關閉的話。即使你是precompile the JSPs,它仍然會失敗,因爲EL在生成的servlet中仍然是字符串。它們要麼傳遞給標籤,要麼傳遞給它們,或者如果使用JSP 2.x版本,那麼servlet容器本身將表達式包裝在評估調用中,然後將其作爲值傳遞。

基本上是一個版本低於JSP 2,對於像標籤:

<my:tag value="${bean.someProp}" /> 

你得到這樣的結果:

myTagInstance.setValue("${bean.someProp}"); 
在servlet

標籤本身會在運行時對字符串進行評估。

對於JSP 2你沒有得到任何好轉,評估仍然在運行時發生,但servlet容器藉此負擔遠離標籤,生成類似代碼:

myTagInstance.setValue((SomePropTypeCastHere) ProprietaryServletContainerEvaluationUtil.evaluate("${bean.someProp}")); 

如果的內容當評估發生時,對象本身並不是預期的,你會得到奇怪的結果或錯誤。

在JSP中強制執行靜態類型的唯一方法是將Java代碼返回到JSP中(EL發明的東西可以消除)。這就是爲什麼我在乞討時說過,你必須以一種醜陋的方式改變你的JSP。

If all your tags can use <rtexprvalue>true</rtexprvalue> values, you can use scriptlets to enforce type safety

的標籤,如:

<my:tag value="<%=bean.getSomeProp()%>" /> 

現在被轉換成這樣:

myTagInstance.setValue(bean.getSomeProp()); 

如果someProp財產被重命名,刪除,更改類型或什麼的,編譯器可以告訴你這件事。 IDE本身應該可以告訴你,你甚至不需要precompile the JSPs

如果我沒有記錯的話,春天標籤的支持運行時表達式所以這應該工作......如果你願意弄亂你的JSP是!

至於完成的IDE支持,你有對小腳本而不是EL。這是因爲對於EL來說,這是相同的討論,它發生在運行時。要如何知道IDE什麼是在上下文(頁面,請求,會話等)在執行JSP和知道,當你正在開發的JSP?