我有一些维护Grails应用程序的经验;现在创建一个“任务管理”应用程序作为练习。
显然,呈现视图的是Groovy服务器页与控制器动作的视图二分法,如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创建视图,比如输出的典型服务器页面,以及何时将URL映射到通过委托GSP呈现的控制器?我能把这两种方法结合起来吗?我是不是把这里的选择简单化了?
发布于 2012-01-19 03:05:04
另外,与您的问题相关的hvgotcodes代码说,您唯一想直接映射到GSP视图的时间是该视图实际上是“静态”的。
所谓静态,我的意思是它不依赖于数据库或任何真实的计算来呈现视图。它仍然可以是动态的,因为它依赖于标记库来处理公共元素,以及页面顶部的“欢迎用户”文本。
只要您想处理用户提供的输入、查找数据库信息、管理更复杂的URL或包括计算,就应该使用控制器。
最终目标是GSP只包含可视和布局信息,以及偶尔的静态文本块。但是,您应该始终避免将任何逻辑与GSP混为一谈,因为它会扰乱代码,以后总是会导致维护上的麻烦。
有关标记库的编辑:
正如我所写的:
标记库用于连接到视图的任何逻辑,例如遍历元素或切换某物的可见性。每当您试图将代码直接放入GSP中时,它可能应该放在标记库中。当然,一次性交易总是有例外的。
因此,如果视图中有逻辑代码,这与可视化或布局内容特别相关,则应该将其放在标记库中。一个很好的例子是Security中的<sec:ifLoggedIn>标记,它可以用于在用户登录时切换元素的可见性。这比像这样手动编写它要好得多:
<sec:ifLoggedIn>blah blah</sec:ifLoggedIn>
<g:if test="${session.user?.loggedIn}">blah blah</g:if>因为它使目的更清晰(按其标题),以及抽象逻辑,所以如果以后需要改变某件事情的工作方式,您只需在一个地方更改它。
tl;dr:
发布于 2012-01-19 02:23:39
我不认为这是二分法。GSPs和Controller操作(旨在)协同工作,控制器调用服务加载数据,准备将数据传递到适当的GSP。
url映射是为了如果您想要打破url的Grails约定,这是正交的加载数据和显示数据(应该)的工作方式。
唯一一次(IMHO)出现二分法是当开发人员在项目代码功能中出现不一致时;也就是说,当然有可能出现二分法。
https://stackoverflow.com/questions/8920175
复制相似问题