2012-03-07 1 views
0

Я следующий код сохраняется в базе данных оракула как поле BLOB, в основном HTML и встроенный заводной код с SQL, которые возвращают некоторые значениярендеринг контента блобы в виде кода вместо текста

<% 
     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> 

Теперь я имею указанное выше значение BLOB в переменной thistemplate.contents, что я пытаюсь сделать на renderthistemplate.gsp, как показано ниже:

def renderString= g.render(template:"myController/renderthistemplate",model:[rendertemplate:thistemplate.contents]) 

Сейчас в GSP я просто ${rendertemplate} напечатать весь блоб. Ожидается, что он должен выполнить весь блок в качестве кода и отобразить вывод. Но на самом деле он печатает содержимое блоба в виде простой строки, ни HTML, ни код groovy не выполняются в целевом GSP. Как я могу иметь целевой GSP на самом деле визуализации содержимого двоичных объектов, как код, а не в виде строки/текста Благодаря Priyank

ответ

1

Вы не можете. По соображениям безопасности специальные символы в строке должны быть экранированы или хакеры могут ввести следующее имя: me'; delete from user;, который удалит все данные в таблице пользователя, как только вы выведете имя на веб-странице (упрощенный пример, но вы получите идею).

Вы могли бы render the blob as text использовать contentType:"text/html", но это не запустило код в блоках <% %>.

Решение заключается в создании собственного динамического шаблона. Вам нужно две вещи для этого:

  1. Создать новое поле в контроллере:

    GroovyPagesTemplateEngine groovyPagesTemplateEngine 
    
  2. Используйте этот код для визуализации блоб:

    groovyPagesTemplateEngine.createTemplate(blobAsString, “somepage.gsp”).make(model).writeTo(out) 
    

образец кода от: Grails – Rendering a Template from a String

+0

r подсказка и ссылка, мы будем это пробовать! –

+0

Просто у вас возник вопрос, будет ли этот вызов создавать новый шаблон gsp каждый раз .. в зависимости от blobasString –

+0

Sure; это не полный GSP, а код, который создает шаблон из файла '.gsp'. Как еще компилировать и запускать код Groovy из blob? Если это проблема с производительностью, я предлагаю создать шаблон один раз при запуске приложения, а затем вызвать 'make()' в этом общем шаблоне. –