本篇隶属于《SSM 实战项目①丨图书管理系统 》
详情请见:SSM 实战项目①丨图书管理系统 丨(0) 项目概要及本系列介绍
本篇内容可作为 SSM 开发的基础代码框架使用,相关代码已单独抽离出来放在 Github 上。
Github 链接为:SSM 整合通用框架
这个是初始状况,很显然是不够的,这里连个写 java 代码的地方都没有。
这里要注意在创建文件夹的时候要为重要的文件夹做相应的绑定操作,具体如下:
后面的 resources 和 test 同上进行绑定处理。
为减小篇幅,下面直接附上结果图:
Maven 中央仓库连接:Maven 中央仓库
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.5version>
dependency>
<dependency>
<groupId>c3p0groupId>
<artifactId>c3p0artifactId>
<version>0.9.1.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.19version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
PS:Spring 5 搭配的 Junit 版本必须在 4.12 及以上,否则项目运行会报错。
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.1version>
<scope>providedscope>
dependency>
这个 jar 包尚硅谷的教学视频里面没有引入,但是笔者开发时不引入这个 jar 包的时候在 jsp 页面中写代码会出现一点小问题。
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-validatorartifactId>
<version>6.1.0.Finalversion>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.0.0version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.10.4version>
dependency>
关于这两个部署路径有什么区别,可以参考下面的文章,其中的 404 Not Found 有涉及到:
使用SpringMVC进行跨服务器上传文件出现的那些坑
这样就部署完成了,这个应该比较简单。
官网:Bootstrap
官网:jQuery官网
jQuery API 中文文档:jQuery API
<%@ 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() 路径正确但是资源加载不出来的解决方案
用一个按钮即可测试Bootstrap 是否导入成功。
使用 Bootstrap 样式
上官方文档查阅资料
复制我们需要用的 class 就可以了,我们这里演示红色按钮
<body>
<button type="button" class="btn-danger">按钮button>
body>
这就说明我们的 Bootstrap 引入成功啦~
下面将开始编写 SSM 整合的关键配置文件,主要有5个部分:
配置文件所在位置如下:
web.xml 配置文件主要是配置 JavaWeb 相关的东西,比如监听器、前端控制器、字符编码过滤器、请求转换器等等。
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<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>
<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>
<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
这是 SpringMVC 的配置文件,包含网站跳转逻辑的控制和配置 (该配置文件必须放在跟 web.xml 同级的目录下)。
<context:component-scan base-package="com" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
context:component-scan>
<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>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
这是数据库的配置文件
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
这是 Spring 的配置文件:主要配置和业务逻辑有关的。
Spring 配置文件的核心点 总结:
数据源(1-3)
与 Mybatis 整合(4-5)
事务控制(6-8)
批量操作支持(9)
<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">
<context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
context:component-scan>
<context:property-placeholder location="classpath:jdbcconfig.properties">context:property-placeholder>
<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>
<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>
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao">property>
bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="pooledDataSource">property>
bean>
<aop:config>
<aop:pointcut id="txPoint" expression="execution(*e com.service..*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint">aop:advisor>
aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
<tx:method name="get*" read-only="true"/>
tx:attributes>
tx:advice>
<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 的全局配置文件。
<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>
这是 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>
配置文件基本就告一段落了,正所谓:约定>配置>编码。所以这个部分搞懂非常重要。而且,其实这部分都比较通用,整理出来,也便于日后复用。
参考下面文章:
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 实战项目①丨图书管理系统 丨(3) MyBatis Generator 拓展:支持多表联合操作
上面文章的链接中已经包含了测试部分,这里为了减小篇幅,就不赘述了~
到这里,整个 SSM 高级整理就结束啦~笔者已将这部分单独抽离出来分享到 Github 上,有需要的读者可以在本篇文章的开头拿到 Github 地址。
笔者在学习 SSM 整合的时候,是参考了尚硅谷的一个教学视频,觉得非常不错,这里推荐一下,本篇内容跟视频中的P1-P12基本吻合。
尚硅谷SSM框架实战,ssm整合教程
如有纰漏之处,还望不吝指出~