在 Spring Boot 项目中,正常来讲是不存在 XML 配置,这是由于 Spring Boot 不推荐使用 XML ,注意,并不是不支持,Spring Boot 推荐开发者使用 Java 配置来搭建框架,Spring Boot 中,大量的自动化配置都是经过 Java 配置来实现的,这一套实现方案,咱们也能够本身作,即本身也可使用纯 Java 来搭建一个 SSM 环境,即在项目中,不存在任何 XML 配置,包括 web.xml 。java
环境要求:web
•使用纯 Java 来搭建 SSM 环境,要求 Tomcat 的版本必须在 7 以上。spring
建立一个普通的 Maven 工程(注意,这里能够没必要建立 Web 工程),并添加 SpringMVC 的依赖,同时,这里环境的搭建须要用到 Servlet ,因此咱们还须要引入 Servlet 的依赖(必定不能使用低版本的 Servlet),最终的 pom.xml 文件以下:json
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.6.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
工程建立成功以后,首先添加 Spring 的配置文件,以下:api
@Configuration@ComponentScan(basePackages = "org.javaboy", useDefaultFilters = true, excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)})public class SpringConfig {}
关于这个配置,我说以下几点:mvc
•@Configuration 注解表示这是一个配置类,在咱们这里,这个配置的做用相似于 applicationContext.xml•@ComponentScan 注解表示配置包扫描,里边的属性和 xml 配置中的属性都是一一对应的,useDefaultFilters 表示使用默认的过滤器,而后又除去 Controller 注解,即在 Spring 容器中扫描除了 Controller 以外的其余全部 Bean 。app
接下来再来建立 springmvc 的配置文件:框架
@Configuration@ComponentScan(basePackages = "org.javaboy",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})public class SpringMVCConfig {}
注意,若是不须要在 SpringMVC 中添加其余的额外配置,这样就能够了。即 视图解析器、JSON 解析、文件上传......等等,若是都不须要配置的话,这样就能够了。webapp
此时,咱们并无 web.xml 文件,这时,咱们可使用 Java 代码去代替 web.xml 文件,这里会用到 WebApplicationInitializer ,具体定义以下:jsp
public class WebInit implements WebApplicationInitializer {public void onStartup(ServletContext servletContext) throws ServletException {//首先来加载 SpringMVC 的配置文件AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMVCConfig.class);// 添加 DispatcherServletServletRegistration.Dynamic springmvc = servletContext.addServlet("springmvc", new DispatcherServlet(ctx));// 给 DispatcherServlet 添加路径映射springmvc.addMapping("/");// 给 DispatcherServlet 添加启动时机springmvc.setLoadOnStartup(1);}}
WebInit 的做用相似于 web.xml,这个类须要实现 WebApplicationInitializer 接口,并实现接口中的方法,当项目启动时,onStartup 方法会被自动执行,咱们能够在这个方法中作一些项目初始化操做,例如加载 SpringMVC 容器,添加过滤器,添加 Listener、添加 Servlet 等。
注意:
因为咱们在 WebInit 中只是添加了 SpringMVC 的配置,这样项目在启动时只会去加载 SpringMVC 容器,而不会去加载 Spring 容器。
若是必定要加载 Spring 容器,须要咱们修改 SpringMVC 的配置。
在 SpringMVC 配置的包扫描中也去扫描 @Configuration 注解,进而加载 Spring 容器。
还有一种方案能够解决这个问题,就是直接在项目中舍弃 Spring 配置,直接将全部配置放到 SpringMVC 的配置中来完成,这个在 SSM 整合时是没有问题的。
在实际开发中,较多采用第二种方案,第二种方案,SpringMVC 的配置以下:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig {}
这种方案中,全部的注解都在 SpringMVC 中扫描,采用这种方案的话,则 Spring 的配置文件就能够删除了。
最后,添加一个 HelloController ,而后启动项目进行测试:
@RestControllerpublic class HelloController {@GetMapping("/hello")public String hello() {return "hello";}}
启动项目,访问接口,结果以下:
静态资源过滤在 SpringMVC 的 XML 中的配置以下:
<mvc:resources mapping="/**" location="/"/>
在 Java 配置的 SSM 环境中,若是要配置静态资源过滤,须要让 SpringMVC 的配置继承 WebMvcConfigurationSupport ,进而重写 WebMvcConfigurationSupport 中的方法,以下:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/js/**").addResourceLocations("classpath:/");}}
重写 addResourceHandlers 方法,在这个方法中配置静态资源过滤,这里我将静态资源放在 resources 目录下,因此资源位置是 classpath:/
,固然,资源也能够放在 webapp 目录下,此时只须要修改配置中的资源位置便可。若是采用 Java 来配置 SSM 环境,通常来讲,能够没必要使用 webapp 目录,除非要使用 JSP 作页面模板,不然能够忽略 webapp 目录。
在 XML 文件中,经过以下方式配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>
若是经过 Java 类,同样也能够实现相似功能。
首先为咱们的项目添加 webapp 目录,webapp 目录中添加一个 jsp 目录,jsp 目录中添加 jsp 文件:
而后引入 JSP 的依赖:
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version></dependency>
而后,在配置类中,继续重写方法:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void configureViewResolvers(ViewResolverRegistry registry) {registry.jsp("/jsp/", ".jsp");}}
接下来,在 Controller 中添加控制器便可访问 JSP 页面:
@Controllerpublic class HelloController2 {@GetMapping("/hello2")public String hello() {return "hello";}}
有的时候,咱们的控制器的做用仅仅只是一个跳转,就像上面小节中的控制器,里边没有任何业务逻辑,像这种状况,能够不用定义方法,能够直接经过路径映射来实现页面访问。若是在 XML
中配置路径映射,以下:
<mvc:view-controller path="/hello" view-name="hello" status-code="200"/>
这行配置,表示若是用户访问 /hello
这个路径,则直接将名为 hello
的视图返回给用户,而且响应码为 200
,这个配置就能够替代 Controller
中的方法。
相同的需求,若是在 Java
代码中,写法以下:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/hello3").setViewName("hello");}}
此时,用户访问 /hello3
接口,就能看到名为 hello
的视图文件。
SpringMVC 能够接收JSON 参数,也能够返回 JSON 参数,这一切依赖于 HttpMessageConverter。
HttpMessageConverter 能够将一个 JSON 字符串转为 对象,也能够将一个对象转为 JSON 字符串,实际上它的底层仍是依赖于具体的 JSON 库。
全部的 JSON 库要在 SpringMVC 中自动返回或者接收 JSON,都必须提供和本身相关的 HttpMessageConverter 。
SpringMVC 中,默认提供了 Jackson 和 gson 的 HttpMessageConverter ,分别是:MappingJackson2HttpMessageConverter 和 GsonHttpMessageConverter 。
正由于如此,咱们在 SpringMVC 中,若是要使用 JSON ,对于 jackson 和 gson 咱们只须要添加依赖,加完依赖就能够直接使用了。具体的配置是在 AllEncompassingFormHttpMessageConverter 类中完成的。
若是开发者使用了 fastjson,那么默认状况下,SpringMVC 并无提供 fastjson 的 HttpMessageConverter ,这个须要咱们本身提供,若是是在 XML 配置中,fastjson 除了加依赖,还要显式配置 HttpMessageConverter,以下:
<mvc:annotation-driven><mvc:message-converters><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean></mvc:message-converters></mvc:annotation-driven>
在 Java 配置的 SSM 中,咱们同样也能够添加这样的配置:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();converter.setDefaultCharset(Charset.forName("UTF-8"));FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setCharset(Charset.forName("UTF-8"));converter.setFastJsonConfig(fastJsonConfig);converters.add(converter);}}
而后,就能够在接口中直接返回 JSON 了,此时的 JSON 数据将经过 fastjson 生成。
好了,本文经过一个简单的例子向读者展现了使用 Java 来配置 Spring+SpringMVC 环境,事实上,只要这两个配置 OK ,再加入 MyBatis 就是很是容易的事了。
关于本文,有问题欢迎留言讨论。