1. 程式人生 > 其它 >Java-web servlet

Java-web servlet

傳統MVC專案

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- 不用jakarta,否則報javax.servlet.ServletException -->
    <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<!--    <dependency>-->
<!--      <groupId>jakarta.servlet</groupId>-->
<!--      <artifactId>jakarta.servlet-api</artifactId>-->
<!--      <version>5.0.0</version>-->
<!--      <scope>provided</scope>-->
<!--    </dependency>-->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.13</version>
    </dependency>

servlet

implements ServletContainerInitializer

整合spring Mvc

extends AbstractAnnotationConfigDispatcherServletInitializer
@WebFilter

public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{
            WebConfig.class
        };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{
                "/"
        };
    }

    @Override
    protected String getServletName() {
        return "dispatcher";
    }
}

@ComponentScan(value = "com.xx", excludeFilters = {
	@Filter(type = FilterType.ANNOTATION, classes = {Controller.class, ControllerAdvice.class, RestControllerAdvice.class}),
	// 記得排除,否則會重複掃描
	@Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {WebConfig.class})
	}
)
@Configuration
public class RootConfig {

}

@ComponentScan(value = "com.xx", useDefaultFilters = false,
        includeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class, ControllerAdvice.class, RestControllerAdvice.class})}
)
@Configuration
public class WebConfig {

}

web容器驅動Spring容器,而Spring Boot是Spring容器驅動web容器(預設情況下)

Spring容器啟動的方式

Spring Boot

替換原來的容器

public class WebServerFactoryCustomizer implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {

    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.addDeploymentInfoCustomizers(deploymentInfo -> {
            WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024));
            deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
        });
    }
}