南风知我意 吹梦到西洲.|

最怕万一见温柔

园龄:1年5个月粉丝:8关注:8

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

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 接口,提供了对用户的操作实现。这种命名约定有助于让项目的结构更清晰,使开发人员更容易理解代码的组织结构

本文作者:最怕万一见温柔

本文链接:https://www.cnblogs.com/LoveForeverIT/p/17877064.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   最怕万一见温柔  阅读(140)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 最爱 周慧敏
最爱 - 周慧敏
00:00 / 00:00
An audio error has occurred.

作词 : 李克勤

作曲 : 中島みゆき

编曲 : 卢东尼

天空一片蔚蓝 清风添上了浪漫

心里那份柔情蜜意似海无限

在那遥远有意无意遇上

共你初次邂逅谁没有遐想

诗一般的落霞 酒一般的夕阳

似是月老给你我留印象

斜阳离去朗月已换上

没法掩盖这份情欲盖弥彰

这一刹情一缕 影一对人一双

那怕热炽爱一场

潮汐退和涨 月冷风和霜

夜雨的狂想 野花的微香

伴我星夜里幻想 方知不用太紧张

没法隐藏这份爱 是我深情深似海

一生一世难分开 难改变也难再

让你的爱满心内

在那遥远有意无意遇上

共你初次邂逅谁没有遐想

诗一般的落霞 酒一般的夕阳

似是月老给你我留印象

斜阳离去朗月已换上

没法掩盖这份情欲盖弭彰

这一刹情一缕 影一对人一双

那怕热炽爱一场

潮汐退和涨 月冷风和霜

夜雨的狂想 野花的微香

伴我星夜里幻想 方知不用太紧张

没法隐藏这份爱 是我深情深似海

一生一世难分开 难改变也难再

让你的爱满心内

潮汐退和涨 月冷风和霜

夜雨的狂想 野花的微香

伴我星夜里幻想 方知不用太紧张

没法隐藏这份爱 是我深情深似海

一生一世难分开 难改变也难再

让你的爱满心内

让我的爱全给你 全给我最爱

地老天荒仍未改