SSM框架中各層次作用及其關係(一) 平常學習生活中看見許多框架中的層次,都會有點懵,不知其意,抑或是看了又忘,所以這就是這篇短文的目的 總體辨析 JAVASSM(Java Web Application with Spring, Spring MVC, and MyBatis)是一種基於Java技 ...
SSM框架中各層次作用及其關係(一)
平常學習生活中看見許多框架中的層次,都會有點懵,不知其意,抑或是看了又忘,所以這就是這篇短文的目的
總體辨析
JAVASSM(Java Web Application with Spring, Spring MVC, and MyBatis)是一種基於Java技術棧的Web應用開發框架,結合了Spring、Spring MVC和MyBatis三大框架。在一個標準的JAVASSM項目中,通常會包含以下幾個主要的層:
-
表現層(Presentation Layer):
- 主要使用Spring MVC框架進行開發。
- 包括控制器(Controller):接受用戶請求,調用服務層處理業務邏輯,並返回相應的視圖。
- 視圖(View):負責展示數據,通常使用JSP、Thymeleaf等模板引擎。
-
業務邏輯層(Service Layer):
- 使用Spring框架的@Service註解進行標識。
- 包含業務邏輯的處理,調用持久層進行數據訪問。
-
持久層(Persistence Layer):
- 使用MyBatis框架進行資料庫操作,或者其他持久化框架。
- 包括數據訪問對象(DAO):負責與資料庫交互,執行SQL語句,將數據存取與業務邏輯層解耦。
-
領域層(Domain Layer):
- 包含業務實體(Entity):表示系統中的核心業務對象。
- 可以包括值對象(Value Object)、聚合根(Aggregate Root)等。
-
數據訪問層(Data Access Layer):
- 用於封裝數據訪問的細節,包括資料庫連接、事務管理等。
-
配置層(Configuration Layer):
- 包括Spring配置、MyBatis配置等。
- 在Spring中,可以使用@Configuration註解標識配置類,通過@Bean註解定義一些Bean。
-
工具類層(Utility Layer):
- 包括一些通用的工具類,如日期處理、字元串處理、加密解密等。
-
測試層(Testing Layer):
- 包括單元測試、集成測試等,確保系統的穩定性和可靠性。
這些層的劃分有助於項目的組織和維護,同時也符合分層設計的思想,使得各個模塊之間的關係更加清晰,提高了系統的可維護性和擴展性。在實際項目中,可以根據具體需求進行適當的調整和擴展。
項目概覽
上圖是一個普通的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
方法中,首先調用了moduleService
的moduleList()
方法,獲取到一個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框架中的控制器類,用於處理文件上傳請求。具體解釋如下:
@Controller
:這是一個註解,表示這個類是一個Spring MVC控制器。public class UploadController { ... }
:定義了一個名為UploadController的公共類。@PostMapping("/upload")
:這是一個註解,表示這個方法處理的是HTTP POST請求,請求路徑為"/upload"。@ResponseBody
:這是一個註解,表示這個方法的返回值將直接作為HTTP響應的內容,而不是被視圖解析器解析。public String upload(@RequestParam("user") MultipartFile file) throws IOException { ... }
:定義了一個名為upload的公共方法,接收一個名為file的MultipartFile類型的參數,並拋出IOException異常。這個方法用於處理文件上傳請求。System.out.println("獲取文件的名稱:"+file.getOriginalFilename());
:列印文件的原始文件名。System.out.println("獲取文件大小:"+file.getSize());
:列印文件的大小。file.transferTo(new File("d://img/"+file.getOriginalFilename()));
:將上傳的文件保存到指定的目錄(這裡是"d://img/")下,文件名與上傳的文件相同。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框架中的一個介面,用於在請求處理過程中的各個階段執行一些操作。這個類有三個方法:preHandle
、postHandle
和afterCompletion
,分別對應請求處理過程的三個階段。
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;
}
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");
}
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方法。
類中定義了四個私有成員變數:
id
:整型,表示模塊的唯一標識符。name
:字元串類型,表示模塊的名稱。imgUrl
:字元串類型,表示模塊的圖片URL。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
介面。這個類主要用於處理與模塊相關的服務。
package com.iflytek.service.impl;
:表示這個類所在的包是com.iflytek.service.impl
。import
語句:導入了所需的類和介面。@Service
註解:表示這個類是一個Spring框架的服務類,用於處理業務邏輯。private IModuleDao moduleDao;
:聲明瞭一個私有的IModuleDao
類型的變數moduleDao
,用於訪問資料庫。@Autowired
註解:表示自動註入moduleDao
對象。public List<Module> moduleList()
:定義了一個公共方法moduleList()
,返回一個Module
對象的列表。這個方法通過調用moduleDao
的moduleList()
方法來獲取模塊列表。@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
介面,提供了對用戶的操作實現。這種命名約定有助於讓項目的結構更清晰,使開發人員更容易理解代碼的組織結構