使用普通的maven web工程整合SSM
以簡(jiǎn)單的查詢和保存操作為例進(jìn)行整合SSM凡怎,SSM整合可以使用多種方式,這里使用十分流行且方便簡(jiǎn)單的XML+注解 的方式進(jìn)行整合。
【*】整合的總體思路
- 搭建整合環(huán)境
- 搭建Spring環(huán)境配置
- 使用Spring整合SpringMVC
- 使用Spring整合MyBatis
SSM整合思路.png
【*】項(xiàng)目結(jié)構(gòu)圖
SSM項(xiàng)目整合結(jié)構(gòu)圖.png
一、搭建整合環(huán)境
1). 數(shù)據(jù)庫(kù)準(zhǔn)備
create database ssm;
use ssm;
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
2). 創(chuàng)建maven工程
此處使用普通的,沒(méi)有繼承的maven web工程挡爵,后期使用maven高級(jí)功能進(jìn)行改造
1. pom.xml文件中的坐標(biāo)依賴
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<dependencies>
<!-- spring -->
<!-- aop相關(guān)的 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springMVC -->
<dependency>
<groupId>org.springframework</groupId>
<!-- 內(nèi)部提供了一個(gè)監(jiān)聽(tīng)器,監(jiān)聽(tīng)servletContext域的創(chuàng)建甚垦,用于加載spring配置文件 -->
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 事務(wù)管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- el表達(dá)式 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<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.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
2. 編寫(xiě)domain下的Account實(shí)體類
public class Account implements Serializable {
private Integer id;
private String name;
private Double money;
... get/set/構(gòu)造/toString代碼略...
3. 編寫(xiě)dao層的AccountDao接口
順便使用注解配置代理對(duì)象增強(qiáng)的內(nèi)容茶鹃。
/** 賬戶dao接口 */
@Repository
public interface AccountDao {
/** 查詢所有賬戶信息 */
@Select("select * from account")
public List<Account> findAll();
/** 保存賬戶信息 */
@Insert("insert into account (name, money) values (#{name}, #{money})")
public void saveAccount(Account account);
}
4. 編寫(xiě)service層的AccountService接口和實(shí)現(xiàn)類AccountServiceImpl
public interface AccountService {
/** 查詢所有 */
public List<Account> findAll();
/** 保存賬戶信息 */
public void saveAccount(Account account);
}
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public List<Account> findAll() {
System.out.println("業(yè)務(wù)層:查詢所有信息");
return accountDao.findAll();
}
@Override
public void saveAccount(Account account) {
System.out.println("業(yè)務(wù)層:保存賬戶信息");
accountDao.saveAccount(account);
}
}
5. 編寫(xiě)web層的控制器AccountController
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首頁(yè)</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/account/findAll">測(cè)試查詢</a>
<hr>
<h1>保存用戶</h1>
<form action="${pageContext.request.contextPath}/account/save">
姓名:<input type="text" name="name"> <br>
余額:<input type="number" name="money"> <br>
<input type="submit" value="提交保存">
</form>
</body>
</html>
- 控制器代碼
/** web層控制器 */
@Controller
@RequestMapping("/account")
public class AccountController {
/** spring的依賴注入 */
@Autowired
private AccountService accountService;
/** 查詢所有 */
@RequestMapping("/findAll")
public String findAll(Model model) {
System.out.println("表現(xiàn)層:查詢所有");
// 調(diào)用service層
List<Account> accounts = accountService.findAll();
// 存入域中
model.addAttribute("accounts", accounts);
return "accounts";
}
/** 保存用戶 */
@RequestMapping("/save")
public void save(Account account,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
accountService.saveAccount(account);
response.sendRedirect(request.getContextPath() + "/account/findAll");
return;
}
}
- accounts.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>查詢所有</title>
</head>
<body>
<c:forEach items="${accounts}" var="account">
${account.name} : ${account.money} <br>
</c:forEach>
</body>
</html>
3). 配置log4j.properties配置文件
配置文件放在resources目錄下
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
二、Spring框架代碼的編寫(xiě)以及整合MyBatis
1). 搭建Spring的開(kāi)發(fā)環(huán)境艰亮、整合MyBatis闭翩、事務(wù)配置
在sources文件夾下創(chuàng)建Spring的配置文件applicationContext.xml,由于Spring中整合了MyBatis迄埃,所以不需要再單獨(dú)編寫(xiě)SqlMapConfig.xml配置文件了
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 開(kāi)啟注解的掃描,希望只處理service和dao,controller不需要Spring框架去處理 -->
<context:component-scan base-package="cn.itcast">
<!-- 配置哪些注解不掃描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- Spring整合MyBatis框架疗韵,將SqlMapConfig.xml配置轉(zhuǎn)入spring中進(jìn)行整合,存入IOC容器中
所以就不需要SqlMapConfig.xml配置文件了-->
<!-- 配置連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///ssm"/>
<property name="user" value="root"/>
<property name="password" value="abc123"/>
</bean>
<!-- 配置SqlSessionFactory工廠 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置AccountDao接口所在包 -->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itcast.dao"/>
</bean>
<!-- 配置Spring框架聲明式事務(wù)管理器 -->
<!-- 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事務(wù)通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!-- 配置AOP增強(qiáng)侄非,配置切入點(diǎn) -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.service.impl.*ServiceImpl.*(..))"/>
</aop:config>
</beans>
2). 編寫(xiě)測(cè)試類進(jìn)行測(cè)試
public class SpringTest {
@Test
public void run1() {
// 加載配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// 獲取對(duì)象
AccountService service = (AccountService)ac.getBean("accountService");
// 調(diào)方法
service.findAll();
service.saveAccount(new Account());
}
}
三蕉汪、Spring整合SpringMVC
Spring整合SpringMVC介紹.png
1). 編寫(xiě)SpringMVC的配置文件springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 開(kāi)啟注解掃描流译,只掃描Controller -->
<context:component-scan base-package="cn.itcast">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 配置視圖解析器對(duì)象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 過(guò)濾靜態(tài)資源,使其不用經(jīng)過(guò)編碼過(guò)濾器的處理 -->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<!-- 開(kāi)啟SpringMVC注解的支持 -->
<mvc:annotation-driven/>
</beans>
2). 配置web.xml配置文件
- 利用Spring提供的的監(jiān)聽(tīng)器肤无,監(jiān)聽(tīng)ServletContext域(最大域)的創(chuàng)建先蒋,加載spring的配置文件applicationContext.xml骇钦,創(chuàng)建IOC容器宛渐。MyBatis被整合后,其bean都存放于IOC容器中眯搭。
- 配置解決中文亂碼問(wèn)題的過(guò)濾器
- 配置前端控制器窥翩,初始化加載springMVC的配置文件springmvc.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<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">
<display-name>Archetype Created Web Application</display-name>
<!-- 配置Spring的監(jiān)聽(tīng)器,來(lái)自spring-web坐標(biāo),監(jiān)聽(tīng)ServletContext域的創(chuàng)建
默認(rèn)只加載WEB-INF目錄下的applicationContext.xml配置文件
解決方案:設(shè)置配置文件的路徑 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 設(shè)置被加載的配置文件的路徑 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 解決中文亂碼的過(guò)濾器 -->
<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>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加載springmvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 啟動(dòng)服務(wù)器鳞仙,創(chuàng)建該servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
四寇蚊、Spring整合MyBatis
見(jiàn)配置Spring的配置文件applicationContext.xml