SSM 实训笔记 -14- SSM 整合 详细过程+入门实例(IDEA 版)
本篇内容:
从创建项目、准备数据库开始,详细介绍 SSM 框架整合过程,到读出并返回 json 数据!
数据库准备:
只要有一张简单的表就可以,下面给出本项目使用的数据库
数据库名: clouddb
表名: user_info
字段: user_id username password email register_time status
SSM 整合过程步骤目录:
(一)创建项目,配置 Tomcat 服务器,热部署,Hello World
(1)dependencies 部分
名称及版本:
fastjson 1.2.54
spring-webmvc 5.1.4 RELEASE
mybatis 3.4.6
mybatis-spring 1.3.2
spring-jdbc 5.1.4 RELEASE
mysql-connector-java 8.0.13
(2)resources 部分
在 WEB-INF 目录下:
(1)web.xml 文件配置(创建项目时打钩会自动生成文件,不必创建文件,只需配置)
(2)applicationContext.xml 文件配置(需手动创建)
(3)springmvc-servlet.xml 文件配置(需手动创建)
在 resources 目录下:
(1)jdbcConfig.properties 文件(需手动创建)
作用:数据库的登录信息的配置,因为一般给客户自行配置,所以常使用单独文件
包括 mapper,Action,Service,DAO 各层的编写
下面我们开始 …
第一步:创建项目,配置 Tomcat 服务器,热部署,Hello World
(需要联网,必须联网)
(1)新建项目 >【Maven】>【选择 SDK】>【勾选 archetypes】>【找到下面一项 maven-archetype-webapp】:
(之前没有勾选,今后的 Web 项目都需要勾选)
(2)组名,坐标(是为了保证项目唯一性):
(3)Maven 信息,默认:
(4)项目名,本地位置:
(5)当前窗口:
(6)右下角,点击自动下载导包(需要联网,必须联网):
(7)此时项目目录结构:
(8)配置 Tomcat 服务器,右上角:
(9)点击 + 号:
选择:
(10)配置名称,Tomcat 本地位置根目录,(不要着急点完成):
(11)热部署配置:
(目的:这样就可以不用重启服务器,直接在页面上刷新,更新修改内容)
切换成 Deployment,点击 +,选择 Artifact…
选择解压的:
切换回第一个,修改两项:
(12)运行服务器:
(13)在浏览器查看,下面地址:
http://localhost:8080/
第二步:修改目录结构,创建文件
(目录和文件名称建议和我的一样,因为有的地方名称必须是特定的格式,也算挺标准啦)
创建如下几个目录及目录:
注意: 必须先创建 java,resources,test 目录并标记
再创建 com.xpwi.action,mapper,dao.impl,service.impl
标识方法:
选择一个目录 > 右键 > Mark Directory as >找到和我图标一模一样的:
第三步:pom.xml 文件配置
pom 配置分两部分:
(1)dependencies 部分:
maven 配置仓库:https://mvnrepository.com/
大家可以到上面地址中搜索相应名称,找到需要的配置
本篇所需 jar 包及版本
fastjson 1.2.54
spring-webmvc 5.1.4 RELEASE
mybatis 3.4.6
mybatis-spring 1.3.2
spring-jdbc 5.1.4 RELEASE
mysql-connector-java 8.0.13
位置:
内容:
我已经准备好了,可以直接拷贝:
<!--从上向下记忆-->
<!--fastjson-->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<!--spring mvc, 自动加载一些相关的包-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<!--spring jdbc-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mybatis spring-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--mysql connection-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
(2)resources 部分:
位置:
内容:
<!--是为了加载自定义包下 mapper.xml 文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
第四步:整合 SSM 所需配置文件 的配置
(1)在 WEB-INF 目录下:
(1)web.xml 文件(部署描述器)配置(创建项目时打钩会自动生成文件,不必创建文件,只需配置)
作用:整合 Spring 和 Spring MVC
(我的理解是 maven web 项目整合 Spring 和 web 项目整合 Spring MVC,不是把 Spring 和 Spring MVC 整合在一起)
文件内容:
<!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>
<!-- 由两部分组成:(1)Spring (2)Spring MVC -->
<!-- 每一个部分, 又都有两部分-->
<!--(1)Spring -->
<!--加载 applicationContext.xml -->
<!-- Context 是一个场景,描述的是一个应用程序环境的信息,即上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--加载 ContextLoaderListener 是 Spring 的监听器,它的作用就是:-->
<!--在启动 Web 容器时,自动装配 ApplicationContext 的配置信息。-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--(2)整合 spring mvc -->
<!-- Servlet:小服务程序或*服务连接器,用 Java 编写的服务器端程序-->
<!-- 并且 Servlet 是为了解决实现动态页面而衍生的东西。-->
<!-- *处理请求和发送响应的过程是由 Servlet 程序来完成的-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
(2)applicationContext.xml 文件配置(需手动创建)
作用:Spring 的配置文件,整合 MyBatis
内容:
<?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">
<!--3对context 3对bean-->
<!--开启注解-->
<!--<context:annotation-config> 是用于激活那些已经在 spring 容器里注册过的 bean
(无论是通过 xml 的方式还是通过 package sanning 的方式 )上面的注解。-->
<!--<context:component-scan> 除了具有<context:annotation-config>的功能之外-->
<!--<context:component-scan> 还可以在指定的 package 下扫描以及注册 javabean -->
<context:annotation-config/>
<context:component-scan base-package="com.xpwi.dao.impl,com.xpwi.service.impl"/>
<!--加载属性配置文件-->
<context:property-placeholder location="classpath*:jdbcConfig.properties"/>
<!--<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--开启事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--整合 mapper 配置文件方式-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--<property name="mapperLocations" value="${mapper-locations}"></property>-->
<property name="mapperLocations" value="classpath*:com/xpwi/mapper/*Mapper.xml"></property>
</bean>
</beans>
(3)springmvc-servlet.xml 文件配置(需手动创建)
作用:Spring MVC 的配置文件
内容:
<?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">
<!--开启注解-->
<!--<context:annotation-config> 是用于激活那些已经在 spring 容器里注册过的 bean
(无论是通过 xml 的方式还是通过 package sanning 的方式 )上面的注解。-->
<!--<context:component-scan> 除了具有<context:annotation-config>的功能之外-->
<!--<context:component-scan> 还可以在指定的 package下扫描以及注册 javabean -->
<context:annotation-config/>
<context:component-scan base-package="com.xpwi.action"/>
<!--json 消息转换器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
<value>application/json</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
</beans>
(2)在 resources 目录下:
(1)jdbcConfig.properties 文件(需手动创建)
作用:数据库的登录信息的配置,因为一般给客户自行配置,所以常使用单独文件
jdbcConfig.properties 文件内容:
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/clouddb?serverTimezone=UTC
# 不能直接用 username 作为变量名
jdbc.username = root
jdbc.password = password
第五步:编写一个基础的实例
(1)创建文件
(2)UserInfoMapper.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.xpwi.mapper">
<!--SQL语句:根据 id 查找文件信息-->
<!--userId 为参数变量-->
<!--在 applicationContext.xml 中配置的 *Mapper, 所以要以 Mapper 结尾命名-->
<select id="allUserInfoMapper" resultType="map">
select * from user_info
</select>
</mapper>
(3)action/UserInfoAction.java 文件代码:
package com.xpwi.action;
import com.xpwi.service.impl.UserInfoService;
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.ResponseBody;
import java.util.List;
//注解要多学习
//加 @Controller 注解才可以被扫描到,其他还有:
//Service 层用 @Service
//DAO 层用 @Repository
@Controller
public class UserInfoAction {
//开启注解之后就可自动注入,使用 @Autowired
//这样就不要 new 了
@Autowired
UserInfoService userInfoService;
//@RequestMapping 配置所拦截处理的请求的路径和方法
@RequestMapping(value = "/queryUserById.do", method = RequestMethod.GET)
//@ResponseBody 要有,如果没有回自动将 return 后面的名称当做文件名进行跳转
//我们一般是需要范湖数据,而不是直接跳转,所有需要该注解
@ResponseBody
public List<Object> queryAllUser(){
//直接调用服务层的 queryAllUser方法
List<Object> userInfoMap = userInfoService.queryAllUser();
return userInfoMap;
}
}
(4)service/IUserInfoService.java 文件代码(接口):
package com.xpwi.service;
import java.util.List;
public interface IUserInfoService {
public List<Object> queryAllUser();
}
(5)service/impl/UserInfoService.java 文件代码(实现类):
package com.xpwi.service.impl;
import com.xpwi.dao.impl.UserInfoDAO;
import com.xpwi.service.IUserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserInfoService implements IUserInfoService {
@Autowired
UserInfoDAO userInfoDAO;
@Override
public List<Object> queryAllUser() {
//直接调用DAO层的 queryAllUser方法
List<Object> userInfoMap = userInfoDAO.queryAllUser();
return userInfoMap;
}
}
(6)dao/IUserInfoDAO.java 文件代码(接口):
package com.xpwi.dao;
import java.util.List;
public interface IUserInfoDAO {
//接口只写方法名,操作处理在实现类中
public List<Object> queryAllUser();
}
(7)dao/impl/UserInfoDAO.java 文件代码(实现类):
package com.xpwi.dao.impl;
import com.xpwi.dao.IUserInfoDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserInfoDAO implements IUserInfoDAO {
@Autowired
SqlSessionFactory sqlSessionFactory;
@Override
public List<Object> queryAllUser() {
String sql = "com.xpwi.mapper.allUserInfoMapper";
SqlSession sqlSession = sqlSessionFactory.openSession(true);
List<Object> objects = sqlSession.selectList(sql);
return objects;
}
}
(六)运行测试
在浏览器访问:
部署地址 + Action 类中 RequestMappring 的地址
部署地址是:
如果你的有部署的有项目名,请加上项目名,查看,在编辑 Tomcat 配置:
例如:
http://localhost:8080/queryUserById.do
因为我们使用了 json 消息转换器,所以会返回:
成功!