Ответы пользователя по тегу Thymeleaf
  • Как правильно вывести подблок с данными на странице?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Можно по-разному реализовать.
    1) Заранее подготовить некий DTО, в котором заранее будут данные пользователя и его отпуски. Соответственно, останется просто итерировать по этому List<DTO>
    2) Если идти, по структуре, как сейчас, то есть персональные данные и данные об отпусках добавляются во вью отдельно, то нужно сделать проверку на ID пользователя.
    Условно говоря, th:if="${el.Trackable_ID == el.PERSON_ID}"
    Я просто не знаю, как ваши поля называются. Т.е. взять ID текущего элемента из trackables и сравнить его с ID человека в deviationsTrackables
    Ответ написан
    Комментировать
  • Реализовать вывод результата поиска, с выбором среди результатов?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Если вы решили реализовать полнотекстовой поиск, то такие библиотеки, как Hibernate Search, ElasticSearch, Apache Lucene вам в помощь.

    Теперь, что касается вашего функционала, то вот ошибка:
    "Error resolving template [autocomplete], template might not exist or might not be accessible".
    Он не видит шаблон autocomplete.

    Так как не вижу вашего кода, то сделаю смелое предположение, что класс в котором находится эндпоинт autocomplete аннотиирован @Controller
    И если uri - add_trackable возвращает ваш шаблон и корректно работает, то autocomplete не будет работать, так как вы выполняете ajax запрос. Тут 2 варианта - вынести этот эндпоинт в отдельный класс и обозначить, как @RestController . Или же к этому методу добавить @ResponseBody
    К слову, прочитайте про разница @Controller и @RestController
    Ответ написан
    Комментировать
  • Как правильно передать параметры в thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    1) Графики можно рисовать средствами js на стороне фронта без участия бэкенда.
    Например, https://www.chartjs.org/
    2) Для графиков помимо JFreeChart, еще могу посоветовать XChart -
    https://knowm.org/open-source/xchart/
    3) Вы получаете следующее исключение -
    Required request parameter 'x0' for method parameter type double is not present

    В контроллере принимаете int, а в форме возможно передаете число с запятой (тип double)
    Попробуйте это @RequestParam int x0, поменять на @RequestParam double x0,, либо посмотрите почему фронт не отправляет целочисленный тип. Например, можно поэкспериментировать с атрибутом step тега input
    Ответ написан
  • Почему при выводе на форму не подтягивается связанный объект из БД?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.

    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
        @JoinColumn(name = "id")
        private UserInfo userInfo;


    Так у вас FetchType.LAZY, потому данные и не подтягиваются. А OSIV у вас включен или отключен?

    P.S. не передавайте на фронт саму сущность. Используйте DTO.
    Ответ написан
    2 комментария
  • Как реализовать фильтр данных по критерию?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Конечно же есть... По факту вам нужно реализовать поиск.
    Если нужна готовая либа. то вот:
    https://github.com/tkaczmarzyk/specification-arg-r...

    Если хотите обойтись без либы, то расширьте репозиторий интерфейсом.
    JpaSpecificationExecutor<Book>
    А дальше можете передавать туда нужные спецификации (Specification)
    https://www.baeldung.com/rest-api-search-language-...
    Ответ написан
    Комментировать
  • Возможно ли поместить в option selected Значение переменной из Thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    <option selected>Как сюда поместить значение  переменной Thymeleaf??</option>
            <option th:each="ru: ${rule}"
                    th:value="${ru.id}"
                    th:text="${ru.name}">
            </option>

    Тут нужно сделать проверку при помощи th:selected
    https://attacomsian.com/blog/thymeleaf-conditional...
    Если я вас правально понял. то атрибут selected нужно добавить, если значение из цикла совпадает со значением из вашей переменной (допустим из БД)?
    Если так, то в цикле th:each вы при помощи th:selected проверяете на совпадение и если значение переменной и элемента из цикла совпадают, то добавляете атрибут.
    Ответ написан
    5 комментариев
  • Thymeleaf, как добавить значение по умолчанию для параметра, если он отсутствует при нажатии на ссылку?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Thymeleaf, как добавить значение по умолчанию для параметра, если он отсутствует при нажатии на ссылку?

    Никак. thymeleaf есть на стороне сервера. А нажатие на ссылку происходит на стороне клиента (в браузере), где нет никакого thymeleaf.
    Соответственно, вам нужно валидировать средствами js || jQuery.
    Условно говоря, вещаете обработчик на клик по ссылке
    Погуглите jQuery .on('click', function(){}) или .click()
    Если нет нужного параметра, то средствами js добавляете его и все.
    Ответ написан
    1 комментарий
  • Thymeleaf, th:text не работает, если находится внутри другого th:text, как обойти?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Если память не изменяет, то вам нужен th:inline
    Примерно так:
    <h4 th:inline="text">[[${product.name}]]<span th:text="${product.getPrice()}">45</span></h4>

    Вот, прочитайте этот вопрос:
    https://stackoverflow.com/questions/25071985/thyme...
    Ответ написан
    Комментировать
  • Как правильно присвоить значение объекту в thymleaf?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Во-первых, убедитесь в том, что указанная строка что-то возвращает. Добавьте точку остановки и гляньте есть ли список категорий
    List<Category> category = categoryService.getAll();


    Точно не уверен, но могут ли названия двух полей, как-то конфликтовать?! Надо бы этот момент проверить.
    th:field="*{category}"
    Попробуйте в блоке ниже сменить category : на что-нибудь другое. Например, cat и соответственно, смените его в соответствующих строках тоже.
    <option th:each="category : ${categoryList}" value="${category.id}"
                                    th:text="${product.category}"></option>



    Вы имеете ввиду вот, тут не присваивается? th:text="${product.category}"
    Если да, то он и не будет присвоен, ибо в данном случае вы лишь получаете значение product.category, а так как product новый: Product product = new Product();, то и присвоенной категории для него тоже не будет.
    Ответ написан
  • Как сделать редактор текста todo list?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Все довольно просто:

    1 способ:
    1) у вас должна быть страница редактирования записи.
    2) добавьте кнопку редактировать. Кнопка редактировать перенаправляет юзера (GET запрос) с id (path variable или request param - идентификатор записи).
    3) По идентификатору достаете текст записи на странице редактирования записи
    4) редактируете запись и сохраняете.

    2 способ:
    1) можно все указанное сделать при помощи ajax. Вместо перенаправления на отдельную страницу загружать содержимое в модальном окне (доставать данные средствами js при помощи ajax).
    2) а дальше уже сохраняете данные сабмитом содержимого формы из модалки

    P.S. небольшой совет:
    todo.setCompleted("No");
    Предположу, что у вас статус completed является типом String. Лучше используйте тип boolean. А еще лучше обертку Boolean, который принимает true false & null
    Ответ написан
    Комментировать
  • Как правильно вставлять картинки в html в Spring?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день.
    Прежде всего настоятельно рекомендую провести поиск по этому сайту, а также погуглить, так как ответ на ваш вопрос легко ищется поисковиком и в общем-то найдете кучу ответов. Помню, как буквально пару месяцев назад здесь же отвечал на аналогичный вопрос.

    Теперь, что касается вашего вопроса:

    Я так понимаю так же нужно настраивать Thymeleaf?

    Шаблонизатор вам нужен в любом случае. Будь то thymeleaf или freemarker, mustache и др. Можете взять thymeleaf.

    Предположу, что ожидается некое динамическое добавление картинок в шаблон. Т.е. художники загружают свои работы, а далее они отображаются в шаблоне.
    Если так, то разделим вашу задачу на несколько частей:
    1) Реализовать загрузку картинок, хранение данных о картинках в БД (например, путь к картинке)
    https://spring.io/guides/gs/uploading-files/
    https://stackabuse.com/uploading-files-with-spring-boot
    https://www.baeldung.com/spring-file-upload
    2) Реализовать вывод картинки в шаблоне.
    В данном вашем примере у вас выводится изображение в формате svg (placeholder)
    Вам нужно вместо нее добавить img тег
    Примерно так:
    <img th:src="${image}" alt="Картинка"/>
    Конечно же вместо переменной image вам нужно подставить свою переменную.
    Если нужно вывести блок со всеми работами художника, то вам нужно будет вывести цикл с его работами.
    Итерируем по списку работ художника - https://habr.com/ru/post/351132/
    Ответ написан
    7 комментариев
  • Как связать html-файлы в Spring?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день!
    Судя по коду вы используете thymeleaf.
    Но я так и не увидел вашего вопроса. Вы создали фрагмент header.html при помощи th:fragment, а затем вставили этот фрагмент при помощи th:insert. А в чем заключается проблема? Что-то не работает или ...?

    И в зависимости от версии thymeleaf th:insert="header :: header" это может не работать или просто выдавать предупреждение. Используйте th:insert="~{header :: header}"

    Есть кстати, доп. либа, которая позволяет более гибко настраивать шаблоны - Thymeleaf Layout Dialect
    https://github.com/ultraq/thymeleaf-layout-dialect

    Полезная информация - https://habr.com/ru/post/351844/
    Ответ написан
    Комментировать
  • Как правильно вставлять картинки в html представления и настраивать Thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Добрый день!
    Картинки проекта нужно добавлять в директорию resources/static Можно создать директорию images и соответственно, путь будет /resources/static/images
    А уже все последующие загружаемые файлы через фронт можно хранить либо на распределеных файловых системах, либо где-нибудь на хостинге.
    Ответ написан
  • Как сделать список одного select зависимым от выбора в другом?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Добрый день!
    Во-первых, backend тут ни причем. Это все решается на стороне front-end.
    Я бы сказал, что JS обязателен к использованию, а точнее можно обойтись готовыми библиотеками типа select2 или bootstrap-select
    Вот, вариант реализации без js библиотеки
    https://stackoverflow.com/questions/4480637/how-to...
    Ответ написан
  • Почему-то BindingResult не ловит ошибку, как исправить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    В первую очередь небольшая рекомендация - вместо того, чтобы из view напрямую получить объект User и сохранить его, создайте UserDto класс и далее получив данные из вью замаппите его в User().
    По поводу возможных ошибок валидации загляните по этой ссылке - https://stackoverflow.com/questions/42423553/sprin...
    Ответ написан
    Комментировать
  • Как отобразить картинку в spring thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Здравствуйте!
    Если вы подключили Spring Security, то возможно, что вы забыли задать конфигурацию и путь к картинкам просто блокируется
    Ответ написан
  • Не добавляются данные в таблицу при нажатии на input (java). Как это исправить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    <tr form th:action="@{/}"
                th:object="${addUser}" method="POST">
                <td><input/></td>
                <td><input type="text" th:field="*{lastName}" /></td>
                <td><input type="text" th:field="*{firstName}" /></td>
                <td><input type="text" th:field="*{email}" /></td>
                <td><input type="text" th:field="*{number}" /></td>
                <input type="submit" value="add" />
                </form>

    Ну для начала посмотрите на этот кусок кода. У вас там что-то неладное. тег form вложен в тег tr
    <tr form th:action="@{/}"
    Ответ написан
  • Как сделать infinite scroll в thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    thymeleaf ни причем.
    1) используйте какую-нибудь библиотеку для аякс пагинации (будь-то infinite scroll или load more и др.).
    Например, https://infinite-scroll.com/
    https://www.sitepoint.com/jquery-infinite-scrollin...
    https://github.com/brianmario/jquery-infinite-scroll
    2) далее реализуйте RestController, который выдает контент в json. Задействуйте Pageable для реализации пагинации
    3) По достижению области видимости контента отправляйте аякс запрос и инкрементируйте pageable чтобы получить следующую страницу.
    Ответ написан
    Комментировать
  • Как вывести определенное количество значений th:each - thymeleaf?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    но столкнулся с тем, что оно мне лупит все 500 записей

    Вы либо реализуйте пагинацию и соответственно, кол-во выводимых записей укажите там
    https://www.baeldung.com/spring-data-jpa-paginatio...
    Либо заранее получите в контроллере нужное количество List<News>.
    Имеется ввиде, что на уровне репозитория можете сделать limit - https://www.baeldung.com/jpa-limit-query-results

    Более того создает каждый блок снова и снова, вместо того, чтобы заполнить выведенные ему места. кидаю код

    Это потому, что вы одну и ту же новость выводите каждый раз в блоках.
    Вот, ваш цикл:
    th:each="news : ${newses}"
    И каждый раз вы выводите одну и ту же новость в одной итерации
    th:href="${news.getLink()}"
    А чтобы вывести подобный блок с учетом дизайна можно сделать следующее...
    Для каждой n-й записи применяем CSS стиль или добавляем нужный html, чтобы вывести ее слева с картинкой.
    Чтобы получить индекс записи используйте итератор
    th:each="news, iter : ${newses}"
    Ответ написан
    Комментировать
  • Themeleaf: Как вывести на страницу сообщение по дефолту?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    Здравствуйте!
    Почему бы вам не восопльзоваться возможностями шаблонизатора?
    Вот, несколько вариантов решения вопроса:

    1) Использование тернарного оператора
    <span th:text="${address.city != null} ? ${address.city} : 'No data!'">City</span>


    2) Использование: if unless (аналог if else на java). Обратите внимание, что если city это строка, то можно использовать ==, а если объект, то нужно использовать eq
    <span th:if="${address.city} == null">Non data</span>
    <span th:unless="${address.city} != null" th:text="'Your city : ' + ${address.city}">Non data</span>


    Также обратите внимание, что вы можете "обеспечить защиту" приложение, если значение null используя оператор безопасной навигации ?. между address & city
    <span th:text="'Your city : ' + ${address?.city}">Non data</span>
    Ответ написан
    1 комментарий