原博主連接:( http://blog.csdn.net/zhshulin )php
使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已經有三個多月了,項目在技術上已經沒有什麼難點了,基於現有的技術就能夠實現想要的功能,固然確定有不少能夠改進的地方。以前沒有記錄 SSM 整合的過程, 此次剛恰好基於本身的一個小項目從新搭建了一次,並且比項目搭建的要更好一些。之前解決問題的過程和方法並無及時記錄,之後在本身的小項目中遇到我再整理分享一下。 此次 , 先說說 三大框架整合過程 。我的認爲使用框架並非很難,關鍵要理解其思想,這對於咱們提升編程水平頗有幫助。不過,若是用都不會,談思想就變成紙上談兵了!!! 先技術,再思想。實踐出真知。 (可經過圖片水印查看博客地址)html
Spring 是一個開源框架, Spring 是於 2003 年興起的一個輕量級的 Java 開發框架,由 Rod Johnson 在其著做 Expert One-On-One J2EE Development and Design 中闡述的部分理念和原型衍生而來。它是爲了解決企業應用開發的複雜性而建立的。 Spring 使用基本的 JavaBean 來完成之前只可能由 EJB 完成的事情。然而, Spring 的用途不只限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何 Java 應用均可以從 Spring 中受益。 簡單來講, Spring 是一個輕量級的控制反轉( IoC )和麪向切面( AOP )的容器框架。java
Spring MVC 屬於 SpringFrameWork 的後續產品,已經融合在 Spring Web Flow 裏面。 Spring MVC 分離了 控制器 、模型 對象 、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製。mysql
MyBatis 本是 apache 的一個開源項目 iBatis , 2010 年這個項目由 apache software foundation 遷移到了 google code ,而且更名爲 MyBatis 。 MyBatis 是一個基於 Java 的 持久層 框架。 iBATIS 提供的 持久層 框架包括 SQL Maps 和 Data Access Objects ( DAO ) MyBatis 消除了幾乎全部的 JDBC 代碼和參數的手工設置以及結果集的檢索。 MyBatis 使用簡單的 XML 或註解用於配置和原始映射,將接口和 Java 的 POJOs ( Plain Old Java Objects ,普通的 Java對象)映射成數據庫中的記錄。程序員
若是須要,參看以前的博文: http://blog.csdn.net/zhshulin/article/details/30779873web
若是須要,參看以前的博文: http://blog.csdn.net/zhshulin/article/details/37921705spring
下面主要介紹三大框架的整合,至於環境的搭建以及項目的建立,參看上面的博文。此次整合我分了 2 個配置文件 ,分別是 spring-mybatis.xml ,包含 spring 和 mybatis 的配置文件,還有個是 spring-mvc 的配置文件,此外有 2 個資源文件 : jdbc.propertis 和 log4j.properties 。完整目錄結構以下:sql
使用框架都是較新的版本 :數據庫
Spring 4.0.2 RELEASEapache
Spring MVC 4.0.2 RELEASE
MyBatis 3.2.6
爲了方便後面說的時候不須要引入JAR包,我這裏 直接給出全部須要的JAR包,這都是基本的JAR包 ,每一個包的是幹什麼的都有註釋,就再也不多說了。
pom.xml
<properties>
<!-- spring版本號 -->
<spring.version>4.0.2.RELEASE</spring.version>
<!-- mybatis版本號 -->
<mybatis.version>3.2.6</mybatis.version>
<!-- log4j日誌文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 表示開發的時候引入,發佈的時候不會加載此包 -->
<scope>test</scope>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<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>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 導入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- 導入Mysql數據庫連接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSTL標籤類 -->
<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>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</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 -->
<!-- 映入JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- 上傳組件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
</dependencies>
全部須要的 JAR 包都引入之後,首先進行 Spring 與 MyBatis 的整合,而後再進行 JUnit 測試,先看一個項目結構圖:
jdbc.properties (文件編碼修改成 utf-8 )
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://10.221.10.111:8080/db_zsl
username=demao
password=demao
#定義初始鏈接數
initialSize=0
#定義最大鏈接數
maxActive=20
#定義最大空閒
maxIdle=20
#定義最小空閒
minIdle=1
#定義最長等待時間
maxWait=60000
這個文件就是用來完成spring和mybatis的整合的。這裏面也沒多少行配置,主要的就是 自動掃描,自動注入,配置數據庫 。註釋也很詳細,你們看看就明白了。
spring-mybatis.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:p="http://www.springframework.org/schema/p" 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.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自動掃描 -->
<context:component-scan base-package="com.cn.hnust" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化鏈接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 鏈接池最大數量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 鏈接池最大空閒 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 鏈接池最小空閒 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 獲取鏈接最大等待時間 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合,不須要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自動掃描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/cn/hnust/mapping/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring會自動查找其下的類 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cn.hnust.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
爲了方便調試,通常都會使用日誌來輸出信息, Log4j是 Apache 的一個開放源代碼項目,經過使用Log4j,咱們能夠控制 日誌 信息輸送的目的地是 控制檯 、文件、 GUI 組件,甚至是套接口服務器、 NT 的事件記錄器、 UNIX Syslog 守護進程 等;咱們也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。
Log4j 的配置很簡單,並且也是 通用的 ,下面 給出一個基本的配置 ,換到其餘項目中也無需作多大的調整, 若是想作調整 或者想了解 Log4j 的各類配置,參看我 轉載的一篇博文 ,很詳細:
http://blog.csdn.net/zhshulin/article/details/37937365
下面給出配置文件目錄:
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/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.2.2,log4j不配也沒影響),咱們 已經完成了Spring和mybatis的整合 ,這樣咱們就能夠編寫一段測試代碼來試試是否成功了。
既然咱們須要測試,那麼咱們就須要創建在數據庫中創建一個測試表,這個表建的很簡單, SQL 語句爲:
DROP TABLE IF EXISTS `user_t`;
CREATE TABLE `user_t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(40) NOT NULL,
`password` varchar(255) NOT NULL,
`age` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*Data for the table `user_t` */
insert into `user_t`(`id`,`user_name`,`password`,`age`) values (1,'測試','sfasgfaf',24);
參考博文: http://blog.csdn.net/zhshulin/article/details/23912615
這個可根據表自動建立實體類、 MyBatis 映射文件以及 DAO 接口,固然,我 習慣將生成的接口名改成 IUserDao ,而不是直接用它生成的 UserMapper 。若是不想麻煩就 能夠不改 。完成後將文件複製到工程中。如圖:
目錄結構:
下面給出具體的內容:
IUserService.jave
package com.cn.hnust.service;
import com.cn.hnust.pojo.User;
public interface IUserService {
public User getUserById(int userId);
}
UserServiceImpl.java
package com.cn.hnust.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.cn.hnust.dao.IUserDao;
import com.cn.hnust.pojo.User;
import com.cn.hnust.service.IUserService;
@Service("userService")
public class UserServiceImpl implements IUserService {
@Resource
private IUserDao userDao;
@Override
public User getUserById(int userId) {
// TODO Auto-generated method stub
return this.userDao.selectByPrimaryKey(userId);
}
}
測試類 在src/test/java中創建 ,下面測試類中 註釋掉的部分是不使用 Spring 時,通常狀況下的一種測試方法 ;若是使用了 Spring 那麼就可使用註解的方式來引入配置文件和類,而後再將 service 接口對象注入,就能夠進行測試了。
若是測試成功,表示 Spring 和 Mybatis 已經整合成功了 。輸出信息使用的是 Log4j 打印到控制檯。
package org.zsl.testmybatis;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.fastjson.JSON;
import com.cn.hnust.pojo.User;
import com.cn.hnust.service.IUserService;
@RunWith(SpringJUnit4ClassRunner.class) //表示繼承了SpringJUnit4ClassRunner類
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class TestMyBatis {
private static Logger logger = Logger.getLogger(TestMyBatis.class);
// private ApplicationContext ac = null;
@Resource
private IUserService userService = null;
// @Before
// public void before() {
// ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// userService = (IUserService) ac.getBean("userService");
// }
@Test
public void test1() {
User user = userService.getUserById(1);
// System.out.println(user.getUserName());
// logger.info("值:"+user.getUserName());
logger.info(JSON.toJSONString(user));
}
}
測試結果:
至此, 完成Spring和mybatis這兩大框架的整合 ,下面在繼續進行SpringMVC的整合。
上面已經完成了2大框架的整合,SpringMVC的配置文件單獨放,而後在web.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:p="http://www.springframework.org/schema/p"
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.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自動掃描該包,使SpringMVC認爲包下用了@controller註解的類是控制器 -->
<context:component-scan base-package="com.cn.hnust.controller" />
<!--避免IE執行AJAX時,返回JSON出現下載文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 啓動SpringMVC的註解功能,完成請求和註解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON轉換器 -->
</list>
</property>
</bean>
<!-- 定義跳轉的文件的先後綴 ,視圖模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 這裏的配置個人理解是自動給後面action的方法return的字符串加上前綴和後綴,變成一個 可用的url地址 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置文件上傳,若是沒有使用文件上傳能夠不用配置,固然若是不配,那麼配置文件中也沒必要引入上傳組件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默認編碼 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 內存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
</beans>
這裏面對spring-mybatis.xml的引入以及配置的spring-mvc的Servlet就是爲了完成SSM整合,以前2框架整合不須要在此處進行任何配置。配置同樣有詳細註釋,很少解釋了。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
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和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 編碼過濾器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring監聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止Spring內存溢出監聽器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<servlet>
<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>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此處能夠能夠配置成*.do,對應struts的後綴習慣 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
至此已經完成了SSM三大框架的整合了,接下來測試一下,若是成功了,那麼恭喜你,若是失敗了,繼續調試吧, 做爲程序員就是不停的與BUG作鬥爭 !
showUser.jsp 此頁面僅輸出一下用戶名,完成一個 完整的簡單流程 。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>測試</title>
</head>
<body>
${user.userName}
</body>
</html>
UserController.java 控制器
package com.cn.hnust.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.cn.hnust.pojo.User;
import com.cn.hnust.service.IUserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
@RequestMapping("/showUser")
public String toIndex(HttpServletRequest request,Model model){
int userId = Integer.parseInt(request.getParameter("id"));
User user = this.userService.getUserById(userId);
model.addAttribute("user", user);
return "showUser";
}
}
輸入地址: localhost:8080/ 項目名稱 /user/showUser?id=1
至此,SSM三大框架的整合就完成了,在此基礎上可再添加其餘功能。