Сгенерированное по умолчанию grails-app/views/index.gsp
для вновь созданного приложения Grails на самом деле делает это.
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins <span class="caret"></span></a>
<ul class="dropdown-menu">
<g:each var="plugin" in="${applicationContext.getBean('pluginManager').allPlugins}">
<li class="dropdown-item"><a href="#">${plugin.name} - ${plugin.version}</a></li>
</g:each>
</ul>
</li>
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: Добавление информации на основе комментариев ниже
См. Проект на https://github.com/jeffbrown/pablopazosmenus.
Запустить приложение ...
./gradlew app:bootRun
На главной домашней странице вы увидите меню «Книги» и меню «Музыка».
Приложение зависит от 2 плагинов, каждый из которых предоставляет динамическую информацию меню. Плагины загружаются в приложение на https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/build.gradle#L62-L63.
runtime project(':pluginone')
runtime project(':plugintwo')
pluginone
предоставляет меню «Музыка». plugintwo
проверяет меню "Книги". Если вы закомментируете одну из этих зависимостей плагина и перезапустите приложение, вы увидите, что соответствующее меню исчезнет в приложении. Это указывает на то, что приложение динамически создает меню на основе компонентов, предоставляемых плагинами. Простая библиотека тегов https://github.com/jeffbrown/pablopazosmenus/blob/master/app/grails-app/taglib/pablopazosmenus/MenuTagLib.groovy является ее частью.
package pablopazosmenus
import org.springframework.beans.factory.annotation.Autowired
class MenuTagLib {
static namespace = 'pablo'
@Autowired
List<MenuHelper> menuHelpers
def renderMenu = { attrs ->
out << render(template: '/dynamicMenu', model: [menuHelpers: menuHelpers])
}
}
Каждый плагин предоставляет один из MenuHelper
bean-компонентов, которые вводятся туда, но плагин может предоставить любое их количество. Каждый из плагинов добавляет компоненты в свои doWithSpring
методы.
Код https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/grails-app/views/index.gsp#L36 вызывает этот тег lib.
<pablo:renderMenu/>
Есть много разных способов собрать все это вместе, и то, как я это сделаю, будет зависеть от понимания реальных требований.
Надеюсь, это поможет.