本文介绍一下 IDEA MAVEN 环境下,搭建 SSM框架项目。本文含代码,篇幅较长,建议根据目录阅读,或直接点击本文末段的demo下载。
1. IDEA 创建Maven项目
2.项目结构
3.Demo 开发详细步骤
3.1 maven引入必要依赖
maven porm.xml 文件配置如下(此处只引入了,demo所需要的必要依赖)
<?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>com.wys</groupId>
<artifactId>demo_ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo_ssm Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<finalName>demo_ssm</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
3.2 编写Pojo
package com.wys.pojo;
/**
* Created by wangyushuai@fang.com on 2018/4/19.
*/
public class Test {
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private Integer id;
}
3.2 编写 Dao
在ssm框架中,我们使用Mybatis处理数据持久化。 Mybatis需要一个编写一个接口(TestMapper)和一个对应的xml文件(TestMappper.xml 文件规定了sql查询的sql语句)
xml文件中的sql语句将通过 Id 和 接口中的 方法签名对应起来。
下面是对应代码:
package com.wys.mapper;
import com.wys.pojo.Test;
import java.util.List;
/**
* Created by wangyushuai@fang.com on 2018/4/19.
*/
public interface TestMapper {
List<Test> allList();
}
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.wys.mapper.TestMapper">
<select id="allList" resultType="Test">
select id from `user` order by id desc
</select>
</mapper>
补充:
TestMapper.class和 TestMapper.xml 需要打包至同一个目录,所以我在Resources路径下建立了对应的路径。
(resources 属于Resources Root, 打包时,将直接打包至 classpath目录,这是需要注意下的尝试。)
3.3 编写Service层
Service层描述了 业务逻辑,由于我们demo逻辑只是一个查询功能,所以看起来比较简单。
先编写一个接口,而后实现接口。做到业务的清晰。
Service.class
package com.wys.service;
import com.wys.pojo.Test;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by wangyushuai@fang.com on 2018/4/19.
*/
public interface TestService {
List<Test> getAllList();
}
ServiceImpl.class
package com.wys.service;
import com.wys.mapper.TestMapper;
import com.wys.pojo.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by wangyushuai@fang.com on 2018/4/19.
*/
@Service
public class TestServiceImpl implements TestService {
@Autowired
TestMapper mapper;//绑定mapper
@Override
public List<Test> getAllList() {
return mapper.allList();
}
}
3.4 编写Controller层
Controller层,个人理解,他的作用相当于中转站,负责调度作用,接收参数,传递参数,从Service 业务逻辑层获取到数据,然后将数据传至视图层。
package com.wys.controller;
import com.wys.pojo.Test;
import com.wys.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* Created by wangyushuai@fang.com on 2018/4/19.
*/
@Controller
@RequestMapping("/")
public class TestController {
@Autowired
TestService service;
@RequestMapping(value = "/index",method = RequestMethod.GET)
public ModelAndView Index() {
ModelAndView mv = new ModelAndView();
List<Test> allUser = service.getAllList();
mv.setViewName("test");
mv.addObject("userList",allUser);
return mv;
}
}
3.5 编写视图层
test.jsp 接收 Controller 传递来的数据,并将数据显示。
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach items="${userList}" var="item" varStatus="vs">
<p>${item.id}</p>
</c:forEach>
</body>
</html>
注意: 此处注意一下,我在这儿并没有使用 isELIgnored=”false”,这可能会导致你的视图层无法识别你的 JSTL表达式。
由于我在 web.xml 中已经配置过了,所以不再需要每个页面都写 JSTL表达式了。相关注意点,我们下篇博文分享。
3.6 Spring MVC 相关配置
上面我们已经编写完了业务代码,后面就是配置Spinrg了,这一块要尤其注意,配置错一点,就可能导致项目无法运行成功。
我们需要配置三个文件: SpringMVC.xml , applicationContext.xml, web.xml 文件
3.6.1 SpringMVC.xml
SpringMVC.xml 中主要干一下几件事儿。
- 扫描Controller,并将其生命周期纳入Spring管理
- 注解驱动,以使得访问路径与方法的匹配可以通过注解配置
- 静态资源可访问,如 静态页面,如html,css,js,images可以访问
- 视图定位(拼接逻辑等)
代码如下:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!--1. 扫描Controller,并将其生命周期纳入Spring管理 -->
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.wys.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter>
</context:component-scan>
<!--2. 注解驱动,以使得访问路径与方法的匹配可以通过注解配置-->
<mvc:annotation-driven/>
<!--3. 静态页面,如html,css,js,images可以访问-->
<mvc:default-servlet-handler />
<!--视图定位到/WEB/INF/jsp 这个目录下-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3.6.2 配置applicationContext.xml
applicationContext.xml 主要负责以下几件事儿。
- Service声明周期 纳入Spring的管理
- 配置数据源
- 扫描存放SQL语句的[*]Mapper.xml 文件
- 扫描Mapper,并将生命周期其纳入Spring管理
<?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 />
<context:component-scan base-package="com.wys.service"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value> jdbc:mysql://localhost:3306/_local_test?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="typeAliasesPackage" value="com.wys.pojo" />
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:com/wys/mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wys.mapper"/>
</bean>
</beans>
3.6.3 配置web.xml 文件
web.xml 文件主要完成如下配置:
- 通过ContextLoaderListener在web app启动的时候,获取contextConfigLocation配置文件的文件名applicationContext.xml,并进行Spring相关初始化工作
–有任何访问,都被DispatcherServlet所拦截,这就是Spring MVC那套工作机制了。
<?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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<!-- spring的配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- spring mvc核心:分发servlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring mvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.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>
4 部署运行
5 补充
在这个demo里,除了搭建SSM,我还加了记录日志的配置,resources下的log4j.properties文件。
这样我们就可以看到 Mybatis拼接的sql语句等日志了。
文件配置如下:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.wys=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
6 运行效果:
7 demo下载
https://github.com/wangyushuai/demo_ssm.git