1. 引言
Spring MVC是Spring框架重要组成部分,是一款非常优秀的Web框架。Spring MVC以DispatcherServlet为核心,通过可配置化的方式去处理各种web请求。
在平时项目开发中,通常在web.xml下配置元素,但是我希望尝试通过实现WebApplicationInitilalizer接口来实现无web.xml的方式去搭建一个Spring MVC项目。
2. Spring MVC 项目的搭建
2.1 构建Maven项目
pom.xml
4.0.0 org.aming springmvc1 0.0.1-SNAPSHOT war 1.8 UTF-8 UTF-8 2.2 1.2 3.1.0 4.1.5.RELEASE 1.0.13 1.7.5 javax javaee-web-api 7.0 provided org.springframework spring-webmvc ${spring.version} javax.servlet jstl ${jstl.version} javax.servlet javax.servlet-api ${servlet.version} provided javax.servlet.jsp jsp-api ${jsp.version} org.springframework spring-tx ${spring.version} org.springframework spring-core ${spring.version} org.springframework spring-beans ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-context-support ${spring.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j log4j-over-slf4j ${slf4j.version} org.slf4j jcl-over-slf4j ${slf4j.version} org.slf4j jul-to-slf4j ${slf4j.version} com.googlecode.log4jdbc log4jdbc 1.2 runtime ch.qos.logback logback-classic ${logback.version} ch.qos.logback logback-core ${logback.version} ch.qos.logback logback-access ${logback.version} springmvc org.apache.maven.plugins maven-compiler-plugin 2.5.1 org.apache.maven.plugins maven-war-plugin 2.3 false
2.1 日志配置
我们使用logback去管理我们的日志,相比去log4j,logback性能更为出色。我们在src/main/reources目录下,新建logback.xml,其内容如下:
true %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%method - [%X{logback}] - %msg%n
说明:在开发Spring MVC的过程中经常出现和参数类型相关的4XX错误,将org.springframework.web包下的类的日志级别设置为debug可以看到更详细的错误信息。
2.3 演示页面
在src/main/resources下建立views目录,并在此目录下新建index.jsp,body元素中添加以下内容:
Welcome to Spring MVC world
说明:
- 在Maven标准中,页面通常放在src/main/webapp/WEB-INF下,此处这样放置页面的主要目的是和Spring Boot的页面放置方式保持一致;
在ecplise中新建jsp页面默认是在webapp中,即使是在src/main/resources下目录点击新建,因此在新建jsp时需要重新选择合适的目录。
2.4 Spring MVC 配置
新建ApplicationConfiguration类作为Spring MVC的配置类,其内容如下:
@Configuration@EnableWebMvc@ComponentScan("org.aming.demo.springmvc")public class ApplicationConfiguration { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); //运行时代码会将位于src/main/resources目录下的页面自动编译到/WEB-INF/classes/views/下 //如果是src/main/webapp/WEB-INF的页面,那么prefix是/WEB-INF/views/ viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class); return viewResolver; }}
说明:
- @Configuration注解表明ApplicationConfiguration是一个普普通通配置类;
- @EnableWebMvc注解会开启一些默认配置,如一些ViewResolver或者MessageConverter等;
@ComponentScan注解将会扫描指定包下通过注解配置的bean。
2.5 Web配置
新建WebInitializer类并实现WebApplicationInitializer接口:
public class WebInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(ApplicationConfiguration.class); ctx.setServletContext(servletContext); Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx)); servlet.addMapping("/"); servlet.setLoadOnStartup(1); }}
说明:
- WebApplicationInitializer是Spring提供用来配置Servlet3.0+配置的接口,从而实现了替代web.xml的位置。实现此接口将会自动被SpringServletContainerInitializer(用来启动Servlet3.0容器)获取到。
- 新建WebApplicationContext,注册配置类(ApplicationConfiguration),并和其和当前servletContext关联
- 注册Spring MVC的DispatcherServlet。
2.6 简单控制器
新建HelloController类去完成URL和方法之间的映射:
@Controllerpublic class HelloController { @RequestMapping("/index") public String hello() { return "index"; }}
3. 运行结果
将项目打成war包部署到tomcat中,启动tomcat,在浏览器中输入:http://127.0.0.1:8080/springmvc/index
4. 参考书籍
汪云飞:。