MyBatis代码实例系列-05:Mybatis初步整合Spring + Spring MVC框架,实现Web请求实例

超级通道:MyBatis代码实例系列-绪论

本章主要记录Mybatis初步整合Spring + Spring MVC框架(只是初步),实现Web请求实例。涉及到的技术有:

  1. 通过SqlSessionFactoryBean的的DataSource结合Spring的DataSource,替代MyBatis配置文件的DataSource
  2. 通过SqlSessionFactoryBean的mapperLocations,替代MyBatis配置文件的mappers配置
  3. 通过SqlSessionFactoryBean的typeAliasesPackage,替代MyBatis配置文件的typeAliases配置
  4. 通过Spring的DataSourceTransactionManager,替代MyBatis配置文件的JdbcTransactionManager配置
  5. 通过MapperScannerConfigurer的sqlSessionFactoryBeanName,替代MyBatis建立会话工厂的new SqlSessionFactoryBuilder().build(reader)方式。
  6. 通过MapperScannerConfigurer的basePackage,替代MyBatis实例化Dao层对象的sqlSession.getMapper(IDAO.class)方式
  7. tx:annotation-driven:Spring事务控制开启注解,通过@Transactional注解Service层方法,实现事务控制。
  8. JsonResult:以泛型定义返回值的数据结构,实现复用。
  9. ShowList:打印对象列表的工具类。

0. 实例说明

本章是以MyBatis代码实例系列-03:MyBatis单张表简单实现增删改查 + log4j + 手动事务控制为基础,进行MyBatis与Spring以及Spring MVC的初步整合,以达到实现Web请求的目的。通过对比前后两种实现方式,能够更好地理解单用MyBatis框架与使用SSM框架组合的区别,更深入的理解各类框架。

业务场景与SQL参考MyBatis代码实例系列-03:MyBatis单张表简单实现增删改查 + log4j + 手动事务控制

1.单独使用MyBatis的配置方式

配置方法详见MyBatis代码实例系列-03:MyBatis单张表简单实现增删改查 + log4j + 手动事务控制。此处只给出关键部分。

1.1.目录结构

src
\---main
    \---java
    |   \---pers
    |       \---hanchao
    |           \---himybatis
    |               \---curd
    |                   \---Topic.java
    |                   \---ITopicDAO.java
    |                   \---TopicApp.java
    \---webapp
        \---mybatis-mappers
            \---Topic.xml
        \---log4j.properties
        \---mybatis-config.xml

1.2.MyBatis配置文件mybatis-config.xml

<?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">
<!--MyBatis的总配置文件-->
<configuration>
    <!--类型依赖:配置Java类对应的别名,与Question.xml中的resultType相互对应-->
    <typeAliases>
        <!--通过XML+IDAO的配置方式,实现单表的增删改查-->
        <typeAlias type="pers.hanchao.himybatis.curd.Topic" alias="Topic"/>
    </typeAliases>
    <!--mybatis的数据库连接-->
    <environments default="dev">
        <environment id="dev">
            <!--事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源信息-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/exam?useSSL=false"/>
                <property name="username" value="****"/>
                <property name="password" value="****"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射xml的路径配置-->
    <mappers>
        <mapper resource="mybatis-mappers/Topic.xml"/>
    </mappers>
</configuration>

1.3.业务类TopicApp.java

package pers.hanchao.himybatis.curd;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>通过XML+IDAO配置MyBatis,实现单表的增删改查</p>
 * @author hanchao 2018/1/27 0:35
 **/
public class TopicApp {
    /** SqlSessionFactory用于创建SqlS */
    private static SqlSessionFactory sqlSessionFactory;
    /** Reader用于读取配置文件 */
    private static Reader reader;
    private static final Logger LOGGER = Logger.getLogger(TopicApp.class);

    static{
        try{
            //读取MyBatis总配置文件
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            //根据配置文件创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.error("加载MyBatis配置文件出错!");
        }
    }

    /**
     * <p>简单的增删改查</p>
     * @author hanchao 2018/1/27 0:37
     **/
    public static void main(String[] args) {
        //创建数据库会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            //调用IDAO
            ITopicDAO topicDAO = sqlSession.getMapper(ITopicDAO.class);
            //查询所有的话题
            showTopicList(topicDAO.queryTopicList());

             //新增一个话题
            Topic topic = new Topic(1,"題目1",100,"答案1");
            topicDAO.insertTopic(topic);
            LOGGER.info("新增一个话题:" + topic.toString());
            //查询所有的话题
            showTopicList(topicDAO.queryTopicList());

            //修改一個话题
            topic = new Topic(1,"题目1",88,"答案1111");
            topicDAO.updateTopic(topic);
            LOGGER.info("修改一个话题:" + topic.toString());
            //查询所有的话题
            showTopicList(topicDAO.queryTopicList());

            //删除一个话题
            topicDAO.deleteTopic(1);
            LOGGER.info("删除一个话题:id = 1");
            //查询所有的话题
            showTopicList(topicDAO.queryTopicList());

            //新增5个话题
            for (int i = 0; i < 5; i++) {
                int index = 5 + i;
                topic = new Topic(index,"题目" + index,60 + index,"答案" + index);
                topicDAO.insertTopic(topic);
                LOGGER.info("新增一个话题:" + topic.toString());
            }
            //查询所有的话题
            showTopicList(topicDAO.queryTopicList());

            //查询一个题目
            Topic topic1 = topicDAO.queryTopicById(9);
            LOGGER.info("查询一个话题,id = 9,result:" + topic1.toString());
            //事务提交
            sqlSession.commit();
        }catch (Exception e){
            //事务回滚
            sqlSession.rollback();
        }finally {
            //关闭连接
            sqlSession.close();
        }
    }

    /**
     * <p>打印所有话题</p>
     * @author hanchao 2018/1/27 0:21
     **/
    private static void showTopicList(List<Topic> topicList) {
        LOGGER.info("===================================显示当前所有话题===================================");
        //如果List无值,则打印无信息
        if (null == topicList || topicList.size() == 0){
            LOGGER.info("暂无话题.");
        }else {
            for (Topic topic : topicList){
                LOGGER.info(topic.toString());
            }
        }
        LOGGER.info("====================================================================================\n");
    }
}

通过上面的实例代码,可以总结:在单独使用MyBatis时,如需完成一次数据库操作,出了一些必要工作,如编写实体类、XML映射文件和IDAO类等,至少还需要进行三大步骤操作:

  1. 配置mybatis-config.xml,配置项至少需要有:

    • typeAliases:类型依赖别名配置
    • dataSource:数据库连接信息配置
    • mapper:XML映射文件配置
  2. 在业务代码中获取DAO层实现类对象,一般流程如下:

    • 通过Reader读取配置文件mybatis-config.xml
    • 通过配置文件信息,创建SqlSessionFactory,即SQL会话工厂
    • 通过SQL会话工厂开启数据库连接会话,即SqlSession
    • 通过数据库连接会话获取映射的DAO层实现类对象
  3. 通过DAO层实现类对象进行数据库查询与事务控制,一般流程如下:

    • 执行数据库操作方法
    • 如果执行成功,就进行事务提交(commit)
    • 如果执行失败,就进行事务回滚(rollback)
    • 无论失败还是成功,最后都需要关闭事务(close)

可以发现,如果单独使用MyBatis实现业务功能,有以下不方便之处:

  1. 每当有新的实体类产生时,都需要进行typeAliases和mapper的配置。
  2. 在每个业务操作类中,都需要进行mybatis-config.xml的读取、SqlSessionFactory的创建、SqlSession的开启等操作。
  3. 每次涉及事务操作,都需要手动进行commit、rollback和close。

很多代码都是重复的,都可以抽取出来进行处理。当然可以自己动手实现,不过根据“不要重复造轮子”的原则,这里更推荐通过SSM进行整合,减少重复代码处理。

通过初步整合SSM之后,如需完成一次数据库操作,只需要在业务类中调用数据库操作方法即可,上面的其他步骤都交由Spring进行管理。

下面介绍对SSM的初步整合。

2.SSM初步整合的配置方式

2.1.目录结构

src
\---main
    \---java
    |   \---pers
    |       \---hanchao
    |           \---himybatis
    |               \---curd
    |               |   \---Topic.java
    |               |   |---ITopicDAO.java
    |               |---curd
    |                    \---TopicController.java
    |                    |---TopicService.java
    \---resources
    |   \---mybatis-mappers
    |   |   \---Topic.xml
    |   |---log4j.properties
    |   |---jdbc.properties
    |    |---applicationContext.xml
    |   |---spring-mybatis-jdbc.xml
    \---webapp
        \---ssm
        |   \---topic.jsp
        |---WEB-INF
        |   \---web.xml
        |    |---spring-mvc-servlet.xml
        |---index.jsp

通过对比之前的目录结构:

  1. 实体类Topic.java、DAO层接口ITopicDAO.java和XML映射文件Topic.xml都没无变化
  2. 业务操作类由原来的TopicApp.java替换成了TopicController.java和TopicService.java
  3. 移除了MyBatis的配置文件:mybatis-config.xml,由下面两个配置文件进行替代:
    • 数据库连接信息属性文件:jdbc.properties
    • Spring与MyBatis的配置文件:spring-mybatis-jdbc.xml
  4. 新增了Spring的总配置文件:applicationContext.xml
  5. 新增了Spring MVC的总配置文件:spring-mvc-servlet.xml
  6. 新增了Web项目的启动文件:web.xml
  7. 新增了Web项目的首页:index.jsp
  8. 新增了业务页面:topic.jsp

2.2.MyBatis的整合

MyBatis的原来的方式:

mybatis-config.xml + TopicApp.java

SSM中MyBatis的使用方式:

spring-mybatis-jdbc.xml + jdbc.properties + TopicController.java + TopicService.java

下面这些文件进行说明:

2.2.1.spring-mybatis-jdbc.xml

spring-mybatis-jdbc.xml的作用可以总结如下:

1. 通过SqlSessionFactoryBean的的DataSource结合Spring的DataSource,替代MyBatis配置文件的DataSource
2. 通过SqlSessionFactoryBean的mapperLocations,替代MyBatis配置文件的mappers配置
3. 通过SqlSessionFactoryBean的typeAliasesPackage,替代MyBatis配置文件的typeAliases配置
4. 通过Spring的DataSourceTransactionManager,替代MyBatis配置文件的JdbcTransactionManager配置
5. 通过MapperScannerConfigurer的sqlSessionFactoryBeanName,替代MyBatis建立会话工厂的new SqlSessionFactoryBuilder().build(reader)方式。
6. 通过MapperScannerConfigurer的basePackage,替代MyBatis实例化Dao层对象的sqlSession.getMapper(IDAO.class)方式

具体看配置

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

    <!--数据源配置-->
    <!--通过property-placeholder获取属性文件配置的值-->
    <context:property-placeholder file-encoding="utf-8" location="classpath:jdbc.properties"/>
    <!--配置DataSource-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <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>
    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--用Spring的dataSource替代原mybatis-config.xml的dataSource-->
        <property name="dataSource" ref="dataSource"/>
        <!--配置MyBatis总配置文件,如果通过其他配置取代了所有的MyBatis配置,则可以不要此项配置-->
        <!--<property name="configLocation" value="classpath:mybatis-config.xml"/>-->
        <!--配置MyBatis映射文件,取代原mybatis-config.xml的mappers配置-->
        <property name="mapperLocations" value="classpath:mybatis-mappers/*.xml"/>
        <!--配置类型别名,取代原mybatis-config.xml的typeAliases,最好将实体放在同一类型的包下-->
        <property name="typeAliasesPackage" value="pers.hanchao.himybatis.curd"/>
    </bean>
    <!--配置IDAO接口所在扫描路径,主要MyBatis映射文件里要配置正确的IDAO路径-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--配置扫描IDAO的路径,替代原MyBatis的ITopicDAO topicDAO = sqlSession.getMapper(ITopicDAO.class)的实例化形式-->
        <property name="basePackage" value="pers.hanchao.himybatis.curd"/>
        <!--配置sqlSessionFactory,替代private static SqlSessionFactory sqlSessionFactory的注入形式-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
    <!--事务管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--基于注解的声明式事务-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
2.2.2.jdbc.properties

其中jdbc.properties内容如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exam?useSSL=false
jdbc.username=****
jdbc.password=*******

对于上述的第5条和第6条,通过TopicController.java和TopicService.java可以更加直观的感受:

2.2.3.业务控制类:TopicController.java

第5条和第6条说明如下:


5. 通过MapperScannerConfigurer的sqlSessionFactoryBeanName,替代MyBatis建立会话工厂的new SqlSessionFactoryBuilder().build(reader)方式。
6. 通过MapperScannerConfigurer的basePackage,替代MyBatis实例化Dao层对象的sqlSession.getMapper(IDAO.class)方式

在TopicController.java中,不再需要进行以下操作:

- 通过Reader读取配置文件mybatis-config.xml
- 通过配置文件信息,创建SqlSessionFactory,即SQL会话工厂
- 通过SQL会话工厂开启数据库连接会话,即SqlSession
- 通过数据库连接会话获取映射的DAO层实现类对象

TopicController.java

package pers.hanchao.himybatis.ssm;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pers.hanchao.himybatis.curd.entity.Topic;
import pers.hanchao.himybatis.utils.JsonResult;
import pers.hanchao.himybatis.utils.ShowList;

import java.util.List;

/**
 * <p>Spring + Spring MVC + MyBatis初步整合实例(RESTFul风格)</p>
 * @author hanchao 2018/1/28 19:19
 **/
@RestController
@RequestMapping("/ssm")
public class TopicController {
    @Autowired
    private TopicService topicService;

    private static final Logger LOGGER = Logger.getLogger(TopicController.class);
    /**
     * <p>查询一个话题</p>
     * @author hanchao 2018/1/28 16:58
     **/
    @GetMapping("/topic/{id}")
    public JsonResult<Topic> queryTopicById(@PathVariable Integer id){
        Topic topic = this.topicService.queryTopicById(id);

        JsonResult<Topic> jsonResult = new JsonResult<Topic>();
        //非空判断
        if (null != topic){
            jsonResult.addList(topic);
            LOGGER.info(topic.toString());
        }else {
            jsonResult.setMessage("无查询结果");
            LOGGER.info("无查询结果");
        }

        return jsonResult;
    }

    /**
     * <p>查询所有的话题</p>
     * @author hanchao 2018/1/28 18:02
     **/
    @GetMapping("/topic/")
    public JsonResult<Topic> queryTopicList(){
        List<Topic> topicList = this.topicService.queryTopicList();

        JsonResult<Topic> jsonResult = new JsonResult<Topic>();
        //非空判断
        if (null != topicList && topicList.size() > 0){
            jsonResult.setList(topicList);
            ShowList.showList(topicList);
        }else {
            jsonResult.setMessage("无查询结果");
            LOGGER.info("无查询结果");
        }

        return jsonResult;
    }

    /**
     * <p>新增一个话题</p>
     * @author hanchao 2018/1/28 17:35
     **/
    @PostMapping("/topic/")
    public JsonResult<Topic> insertTopic(@RequestBody Topic topic){
        Topic topic1 = this.topicService.queryTopicById(topic.getId());

        //如果已经存在此话题,则不能再新增
        if (null != topic1){
            return new JsonResult<Topic>(-1,"话题已经存在!");
        }else{
            this.topicService.insertTopic(topic);
            return new JsonResult<Topic>();
        }
    }

    /**
     * <p>修改一个话题</p>
     * @author hanchao 2018/1/28 17:50
     **/
    @PutMapping("/topic/")
    public JsonResult<Topic> putTopic(@RequestBody Topic topic){
        Topic topic1 = this.topicService.queryTopicById(topic.getId());

        if (null != topic1){
            this.topicService.updateTopic(topic);
            return new JsonResult<Topic>();
        }else{//如果不存在此话题,则不能进行替换
            return new JsonResult<Topic>(-1,"话题不存在!");
        }
    }

    /**
     * <p>删除一个话题</p>
     * @author hanchao 2018/1/28 17:59
     **/
    @DeleteMapping("/topic/{id}")
    public JsonResult<Topic> deleteTopic(@PathVariable Integer id){
        Topic topic1 = this.topicService.queryTopicById(id);

        if (null != topic1){
            this.topicService.deleteTopic(id);
            return new JsonResult<Topic>();
        }else{//如果不存在此话题,则不能进行删除
            return new JsonResult<Topic>(-1,"话题不存在!");
        }
    }
}
2.2.4.业务处理类:TopicService.java

在TopicService.java中,不再需要进行以下操作:

- 如果执行成功,就进行事务提交(commit)
- 如果执行失败,就进行事务回滚(rollback)
- 无论失败还是成功,最后都需要关闭事务(close)

直接调用DAO层提供的数据库操作方法即可。

TopicService.java

package pers.hanchao.himybatis.ssm;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pers.hanchao.himybatis.curd.dao.ITopicDAO;
import pers.hanchao.himybatis.curd.entity.Topic;

import java.util.List;

/**
 * <p>Service层</p>
 * @author hanchao 2018/1/28 19:20
 **/
@Service
public class TopicService {
    @Autowired
    private ITopicDAO topicDAO;

    public Topic queryTopicById(Integer id) {
        return this.topicDAO.queryTopicById(id);
    }

    @Transactional
    public void insertTopic(Topic topic) {
        this.topicDAO.insertTopic(topic);
    }

    @Transactional
    public void updateTopic(Topic topic) {
        this.topicDAO.updateTopic(topic);
    }

    @Transactional
    public void deleteTopic(Integer id) {
        this.topicDAO.deleteTopic(id);
    }

    @Transactional
    public List<Topic> queryTopicList(){
        return this.topicDAO.queryTopicList();
    }
}

2.3.Spring和Spring MVC的其他配置

本章Spring和Spring MVC不是重点,不多说,直接给代码。

pom.xml:jar包依赖

    <springframework.version>5.0.0.RELEASE</springframework.version>
    <servlet-api.version>3.1.0</servlet-api.version>
    <jsp-api.version>2.0</jsp-api.version>
    <jstl.version>1.2</jstl.version>
    <commons-logging.version>1.2</commons-logging.version>
    <commons-lang3.version>3.3.2</commons-lang3.version>
    <commons-io.version>2.4</commons-io.version>
    <tomcat-plugin.version>2.2</tomcat-plugin.version>
    <jackson.version>2.9.0</jackson.version>
    <log4j.version>1.2.17</log4j.version>
    <junit.version>4.12</junit.version>
    <mysql.version>5.1.40</mysql.version>
    <mybatis.version>3.4.5</mybatis.version>
    <mybatis-spring.version>1.3.1</mybatis-spring.version>

web.xml:Web项目启动加载过滤器、Spring MVC前端控制器、Spring上下文环境和欢迎页面。

<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>Hi MyBatis</display-name>

    <!--编码转换器,解决POST请求中文乱码问题-->
    <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--前端分发器-->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--Spring上下文配置-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--上下文环境加载监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

spring-mvc-servlet.xml:SpringMVC的配置文件,包括开启注解、自动装配、视图解析器以及静态资源配置等。

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

    <!--开启component注解自动扫描-->
    <context:component-scan base-package="pers.hanchao.himybatis.ssm"/>

    <!-- Spring MVC默认的注解映射的支持 :提供Controller请求转发,json自动转换等功能-->
    <mvc:annotation-driven />

    <!--开启注解:提供spring容器的一些注解-->
    <context:annotation-config/>

    <!--静态资源处理方式一:使用mvc:default-servlet-handler,
    default-servlet-name="所使用的Web服务器默认使用的Servlet名称",一般情况下为"default" -->
    <!--<mvc:default-servlet-handler default-servlet-name="default"/>-->

    <!--静态资源处理方式二:通过mvc:resources指定静态资源-->
    <!--所有URI为"/static/**"的资源都从"/static/"里查找,这些静态资源缓存1年(即 : 31536000秒)-->
    <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>

    <!--默认视图解析器:jsp-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
        <property name="order" value="0"/>
        <property name="contentType" value="charset=UTF-8"></property>
    </bean>
</beans>

applicationContext.xml:Spring的总配置文件,通过import加载其他配置文件,如spring-mybatis-jdbc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--数据源信息:PropertyPlaceHolder、DataSource、SqlSessionFactory-->
    <import resource="classpath:spring-mybatis-jdbc.xml"/>
</beans>

topic.jsp:业务展示页面

<%--
  Created by IntelliJ IDEA.
  User: hanchao
  Date: 2018/1/28
  Time: 17:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>话题首页</title>
    <style type="text/css">
        div{margin: 5px 5px; }
        .div-left {float: left;margin: 5px 5px;}
        .div-text-center {text-align:center; border:1px solid #96c2f1; background:#eff7ff;}
        textarea{border:1px solid #9bdf70;background:#f0fbeb}
        .in-text{width: 30px;}
    </style>
</head>
<body>
<div class="div-left">
    <textarea id="message" cols="50" rows="50"></textarea>
</div>
<div class="div-left">
    <div class="div-text-center">
        <input type="button" value="查询所有(GET)" onclick="topics('GET')"/>
    </div>
    <div class="div-text-center">
        <label>话题id:</label><input class="in-text" type="text" id="id" value="1"/><input type="button" value="查询一个(GET)" onclick="topic('GET')"/><input type="button" value="删除一个(DELETE)" onclick="topic('DELETE')">
    </div>
    <div class="div-text-center">
        <table style="text-align: right;width: 325px;">
            <tr>
                <td><label>id</label></td>
                <td><input id="new_id" type="text" value="1"/> </td>
            </tr>
            <tr>
                <td><label>题目</label></td>
                <td><input id="new_title" type="text" value="新话题"/> </td>
            </tr>
            <tr>
                <td><label>分数</label></td>
                <td><input id="new_score" type="text" value="100"/> </td>
            </tr>
            <tr>
                <td><label>答案</label></td>
                <td><input id="new_answer" type="text" value="新答案"/> </td>
            </tr>
            <tr>
                <td><input type="button" value="新增(POST)" onclick="topic1('POST')"> </td>
                <td><input type="button" value="修改(PUT)" onclick="topic1('PUT')"> </td>
            </tr>
        </table>
    </div>
</div>
</body>
<script type="text/javascript" src="../static/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
    /**
     * 获取一个话题:[GET]/ssm/topic/{id}
     */
    /**
     * 删除一个话题:[DELETE]/ssm/topic/{id}
     */
    function topic(type) {
        $.ajax({
            type:type,
            url:"/ssm/topic/" + $("#id").val(),
            contentType:"application/json;charset=utf-8",
            success:function (data) {
                console.log(data);
                var html = "url[" + type + "]:/ssm/topic/" + $("#id").val() + "\n\nresult:\n" + JSON.stringify(data, null, 4);
                $("#message").html(html);
            }
        });
    }

    /**
     * 获取全部话题:[GET]/ssm/topic/
     */
    /**
     * 删除全部话题:[DELETE]/ssm/topic/
     */
    function topics(type) {
        $.ajax({
            type:type,
            url:"/ssm/topic/",
            contentType:"application/json;charset=utf-8",
            success:function (data) {
                console.log(data);
                var html = "url[" + type + "]:/ssm/topic/\n\nresult:\n" + JSON.stringify(data, null, 4);
                $("#message").html(html);
            }
        });
    }

    /**
     * 新增一个话题:[POST]/ssm/topic/
     */
    /**
     * 替换一个话题:[PUT]/ssm/topic/
     */
    /**
     * 修改一个话题:[PATCH]/ssm/topic/
     */
    function topic1(type) {
        $.ajax({
            type:type,
            url:"/ssm/topic/",
            data:JSON.stringify({
                id:$("#new_id").val(),
                title:$("#new_title").val(),
                score:$("#new_score").val(),
                answer:$("#new_answer").val()
            }),
            contentType:"application/json;charset:utf-8",
            success:function (data) {
                console.log(data);
                var html = "url[" + type + "]:/ssm/topic/\n\nresult:\n" + JSON.stringify(data,null,4);
                $("#message").html(html);
            }
        });
    }
</script>
</html>

3.result

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值