一 在父项目中加入包依赖
<project xmlns="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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ssm</groupId> <artifactId>rbac</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>rbac-web</module> <module>rbac-common</module> <module>rbac-manager</module> <module>rbac-portal</module> </modules> <properties> <spring-version>5.2.0.RELEASE</spring-version> <servlet-version>3.1.0</servlet-version> <jsp-api-version>2.3.3</jsp-api-version> <jstl-veriosn>1.2</jstl-veriosn> <tomcat-version>9.0.27</tomcat-version> <junit-version>4.12</junit-version> <lombok-version>1.18.0</lombok-version> <cglib-version>3.2.10</cglib-version> <aspectjrt-version>1.9.4</aspectjrt-version> <common-lang3-version>3.8.1</common-lang3-version> <jockson-version>2.9.8</jockson-version> <self4j-version>1.7.25</self4j-version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</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-test</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</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-jdbc</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit-version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok-version}</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>${cglib-version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectjrt-version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectjrt-version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet-version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>${jsp-api-version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl-veriosn}</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>${tomcat-version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <version>${tomcat-version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${common-lang3-version}</version> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jockson-version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jockson-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${self4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${self4j-version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.14</version> </dependency> </dependencies> </project>
二 配置spring与SpringMVC的配置文件
本例采用servlet 3.0配置文件,不采用web.xml文件,采用java 配置文件进行配置
(一) 配置文件位置
spring与springMVC的配置文件都放置在rbac-web模块中
(二)spring配置文件
spring的配置文件扫描的类,把被Controller、RestController、EnableWebMvc注解标注的类排除掉
package com.ssm.rbac.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @Configuration @ComponentScan(basePackages = { "com.ssm.rbac.*" }, excludeFilters = {@Filter(type = FilterType.ANNOTATION, value =Controller.class), @Filter(type = FilterType.ANNOTATION, value =RestController.class), @Filter(type = FilterType.ANNOTATION, value =EnableWebMvc.class)})//启动注解扫描,过滤掉Controller、RestController、EnableWebMvc注解标注的类 public class SpringConfig { }
(三)springMVC的配置文件
SpringMVC配置类,只会扫描被Controller与RestController注解标注的类
package com.ssm.rbac.config; import java.io.IOException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.http.MediaType; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.stereotype.Controller; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; @Configuration // 声明为配置类 @EnableWebMvc // 启动SpringMVC组件。如果在xml配置,也可以采用<mvc:annotation-driven>标签启动 @ComponentScan(basePackages = "com.ssm.rbac.*", useDefaultFilters = false, includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Controller.class), @Filter(type = FilterType.ANNOTATION, value = RestController.class) }) // 启动扫描组件,只扫描Controller与RestController注解标注的bean public class SpringMvcConfig extends WebMvcConfigurationSupport { // 配置视图解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); resolver.setExposeContextBeansAsAttributes(true); return resolver; // return new BeanNameViewResolver(); } /** * 配置Multipart数据格式的解析器, 普通的表单提交,提交的时简单的文本数据,如果要提交文件,那么就需要提交的数据时二进制的 * 普通的文本格式数据不支持,而Multipart格式支持,但是DispatcherServlet没有是实现任何解析multipart请求 数据的功能。 * * @return * @throws IOException */ @Bean public MultipartResolver getMultipartResolver() throws IOException { return new StandardServletMultipartResolver(); } // 配置静态资源处理 @Override protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable();// 通过调用enable()方法,我们要求DispatcherServlet对静态资源的请求转发到 // Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理静态资源请求。 } /** * 获得ContentNegotiationManager */ @Override protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.defaultContentType(MediaType.APPLICATION_JSON); } /** * 注册内容协商视图解析器 p430 1 确定请求的媒体类型 2 找到适合请求媒体类型的最佳视图 * * @param cnm * @return */ @Bean public ViewResolver cnViewResolver(ContentNegotiationManager cnm) { ContentNegotiatingViewResolver cnvr = new ContentNegotiatingViewResolver(); cnvr.setContentNegotiationManager(cnm); return cnvr; } @Bean public View spittles() { return new MappingJackson2JsonView(); } }
(四)配置org.springframework.web.WebApplicationInitializer接口的实现类
RBACWebApplication类是WebApplicationInitializer接口的实现类,WebApplicationInitializer接口的实现类会被org.springframework.web.SpringServletContainerInitializer加载。
SpringServletContainerInitializer是javax.servlet.ServletContainerInitializer接口的实现类,在Servlet 3.0规范中要求在Servlet 容器一启动就要加载ServletContainerInitializer的实现类。
实现的方式就是采用SPI机制。所以SpringServletContainerInitializer类所在的包会有一个配置文件,如下图所示
下面是启动配置文件
package com.ssm.rbac.config; import javax.servlet.MultipartConfigElement; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class RBACWebApplication extends AbstractAnnotationConfigDispatcherServletInitializer{ /** * 指定主配置类 */ @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] {SpringConfig.class}; } /** * 指定springMVC配置类 */ @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] {SpringMvcConfig.class}; } /** * 将一个或者多个路径映射到DispatcherServlet上 */ @Override protected String[] getServletMappings() { return new String[] {"/"}; } /** * 当AbstractAnnotationConfigDispatcherServletInitializer 将DispatcherServlet注册到Servlet容器之后, * 就会调用customizeRegistration方法,并把Servlet注册之后得到的Registration.Dynamic传递过来,通过重写 * customizeRegistration方法,我们可以对DispatcherServlet进行额外的配置 */ @Override protected void customizeRegistration(Dynamic registration) { System.out.println("dispatcherServlet已经注册完成"); //registration.setMultipartConfig(new MultipartConfigElement("/tmp/spitter/")); } }
三 验证
(一)在rbac-manager下创建一个控制器类,如下图所示
代码如下
package com.ssm.rbac.manager.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value="/managerController") public class ManagerController { @RequestMapping(value="/componentScanTest") public String componentScanTest( ) { return "success"; } }
(二)访问
访问结果如下