2012-01-19 47 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约定,这是正确的如何加载数据和显示数据(假设)工作。

唯一一次(恕我直言)有一个二分法是开发人员在项目代码功能不一致时;即当然可以给出二分法的外观。