Я довольно новичок в 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>