SSM 实战项目①丨图书管理系统 丨(1) SSM 整合

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第1张图片

本篇隶属于《SSM 实战项目①丨图书管理系统 》

详情请见:SSM 实战项目①丨图书管理系统 丨(0) 项目概要及本系列介绍

本篇内容可作为 SSM 开发的基础代码框架使用,相关代码已单独抽离出来放在 Github 上。

Github 链接为:SSM 整合通用框架


一、创建 Maven 工程

1. 创建 Maven 的 webapp 工程
SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第2张图片
2. 输入项目名
SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第3张图片
3. 建立相应的文件夹

这个是初始状况,很显然是不够的,这里连个写 java 代码的地方都没有。

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第4张图片

这里要注意在创建文件夹的时候要为重要的文件夹做相应的绑定操作,具体如下:

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第5张图片

后面的 resources 和 test 同上进行绑定处理。

为减小篇幅,下面直接附上结果图:

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第6张图片

二、引入 jar 包

Maven 中央仓库连接:Maven 中央仓库

1. Spring 相关包
  • springmvc(引入spring的核心包和springmvc)

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-webmvcartifactId>
  <version>5.0.2.RELEASEversion>
dependency>
  • spring-jdbc(事务控制)

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-jdbcartifactId>
  <version>5.0.2.RELEASEversion>
dependency>
  • spring-apects(面向切面编程,基于配置的事务控制会用到)

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-aspectsartifactId>
  <version>5.0.2.RELEASEversion>
dependency>
2. Mybatis 相关包
  • Mybatis 基础包

<dependency>
  <groupId>org.mybatisgroupId>
  <artifactId>mybatisartifactId>
  <version>3.4.5version>
dependency>
  • Mybatis 和 Spring 整合的适配包

<dependency>
  <groupId>org.mybatisgroupId>
  <artifactId>mybatis-springartifactId>
  <version>1.3.1version>
dependency>
  • Mybatis Generator(逆向工程代码生成器)

<dependency>
  <groupId>org.mybatis.generatorgroupId>
  <artifactId>mybatis-generator-coreartifactId>
  <version>1.3.5version>
dependency>
3. 数据库连接池及驱动
  • c3p0

<dependency>
  <groupId>c3p0groupId>
  <artifactId>c3p0artifactId>
  <version>0.9.1.2version>
dependency>
  • Mysql 数据库驱动

<dependency>
  <groupId>mysqlgroupId>
  <artifactId>mysql-connector-javaartifactId>
  <version>8.0.19version>
dependency>
4. 测试相关包
  • junit
<dependency>
  <groupId>junitgroupId>
  <artifactId>junitartifactId>
  <version>4.12version>
  <scope>testscope>
dependency>

PS:Spring 5 搭配的 Junit 版本必须在 4.12 及以上,否则项目运行会报错。

  • spring-test

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-testartifactId>
  <version>5.0.2.RELEASEversion>
dependency>
5. Java Web 相关包
  • jstl

<dependency>
  <groupId>jstlgroupId>
  <artifactId>jstlartifactId>
  <version>1.2version>
dependency>
  • servlet-api

<dependency>
  <groupId>javax.servletgroupId>
  <artifactId>javax.servlet-apiartifactId>
  <version>3.1.0version>
  <scope>providedscope>
dependency>
  • jsp-api

<dependency>
  <groupId>javax.servlet.jspgroupId>
  <artifactId>jsp-apiartifactId>
  <version>2.1version>
  <scope>providedscope>
dependency>

这个 jar 包尚硅谷的教学视频里面没有引入,但是笔者开发时不引入这个 jar 包的时候在 jsp 页面中写代码会出现一点小问题。

6. 数据校验相关包
  • JSR303 数据校验(后端校验的时候可以用)

<dependency>
  <groupId>org.hibernategroupId>
  <artifactId>hibernate-validatorartifactId>
  <version>6.1.0.Finalversion>
dependency>
7. 分页查询支持
  • pageHelper

<dependency>
  <groupId>com.github.pagehelpergroupId>
  <artifactId>pagehelperartifactId>
  <version>5.0.0version>
dependency>
8. Json 数据绑定
  • Jackson-databind(我们这个项目后端传给前端的数据统一封装成 json 数据串)

<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-databindartifactId>
  <version>2.9.10.4version>
dependency>

三、Tomcat 配置

1. 添加 Tomcat Server

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第7张图片

2. 部署

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第8张图片

关于这两个部署路径有什么区别,可以参考下面的文章,其中的 404 Not Found 有涉及到:

使用SpringMVC进行跨服务器上传文件出现的那些坑

3. 更改应用上下文

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第9张图片

这样就部署完成了,这个应该比较简单。

四、引入 Bootstrap(可选)

1. 官网下载 Bootstrap

官网:Bootstrap

2. 官网下载 jQuery(Bootstrap的js文件用到了jQuery、我们后面数据解析也用到了 jQuery)

官网:jQuery官网

jQuery API 中文文档:jQuery API

3. 将Bootstrap 和 jQuery 加入项目中
SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第10张图片
4. 在 jsp 中引入 Bootstrap 和 jQuery
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>


    <%
        pageContext.setAttribute("APP_PATH",request.getContextPath()); //以 "/"开始,不以 "/" 结束
    %>
    
    主界面

    
    
    
    
    
    
    
    

这里资源路径的设置方式可以参考下面两篇文章。

总结来说就是我们利用 request.getContextPath() 来获取项目的根路径并存放到 pageContext 域中(这个ContextPath其实就是我们上面的”更改应用上下文“),为其设置名称”APP_PATH“,我们要取出这个值的时候只需要利用 EL 表达式 ${APP_PATH} 取出来即可。

这样我们整个项目的资源路径问题就可以统一起来 —— 以服务器的根路径为基准

所以比如我们要访问 jQuery 源码的时候,直接:src="${APP_PATH}/static/js/jquery-1.11.3.js"。

JavaWeb 项目中的相对路径问题

request.getContextPath() 路径正确但是资源加载不出来的解决方案

5. 测试 Bootstrap 是否导入成功

用一个按钮即可测试Bootstrap 是否导入成功。

  • 不用 Bootstrap

image-20200605214314797

  • 使用 Bootstrap 样式

    • 上官方文档查阅资料

      SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第11张图片

    • 复制我们需要用的 class 就可以了,我们这里演示红色按钮

      <body>
          <button type="button" class="btn-danger">按钮button>
      body>
      

    image-20200605214632898

这就说明我们的 Bootstrap 引入成功啦~


下面将开始编写 SSM 整合的关键配置文件,主要有5个部分:

  • web.xml
  • Spring
  • SpringMVC
  • Mybatis
  • Mybatis Generator

配置文件所在位置如下:

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第12张图片


五、编写 web.xml

web.xml 配置文件主要是配置 JavaWeb 相关的东西,比如监听器、前端控制器、字符编码过滤器、请求转换器等等。

1. 配置项目一启动,就加载 Spring 的容器
  
  <context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:applicationContext.xmlparam-value>
  context-param>

  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>
2. 配置 SpringMVC 的前端控制器
  
  <servlet>
    <servlet-name>dispatcherServletservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    <load-on-startup>1load-on-startup>
  servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServletservlet-name>
    <url-pattern>/url-pattern>
  servlet-mapping>
3. 配置编码过滤器
  
  <filter>
    <filter-name>characterEncodingFilterfilter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    <init-param>
      <param-name>encodingparam-name>
      <param-value>utf-8param-value>
    init-param>
    
    <init-param>
      <param-name>forceRequestEncodingparam-name>
      <param-value>trueparam-value>
    init-param>
    <init-param>
      <param-name>forceResponseEncodingparam-name>
      <param-value>trueparam-value>
    init-param>
  filter>
  <filter-mapping>
    <filter-name>characterEncodingFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>
4. 配置请求方式的过滤器
  
  <filter>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>

  
  <filter>
    <filter-name>httpPutFormContentFilterfilter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>httpPutFormContentFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>

本项目我们接口都遵循 Restful 风格。

Restful 风格可以参考本文:SSM 实战项目①丨图书管理系统 丨技术储备丨(2)RESTful API 接口设计总结

也可以参考其他博主写的文章,笔者觉得非常不错:RESTful API 设计指南

百度百科:RESTful

六、编写 dispatcherServlet-servlet.xml

这是 SpringMVC 的配置文件,包含网站跳转逻辑的控制和配置 (该配置文件必须放在跟 web.xml 同级的目录下)。

1. 配置要扫描的包
    
    <context:component-scan base-package="com" use-default-filters="false">
        
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    context:component-scan>
2. 配置视图解析器:方便页面返回解析
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/">property>
  <property name="suffix" value=".jsp">property>
bean>
3. 将 SpringMVC 不能处理的请求交给 Tomcat:这样静态资源和动态资源都可以请求到了
<mvc:default-servlet-handler/>
4. 配置 SpringMVC 的注解支持,使其支持一些更高级的功能:如 JSR303 校验,快捷的 AJAX 请求,映射动态请求
<mvc:annotation-driven/>

七、编写 jdbcconfig.properties

这是数据库的配置文件

dbc.jdbcUrl = jdbc:mysql://localhost:3306/luojia_library_db?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8
jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.user = root
jdbc.password = root

八、编写 applicationContext.xml

这是 Spring 的配置文件:主要配置和业务逻辑有关的。

Spring 配置文件的核心点 总结:

  • 数据源(1-3)

  • 与 Mybatis 整合(4-5)

  • 事务控制(6-8)

  • 批量操作支持(9)

0. 引入 schema

<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:aop="http://www.springframework.org/schema/aop"
       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/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">
1. 配置要扫描的包:和SpringMVC 不同的是,它除了 controller 之外的都要
<context:component-scan base-package="com">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
context:component-scan>
2. 引入外部的数据库配置文件
<context:property-placeholder location="classpath:jdbcconfig.properties">context:property-placeholder>
3. 数据源
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}">property>
    <property name="driverClass" value="${jdbc.driverClass}">property>
    <property name="user" value="${jdbc.user}">property>
    <property name="password" value="${jdbc.password}">property>
bean>
4. 配置和 Mybatis 的整合
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    
    <property name="configLocation" value="classpath:mybatis-config.xml" >property>
    
    <property name="dataSource" ref="pooledDataSource">property>
    
    <property name="mapperLocations" value="classpath:mapper/*.xml" >property>
bean>
5. 配置扫描器,将 Mybatis 接口的实现加入到 ioC 容器中
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    
    <property name="basePackage" value="com.dao">property>
bean>
6. 配置事务控制
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    
    <property name="dataSource" ref="pooledDataSource">property>
bean>
7. 启基于注解的事务 or 使用 xml 配置形式的事务 (推荐后者)
<aop:config>
    
    <aop:pointcut id="txPoint" expression="execution(*e com.service..*(..))"/>
    
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint">aop:advisor>
aop:config>
8. 配置事务增强
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        
        <tx:method name="*"/>
        
        <tx:method name="get*" read-only="true"/>
    tx:attributes>
tx:advice>
9. 配置可以批量操作的sqlSession
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory">constructor-arg>
    <constructor-arg name="executorType" value="BATCH">constructor-arg>
bean>

九、编写 mybatis-config.xml

这是 Mybatis 的全局配置文件。




                
<configuration>
    
    <settings>
        
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    settings>
    <typeAliases>
        
        <package name="com.bean"/>
    typeAliases>

    
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            
            <property name="reasonable" value="true"/>
        plugin>
    plugins>

configuration>

十、编写mbg.xml

这是 Mybatis Generator 的配置文件,主要是设置生成的 bean/dao/mapper 的位置和规范。

Mybatis Generator 官网:Mybatis Generator




<generatorConfiguration>


    <context id="DB2Tables" targetRuntime="MyBatis3">
        
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        commentGenerator>


        
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/luojia_library_db"
                        userId="root"
                        password="root">
            <property name="nullCatalogMeansCurrent" value="true" />
        jdbcConnection>


        
        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        javaTypeResolver>

        
        <javaModelGenerator targetPackage="com.bean" targetProject="./src/main/java"> 
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        javaModelGenerator>

        
        <sqlMapGenerator targetPackage="mapper"  targetProject="./src/main/resources">
            <property name="enableSubPackages" value="true" />
        sqlMapGenerator>

        
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.dao"  targetProject="./src/main/java">
            <property name="enableSubPackages" value="true" />
        javaClientGenerator>

        








    context>
generatorConfiguration>

配置文件基本就告一段落了,正所谓:约定>配置>编码。所以这个部分搞懂非常重要。而且,其实这部分都比较通用,整理出来,也便于日后复用。


十一、利用 Mybatis Generator 逆向工程生成 bean/dao/mapper

参考下面文章:

SSM 实战项目①丨图书管理系统 丨(2) Mybatis Generator 的基本使用

@Test
public void test() throws Exception{
    List<String> warnings = new ArrayList<String>();
    boolean overwrite = true;
    File configFile = new File("mbg.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration config = cp.parseConfiguration(configFile);
    DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
    myBatisGenerator.generate(null);
}

SSM 实战项目①丨图书管理系统 丨(1) SSM 整合_第13张图片

十二、对 MBG 自动生成的文件进行改造,使其支持多表查询

参考下面文章

SSM 实战项目①丨图书管理系统 丨(3) MyBatis Generator 拓展:支持多表联合操作

十三、测试 Mapper

上面文章的链接中已经包含了测试部分,这里为了减小篇幅,就不赘述了~

到这里,整个 SSM 高级整理就结束啦~笔者已将这部分单独抽离出来分享到 Github 上,有需要的读者可以在本篇文章的开头拿到 Github 地址。


  • 学习资料推荐

笔者在学习 SSM 整合的时候,是参考了尚硅谷的一个教学视频,觉得非常不错,这里推荐一下,本篇内容跟视频中的P1-P12基本吻合。

尚硅谷SSM框架实战,ssm整合教程


如有纰漏之处,还望不吝指出~

你可能感兴趣的:(Java学习,项目实战,SSM,spring,java,mybatis,springmvc,intellij,idea)