zoukankan      html  css  js  c++  java
  • 多模块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";
        }
    
    }

    (二)访问

    访问结果如下

  • 相关阅读:
    ASP.NET Aries 高级开发教程:如何写WebAPI接口
    ASP.NET Aries 高级开发教程:行内编辑事件怎么新增数据到后台(番外篇)
    ASP.NET Aries 高级开发教程:表单检测字段是否已存(番外篇)
    Gemini.Workflow 双子工作流正式上线(支持.NET Core)
    Gemini.Workflow 双子工作流入门教程五:业务表单开发
    Gemini.Workflow 双子工作流入门教程四:流程应用
    Gemini.Workflow 双子工作流入门教程三:定义流程:流程节点、迁移条件参数配置
    Gemini.Workflow 双子工作流入门教程二:定义流程:流程节点介绍
    Gemini.Workflow 双子工作流入门教程一:定义流程:流程图属性
    CYQ.Data 支持分布式数据库(主从备)高可用及负载调试
  • 原文地址:https://www.cnblogs.com/cplinux/p/12496622.html
Copyright © 2011-2022 走看看