使用 IDEA Maven 整合 SSM 框架(Spring+SpringMVC+Mybatis)

博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主威威喵  |  博客主页https://blog.csdn.net/smile_running

1、前言

    由于博主之前写的这篇文章太水了,其实也是用处不大,所以我决定把这篇文章内容改了。改的内容是 ssm 框架的基本搭建与使用,由于博主毕业设计中需要做后台服务器的处理,我做的是 Android 端 app 的,但是需要数据交互,所以就当顺便学一下服务器的知识吧。

    好吧,话不多说,我们自己开始整合 ssm 框架,建议你最好会先使用 Idea,因为我使用的是 Maven 的方式进行构建的,比较简单,容易上手。

2、正文

首先,我们需要创建一个新的 Maven Project

 以下就随便填写吧,做一个简单的 demo 

 下面这个属性最要添加一个 archetypeCatalog = internal,如果不加这个参数,Maven 构建时会很慢,有时候直接卡住。

 最后就创建出了一个空的 Maven 项目了,如下图:

到这里呢,你已经迈出了第一步。接下来,我们可以开始加入 Spring、SpringMVC、Mybatis、Json、Logger等依赖,这样才能够正常使用这些工具包。你只需要在 pom.xml 文件中添加如下的依赖即可(打开 pom.xml 文件,将里面的 <dependencies> 标签替换成下面的内容,具体依赖的作用以下都有注释)

  <dependencies>
    <!--    单元测试(选择版本大于 4.0 ,使用注解的方式)    -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--   Java Web 相关依赖   -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.0</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>

    <!--    日志工具:slf4j + logback    -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.5</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.7</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.1.7</version>
    </dependency>

    <!-- 添加fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.41</version>
    </dependency>

    <!--    数据库:mysql + c3p0 连接池    -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.29</version>
    </dependency>
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

    <!--    DAO 层:mybatis + mybatis-spring 整合    -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.2.8</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.2</version>
    </dependency>

    <!--    Spring 核心依赖    -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <!--    Spring dao依赖    -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <!--    Spring web相关    -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>
    <!--    Spring test    -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.2.5.RELEASE</version>
    </dependency>

    <!--    使用 redis 优化接口并发(优化‘地址暴露接口’)    -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.7.3</version>
    </dependency>
    <!--    使用 protostuff 来序列化存储对象    -->
    <dependency>
      <groupId>com.dyuproject.protostuff</groupId>
      <artifactId>protostuff-core</artifactId>
      <version>1.0.8</version>
    </dependency>
    <dependency>
      <groupId>com.dyuproject.protostuff</groupId>
      <artifactId>protostuff-runtime</artifactId>
      <version>1.0.8</version>
    </dependency>
  </dependencies>

替换代码之后,会弹出这样的窗口,选择 import 即可。

这样我们的 ssm 框架所需的依赖库就已经引入成功了,下面开始编写配置文件进行框架的整合。在整合之前呢,我们先创建几个文件夹,用于存放配置文件。创建文件夹后,工程目录结构图如下:

我这里就写了一个简单的业务逻辑,一个使用 ssm 框架来写的用户登录功能。上图就是所有的类与配置文件,下面我来简单地介绍一下这些类的主要功能以及配置文件的作用。

  • dao 包,这里是与数据库访问的接口,对应的 spring-dao.xml 就是操作数据库相关的配置信息,如 jdbc、c3p0 等等。
  • service 包,与主要业务逻辑相关,spring-service.xml 的主要是扫描 service 包下的接口,方便注入到其它类中使用。
  • web 包,就是 srpingMVC 相关的用于请求访问处理,spring-web.xml 主要是配置 controller 的相关属性。
  • logback.xml 是日志的配置文件
  • jdbc.properties 表示使用 jdbc 连接数据库驱动时要用的连接属性
  • mybatis-config.xml 是与 mybatis 整合时所需的配置信息
  • web.xml 需要配置请求的相关属性,比如 servlet 与 servlet-mapping 等。
  • mapper 包下主要存放与业务相关的 sql 语句

大致就这些,接下来我们从 jdbc.properties 文件先开始,它的代码如下(是类似与 key - value 的方式存储):

jdbc.driverClasss=com.mysql.jdbc.Driver
jdbc.Url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true
jdbc.username=root
jdbc.password=xww0826

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


    <!--  加载 jdbc 属性文件  -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--  配置 c3p0 数据源  -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--   配置 jdbc 连接基本属性     -->
        <property name="driverClass" value="${jdbc.driverClasss}"/>
        <property name="jdbcUrl" value="${jdbc.Url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!--   配置 c3p0 连接池属性     -->
        <property name="initialPoolSize" value="5"/>
        <property name="checkoutTimeout" value="20000"/>
        <property name="maxPoolSize" value="40"/>
        <property name="minPoolSize" value="10"/>
        <!--   关闭连接后是否自动提交     -->
        <property name="autoCommitOnClose" value="false"/>
        <!--   获取连接失败重试次数     -->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!-- 配置 sqlSessionFactory 对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--   注入数据库连接池     -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描 mapper包下的所有 xml 文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!-- 配置 mybatis-config 文件 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 扫描包下的 entity 类 -->
        <property name="typeAliasesPackage" value="com.xww.demo.entity"/>
    </bean>

    <!-- 配置扫描 dao 包,动态的实现 dao 接口,注入 spring 容器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入 sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 扫描 dao 包下的接口,并实现它 -->
        <property name="basePackage" value="com.xww.demo.dao"/>
    </bean>

    <!--  配置事物管理  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--  注入数据库连接池  -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--  默认使用注解来管理事物  -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

接下来是 spring-service.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-3.1.xsd
                         http://www.springframework.org/schema/context
                         http://www.springframework.org/schema/context/spring-context.xsd">

    <!--  自动扫描 service 包  -->
    <context:component-scan base-package="com.xww.demo.service"/>


</beans>

然后是 spring-web.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-3.1.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">

    <!--  扫描 web 包(如:Controller)  -->
    <context:component-scan base-package="com.xww.demo.web"/>

    <!--  springMVC 配置文件,开启注解,并提供一系列功能进行数据绑定(如:xml、Json,时间戳等数据支持)  -->
    <mvc:annotation-driven/>

    <!--  配置默认处理,允许使用  / 做整体映射,如静态资源的处理(jpg,png,js等) -->
    <mvc:default-servlet-handler/>

    <!--避免IE执行AJAX时,返回JSON出现下载文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>

    <!--  配置视图解析器  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

然后是 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">
<configuration>

    <settings>
        <!--   设置获取自增主键值 id     -->
        <setting name="useGeneratedKeys" value="true"/>
        <!--   自动将列名转为 entity 属性名    -->
        <setting name="useColumnLabel" value="true"/>
        <!--   使用驼峰命名法来转换    -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

</configuration>

最后是 logback.xml 文件,配置日志相关设置:

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

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

以上就是 ssm 框架的所有配置文件代码,接下来我们来看 java 代码。首先是 dao 包下的 LoginDao 接口,代码如下:

package com.xww.demo.dao;

import com.xww.demo.entity.User;
import org.apache.ibatis.annotations.Param;

public interface LoginDao {

    // 用户登录
    User queryUser(@Param("username") String username, @Param("password") String password);
}

 接下来是 mapper 包下的 LoginDao.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.xww.demo.dao.LoginDao">

    <select id="queryUser" parameterType="com.xww.demo.entity.User" resultType="com.xww.demo.entity.User">
       select user_name, pass_word from user where user_name = #{username} and pass_word = #{password}
    </select>

</mapper>

那么 entity 类就不用多说了,提供 getter 和 setter 方法,不过一定要加一个空的构造函数,否则会出错,代码如下:

package com.xww.demo.entity;

public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

接着是 service 包,这里就是业务逻辑处理相关的代码,包括业务逻辑的接口与实现类。

package com.xww.demo.service;

import com.xww.demo.entity.User;

public interface LoginService {

    User doLogin(String username, String password);
}
package com.xww.demo.service.impl;

import com.xww.demo.dao.LoginDao;
import com.xww.demo.entity.User;
import com.xww.demo.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class LoginImpl implements LoginService {

    @Autowired
    LoginDao loginDao;

    @Override
    public User doLogin(String username, String password) {
        return loginDao.queryUser(username, password);
    }
}

然后是 web 包的代码,这里是请求相关的逻辑代码,配置请求 url 、请求方式、请求参数等。代码如下:

package com.xww.demo.web;

import com.alibaba.fastjson.JSONObject;
import com.xww.demo.entity.User;
import com.xww.demo.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/test")
public class LoginController {

    @Autowired
    LoginService loginService;


    @ResponseBody
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String doLoginAction(@RequestParam("username") String username, @RequestParam("password") String password) {

        User user = null;
        try {
            user = loginService.doLogin(username, password);
        } catch (RuntimeException e) {
            //如果用户为null,在此处理异常
        }
        return JSONObject.toJSONString(user);
    }

}

到这里还没结束,最关键的是需要把 servlet 添加到 web.xml 文件中去,否则你无论怎么请求,都是无法接收到响应的,代码如下:

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <!-- 编码过滤器 -->
    <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!--    配置 SpringMVC DispatcherServlet    -->
    <servlet>
        <servlet-name>demo-LoginServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo-LoginServlet</servlet-name>
        <!--    配置请求 url 模式    -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- session配置 -->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>

</web-app>

最后是我们的前端 jsp 代码,就是简单的使用 bootstrap 框架写的一个登录界面,index.jsp 代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>

<head>
    <title>用户登录</title>

    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 Shiv 和 Respond.js 用于让 IE8 支持 HTML5元素和媒体查询 -->
    <!-- 注意: 如果通过 file:// 引入 Respond.js 文件,则该文件无法起效果 -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
    <![endif]-->
</head>

<body>

<!-- 登录表单 -->
<form style="margin-left:500px;margin-top:200px;" action="test/login" method="post" target="_blank">
    <div class="form-group">
        <label for="user" stype="display:inline;">账户:</label>
        <input type="text" class="form-control" id="user" name="username" style="display:inline;width:200px;"
               autocomplete="off"/>
    </div>
    <div class="form-group">
        <label for="password" style="display:inline;">密码:</label>
        <input type="password" class="form-control" id="password" name="password" style="display:inline;width:200px;"
               autocomplete="off"/>
    </div>
    <button type="submit" class="btn btn-primary" style="margin-top: 10px">登录</button>
</form>

</body>

<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</html>

接下来就是如何运行的问题了。使用 IDEA 添加 Local Tomcat,如下图:

添加项目,就是我们刚刚创建的这个项目名,如下图:

然后应用一下,直接运行 Tomcat 即可。那么你就会看到如下的 jsp 页面:

登录成功时,就会显示当前的登录名和密码,以 json 数据返回,登录失败则返回为 null,如下图:

 数据库驱动使用的是 mysql,用到的 sql 命名如下:

# 创建数据库
CREATE DATABASE test;

# 创建用户表
CREATE TABLE `user` (
	`id` INT NOT NULL auto_increment,
	`user_name` VARCHAR (16) NOT NULL,
	`pass_word` VARCHAR (16) NOT NULL,
	PRIMARY KEY (id, user_name)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

# 插入数据
INSERT INTO USER (user_name, pass_word)
VALUES
	('xww', '0826'),
	('user1', '123456');

好了,本文所有代码就这些,一个简单的 ssm 框架就整合完成了。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页