Grails中的GSP与控制器

Grails中的GSP与控制器,grails,view,Grails,View,我有一些维护Grails应用程序的经验;现在创建一个“任务管理”应用程序作为练习 显然,有一种视图二分法VS呈现一个视图,这可以从URLMappings.groovy示例中的片段中看出: static mappings = { // .. "/" (view:'/index') "/login/$action?" (controller: 'login') "/logout/$action?" (controller: 'logout') "500"

我有一些维护Grails应用程序的经验;现在创建一个“任务管理”应用程序作为练习

显然,有一种视图二分法VS呈现一个视图,这可以从
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呈现的控制器?我能把这两种方法结合起来吗?我是否将这里的选项过于简化了?

我不认为这是一种二分法。GSP和控制器操作(旨在)协同工作,控制器调用服务来加载数据,以准备将数据传递给适当的GSP

如果您想打破Grails对url的约定,那么url映射的内容就可以使用,这与加载数据和显示数据(应该)的工作方式是正交的


唯一存在二分法的时间(IMHO)是当项目中的开发人员代码功能不一致时;i、 当然有可能出现二分法。

我不认为这是二分法。GSP和控制器操作(旨在)协同工作,控制器调用服务来加载数据,以准备将数据传递给适当的GSP

如果您想打破Grails对url的约定,那么url映射的内容就可以使用,这与加载数据和显示数据(应该)的工作方式是正交的


唯一存在二分法的时间(IMHO)是当项目中的开发人员代码功能不一致时;i、 当然有可能出现二分法。

要补充hvgotcodes所说的与您的问题相关的内容,您唯一想直接映射到GSP视图的时间是该视图实际上是“静态”的时候

静态的意思是它不依赖于数据库或任何真实的计算来呈现视图。它仍然可以是动态的,因为它依赖于标记库来处理公共元素,以及页面顶部的“欢迎用户”文本

只要您想处理用户提供的输入、查找数据库信息、管理更复杂的URL或包含计算,就应该使用控制器

最终目标是GSP只包含视觉和布局信息,以及偶尔的静态文本块。但是您应该始终避免将任何逻辑与GSP混合在一起,因为它会使代码变得混乱,并且总是导致以后的维护问题


编辑有关标记库的信息:

正如我在下面写的:


标记库适用于连接到视图的任何逻辑,如在元素上循环,或切换某些内容的可见性。当您试图将代码直接放入GSP时,可能应该将其放入标记库中。当然,一次性的也有例外

所以,如果视图中有逻辑代码,特别是与视觉或布局内容相关的代码,则应该将其放入标记库中。Spring Security Core中的
标记就是一个很好的例子,如果用户登录,它可以用来切换元素的可见性。这比像这样手动编写要好得多:

<sec:ifLoggedIn>blah blah</sec:ifLoggedIn>
<g:if test="${session.user?.loggedIn}">blah blah</g:if>
废话
废话
因为它使目的更明确(通过标题),并将逻辑抽象出来,所以如果以后需要更改某些工作方式,只需在一个地方更改即可


tl;博士:

  • GSPs-简化的“静态”内容
  • 标记—专门用于视觉或布局内容的可重用动态组件
  • 控制器/GSP-动态内容

要补充hvgotcodes所说的与您的问题相关的内容,您希望直接映射到GSP视图的唯一时间是当该视图实际上是“静态”时

静态的意思是它不依赖于数据库或任何真实的计算来呈现视图。它仍然可以是动态的,因为它依赖于标记库来处理公共元素,以及页面顶部的“欢迎用户”文本

只要您想处理用户提供的输入、查找数据库信息、管理更复杂的URL或包含计算,就应该使用控制器

最终目标是GSP只包含视觉和布局信息,以及偶尔的静态文本块。但是您应该始终避免将任何逻辑与GSP混合在一起,因为它会使代码变得混乱,并且总是导致以后的维护问题


编辑有关标记库的信息:

正如我在下面写的:


标记库适用于连接到视图的任何逻辑,如在元素上循环,或切换某些内容的可见性。当您试图将代码直接放入GSP时,可能应该将其放入标记库中。当然,一次性的也有例外

所以,如果视图中有逻辑代码,特别是与视觉或布局内容相关的代码,则应该将其放入标记库中。Spring Security Core中的
标记就是一个很好的例子,如果用户登录,它可以用来切换元素的可见性。这比像这样手动编写要好得多:

<sec:ifLoggedIn>blah blah</sec:ifLoggedIn>
<g:if test="${session.user?.loggedIn}">blah blah</g:if>
废话
废话
因为它使目的更明确(通过标题),并将逻辑抽象出来,所以如果以后需要更改某些工作方式,只需在一个地方更改即可


tl;博士:

  • GSPs-简化的“静态”内容
  • 标记—专门用于视觉或布局内容的可重用动态组件
  • 控制器/GSP-动态内容

非常有用。你认为标签库应该扮演什么角色?标签库是为任何人准备的