• u  三大框架基本概念

spring、SpringMVC、Mybatis

  • u  整合思路
  • u  环境准备
  • u  工程结构
  • u  SPRING + SPING MVC + MYBATIS 三大框架整合
    • ü  Mybatis和spring进行整合
    • ü  Spring整合service
    • ü  整合springMVC
    • ü  配置前端控制器
    • ü  编写登录页面
    • ü  数据库配置和日志配置
    • ü  项目部署

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)的容器框架。

  • SpringMVC:

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

  • 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      整合思路

SSM系统架构 :

spring将各层进行整合

  • 通过spring管理持久层的mapper(相当于dao接口)
  • 通过spring管理业务层service,service中可以调用mapper接口。
  • spring进行事务控制。
  • 通过spring管理表现层Handler,Handler中可以调用service接口。

mapper、service、Handler都是javabean。

第一步:整合dao层

ü     mybatis和spring整合,通过spring管理mapper接口。

ü     使用mapper的扫描器自动扫描mapper接口在spring中进行注册。

第二步:整合service层

ü     通过spring管理service接口。

ü     使用配置方式将service接口配置在spring配置文件中。

ü     实现事务控制。

第三步:整合springMVC

ü     由于springMVC是spring的模块,不需要和spring整合,直接把springMVC加入到项目中即可。

 

下面通过SSM框架实现一个登录样例,以更好理解框架整合。

3      环境准备

数据库环境:oracle 11g

准备一个用户表,如“userssm”有用户名和用户密码字段,表里插入几条用户数据,供登录验证使用。

java环境:jdk1.6

springMVC版本:spring 3.2

所需要的jar包:

数据库驱动包:ojdbc14.jar

mybatis的jar包

mybatis和spring整合包

log4j包

dbcp数据库连接池包

spring4.1.6所有jar包

jstl包

4      工程结构

5      SPRING + SPING MVC + MYBATIS 三大框架整合

5.1    Mybatis和spring进行整合

1.sqlMapConfig.xmlmybatis自己的配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

         <!-- 配置别名 -->

         <typeAliases>

                  <!-- 批量扫描别名 -->

                  <package name="com.inspur.ssm.pojo"></package>

         </typeAliases>

         <!-- 配置mapper:由于使用spring和mybatis的整合包进行mapper扫描,这里就不需要配置了,必须遵循:mapper.xml和mapper.java文件同名且在同一个目录 -->

<!-- <mapper></mapper> -->

</configuration>

2.applicationContext-dao.xml:(1)数据源(2)SqlSessionFactory(3)mapper扫描器

<!-- 加载配置文件db.properties中的内容,db.properties文件中key命名要有一定命名规则 -->

         <context:property-placeholder location="classpath:db.properties" />

         <!-- 数据源,使用dbcp -->

         <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

                  <property name="driverClassName" value="${jdbc.driver}" />

                  <property name="url" value="${jdbc.url}" />

                  <property name="username" value="${jdbc.username}" />

                  <property name="password" value="${jdbc.password}" />

                  <property name="maxActive" value="10" />

                  <property name="maxIdle" value="5" />

         </bean>

<!-- sqlSessionfactory -->

         <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

                  <!-- 加载mybatis的配置文件 -->

                  <property  name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"></property>

                  <!-- 数据源 -->

                  <property name="dataSource" ref="dataSource"></property>

         </bean>

         <!-- mapper批量扫描 -->

         <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

                  <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->

                  <property name="basePackage" value="com.inspur.ssm.mapper"></property>

                  <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>

         </bean>

3.pojo

public class Userssm {

    private String id;

    private String username;

    private String password;

    ……

    get/set……

}

4.Mapper.java

5.Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.inspur.ssm.mapper.UserssmMapper" >

   <select id="findUser" resultType="userssm" parameterType="userssm" >

    select  t1.id,

    t1.username,

    t1.role,

    t1.realname,

    t1.password

    from  USERSSM t1

    where   username = #{username}

    and password = #{password}

  </select>

 </mapper>

5.2    Spring整合service

让spring管理service接口

1.定义service接口

@Resource

public interface LoginService {

         //用户查询列表

         public Userssm findUser(Userssm userssm)throws Exception;

}

2.定义service实现类

@Service("loginService")

public class LoginServiceImpl implements LoginService{

         @Autowired

         private UserssmMapper userssmMapper;

         @Override

         public Userssm findUser(Userssm userssmQuery) throws Exception {

                  Userssm userssm = userssmMapper.findUser(userssmQuery);

                  if(userssm == null){

                          throw new Exception("用户信息不存在");

                  }else{

                          return userssm;

                  }

         }

}

3.在spring容器配置service(applicationContext-service.xml)

<!– 原来service配置方式 -->

<bean id=“loginService" class="com.inspur.ssm.service.impl.LoginServiceImpl"></bean>

注:后续整合springMVC,可以使用包扫描器将service配置取代。该步骤可以省略。

4.事务控制(applicationContext-transaction.xml

<!-- 事务管理器

对mybatis操作数据库的事务控制,spring使用jdbc的事务控制类 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<!-- 数据源

DataSource在applicationContext-dao.xml中配置了 -->

<property name="dataSource" ref="dataSource"></property>

</bean>

<!-- 通知 -->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

         <tx:attributes>

                  <tx:method name="save*" propagation="REQUIRED"/>

                  <tx:method name="delete*" propagation="REQUIRED"/>

                  <tx:method name="insert*" propagation="REQUIRED"/>

                  <tx:method name="update*" propagation="REQUIRED"/>

                  <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>

                  <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>

                  <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>

         </tx:attributes>

</tx:advice>

<!-- aop -->

<aop:config>

       <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.inspur.ssm.service.impl.*.*(..))"/>

</aop:config>

5.3    整合springMVC

1.SpringMVC配置

创建springmvc.xml文件,配置处理器映射器、适配器、视图解析器。

<!-- 可以扫描controller、service、... 这里让扫描controller,指定controller的包 -->

<context:component-scan base-package="com.inspur.ssm.*"></context:component-scan>

<!-- 静态资源解析 包括:js,css,img,html... -->

<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>

<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>

<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>

<mvc:resources location="/html/" mapping="/html/**"></mvc:resources>

<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置-->

<mvc:annotation-driven />

<!-- 视图解析器:解析jsp,默认使用jstl标签,classpath下的有jstl的包 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />

         <property name="prefix" value="/" />

         <property name="suffix" value=".jsp" />

</bean>

2.编写Controller(就是Handler)

LoginController.java

@Controller

public class LoginController {

         @Autowired

         private LoginService loginService;

         //登录

         @RequestMapping("/login")

         public String login(HttpServletRequest request, Userssm userssm) throws Exception{

                  Userssm user = null;

try{

         //调用service进行用户身份验证

         user = loginService.findUser(userssm);

}catch(Exception e){

         e.printStackTrace();

         request.setAttribute("message", e.getMessage());

}

if(user!=null){

         HttpSession session = request.getSession();

         //在session中保存用户身份信息

         session.setAttribute("user", user);

         //重定向到登录成功页面

         return "success";

}

         return "login";

}}

5.4    配置前端控制器 (web.xml)

1.Spring配置

<!-- 加载spring容器 -->

<context-param>

         <param-name>contextConfigLocation</param-name>

         <param-value>classpath:/spring/applicationContext-*.xml</param-value>

</context-param>

<listener>

         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

2.SpringMVC配置 

<!-- springMVC前端控制器DispatcherServlet -->

<servlet>

         <servlet-name>springmvc_rest</servlet-name>

         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

         <init-param>

                  <param-name>contextConfigLocation</param-name>

                  <param-value>classpath:/spring/springmvc.xml</param-value>

         </init-param>

         <load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

         <servlet-name>springmvc_rest</servlet-name>

         <url-pattern>/</url-pattern>

</servlet-mapping>

3.spring 提供的解决乱码方式

<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>

5.5    编写登录页面

注:success.jsp省略

5.6    数据库配置和日志配置

数据库配置示范:

jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@localhost:1521:xe

jdbc.username=zhou

jdbc.password=123456

日志配置示范:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c{1}:%L - %m%n

#在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error

log4j.rootLogger=DEBUG, stdout

6      项目部署

浏览器中输入访问地址 :http://localhost:8088/SSM/

12SSM整合的更多相关文章

  1. 分享知识-快乐自己:SpringMvc中的四种数据源及相关配置(整合快速集成开发)

     数据库连接: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://39.105.105.186:3306/SpringMybatis?us ...

  2. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  3. kindeditor4整合SyntaxHighlighter,让代码亮起来

    这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换 ...

  4. spring源码分析之freemarker整合

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...

  5. FullCalendar应用——整合农历节气和节日

    FullCalendar用来做日程管理功能非常强大,但是唯一不足的地方是没有将中国农历历法加进去,今天我将结合实例和大家分享如何将中国农历中的节气和节日整合到FullCalendar中,从而增强其实用 ...

  6. SAP CRM 将组件整合至导航栏中

    到现在,我们已经可以让组件独立地显示.我们只是运行它.让它显示在Web UI中.让我们把组件整合进导航栏,使我们可以在正常登录Web UI时访问它. 步骤一: 为你的UI组件主窗体创建一个内向插件. ...

  7. Atitit.你这些项目不都是模板吗?不是原创  集成和整合的方式大总结

    Atitit.你这些项目不都是模板吗?不是原创  集成和整合的方式大总结 1.1. 乔布斯的名言:创新即整合(Creativity is just connecting things).1 1.2. ...

  8. github入门到上传本地项目【网上资源整合】

    [在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...

  9. 三大框架SSH整合

    三大框架SSH整合 -------------------------------Spring整合Hibernate------------------------------- 一.为什么要整合Hi ...

随机推荐

  1. CentOS7 iso封装语句

    mkisofs -o /srv/neutron-controller.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot - ...

  2. PCB 内层负片散热PAD Symbols尺寸更改方法

    如下图这是我们熟悉的内层负片散热PAD Symbols,我们CAM制作时,为了满足PCB工厂生产制作能力,,会优化散热PAD尺寸,让热PAD的尺寸符合制作规范要求,通常我们只关注散热PAD的3个指标即 ...

  3. codevs1557 热浪(堆优化dijkstra)

    1557 热浪  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 德克萨斯纯朴的民眾们这个夏 ...

  4. [Swift通天遁地]三、手势与图表-(8)制作股市中常用的蜡烛图表

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. Linux 下文本查找技巧你掌握了吗?

    前言 之前介绍过很多linux下查找相关的命令,例如<Linux中的文件查找技巧>,<find命令高级用法>,<如何查看linux中文件打开情况-lsof命令>等等 ...

  6. go 成长路上的坑(1)

    一.先来看一段代码 package main import "fmt" type X struct{} func (x *X) test(){ println("h1&q ...

  7. 微信小程序调用微信支付

    1,首先我们先缕清支付的整个流程,详见https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3,第一 ...

  8. 题解报告:poj 3233 Matrix Power Series(矩阵快速幂)

    题目链接:http://poj.org/problem?id=3233 Description Given a n × n matrix A and a positive integer k, fin ...

  9. 【RTTI】java Class类详解

    RTTI (Run-Time Type Information)运行时类信息 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关j ...

  10. Python之IPython开发实践

    Python之IPython开发实践 1. IPython有行号. 2. Tab键自动完成,当前命名空间任何与已输入字符串相匹配的变量就会被找出来. 3. 内省机制,在变量前或者后面加上(?)问号,就 ...