GSP vs. Controller in Grails



我在维护Grails应用程序方面有一些经验;现在创建一个"任务管理"应用程序作为练习。

显然,groovyServerPages与呈现视图的Controller操作之间存在视图二分法,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呈现的控制器?我可以把这两种方法结合起来吗?我是否过于简化了这里的选项?

要添加hvgotcodes所说的与您的问题相关的内容,您唯一想直接映射到GSP视图的时间是该视图实际上是"静态"的。

我所说的静态是指它不依赖于数据库或任何真实的计算来渲染视图。它仍然可以是动态的,因为它依赖于标记库来处理常见元素,以及页面顶部的"Welcomeuser"文本。

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

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


关于标签库的编辑:

正如我在下面所写的:

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

因此,如果您的视图中有逻辑代码,特别是与视觉或布局内容相关,则应将其放入标记库中。一个很好的例子是Spring Security Core中的<sec:ifLoggedIn>标记,如果用户登录,它可以用来切换元素的可见性

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

因为它(通过标题)使目的更加清晰,并抽象了逻辑,所以如果你以后需要改变某件事的工作方式,你只需要在一个地方改变它。


tl;dr:

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

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

如果你想打破url的Grails约定,url映射的东西就是用来做的,它与加载数据和显示数据(应该)的工作方式正交。

唯一存在二分法的时候(IMHO)是开发人员在项目中的代码功能不一致;即,肯定可以给出二分法的外观。

最新更新