Лучший способ создать читаемый Javascript на Java для добавления на html-страницу
Я использую j2html для создания страниц рендеринга html через Java, если html вызывал любую функцию javascript, я помещал Javascript в отдельный файл.js. Однако представляется целесообразным включать функции только в основной файл javascript приложения, если они представляют собой функции общего назначения, используемые несколькими страницами. Функция, написанная специально для одной страницы, должна храниться где-то в другом месте, создание отдельных файлов.js для каждой страницы - это кошмар администратора, поэтому я хочу поместить их в html-код рядом с вызывающим кодом.
Я могу сделать это достаточно легко, и ниже приведен пример, созданный путем копирования функции непосредственно из файла.js и включения в сценарий j2htmls и теги rawHtml. Моя проблема в том, что код Javascript в моем коде Java не так удобен для чтения, как в отдельном файле js.
Есть ли способ, которым я могу написать это более аккуратным способом?
private Tag artwork()
{
return script(rawHtml("function artwork() {\n" +
" \n" +
" select = document.getElementById('fsArtwork');\n" +
" selected = select.options[select.selectedIndex].value;\n" +
" if(selected==0)\n" +
" {\n" +
" \tdocument.getElementById('saveArtworkFilename').disabled = true;\n" +
" }\n" +
" else\n" +
" {\n" +
" \tdocument.getElementById('saveArtworkFilename').disabled = false;\n" +
" }\n" +
"}"));
}
В комментариях ниже меня постоянно спрашивают, почему я не хочу использовать шаблоны, есть ряд причин:
Мои веб-страницы в настоящее время не создаются с помощью шаблонов, поэтому может показаться, что мне нужна html-страница с некоторым количеством javascript и использование шаблонов, как и предполагалось, мне придется переделывать всю страницу, используя шаблоны
Поскольку я не хотел бы писать свой HTML несколькими разными способами, я был бы обязан переделать все мои страницы в шаблонах
Так почему же я не использовал шаблоны в первую очередь?
Прежде всего, главное преимущество шаблонов состоит в том, чтобы отделить то, что веб-разработчик делает от разработчика сервера. Я делаю и то и другое, поэтому для меня это не преимущество. Я использую отдельную таблицу стилей, поэтому, если позже я захочу, чтобы веб-дизайнер улучшил внешний вид, изменив стиль, тогда они могут это сделать, шаблоны не помогают.
Еще одним преимуществом является удобочитаемость кода, что, безусловно, верно при сравнении jsps с кодом сервлета, но не верно при сравнении с j2html. Эта библиотека гарантирует, что я могу создавать только хорошо сформированный код, и что я могу использовать преимущества Java для создания динамических страниц и страниц на основе данных гораздо проще, чем шаблоны.
Использование шаблонов потребовало бы изучения их эзотерических способов
Использование шаблонов усложнит сборку и развертывание
Веб-страницы, сгенерированные из шаблонов, значительно медленнее, чем чистая Java, с веб-сайта j2html. Вы думаете, что шаблоны работают слишком медленно. Эта страница индекса отображалась 100 000 раз менее чем за секунду на i5-4670. Это примерно в тысячу раз быстрее, чем Apache "Velocity" (ха!)
Пытаясь ответить Типси
Когда я пытаюсь создать страницу, он жалуется
Не удалось найти файл с путем ='javascript/artwork.js'
Мой код содержит существующую инициализацию внешних файлов и расположение в основном пути к классам (недавно добавлено). Это нормально иметь оба.
staticFiles.externalLocation(Platform.getPlatformReportFolder().getPath());
staticFiles.location("");
scriptWithInlineFile_min("javascript/artwork.js"),
В основном файле jar (songkong-4.13.jar), который содержит манифест, файл javascript находится в папке javascript, которая является папкой верхнего уровня внутри jar.
Я заметил, что в манифесте songkong-4.13.jar сам по себе нет в списке путей к классам, это никогда не было проблемой, но может ли это быть проблемой сейчас?
Также в моем самом проекте Intellij папка javascript находится в src / main / resources, это, по-видимому, значение по умолчанию, но оно также не будет работать в IntelliJ.
Сейчас работаю в Dev
Проблема заключалась в том, что я использовал относительный путь
scriptWithInlineFile_min("javascript/artwork.js")
вместо
scriptWithInlineFile_min("/javascript/artwork.js")
Так что теперь он работает в dev.
Но когда я собираю его и запускаю вне dev, он больше не находит файл, даже если он находится в основном файле jar как /javascript/artwork.js
Дальнейшее обновление
Это была ошибка в j2html https://github.com/tipsy/j2html/issues/84 но она была исправлена в 1.2.1, и я использовал 1.2.0, теперь все работает.
В итоге
Я не знаю, назовешь ли ты это шаблонизацией или нет, но у меня отлично работает. Специфичный для страницы javascript может быть записан в файл, но затем встроен в визуализированный html-файл, и потому что в главном jar нет никаких дополнительных проблем с развертыванием, которые у вас возникли бы, если бы они были фактически развернуты как стандартные файлы.
2 ответа
Я думаю, что вы должны написать свой JavaScript в .js
файлы. Включить их либо через script().withScr("/path/to/file.js")
(если файл размещен) или через scriptWithInlineFile_min("/path/to/file.js")
(если вы хотите прочитать файл из classpath/file-system).
(Дельта Я почти не помню Java, и я знаю, что вам больше не нужен какой-то тип StringUtils, чтобы присоединиться.)
private Tag artwork() {
String[] js = [
"function artwork() {",
" select = document.getElementById('fsArtwork');",
" selected = select.options[select.selectedIndex].value;",
" if (selected === 0) {",
" document.getElementById('saveArtworkFilename').disabled = true;",
" } else {",
" tdocument.getElementById('saveArtworkFilename').disabled = false;",
" }",
"}"
];
return script(rawHtml(StringUtils.join(js, "\n")));
}
Но я все еще помещал это в шаблон, загружал и заполнял, и отправлял это клиенту. Код, сгенерированный любым разумным механизмом шаблонов, в конечном итоге будет почти таким же.