欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

程序员文章站 2022-04-01 23:03:30
...

目录导航

前言

一、准备工作

二、创建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 

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

并且勾选“Create from archetype”,选择列表中的maven-archetype-webapp:RELEASE 如图:

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

点击Next 填写信息:

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

点击Next并添加保存路径->点击Finish即可

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

应该会生成类似的目录结构,细节不赘述了。

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

 

 

三、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包。

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

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+MyBatis SSM框架开发环境

目前为止,Spring+Spring MVC的demo已经完成。

我们可以将项目配置部署到tomcat上运行看下效果。

访问:

http://localhost:8080/ssm_demo/welcome

可以看到后台console输出:

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

说明走了上面的方法helloworld(),页面如下hello.jsp内容:

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

 

六、集成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>
 

最终项目结构如下:

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

OK,大功告成。

打开pom.xml执行mvn clean package以下载更新新加入的Jar包。确保Jar包已经应用到classpath中。

 

七、测试

目前为止,已经完成将Spring+Spring MVC+Mybatis开发环境集成搭建了。

重新打包工程部署,启动tomcat测试,访问:

http://localhost:8080/userCount

看到下面返回就成功啦

一步一步,学习如何搭建Spring+Spring MVC+MyBatis SSM框架开发环境

 

八、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.

欢迎留言交流讨论~