1.内容和原理
Spring MVC(Model-View-Controller)是基于 Java 的 Web 开发框架,用于构建 Web 应用程序。它提供了一种模型-视图-控制器的设计模式,用于分离应用程序的业务逻辑、数据和用户界面。以下是 Spring MVC 框架的主要组成部分和工作原理:
1. **模型(Model)**:
- 模型代表应用程序的业务逻辑和数据,通常是一个 POJO(Plain Old Java Object)类或者一个数据访问对象(DAO)。
- 模型负责处理数据的读取、存储、更新和删除,以及执行业务逻辑的操作。
2. **视图(View)**:
- 视图是用户界面的呈现,通常是一个 HTML 页面、JSON、XML 等。
- 视图负责将模型数据渲染成最终的用户界面,以便用户能够直观地看到和操作数据。
3. **控制器(Controller)**:
- 控制器负责处理用户请求,并根据请求的内容调用适当的模型逻辑来处理业务逻辑,然后选择适当的视图来呈现结果给用户。
- 控制器通常包含了多个处理方法,每个处理方法负责处理一个或多个特定的请求,并返回相应的视图或数据给客户端。
4. **DispatcherServlet**:
- DispatcherServlet 是 Spring MVC 框架的核心组件,它充当了前端控制器的角色。
- 当客户端发起一个请求时,DispatcherServlet 会拦截这个请求,并将其交给适当的处理器(即控制器)来处理,然后根据处理结果选择合适的视图进行渲染。
5. **处理器映射器(Handler Mapping)**:
- 处理器映射器负责将客户端的请求映射到相应的处理器(控制器)上,以便找到处理请求的逻辑。
6. **视图解析器(View Resolver)**:
- 视图解析器负责将控制器方法返回的视图名称解析为具体的视图对象,以便最终渲染给用户。
Spring MVC 的工作流程通常是这样的:客户端发送一个 HTTP 请求 -> DispatcherServlet 拦截请求 -> DispatcherServlet 根据请求的 URL 找到相应的处理器(控制器) -> 控制器处理请求并返回模型数据和视图名称 -> DispatcherServlet 根据视图名称找到对应的视图对象 -> 视图对象渲染模型数据并返回给客户端。
2.举例说明
让我们结合之前提供的代码来解释 Spring MVC 的工作原理:
@Controller
public class CoursePublishController {
@Autowired
CoursePublishService coursePublishService;
@GetMapping("/coursepreview/{courseId}")
public ModelAndView preview(@PathVariable("courseId") Long courseId){
CoursePreviewDto coursePreviewInfo = coursePublishService.getCoursePreviewInfo(courseId);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("model",coursePreviewInfo);
modelAndView.setViewName("course_template");
return modelAndView;
}
@ResponseBody
@PostMapping("/courseaudit/commit/{courseId}")
public void commitAudit(@PathVariable("courseId") Long courseId){
Long companyId = 1232141425L;
coursePublishService.commitAudit(companyId,courseId);
}
// 其他方法...
}
1. **DispatcherServlet**:在这个例子中,DispatcherServlet 是 Spring MVC 框架的核心组件,它会拦截所有的 HTTP 请求并将其分派给相应的处理器(控制器)。
2. **控制器(Controller)**:`CoursePublishController` 类是一个控制器,它使用 `@Controller` 注解进行标识。它处理了多个请求,包括 GET 和 POST 请求。
3. **处理器映射器(Handler Mapping)**:Spring MVC 框架会使用默认的处理器映射器来根据请求的 URL 找到对应的处理器方法。例如,当客户端发送一个 GET 请求到 "/coursepreview/{courseId}" 路径时,处理器映射器会找到 `preview` 方法来处理该请求。
4. **方法处理请求**:`preview` 方法是一个处理 GET 请求的方法。它接收一个课程 ID,调用 `coursePublishService` 的方法获取课程预览信息,并返回一个包含模型数据和视图名称的 `ModelAndView` 对象。
5. **视图解析器(View Resolver)**:在这个例子中没有明确指定视图解析器,因此默认的视图解析器会根据返回的视图名称 "course_template" 找到对应的视图对象。这个视图对象将渲染模型数据,并返回给客户端。
总的来说,当客户端发送一个请求时,DispatcherServlet 会根据请求的 URL 找到相应的控制器方法来处理请求,然后根据控制器方法的返回值选择合适的视图进行渲染,最终将渲染的结果返回给客户端。