通过 taglib 添加的 r:external 在 grails GSP 中不会作为链接处理



我正在尝试通过taglib添加r:external,以便将动态资源包含在GSP页面中。

tablib 包含在 GSP 页面中,如下所示

<html>
<head>
<g:layoutHead/>
<r:layoutResources />
<r:external uri="/css/mycss.css" type="css" />
<g:customStylesheetIncludes/>
</head>
<body>
<g:layoutBody/>
<r:layoutResources />
</body>
</html>

我的 TabLib 如下所示。

class MyResourcesTagLib {
    def customStylesheetIncludes = { attrs ->
        def controller = attrs.controller ?: controllerName
        def action = attrs.action ?: actionName
        writeCssIfExists( out, "css/my-custom.css" )
        // Determine the current page
        writeCssIfExists( out, "css/views/$controller/${action}-custom.css" )
    }
    private resourceExists( resPath ) {
        return grailsApplication.parentContext.getResource( resPath ).file.exists()
    }
    private writeCssIfExists( writer, css ) {
        if (resourceExists(css)) {
            def baseUri = grailsAttributes.getApplicationUri(request)
            writer << '<r:external uri="'
            writer << baseUri << (baseUri.endsWith('/') ? '' : '/')
            writer << css
            writer << '" type="css" />n'
        }
    }
}

当我查看呈现的 html 页面的源代码时。

<link href="/ResourceApp/css/mycss.css" type="text/css" rel="stylesheet" media="screen, projection" />
<r:external uri="/ResourceApp/css/my-custom.css" type="css" />

硬编码的r:external被转换为链接,但不是通过tablib添加的链接。

您在这里遇到的问题是您没有从您的标签库正确调用其他标签库。您只需将文本写出到输出流。

例如以下行:

 def baseUri = grailsAttributes.getApplicationUri(request)
 writer << '<r:external uri="'
 writer << baseUri << (baseUri.endsWith('/') ? '' : '/')
 writer << css
 writer << '" type="css" />n'

上面的行只是将文本附加到输出流。服务器不会进一步处理此文本,并将完全按照它们显示的方式发送到客户端。

解决方案是调用另一个标记库,并将该调用的输出追加到输出流。

例如:

def baseUri = grailsAttributes.getApplicationUri(request)
baseUri += (baseUri.endsWith('/') ? '' : '/')
writer << r.external(uri: baseUri, type: 'css')

最新更新