多模块SSM RBAC案例项目环境搭建二 Spring与SpringMVC

一 在父项目中加入包依赖

<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";
    }

}

(二)访问

访问结果如下

 

posted @ 2020-03-15 11:35  阿瞒123  阅读(290)  评论(0编辑  收藏  举报