Spring boot Spring在未请求任何视图时将用户发送到视图

Spring boot Spring在未请求任何视图时将用户发送到视图,spring-boot,Spring Boot,我在春天写了一本书的目录。 它从目录中收集书籍(pdf、epub、mobi、电子书),从中收集一些元数据,将它们存储在数据库中,然后将它们放在一个列表中,该列表可供我的视图使用: @Slf4j @Controller public class BookCatalogController { // == Fields == private final BookService bookService; @Autowired public Bo

我在春天写了一本书的目录。 它从目录中收集书籍(pdf、epub、mobi、电子书),从中收集一些元数据,将它们存储在数据库中,然后将它们放在一个列表中,该列表可供我的视图使用:

    @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