传统 spring+Spring MVC+Mybatis搭建
传统SSM框架应用
1:spring给我们提供了快捷开发的框架.使用此框架能快速搭建web项目工程结构.能有效提高我们的开发效率.那么该如何去搭建?
在此使用maven工程来管理项目
1:创建maven项目 项目父工程:名为 ssm 打包方式为 pom
说明:初学者可以仔细看这种方式,对于后续的分布式开发是有帮助的.若就是想搭建一个简单的ssm,那就直接从第三步开始.不过对应版本号不要忘了加.
引入相关依赖如下:
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 使用@Responsebody 等注解-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
</dependencies>
</dependencyManagement>
声明:在父工程里面是我们后边的子工程需要需要用到的依赖.在节点:
< dependencyManagement> 里面是声明,并没有引用,这是为了方便统一管理依赖版本号.在子工程里面只需要添加依赖不用再写版本号
二:创建子工程,项目名为:ssm-api 打包方式为 jar.
目的:我们可以将公共部分放在这个工程里面,然后在其他子工程中,引入他的依赖,就可以使用里面的类.
其依赖如下:下面是lombok 需要安装插件才能使用
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
定义一个User类.如下: 下面注解是lombok相关注解,具体使用,可以百度查看.
注意:eclipse或者idea都需要安装其插件.然后引入依赖才能使用
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String username;
private String password;
private Integer role;
}
三:创建子工程 ,项目名:ssm-simple 打包方式为war
相关依赖如下:
请注意第一个依赖,就是我们步骤二定义的公共api.在这里引入其坐标就可以在项目中使用里面的类.(首先将父工程ssm或者ssm-api项目 maven-install 至本地maven仓库中.这样后续才能在仓库中找到其坐标)
<dependencies>
<!--引入自定义api依赖-->
<dependency>
<groupId>com.org.itmck</groupId>
<artifactId>ssm-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<!--spring mvc相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!-- 使用@Responsebody 等注解-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<!-- spring service相关注解 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<!-- spring事务相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<!--mybatis相关注解 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<!--mybatis整合spring 相关注解 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!--spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!--mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--配置端口号-->
<port>8080</port>
<!--配置映射路径 http://localhost:8080/ssm-->
<path>/ssm</path>
</configuration>
</plugin>
</plugins>
</build>
扩展: 好多的****上边将一些项目依赖,就是直接引入一堆东西.初学者都不知道哪些是必须的,哪些依赖是干什么的.这样造成对maven依赖学习的不够深.我在上边分别写上了.
配置spring-mvc.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: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
">
<!--扫描web层的注解类,以**解是为了扫描这个注解:@Controller-->
<context:component-scan base-package="com.itmck.web"/>
<[email protected] @ResponseBody jackson转换成JSON-->
<mvc:annotation-driven/>
<!--配置视图解析器 Controller hello(){return "index"} 转发:/WEB-INF/jsp/index.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--静态资源放行,凡是页面上访问css js images这些静态文件时候,都不经过controller-->
<!--url路径如下:http://localhost:81/manager/static/ab/b/c/hello.css-->
<!--静态资源放行:http://localhost:81/manager/css/hello.css本来是要经过contrller,但是配置了这句话,配置完了以后,直接去寻找webapp/css/hello.css-->
<mvc:resources mapping="/static/**" location="/static/"/>
<mvc:resources mapping="/lib/**" location="/lib/"/>
</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"
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">
<!--扫描service层的注解类,以**解是为了扫描这个注解:@Service-->
<context:component-scan base-package="com.itmck.service.impl"/>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--属性注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--注解方式声明式事务第二步-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
配置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"
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:property-placeholder location="classpath:db.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!--添加基本属性-->
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--添加优化属性-->
<property name="defaultAutoCommit" value="false"/>
</bean>
<!--配置会话工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--属性注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--属性注入mybatis的主配置文件-->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
</bean>
<!--配置扫描DAO接口-->
<!--MapperScannerConfigurer和SqlSessionFactoryBean都是来自于mybatis-spring.jar-->
<!--MapperScannerConfigurer,这个类就是你不写DAO接口实现类的原因-->
<!--bean时,什么时候需要些id属性? 如果这个bean定义好了以后需要在别的地方被引用就需要添加id属性-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入会话工厂-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--注入DAO层所在包的基础路径-->
<property name="basePackage" value="com.itmck.dao"/>
</bean>
<!--扫描DAO层的注解类,以**解是为了扫描这个注解:@Repository-->
<context:component-scan base-package="com.itmck.dao"/>
</beans>
配置:db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_spring?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
配置mybatis.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>
<!-- 开启驼峰命名转换 seckill_id====>seckillId -->
<!--设置此项后,可以不用在mapper.xml中配置resultMap映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--配置别名 可以不进行配置此项
配置此项目的,可以不使用类的全限定名,而是直接使用类的名字(忽略首字母大小写)
-->
<typeAliases>
<package name="com.org.itmck.pojo"/>
</typeAliases>
</configuration>
1:说明:很多人会问,直接配置一个springcontext.xml,将上边的放在一起不就行了.何必这样麻烦.也是可以的.我这样写,是为了更清楚讲述,三层分别代表什么.对初学者来说,更加简单.
2:配置xml的时候,我们要注意上边的schama与dtd要引入进来.用到哪些就引入哪些即可.
举个栗子:spring-mvc.xml需引入如下:.
xmlns:mvc=“http://www.springframework.org/schema/mvc”
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
其余自行参考文档
最后配置web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<!-- 配置Spring的配置文件 去加载spring的配置文件 -->
<listener>
<!-- 默认是去WEB-INF下找 applicationContext.xml配置文件 -->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</context-param>
<!-- 配置SPringMVC的核心处理器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation固定 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<!-- 启动服务器就实例化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- SPring解决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>
<!-- form表单只支持 Get和POST 如果想支持rest风格 得配置该过滤器 然后该过滤器会帮我们实现 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
上边有两点说明:
1:配置springmvc核心处理器.其执行流程读者可以去学一下.面试很容易问道.这里不多说.
<!-- 配置SPringMVC的核心处理器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation固定 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<!-- 启动服务器就实例化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
到这里其ssm搭建就算结束了.最后写一个测试类.来测试一下:
controller层:
@Controller
public class ActionController {
@Autowired
private UserService userService;
@RequestMapping("gt")
@ResponseBody
public User getIndex(String name) {
return userService.selectByName(name);
}
}
service层
public interface UserService {
/**
* 获取用户
* @param name
* @return
*/
User selectByName(String name);
User getUser(Long id);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User selectByName(String name) {
return userDao.selectByName(name);
}
@Override
public User getUser(Long id) {
return userDao.getUser(id);
}
}
dao层:这里我使用的是注解方式,简单测试能否可用
@Repository
public interface UserDao {
@Select("select * from tb_user where username=#{name}")
User selectByName(String name);
@Select("select * from tb_user where id=#{id}")
User getUser(Long id);
}
运行项目,测试如下:
这是很简单的ssm搭建.里面没有配置aop相关.如果需要配置aop,就在spring-service.xml中配置即可.记住一点:
约定>配置>编码
下面贴出整个项目的目录:
github代码 https://github.com/itmck/ssm-demo 此项目里面包含了ssm集成dubbo的简单案例.有余力的可以交流