zoukankan      html  css  js  c++  java
  • SSM项目的搭建

    本文示例在如下环境下搭建一个Maven+Druid+SSM+Shiro+Mysql+PageHelper以及Mybatis Generator反向生成代码的项目

    附上GitHub地址:https://github.com/lujuhao/ssm.git

    一.开发环境:

    系统:Windows7-旗舰版

    工具:Eclipse MARSNavicat Premium 12

    JDK:1.8.0_121

    Tomcat:8.0.43

    MySQL :5.6.5-m8

    二.搭建流程:

    一.环境准备

    1.1 配置JDK

    在window--》Preferences下搜索Java,选择本地对应的JDK安装目录,点击添加完成:

    配置完开发环境JDK后,需要修改项目默认的编译环境:

    1.2 配置Tomcat

    在window--》Preferences下搜索Server,选择自己本地对应的Tomcat版本及JRE环境,点击添加完成:

     

    添加完成之后,配置Tomcat,如图所示,分别对应项目发布路径、自动部署、发布超时时间、访问端口等配置

     1.3 配置Maven

    在window--》Preferences下搜索Maven,选择本地Maven安装路径:

     

    添加Maven后配置自定义属性,替换自己的Maven settings配置文件及Maven仓库:

    二.创建项目

    2.1 使用Eclipse创建Maven项目:

    2.2 项目创建完成后,根据自己习惯的包名结构创建对应的目录,项目结构如图所示:

     

    三.配置pom.xml依赖

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      4   <modelVersion>4.0.0</modelVersion>
      5   <groupId>com</groupId>
      6   <artifactId>mySpringMVC</artifactId>
      7   <packaging>war</packaging>
      8   <version>0.0.1-SNAPSHOT</version>
      9   <name>mySpringMVC Maven Webapp</name>
     10   <url>http://maven.apache.org</url>
     11   
     12   <properties>
     13        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     14        
     15        <jdk.version>1.8</jdk.version>
     16      <spring.version>4.1.9.RELEASE</spring.version>
     17      <aspectj.version>1.8.9</aspectj.version>
     18      <mysql-connector>8.0.13</mysql-connector>
     19      <druid.version>1.0.18</druid.version>
     20      <mybatis.version>3.2.8</mybatis.version>
     21      <mybatis-spring.version>1.2.3</mybatis-spring.version>
     22      <mybatis-generator.version>1.3.5</mybatis-generator.version>
     23      <shiro.version>1.2.3</shiro.version>
     24   </properties>
     25   
     26   <!-- 定义Maven项目依赖 -->
     27   <dependencies>
     28         <!-- Junit 测试依赖 -->
     29         <dependency>
     30             <groupId>junit</groupId>
     31             <artifactId>junit</artifactId>
     32             <version>3.8.1</version>
     33             <!-- 表示开发的时候引入,发布的时候不会加载此包 -->  
     34             <scope>test</scope>
     35         </dependency>
     36     
     37         <!-- spring核心依赖 -->
     38         <dependency>
     39             <groupId>org.springframework</groupId>
     40             <artifactId>spring-core</artifactId>
     41             <version>${spring.version}</version>
     42         </dependency>
     43         
     44         <!-- springWeb依赖 -->
     45         <dependency>
     46             <groupId>org.springframework</groupId>
     47             <artifactId>spring-web</artifactId>
     48             <version>${spring.version}</version>
     49         </dependency>
     50         
     51         <!-- springMVC依赖 -->
     52         <dependency>
     53             <groupId>org.springframework</groupId>
     54             <artifactId>spring-webmvc</artifactId>
     55             <version>${spring.version}</version>
     56         </dependency>
     57     
     58         <!-- springJDBC依赖 -->
     59         <dependency>
     60             <groupId>org.springframework</groupId>
     61             <artifactId>spring-jdbc</artifactId>
     62             <version>${spring.version}</version>
     63         </dependency>
     64     
     65         <!-- spring上下文依赖 -->
     66         <dependency>
     67             <groupId>org.springframework</groupId>
     68             <artifactId>spring-context</artifactId>
     69             <version>${spring.version}</version>
     70         </dependency>
     71     
     72         <!-- spring上下文支持依赖 -->
     73         <dependency>
     74             <groupId>org.springframework</groupId>
     75             <artifactId>spring-context-support</artifactId>
     76             <version>${spring.version}</version>
     77         </dependency>
     78     
     79         <!-- springAOP依赖 -->
     80         <dependency>
     81             <groupId>org.springframework</groupId>
     82             <artifactId>spring-aop</artifactId>
     83             <version>${spring.version}</version>
     84         </dependency>
     85 
     86         <!-- aspectj依赖 -->
     87         <dependency>
     88             <groupId>org.aspectj</groupId>
     89             <artifactId>aspectjrt</artifactId>
     90             <version>${aspectj.version}</version>
     91         </dependency>
     92         
     93         <dependency>
     94             <groupId>org.aspectj</groupId>
     95             <artifactId>aspectjweaver</artifactId>
     96             <version>${aspectj.version}</version>
     97         </dependency>
     98         
     99         <dependency>
    100             <groupId>cglib</groupId>
    101             <artifactId>cglib</artifactId>
    102             <version>3.1</version>
    103         </dependency>
    104     
    105         <!-- spring测试依赖 -->
    106         <dependency>
    107             <groupId>org.springframework</groupId>
    108             <artifactId>spring-test</artifactId>
    109             <version>${spring.version}</version>
    110         </dependency>
    111     
    112         <!-- spring OXM依赖 -->
    113         <dependency>
    114             <groupId>org.springframework</groupId>
    115             <artifactId>spring-oxm</artifactId>
    116             <version>${spring.version}</version>
    117         </dependency>
    118         
    119         <!-- spring 事务依赖 -->
    120         <dependency>
    121             <groupId>org.springframework</groupId>
    122             <artifactId>spring-tx</artifactId>
    123             <version>${spring.version}</version>
    124         </dependency>
    125     
    126         <!-- Servlet依赖 -->
    127         <dependency>
    128             <groupId>javax.servlet</groupId>
    129             <artifactId>javax.servlet-api</artifactId>
    130             <version>3.0.1</version>
    131             <scope>provided</scope>
    132         </dependency>
    133         
    134         <dependency>
    135             <groupId>javax.servlet</groupId>
    136             <artifactId>jstl</artifactId>
    137             <version>1.1.2</version>
    138             <scope>provided</scope>
    139         </dependency>
    140         
    141         <!-- jsp依赖 -->
    142         <dependency>
    143             <groupId>javax.servlet.jsp</groupId>
    144             <artifactId>javax.servlet.jsp-api</artifactId>
    145             <version>2.3.1</version>
    146             <scope>provided</scope>
    147         </dependency>
    148         
    149         <!-- jackson 依赖 -->
    150         <dependency>
    151             <groupId>org.codehaus.jackson</groupId>
    152             <artifactId>jackson-jaxrs</artifactId>
    153             <version>1.9.11</version>
    154         </dependency>
    155     
    156         <!-- commons 依赖 -->
    157         <dependency>
    158             <groupId>org.apache.commons</groupId>
    159             <artifactId>commons-lang3</artifactId>
    160             <version>3.3.2</version>
    161         </dependency>
    162         
    163         <dependency>
    164             <groupId>commons-io</groupId>
    165             <artifactId>commons-io</artifactId>
    166             <version>2.4</version>
    167         </dependency>
    168         
    169         <dependency>
    170             <groupId>org.apache.commons</groupId>
    171             <artifactId>commons-collections4</artifactId>
    172             <version>4.0</version>
    173         </dependency>
    174         
    175         <dependency>
    176             <groupId>commons-logging</groupId>
    177             <artifactId>commons-logging</artifactId>
    178             <version>1.1.3</version>
    179         </dependency>
    180         
    181         <dependency>
    182             <groupId>commons-codec</groupId>
    183             <artifactId>commons-codec</artifactId>
    184             <version>1.8</version>
    185         </dependency>
    186         <dependency>
    187             <groupId>commons-beanutils</groupId>
    188             <artifactId>commons-beanutils</artifactId>
    189             <version>1.8.3</version>
    190         </dependency>
    191         
    192         <dependency>
    193             <groupId>commons-chain</groupId>
    194             <artifactId>commons-chain</artifactId>
    195             <version>1.2</version>
    196         </dependency>
    197         
    198         <dependency>
    199             <groupId>commons-fileupload</groupId>
    200             <artifactId>commons-fileupload</artifactId>
    201             <version>1.3.1</version>
    202         </dependency>
    203         
    204         <dependency>
    205             <groupId>org.apache.commons</groupId>
    206             <artifactId>commons-math3</artifactId>
    207             <version>3.3</version>
    208         </dependency>
    209         
    210         <dependency>
    211             <groupId>org.apache.commons</groupId>
    212             <artifactId>commons-pool2</artifactId>
    213             <version>2.2</version>
    214         </dependency>
    215         
    216         <dependency>
    217             <groupId>org.apache.commons</groupId>
    218             <artifactId>commons-digester3</artifactId>
    219             <version>3.2</version>
    220         </dependency>
    221         
    222         <dependency>
    223             <groupId>commons-net</groupId>
    224             <artifactId>commons-net</artifactId>
    225             <version>3.3</version>
    226         </dependency>
    227         
    228         <dependency>
    229             <groupId>commons-dbutils</groupId>
    230             <artifactId>commons-dbutils</artifactId>
    231             <version>1.5</version>
    232         </dependency>
    233         
    234         <dependency>
    235             <groupId>org.apache.commons</groupId>
    236             <artifactId>commons-email</artifactId>
    237             <version>1.3.3</version>
    238         </dependency>
    239         
    240         <dependency>
    241             <groupId>commons-dbcp</groupId>
    242             <artifactId>commons-dbcp</artifactId>
    243             <version>1.4</version>
    244         </dependency>
    245     
    246         <!-- jstl依赖 -->
    247         <dependency>
    248             <groupId>jstl</groupId>
    249             <artifactId>jstl</artifactId>
    250             <version>1.2</version>
    251         </dependency>
    252     
    253         <!-- 标签库依赖 -->
    254         <dependency>
    255             <groupId>taglibs</groupId>
    256             <artifactId>standard</artifactId>
    257             <version>1.1.2</version>
    258         </dependency>
    259         
    260         <!-- 日志相关 -->
    261         <dependency>
    262             <groupId>log4j</groupId>
    263             <artifactId>log4j</artifactId>
    264             <version>1.2.16</version>
    265         </dependency>
    266     
    267         <dependency>
    268             <groupId>org.slf4j</groupId>
    269             <artifactId>slf4j-api</artifactId>
    270             <version>1.7.5</version>
    271         </dependency>
    272     
    273         <!-- 阿里连接池依赖 -->
    274         <dependency>
    275              <groupId>com.alibaba</groupId>
    276              <artifactId>druid</artifactId>
    277              <version>${druid.version}</version>
    278         </dependency>
    279     
    280         <!-- 阿里fastjson依赖 -->
    281         <dependency>
    282             <groupId>com.alibaba</groupId>
    283             <artifactId>fastjson</artifactId>
    284             <version>1.1.41</version>
    285         </dependency>
    286         
    287         <!-- 引入jackson,防止ajax调用返回json出现下载文件 -->
    288         <dependency>
    289             <groupId>com.fasterxml.jackson.core</groupId>
    290             <artifactId>jackson-databind</artifactId>
    291             <version>2.5.1</version>
    292         </dependency>
    293     
    294         <!-- mysql连接 -->
    295         <dependency>
    296             <groupId>mysql</groupId>
    297             <artifactId>mysql-connector-java</artifactId>
    298             <version>${mysql-connector}</version>
    299         </dependency>
    300     
    301         <!-- MyBatis -->
    302         <dependency>
    303             <groupId>org.mybatis</groupId>
    304             <artifactId>mybatis</artifactId>
    305             <version>${mybatis.version}</version>
    306         </dependency>
    307     
    308         <!-- MyBatis/Spring包 -->
    309         <dependency>
    310             <groupId>org.mybatis</groupId>
    311             <artifactId>mybatis-spring</artifactId>
    312             <version>${mybatis-spring.version}</version>
    313         </dependency>
    314         
    315         <!-- MyBatis Generator 反向生成 -->
    316         <dependency>
    317             <groupId>org.mybatis.generator</groupId>
    318             <artifactId>mybatis-generator-core</artifactId>
    319             <version>${mybatis-generator.version}</version>
    320         </dependency>
    321         
    322         <!-- MyBatis分页插件依赖 -->
    323         <dependency>
    324             <groupId>com.github.pagehelper</groupId>
    325             <artifactId>pagehelper</artifactId>
    326             <version>4.0.0</version>
    327         </dependency>
    328         
    329         <!-- Shiro安全验证依赖 -->
    330         <dependency>
    331             <groupId>org.apache.shiro</groupId>
    332             <artifactId>shiro-core</artifactId>
    333             <version>${shiro.version}</version>
    334         </dependency>
    335         
    336         <dependency>
    337             <groupId>org.apache.shiro</groupId>
    338             <artifactId>shiro-web</artifactId>
    339             <version>${shiro.version}</version>
    340         </dependency>
    341         
    342         <dependency>
    343             <groupId>org.apache.shiro</groupId>
    344             <artifactId>shiro-spring</artifactId>
    345             <version>${shiro.version}</version>
    346         </dependency>
    347         
    348         <dependency>
    349             <groupId>org.apache.shiro</groupId>
    350             <artifactId>shiro-ehcache</artifactId>
    351             <version>${shiro.version}</version>
    352         </dependency>  
    353   </dependencies>
    354 
    355     <build>
    356         <!-- 定义配置文件的路径 -->
    357         <resources>
    358             <resource>
    359                 <directory>src/main/resources</directory>
    360                 <filtering>true</filtering>
    361             </resource>
    362         </resources>
    363     
    364         <finalName>mySpringMVC</finalName>
    365         
    366         <plugins>
    367             <!-- 定义mybatis generator 反向生成插件 -->
    368             <plugin>
    369                <groupId>org.mybatis.generator</groupId>
    370                <artifactId>mybatis-generator-maven-plugin</artifactId>
    371                <version>1.3.2</version>
    372                <executions>
    373                   <execution>
    374                      <id>Generate MyBatis Files</id>
    375                      <goals>
    376                         <goal>generate</goal>
    377                      </goals>
    378                      <phase>generate</phase>
    379                      <configuration>
    380                         <verbose>true</verbose>
    381                         <overwrite>true</overwrite>
    382                      </configuration>
    383                   </execution>
    384                </executions>
    385     
    386                <dependencies>
    387                   <dependency>
    388                      <groupId>mysql</groupId>
    389                      <artifactId>mysql-connector-java</artifactId>
    390                      <version>${mysql-connector}</version>
    391                   </dependency>
    392     
    393                   <dependency>
    394                      <groupId>org.mybatis.generator</groupId>
    395                         <artifactId>mybatis-generator-core</artifactId>
    396                      <version>${mybatis-generator.version}</version>
    397                   </dependency>
    398     
    399     
    400                   <dependency>
    401                      <groupId>org.mybatis</groupId>
    402                      <artifactId>mybatis</artifactId>
    403                      <version>${mybatis.version}</version>
    404                   </dependency>
    405                </dependencies>
    406             </plugin>
    407         </plugins>
    408     </build>
    409   
    410 </project>
    View Code

    四.搭建框架

    在如图所示目录下,分别创建

              mapping:用于存放实体与数据库映射的Mybatis配置文件

              application.properties:项目通用配置文件

              generatorConfig.xml:Mybatis反向生成配置文件

              log4j.properties:log4j日志记录配置文件

              mybatis-config.xml:Mybatis配置文件

              spring-mvc.xml:SpringMVC配置文件

              spring-mybatis.xml:Spring整合Mybatis配置文件

              spring-shiro.xml:Spring整合Shiro配置文件

    4.1  项目基本配置:application.properties

    #默认访问页面
    web.view.default=../index

    #最多文件上传大小
    web.maxUploadSize=10485760000

    #定义jsp页面访问路径前后缀
    web.view.prefix=/WEB-INF/views/
    web.view.suffix=.jsp

    #JDBC配置
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useAffectedRows=true&serverTimezone=GMT
    jdbc.username=root
    jdbc.password=root
    jdbc.initialSize=0
    jdbc.maxActive=20
    jdbc.maxIdle=20
    jdbc.minIdle=1
    jdbc.maxWait=60000

    #阿里druid连接池配置
    dbcp.initialSize=15
    dbcp.maxActive=5000
    dbcp.maxIdle=0
    dbcp.maxWait=900000
    dbcp.defaultAutoCommit=true
    dbcp.removeAbandoned=true
    dbcp.removeAbandonedTimeout=30
    dbcp.whenExhaustedAction=1
    dbcp.validationQuery=select 1
    dbcp.testOnBorrow=fasle
    dbcp.testOnReturn=false

    4.2  日志记录:log4j.properties

    #定义LOG输出级别
    log4j.rootLogger=INFO,Console,File
    #定义日志输出目的地为控制台
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.Target=System.out
    #可以灵活地指定日志输出格式,下面一行是指定具体的格式
    log4j.appender.Console.layout = org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
    
    #文件大小到达指定尺寸的时候产生一个新的文件
    log4j.appender.File = org.apache.log4j.RollingFileAppender
    #指定输出目录
    log4j.appender.File.File = logs/springmvcMybist/ssm.log
    #定义文件最大大小
    log4j.appender.File.MaxFileSize = 10MB
    #输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
    log4j.appender.File.Threshold = ALL
    log4j.appender.File.layout = org.apache.log4j.PatternLayout
    log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

    4.3  配置Mybatis框架及PageHelper插件:mybatis-config.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
     3 <configuration>
     4 
     5     <!-- 全局参数 -->
     6     <settings>
     7         <!-- 使全局的映射器启用或禁用缓存。 -->
     8         <setting name="cacheEnabled" value="true"/>
     9         
    10         <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
    11         <setting name="lazyLoadingEnabled" value="true"/>
    12         
    13         <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
    14         <setting name="aggressiveLazyLoading" value="true"/>
    15         
    16         <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->
    17         <setting name="multipleResultSetsEnabled" value="true"/>
    18         
    19         <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
    20         <setting name="useColumnLabel" value="true"/>
    21         
    22         <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->
    23         <setting name="useGeneratedKeys" value="false"/>
    24         
    25         <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->  
    26         <setting name="autoMappingBehavior" value="PARTIAL"/>
    27         
    28         <!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->
    29         <setting name="defaultExecutorType" value="SIMPLE"/>
    30         
    31         <!-- 使用驼峰命名法转换字段。 -->
    32         <setting name="mapUnderscoreToCamelCase" value="true"/>
    33         
    34         <!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
    35         <setting name="localCacheScope" value="SESSION"/>
    36         
    37         <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
    38         <setting name="jdbcTypeForNull" value="NULL"/>
    39         
    40         <!-- 打印sql语句 -->
    41         <setting name="logImpl" value="STDOUT_LOGGING" />
    42     </settings>
    43     
    44     <!-- 定义MyBatis插件 -->
    45     <plugins>
    46         <plugin interceptor="com.github.pagehelper.PageHelper">
    47             <!-- 数据库类型 -->
    48             <property name="dialect" value="mysql"/>
    49             <!-- 该参数默认为false -->
    50             <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
    51             <!-- 和startPage中的pageNum效果一样-->
    52             <property name="offsetAsPageNum" value="true"/>
    53             <!-- 该参数默认为false -->
    54             <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
    55             <property name="rowBoundsWithCount" value="true"/>
    56             <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
    57             <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
    58             <property name="pageSizeZero" value="true"/>
    59             <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
    60             <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
    61             <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
    62             <property name="reasonable" value="false"/>
    63             <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
    64             <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
    65             <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
    66             <!-- 不理解该含义的前提下,不要随便复制该配置 -->
    67             <property name="params" value="pageNum=start;pageSize=limit;"/>
    68             <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
    69             <property name="returnPageInfo" value="check"/>
    70         </plugin>
    71     </plugins>
    72 </configuration>

    4.4  整合MVC:spring-mvc.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
     5         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
     6         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
     7 
     8     <description>SpringMVC配置文件</description>
     9 
    10      <!-- 引入配置文件 -->
    11     <bean id="propertyConfigurer"
    12         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    13         <property name="location" value="classpath:application.properties" />
    14     </bean>
    15 
    16     <!-- 自动扫描Controller包 -->
    17     <context:component-scan base-package="com.controller" />
    18 
    19     <!-- 添加注解驱动 -->
    20     <mvc:annotation-driven enable-matrix-variables="true" />
    21     
    22     <!-- 以下两种对静态资源的配置选中一种即可 -->
    23     <!-- 1.允许对静态资源文件的访问 , 将无法mapping到Controller的path交给default servlet handler处理-->
    24     <mvc:default-servlet-handler />
    25     
    26     <!-- 2.对静态资源的访问,mapping:访问路径,location:静态资源的位置 -->
    27     <mvc:resources mapping="/static/**" location="/static/" /> 
    28 
    29     <!-- 定义默认的访问页面 -->
    30     <mvc:view-controller path="/" view-name="${web.view.default}"/>
    31 
    32     <!--避免IE执行AJAX时,返回JSON出现下载文件,Spring4.1.1去掉了MappingJacksonHttpMessageConverter
    33     spring-mvc配置将MappingJacksonHttpMessageConverter改成MappingJackson2HttpMessageConverter,
    34     Maven对org.codehaus.jackson的引用,改用 com.fasterxml.jackson.core -->
    35     <bean id="mappingJacksonHttpMessageConverter"
    36         class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    37         <property name="supportedMediaTypes">
    38             <list>
    39                 <value>text/html;charset=UTF-8</value>
    40             </list>
    41         </property>
    42     </bean>
    43 
    44     <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
    45     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    46         <property name="messageConverters">
    47             <list>
    48                 <ref bean="mappingJacksonHttpMessageConverter" />    <!-- JSON转换器 -->
    49             </list>
    50         </property>
    51     </bean>
    52 
    53     <!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
    54     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    55         <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
    56         <property name="prefix" value="${web.view.prefix}" />
    57         <property name="suffix" value="${web.view.suffix}" />
    58     </bean>
    59 
    60     <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
    61     <bean id="multipartResolver"
    62         class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    63         <!-- 默认编码 -->
    64         <property name="defaultEncoding" value="UTF-8" />
    65         <!-- 文件大小最大值 -->
    66         <property name="maxUploadSize" value="${web.maxUploadSize}" />
    67         <!-- 内存中的最大值 -->
    68         <property name="maxInMemorySize" value="40960" />
    69     </bean>
    70 </beans>

    4.5  整合Mybatis:spring-mybatis.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
     4     xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
     5     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
     6     xmlns:task="http://www.springframework.org/schema/task"
     7     xsi:schemaLocation="
     8         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
     9         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    10         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
    11         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
    12         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
    13         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
    14         http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"
    15     default-lazy-init="true">
    16 
    17     <description>Spring整合Mybatis配置文件</description>
    18 
    19     <!-- 引入配置文件 -->
    20     <bean id="propertyConfigurer"
    21         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    22         <property name="location" value="classpath:application.properties" />
    23     </bean>
    24                         
    25     <!-- 自动扫描 -->
    26     <context:component-scan base-package="com.dao,com.service" />
    27 
    28     <!-- 阿里 druid 数据库连接池 -->
    29     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
    30         destroy-method="close">
    31         <property name="driverClassName" value="${jdbc.driver}" />
    32         <property name="url" value="${jdbc.url}" />
    33         <property name="username" value="${jdbc.username}" />
    34         <property name="password" value="${jdbc.password}" />
    35         <!-- 初始化连接数量 -->
    36         <property name="initialSize" value="${jdbc.initialSize}"></property>
    37         <!-- 最大并发连接数 -->
    38         <property name="maxActive" value="${jdbc.maxActive}"></property>
    39         <!-- 最大空闲连接数 -->
    40         <property name="maxIdle" value="${jdbc.maxIdle}"></property>
    41         <!-- 最小空闲连接数 -->
    42         <property name="minIdle" value="${jdbc.minIdle}"></property>
    43         <!-- 配置获取连接等待超时的时间 -->
    44         <property name="maxWait" value="${jdbc.maxWait}"></property>
    45         <property name="defaultAutoCommit" value="${dbcp.defaultAutoCommit}" />
    46         <property name="removeAbandoned" value="${dbcp.removeAbandoned}" />
    47         <property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}" />
    48         <property name="logAbandoned" value="true"></property>
    49         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    50         <property name="timeBetweenEvictionRunsMillis" value="60000" />
    51         
    52         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    53         <property name="minEvictableIdleTimeMillis" value="300000" />
    54         <property name="validationQuery" value="${dbcp.validationQuery}" />
    55         <property name="testWhileIdle" value="true" />
    56         <property name="testOnBorrow" value="false" />
    57         <property name="testOnReturn" value="false" />
    58         
    59         <!-- 打开PSCache,并且指定每个连接上PSCache的大小 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。-->
    60         <property name="poolPreparedStatements" value="false" />
    61         <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    62         
    63         <!-- 配置监控统计拦截的filters -->
    64         <property name="filters" value="stat" /> 
    65     </bean>
    66 
    67     <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    68     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    69         <property name="dataSource" ref="dataSource" />
    70         <!-- 自动扫描mapping.xml文件 -->
    71         <property name="mapperLocations" value="classpath:/mapping/*.xml"></property>
    72         <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
    73     </bean>
    74 
    75     <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
    76     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    77         <property name="basePackage" value="com.dao" />
    78         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    79     </bean>
    80 
    81     <!-- 事务管理-->
    82     <bean id="transactionManager"
    83         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    84         <property name="dataSource" ref="dataSource" />
    85     </bean>
    86     
    87     <!-- 可通过注解控制事务 -->
    88     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
    89     
    90 </beans>

    4.6  整合Shiro

    4.6.1 配置spring-shiro.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <beans xmlns="http://www.springframework.org/schema/beans" 
      3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4         xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
      5         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
      6         http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.1.xsd">
      7         
      8     <description>Spring整合Shiro配置文件</description>
      9           
     10     <!-- 加载配置属性文件 -->
     11     <context:property-placeholder location="classpath:application.properties" />
     12 
     13     <!-- shiro核心-安全管理器securityManager -->
     14     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
     15         <property name="realm" ref="customRealm" />
     16         <property name="cacheManager" ref="cacheManager" />
     17         <property name="sessionManager" ref="sessionManager" />
     18         <property name="rememberMeManager" ref="rememberMeManager" />
     19     </bean>
     20 
     21     <!-- 自定义Realm实现 -->
     22     <bean id="customRealm" class="com.shiro.security.CustomRealm">
     23         <!-- 是否启用缓存 -->
     24         <property name="cachingEnabled" value="true"/>
     25         <!-- 是否启用身份验证缓存 -->
     26         <property name="authenticationCachingEnabled" value="true"/>
     27         <!-- 缓存AuthenticationInfo信息的缓存名称 -->
     28         <property name="authenticationCacheName" value="authenticationCache"/>
     29         <!-- 是否启用授权缓存,缓存AuthorizationInfo信息 -->
     30         <property name="authorizationCachingEnabled" value="true"/>
     31         <!-- 缓存AuthorizationInfo信息的缓存名称 -->
     32         <property name="authorizationCacheName" value="authorizationCache"/>
     33         
     34         <!-- 配置密码匹配器 -->
     35         <property name="credentialsMatcher">
     36             <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
     37                 <!-- 加密算法为MD5 -->
     38                 <property name="hashAlgorithmName" value="MD5"></property>
     39                 <!-- 加密次数 -->
     40                 <property name="hashIterations" value="1024"></property>
     41             </bean>
     42         </property>
     43     </bean>
     44 
     45     <!-- 配置ehcache缓存 -->
     46     <!-- 当用户登入之后访问特定的页面时就会去数据库查询该用户的角色权限,如果没有配置缓存的话,第二次访问又要向数据库发送查询,增加了数据库的压力,如果配置了缓存,就会把角色权限放到缓存之中,不需要多次去数据库查询 -->
     47     <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     48         <property name="configLocation" value="classpath:shiro-ehcache.xml" />
     49         <property name="shared" value="true"></property>
     50     </bean>
     51     
     52     <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
     53         <property name="cacheManager" ref="ehCacheManager" />
     54     </bean>
     55     
     56     <!-- 配置session管理器 -->
     57     <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
     58         <!--  session的失效时长,单位毫秒 -->
     59         <property name="globalSessionTimeout" value="${session.sessionTimeout}"/>
     60         
     61         <!-- 定时清理失效会话, 清理用户直接关闭浏览器造成的孤立会话   -->
     62         <property name="sessionValidationInterval" value="${session.sessionTimeoutClean}"/>
     63         
     64         <!-- 删除失效的session -->
     65         <property name="deleteInvalidSessions" value="true"/>
     66         
     67         <!-- 会话Cookie -->
     68         <property name="sessionIdCookie" ref="sessionIdCookie"/> 
     69     </bean>
     70     
     71     <!-- 会话Cookie模板 -->
     72     <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
     73         <constructor-arg value="sid"/>
     74            <!-- 如果设置为true,则客户端不会暴露给服务端脚本代码,有助于减少某些类型的跨站脚本攻击 -->
     75         <property name="httpOnly" value="true"/>
     76         <property name="maxAge" value="-1"/><!-- maxAge=-1表示浏览器关闭时失效此Cookie -->
     77     </bean>
     78  
     79     <!-- rememberMeManager管理器,写cookie,取出cookie生成用户信息 -->
     80     <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
     81          <!-- cipherKey是加密rememberMe Cookie的密匙,默认AES算法 -->
     82         <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
     83         <property name="cookie" ref="rememberMeCookie" />
     84     </bean>
     85     
     86     <!-- cookie -->
     87     <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
     88         <constructor-arg value="rememberMe"/>
     89         
     90         <!-- 如果设置为true,则客户端不会暴露给服务端脚本代码,有助于减少某些类型的跨站脚本攻击 -->
     91         <property name="httpOnly" value="true"/>
     92         
     93         <!-- 记住我cookie生效时间30天 -->
     94         <property name="maxAge" value="2592000" />
     95     </bean>
     96 
     97     <!-- Shiro生命周期处理器,将生命周期交于Spring管理 -->
     98     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
     99 
    100     <!-- shiro开启事务注解 -->
    101     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
    102         <property name="proxyTargetClass" value="true" />
    103     </bean>
    104     
    105     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    106         <property name="securityManager" ref="securityManager" />
    107     </bean>
    108 
    109     <!-- 自定义LogoutFilter,用户退出登录功能 -->
    110     <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter">
    111         <property name="redirectUrl" value="/login" />
    112     </bean>
    113 
    114     <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 -->
    115     <!--shiro权限异常处理 -->
    116     <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    117         <property name="exceptionMappings">
    118             <props>
    119                 <!-- 未认证 -->
    120                 <prop key="org.apache.shiro.authz.UnauthenticatedException">/login</prop>
    121                 <!-- 未授权 -->
    122                 <prop key="org.apache.shiro.authz.UnauthorizedException">error/unauthorized</prop>
    123             </props>
    124         </property>  
    125     </bean>
    126 
    127     <!-- 配置shiroFilter,这里的shiroFilter要和web.xml配置的名字保持一致 -->
    128     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    129         <!-- Shiro的核心安全接口,这个属性是必须的 -->
    130         <property name="securityManager" ref="securityManager" />
    131         
    132         <!-- 要求登录时的链接(登录页面地址),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
    133         <property name="loginUrl" value="/login" />
    134         
    135         <!-- 登录成功后要跳转的连接 -->
    136         <property name="successUrl" value="index/index"></property>
    137         
    138         <!-- 用户访问未对其授权的资源时,所显示的连接 -->
    139         <property name="unauthorizedUrl" value="error/unauthorized"></property>
    140         
    141         <!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 -->
    142         <property name="filters">
    143             <map>
    144                 <entry key="logout" value-ref="logoutFilter" />
    145             </map>
    146         </property>
    147         
    148         <property name="filterChainDefinitions">
    149             <value>
    150                 <!-- anon:不需要认证 -->
    151                 <!-- authc:表单拦截器 -->
    152                 <!-- logout:退出拦截器-->
    153                 <!-- user:用户拦截器,通过remeberme认证的也能访问-->
    154                 /login= anon    <!-- 登录不进行拦截 -->
    155                 /login.jsp= anon <!-- 登录页面不进行拦截 -->
    156                 /createImgCode =anon <!-- 生成验证码不进行拦截 -->
    157                 /error/= anon <!-- 错误页面不进行拦截 -->
    158                 /logout = logout <!-- 默认注销功能,在前端页面添加<a href="logout">注销</a>即可实现注销登录 -->
    159                 /auth= anon <!-- 验证登录 -->
    160                 /static/** = anon <!-- 静态资源不拦截 -->
    161                 ${user.headImg.path}=anon
    162                 /** = user
    163             </value>
    164         </property>
    165     </bean>
    166 </beans>
    View Code

    4.6.2 自定义用户验证及授权

    ①在shiro包下创建CustomRealm类

      1 package com.shiro.security;
      2 
      3 import java.util.List;
      4 
      5 import org.apache.shiro.SecurityUtils;
      6 import org.apache.shiro.authc.AuthenticationException;
      7 import org.apache.shiro.authc.AuthenticationInfo;
      8 import org.apache.shiro.authc.AuthenticationToken;
      9 import org.apache.shiro.authc.SimpleAuthenticationInfo;
     10 import org.apache.shiro.authc.UnknownAccountException;
     11 import org.apache.shiro.authc.UsernamePasswordToken;
     12 import org.apache.shiro.authz.AuthorizationInfo;
     13 import org.apache.shiro.authz.SimpleAuthorizationInfo;
     14 import org.apache.shiro.realm.AuthorizingRealm;
     15 import org.apache.shiro.subject.PrincipalCollection;
     16 import org.apache.shiro.util.ByteSource;
     17 import org.springframework.beans.factory.annotation.Autowired;
     18 
     19 import com.entity.Menu;
     20 import com.entity.Role;
     21 import com.entity.User;
     22 import com.service.RoleMenuService;
     23 import com.service.UserRoleService;
     24 import com.service.UserService;
     25 
     26 /**
     27  * 自定义Shiro身份认证和授权处理
     28  * @author ljh
     29  */
     30 public class CustomRealm extends AuthorizingRealm{
     31 
     32     @Autowired
     33     private UserService userService;
     34     
     35     @Autowired
     36     private UserRoleService userRoleService;
     37     
     38     @Autowired
     39     private RoleMenuService roleMenuService;
     40     
     41     /**
     42      * 身份验证--登录
     43      */
     44     @Override
     45     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
     46         UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
     47         String userName = token.getUsername();
     48         
     49         User user = userService.getUserByName(userName);
     50         if (null == user) {
     51             throw new UnknownAccountException("此用户不存在");
     52         }
     53         
     54         ByteSource credentialsSalt = ByteSource.Util.bytes(userName);//使用账号作为盐值
     55         SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), credentialsSalt, getName());
     56         return info;
     57     }
     58     
     59     /**
     60      * 身份授权--权限
     61      */
     62     @Override
     63     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
     64         if (null == principals) {
     65             return null;
     66         }
     67         
     68         // 因为非正常退出,即没有显式调用 SecurityUtils.getSubject().logout()
     69         // (可能是关闭浏览器,或超时),但此时缓存依旧存在(principals),所以会自己跑到授权方法里。
     70         if (!SecurityUtils.getSubject().isAuthenticated()) {
     71             doClearCache(principals);
     72             SecurityUtils.getSubject().logout();
     73             return null;
     74         }
     75 
     76         //获取用户
     77         User user =(User) SecurityUtils.getSubject().getPrincipal();
     78         
     79         List<Role> roleList=userRoleService.getRoleListByUserId(user.getId());
     80         List<Menu> menuList=roleMenuService.getMenuListByUserId(user.getId());
     81         
     82         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
     83         
     84         //加入角色
     85         for (Role role : roleList) {
     86             info.addRole(role.getRole());
     87         }
     88         
     89         // 加入权限
     90         for (Menu menu : menuList) {
     91             if (null != menu.getPermission() && !"".equals(menu.getPermission())) {
     92                 for (String permission : menu.getPermission().split(",")) {
     93                     info.addStringPermission(permission);
     94                 }
     95             }
     96         }
     97         
     98         return info;
     99     }
    100 
    101     
    102 
    103     
    104 }
    View Code

    ②在util包下创建ShiroMd5Util类,用于用户密码加密

     1 package com.util;
     2 
     3 import org.apache.shiro.crypto.hash.SimpleHash;
     4 import org.apache.shiro.util.ByteSource;
     5 
     6 import com.entity.User;
     7 
     8 /**
     9  * MD5密码加密工具
    10  * @author ljh
    11  */
    12 public class ShiroMd5Util {
    13     
    14     /**
    15      * User的密码加密方法
    16      * @param user
    17      * @return 加密后的密码
    18      */
    19     public static String SysMd5(User user) {
    20         String hashAlgorithmName = "MD5";//加密方式  
    21         Object crdentials =user.getPassword();//密码原值  
    22         ByteSource salt = ByteSource.Util.bytes(user.getName());//以账号作为盐值  
    23         int hashIterations = 1024;//加密1024次  
    24         SimpleHash hash = new SimpleHash(hashAlgorithmName,crdentials,salt,hashIterations);
    25         
    26         return hash.toString();
    27     }  
    28     
    29 }

    4.7  配置反向生成:generatorConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
    PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <!-- 数据库驱动,请按实际填写本地的mysql连接jar包路径 -->
        <classPathEntry location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\5.1.31\mysql-connector-java-5.1.31.jar" />
        
        <context id="DB2Tables" targetRuntime="MyBatis3">
            <commentGenerator>
                <property name="suppressDate" value="true" />
                <!-- 是否去除自动生成的注释 true:是 : false:否 -->
                <property name="suppressAllComments" value="true" />
            </commentGenerator>
            
            <!--数据库链接URL,用户名、密码 -->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://127.0.0.1:3306/wh-spring-boot" userId="root"
                password="root">
            </jdbcConnection>
            
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
            
            <!-- 生成模型的包名和位置 -->
            <javaModelGenerator targetPackage="com.entity" targetProject="src/main/java">
                <property name="enableSubPackages" value="true" />
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
            
            <!-- 生成映射文件的包名和位置 -->
            <sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
                <property name="enableSubPackages" value="true" />
            </sqlMapGenerator>
            
            <!-- 生成DAO的包名和位置 -->
            <javaClientGenerator type="XMLMAPPER"
                targetPackage="com.dao" targetProject="src/main/java">
                <property name="enableSubPackages" value="true" />
            </javaClientGenerator>
            
            <!-- 要生成的表 tableName是数据库中的表名或视图名, domainObjectName是实体类名 -->
            <table tableName="sys_user" domainObjectName="User"
                enableCountByExample="false" enableUpdateByExample="false"
                enableDeleteByExample="false" enableSelectByExample="false"
                selectByExampleQueryId="false"></table>
                
            <table tableName="sys_role" domainObjectName="Role"
                enableCountByExample="false" enableUpdateByExample="false"
                enableDeleteByExample="false" enableSelectByExample="false"
                selectByExampleQueryId="false"></table>
                
            <table tableName="sys_menu" domainObjectName="Menu"
                enableCountByExample="false" enableUpdateByExample="false"
                enableDeleteByExample="false" enableSelectByExample="false"
                selectByExampleQueryId="false"></table>
                
            <table tableName="r_user_role" domainObjectName="UserRole"
                enableCountByExample="false" enableUpdateByExample="false"
                enableDeleteByExample="false" enableSelectByExample="false"
                selectByExampleQueryId="false"></table>    
        </context>
    </generatorConfiguration>

    配置完成反向生成文件后,配置如下图所示Run Configurations,右键Run as Configurations 即可在对应的包下面反向生成代码:

    默认生成的Dao层格式为:XXXMapper,这里根据个人习惯可另外自行修改名称:

     

    4.8 配置web.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3     xmlns="http://java.sun.com/xml/ns/javaee"
      4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      5     version="3.0">
      6     <display-name>Archetype Created Web Application</display-name>
      7     
      8     <!-- 加载Spring与其他框架整合的配置文件 -->
      9     <context-param>
     10         <param-name>contextConfigLocation</param-name>
     11         <param-value>
     12             classpath:spring-mybatis.xml
     13             classpath:spring-shiro.xml
     14         </param-value>
     15     </context-param>
     16     
     17     <!-- Spring监听器 -->
     18     <listener>
     19         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     20     </listener>
     21     
     22     <!-- 防止Spring内存溢出监听器 -->
     23     <listener>
     24         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
     25     </listener>
     26     
     27     <!-- 编码过滤器 -->
     28     <filter>
     29         <filter-name>encodingFilter</filter-name>
     30         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     31         <async-supported>true</async-supported>
     32         <init-param>
     33             <param-name>encoding</param-name>
     34             <param-value>UTF-8</param-value>
     35         </init-param>
     36     </filter>
     37     <filter-mapping>
     38         <filter-name>encodingFilter</filter-name>
     39         <url-pattern>/*</url-pattern>
     40     </filter-mapping>
     41 
     42     <!-- Shiro过滤器,DelegatingFilterProxy会从spring容器中找shiroFilter -->
     43     <filter>
     44         <filter-name>shiroFilter</filter-name>
     45         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
     46         <!-- 设置true由servlet容器控制filter的生命周期 -->
     47         <init-param>
     48             <param-name>targetFilterLifecycle</param-name>
     49             <param-value>true</param-value>
     50         </init-param>
     51     </filter>
     52     <filter-mapping>
     53         <filter-name>shiroFilter</filter-name>
     54         <url-pattern>/*</url-pattern>
     55     </filter-mapping> 
     56     
     57     
     58     <!-- Spring MVC 核心:DispatcherServlet -->
     59     <servlet>
     60         <servlet-name>SpringMVC</servlet-name>
     61         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     62         <init-param>
     63             <param-name>contextConfigLocation</param-name>
     64             <param-value>classpath:spring-mvc.xml</param-value>
     65         </init-param>
     66         <load-on-startup>1</load-on-startup>
     67         <async-supported>true</async-supported>
     68     </servlet>
     69     
     70     <servlet-mapping>
     71         <servlet-name>SpringMVC</servlet-name>
     72         <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
     73         <url-pattern>/</url-pattern>
     74     </servlet-mapping>
     75     
     76     <!-- 设置默认servlet对静态资源的放行 -->
     77     <servlet-mapping>
     78         <servlet-name>default</servlet-name>
     79         <url-pattern>*.css</url-pattern>
     80         <url-pattern>*.scss</url-pattern>
     81         <url-pattern>*.map</url-pattern>
     82         <url-pattern>*.js</url-pattern>
     83         <url-pattern>*.svg</url-pattern>
     84         <url-pattern>*.jpg</url-pattern>
     85         <url-pattern>*.jpeg</url-pattern>
     86         <url-pattern>*.bmp</url-pattern>
     87         <url-pattern>*.png</url-pattern>
     88         <url-pattern>*.gif</url-pattern>
     89         <url-pattern>*.ico</url-pattern>
     90         <url-pattern>*.woff</url-pattern>
     91         <url-pattern>*.woff2</url-pattern>
     92     </servlet-mapping>
     93     
     94     <!--阿里Druid连接池启用 Web监控统计功能start -->
     95     <filter>
     96         <filter-name>DruidWebStatFilter</filter-name>
     97         <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
     98         <init-param>
     99             <param-name>exclusions</param-name>
    100             <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.scss,*.ico,/druid/*</param-value>
    101         </init-param>
    102     </filter>
    103     <filter-mapping>
    104         <filter-name>DruidWebStatFilter</filter-name>
    105         <url-pattern>/*</url-pattern>
    106     </filter-mapping>
    107     
    108     <servlet>
    109         <servlet-name>DruidStatView</servlet-name>
    110         <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    111     </servlet>
    112     <servlet-mapping>
    113         <servlet-name>DruidStatView</servlet-name>
    114         <url-pattern>/druid/*</url-pattern>
    115     </servlet-mapping>
    116     <!--连接池启用Web监控统计功能end-->
    117     
    118     <!--对所有的请求都转化为https -->
    119     <security-constraint>  
    120         <!-- Authorization setting for SSL -->  
    121         <web-resource-collection >  
    122             <web-resource-name >SSL</web-resource-name>  
    123             <url-pattern>/*</url-pattern>  
    124         </web-resource-collection>  
    125         <user-data-constraint>  
    126             <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
    127         </user-data-constraint>  
    128      </security-constraint>
    129     
    130     <error-page>
    131          <error-code>404</error-code>
    132          <location>/WEB-INF/views/error/404.jsp</location>
    133      </error-page>
    134 
    135     <error-page>
    136         <error-code>500</error-code>
    137         <location>/WEB-INF/views/error/error.jsp</location>
    138     </error-page>
    139 </web-app>

    五.测试准备

    5.1 Web访问测试

    在Controller包下新建TestController,此Controller只有一个helloWorld方法用于向页面返回文字:

     1 package com.controller;
     2 
     3 import org.springframework.stereotype.Controller;
     4 import org.springframework.web.bind.annotation.RequestMapping;
     5 import org.springframework.web.bind.annotation.ResponseBody;
     6 
     7 /**
     8  * 测试Controller
     9  * @author ljh
    10  */
    11 @Controller
    12 public class TestController {
    13     
    14     /**
    15      * 测试访问
    16      * @return
    17      */
    18     @RequestMapping("/helloWorld")
    19     @ResponseBody
    20     public String helloWorld(){
    21         return "HelloWorld";
    22     }
    23 }

    5.2  持久层数据库连接测试

    5.2.1 创建Service

    在service包下创建UserService接口,与UserServiceImpl接口实现:

     1 package com.service;
     2 
     3 import java.util.List;
     4 
     5 import com.entity.User;
     6 import com.github.pagehelper.PageInfo;
     7 
     8 /**
     9  * User service层接口
    10  * @author ljh
    11  */
    12 public interface UserService {
    13     int deleteByID(Integer id);
    14 
    15     int insert(User user);
    16 
    17     User selectByID(Integer id);
    18 
    19     int update(User record);
    20     
    21     List<User> selectUserList(User user);
    22     
    23     /**
    24      * 分页查询用户列表
    25      * @param user 过滤条件
    26      * @param pageNo 页码
    27      * @param pageSize 页宽
    28      * @return
    29      */
    30     PageInfo<User> selectUserByPage(User user,int pageNo,int pageSize);
    31 }
     1 package com.service.impl;
     2 
     3 import java.util.List;
     4 
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.stereotype.Service;
     7 
     8 import com.dao.UserDao;
     9 import com.entity.User;
    10 import com.github.pagehelper.PageHelper;
    11 import com.github.pagehelper.PageInfo;
    12 import com.service.UserService;
    13 
    14 /**
    15  * User service层接口实现
    16  * @author ljh
    17  */
    18 @Service
    19 public class UserServiceImpl implements UserService{
    20     @Autowired
    21     private UserDao userDao;
    22     
    23     @Override
    24     public int deleteByID(Integer id) {
    25         return userDao.deleteByID(id);
    26     }
    27 
    28     @Override
    29     public int insert(User record) {
    30         return userDao.insert(record);
    31     }
    32 
    33     @Override
    34     public User selectByID(Integer id) {
    35         return userDao.selectByID(id);
    36     }
    37 
    38     @Override
    39     public int update(User record) {
    40         return userDao.update(record);
    41     }
    42 
    43     @Override
    44     public List<User> selectUserList(User user) {
    45         return userDao.selectUserList(user);
    46     }
    47 
    48      /**
    49      * 分页查询用户列表
    50      * @param user 过滤条件
    51      * @param pageNo 页码
    52      * @param pageSize 页宽
    53      * @return
    54      */
    55     @Override
    56     public PageInfo<User> selectUserByPage(User user, int pageNo, int pageSize) {
    57         PageHelper.startPage(pageNo, pageSize);
    58         List<User> list = userDao.selectUserList(user);
    59         //用PageInfo对结果进行包装
    60         PageInfo<User> pageInfo = new PageInfo<User>(list);
    61         return pageInfo;
    62     }
    63 
    64 }

    5.2.2 创建Junit单元测试

    在test包下创建TestUserService,并添加Junit测试相关注解:

     1 package test;
     2 
     3 import org.junit.Test;
     4 import org.junit.runner.RunWith;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.test.context.ContextConfiguration;
     7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     8 import com.entity.User;
     9 import com.github.pagehelper.PageInfo;
    10 import com.service.UserService;
    11 
    12 @RunWith(SpringJUnit4ClassRunner.class)
    13 @ContextConfiguration(locations = {"classpath:spring-mybatis.xml","classpath:spring-mvc.xml"})
    14 public class TestUserService {
    15 
    16     @Autowired
    17     private UserService userService;
    18     
    19     @Test
    20     public void test(){
    21         PageInfo<User> userPageInfo = userService.selectUserByPage(new User(), 1, 10);
    22         for (User user : userPageInfo.getList()) {
    23             System.out.println(user.getName());
    24         }
    25     }
    26 }

    六.运行与测试

    6.1 将项目添加进Tomcat应用服务器,并启动Tomcat:

    6.2  测试Web访问

    打开浏览器在地址栏输入http://localhost:8080/mySpringMVC/helloWorld查看运行结果:

    6.3  测试持久层数据库连接

    在TestUserService类中右键运行Junit测试方法:

     

    7. 总结  

    1. 配置maven项目依赖
    2. 配置 web.xml,配置Spring MVC核心控制器DispatcherServlet,Shiro监控,编码过滤器,静态文件过滤,监听器,加载 spring-mvc、spring-myabtis与其他Spring集成框架
    3. 在spring-mvc.xml文件中配置视图解析器,文件上传,AOP,拦截器等
    4. 在spring-myabtis.xml文件中配置数据库连接、 映射Dao层、事务管理等
    5. 在spring-shiro.xml文件中配置自定义身份认证、权限设置、会话管理等
  • 相关阅读:
    springboot项目启动成功后执行一段代码的两种方式
    ELK相关资料整理
    Golang指针解析
    Golang文件操作
    Go Channel介绍
    Go语言new和make的区别
    SpringBoot+AOP实现记录操作日志和异常日志,并保存到数据库
    【面试专栏】Java 阻塞队列
    Linux安装Jenkins并构建SpringBoot工程
    Linux安装git
  • 原文地址:https://www.cnblogs.com/ljhblogs/p/11039255.html
Copyright © 2011-2022 走看看