Я новичок в 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>
Я также пытался связать это:
Есть ли способ просто связать эту страницу или мне нужно сделать действие + метод в контроллере?
Спасибо!
ОБНОВИТЬ:
Произошло что-то интересное. Я добавил метод сопоставления сайта в свой контроллер. Когда я пытаюсь открыть этот сайт через панель навигации, он сообщает мне, что он не отображается. Теперь (для тестирования у меня есть форма из файла "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>




Самый простой и понятный способ - определить простой 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.
}
}
Произошло кое-что интересное ... Я добавил ваш метод в свой контроллер для сопоставления "inputbook.html". Когда я пытаюсь открыть этот сайт через панель навигации, он сообщает мне, что он не отображается. Теперь (для тестирования у меня есть форма из файла "inputbook.html" также на моей главной странице), когда я ввожу данные через форму основных страниц, она сохраняет их в базе данных и правильно отображает. После этого процесса, когда я снова нажимаю на панель навигации, открывается сайт "inputbook.html" без каких-либо проблем? Я обновлю свой пост с помощью файлов html и своего контроллера
Каким-то образом это сработало правильно, как только я закомментировал форму, которая была у меня на главной странице. Спасибо!
хм, странно, иногда работает, а иногда не работает отображение. Думаю, это зависит от того, на каком пути я сейчас иду. Когда я запускаю приложение и пытаюсь щелкнуть ссылку, оно не работает. Как только я нажимаю кнопку поиска, а затем щелкаю ссылку, она начинает работать правильно ...
Убедитесь, что у вас есть метод в контроллере, который сопоставлен с этим 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 и своего контроллера
Каким-то образом это сработало правильно, как только я закомментировал форму, которая была у меня на главной странице. Спасибо!
Привет, Майкл, спасибо за помощь! Я использую Thymeleaf. Какой код я должен опубликовать? Мой контроллер и файл HTML?