我对Grails很新,所以对这个问题可能有一个非常简单的答案.我正在尝试在gsp中显示动态创建的图像.图像不存储在数据库中,它是在控制器中即时创建的.
我本质上拥有的是一个gsp,它有一个接受一组用户输入的表单(requestGraph.gsp).提交表单后,参数将被发送到控制器中的displayGraph操作,该操作完全从Grails之外的数据库查询信息,并使用JFreeChart库创建图表.我想在displayGraph.gsp或类似的东西中显示这个图像.
所以基本上在requestGraph.gsp中我有一个类似的片段:
<g:form action="displayGraph">
<!-- ... bunch of labels and boxes -->
<g:submitButton name="displayGraph" value="Display Graph" />
</g:form>
Run Code Online (Sandbox Code Playgroud)
在控制器内我有类似的东西:
def requestGraph = {}
def displayGraph = {
//... code that uses params to make an image byte array and assigns to var img
return [image : img]
}
Run Code Online (Sandbox Code Playgroud)
在displayGraph.gsp中:
<body>
<h1>Graph Title</h1>
<!-- ??? How to dislpay image? -->
</body>
Run Code Online (Sandbox Code Playgroud)
我尝试将图像直接传送到displayGraph动作中的输出流.这有效,但后来我失去了对displayGraph.gsp中所有页面格式的控制.
我发现的大多数教程都创建了一个专门的操作来将图像传输到输出流,然后使用标记调用该操作.问题是我的图像没有存储在数据库中,我看不到传递图像字节数组(甚至表单参数)来创建/渲染图像的方法.任何人都可以帮我吗?谢谢.
Rob*_*ska 11
如果将字节写入输出流,则可以将控制器/操作视为GSP中图像的来源.这是一个快速,未经测试的例子:
// controller action
def displayGraph = {
def img // byte array
//...
response.setHeader('Content-length', img.length)
response.contentType = 'image/png' // or the appropriate image content type
response.outputStream << img
response.outputStream.flush()
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用src以下<img>标记访问您的图像:
<img src="${createLink(controller: 'myController', action: 'displayGraph')}"/>
Run Code Online (Sandbox Code Playgroud)
更新:
在再次阅读您的问题之后,这可能会或可能不会起作用 - 看起来您可能会将图表显示为表单提交的结果.只有在某个地方将状态存储在服务器上时(而不是仅从提交表单的一个请求中获取状态),这才有效.如果您在服务器上存储足够的状态以生成图形,那么您必须向控制器提供一些额外的参数以获取正确的图像,例如src="${g.link(controller: 'myController', action: 'displayGraph', params: ['id': 1234])}",id是您检索图形状态的方式.