2012-01-19 42 views
0

我有一些維護Grails應用程序的經驗;現在創建一個「任務管理」應用程序作爲練習。GSP與Grails中的控制器

顯然有的Groovy Server Pages的視圖二分法與Controller actions用於呈現一個視圖,如從URLMappings.groovy例子證明這個片段:

static mappings = { 

    // .. 

    "/" (view:'/index') 
    "/login/$action?" (controller: 'login') 
    "/logout/$action?" (controller: 'logout') 

    "500" (view:'/error') 
} 

其中面向用戶的URL必須被映射到視圖(GSP的)或控制器渲染視圖,例如:

class LoginController { 

    /** 
    * Show the login page. 
    */ 
    def auth = { 

     // .. auth logic 

     String view = 'auth' 
     String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}" 
     render view: view, model: [postUrl: postUrl, rememberMeParameter: config.rememberMe.parameter] 
    } 

} 

從設計的角度來看,我該如何選擇使用哪種方法?何時使用GSP/taglib創建視圖,如輸出HTML的典型服務器頁面,以及何時將URL映射到通過委託GSP呈現的控制器?我可以結合兩種方法嗎?我是否過分簡化了這裏的選項?

回答

3

要添加到hvgotcodes所說的與您的問題相關的內容,您希望直接映射到GSP視圖的唯一時間是該視圖實際上是「靜態」的時候。

靜態我的意思是它不依賴於數據庫或任何真正的計算渲染視圖。它依然可以是動態的,因爲它依賴於標籤庫來處理常見元素,以及諸如頁面頂部的「Welcome user」文本之類的東西。只要你想處理用戶提供的輸入,查找數據庫信息,管理更復雜的URL或包含計算,你應該使用控制器。

最終目標是GSP只包含視覺和佈局信息,以及偶爾的靜態文本塊。但是,您應該始終避免將任何邏輯與GSP混合,因爲它混淆了代碼,並且總是會導致維護頭痛。


關於編輯標籤庫:

正如我下面寫道:

標籤庫是用於連接到視圖,像上循環的元件,或切換的可見性的任何邏輯一些東西。每當你想把代碼直接放到你的GSP中時,它可能應該放在標籤庫中。當然,一次性總是有例外。

所以,如果你在你看來有邏輯代碼,即專門涉及到視覺或佈局的內容,應放在一個標籤庫。一個很好的例子是從Spring Security的核心,它可用於切換,如果用戶登錄元素的知名度<sec:ifLoggedIn>標籤這比手工編寫它像這樣更好。

<sec:ifLoggedIn>blah blah</sec:ifLoggedIn> 
<g:if test="${session.user?.loggedIn}">blah blah</g:if> 

因爲它使目標更清晰(通過其標題),以及將邏輯抽象出來,所以如果您以後需要改變某種方式的工作方式,則只需在一個地方進行更改即可。


TL; DR:

  • 的GSP - 簡化的 「靜態」 內容
  • 標籤 - 可重複使用的動態組件專門爲視覺或佈局內容
  • 控制器/ GSP的 - 動態內容
+0

非常有幫助。你認爲標籤庫應該扮演什麼樣的角色? – paislee

+0

標記庫適用於連接到視圖的任何邏輯,例如循環元素或切換某些內容的可見性。每當你想把代碼直接放到你的GSP中時,它可能應該放在標籤庫中。當然,一次性總是有例外。也許我會添加到上面的答案... – OverZealous

1

我不認爲這是一種二分法。 GSP和控制器操作(旨在)協同工作,控制器調用服務來加載數據,以準備將該數據傳遞給相應的GSP。

URL映射的東西是用於如果你想打破網址的Grails約定,這是正確的如何加載數據和顯示數據(假設)工作。

唯一一次(恕我直言)有一個二分法是開發人員在項目代碼功能不一致時;即當然可以給出二分法的外觀。