一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境
目录导航
前言
一、准备工作
二、创建Maven项目
三、pom.xml配置
四、配置web.xml spring*.xml文件
五、编写Controller和相应jsp页面
六、集成mybatis
七、测试
八、TroubleShooting
最后
前言
随着技术不断发展,在进行Java Web开发时,常常会用到一些技术框架来提高可扩展性、降低耦合度、提升效率等。下面就一步一步介绍如何搭建当下流行的Spring、Spring MVC以及MyBatis框架集成开发环境。
一、准备工作
- 硬件:电脑
- 软件:
- 安装Java并配置
- 安装maven并配置
- 集成开发环境IDE(P.S. 目前比较流行的是eclipse、IntelliJ Idea。本文用Idea)
- 数据库(本文用Mysql)
二、创建Maven项目
在Idea上File->New->Project 选择左侧的Maven
并且勾选“Create from archetype”,选择列表中的maven-archetype-webapp:RELEASE 如图:
点击Next 填写信息:
点击Next并添加保存路径->点击Finish即可
应该会生成类似的目录结构,细节不赘述了。
三、pom.xml配置
首先,我们来配置一下Spring、Spring MVC、MyBatis所需的Jar包依赖。
根据查阅Spring文档我们可以知道Spring需要添加:
- spring-core
- spring-context
- spring-jdbc
- spring-test
- spring-web
Spring MVC需要添加:
- spring-webmvc
因为需要连接Mysql,要添加Mysql连接的Jar包依赖(版本与你安装的Mysql版本相同即可):
- mysql-connector-java
另外需要JSTL相关的包,页面渲染会用到:
- jstl
- standard
pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.cdx</groupId>
<artifactId>ssm_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>5.0.1.RELEASE</spring.version>
<mysql.version>5.1.40</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
<mybatis.spring.version>1.3.1</mybatis.spring.version>
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<commons.dbcp.version>1.2.2</commons.dbcp.version>
<aspectj.version>1.7.4</aspectj.version>
<cglib.version>3.1</cglib.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<!-- spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Database -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
</dependency>
</dependencies>
</project>
目前为止,我们完成了pom.xml Jar包依赖的配置。
执行
mvn clean package
进行clean打包、下载相应Jar包。
console输出应该可以看到下载了一系列的Jar,并且Build Success说明执行成功。
四、配置web.xml spring*.xml文件
打开web.xml,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/spring-context*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>Load all Spring Config files under /spring</description>
<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>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
其中添加了一个Spring的Listener用以加载Spring Context。还有Spring的DispatcherServlet这是处理请求的核心Servlet。
上面配置中写到spring-context*.xml、spring-mvc*.xml,下面我们在项目工程的resources下面创建spring目录并创建spring-context.xml和spring-mvc.xml文件。
spring-context.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:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.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://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- Scan -->
<context:component-scan base-package="org.cdx" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
这里面配置了一个<context:component-scan/>标签,见名知意,主要是在base-package目录下扫描spring注解的类加载进Spring容器中,进行动态装配。也就是IOC(或DI)。
里面的<context:exclude-filter />指的是排除哪种注解,这里是Controller,我们准备将Controller注解扫描的任务交给Spring MVC来做。故这里排除啦。
下面配置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:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.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://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- Scan -->
<context:component-scan base-package="org.cdx" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
这里也有一个<context:component-scan />,有<context:include-filter />这里指的是只扫描加载Controller注解的类到IOC容器里。
下面注册了一个bean - "UrlBasedViewResolver",这是一个用于视图解析的基本bean,主要作用于Controller返回view之后解析其定位跳转到哪个具体的页面去渲染。
以上是最简单的配置,用于基本功能演示。
五、编写Controller和相应jsp页面
下面我们就写一个最简单的HelloWorldController:
package org.cdx.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* Created by cdx on 2018/1/28.
*/
// Controller注解,标识此类为Controller
@Controller
public class HelloWorldController {
//RequestMapping里面的值用于指定这个方法的访问路径,当url中request过来时会与RequestMapping的值进行匹配,匹配成功则交由对应的方法处理
@RequestMapping("/welcome")
public ModelAndView helloWorld() {
System.out.println("hello"); //打印信息,证明进行了当前方法
// 返回ModelAndView对象交由Spring MVC处理,第一个参数标识跳转的页面,第二个参数是设置的属性,第三个参数是属性的值
return new ModelAndView("welcome", "message", "Hello World!");
}
}
结合上面spring-mvc.xml中配置的viewResolver,"/welcome"会跳转的相应页面为/WEB-INF/jsp/welcome.jsp
创建welcome.jsp:
<html>
<body>
<h2>${message} SSM Demo</h2>
</body>
</html>
完成后的目录结构如下:
目前为止,Spring+Spring MVC的demo已经完成。
我们可以将项目配置部署到tomcat上运行看下效果。
访问:
http://localhost:8080/ssm_demo/welcome
可以看到后台console输出:
说明走了上面的方法helloworld(),页面如下hello.jsp内容:
六、集成mybatis
根据Spring集成Mybatis官方文档
第一步还是添加所需Jar包Maven依赖
<!-- DAO: MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons.dbcp.version}</version>
</dependency>
第二步配置spring-context.xml加入mybatis相关配置
首先要有相关的xml namespace,请参照完整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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
因为要使用mybatis进行数据库操作肯定要配置数据源
<!-- Data Source -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm_demo" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
然后来配置mybatis的数据库处理类SqlSessionFactoryBean:
<!-- MyBatis SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--<property name="mapperLocations" value="classpath*:org/cdx/ssm/dao/**"/>-->
<property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" />
<!-- An alternative way to configure mybatis configuration -->
<!-- <property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl" />
</bean>
</property> -->
</bean>
其中配置的"mybatis-config.xml"是mybatis的配置属性文件,例如可以:
<?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>
<!-- Global settings -->
<settings>
<!-- Global mapper enable or disable cache -->
<setting name="cacheEnabled" value="true"/>
<!-- Tell MyBatis how to auto map. -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- This is the default executor type. -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- Use camel case to transfer fields. -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- Print sql log. -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>
这里介绍用注解扫描方式来配置mybatis
<mybatis:scan base-package="org.cdx.ssm" factory-ref="sqlSessionFactory" annotation="org.springframework.stereotype.Repository" />
也就是有org.cdx.ssm包下有Repository注解的类会被注入mybatis相关bean用以进行数据库操作。
下面新建dao层下的mapper class - UserMapper:
package org.cdx.ssm.dao;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
@Select("SELECT count(*) FROM user")
int getUserCount();
}
这里需要创建数据库ssm_demo和user表(表内容不限制)。
简单起见,用注解@Select执行一个简单的sql查询。将UserMapper应用到之前HelloWorldController:
package org.cdx.ssm.controller;
import org.cdx.ssm.dao.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* Created by cdx on 2018/1/28.
*/
// Controller注解,标识此类为Controller
@Controller
public class HelloWorldController {
// Autowired注解:自动装配Spring IOC容器中对象到成员变量
@Autowired
private UserMapper userMapper;
//RequestMapping里面的值用于指定这个方法的访问路径,当url中request过来时会与RequestMapping的值进行匹配,匹配成功则交由对应的方法处理
@RequestMapping("/welcome")
public ModelAndView helloWorld() {
System.out.println("hello"); //打印信息,证明进行了当前方法
// 返回ModelAndView对象交由Spring MVC处理,第一个参数标识跳转的页面,第二个参数是设置的属性,第三个参数是属性的值
return new ModelAndView("welcome", "message", "Hello World!");
}
@RequestMapping("/userCount")
public ModelAndView userCount() {
int userCount = userMapper.getUserCount(); // 调用Mapper方法
// 返回ModelAndView对象交由Spring MVC处理,第一个参数标识跳转的页面,第二个参数是设置的属性,第三个参数是属性的值
return new ModelAndView("result", "userCount", userCount);
}
}
创建"result"视图对应jsp页面/WEB-INF/jsp/result.jsp:
<html>
<body>
<h2>Result: There are ${userCount} user(s) in DB.</h2>
</body>
</html>
最终项目结构如下:
OK,大功告成。
打开pom.xml执行mvn clean package以下载更新新加入的Jar包。确保Jar包已经应用到classpath中。
七、测试
目前为止,已经完成将Spring+Spring MVC+Mybatis开发环境集成搭建了。
重新打包工程部署,启动tomcat测试,访问:
http://localhost:8080/userCount
看到下面返回就成功啦
八、TroubleShooting
如jsp中EL表达式无法解析,可能web.xml中servlet版本低,参照:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
如出现
Unable to locate Spring NamespaceHandler for XML schema namespace xxx
错误提示,请确认所有Jar包都已加入classpath。
最后
完整工程代码请戳这里github ===》 ssm_demo.
欢迎留言交流讨论~