我将以下代码保存在oracle数据库中作为blob字段,基本上是html和带有sql的嵌入式groovy代码,返回一些值
<%
import groovy.sql.Sql
def sql = Sql.newInstance("jdbc:mysql://localhost:3306/myDB","root", "root", "com.mysql.jdbc.Driver")
%>
<html>
<head>
<title>Database Example</title>
</head>
<body>
<table align="center" border="1">
<tr>
<td>Id</td>
<td>LastName</td>
<td>FirstName</td>
</tr>
<% sql.eachRow("select profile_id profileId, last_name lastName, first_name firstName from profile") {profile-> %>
<tr>
<td>${profile.profileId}</td>
<td>${profile.lastName}</td>
<td>${profile.firstName}</td>
</tr>
<% } %>
</table>
</body>
</html>
现在我在变量thistemplate.contents中有上面的blob值,我试图在renderthistemplate.gsp上渲染,如下所示:
def renderString= g.render(template:"myController/renderthistemplate",model:[rendertemplate:thistemplate.contents])
现在在gsp中,我只需要${rendertemplate}
来打印整个blob。
预计它应该将整个blob作为代码执行并呈现输出。
但它实际上是将blob的内容打印为普通字符串,HTML和groovy代码都不会在目标GSP中执行。
如何让目标GSP实际将blob内容呈现为代码而不是字符串/文本
谢谢
Priyank
答案 0 :(得分:1)
你做不到。出于安全原因,必须转义字符串中的特殊符号,否则黑客可以输入以下名称:me'; delete from user;
,只要在网页上显示名称,就会删除用户表中的所有数据(简化示例但是你明白了。)
你可以render the blob as text使用contentType:"text/html"
但不会运行<% %>
块中的代码。
解决方案是创建自己的动态模板。你需要两件事:
在控制器中创建一个新字段:
GroovyPagesTemplateEngine groovyPagesTemplateEngine
使用此代码渲染blob:
groovyPagesTemplateEngine.createTemplate(blobAsString, “somepage.gsp”).make(model).writeTo(out)