我在 grails 应用程序中使用的插件 (Nimble 0.3) 包括一些控制器和相关操作。我想(稍微)改变一些动作行为,我想知道如何才能实现这一目标。
我可以创建一个子控制器继承自我的插件控制器并覆盖一些操作实现?
或者,我可以创建另一个控制器吗同名作为插件控制器但位于不同的包中?
好吧,实际上我真正需要理解的是:Grails 如何确定要调用哪个控制器操作什么时候出现名称冲突?
假设您有一个名为 PluginController 的插件控制器和一个要覆盖的操作“foo”,您可以对控制器进行子类化:
class MyController extends PluginController {
def foo = {
...
}
}
但你需要在 UrlMappings 中做一些工作:
class UrlMappings {
static mappings = {
"/$controller/$action?/$id?" {
constraints {}
}
"/myController/foo/$id?"(controller: "myController", action: "foo")
"/myController/$action?/$id?"(controller: "pluginController")
"/pluginController/$action?/$id?"(controller: "errors", action: "urlMapping")
"/"(view:"/index")
"500"(view:'/error')
"404"(controller: "errors", action: "notFound")
}
}
这取决于 ErrorsController:
class ErrorsController {
def notFound = {
log.debug "could not find $request.forwardURI"
}
def urlMapping = {
log.warn "unexpected call to URL-Mapped $request.forwardURI"
render view: 'notFound'
}
}
如果您调用旧的“未映射”控制器操作,则会呈现 404 页面。您需要创建 grails-app/views/errors/notFound.gsp 来显示适当的 404 页面。
第一个 url 映射可确保调用您覆盖的操作。第二个将其他所有内容路由到原始控制器。第三个发送 404 进行直接访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)