简介
本章将介绍通过 Maven 搭建一个 SpringMVC 项目,主要是有很多依赖需要记录一下;这里将详细介绍如何搭建一个 4.3.18 RELEASE 版本的项目
实现步骤
1. 新建一个 maven 项目,创建完毕后,在 src/main/resources 目录下创建 views 文件夹,并创建 index.jsp 文件作为 view 层视图展示
2. 打开 pom.xml 配置文件,添加各种依赖(其实和 maven 引入 spring 依赖一样)
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.review.springmvc</groupId><artifactId>review_springMVC</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><properties><!-- java 版本 --><java.version>1.8</java.version><!-- spring 版本 --><spring.version>4.3.18.RELEASE</spring.version><!-- jstl 版本 --><jstl.version>1.2</jstl.version><!-- standard 版本 --><standard.version>1.2.5</standard.version></properties><dependencies><!-- begin SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-instrument-tomcat</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc-portlet</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>${spring.version}</version></dependency><!-- end SpringMVC --><!-- begin jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>${standard.version}</version></dependency><!-- end jstl --></dependencies><build><finalName>review_springMVC</finalName></build>
</project>
为什么要选择 4.3.18, 这是因为 spring-instrument-tomcat 和 spring-webmvc-portlet 的最高版本是 4.3.18,为了尽可能的保持项目各个 jar 包的版本一致,所以选择该版本
3. 新建 SpringConfig.class,作为项目的配置类(相当于 spring-servlet.xml),并添加如下代码
@Configuration
// @EnableWebMvc // 相当于 <mvc:annotation-driven/> 注解,去掉,否则静态资源文件无法访问
@ComponentScan("com.review.springmvc")
public class SpringConfig extends WebMvcConfigurerAdapter {// (推荐)第一种:配置视图层@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/classes/views/");viewResolver.setSuffix(".jsp");viewResolver.setViewClass(JstlView.class);return viewResolver;}//第二种: 配置视图层@Beanpublic UrlBasedViewResolver setupViewResolver() {UrlBasedViewResolver resolver = new UrlBasedViewResolver();resolver.setPrefix("/WEB-INF/classes/views/");resolver.setSuffix(".jsp");resolver.setViewClass(JstlView.class);return resolver;}// 配置静态文件@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");}// 不处理任何业务的页面跳转@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/sse").setViewName("/sse");}
}
4. 新建 WebInitializer.class,作为项目的配置类(相当于 web.xml),并添加如下代码
// 相当于配置 web.xml
public class WebInitializer implements WebApplicationInitializer {public void onStartup(ServletContext servletContext) throws ServletException {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringConfig.class);ctx.setServletContext(servletContext);Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));servlet.addMapping("/");servlet.setLoadOnStartup(1);}
}
5. 新建 HelloController.class 作为控制层,并添加如下代码
@Controller
public class HelloController {@GetMapping("/hello")public String hello() {return "index";}
}
访问项目,如果能看到 index.jsp 的内容就表示成功了
注意:使用 Maven 搭建 SpringMVC 比较坑,这儿有些需要注意的点
1. maven 项目的 web.xml 的默认的 schema
很可能导致一些莫名其妙的问题,比如:jsp 页面使用 EL 表达式无法获取到值,推荐改为如下版本
<?xml version="1.0" encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>Archetype Created Web Application</display-name>
</web-app>
2. SpringMVC 里面的 ModelAndView
注意在引入的时候不要引错了,因为
正确的是 org.springframework.web.servlet.ModelAndView 而不是 org.springframework.web.portlet.ModelAndView,千万要注意,否则会导致页面可以跳转,但是无法获取到 modelAndView.addObject() 方法放入的值