SSM框架整合

目录

1. SSM框架概述

2. SSM框架整合

【任务】在Maven Web工程中实现Spring、SpringMVC、MyBatis框架整合。

 1.整合SSM框架依赖

 2.整合SSM框架配置

2.1.数据库连接参数

 

 2.2.SSM框架配置

 2.3.Log4j2日志配置

 2.4.web.xml配置

3.SSM框架完善

封装Api返回值结构

 封装分页参数

 封装分页查询条件

实现用户的分页查询功能

 实体类User

 VO类UserVo

 分页查询类UserQo

 UserMapper数据接口类,定义查询接口

 配置模糊查询的SQL

 业务服务类UserService,实现分页查询,并完成映射

 控制器UserController,实现分页查询的Action

4.测试整合结果

测试Log4j2

 测试阿里连接池Druid

测试业务层UserService

 测试控制器UserController


1. SSM框架概述

MVC设计模式代表 Model-View-Controller(模型-视图-控制器) 模式,这种模式用于应用程序的分层开发,解决了应用程序中业务逻辑、数据和界面显示的耦合问题,SSM框架就是实现了MVC设计模式的具体框架。SSM框架分别是指SpringSpringMVCMyBatis框架的组合。

SSM框架整合_第1张图片

2. SSM框架整合

任务Maven Web工程中实现SpringSpringMVCMyBatis框架整合

基于Maven Web工程的SSM框架的整合分成三大步骤

整合 SSM 框架 依赖
整合 SSM 框架 配置
测试整合结果

 1.整合SSM框架依赖

Springframework
Servlet & Jsp
Jstl
Mybaits & MySql
Log
Lombok
Json
jUnit

 


  4.0.0
  org.flowerfog
  ssm
  war
  1.0-SNAPSHOT
  ssm Maven Webapp
  https://maven.apache.org

  
    UTF-8
    17
    17

    6.1.8

    6.1.0
    3.0.0

    3.0.1
    3.0.1

    3.0.3
    3.5.16
    5.3.1
    9.0.0
    1.2.23

    2.19.0
    2.19.0

    1.18.34

    2.17.1

    4.12
  

  
    
    
      org.springframework
      spring-web
      ${springframework.version}
    
    
    
      org.springframework
      spring-webmvc
      ${springframework.version}
    
    
    
      org.springframework
      spring-jdbc
      ${springframework.version}
    
    
    
      org.springframework
      spring-test
      ${springframework.version}
    
    
    
      junit
      junit
      ${junit.version}
    

    
    
      jakarta.servlet
      jakarta.servlet-api
      ${jakarta.servlet-api.version}
    
    
    
      jakarta.servlet.jsp
      jakarta.servlet.jsp-api
      ${jakarta.servlet.jsp-api.version}
    
    
      jakarta.servlet.jsp.jstl
      jakarta.servlet.jsp.jstl-api
      ${jakarta.servlet.jsp.jstl-api.version}
    
    
      org.glassfish.web
      jakarta.servlet.jsp.jstl
      ${jakarta.servlet.jsp.jstl.version}
    

    
    
      org.mybatis
      mybatis-spring
      ${mybatis-spring.version}
    
    
    
      org.mybatis
      mybatis
      ${mybatis.version}
    
    
    
      com.mysql
      mysql-connector-j
      ${mysql.version}
    
    
    
      com.alibaba
      druid
      ${druid.version}
    
    
    
      com.github.pagehelper
      pagehelper
      ${pagehelper.version}
    
    
    
      org.projectlombok
      lombok
      ${org.projectlombok.version}
    
    
    
      org.apache.logging.log4j
      log4j-api
      ${log4j-api.version}
    
    
      org.apache.logging.log4j
      log4j-core
      ${log4j-core.version}
    
    
    
      com.fasterxml.jackson.core
      jackson-databind
      ${jackson-databind.version}
    

  
  
    ssm
    
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.8.1
        
          ${maven.compiler.source}
          ${maven.compiler.target}
        
      
    

  



 2.整合SSM框架配置

 

数据库连接参数(含连接池参数)
SSM 框架配置
Log4j2 日志配置
Web.xml 配置

2.1.数据库连接参数

 

# 数据库驱动
jdbc.driver=com.mysql.cj.jdbc.Driver
# 数据库地址
jdbc.url=jdbc:mysql://127.0.0.1:3306/framedb?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
# 登录账号
jdbc.username=root
# 登录密码
jdbc.password=root
# 阿里巴巴连接池
initialSize=0
maxActive=20
minIdle=0
maxWait=10000
validationQuery=SELECT 1
testOnBorrow=false
testOnReturn=false
testWhileIdle=true
timeBetweenEvictionRunsMillis=6000
minEvictableIdleTimeMillis=25200000
removeAbandoned=true
removeAbandonedTimeout=1800
logAbandoned=true

 2.2.SSM框架配置

 

配置自动扫描组件
配置 SpringMVC 注解驱动
加载属性文件 ( db.properties )
配置数据源(基于阿里巴巴连接池)
配置 MyBatis 会话工厂
配置 Mapper 接口自动扫描
配置 SpringMVC 实体解析器
配置静态资源访问
配置拦截器、跨域支持等

 














    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    





    
    
    
    
    
    



    




    
    







    



 2.3.Log4j2日志配置

 



    
        %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
    

    
        
        
            
            
            
        
    

    
    
        
        
            
        
    



 2.4.web.xml配置

Web 版本调整到 3.0 以上
配置 DispatcherServlet

加载ssm配置文件

上传文件相关参数

配置编码过滤器

解决中文乱码

 



    ssm
    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:applicationContext.xml
        
        
        1
        
        
            5242880
            10485760
            0
        
    
    
    
        springmvc
        /
    

    
    
        encodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceEncoding
            true
        
    
    
        encodingFilter
        /*
    



 

3.SSM框架完善

封装Api返回值结构

 

package org.flowerfog.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//api返回值
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RetJson {
    /** 状态码 */
    private int code;
    /** 消息 */
    private String msg;
    /** 数据 */
    private Object data;
}


 封装分页参数

package org.flowerfog.common;

import lombok.Data;

//分页参数
@Data
public class PageParameter {
    private Integer pageIndex = 1;//页号,起始值1
    private Integer pageSize = 15;//页面记录数
}

 封装分页查询条件

package org.flowerfog.common;
import lombok.Data;
import lombok.ToString;

//分页查询条件
@Data
@ToString(callSuper = true)
public class PageQo extends PageParameter {
    private Qo filters;//查询条件
}

 

实现用户的分页查询功能

查询条件:用户名模糊查询
查询结果对用户状态需进行映射

 实体类User

package org.flowerfog.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 描述: 实体类 映射sys_user
 * Date:2024//11/18
 * Author:fxm
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    /**
     * 主键
     */
    private Integer id;
    /**
     * 用户名
     */
    private String name;
    /**
     * 登录账号
     */
    private String account;
    /**
     * 登录密码
     */
    private String password;
    /**
     * 状态
     * 0-正常
     * 1-禁用
     */
    private Integer status;
}


 VOUserVo

package org.flowerfog.vo;

import lombok.Data;
import lombok.ToString;
import org.flowerfog.domain.User;

@Data
@ToString(callSuper = true)
public class UserVo extends User {
    private String statusName;//状态显示值
}


 分页查询类UserQo

package org.flowerfog.domain.qo;

import lombok.Data;

//用户列表的查询条件
@Data
public class UserQo {
    private String name;//用户名-模糊查询
}


 UserMapper数据接口类,定义查询接口

package org.flowerfog.mapper;


import org.flowerfog.domain.User;
import org.flowerfog.domain.qo.UserQo;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserMapper{
    // 查询用户
    List list(UserQo qo);
}


 配置模糊查询的SQL




    
    




 业务服务类UserService,实现分页查询,并完成映射

package org.flowerfog.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import org.flowerfog.common.PageQo;
import org.flowerfog.domain.User;
import org.flowerfog.domain.qo.UserQo;
import org.flowerfog.mapper.UserMapper;
import org.flowerfog.vo.UserVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    //分页查询用户
    public PageInfo paged(PageQo pageQo) {
        PageHelper.startPage(pageQo.getPageIndex(), pageQo.getPageSize());
        List mos = userMapper.list(pageQo.getFilters());
        //System.out.println(mos);
        if (mos == null) return null;
        PageInfo moPageInfo = new PageInfo<>(mos);
        PageInfo voPageInfo = new PageInfo<>();
        BeanUtils.copyProperties(moPageInfo, voPageInfo);
        List vos = new ArrayList<>();
        for (User mo : mos) {
            UserVo vo = new UserVo();
            BeanUtils.copyProperties(mo, vo);
            //映射-状态
            vo.setStatusName(vo.getStatus().equals(0) ? "正常" : "禁用");
            vos.add(vo);
        }
        voPageInfo.setList(vos);
        return voPageInfo;
    }

}


 控制器UserController,实现分页查询的Action

package org.flowerfog.controller;

import com.github.pagehelper.PageInfo;
;
import org.flowerfog.common.PageQo;
import org.flowerfog.common.RetJson;
import org.flowerfog.domain.qo.UserQo;
import org.flowerfog.service.UserService;
import org.flowerfog.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    // 分页查询
    @PostMapping(value = "/paged")
    @ResponseBody
    public Object paged(@RequestBody PageQo qo){
        try {
            PageInfo paged = userService.paged(qo);
            return new RetJson(200,null,paged);
        }catch (Exception e){
            return new RetJson(-1,e.getMessage(),null);
        }
    }
}


 

4.测试整合结果

测试Log4j2

SSM框架整合_第2张图片

package org.flowerfog;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest {
    private static final Logger logger = LogManager.getLogger();
    public static void main(String[] args){
        logger.debug("debug message");
        logger.info("info message");
        logger.warn("warn message");
        logger.error("error message");
    }
}


 测试阿里连接池Druid

package org.flowerfog;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DruidTest {
    private static final Logger logger = LogManager.getLogger();

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取druid
        DruidDataSource dataSource = context.getBean(DruidDataSource.class);
        logger.info(dataSource);
        logger.info(dataSource.getUrl());
        logger.info(dataSource.getUsername());
        logger.info(dataSource.getPassword());
        logger.info(dataSource.getDriverClassName());
    }
}


 

测试业务层UserService

package org.flowerfog;

import com.github.pagehelper.PageInfo;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.flowerfog.common.PageQo;
import org.flowerfog.domain.qo.UserQo;
import org.flowerfog.service.UserService;
import org.flowerfog.vo.UserVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class UserServiceTest {
    private static final Logger logger = LogManager.getLogger();

    @Autowired
    private UserService userService;

    @Test
    public void test5() {
        PageQo pqo = new PageQo<>();
        UserQo qo = new UserQo();
        qo.setName("管理");
        pqo.setFilters(qo);
        pqo.setPageIndex(1);
        pqo.setPageSize(15);
        PageInfo paged = userService.paged(pqo);
        logger.debug(paged);
    }
}


 测试控制器UserController

package org.flowerfog;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.flowerfog.common.PageQo;
import org.flowerfog.domain.qo.UserQo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration()
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class UserControllerTest {
    private static final Logger logger = LogManager.getLogger();
    @Autowired
    private WebApplicationContext webApplicationContext;

    @Test
    public void paged() {
        try {
            PageQo pageQo = new PageQo<>();
            pageQo.setPageIndex(1);
            pageQo.setPageSize(10);
            UserQo userQo = new UserQo();
            userQo.setName("管理");
            pageQo.setFilters(userQo);
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonStr = objectMapper.writeValueAsString(pageQo);
            logger.info("jsonStr:{}", jsonStr);
            MvcResult mvcResult = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
                    .perform(MockMvcRequestBuilders.post("/user/paged")
                            .contentType(MediaType.APPLICATION_JSON_UTF8)//设置请求内容的类型
                            .content(jsonStr)//设置请求内容
                            .characterEncoding("UTF-8")
                    ).andReturn();
            mvcResult.getResponse().setCharacterEncoding("UTF-8");
            String contentAsString = mvcResult.getResponse().getContentAsString();
            logger.info(contentAsString);
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }
}

 

你可能感兴趣的:(Java,java,spring,springmvc,mybatis)