本文示例在如下環境下搭建一個Maven+Druid+SSM+Shiro+Mysql+PageHelper以及Mybatis Generator反向生成代碼的項目
附上GitHub地址:https://github.com/lujuhao/ssm.git
一.開發環境:
系統:Windows7-旗艦版
工具:Eclipse MARS,Navicat 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>
四.搭建框架
在如圖所示目錄下,分別創建
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>
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 }
②在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. 總結
- 配置maven項目依賴
- 配置 web.xml,配置Spring MVC核心控制器DispatcherServlet,Shiro監控,編碼過濾器,靜態文件過濾,監聽器,加載 spring-mvc、spring-myabtis與其他Spring集成框架
- 在spring-mvc.xml文件中配置視圖解析器,文件上傳,AOP,攔截器等
- 在spring-myabtis.xml文件中配置數據庫連接、 映射Dao層、事務管理等
- 在spring-shiro.xml文件中配置自定義身份認證、權限設置、會話管理等