我正在尝试通过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')