使用SSM(Spring、SpringMVC和Mybatis)已經有三個多月了。專案在技術上已經沒有什麼難點了,基於現有的技術就能夠實現想要的功能。當然肯定有非常多能夠改進的地方。之前沒有記錄SSM整合的過程。這次剛剛好基於自己的一個小專案又一次搭建了一次,並且比專案搭建的要更好一些。曾經解決這個問題的過程和方法並沒有及時記錄。以後在自己的小專案中遇到我再整理分享一下。這次。先說說三大框架整合過程。
個人覺得使用框架並非非常難,關鍵要理解其思想,這對於我們提高程式設計水平非常有幫助。只是,假設用都不會。談思想就變成紙上談兵了!!!
先技術。再思想。實踐出真知。
(可通過圖片水印檢視部落格地址)
1、基本概念
1.1、Spring
Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架。由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。
它是為了解決企業應用開發的複雜性而建立的。Spring使用主要的JavaBean來完畢曾經僅僅可能由EJB完畢的事情。然而,Spring的用途不僅限於server端的開發。從簡單性、可測試性和鬆耦合的角度而言,不論什麼Java應用都能夠從Spring中受益。 簡單來說。Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
1.2、SpringMVC
Spring MVC屬於SpringFrameWork的興許產品,已經融合在Spring Web Flow裡面。Spring MVC 分離了控制器、模型物件、分派器以及處理程式物件的角色,這樣的分離讓它們更easy進行定製。
1.3、MyBatis
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物件)對映成資料庫中的記錄。
2、開發環境搭建
假設須要,參看之前的博文:http://blog.csdn.net/zhshulin/article/details/30779873
3、Maven Web專案建立
假設須要,參看之前的博文:http://blog.csdn.net/zhshulin/article/details/37921705
4、SSM整合
以下主要介紹三大框架的整合,至於環境的搭建以及專案的建立,參看上面的博文。這次整合我分了2個配置檔案,各自是spring-mybatis.xml,包括spring和mybatis的配置檔案。還有個是spring-mvc的配置檔案,此外有2個資原始檔:jdbc.propertis和log4j.properties。
完整資料夾結構例如以下(最後附上原始碼下載地址,不建議直接使用原始碼,由於此教程已經有了所有程式碼):
使用框架都是較新的版本號:
Spring 4.0.2 RELEASE
Spring MVC 4.0.2 RELEASE
MyBatis 3.2.6
4.1、Maven引入須要的JAR包
為了方便後面說的時候不須要引入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>
4.2、Spring與MyBatis的整合
全部須要的JAR包都引入以後,首先進行Spring與MyBatis的整合,然後再進行JUnit測試,先看一個專案結構圖:
4.2.1、建立JDBC屬性檔案
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
4.2.2、建立spring-mybatis.xml配置檔案
這個檔案就是用來完畢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>
4.2.3、Log4j的配置
為了方便除錯,一般都會使用日誌來輸出資訊,Log4j是Apache的一個開放原始碼專案,通過使用Log4j,我們能夠控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件。甚至是套介面server、NT的事件記錄器、UNIX Syslog守護程式等。我們也能夠控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加仔細地控制日誌的生成過程。
Log4j的配置非常easy,並且也是通用的,以下給出一個主要的配置,換到其它專案中也無需做多大的調整。假設想做調整或者想了解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.4、JUnit測試
經過以上步驟(到4.2.2,log4j不配也沒影響)。我們已經完畢了Spring和mybatis的整合,這樣我們就能夠編寫一段測試程式碼來試試是否成功了。
4.2.4.1、建立測試用表
既然我們須要測試。那麼我們就須要建立在資料庫中建立一個測試表,這個表建的非常easy,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);
4.2.4.2、利用MyBatis Generator自己主動建立程式碼
參考博文:http://blog.csdn.net/zhshulin/article/details/23912615
這個可依據表自己主動建立實體類、MyBatis對映檔案以及DAO介面。當然。我習慣將生成的介面名改為IUserDao。而不是直接用它生成的UserMapper。假設不想麻煩就能夠不改。完畢後將檔案拷貝到project中。
如圖:
4.2.4.3、建立Service介面和實現類
資料夾結構:
以下給出詳細的內容:
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);
}
}
4.2.4.4、建立測試類
測試類在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的整合。
4.3、整合SpringMVC
上面已經完畢了2大框架的整合,SpringMVC的配置檔案單獨放。然後在web.xml中配置整合。
4.3.1、配置spring-mvc.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>
4.3.2、配置web.xml檔案
這裡面對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>
4.3.3、測試
至此已經完畢了SSM三大框架的整合了。接下來測試一下。假設成功了,那麼恭喜你,假設失敗了。繼續除錯吧。作為程式猿就是不停的與BUG做鬥爭!
4.3.3.1、新建jsp頁面
showUser.jsp 此頁面僅輸出一下username,完畢一個完整的簡單流程。
<%@ 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>
4.3.3.2、建立UserController類
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";
}
}
4.3.3.3、部署專案
輸入地址:localhost:8080/專案名稱/user/showUser?id=1
至此。SSM三大框架的整合就完畢了,在此基礎上可再加入其它功能。
原始碼下載地址:http://download.csdn.net/detail/u012909091/7658611
(轉載註明出處:http://blog.csdn.net/zhshulin)