Java Spring Boot: จะแมปรูทแอปของฉัน (“ /”) กับ index.html ได้อย่างไร?


134

ฉันเพิ่งเริ่มใช้ Java และ Spring ฉันจะแมปรูทแอปของฉันhttp://localhost:8080/กับแบบคงที่ได้index.htmlอย่างไร ถ้าฉันไปที่http://localhost:8080/index.htmlมันใช้งานได้ดี

โครงสร้างแอปของฉันคือ:

dirs

ของฉันconfig\WebConfig.javaมีลักษณะดังนี้:

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

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

ฉันพยายามเพิ่มregistry.addResourceHandler("/").addResourceLocations("/index.html");แต่มันล้มเหลว


1
บางทีนี่อาจช่วยได้: stackoverflow.com/questions/20405474/spring-boot-context-root
Udo Klimaschewski

3
@UdoKlimaschewski มันแสดงให้เห็นวิธีการทำแผนที่http://localhost:8080/appNameแต่มันไม่ใช่สิ่งที่ฉันต้องการ ...
Shoham

1
WebMvcConfigurerAdapter เลิกใช้แล้ว
user1346730

คำตอบ:


150

มันจะได้ผลถ้าคุณไม่ได้ใช้@EnableWebMvcคำอธิบายประกอบ เมื่อคุณทำสิ่งที่คุณปิดทุกสิ่งที่ฤดูใบไม้ผลิ Boot WebMvcAutoConfigurationไม่สำหรับคุณในการ คุณสามารถลบคำอธิบายประกอบนั้นออกหรือคุณสามารถเพิ่มตัวควบคุมมุมมองที่คุณปิดกลับไป:

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

1
ขอบคุณ .. ฉันไม่ทราบว่า ... ไม่พบการสาธิตง่ายๆในไซต์ของพวกเขาที่แสดงให้เห็นว่า ...
Shoham

12
จากเอกสารอ้างอิง : "หากคุณต้องการเก็บคุณลักษณะ Spring Boot MVC ไว้และคุณเพียงแค่ต้องการเพิ่มการกำหนดค่า MVC เพิ่มเติม (ตัวดักจับรูปแบบตัวควบคุมมุมมอง ฯลฯ ) คุณสามารถเพิ่ม @Bean ประเภทWebMvcConfigurerAdapter ของคุณเองได้แต่ไม่มี@EnableWebMvc"
Dave Syer

1
นี้จะให้บริการที่index.html /แต่เป็นไปได้หรือไม่ที่จะทำให้เบราว์เซอร์เปลี่ยน url จาก/เป็น/index.html?
asmaier

13
ตกลงฉันคิดออกแล้ว ในกรณีที่คุณต้องการเปลี่ยน url จาก/เป็น/index.htmlใช้"redirect:/index.html" แทน forward
asmaier

4
ฉันไม่ได้ใช้คำอธิบายประกอบ @EnableWebMvc และฉันไม่ได้รับการเปลี่ยนเส้นทางไปที่ index.html
Jelle

44

ตัวอย่างคำตอบของ 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
ใช้ WebMvcConfigurer แทน WebMvcConfigurerAdapter ที่เลิกใช้แล้วในฤดูใบไม้ผลิ 5
Moose บน Loose

22

หากเป็นแอป Spring boot

Spring Boot ตรวจพบ index.html โดยอัตโนมัติในโฟลเดอร์สาธารณะ / คงที่ / webapp หากคุณเขียนคอนโทรลเลอร์ใด ๆ@Requestmapping("/")มันจะแทนที่คุณสมบัติเริ่มต้นและจะไม่แสดงตัวควบคุมindex.htmlเว้นแต่คุณจะพิมพ์localhost:8080/index.html


4
ฉันสร้างไฟล์ src / main / resources / public / index.html และใช้งานได้! ขอบคุณ
James Watkins

ว่ายังจริงมั้ย?
FearX

10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}

8

อัปเดต: ม.ค. -2562

ขั้นแรกให้สร้างโฟลเดอร์สาธารณะภายใต้ทรัพยากรและสร้างไฟล์ index.html ใช้ WebMvcConfigurer แทน 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");
    }

}

จะเกิดอะไรขึ้นถ้าไม่ได้ผล? ทรัพยากร / public / index.html มีอยู่; java 13; สปริง 2.2.2; แมวตัวผู้
JFFIGK

7

หากคุณใช้เวอร์ชันล่าสุดspring-boot 2.1.6.RELEASEกับ@RestControllerคำอธิบายประกอบง่ายๆคุณไม่จำเป็นต้องทำอะไรเลยเพียงแค่เพิ่มindex.htmlไฟล์ของคุณในresources/staticโฟลเดอร์:

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

จากนั้นกด URL ที่http: // localhost: 8080 หวังว่าจะช่วยให้ทุกคน


ในกรณีของฉันมันใช้งานได้ แต่เมื่อฉันเปลี่ยนจาก tomcat เป็น Undertow ก็หยุดทำงานทันที ตอนนี้ฉันต้องการวิธีส่งต่อ / ไปยัง index.html
German Faller

5

ภายในSpring Bootผมมักจะใส่หน้าเว็บในโฟลเดอร์เช่นpublicหรือwebappsหรือviewsและวางไว้ภายในsrc/main/resourcesไดเรกทอรีที่คุณสามารถดูในapplication.propertiesยัง

Spring_Boot-โครงการ Explorer ในการดู

และนี่คือของฉัน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

ทันทีที่คุณใส่ url เช่นservername:15800และคำขอนี้ที่ได้รับจากผู้มอบหมายงาน Servlet ที่ครอบครอง Spring Boot มันจะค้นหาอย่างแน่นอนindex.htmlและชื่อนี้จะเป็นกรณีที่ละเอียดอ่อนspring.mvc.view.suffixซึ่งจะเป็น html, jsp, htm เป็นต้น

หวังว่ามันจะช่วยหลาย ๆ คน


@ArifMustafa ใน Sprint Boot เวอร์ชันล่าสุดฉันแนะนำให้ใส่หน้าเว็บไว้ในเทมเพลตด้วย
ArifMustafa

คุณมีข้อมูลอ้างอิงสำหรับสิ่งนั้นหรือไม่? ฉันกำลังพยายามสร้างโครงการส่วนหน้า react / redux ด้วยแบ็กเอนด์ Spring และฉันไม่แน่ใจเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดที่เกี่ยวข้อง
ไมค์

2
  1. ไฟล์ index.html ควรอยู่ด้านล่างตำแหน่ง - src / resources / public / index.html OR src / resources / static / index.html ถ้าทั้งสองตำแหน่งถูกกำหนดแล้วซึ่งเกิดขึ้นครั้งแรก index.html จะเรียกจากไดเร็กทอรีนั้น
  2. ซอร์สโค้ดมีลักษณะดังนี้ -

    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

ผมมีปัญหาเหมือนกัน. Spring boot รู้ตำแหน่งของไฟล์ html แบบคงที่

  1. เพิ่ม index.html ลงในโฟลเดอร์ resources / static
  2. จากนั้นลบวิธีการควบคุมแบบเต็มสำหรับเส้นทางรูทเช่น @RequestMapping ("/") เป็นต้น
  3. เรียกใช้แอปและตรวจสอบhttp: // localhost: 8080 (ควรใช้งานได้)

0

คุณสามารถเพิ่ม RedirectViewController เช่น:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.