Простая HTML-ссылка Java Spring

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

Сейчас я работаю над новым html файлом для вставки данных через отдельную форму. На моей «главной» странице у меня есть панель навигации, где я хочу щелкнуть элемент и перенаправиться на определенную страницу. Я попытался перенаправить ссылку непосредственно на html-файл в папке с ресурсами, но, похоже, это не сработало.

<li class = "nav-item active">
    <a class = "nav-link" href = "/inputbook.html">Add Book <span class = "sr-only">(current)</span></a>
</li>

Я также пытался связать это:

  • "$ {pageContext.servletContext.contextPath} /inputbook.html" (обнаружил это в другом потоке)
  • "./inputbook.html"
  • "../inputbook.html"

Есть ли способ просто связать эту страницу или мне нужно сделать действие + метод в контроллере?

Спасибо!

ОБНОВИТЬ:

Произошло что-то интересное. Я добавил метод сопоставления сайта в свой контроллер. Когда я пытаюсь открыть этот сайт через панель навигации, он сообщает мне, что он не отображается. Теперь (для тестирования у меня есть форма из файла "inputbook.html" также на моей главной странице), когда я ввожу данные через форму основных страниц, она сохраняет их в базе данных и правильно отображает. После этого процесса, когда я снова нажимаю на панель навигации, открывается сайт "inputbook.html" без каких-либо проблем?

Контроллер:

@RequiredArgsConstructor
@Controller
@RequestMapping("/books")
public class BookController {
private final BookService bookService;
private final BookRepository bookRepository;

@GetMapping
public String showBooks(Model model) {
    List<Book> books = bookService.findAll();
    model.addAttribute("books",books);
    return "books"; //view name
}

@PostMapping(value = "/search")
public String serachByTitle(Model model, @RequestParam Optional<String> searchTerm) {//Parameter heißt wie Feld in html form
    List<Book> books = searchTerm.map(bookService::findByTitleLike)
            .orElseGet(bookService::findAll);
    model.addAttribute("searchTerm",searchTerm.get());
    model.addAttribute("books",books);
    return "books";
}

@GetMapping("inputbook.html")
public String inputbook() {
    return "inputbook"; // this returns the template name to be rendered from resources/templates. You don't need to provide the extension.
}
@PostMapping(value = "/insert")
public String insertBook(Model model,@RequestParam String title) {
    Book book = Book.builder()
            .title(title)
            .description("beschreibung")
            .author("auth" )
            .isbn(12353)
            .creator("creator") // fake it till spring security
            .creationTS(LocalDateTime.MIN)
            .publisher("pub")
            .available(true)
            .deliveryTimeDay(2)
            .build();
    bookRepository.save(book);
    return showBooks(model);
}

}

books.html («Главная» страница)

<!DOCTYPE html>
<html lang = "en" xmlns:th = "http://www.thymeleaf.org">
<head>
    <meta charset = "UTF-8">
    <title>Books</title>
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity = "sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin = "anonymous"/>
</head>
<body>
<nav class = "navbar navbar-expand-lg navbar-light bg-light">
    <div class = "collapse navbar-collapse" id = "navbarSupportedContent">
        <ul class = "navbar-nav mr-auto">
            <li class = "nav-item active">
                <a class = "nav-link" href = "inputbook.html">Add Book <span class = "sr-only">(current)</span></a>
            </li>
            <a class = "nav-link" href = "#">Home <span class = "sr-only">(current)</span></a>
            </li>
            <a class = "nav-link" href = "#">Home <span class = "sr-only">(current)</span></a>
            </li>
        </ul>
    </div>
</nav>
    <div class = "container">
        <form method = "post" th:action = "@{/books/search}">
             <div class = "form-group">
                <label th:for = "searchTerm">Searchterm</label>
                <input type = "text" class = "form-control" th:name = "searchTerm">
            </div>
            <button type = "submit" class = "btn btn-primary">Search</button>
        </form>

        **<form method = "post" th:action = "@{/books/insert}">
            <div class = "form-group">
                <label th:for = "title">Titel</label>
                <input type = "text" class = "form-control" th:name = "title">
            </div>
            <button type = "submit" class = "btn btn-primary">Save</button>
        </form>**
        <table  class = "table">
            <thead>
                <tr>
                    <th>Title</th>
                    <th>CreationTS</th>
                    <th>Author</th>
                    <th>Creator</th>
                </tr>
            </thead>
            <tbody>
                <tr th:each = "book : ${books}">
                    <td th:text = "${book.title}">Betreff</td>
                    <td th:text = "${book.creationTS}">2018-01-01 10:01:01</td>
                    <td th:text = "${book.author}">TestAuthor</td>
                    <td th:text = "${book.creator}">TestCreator</td>
                </tr>
            </tbody>
        </table>
    </div>
    <script src = "https://code.jquery.com/jquery-3.3.1.slim.min.js"
            integrity = "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
            crossorigin = "anonymous"></script>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
            integrity = "sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
            crossorigin = "anonymous"></script>
    <script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
            integrity = "sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
            crossorigin = "anonymous"></script>
</body>
</html>

inputbook.html

<!DOCTYPE html>
<html lang = "en" xmlns:th = "http://www.thymeleaf.org">
<head>
    <meta charset = "UTF-8">
    <title>Books</title>
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity = "sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin = "anonymous"/>
</head>
<body>
<div class = "container">
    <form method = "post" th:action = "@{/books/insert}">
        <div class = "form-group">
            <label th:for = "title">Titel</label>
            <input type = "text" class = "form-control" th:name = "title">
        </div>
        <button type = "submit" class = "btn btn-primary">Save</button>
    </form>
</div>
<script src = "https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity = "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
        crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
        integrity = "sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
        crossorigin = "anonymous"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
        integrity = "sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
        crossorigin = "anonymous"></script>

</body>
</html>
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
2 750
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самый простой и понятный способ - определить простой Spring Controller для обработки запроса. Таким образом, HTML-файл будет визуализирован. Какой шаблонизатор вы используете? Вы используете Spring Boot? Код есть где-нибудь?

Пример для такого контроллера:

@Controller
public class SimpleController {

  @GetMapping("inputbook.html")
  public String inputbook() {
    return "inputbook"; // this returns the template name to be rendered from resources/templates. You don't need to provide the extension.
  }
}

Привет, Майкл, спасибо за помощь! Я использую Thymeleaf. Какой код я должен опубликовать? Мой контроллер и файл HTML?

Constantin M 24.08.2018 16:58

Произошло кое-что интересное ... Я добавил ваш метод в свой контроллер для сопоставления "inputbook.html". Когда я пытаюсь открыть этот сайт через панель навигации, он сообщает мне, что он не отображается. Теперь (для тестирования у меня есть форма из файла "inputbook.html" также на моей главной странице), когда я ввожу данные через форму основных страниц, она сохраняет их в базе данных и правильно отображает. После этого процесса, когда я снова нажимаю на панель навигации, открывается сайт "inputbook.html" без каких-либо проблем? Я обновлю свой пост с помощью файлов html и своего контроллера

Constantin M 24.08.2018 17:05

Каким-то образом это сработало правильно, как только я закомментировал форму, которая была у меня на главной странице. Спасибо!

Constantin M 24.08.2018 17:22

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

Constantin M 24.08.2018 17:28

Убедитесь, что у вас есть метод в контроллере, который сопоставлен с этим URL-адресом /inputbook.html и возвращает страницу, которую вы хотите видеть, как показано ниже.

@GetMapping("inputbook.html")
  public String method() {
    return "inputbook.html"; //extension depends on view resolver.
}

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

Конфигурация XML (Spring-mvc):

<mvc:view-controller path = "/"view-name = "index"/>

Конфигурация аннотации (Spring-boot):

@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/").setViewName("index");
}

Произошло кое-что интересное ... Я добавил ваш метод в свой контроллер для сопоставления "inputbook.html". Когда я пытаюсь открыть этот сайт через панель навигации, он сообщает мне, что он не отображается. Теперь (для тестирования у меня есть форма из файла "inputbook.html" также на моей главной странице), когда я ввожу данные через форму основных страниц, она сохраняет их в базе данных и правильно отображает. После этого процесса, когда я снова нажимаю на панель навигации, открывается сайт "inputbook.html" без каких-либо проблем? Я обновлю свой пост с помощью файлов html и своего контроллера

Constantin M 24.08.2018 17:09

Каким-то образом это сработало правильно, как только я закомментировал форму, которая была у меня на главной странице. Спасибо!

Constantin M 24.08.2018 17:22

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