Визуализация страницы GSP в файл в подпапке веб-приложения

Мне нужна действительно глупая вещь, но я застрял. Мне нужно в основном сделать страницу gsp и сохранить ее локально на стороне сервера в папке, которую я создал в web-app/.

В основном вывод этого:

    render(view: "report-test") 

должен быть сохранен в файле как пример report-test.html в папке, расположенной в web-app/report/

Любой хороший совет?

большое спасибо

ОБНОВЛЕНИЕ - ОБЪЯСНЕНИЕ Большое спасибо всем. Позвольте мне объяснить, что я пытаюсь сделать, надеюсь, есть лучшее решение. Могу поспорить, что есть, я все еще новичок в Grails. Я пытаюсь распечатать отчет, используя программу print-css и Price, которая помогает мне создать PDF. Поэтому моя идея состояла в том, чтобы создать HTML-файл динамически, используя gsp, и следовать правилам print-css, затем сохранить его локально на стороне сервера, затем выполнить команду (с Price), которая создаст мой pdf-файл и вернет pdf-файл в браузер.

ОБНОВЛЕНИЕ Мне нужно использовать CSS, но не для использования внутри HTML, а как часть команды программного обеспечения Price. http://www.princexml.com/ Таким образом, в основном рендеринг gps является html без применения css, затем, когда я запускаю команду для создания pdf, я указываю файл css для применения. Как пример:

     prince -s pdf-styles.css book.html builds/book.pdf

ОБНОВЛЕНИЕ /2 - ЗАКРЫТЬ

благодаря shutgunNinja, смотрите его псевдокод в своем посте ниже, здесь код, который я собираюсь использовать:

class YourController {
   def printHtml() {
       render(view: "report-test")
   }
   def buildReport() {
        String basePath = applicationContext.getResource("/").getFile().toString()
        def url = new URL("http://localhost:8080/PrjName/report/printHtml)
        def data = url.getText()
        def file = new File("${basePath}/reportFolder/report.html")
        file.createNewFile()
        FileUtils.writeStringToFile(file, data)
    }
}

Итак, как писал ранее shutgunNinja, я вызываю buildReport(), который вызывает URL для получения html-файла. Я хотел бы добавить несколько советов:

  • Будьте осторожны, если вы используете какую-то инфраструктуру безопасности, такую ​​как Spring Security, вы должны иметь возможность вызывать эту страницу без авторизации, в противном случае вместо запрашиваемого вами файла вы увидите страницу входа
  • Я добавляю переменную basepath, где храню правильный адрес для доступа к каталогу веб-приложения

2 ответа

Решение

Хорошо, я думаю, что понимаю, что вы пытаетесь сделать, и я постараюсь объяснить более подробно то, что я сказал в комментариях. Я не уверен, что это лучший подход для этого, но я бы попробовал, если бы не было других вариантов.

Требование:

Возьмите вывод метода Controller (скажем, report()), который отображает страницу GSP (скажем, через render(view: "report-test")) и сохраните его как файл HTML на сервере.

Подход:

  • заповедник report() и его логика, которая отображает страницу.
  • Создайте другой метод контроллера (скажем, buildReport()), который ничего не отображает сам по себе, но переходит обратно на какую-то другую страницу.
  • Есть это buildReport() метод извлечения содержимого любого URL-адреса на report()и сохраните их как файл.

псевдокод:

class YourController {
    def report() {
        // Handle input, generate data for populating page
        render(view: "report-test")
    }
    def buildReport() {
        // Indirectly call report(), passing whatever data is needed as URL parameters manually
        def url = new URL("/path/to/action?arg1=" + params.arg1)
        def data = url.getText()
        def file = new File("/web-app/report/report.html")
        file.createNewFile()
        FileUtils.writeStringToFile(file, data)
    }
}

Имейте в виду, я не проверял этот код, чтобы убедиться, что он работает или нет. Модификации почти обязательно должны быть сделаны, но это должно понять суть.

РЕДАКТИРОВАТЬ: Как упоминалось в своих редакциях ОП, систему безопасности, которую вы используете для фильтрации входа в систему, необходимо будет игнорировать. report() так что вы не получите экран входа в систему. То же самое касается любых фильтров перенаправления; этот подход, как правило, не очень хорошо справляется с перенаправлениями и пересылками HTTP, независимо от языка или инструментария.

Рендеринг выполняется в поток вывода HttpResponse. Это должно быть найдено как: response.outputStream

Одна вещь, которую вы можете сделать, это заменить объект 'response' на что-то, имеющее outputStream = StringOutputStream или FileOutputStream.

Сделайте этот обмен, прежде чем вызывать какую-либо операцию "output" в ответном pojo.

ОБНОВЛЕНИЕ: Звучит так, как будто вы хотите, чтобы вывод отображался в браузере (потому что вы хотите, чтобы css вступил в силу и т. Д.).

Вы не можете получить такой вид рендеринга на сервере. Ваш лучший выбор для создания отчета в формате PDF на сервере можно найти здесь: Создать PDF с Java

Другие вопросы по тегам