使用 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的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java 應用都可以從 Spring 中受益。 簡單來說, Spring 是一個輕量級的控制反轉(IoC )和麵向切面( AOP )的容器框架。
1.2、SpringMVC
Spring MVC 屬於 SpringFrameWork 的後續產品,已經融合在Spring Web Flow 裡面。 Spring MVC 分離了 控制器 、模型 物件 、分派器以及處理程式物件的角色,這種分離讓它們更容易進行定製。
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、開發環境搭建
如果需要,參看之前的博文:blog.csdn.net/zhshulin/ar…
3、Maven Web專案建立
如果需要,參看之前的博文:blog.csdn.net/zhshulin/ar…
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.64.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 元件,甚至是套介面伺服器、 NT 的事件記錄器、 UNIX Syslog 守護程式 等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。
Log4j 的配置很簡單,而且也是 通用的 ,下面 給出一個基本的配置 ,換到其他專案中也無需做多大的調整, 如果想做調整 或者想了解 Log4j 的各種配置,參看我 轉載的一篇博文 ,很詳細: blog.csdn.net/zhshulin/ar… 下面給出配置檔案目錄:
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、建立測試用表
既然我們需要測試,那麼我們就需要建立在資料庫中建立一個測試表,這個表建的很簡單, 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自動建立程式碼
參考博文: blog.csdn.net/zhshulin/ar… 這個可根據表自動建立實體類、 MyBatis 對映檔案以及 DAO 介面,當然,我習慣將生成的介面名改為 IUserDao ,而不是直接用它生成的 UserMapper 。如果不想麻煩就 可以不改 。完成後將檔案複製到工程中。如圖:
4.2.4.3、建立Service介面和實現類
目錄結構:
下面給出具體的內容: IUserService.javepackage 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 此頁面僅輸出一下使用者名稱,完成一個 完整的簡單流程 。<%@ 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三大框架的整合就完成了,在此基礎上可再新增其他功能。(轉載註明出處: blog.csdn.net/zhshulin )