SSM框架整合

SSM框架整合,即Spring---SpringMVC---MyBatis 三個框架整合,在整合框架之前,首先,你得對三個框架都有基礎的瞭解。

Spring

Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。我們可以將創建對象的權限交給IoC,IoC將自動對我們需要的對象進行裝配和初始化。

MyBatis

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis主要工作在Dao層,用於連接數據庫。

SpringMVC

Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊,SpringMVC是廣義的Spring下的一個框架。SpringMVC主要用於Servlet層(Controller層)。

整合原理:

SSM整合,其實就是將MyBatis的管理權交給Spring,然後在Spring中嵌套SpringMVC。由於Spring和SpringMVC都是同一個公司下的框架,因此不存在整合的道理,採用嵌套。整個整合的過程中,Spring是最大的管理者。

首先是 Spring整合MyBatis:在以往的純MyBatis項目中,我們是通過MyBatis創建一個SqlSessionFactory,然後通過SqlSessionFactory創建一個SqlSession,通過SqlSession加載映射的接口文件創建一個StudentMapper對象,然後再進行對學生信息的增刪改查。思路如下:

SqlSessionFactory  --->  SqlSession  ---> StudentMapper  ---> CRUD

所以最重要的就是SqlSessionFactory,Spring整合MyBatis其實就是將MyBatis的SqlSessionFactory交給Spring管理。

其次是Spring嵌套SpringMVC: 在Spring中嵌套SpringMVC,就是在原有基礎上加上web文件,並配置web.xml和dispatcher-servlet.xml文件。

 

實現步驟:

一,需要的架包:

除了基礎的Spring、SpringMVC、MyBatis架包之外,還需要整合架包。如下:

  • mybatis-spring.jar  
  • commons-logging.jar
  • commons-dbcp.jar
  • mysql-connector-bin.jar
  • log4j.jar
  • commons-pool.jar

其中最後一個架包尤其注意,很多情況下tomcat啓動不了就是因爲下載了commons-pool2.jar,因此要尤其注意,能選擇2.x版本的架包。爲了方便我用idea創建一個SpringMVC項目。

我們就不必導入spring和springMVC的包,idea會自動給我們下載好。我們只需要加入MyBatis和整合包即可。

 

二,配置tomcat,創建Student表、Student類以及映射文件

項目的路徑結構如圖所示:

src下面分了四層,分別爲:

controller層:功能上和之前的servlet層一樣,主要負責和jsp前段頁面交互信息。

entity層:存放POJOs類。

mapper層:存放映射文件和接口文件。

service層:向上和controller層交互信息,向下和mapper層交互信息。

web目錄下有一下文件:

1,WEB-INF下面存放的是配置文件。

2,view下面存放的是響應文件。

3,web文件夾下面的文件。


 

package com.krt.entity;

public class Student {
    private int id;
    private String name;
    private int age;


    public Student() {

    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{ id="+id+", name='"+name+"', age="+age+"}";
    }
}

我只定義一個查詢語句,StudentMapper.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.krt.mapper.StudentMapper">


    <!--查詢學生-->
    <select id="selectStu" resultType="com.krt.entity.Student" parameterType="int">
        select * from student where id = #{id}
    </select>


</mapper>

相應的StudentMapper接口映射文件代碼如下:

package com.krt.mapper;

import com.krt.entity.Student;

public interface StudentMapper {

    Student selectStu(int id);

}

 

三,Spring整合MyBatis

1,首先建立一個applicationContext.xml文件用於整合MyBatis

<!--配置數據庫信息,替代mybatis的配置文件conf.xml-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

該代碼用於配置數據庫信息,將MyBatis連接數據庫的信息,放在bean中。

<!--加載db.properties文件-->
    <bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <array>
                <value>db.properties</value>
            </array>
        </property>
    </bean>

該代碼用於將外部的db.properties文件導入

db.properties文件代碼如下:

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username = root
jdbc.password = root
<!--配置MyBatis需要的核心類,SqlSessionFactory-->
    <!--在SpringIoc容器中創建MyBatis的核心類SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--加載mapper.xml路徑-->
        <property name="mapperLocations" value="classpath:com/krt/mapper/*.xml" />
    </bean>

該代碼用於在Spring容器中創建SqlSessionFactory bean,將MyBatis的SqlSessionFactory控制權交給Spring。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!--指定批量產生哪個包中的mapper對象-->
        <property name="basePackage" value="com.krt.mapper" />
        <!--
            basePackage所在的property的作用
            將com.krt.mapper包中,所有的接口產生與之對應的動態代理對象
            (對象名就是首字母小寫的接口名)
        -->
    </bean>

該代碼的作用是將SQL語句的映射文件加載到SqlSessionFactory中。

完整applicationContext.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"
       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">


    <!--依賴注入:給service注入dao-->
    <bean id="selectService" class="com.krt.service.Impl.SelectService">
        <property name="studentMapper" ref="studentMapper" />
    </bean>

    <!--給controller注入service-->
    <!--<bean id="studenthandler" class="com.krt.controller.Studenthandler">
        <property name="selectService" ref="selectService" />
    </bean>-->

    <!--MyBatis的配置信息(數據源,mapper.xml)控制權交給spring-->
    <!--加載db.properties文件-->
    <bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <array>
                <value>db.properties</value>
            </array>
        </property>
    </bean>

    <!--配置數據庫信息,替代mybatis的配置文件conf.xml-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!--<context:property-placeholder location="WEB-INF/db.properties"/>-->

    <!--配置MyBatis需要的核心類,SqlSessionFactory-->
    <!--在SpringIoc容器中創建MyBatis的核心類SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--加載mapper.xml路徑-->
        <property name="mapperLocations" value="classpath:com/krt/mapper/*.xml" />
    </bean>

    <!--將MyBatis的SqlSessionFactory交給Spring-->
    <!--Spring整合MyBatis -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!--指定批量產生哪個包中的mapper對象-->
        <property name="basePackage" value="com.krt.mapper" />
        <!--
            basePackage所在的property的作用
            將com.krt.mapper包中,所有的接口產生與之對應的動態代理對象
            (對象名就是首字母小寫的接口名)
        -->
    </bean>
    
</beans>

然後,我們應該將整合後的Sping放入web.xml文件中,

<!--Web項目中引入整合後的spring-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

至此,Spring整合MyBatis就整合好了,然後就是Spring嵌套SpringMVC。

四,配置SpringMVC文件:

首先配置web.xml文件,將所有的頁面請求,全部發送給DispatcherServlet處理。web.xml代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--Web項目中引入整合後的spring-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <!--監聽器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--攔截器-->
    <!--攔截所有請求,將所有請求交給DispatcherServlet處理-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--歡迎頁-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

</web-app>

 

其次是配置SpringMVC的配置文件,主要就是配置視圖解析器和掃描註解。

diapatcher-servlet.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:mvc="http://www.springframework.org/schema/mvc"
       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/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--掃描有註解的包文件-->
    <context:component-scan base-package="com.krt.controller"/>

    <!--配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!--SpringMVC基礎配置-->
    <mvc:annotation-driven></mvc:annotation-driven>


</beans>

五,實例驗證:

我們寫一個login.jsp用於發出請求,寫一個a標籤。

login.jsp代碼如下:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SSM整合</title>
</head>
<body>
    <a href="selectStudent">---SSM整合---</a>
</body>
</html>

jsp頁面將請求發送給controller層,因此,我們在controller建一個文件接收請求

Studenthandler.java代碼如下:

package com.krt.controller;

import com.krt.entity.Student;
import com.krt.service.Impl.SelectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

@Controller
public class Studenthandler {
    //控制器依賴於service

    @Autowired
    @Qualifier("selectService")
    private SelectService selectService;

    public void setSelectService(SelectService selectService) {
        this.selectService = selectService;
    }


    @RequestMapping("selectStudent")
    public String selectStudent(Map<String, Object> map){
        Student s= selectService.selectStudent(3);
        //該map會將數據放入request的作用域中,一共後面調用。
        map.put("student", s);

        return "result";
    }

}

a標籤發出的請求將會被selectStudent方法攔截,

至此,我們的controller層(servlet)寫好了,mapper層(dao)也寫好了,entity層也寫好了,還差一下service層。

然後,我們創建service層,新建一個接口selectStudent,規範繼承類的結構:

代碼如下:

package com.krt.service;

import com.krt.entity.Student;

public interface SelectStudent {
    Student selectStudent(int id);

}

其次,我們在service層新建文件夾Impl,用於存放接口的實現類。SelectService.java代碼如下:

package com.krt.service.Impl;

import com.krt.entity.Student;
import com.krt.mapper.StudentMapper;
import com.krt.service.SelectStudent;

public class SelectService implements SelectStudent {
    //service依賴於dao(mapper)
    private StudentMapper studentMapper;

    public void setStudentMapper(StudentMapper studentMapper) {
        this.studentMapper = studentMapper;
    }

    @Override
    public Student selectStudent(int id) {
        Student s = studentMapper.selectStu(id);
        return s;
    }

}

我們可以在applicationContext.xml中加入一個bean,這樣我們就不需要初始化studentMapper變量,Spring會給我們自動注入。

<!--依賴注入:給service注入dao-->
    <bean id="selectService" class="com.krt.service.Impl.SelectService">
        <property name="studentMapper" ref="studentMapper" />
    </bean>

這和controller層中的Studenthandler.java中的 @Autowired 註解的功能是一樣,只是,加上該註解,Spring會給我們自動去獲取和該類下面的變量名相同的id的bean,給我們注入。

最後我們創建result.jsp文件

<%--
  Created by IntelliJ IDEA.
  User: krt
  Date: 2019/3/19
  Time: 12:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${student.id}--
    ${student.name} --
    ${student.age} --
</body>
</html>

該文件用到了C標籤,需要導入C標籤的架包:

然後,我們啓動tomcat,

SSM項目就搭建好了。

參看這篇博客在測試的過程中,總會遇到各種問題:

                                                                                         要靜下心,耐住性

                                                                                                                              --------致程序員

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章