Визуализация страницы 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