How to know programmatically if a view or a layout file exists in grails
I want to know programmatically if a view or a layout exists in grails.
I am thinking in obtain the absolutepath and ask for File.exists but I d开发者_Python百科on't know how to obtain this path for every enviroment.
I had tried groovyPagesTemplateEngine.getUriWithinGrailsViews('a-view.gsp')
without success.
Can you give me any pointer?
thanks in advance
Since Grails 2.0, you can inject a GrailsConventionGroovyPageLocator:
GrailsConventionGroovyPageLocator groovyPageLocator
and call
groovyPageLocator.findViewByPath(...)
groovyPageLocator.findTemplateByPath(...)
to check if views or templates exist.
Additionally to what amra said, you can also use grailsAttributes
(see docs for GrailsApplicationAttributes). Quick example:
private templateExists(String name) {
def template = grailsAttributes.getTemplateUri(name, request)
def resource = grailsAttributes.pagesTemplateEngine
.getResourceForUri(template)
return resource && resource.file && resource.exists()
}
This example is of course for templates but as you can see from the docs, similar method exists for views too.
I see 2 possibilities
Search for view file
If you build a war file you will see that views are stored in WEB-INF/grails-app/views. You can search for that resource.
def uri = this.getClass().getResource("/grails-app/views/...").toURI()
if(new File(uri).exists()){...}
Use PathMatchingResourcePatternResolver
Find a inspiration in assertView method of GrailsUrlMappingsTestCase.
def patternResolver = new PathMatchingResourcePatternResolver()
def pathPattern = "grails-app/views/" + ((controller) ? "$controller/" : "") + "${view}.*"
if (!patternResolver.getResources(pathPattern)) {...}
精彩评论