动态Grails Url映射配置

时间:2010-11-20 13:13:38

标签: grails groovy

如何动态构建映射列表 - 而不是:

class UrlMappings {
static mappings = {
   "/helpdesk/user/$action?/$id?" (controller="helpdeskuser")
   "/helpdesk/group/$action?/$id?" (controller="helpdeskgroup")
   "/helpdesk/company/$action?/$id?" (controller="helpdeskcompany")
   "/helpdesk/account/$action?/$id?" (controller="helpdeskaccount")
   "/admin/company/$action?/$id?" (controller="admincompany")
   "/admin/account/$action?/$id?" (controller="adminaccount")
 }
}

像这样的伪代码:

class UrlMappings {
static mappings = {
   application.controllerClasses.each {
     if(it.name.startsWith('helpdesk'))
        "/helpdesk/${it.name}/$action?/$id?" (controller="${it.name}")
     if(it.name.startsWith('admin'))
        "/admin/${it.name}/$action?/$id?" (controller="${it.name}")
   }
 }
}

(我不明白静态映射是什么 - 哈希映射?自由变量?)

我想要实现的是基于控制器类型的映射 - 例如帮助台,管理员或用户控制器。一旦我设置了映射,我想基于URL添加安全性,但我不想单独映射每个控制器:

grails.plugins.springsecurity.interceptUrlMap = [
   '/helpdesk/**':   ['ROLE_HELPDESK','ROLE_ADMIN'],
]

4 个答案:

答案 0 :(得分:11)

我刚刚在我的应用程序中完成了以下操作:

import org.codehaus.groovy.grails.commons.ApplicationHolder

class UrlMappings {
  static mappings = {        
    for( controllerClass in ApplicationHolder.application.controllerClasses) {
      // Admin Controllers first
      if( controllerClass.name.startsWith("Admin")){
        // note... fixes the case so that AdminUserController maps to /admin/user
        "/admin/${controllerClass.name[5].toLowerCase() + controllerClass.name[6..-1]}/$action?/$id?" {
          controller = "admin${controllerClass.name[5..-1]}".toString()
        }
      }
    }
  }
}

之前我实际上没有这样做,你的问题促使我解决这个问题。这是我一直尝试做的事情之一。

答案 1 :(得分:5)

grailsUrlMappingsHolder bean在服务和控制器中可用。虽然UrlMappingsHolder的具体实现没有add方法,但是它的超类确实如此。这简单,如grails 2.3.4

def grailsUrlMappingsHolder

def addMapping() {        
    grailsUrlMappingsHolder.addMappings({
        "/admin"(controller:"admin" action:"index")  
    });        
}

答案 2 :(得分:2)

我想为我的应用程序实现类似的功能,并找到了一种由grails提供的好方法。它就像

name admin: "/admin/$cName/$action/$id?" {
    controller = {
        "admin" + params.cName.capitalize()
    }
}

注意,如果你使用$controller$cName(或者你喜欢的任何东西),这不起作用,而是会抛出NullpointerException。

作为奖励,您可以使用映射名称,如

<g:createLink 
    controller="adminBackend" action="login" 
    mapping="admin" params="[cName:'backend']"
/>

获取/ admin / backend / login的链接 - 希望这会有所帮助!

保持新鲜!

答案 3 :(得分:0)

您可以嵌入$controller变量,请参阅documentation

static mappings = {
   "/helpdesk/$controller/$action?/$id?"()
}

顺便说一下,controllerview s的映射由正常括号()括起,而不是卷曲的{}

这样的Groovy脚本(作为 UrlMappings.groovy )由ConfigSlurper实例解析,最终将它们转换为ConfigObject implements Map。不可否认,我要么不确定这个解析是如何完成的。

修改

Here UrlMappings.groovy 有点接近你想要的东西。 (搜索“/ $ _ ctrl / $ _ action / $ id?”。)代码BTW在运行时进行评估。然而,我无法让grailsApplication工作。

另一个想法是在Web应用程序中添加javax.servlet.Filter,即通过继承Grails'UrlMappingsFilter