我有以下代码来抓取所有控制器,对它进行排序,并在li标签中输出:
<g:each var="c" in="${grailsApplication.controllerClasses.sort { it.fullName } }">
<li<%= c.logicalPropertyName == controllerName ? ' class="active"' : '' %>>
<g:link controller="${c.logicalPropertyName}">${c.naturalName}</g:link>
</li>
</g:each>
我需要按包过滤控制器,即从某个包中抓取控制器。
例如:
com.app.module.mars.controller.HelloController
com.app.module.venus.controller.PrintController
正如您所看到的,我是按模块打包控制器,因此火星将拥有自己的一组控制器,而金星将拥有自己的控制器。然后在UI中我想使用上面的代码(带有一些过滤器),它将模块显示为主菜单,将控制器显示为下拉列表。
我该如何应用这样的过滤器?或者,如果你能指导我正确的方向将是伟大的。感谢。
答案 0 :(得分:1)
您可以使用GrailsClassUtils.isClassBelowPackage()
,它将类和包列表作为参数。所以这应该可以解决问题:
GrailsClassUtils.isClassBelowPackage(c.class, ['com.app.module.mars'])
修改:grailsApplication.controllerClasses
可能会为您提供GrailsClass
个对象的列表,因此您需要使用c.clazz
代替c.class
grailsApplication.controllerClasses.each { c ->
GrailsClassUtils.isClassBelowPackage(c.clazz, ['com.app.module.mars'])
}
答案 1 :(得分:1)
您可以使用Collection#groupBy
按程序包名称对控制器类进行分组。
我目前没有Grails系统进行快速测试,但这只是按包名分组类的一个小例子:
def classes = [Integer, List, String]
def classesByPackage = classes.groupBy { it.package.name }
assert classesByPackage == ['java.lang': [Integer, String], 'java.util': [List]]
然后,您可以遍历每个packageName以生成每个菜单,并通过该包名称下的每个类来生成每个菜单项。有点像...
classesByPackage.each { packageName, packageClasses ->
println "Menu $packageName"
packageClasses.each { println " Item $it.simpleName" }
}
...但是使用GSP风格的循环:)