我在维护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)是开发人员在项目中的代码功能不一致;即,肯定可以给出二分法的外观。