SSM框架是常用的web项目框架。由spring、springMVC、mybatis框架整合而来。是标准的MVC模式,将整个系统分成表现层、controller层、service层和dao层。
Spring有两个特性:控制反转(IOC)和面向切面编程(AOP)。即对象的创建、初始化与销毁交给spring核心模块来管理。开发者只需专注于业务逻辑模块部分即可。
SpringMVC是一款基于MVC架构模式的轻量级Web框架,使用请求一相应模型。由于Spring MVC遵循MVC架构规范,因此分层开发数据模型层(Model)、相应视图层(View)和控制层(Controller),可以让开发者设计出架构规整的Web层。
Mybatis是Apache的一个开源Java项目,原名ibatis。是一款支持动态sql语句的持久层框架,开发人员可以将更多精力集中在sql语句上。Mybatis将sql语句配置在XML文件中,通过Mybatis提供的输入参数映射方式,将参数自由灵活的配置到配置文件中的sql语句中。通过Mybatis的输出映射机制,将结果集的检索自动映射成相应的Java对象。
项目结构如图:
项目结构简介:
.idea文件夹内放有idea的一些配置文件,不用理会
src文件夹将放置项目的主要类
pom.xml文件是Maven的配置文件,在里面添加我们需要的jar包的依赖,然后Maven就会帮我们下载到本地仓库。
咱们的目的是创建一个小型的用户查询网页,即用户输入账号,系统返回邮箱信息。
2.1设计数据库
本次只需建一个很简单的表
2.2为项目添加依赖
确定好工程需要的依赖后,就需要向Maven的pom.xml文件添加这些依赖。
在Pom.xml中添加spring,mybatis,日志的依赖,代码过长,就不展示了。
2.3创建存放各层的文件夹
2.4创建日志和数据库的配置文件
2.5创建Mybatis的基础配置文件“SqlMapConfig.xml”
2.6配置数据库连接池及事务管理的类加载文件beans.xml
2.7编写Spring MVC核心配置文件,配置Controller的扫描、处理器映射器和处理器适配器、视图解析器前后缀,以及拦截器、上传下载
该配置主要是针对Spring MVC的。首先开发人员编写的处理器Controller类要暴露注释让Spring扫描并加载,所以一开始配置了Controller扫描的机制。然后配置视图解析器“jspViewResolver”,为了Controller在返回视图时路径简单,这里配置了视图路径的前缀prefix及后缀suffix.这里使用基于注解的映射器和适配器,“annotation-driven”表明可以使用Spring MVC提供的默认配置。后面的拦截器、文件上传解析器在用到时再配置(以后可能还要配置校验机制,拓展性比较好)
总结:Spring配置文件主要处理Bean注入、数据源、事务等,Spring MVC 主要配置Controller扫描、处理器适配器、拦截器及其他MVC模式等。
2.8创建页面文件所需要的样式、脚本及图片文件夹
SSM基本环境配置完毕。
3.1测试连接数据库
package db;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DBConnection {
//Mybatis配置文件
private String resource="beans.xml";
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession = null;
@Test
public void testConnection(){
//获取spring类加载对象
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(resource);
//从配置对象中创建会话工厂,并注入Mybatis配置文件的信息
sqlSessionFactory = (SqlSessionFactory) classPathXmlApplicationContext.getBean("sessionFactory");
sqlSession = sqlSessionFactory.openSession();
if (sqlSession!=null){
System.out.println("Mybatis-数据库连接成功!");
}else {
System.out.println("连接失败");
}
}
}
出现这个结果,代表前面的Mybatis基本配置环境是正确的。
3.2编写实体类User,Mapper的映射文件UserMapper.xml,在其中加入一个通过名称获取用户信息的SQL配置。
package entity;
public class User {
private String sname;
private String email;
public User() {
}
public void setSname(String sname) {
this.sname = sname;
}
public void setEmail(String email) {
this.email = email;
}
public String getSname() {
return sname;
}
public String getEmail() {
return email;
}
}
在beans.xml配置文件中为sessionFactory对象注入了mapperLocation参数,并在其中设置了扫描Mapper配置文件的路径。所以SqlSessionFactory会话工厂类能够搜索到Mapper文件并加载其中的SQL配置。
3.3修改数据库连接测试类DBConnectionTest,使用获取的sqlSession会话对象查询名称为“张三”的用户信息。
package db;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DBConnection {
//Mybatis配置文件
private String resource="beans.xml";
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession = null;
//获取sqlSession
public SqlSession getSqlSession() throws Exception{
//获取spring类加载对象
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(resource);
//从配置对象中创建会话工厂,并注入Mybatis配置文件的信息
sqlSessionFactory = (SqlSessionFactory) classPathXmlApplicationContext.getBean("sessionFactory");
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
@Test
public void testConnection() throws Exception {
sqlSession = getSqlSession();
User user = sqlSession.selectOne("test.findUserByName","zhangsan");
System.out.println("取出的用户信息");
System.out.println(user.getSname());
System.out.println(user.getEmail());
}
}
执行代码,出现:
说明Mybatis依赖引入及基本配置是成功的。
3.4测试Spring 的注入和切面功能有没有配置成功
Dao层:
package dao;
import entity.User;
import java.util.List;
public interface TestDao {
public List findUserByName(User user);
}
Dao的实现层:
package daoIMPL;
import dao.TestDao;
import entity.User;
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//为了包扫描的时候这个Dao被扫描到,Dao层对外暴露自己bean的一种方式,对象名称为Dao接口的首字母小写的名称
public class TestDaoImpl implements TestDao {
@Autowired//注入SqlSessionFactory,加载Spring的xml配置文件中的sqlSessionFactory会话工厂配置,获得一个注入有数据源的对象
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession=null;
private SqlSession getSqlSession(){
if (sqlSession==null){
sqlSession = sqlSessionFactory.openSession();
}
return sqlSession;
}
@Override
public List findUserByName(User user) {
List uList = getSqlSession().selectList("test.findUserByName","%"+user.getSname()+"%");
return uList;
}
}
service层:
package service;
import entity.User;
import java.util.List;
public interface TestService {
public List findUserByName(User user);//调用Dao的姓名查询方法
}
service实现层:
package serviceIMPL;
import dao.TestDao;
import entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import service.TestService;
import java.util.List;
@Service//暴露该实现类以供Controller使用
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
public List findUserByName(User user) {
return testDao.findUserByName(user);
}
}
敲黑板:普通Spring项目要配置Service及Dao层的bean加载,用于指定接口对应的实现类,然后在相关的bean中注入,使用SSM框架不用配置bean加载,为了简化配置,使用注解来暴露和引入相关的Service及Dao对应的bean.
为此,只需要在相关的service实现类上添加@Service注解,在相关的Dao实现类上添加@Repository注解,分别表示一个Service的暴露bean和一个Dao的暴露bean.例如Service实现类为“TestServiceImpl”,那么默认暴露出一个id为“testService”的bean配置(以接口名称首字母小写为准)。
在其他类中引入暴露的bean时,使用@Resource注解并配置在成员变量或者set方法上部即可。例如TestServiceImpl要引入id为“testDao”的Dao层的bean对象,配置代码如下:
@Service
public class TestServiceImpl implements TestService{
@Resource
TestDao testDao;
}
注:关于"@Service"及“@Repository”的命名方式,只是为了区分业务层和数据库连接层,它们本质的原理(暴露实现类)是相同的。
3.5在Controller层中也使用@Autowired注解注入Service的实现bean,在相关测试方法中调用该Service实现类的findUserByName方法。
package controller;
import entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import service.TestService;
import javax.jws.WebParam;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
public class TestController {
@Autowired
private TestService testService;
@RequestMapping(value = "/findUser.action")
private String findUser(User user, Model model, HttpServletRequest request){
String sname = (String)request.getParameter("sname");
user.setSname(sname);
System.out.println("输入:" + user.getSname());
user = (User) testService.findUserByName(user);
model.addAttribute("user",user);
System.out.println(user.getEmail());
return "/test/showMessage.jsp";
}
}
Controller层利用@RequestMapping注解进行地址的映射。
3.6编写jsp查询界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Test
3.7编写查询成功后的返回界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<% User user = (User)request.getAttribute("user");%>
姓名:<%=user.getSname()%>
邮箱:<%=user.getEmail()%>
至此,项目编写完毕,剩下的就是调试运行了。一般第一次自己写SSM项目运行会遇到各种各样的坑,
4.1配置Tomcat
这样就是启动成功了。
成功返回界面:
这个SSM入门项目到此就结束了。
使用框架编程,入门很难,但掌握框架之后,使用就会很方便。
本博客参考自朱要光老师书籍《Spring MVC+Mybatis开发从入门到项目实战》