自己是Spring Boot
的初学者,开始看教程的时候发现基本上都是部署的 JSP
,但是按照教程一步步走下来始终无法成功,一直都是 404
:
查阅各种资料后,总结出一套 Spring Boot
支持 JSP
的流程:
添加依赖
在pom.xml
中添加两个依赖:tomcat-embed-jasper
(它提供了JSP
解析和执行的功能)和 javax.servlet-api
(它提供了对 JSP
所需的 Servlet API
的支持)。这是所需的 pom.xml
内容:
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>
要注意的是,将 pom.xml
文件的 packing
方式修改为 war
:
<packaging>war</packaging>
配置主类
配置 SpringBootServletInitializer
子类以启用 JSP
支持。
package com.example.springfirst;import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.wavefront.WavefrontProperties;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;@SpringBootApplication
public class SpringFirstApplication extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(WavefrontProperties.Application.class);}public static void main(String[] args) {SpringApplication.run(SpringFirstApplication.class, args);}}
常规内容
其它的配置,比如 mapping
应该和网上的一致,我就简单记录一下。
package com.example.springfirst.spittr.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages={"com.example.springfirst.spittr"})
public class RootConfig {
}
package com.example.springfirst.spittr.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import com.example.springfirst.spittr.web.WebConfig;public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected String[] getServletMappings() {return new String[] { "/" };}@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[] { RootConfig.class };}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[] { WebConfig.class };}}
package com.example.springfirst.spittr.web;import static org.springframework.web.bind.annotation.RequestMethod.*;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.PostConstruct;@Controller
public class HomeController {@PostConstructpublic void init() {System.out.println("HomeController bean created");}@RequestMapping(value="/home", method = GET)public String home() {return "home";}}
package com.example.springfirst.spittr.web;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@EnableWebMvc
@ComponentScan("com.example.springfirst.spittr.web")
public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/jsp/");resolver.setSuffix(".jsp");return resolver;}// @Override
// public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// configurer.enable();
// }
}
附录
工程结构如下: