Spring boot Spring在未请求任何视图时将用户发送到视图
我在春天写了一本书的目录。 它从目录中收集书籍(pdf、epub、mobi、电子书),从中收集一些元数据,将它们存储在数据库中,然后将它们放在一个列表中,该列表可供我的视图使用:Spring boot Spring在未请求任何视图时将用户发送到视图,spring-boot,Spring Boot,我在春天写了一本书的目录。 它从目录中收集书籍(pdf、epub、mobi、电子书),从中收集一些元数据,将它们存储在数据库中,然后将它们放在一个列表中,该列表可供我的视图使用: @Slf4j @Controller public class BookCatalogController { // == Fields == private final BookService bookService; @Autowired public Bo
@Slf4j
@Controller
public class BookCatalogController {
// == Fields ==
private final BookService bookService;
@Autowired
public BookCatalogController(BookService bookService){this.bookService = bookService; }
// == Model attributes ==
@ModelAttribute
public List<Book> bookData(){ return bookService.getBooksFromMemory(); }
public static final File bookDirectory= new File("D:\\edu_repo\\ebooks_test\\");
.
.
.
// Catalog Simple View
@GetMapping(Mappings.CATALOG_SIMPLE)
public String catalogSimple(Model model){
log.info("catalogSimple method called");
// This is adding the entire BookManager book list into the model.
model.addAttribute(AttributeNames.BOOK_DATA, bookData());
return ViewNames.CATALOG_SIMPLE;
}
// Catalog Detail View
@GetMapping(Mappings.CATALOG_DETAIL)
public String catalogDetail(Model model){
log.info("catalogDetail method called");
// This is adding the entire BookManager book list into the model.
model.addAttribute(AttributeNames.BOOK_DATA, bookData());
return ViewNames.CATALOG_DETAIL;
}
.
.
.
@GetMapping(Mappings.LOAD_BOOKS)
public void loadBooks(Model model) {
bookService.loadBooksFromDirectory(bookDirectory);
}
}
如何像我这样调用一个方法,但没有Spring尝试将用户重定向到另一个视图?
我根本不希望页面更新,因为我没有返回视图 当您在浏览器中单击带有load books锚点的链接时,浏览器会将其发送到服务器并等待结果,从而导致页面重新加载。一旦对LoadBooks端点的请求到达服务器,SpringMVC就会处理这个问题,并开始用它的方法查找合适的控制器。在您的案例中,它会发现
公共无效负荷书(模型)
。当SpringMVC调用该方法时,它希望获得一个视图名来解析并返回到浏览器由于您没有提供视图或字符串作为返回类型,Spring MVC使用端点的路径作为视图名称(我没有看到您的Mappings.LOAD_BOOKS常量,但它应该是LOAD BOOKS)。 如果不打算将任何视图返回到浏览器,则可以对该方法进行如下注释:
@GetMapping(Mappings.LOAD\u书籍)
@应答器
公用作废负荷书(模型){
它告诉Spring将void
视为响应体。
但这并不妨碍页面刷新,单击链接后,您只会看到一个空页面。为了解决此问题,您可以通过返回以下字符串将用户重定向到另一个页面(方法上没有ResponseBy注释)
返回“重定向:/path to redirect”;
当SpringMVC看到这个前缀时,它会将您重定向到另一个控制器,但用户也会注意到这一点
如果您真的不想看到一个空白页面,那么在单击按钮时,您必须使用一些JavaScript来执行对服务器的AJAX请求
实际上,您似乎希望通过给定的路径在服务中预加载一些文件。如果您只想这样做,您可以使用Spring的Runner,如下所示:
@组件
类预加载程序实现ApplicationRunner{
私人最终图书目录服务图书服务;
@自动连线
公共预加载程序(BookCatalogService服务){
this.bookService=服务;
}
@凌驾
公共void运行(ApplicationArguments参数)引发异常{
bookService.loadBooksFromDirectory(BookCatalogController.bookDirectory);
}
}
当应用程序准备就绪时,Spring会自动调用所有注册的跑步者,因此您的代码将在没有用户访问load books端点的情况下执行。这是一个多么棒的回答!谢谢
There was an unexpected error (type=Internal Server Error, status=500).
Error resolving template [load-books], template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [load-books], template might not exist or might not be accessible by any of the configured Template Resolvers