如果您完全重新設計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?