Java Spring Boot: Jak zmapować katalog główny mojej aplikacji („/”) do pliku index.html?

143

Jestem nowy w Javie i Springie. Jak mogę zmapować katalog główny aplikacji http://localhost:8080/na statyczny index.html? Jeśli przejdę do http://localhost:8080/index.htmljego pracy, dobrze.

Struktura mojej aplikacji to:

reż

Mój config\WebConfig.javawygląd wygląda tak:

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

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

Próbowałem dodać, registry.addResourceHandler("/").addResourceLocations("/index.html");ale to się nie udaje.

Shoham
źródło
3
@UdoKlimaschewski To pokazuje, jak mapować, http://localhost:8080/appNameale to nie jest to, czego potrzebuję ...
Shoham,
1
WebMvcConfigurerAdapter jest przestarzały
user1346730

Odpowiedzi:

155

To by zadziałało po wyjęciu z pudełka, gdybyś nie użył @EnableWebMvcadnotacji. Kiedy to robisz, wyłączasz wszystkie rzeczy, które robi dla Ciebie Spring Boot WebMvcAutoConfiguration. Możesz usunąć tę adnotację lub z powrotem dodać kontroler widoku, który wyłączyłeś:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Dave Syer
źródło
1
Dzięki ... Nie zdawałem sobie sprawy, że ... nie mogłem znaleźć jednego prostego demo na ich stronie, które pokazuje, że ...
Shoham,
12
Z dokumentów referencyjnych : „Jeśli chcesz zachować funkcje Spring Boot MVC i chcesz tylko dodać dodatkową konfigurację MVC (przechwytywacze, elementy formatujące, kontrolery widoku itp.), Możesz dodać własne @Bean typu WebMvcConfigurerAdapter, ale bez @EnableWebMvc
Dave Syer,
1
To będzie służyć index.htmlw /. Ale czy jest możliwe, aby przeglądarka faktycznie zmieniła adres URL z /na /index.html?
asmaier
14
Ok, wymyśliłem to. Jeśli chcesz również zmienić adres URL z /do /index.htmlużywania "redirect:/index.html" zamiast do przodu.
asmaier
4
Nie używam adnotacji @EnableWebMvc i nie jestem przekierowywany do index.html.
Jelle den Burger
44

Przykład odpowiedzi Dave'a Syera:

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");
            }
        };
    }

}
Justin
źródło
8
Użyj WebMvcConfigurer zamiast przestarzałego WebMvcConfigurerAdapter wiosną 5.
Moose on the Loose
23

jeśli jest to aplikacja Spring Boot.

Spring Boot automatycznie wykrywa plik index.html w folderze public / static / webapp. Jeśli napisałeś jakiś kontroler @Requestmapping("/"), zastąpi on domyślną funkcję i nie pokaże, index.htmlchyba że wpiszeszlocalhost:8080/index.html

Krish
źródło
4
Utworzyłem plik src / main / resources / public / index.html i zadziałało! Dzięki
James Watkins,
Czy to nadal prawda?
FearX
11

Aktualizacja: styczeń-2019

Najpierw utwórz folder publiczny w zasobach i utwórz plik index.html. Użyj WebMvcConfigurer zamiast WebMvcConfigurerAdapter.

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");
    }

}
Sampath T
źródło
co może być nie tak, jeśli to nie zadziała? zasoby / public / index.html istnieje; java 13; wiosna 2.2.2; tomcat
JFFIGK
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}
Rodrigo Ribeiro
źródło
8

Jeśli korzystasz z najnowszej spring-boot 2.1.6.RELEASEz prostą @RestControlleradnotacją, nie musisz nic robić, po prostu dodaj index.htmlplik do resources/staticfolderu:

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

Następnie kliknij adres URL http: // localhost: 8080 . Mam nadzieję, że pomoże wszystkim.

zappee
źródło
w moim przypadku działało, ale kiedy zmieniłem z kocura na Undertow, nagle przestałem działać. teraz potrzebuję sposobu, aby przekazać / do mojego index.html
niemiecki Faller
5

Wewnątrz Spring Bootzawsze umieszczam strony internetowe w folderze takim jak publiclub webappslub viewsi umieszczam je w src/main/resourceskatalogu, jak widać application.propertiesrównież.

Spring_Boot-Project-Explorer-View

a to jest moje 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

jak tylko umieścisz adres URL like servername:15800i to żądanie otrzymane przez Spring Boot zajęte przez dyspozytor serwletów, dokładnie przeszuka index.htmli ta nazwa będzie rozróżniana wielkość liter, jako spring.mvc.view.suffixhtml, jsp, htm itp.

Mam nadzieję, że pomogłoby to wielu osobom.

ArifMustafa
źródło
@ArifMustafa W ostatnich wersjach Sprint Boot zalecam umieszczanie stron internetowych również w szablonach.
ArifMustafa
Czy masz do tego referencje? Próbuję stworzyć frontendowy projekt reakcji / redukcjix z zapleczem Spring i nie jestem pewien, jakie najlepsze praktyki są z tym związane.
Mike
2
  1. Plik index.html powinien znajdować się poniżej lokalizacji - src / resources / public / index.html LUB src / resources / static / index.html, jeśli obie lokalizacje są zdefiniowane, to które wystąpi najpierw index.html będzie wywoływał z tego katalogu.
  2. Kod źródłowy wygląda następująco -

    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);
       }
    }
    
Pravind Kumar
źródło
2

Miałem ten sam problem. Spring boot wie, gdzie znajdują się statyczne pliki html.

  1. Dodaj index.html do folderu resources / static
  2. Następnie usuń pełną metodę kontrolera dla ścieżki głównej, na przykład @RequestMapping („/”) itp
  3. Uruchom aplikację i sprawdź http: // localhost: 8080 (powinno działać)
Yuriy Kiselev
źródło
1

Możesz dodać RedirectViewController, na przykład:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
Neeraj Gahlawat
źródło