Spring MVC (текстовое поле и кнопка) с использованием CrudRepository и Thymeleaf - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно создать простую кнопку поиска с помощью пользовательского метода с использованием CrudRepository и показать результаты поиска на веб-сайте.

Event.java

@Entity
@Table(name = "events")
public class Event {
    private String name;
}

EventRepository.java

public interface EventRepository extends CrudRepository<Event, Long>{
    public Iterable<Event> findByName(String name);
}

EventService.java

public interface EventService {
    public Iterable<Event> findByName(String name);
}

EventServiceImpl.java

@Service
public class EventServiceImpl implements EventService {

    @Override
    public Iterable<Event> findByName(String name) {
        return eventRepository.findByName(name);
    }
}

EventsController.java

@Controller
@RequestMapping(value = "/events", produces = { MediaType.TEXT_HTML_VALUE })
public class EventsController {

    @RequestMapping(value = "/search", method = RequestMethod.GET)
    public String showEventsByName(@ModelAttribute Event event, @RequestParam (value = "search", required = false) String name, Model model) {
        model.addAttribute("event", event);
        model.addAttribute("searchResult", eventService.findByName(name));

        return "events/index";
}

index.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layouts/default}">
<head>
  <title>All events</title>
</head>
<body>
  <div layout:fragment="content">
    <h3>Search for an event by name</h2>
    <form th:object="${event}" th:action="@{/events/search}" method="get">
        <input type="text" name="search" id="search" th:value="${search}"/>
        <input type="submit" value="Search"/>
        <div th:if="${not #lists.isEmpty(search)}">
            <h2>Events search results</h2>
            <table class="table table-striped table-hover">
                <thead>
                    <tr>
                      <th><i class="fa fa-bolt"></i> Event</th>
                      <th><i class="fa fa-map-marker"></i> Venue</th>
                      <th><i class="fa fa-calendar"></i> Date</th>
                      <th><i class="fa fa-clock-o"></i> Time</th>
                    </tr>
                </thead>
                <tbody>
                    <tr th:each="event: ${searchResult}">
                      <td th:text="${event.name}"><a href="/event/${event.name}">My Event</a></td>
                      <td th:text="${event.venue.getName()}">Event venue</td>
                      <td th:text="${{event.date}}">Event date</td>
                      <td th:text="${{event.time}}">Event time</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </form>
    <h1>All events</h1>

    <table class="table table-striped table-hover">
      <thead>
        <tr>
          <th><i class="fa fa-bolt"></i> Event</th>
          <th><i class="fa fa-map-marker"></i> Venue</th>
          <th><i class="fa fa-calendar"></i> Date</th>
          <th><i class="fa fa-clock-o"></i> Time</th>
        </tr>
      </thead>
      <tbody>
        <tr th:each="e : ${events}">
          <td th:text="${e.name}">My Event</td>
          <td th:text="${e.venue.getName()}">Event venue</td>
          <td th:text="${{e.date}}">Event date</td>
          <td th:text="${{e.time}}">Event time</td>
        </tr>
      </tbody>
    </table>

  </div>

</body>
</html>

Я использую соглашение об именах для пользовательских методов CrudRepository, что означает, что реализация должна быть обеспечена интерфейсом уже.Когда я запускаю веб-приложение и отправляю некоторые данные в форме, отображается желаемое представление HTML, но в результате поиска никогда не отображается событие. Изображение 1 Изображение 2

Я пытался удалить событие @ModelAttribute Event и model.addAttribute("event", event);, как в это сообщение, которое касается той же проблемы это былоне использовался, но результат был тот же.

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

1 Ответ

0 голосов
/ 28 февраля 2019
eventService.findByName(name);

Будет искать точное совпадение имени

Создать новый метод поиска

Сервисный интерфейс

public interface EventService {
    public Iterable<Event> findByName(String name);
    public Iterable<Event> searchForName(String name);
}

Репозиторий

public interface EventRepository extends CrudRepository<Event, Long>{
    public Iterable<Event> findByName(String name);
    public Iterable<Event> findByNameContainingIgnoreCase(String name);
}

Класс обслуживания

@Service
public class EventServiceImpl implements EventService {

    @Override
    public Iterable<Event> findByName(String name) {
        return eventRepository.findByName(name);
    }

    @Override
    public Iterable<Event> searchForName(String name) {
        return eventRepository.findByNameContainingIgnoreCase(name);
    }

}

Обновление:

При поиске ничего не делатьВы хотите отобразить ничего или все?Я предпочитаю последнее.Если вы не хотите ничего показывать, проверьте параметр поиска перед вызовом службы.

@RequestMapping(value = "/search", method = RequestMethod.GET)
public String showEventsByName(@RequestParam (value = "search", required = false) String name, Model model) {
    if(name!=null && !name.isEmpty()){
       model.addAttribute("searchResult", eventService.searchForName(name));
    } // else{ } create an empty list or handle null in view
    // ...
}

, если вы хотите скрыть заголовок таблицы, если результатов нет, используйте

th:if="${searchResult !=null and !searchResult.isEmpty()}" <!-- For Both -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...