SSM框架中各层次作用及其关系(一)

发布时间 2023-12-05 14:12:42作者: 最怕万一见温柔

SSM框架中各层次作用及其关系(一)

平常学习生活中看见许多框架中的层次,都会有点懵,不知其意,抑或是看了又忘,所以这就是这篇短文的目的

总体辨析

JAVASSM(Java Web Application with Spring, Spring MVC, and MyBatis)是一种基于Java技术栈的Web应用开发框架,结合了Spring、Spring MVC和MyBatis三大框架。在一个标准的JAVASSM项目中,通常会包含以下几个主要的层:

  1. 表现层(Presentation Layer):

    • 主要使用Spring MVC框架进行开发。
    • 包括控制器(Controller):接受用户请求,调用服务层处理业务逻辑,并返回相应的视图。
    • 视图(View):负责展示数据,通常使用JSP、Thymeleaf等模板引擎。
  2. 业务逻辑层(Service Layer):

    • 使用Spring框架的@Service注解进行标识。
    • 包含业务逻辑的处理,调用持久层进行数据访问。
  3. 持久层(Persistence Layer):

    • 使用MyBatis框架进行数据库操作,或者其他持久化框架。
    • 包括数据访问对象(DAO):负责与数据库交互,执行SQL语句,将数据存取与业务逻辑层解耦。
  4. 领域层(Domain Layer):

    • 包含业务实体(Entity):表示系统中的核心业务对象。
    • 可以包括值对象(Value Object)、聚合根(Aggregate Root)等。
  5. 数据访问层(Data Access Layer):

    • 用于封装数据访问的细节,包括数据库连接、事务管理等。
  6. 配置层(Configuration Layer):

    • 包括Spring配置、MyBatis配置等。
    • 在Spring中,可以使用@Configuration注解标识配置类,通过@Bean注解定义一些Bean。
  7. 工具类层(Utility Layer):

    • 包括一些通用的工具类,如日期处理、字符串处理、加密解密等。
  8. 测试层(Testing Layer):

    • 包括单元测试、集成测试等,确保系统的稳定性和可靠性。

这些层的划分有助于项目的组织和维护,同时也符合分层设计的思想,使得各个模块之间的关系更加清晰,提高了系统的可维护性和扩展性。在实际项目中,可以根据具体需求进行适当的调整和扩展。

项目概览

image

上图是一个普通的SSM项目,其包括了 controller, dao, interceptor, pojo, service 等层次

DAO层

持久层:DAO层(mapper层)(属于mybatis模块)

IModuleDao

package com.iflytek.dao;

import com.iflytek.pojo.Module;

import java.util.List;

public interface IModuleDao {
    List<Module> moduleList();
}

这段代码定义了一个名为IModuleDao的接口,该接口中有一个方法moduleList()。这个方法返回一个Module对象的列表。

在Java中,接口是一种特殊的抽象类型,它只包含抽象方法和常量。接口不能被实例化,但可以被其他类实现(即提供具体实现)。在这个例子中,IModuleDao接口被设计为提供对模块列表的访问。

任何实现了IModuleDao接口的类都需要提供moduleList()方法的具体实现,以便能够返回一个模块列表。这样,我们就可以使用这个接口来获取模块列表,而不必关心这些模块是如何存储和管理的。

controller层

控制层/表现层:Controller层(Handler层) (属于springMVC模块)

MoudleController

package com.iflytek.controller;

import com.iflytek.pojo.Module;
import com.iflytek.service.IModuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class ModuleController {

    @Autowired
    private IModuleService moduleService;

    @RequestMapping("/moduleList")
    @ResponseBody
    public List<Module> moduleList(){
        List<Module> moduleList = moduleService.moduleList();
        return moduleList;
    }
}

这是一个Java代码,用于创建一个名为ModuleController的控制器类。这个类使用了@Controller注解,表示它是一个Spring MVC框架中的控制器。

在这个类中,有一个名为moduleService的私有成员变量,它的类型是IModuleService,并且使用了@Autowired注解进行自动注入。这意味着在Spring容器中,会自动寻找一个实现了IModuleService接口的bean,并将其赋值给moduleService

接下来,定义了一个名为moduleList的方法,该方法使用了@RequestMapping("/moduleList")注解,表示当用户访问/moduleList路径时,会调用这个方法。同时,该方法还使用了@ResponseBody注解,表示将方法返回的结果直接作为HTTP响应的内容,而不是通过视图解析器进行渲染。

moduleList方法中,首先调用了moduleServicemoduleList()方法,获取到一个Module对象的列表,然后将这个列表作为方法的返回值。

总之,这段代码的作用是创建一个控制器类,用于处理用户对/moduleList路径的请求,并返回一个Module对象的列表。

UploadController

package com.iflytek.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import java.io.File;
import java.io.IOException;


@Controller
public class UploadController {

    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("user") MultipartFile file) throws IOException {

        System.out.println("获取文件的名称:"+file.getOriginalFilename());
        System.out.println("获取文件大小:"+file.getSize());
        //上传
        file.transferTo(new File("d://img/"+file.getOriginalFilename()));
       // CommonsMultipartResolver
        //ContextLoaderListener


        return "success";

    }
}

这是一个Java Spring框架中的控制器类,用于处理文件上传请求。具体解释如下:

  1. @Controller:这是一个注解,表示这个类是一个Spring MVC控制器。
  2. public class UploadController { ... }:定义了一个名为UploadController的公共类。
  3. @PostMapping("/upload"):这是一个注解,表示这个方法处理的是HTTP POST请求,请求路径为"/upload"。
  4. @ResponseBody:这是一个注解,表示这个方法的返回值将直接作为HTTP响应的内容,而不是被视图解析器解析。
  5. public String upload(@RequestParam("user") MultipartFile file) throws IOException { ... }:定义了一个名为upload的公共方法,接收一个名为file的MultipartFile类型的参数,并抛出IOException异常。这个方法用于处理文件上传请求。
  6. System.out.println("获取文件的名称:"+file.getOriginalFilename());:打印文件的原始文件名。
  7. System.out.println("获取文件大小:"+file.getSize());:打印文件的大小。
  8. file.transferTo(new File("d://img/"+file.getOriginalFilename()));:将上传的文件保存到指定的目录(这里是"d://img/")下,文件名与上传的文件相同。
  9. return "success";:返回字符串"success",表示文件上传成功

interceptor

interceptor拦截器 (属于SpringBoot模块)

MyInterceptor

package com.iflytek.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;


@Component
public class MyInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURL());
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

这段代码是一个Java类,名为MyInterceptor,实现了HandlerInterceptor接口。HandlerInterceptor接口是Spring MVC框架中的一个接口,用于在请求处理过程中的各个阶段执行一些操作。这个类有三个方法:preHandlepostHandleafterCompletion,分别对应请求处理过程的三个阶段。

  1. preHandle方法:在请求处理之前执行,例如进行权限检查、参数校验等。在这个方法中,我们打印了请求的URL和字符串"preHandle"。最后返回true表示继续处理请求。

比较复制插入新建收起

@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
    System.out.println(request.getRequestURL());
    System.out.println("preHandle");
    return true;
}
  1. postHandle方法:在请求处理之后,视图渲染之前执行。例如,可以在这里设置响应头信息、添加响应内容等。在这个方法中,我们只打印了字符串"postHandle"。

比较复制插入新建收起

@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle");
}
  1. afterCompletion方法:在请求处理完成并且视图渲染完成后执行。例如,可以在这里进行资源清理、日志记录等。在这个方法中,我们只打印了字符串"afterCompletion"。

比较复制插入新建收起

@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("afterCompletion");
}

此外,这个类还有一个@Component注解,表示这是一个Spring组件,可以在其他地方自动装配并使用。

POJO层

普通JAVA对象

Moudle

package com.iflytek.pojo;

import lombok.Data;

@Data
public class Module {
    private int id;
    private String name;
    private String imgUrl;
    private String url;
}

这段代码是一个Java类,名为Module,用于表示一个模块。它使用了Lombok库的@Data注解,该注解会自动为类生成getter、setter、equals、hashCode和toString方法。

类中定义了四个私有成员变量:

  1. id:整型,表示模块的唯一标识符。
  2. name:字符串类型,表示模块的名称。
  3. imgUrl:字符串类型,表示模块的图片URL。
  4. url:字符串类型,表示模块的链接地址。

service层

业务层:Service层(属于spring模块)

IMoudleService

package com.iflytek.service;

import com.iflytek.pojo.Module;

import java.util.List;

/**
 * @Author:JSJ
 * @DATE:2023/12/5
 * @Description:
 */
public interface IModuleService {
    List<Module> moduleList();
}

这段代码定义了一个名为IModuleService的接口,该接口中有一个方法moduleList()。这个方法的返回类型是List<Module>,表示它将返回一个包含Module对象的列表。

接口是一种抽象类型,它可以被实现(implemented)为具体的类。这意味着任何实现了IModuleService接口的类都需要提供moduleList()方法的具体实现。

MoudleService

package com.iflytek.service.impl;

import com.iflytek.dao.IModuleDao;
import com.iflytek.pojo.Module;
import com.iflytek.service.IModuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class ModuleService implements IModuleService {

    @Autowired
    private IModuleDao moduleDao;
    @Override
    public List<Module> moduleList() {
        return moduleDao.moduleList();
    }
}

这是一个Java类,名为ModuleService,它实现了IModuleService接口。这个类主要用于处理与模块相关的服务。

  1. package com.iflytek.service.impl;:表示这个类所在的包是com.iflytek.service.impl
  2. import语句:导入了所需的类和接口。
  3. @Service注解:表示这个类是一个Spring框架的服务类,用于处理业务逻辑。
  4. private IModuleDao moduleDao;:声明了一个私有的IModuleDao类型的变量moduleDao,用于访问数据库。
  5. @Autowired注解:表示自动注入moduleDao对象。
  6. public List<Module> moduleList():定义了一个公共方法moduleList(),返回一个Module对象的列表。这个方法通过调用moduleDaomoduleList()方法来获取模块列表。
  7. @Override注解:表示这个方法重写了父类或接口中的方法。

impl

在Java的项目中,"impl" 通常是 "implementation" 的缩写,表示实现。在 Service 层中,命名为 "Service" 接口的实现类(implementation class)通常被命名为 "ServiceImpl",以明确它是接口的实现。

例如,如果有一个名为 "UserService" 的接口,那么它的实现类可能被命名为 "UserServiceImpl"。这是一种常见的命名约定,有助于提高代码的可读性和可维护性。

示例:

javaCopy code// UserService 接口
public interface UserService {
    User getUserById(int userId);
    void saveUser(User user);
    // 其他方法...
}

// UserService 的实现类
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public User getUserById(int userId) {
        return userDao.selectUserById(userId);
    }

    @Override
    public void saveUser(User user) {
        userDao.insertUser(user);
    }

    // 其他方法的实现...
}

在上述示例中,UserServiceImpl 类实现了 UserService 接口,提供了对用户的操作实现。这种命名约定有助于让项目的结构更清晰,使开发人员更容易理解代码的组织结构