Khởi động Java Spring: Làm cách nào để ánh xạ root ứng dụng của tôi (tầm / hung) vào index.html?


133

Tôi mới sử dụng Java và Spring. Làm cách nào tôi có thể ánh xạ gốc ứng dụng của mình http://localhost:8080/thành tĩnh index.html? Nếu tôi điều hướng đến http://localhost:8080/index.htmlnó hoạt động tốt.

Cấu trúc ứng dụng của tôi là:

thư mục

Tôi config\WebConfig.javatrông như thế này:

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
        }
}

Tôi đã cố gắng để thêm registry.addResourceHandler("/").addResourceLocations("/index.html");nhưng không thành công.



3
@UdoKlimaschewski Nó chỉ ra cách lập bản đồ http://localhost:8080/appNamenhưng đó không phải là thứ tôi cần ...
Shoham

1
WebMvcConfigkerAd CHƯƠNG không được dùng nữa
user1346730

Câu trả lời:


150

Nó sẽ hoạt động tốt nếu bạn không sử dụng @EnableWebMvcchú thích. Khi bạn làm điều đó, bạn tắt tất cả những thứ mà Spring Boot làm cho bạn WebMvcAutoConfiguration. Bạn có thể xóa chú thích đó hoặc bạn có thể thêm lại bộ điều khiển xem mà bạn đã tắt:

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

1
Cảm ơn .. Tôi đã không nhận ra rằng ... không thể tìm thấy một bản demo đơn giản trong trang web của họ cho thấy rằng ...
Shoham

12
Từ các tài liệu tham khảo : "Nếu bạn muốn giữ các tính năng Spring Boot MVC và bạn chỉ muốn thêm cấu hình MVC bổ sung (chặn, định dạng, xem bộ điều khiển, v.v.), bạn có thể thêm @Bean của loại WebMvcConfigurerAdapter, nhưng không có @EnableWebMvc"
Dave Syer

1
Điều này sẽ phục vụ index.htmltại /. Nhưng nó cũng có thể làm cho trình duyệt thực sự thay đổi url từ /sang /index.html?
asmaier

12
Ok tôi đã tìm ra nó. Trong trường hợp bạn cũng muốn thay đổi url từ /để /index.htmlsử dụng "redirect:/index.html" thay vì chuyển tiếp.
asmaier

4
Tôi không sử dụng chú thích @EnableWebMvc và tôi không được chuyển hướng đến index.html.
Jelle

44

Một ví dụ về câu trả lời của Dave Syer:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MyWebMvcConfig {

    @Bean
    public WebMvcConfigurerAdapter forwardToIndex() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                // forward requests to /admin and /user to their index.html
                registry.addViewController("/admin").setViewName(
                        "forward:/admin/index.html");
                registry.addViewController("/user").setViewName(
                        "forward:/user/index.html");
            }
        };
    }

}

8
Sử dụng WebMvcConfigker thay vì WebMvcConfigkerAd CHƯƠNG không được chấp nhận trong Mùa xuân 5.
Moose on the Loose

22

nếu đó là một ứng dụng khởi động mùa xuân.

Spring Boot tự động phát hiện index.html trong thư mục công cộng / tĩnh / webapp. Nếu bạn đã viết bất kỳ trình điều khiển nào, @Requestmapping("/")nó sẽ ghi đè tính năng mặc định và nó sẽ không hiển thị index.htmltrừ khi bạn nhậplocalhost:8080/index.html


4
Tôi đã tạo một tệp src / main / resource / public / index.html và nó đã hoạt động! Cảm ơn
James Watkins

Điều đó có còn đúng không?
FearX

10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "index.html");
    }

}

8

Cập nhật: Tháng 1-2019

Đầu tiên tạo thư mục chung dưới tài nguyên và tạo tệp index.html. Sử dụng WebMvcConfigker thay vì WebMvcConfigurerAdOG.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebAppConfig implements WebMvcConfigurer {

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

}

Điều gì có thể sai nếu điều này không làm việc? tài nguyên / công cộng / index.html tồn tại; java 13; mùa xuân 2.2.2; tomcat
JFFIGK

7

Nếu bạn sử dụng mới nhất spring-boot 2.1.6.RELEASEvới một @RestControllerchú thích đơn giản thì bạn không cần phải làm gì cả, chỉ cần thêm index.htmltệp của bạn vào resources/staticthư mục:

project
  ├── src
      ├── main
          └── resources
              └── static
                  └── index.html

Sau đó nhấn URL http: // localhost: 8080 . Hy vọng rằng nó sẽ giúp tất cả mọi người.


trong trường hợp của tôi, nó đã hoạt động nhưng khi tôi đổi từ tomcat sang Undertow thì đột nhiên ngừng hoạt động. bây giờ tôi cần một cách để chuyển tiếp / đến chỉ mục của mình.html
Faller Đức

5

Bên trong Spring Boot, tôi luôn đặt các trang web bên trong một thư mục như publichoặc webappshoặc viewsđặt nó trong src/main/resourcesthư mục mà bạn có thể thấy application.properties.

Spring_Boot-Project-Explorer-View

và đây là application.properties:

server.port=15800
spring.mvc.view.prefix=/public/
spring.mvc.view.suffix=.html
spring.datasource.url=jdbc:mysql://localhost:3306/hibernatedb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.format_sql = true

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

ngay sau khi bạn đặt url như thế servername:15800và yêu cầu này được nhận bởi bộ điều phối Servlet của Spring Boot, nó sẽ tìm kiếm chính xác index.htmlvà tên này trong trường hợp nhạy cảm như spring.mvc.view.suffixlà html, jsp, htm, v.v.

Hy vọng nó sẽ giúp được nhiều người.


@ArifMustafa Trong các phiên bản Sprint Boot gần đây, tôi khuyên bạn cũng nên đặt các trang web bên trong các mẫu.
ArifMustafa

Bạn có tài liệu tham khảo cho điều đó? Tôi đang cố gắng tạo một dự án phản ứng / chuyển hướng với một phụ trợ mùa xuân và tôi không chắc chắn về các thực tiễn tốt nhất có liên quan.
mike

2
  1. tệp index.html phải nằm dưới vị trí bên dưới - src / resource / public / index.html HOẶC src / resource / static / index.html nếu cả hai vị trí được xác định thì xảy ra lần đầu tiên index.html sẽ gọi từ thư mục đó.
  2. Mã nguồn trông giống như -

    package com.bluestone.pms.app.boot; 
    import org.springframework.boot.Banner;
    import org.springframework.boot.Banner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.ComponentScan;
    
    
    
    @SpringBootApplication 
    @EnableAutoConfiguration
    @ComponentScan(basePackages = {"com.your.pkg"}) 
    public class BootApplication extends SpringBootServletInitializer {
    
    
    
    /**
     * @param args Arguments
    */
    public static void main(String[] args) {
    SpringApplication application = new SpringApplication(BootApplication.class);
    /* Setting Boot banner off default value is true */
    application.setBannerMode(Banner.Mode.OFF);
    application.run(args);
    }
    
    /**
      * @param builder a builder for the application context
      * @return the application builder
      * @see SpringApplicationBuilder
     */
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder 
      builder) {
        return super.configure(builder);
       }
    }

1

Tôi đã từng gặp vấn đề tương tự. Spring boot biết vị trí các tệp html tĩnh.

  1. Thêm index.html vào thư mục tài nguyên / tĩnh
  2. Sau đó xóa phương thức điều khiển đầy đủ cho đường dẫn gốc như @RequestMapping ("/"), v.v.
  3. Chạy ứng dụng và kiểm tra http: // localhost: 8080 (Nên hoạt động)

0

Bạn có thể thêm RedirectViewControll như:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.