Imooc 上课总结(Java)-- Spring MVC(非公开)
课程链接:https://www.imooc.com/learn/47
课程源码:lesson_imooc_springMVC
1. MVC 简介
- Front Controller :分发调度
- View Template:页面呈现
- Controller:业务数据抽取
- MVC的核心思想:业务数据抽取同业务数据呈现相分离
1.1. MVC: Model - View - Controller
- View :视图层,为用户提供 UI,重点关注数据的呈现
- Model:模型层,业务数据的信息表示,关注支撑业务的信息构成,通常是过个业务实体的组合。
- Contoller:控制层,调用业务逻辑产生合适的数据(Model);传递数据给视图层用于呈现
MVC 是一种架构模式:程序分层,分工合作,既相互独立,又协同工作
MVC 是一种思考方式:M:需要将什么信息展示给用户?V:如何布局?C:调用哪些业务逻辑?
2. Spring MVC 基本概念(class003)
2.1 Spring MVC 基本概念
--> 更详细的:
1) DispatcherServlet:< == > Front Controller
2) Controller
HandlerAdapter -- Controller 的一个表现形式
3)HandlerInterceptor -- 拦截器(接口),可以在调用controller之前,调用controller之后,最终的view 呈现之后
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView ;
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
4)HandlerMapping:DispatcherServlet 与 Controller 之间映射的类
(1) Help DispatchServlet to get the right controller;
(2) Wrap controller with HandleInterceptor;
5) HandlerExecutionChain
preHandle -> Controller method -> postHandle -> afterCompletion
6)ModelAndView: ------- Model的一种表现形式。
model 有三种形式:Model,map 和 ModelAndView。
如果有人用 Model 和 Map, DispatcherServlet 会将其转换成 ModelAndView
7)ViewResolver:视图解释器
8)View:呈现页面
3. 用Spring MVC 进行开发(class004)
Spring MVC 的上下文层级
<!-- Spring 应用上下文,理解层次化的 ApplicationContext --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/configs/spring/applicationContext*.xml</param-value> </context-param> <!-- 对应于 Spring MVC 上下文层级图的 WebApplicationContext(s),提供了应用的公共组件及服务 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- DispatcherServlet, Spring MVC 的核心 --> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- DispatcherServlet 对应的上下文配置,默认为 /WEB-INF/$servlet-name$-servlet.xml --> <!-- 对应于 Spring MVC 上下文层级图的 WebApplicationContext,特定的某个应用 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
3.1 Controller
1) 使用 @Controller 声明一个 controller
2) 使用 @RequestMapping 来映射 URL 和 方法。其标记经常出现在 类级别 和 方法级别。两者共同组合完成对一个 URL 请求的拦截
3)通过 URL Template (结合 使用 @RequestParam 和 @PathVariable 标记),可以将 URL 路径中的参数,绑定到 Controller method,入参
即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。
4)通过 HttpServletRequest and/or HttpSession 这类的对象来获取想要的结果
/** * 方式一(传统样式):本方法处理 /courses/view?courseId={courseId} * viewCourse(@RequestParam => 设置传参 */ @RequestMapping(value = "/view", method = RequestMethod.GET) public String viewCourse(@RequestParam("courseId") Integer courseId, Model model) { logger.debug("In viewCourse, courseId = {}", courseId); Course course = courseService.getCourseById(courseId); model.addAttribute(course); return "course_overview"; } /** * 方式二(REST风格):本方法处理REST风格的URL /courses/view2/{courseId} */ @RequestMapping(value = "viewrest/{courseId}", method = RequestMethod.GET) public String viewCourseRest(@PathVariable("courseId") Integer courseId, Map<String, Object> model) { logger.debug("In viewCourseRest, courseId = {}", courseId); Course course = courseService.getCourseById(courseId); model.put("course", course); return "course_overview"; } /** * 方式三(传统样式的 HttpServletRequest):本方法处理传统的 Servlet 的 URL /courses/view3?courseId={courseId} */ @RequestMapping("viewservlet") public String viewCourseServlet(HttpServletRequest request) { Integer courseId = Integer.valueOf(request.getParameter("courseId")); Course course = courseService.getCourseById(courseId); request.setAttribute("course", course); return "course_overview"; }
3.2 Binding
将请求中的字段按照名字匹配的原则填入模型对象。
1)ModelAttribute on Method
在 controller 的参数上,通过 ModelAttribute 实现模型对象和数据的绑定
2)redirect/forward 重定向 和转发
3.3 单文件上传
4. Spring MVC 全局
- 宏观:
- 中观:
- 微观:基本的 Controller 编写
数据绑定
文件上传
JSON协同
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)