回顾SSM的繁琐配置

最近一直在用SpringBoot(开箱即用, 真好), SSM感觉有点陌生了, 故温习下SSM繁琐的配置.

前提: 项目的是用Maven进行管理和构建的.

首先pom.xml

主要是项目依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>

<name>vip</name>
<groupId>com.daejong.vip</groupId>
<artifactId>vip</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<spring.version>4.3.2.RELEASE</spring.version>
<mybatis.version>3.4.1</mybatis.version>
</properties>

<dependencies>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<!--tomcat里面也有, 所以项目打包的进行exclude-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>

<!--数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

<!--spring事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>


<!--
Java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()
所以mybatis和spring-mybatis版本应该统一才不会有冲突,
3.3.1版本的mybatis和1.1.1的spring-mybatis匹配,
3.4.1版本的mybatis和1.3.1的spring-mybatis匹配。
-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>

<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>

<!--动态代理-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>

<!--jackson家族的一些工具-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.6</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.7</version>
</dependency>

<!--模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>

</dependencies>

<build>
<plugins>
<!--修改项目和模块的语言级别是1.8 设置源码是1.8 编译的jdk也是1.8-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8888</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
<contextPath>/</contextPath>
</configuration>
</plugin>
</plugins>
</build>

</project>

web项目的入口配置文件– web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>

<filter>
<description>请求和响应字符编码过滤器</description>
<filter-name>encoding-filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding-filter</filter-name>
<!--这里是servlet-name因为处理的请求跟springMVC的一样.-->
<servlet-name>springMVC</servlet-name>
</filter-mapping>

<listener>
<description>启动spring容器, (读配置文件)</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>

<servlet>
<description>springMVC的配置</description>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


</web-app>

classpath下(resources下)各大框架的配置文件:

Spring的配置文件 Spring-context.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--扫描业务层组件-->
<context:component-scan base-package="com.daejong.vip.function"/>
<mvc:annotation-driven/>

<!--配置数据源 使用c3p0-->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource"
id="dataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!--这里
useUnicode=true&amp;characterEncoding=UTF-8
指定连接数据库用的编码, 否则就会出现中文查不到数据的现象,
注意, 防止乱码的出现,
要同时设定 数据库的编码, 和项目的编码, 和项目连接数据库用的编码, 必须统一,否则会出现乱码的现象-->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/vip?useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
<property name="minPoolSize" value="1"/>
<property name="maxPoolSize" value="5"/>
<property name="initialPoolSize" value="2"/>
<property name="acquireIncrement" value="2"/>
</bean>

<!--配置一个声明式事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
id="dataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!--表示使用注解来控制事务.-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true" />

<!--配置sqlsessionFactory 指定数据源和mybatis配置文件的路劲-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value>
</list>
</property>
</bean>

<!--扫描dao层-->
<!--mybatis这里配置的bean的作用很关键, 扫描生成所有的dao对象, 放到spring容器中.-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.daejong.vip.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

</beans>

SpringMVC的配置文件– spring-mvc.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--使用注解来进行请求映射-->
<mvc:annotation-driven/>
<!--设置请求路径和方法进行映射-->
<context:annotation-config />
<!--扫描web层-->
<!--扫描所有的控制器-->
<context:component-scan base-package="com.daejong.vip.web.handler"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--在重定向的时候, 是否加上项目名称(上下文路径).-->
<property name="redirectContextRelative" value="true"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>

<mvc:resources mapping="static/**" location="static/"/>
</beans>

MyBatis的配置文件– mybatis-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="proxyFactory" value="CGLIB"/>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>

<typeAliases>
<package name="com.daejong.vip.entity"/>
</typeAliases>

<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
<!--会将rowBounds的第一个参数offset当成pageNum的页码使用-->
<property name="offsetAsPageNum" value="true"/>
<!--使用rowBoun ds分页会进行count查询-->
<property name="rowBoundsWithCount" value="true"/>
<!--如果pageSize = 0 或者 rowBounds的limit为零, 就会查出所有结果
,相当于没有执行分页查询,但是返回结果任是 Page类型.-->
<property name="pageSizeZero" value="true"/>
</plugin>
</plugins>
</configuration>

配置文件差不多了, 接下就是写业务代码了.

一些理解

在实际应用,SpringMVC可以完全替代Struts,配合注解的方式,编程非常快捷,
而且通过restful风格定义url,让地址看起来非常优雅。
另外,MyBatis也可以替换Hibernate,
正因为MyBatis的半自动特点,我们程序猿可以完全掌控SQL,这会让有数据库经验的程序猿能开发出高效率的SQL语句,
而且XML配置管理起来也非常方便。

  1. SpringMVC:它用于web层,相当于controller(等价于传统的servlet和struts的action),用来处理用户请求。
    举个例子,用户在地址栏输入http: //网站域名/login, 那么springmvc就会拦截到这个请求,
    并且调用controller层中相应的方法,
    (中间可能包含验证用户名和密码的业务逻辑,以及查询数据库操作,但这些都不是springmvc的职责),
    最终把结果返回给用户,并且返回相应的页面(当然也可以只反馈josn/xml等格式数据)。
    springmvc就是做前面和后面过程的活,与用户打交道!!

  2. Spring:太强大了,以至于我无法用一个词或一句话来概括它。
    但与我们平时开发接触最多的估计就是IOC容器,
    它可以装载bean(也就是我们java中的类,当然也包括service dao里面的),
    有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。
    另外spring的aop,事务管理等等都是我们经常用到的。

  3. MyBatis:如果你问我它跟鼎鼎大名的Hibernate有什么区别?我只想说,他更符合我的需求。
    第一,它能自由控制sql,这会让有数据库经验的人(当然不是说我啦~捂脸~)编写的代码能搞提升数据库访问的效率。
    第二,它可以使用xml的方式来组织管理我们的sql,因为一般程序出错很多情况下是sql出错,
    别人接手代码后能快速找到出错地方,甚至可以优化原来写的sql。

大致整体流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
0. 创建目录大致结构
1. 修改web.xml中的tdt版本
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

2. 在pom文件中修改项目和模块的语言级别是1.8
<plugins>
<!--修改项目和模块的语言级别是1.8 设置源码是1.8 编译的jdk也是1.8-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

3. 集成springMVC
maven搜索库http://mvnrepository.com/
-1. 在pom.xml中添加依赖
a. spring-mvc
b. servlet-api provided
c. jstl
-2. 在resource目录下建立spring-mvc.xml配置文件
a. 添加注解驱动<mvc:annotation-driven />
b. 注册视图解析器
c. 扫描mvc组件
-3. 在web.xml中配置前端控制器dispatcherServlet
a. 配置随服务器启动而初始化
b. 配置参数contextConfigLocation指定springMVC配置文件的路径
c. 配置servletMapper请求--如仅处理*.do的请求.
-4. 在web.xml中配置请求和响应的字符编码处理过滤器
a. CharacterEncodingFilter.
-5. 配置404 500 欢迎界面等特殊的界面.
-6. 编写测试案例.

4. 集成spring
-1. 添加spring依赖
集成springMVC的时候, 已经添加了spring的依赖了.
-2. 编写配置文件spring-context.xml
a. 配置注解事务管理
b. 扫描业务层组件
-3. 在web.xml中配置ContextLoaderListener监听器,启动spring容器.
配置contextConfigLocation, 指定spring-context.xml路径

5. 配置C3P0
-1. 添加依赖
a. c3p0
b. mysql
-2. 在spring-context.xml中定义c3p0数据源ComboPooledDataSource
a. 配置属性
driverClass,jdbcUrl, username, password
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource"
id="dataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc://mysql://localhost:3306/vip"/>
<property name="user" value="root"/>
<property name="password" value="daejong"/>
<property name="minPoolSize" value="1"/>
<property name="maxPoolSize" value="10"/>
<property name="initialPoolSize" value="5"/>
<property name="acquireIncrement" value="3"/>
</bean>
b.连接数相关的信息
minPoolSize, maxPoolSize, initialPoolSize, acquireIncrement等.

6. 配置声明式事务管理
-1. 添加依赖
spring-tx
spring-jdbc
-2. 配置数据源事务管理DataSourceTransactionManager
指定数据源
-3. 指定通过注解控制事务.
<tx:transaction-driven />
指定事务管理器
<!--配置一个声明式事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
id="dataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--表示使用注解来控制事务.-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

7. 集成mybatis
-1. 添加依赖
a. mybatis
b. mybatis-spring
c. pageHelper
d. cglib
-2. 编写mybatis配置文件
-1. 相关配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="proxyFactory" value="CGLIB"/>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>

<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<!--会将rowBounds的第一个参数offset当成pageNum的页码使用-->
<property name="offsetAsPageNum" value="true"/>
<!--使用rowBounds分页会进行count查询-->
<property name="rowBoundsWithCount" value="true"/>
<!--如果pageSize = 0 或者 rowBounds的limit为零, 就会查出所有结果
,相当于没有执行分页查询,但是返回结果任是 Page类型.-->
<property name="pageSizeZero" value="true"/>
</plugin>
</plugins>
</configuration>
-3. 在spring-context.xml中配置SqlSessionFactoryBean
a. 指定数据源
b. 指定mybatis配置文件的路径
c. 指定mapper文件的路径.
<!--配置sqlsessionFactory 指定数据源和mybatis配置文件的路劲-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

-4. 在spring-context.xml配置扫描的mapper生成dao,(MapperScannerConfigurer)
a. 指定xml中配置SqlSessionFactoryBean
b. 指定要扫描的包

8. 开始编写你的业务代码