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.



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

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

}

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


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

}

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

}

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.


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

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ć)

1

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

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.