SSM项目搭建的主要步骤

一、说明

因本人个人习惯,一般将项目的核心的配置分为如下几个配置文件配置(名字也是本人的个人爱好,不喜别喷),下文说到配置文件时就不会再进行解释。
spring-mybatis.xml:springMybatis配置文件,主要用来配置与mybatis有关的配置,如数据源等。
spring-mvc.xml:springMVC配置文件,主要用来配置与springMVC有关的配置,如视图解析器等。
spring.xml:spring配置文件,主要用来配置其他的配置,如包扫描,事务管理等。
spring-configs.xml:核心配置文件,主要用来引入其他的配置文件和配置一些共用的配置,如引入springMybatis配置文件和配置包扫描等。

二、配置springMVC

springMVC的五大组件,包括“前端控制器”、“后端控制器”、“视图解析器”、“拦截器”和“url映射处理器”。

1、前端控制器(DispatcherServlet)

1.1 在web.xml文件中配置
1.2 给“contextConfigLocation”变量指定核心配置文件的路径(如:classpath:/spring-configs.xml)。在前端控制器启动的时候会使用其来加载核心配置文件。
1.3 设置优先级,一般设置为1(数字越小优先级越高)。如果没有设置,服务器启动时不会启动前端控制器。
1.4 具体代码配置如下:
	<!-- 配置前端控制器 -->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<!-- 指定核心配置文件路径 -->
			<param-name>ContextConfigLocation</param-name>
			<param-value>classpath:/spring-configs.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup> <!-- 配置优先级,数字越小越高 -->
	</servlet>

	<!--
		.do  .action    以前的规范,现在不常用了
		路径描述:
			前缀型: /service/*    只要请求以service开头被前端控制器拦截
			后缀型: .do		   请求拦截以.do结尾
			全路径: /service/*.do 以service开头以.do结尾请求

		/*	不管请求是什么路径统统拦截
		/	拦截请求和静态资源,放行jsp等动态资源(静态资源一般会在核心配置文件中配置放行,具体配置看扩展8)
		为restFul格式做准备
	-->
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

2、拦截器(HandlerInterceptor)

本人没有配置

3、视图解析器(ViewResolver,全称为InternalResourceViewResolver(内部资源的视图解析器))

3.1 在springMVC配置文件中配置
3.2 给“Prefix”变量指定前缀,在解析视图时和后缀一起与传入的字符串拼接成完整的url路径
3.3 给“Suffix”变量指定后缀,同上
3.4 具体代码配置如下:
<!-- 配置视图解析器,具体实现类为:InternalResourceViewResolver(内部资源视图解析器) -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="Prefix" value="/WEB-INF/views/"/>
    	<property name="Suffix" value=".jsp"/>
</bean>

4、后端控制器(Controller)

4.1 可以配置也可以不配置。
4.2 如果想配置就使用bean标签在springMVC配置文件中配置(一般不建议使用)
4.3 如果不想配置就使用注解的方式。在类前面添加后端控制器注解(@Controller),然后在spring配置文件中配置扫描就行了。(建议使用)
4.4 具体代码实现:
@Controller //后端控制器注解
@RequestMapping("/") //url映射路径注解
public class PageController {
	@RequestMapping("doTestPage")
	public String doTestPage(){
		return "test_page";
	}
}

5、url映射处理器(HanlderMapping)

5.1 不需要配置URL映射处理器,但需要使用注解方式配置url映射路径。在后端控制器类或方法的前面加上url映射路径的注解(@ RequestMapping)。(建议使用,本人表示只会注解方式,其他方式不会)
5.2 具体代码实现:
@Controller //后端控制器注解
@RequestMapping("/") //url映射路径注解
public class PageController {
	@RequestMapping("doTestPage")
	public String doTestPage(){
		return "test_page";
	}
}

扩展配置

6、全站乱码处理过滤器(CharacterEncodingFilter)

6.1 在web.xml文件中配置
6.2 给“encoding”变量指定编码格式(一般为UTF-8)
6.3 具体代码配置如下:
	<!-- 为了解决中文乱码问题(POST乱码),配置过滤器 -->
	<filter>
		<filter-name>characterEncodingFilter</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>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

注:该过滤器只针对POST请求,其他请求无效。请求参数中包含中文的,建议使用POST请求

7、开启springMVC注解

7.1 在springMVC配置文件中配置
7.2 具体代码配置如下:
<!-- 开启mvc注解 -->
<mvc:annotation-driven/>
7.3 扩展
	7.3.1 配置阿里巴巴的fashjson对象,主要用于高并发时的数据传输格式转化
	7.3.2 具体代码配置如下:
	<!-- 配置阿里巴巴的fashjson对象,主要用于高并发时的数据传输格式转化 -->
	<mvc:annotation-driven>
		<mvc:message-converters register-defaults="true">
			<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
				<property name="SupportedMediaTypes">
					<list>
						<value>text/html;charset=utf-8</value>
						<value>application/json;charset=utf-8</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

注:如果不开启springMVC注解,会出现一些意想不到的问题。例如:@GetMapping注解无效,@DateTimeFormat注解无效等

8、放行静态资源文件

8.1 在springMVC配置文件中配置
8.2 具体代码配置如下:
<!-- 放行静态资源文件 -->
<mvc:default-servlet-handler/>

注:放行后,过滤器和前端控制器将不会再进行拦截

三、配置Mybatis

1、数据源(使用druid连接池,DruidDataSource)

1.1 在springMybatis配置文件配置
1.2 给“DriverClassName”变量指定驱动
1.3 给“Url”变量指定数据库的url
1.4 给“Username”变量指定数据库的用户名
1.5 给“Password”变量指定数据库的密码
1.6 具体代码配置如下:
    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    	<!-- 驱动的类全名 -->
    	<property name="DriverClassName" value="#{jdbc.jdbcDriver}"/>
    	<!-- 数据库的url -->
    	<property name="Url" value="#{jdbc.jdbcUrl}"/>
    	<!-- 数据库的用户名 -->
    	<property name="Username" value="#{jdbc.jdbcUsername}"/>
    	<!-- 数据库的密码 -->
    	<property name="Password" value="#{jdbc.jdbcPassword}"/>
    </bean>

2、会话工厂(SqlSessionFactoryBean)

2.1 在springMybatis配置文件配置
2.2 给“DataSource”变量指定一个数据源(这里为druid连接池)
2.3 给“ConfigLocation”变量指定mybatis自身的配置文件(mybatis-config.xml),用于加载mybatis自身的配置
2.4 给“MapperLocations”变量指定mapper文件的路径,为后面的生成动态代理对象做准备
2.5 给“TypeAliasesPackage”变量指定扫描路径,相当于给指定包下的pojo对象起别名。typeAliasesPackage 默认只能扫描某一个路径下,或以逗号等分割的 几个路径下的内容,不支持通配符和正则
2.6 具体代码配置如下:
	<!-- 配置会化工厂 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 指定数据源 -->
		<property name="DataSource" ref="dataSource"/>
		<!-- 指定mybatis自身的配置文件 -->
		<property name="ConfigLocation" value="classpath:/mybatis/mybatis-config.xml"/>
		<!-- 指定mapper文件路径 -->
		<property name="MapperLocations" value="classpath*:/mybatis/mapper/*Mapper.xml"/>
		<!-- 指定扫描路径 -->
		<property name="TypeAliasesPackage" value="com.jt.manage.pojo"/>
	</bean>

注:会话工厂(SqlSessionFactory)是通过SqlSessionFactoryBean创建的,所有配置的是SqlSessionFactoryBean,而不是SqlSessionFactory

3、Mapper扫描(MapperScannerConfigurer)

3.1 在springMybatis配置文件配置
3.2 给“SqlSessionFactoryBeanName”变量指定一个会话工厂类,也可以不写,spring默认注入
3.3 给“”变量指定dao接口的包路径,主要用于扫描并生成对应的动态代理对象
3.4 具体代码配置如下:
<!-- 配置mapper扫描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 注入会化工厂 -->
		<property name="SqlSessionFactoryBeanName" value="sqlSessionFactory"/>
		<!-- 注入dao接口包路径 -->
		<property name="BasePackage" value="com.jt.**.dao"/>
	</bean>

注:MapperScannerConfigurer类会扫描指定的dao包下的接口,并关联对应的mapper动态生成代理对象,代理对象的“BeanId”默认为接口名(首字母小写)

4、Mybatis自身的配置(主要用来配置mybatis自身的某些功能,最后使用会话工厂来加载)

4.1 配置时需要注意标签的配置顺序,如果顺序颠倒会出现问题。可能配置无效或报错。将鼠标放在configuration标签上面会提示其他标签的配置顺序,具体如下:
	配置顺序	(properties?, settings?,typeAliases?,typeHandlers?,objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)

4.2 开启驼峰自动映射
	具体代码配置如下:
	<settings>
		<!-- 开启驼峰自动映射 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
	</settings>

四、配置Spring

1、事务控制

1.1 配置事务控制
具体配置如下:
<!-- 配置事务控制 -->
<tx:annotation-driven/>
1.2 定义事务管理器
具体配置如下:
	<!-- 定义事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="DataSource" ref="dataSource"></property>
	</bean>
1.3 定义事务策略
具体配置如下:
	<!-- 定义事务策略
		propagation="REQUIRED"  表示执行该方法必须添加事务
		propagation="SUPPORTS"  表示之前操作添加了事务,该方法也添加事务,否则该操作没有添加事务
		read-only="true"  表示该方法中只允许查询操作,如果其中存在增删改操作则会报错
	 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*"   propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="find*"   propagation="SUPPORTS" read-only="true"/>
			<tx:method name="*" 	  propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
	</tx:advice>
1.4	定义事务切面
具体配置如下:
	<!-- 定义事务切面
		pointcut*, advisor*, aspect*
		expression 切入点表达式
			within(包名.类名)	按类匹配,粗粒度
			execution(返回值的类型 包名.类名.方法名(参数列表))	细粒度
	 -->
	<aop:config>
		<!--  切入点 -->
		<aop:pointcut expression="execution(* com.jt.manage.service..*.*(..))" id="pc"/>
		<!-- 指定事务策略和切入点 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
	</aop:config>

2、导入properties配置文件的三种方式

2.1使用util:properties标签引入

2.1.1 这种引入只能同时引入一个或一批命名有规律并在同一个目录下的properties配置文件
2.1.2 具体代码配置如下:
<context:property-placeholder location="classpath:/property/*.properties"/>

2.2使用context:property-placeholder标签引入

2.2.1 这种引入只能同时引入一个或一批命名有规律并在同一个目录下的properties配置文件
2.2.2 具体代码配置如下:
<context:property-placeholder location="classpath:/property/*.properties"/>

2.3使用PropertyPlaceholderConfigurer类引入

2.3.1 这种引入可以同时引入一个或一批properties配置文件,其中配置文件不需命名有规律,路径也可以有不同。
2.3.2 具体代码配置如下:
<bean id="jdbc" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="Locations">
		<list>
			<value>classpath:/property/jdbc.properties</value>
		</list>
	</property>
</bean>

五、整体搭建

1、核心配置文件中引入其他的配置文件

1.1 核心配置文件中引入其他的配置文件,在服务器启动后由前端控制器一起加载
1.2 具体代码配置如下:
<!-- 引入其他的配置文件 -->
<import resource="classpath:/spring/spring-mybatis.xml"/>
<import resource="classpath:/spring/spring-mvc.xml"/>
<import resource="classpath:/spring/spring.xml"/>

2、包路径的创建

2.1 包括service、dao、controller等包。

3、配置Tomcat服务器插件,并配置tomcat启动。

3.1 在pom配置文件中添加Tomcat服务器插件配置
3.1.1 具体代码配置如下:
	<build>
		<plugins>
			<!-- 配置tomcat7服务器插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>80</port> <!-- 服务器端口号 -->
					<path>/</path> <!-- 工程访问路径,默认为项目名称 -->
				</configuration>
			</plugin>
		</plugins>
	</build>
3.2 配置Tomcat启动
3.2.1 具体操作如下:

SSM项目搭建的主要步骤-LMLPHP
SSM项目搭建的主要步骤-LMLPHP
SSM项目搭建的主要步骤-LMLPHP

10-06 17:45