2011-07-08 54 views
3

一個僞控制方法Spring MVC - JSTL標記JSON轉換行嗎?

@RequestMapping("/foo") 
public String getFoo(Model model) { 
    model.add("foo", repo.findFoo()); 
    model.add("bar", repo.findBar()); 
    model.add("barOptions", repo.findBarOptions(bar)); 
    return "fooView"; 
} 

比方說,客戶端使用表達式語言來呈現foobar;但我們使用JavaScript來呈現barOptions

<html> 
    <script> 
    var options = <mytag:toJSON object="${barOptions}"/>; 
    $("#options").renderOptions(options); 
    </script> 
    <body> 
     <mytag:renderFoo foo="${foo}"/> 
     <mytag:renderBar foo="${bar}"/> 
     <ul id="options"></ul> 
    </body> 
</html> 

常見約定告訴我這是不好的。但MVC的本質,控制器發送數據和視圖決定如何使用它,告訴我這是好的。有沒有更好的方法來做同樣的事情?爲什麼這不常用?有什麼理由嗎?我可以使用單獨的調用請求JSON,但是隨後我必須提出更多的頁面加載請求,並且可能有邏輯根據頁面加載時的其他輸入確定控制器方法getFoo()中的barOptions

回答

2

乍一看,我不能說我看到任何公然錯誤的方法。最初讓我不受警戒的唯一方面是您需要將模型對象中的數據轉換爲json。

對於我來說,JSON通常暗示着某種服務器端對象的需要進行轉換,使得客戶端的JavaScript可以在JavaScript的方式訪問或操縱它的結構。我猜想不知道更多的選項列表的目的,我不明白爲什麼json序列化在這裏是必需的。

通過使用標籤來轉換模型對象爲JSON,我們避免了客戶端發出的 額外的請求

但是,如果我們假設JSON是一個要求(也許是一些第三方的jQuery插件),那麼我絕對沒有看到任何方法錯誤。

什麼是barOptions無序列表的特殊或不同,爲什麼它已經與json呈現?爲什麼不使用for循環來構建列表項呢?或者你可以有一個自定義標籤來完全構建ul。

除此之外,我錯過了這個觀點,因爲人們可能認爲這是糟糕的代碼。

+0

我想要JSON的原因是重複使用相同的代碼來生成選項的查看方式(假設一個選項和它們的渲染比一個下拉菜單更復雜) - 當頁面加載時,我將首先繪製在JSP中的組件,然後當更新的東西,我用JS更新組件 - 這將是很好,如果我可以使用相同的邏輯,所以如果我改變它的呈現方式我不必修改JS選項組件渲染器和最初呈現組件的JSP – walnutmon

+0

好吧,我現在明白你的觀點。 renderOptions函數不僅用於創建,還用於後續更改。這就是說,我認爲這似乎是一個優雅的方法。另外,正如您正確指出的那樣,模型和視圖仍然是分開的,並且被封裝在這個方法中。這個觀點是對模型中的數據採取行動,它如何作用於他的姐妹 - 模型和控制器不是一個問題。我也喜歡有一個負責將對象轉換爲json的自定義標籤的想法。我可能不得不採取那一個:) –

0

通常JSON是由JavaScript要求與Ajax調用,但如果在你的情況下,它可以在頁面的渲染時間,我看沒有錯,你的解決方案。這是乾淨的,緊湊的代碼,易於閱讀。對我來說看起來非常合適,替代方案是使用forEach在選項數組上循環,但這種方法看起來更好。