SpringMVC学习要点--十分钟帮你快速掌握框架核心
ccwgpt 2024-09-26 07:48 27 浏览 0 评论
《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!
本书简介
书名为《Spring+MyBatis企业应用实战》,是本人在学习JavaEE框架时候的一本基础书籍,本书对于SpringMVC和MyBatis框架及相关基础知识讲述的比较清晰,适合需要详细学习Java框架的读者。
本文内容为本书第二章--第八章,记录和总结了所有SpringMVC的知识
DispatcherServlet
1.DispatcherServlet使用和配置
SpringMVC提供了一个名为org.springframework.web.servlet.DispatcherServlet的Servlet充当前端控制器,所有请求驱动都围绕这个DispatcherServlet来分配请求。DispatcherServlet是一个Servlet类,需要在web.xml中完成配置。
(1)配置了启动时立即加载Servlet
(2)需要配置springmvc-config.xml配置文件
(3)配置了用当前servlet处理所有请求URL
2.DispatcherServlet的分发原理
先看一下DispatcherServlet源码中的方法
源码如下:
initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配机制查找自定义的组件。如果没有找到则会装配一套默认组件,默认组件在DispatcherServlet.properties配置文件中。
配置文件如下:
如 果开发者希望使用自定义类型的组件,则只需要在Spring配置文件中配置自定义的Bean即可。MVC如果发现上下文中有用户自定义的组件,就不会使用默认组件。
SpringMVC开发步骤
1.在web.xml中定义前端控制器DispatcherServlet来拦截用户请求
2.定义处理用户请求的Handle类,可以实现Controller接口或使用@Controller注解
3.配置Handle,可采用xml文件或注解的方式
<!-- 配置Handle,映射/hello请求 -->
<bean name="/hello" class="org.fkit.controller.HelloController"/>
@Controller
public class HelloController{
@RequestMapping(value="/hello")
public ModelAndView hello(){
}
}
4.编写视图资源,Handle处理用户请求结束后,通常会返回一个ModelAndView对象,该对象包含返回的试图名和模型。试图名代表需要显示的物理视图资源;模型用于传输数据给视图资源。
SpringMVC执行流程
说明如下:
(1)用户向服务器发送请求,请求被Spring的前端控制器DispatcherServlet截获
(2)DispatcherServlet对请求URL进行解析,得到URI。然后根据URI,调用HandlerMapping获得该Handler配置的所有相关对象,包括Handler对象以及Handler对象对应的拦截器,会被封装到一个HandlerExecutionChain对象中返回
(3)DispatcherServlet根据获得的Handler,选择一个HandlerAdapter。HandlerAdapter会被用于处理多种Handler,调用Handler实际处理请求的方法
(4)提取请求中的模型数据,开始执行Handler。在填充Handler的入参过程中,根据配置spring会帮你实现消息转换、数据转换、数据格式化、数据验证
(5)Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。ModelAndView对象中包含试图名和模型
(6)根据返回的ModelAndView对象,选择一个ViewResolver返回给DispatcherServlet
(7)ViewResolver结合Model和View来渲染视图
(8)将试图渲染结果返回给客户端
SpringMVC常用注解
1.@Controller注解
@Controller用于标记一个类,使用它标记的类就是一个Controller对象,及一个控制器。Spring使用扫描机制查找应用中所有基于注解的控制器类。
@Controller
public class HelloController{
@RequestMapping(value="/hello")
public ModelAndView hello(){
}
}
使用注解前需要如下步骤:
- 在SpringMVC配置文件的头中引入spring-context
- 使用<context:component-scan/>元素,功能是:启动包扫描功能,以便注册带有@Controller、@Service、@Repository、@Component等注解的类成为Bean。base-package指定了需要扫描的类包,类包及其递归子包中的所有类都会被扫描。配置如下:
<context:component-scan base-package="org.fkit.controller"/>
springmvc-config.xml常用配置
说明如下:
(1)使用<context:component-scan>指定需要扫描的包
(2)<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping和Request MappingHandlerAdapter两个Bean,提供注解的必要支持
(3)<mvc:default-servlet-handler>是静态资源处理器,SpringMVC会默认捕获所有请求,包括静态资源请求。配置了当前元素后静态资源不会被DispatcherServlet处理
(4)视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。配置的prefix属性表示视图的前缀,suffix表示视图的后缀。
2.@RequestMapping注解
@RequestMapping注解可以用来注释一个控制器类,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。
上图代表映射到如下路径:
http://localhost:8080/user/register
http://localhost:8080/user/login
常用属性如下:
3.请求处理方法可出现的参数类型
所有参数Spring会自动将值传给方法
(1)HttpServletRequest参数
(2)HttpSession参数
(3)HttpServletResponse
(4)InputStream
(5)OutputStream
(6)Map
(7)Model
(8)ModelMap
(9)BindingResult
(10)WebRequest
4.请求处理方法可返回的类型
- ModelAndView
- Model
- Map
- View
- String
下面做一些详细说明。
(1)Model和ModelMap
SpringMVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器。如果处理方法的参数为Model或ModelMap类型,则SpringMVC会将隐含模型的引用传递给这些参数。在处理方法内部,开发者可以通过这个参数对象访问模型中的所有数据,也可以向模型中添加新的数据。
(2)ModelAndView
控制器处理方法的返回值如果是ModelAndView,则既包含模型数据,也包含视图信息。
常用方法如下:
//添加模型数据
addObject(String key, Object value);
//设置视图
setViewName(String name);
5.页面转发
(1)转发到JSP
//默认forward跳转
return "main";
modelAndView.setViewName("main");
//重定向页面
return "redirect:/main.jsp";
modelAndView.setViewName("redirect:/main.jsp");
(2)转发到其他处理方法
//forward跳转
return "forward:/main";
modelAndView.setViewName("forward:/main");
//重定向
return "redirect:/main";
modelAndView.setViewName("redirect:/main");
6.@RequestParam注解
@RequestParam用于将指定的请求参数赋值给方法中的形参。属性如下:
name:指定请求参数绑定的名称
value:name属性的别名
required:指定参数是否必须绑定
defaultValue:指定默认值
7.@PathVariable注解
@PathVariable可以方便的获得请求URL中的动态参数。属性如下:
举例如下:
@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable Integer userId)
假如请求的URL为http://localhost:8080/pathVariableTest/1,则自动将URL中模板变量{userId}绑定到通过@PathVariable注解的同名参数上,即userId变量将被赋值为1。
8.@RequestHeader注解
@RequestHeader注解用于将请求头信息数据映射到功能处理方法的参数上。属性如下:
举例如下:
9.@CookieValue注解
@CookieValue注解用于将请求的Cookie数据映射到功能处理方法的参数上。属性如下:
举例如下:
10.@RequestAttribute注解
@RequestAttribute注解用于访问由请求处理方法、过滤器或拦截器创建的、预先存在于request作用域中的属性,将该属性转换到目标方法的参数。属性如下:
举例如下:
11.@SessionAttribute注解
@SessionAttribute注解用于访问由请求处理方法、过滤器或拦截器创建的、预先存在于session作用域中的属性,将该属性转换到目标方法的参数。属性如下:
举例如下:
12.@ModelAttribute注解
@ModelAttribute注解用于将请求参数绑定到对象。
举例如下:
Form请求的参数值会自动入参到@ModelAttribute注解的对象的同名属性中
13.@RequestBody注解
@RequestBody注解用来处理content-type类型为:application/json或application/xml的情况,将请求数据绑定到方法参数上。
举例如下:
其中前台向处理方法传递了Json格式的数据,Json数据的key和Book属性相对应
14.@ResponseBody注解
@ResponseBody注解用于将请求处理方法返回的对象,转换为指定格式后,写入到Response对象的body中。返回的数据不是HTML页面,而是其他格式数据,如JSON、XML时使用注解。
举例如下:
上图将List转换为Json格式输出
15.@RestController注解
@RestController注解相当于同时使用了@Controller和@ResponseBody。用于RESTFUL风格的请求处理方式。
SpringMVC异常处理
SpringMVC提供的两种异常处理方式:
- 使用异常处理器SimpleMappingExceptionResolver,类有如下方法:
//该方法处理程序执行期间被抛出的异常,返回一个模型和视图,视图返回错误处理页面
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response)
通过springmvc-config.xml配置实现
<!-- p:defaultErrorView="error"表示所有没有指定的异常都跳转到异常处理页面error
p:exceptionAttribute="ex"表示异常处理页面中访问的异常对象变量名为ex -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
p:defaultErrorView="error" p:exceptionAttribute="ex">
<!-- exceptionMappings表示映射的异常,接受参数是一个Properties,key是异常类名,value是处理异常的页面 -->
<property name="exceptionMappings">
<props>
<prop key="IOException">ioerror</prop>
<prop key="SQLException">sqlerror</prop>
</props>
</property>
</bean>
- 使用@ExceptionHandler注解实现局部异常处理
@ExceptionHandler注解只在当前类生效
- 使用@ControllerAdvice注解实现全局异常处理
使用<context:component-scan>扫描到@ControllerAdvice注解后,会将注解修饰的类内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有请求的异常处理上。
SpringMVC国际化
1.messageSource接口
SpringMVC不直接使用java.util.ResourceBundle,而是使用messageSource的Bean来配置国际化属性文件。
上图basenames指定了资源文件的名称
2.localeResolver接口
SpringMVC使用语言区域解析器来实现用户选择语言区域。提供了一个语言区域解析器接口LocaleResolver,实现类包括:
- AcceptHeaderLocaleResolver
- SessionLocaleResolver
- CookieLocaleResolver
AcceptHeaderLocaleResolver是默认解析器,会读取浏览器accept-language标题,来确定使用哪个语言区域
3.message标签
SpringMVC显示本地化消息使用message标签,使用前需先导入taglib标签库。
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
message标签属性如下:
4.AcceptHeaderLocaleResolver
实现步骤:
(1)创建资源文件
message_en_US.properties
message_zh_CN.properties
(2)在JSP中使用message标签输出国际化消息
(3)在SpringMVC配置文件中加载国际化资源文件并配置
(4)可在controller中使用国际化
RequestContext requestContext = new RequestContext(request);
String username = requestContext.getMessage("username");
SpringMVC数据转换、格式化、校验原理
Spring MVC框架将ServletRequest对象及处理方法的参数对象传递给DataBinder,DataBinder调用ConversionService组件进行数据类型转换、数据格式化工作,并将ServletRequest中的消息填充到参数对象中。然后再调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验,并最终生成 数据绑定结果BindingResult 对象。
SpringMVC文件上传
实现步骤:
(1)创建表单并设置为multipart/form-data
(2)创建controller
SpringMVC会将上传文件绑定到MultipartFile对象。MultipartFile提供了获取上传文件内容、文件名等方法。
MultipartFile常用方法如下:
byte[] getBytes():获取文件数据
String getContentType():获取文件MIME类型,如image/jpeg
InputStream getInputStream():获取文件流
String getName(): 获取表单中文件组件的名称
String getOriginalFilename():获取上传文件的原名
long getSize(): 获取文件的字节大小,单位为byte
boolean isEmpty(): 是否有上传的文件
void transferTo(File file):将上传文件保存到一个目标文件中
(3)在SpringMVC配置文件中增加文件上传功能(配置MultipartResolver)
CommonsMultipartResolver必须依赖于Apach FileUpload组件,需要引入JAR包
SpringMVC文件下载
实现步骤:
(1)在页面中加入下载超链接,链接地址指向controller方法
(2)编写controller处理方法,用于文件下载
使用Apache FileUpload组件FileUtils读取要下载的文件,并将其构建成ResponseEntity对象返回。ResponseEntity对象可以方便的定义返回的BodyBuilder、HttpHeaders、HttpStatus。
BodyBuilder对象用来构建返回的Body
HttpHeaders代表Http协议头信息
HttpStatus代表Http协议的状态
SpringMVC拦截器
Interceptor拦截器的主要作用是拦截用户的请求并进行相应的处理(比如通过拦截器来进行用户权限验证,或者用来判断用户是否已经登录等)
1.HandlerInterceptor接口
定义拦截器类需要实现HandlerInterceptor接口或继承抽象类HandlerInterceptorAdapter
接口中的方法如下:
//该方法在请求处理之前被调用,可以做前置的初始化操作或者是对当前请求的一个预处理,也可以判断来请求是否要继续进行下去。当返回值为false,表示请求结束,后续的Interceptor和Controller不会再执行;当返回值为true泽会继续执行
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
//该方法在controller方法被执行,在视图返回渲染前被调用。可以在这个方法中对处理后的ModelAndView进行操作
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
//该方法将在整个请求结束后执行,作用是进行资源清理
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
实现步骤:
(1)定义拦截器类,实现接口和接口中的方法
(2)在配置文件中配置拦截器(springmvc-config.xml)
<!-- 拦截器定义 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/*"/>
<!-- 使用Bean定义一个Interceptor -->
<bean class="org.fkit.interceptor.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
相关推荐
- 详解DNFSB2毒王的各种改动以及大概的加点框架
-
首先附上改动部分,然后逐项分析第一个,毒攻掌握技能意思是力量智力差距超过15%的话差距会被强行缩小到15%,差距不到15%则无效。举例:2000力量,1650智力,2000*0.85=1700,则智力...
- 通篇干货!纵观 PolarDB-X 并行计算框架
-
作者:玄弟七锋PolarDB-X面向HTAP的混合执行器一文详细说明了PolarDB-X执行器设计的初衷,其初衷一直是致力于为PolarDB-X注入并行计算的能力,兼顾TP和AP场景,逐渐...
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
-
梦晨发自凹非寺量子位|公众号QbitAI字节最新深度思考模型,在数学、代码等多项推理任务中超过DeepSeek-R1了?而且参数规模更小。同样是MoE架构,字节新模型Seed-Thinkin...
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
-
作者|赵骁勇阿里巴巴智能引擎事业部审校|刘侃,KittyRTP-LLM是阿里巴巴大模型预测团队开发的高性能LLM推理加速引擎。它在阿里巴巴集团内广泛应用,支撑着淘宝、天猫、高德、饿...
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
-
校园系统通常是为学校、学生和教职工提供便捷的数字化管理工具。综合性社交大学校园小程序源码:同城校园小程序-大学校园圈子创业分享,校园趣事,同校跑腿交友综合性论坛。小程序系统基于TP6+Uni-app...
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
-
婚恋交友系统-打造您的专属婚恋交友平台系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包...
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
-
COMET团队投稿量子位|公众号QbitAI字节对MoE模型训练成本再砍一刀,成本可节省40%!刚刚,豆包大模型团队在GitHub上开源了叫做COMET的MoE优化技术。COMET已应用于字节...
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
-
2025年2月19日,美国通用电气航空航天公司(隶属于通用电气公司)宣布,已经完成了“下一代自适应推进系统”(NGAP)计划下提供的XA102自适应变循环发动机的详细设计审查阶段。XA102是通用电气...
- tpxm-19双相钢材质(双相钢f60材质)
-
TPXM-19双相钢是一种特殊的钢材,其独特的化学成分、机械性能以及广泛的应用场景使其在各行业中占有独特的地位。以下是对TPXM-19双相钢的详细介绍。**化学成分**TPXM-19双相钢的主要化学成...
- thinkphp6里怎么给layui数据表格输送数据接口
-
layui官网已经下架了,但是产品还是可以使用。今天一个朋友问我怎么给layui数据表格发送数据接口,当然他是学前端的,后端不怎么懂,自学了tp框架问我怎么调用。其实官方文档上就有相应的数据格式,js...
- 完美可用的全媒体广告精准营销服务平台PHP源码
-
今天测试了一套php开发的企业网站展示平台,还是非常不错的,下面来给大家说一下这套系统。1、系统架构这是一套基于ThinkPHP框架开发的HTML5响应式全媒体广告精准营销服务平台PHP源码。现在基于...
- 一对一源码开发,九大方面完善基础架构
-
以往的直播大多数都是一对多进行直播社交,弊端在于不能满足到每个用户的需求,会降低软件的体验感。伴随着用户需求量的增加,一对一直播源码开始出现。一个完整的一对一直播流程即主播发起直播→观看进入房间观看→...
- Int J Biol Macromol .|交联酶聚集体在分级共价有机骨架上的固定化:用于卤代醇不对称合成的高稳定酶纳米反应器
-
大家好,今天推送的文章发表在InternationalJournalofBiologicalMacromolecules上的“Immobilizationofcross-linkeden...
- 【推荐】一款开源免费的 ChatGPT 聊天管理系统,支持PC、H5等多端
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍GPTCMS是一款开源且免费(基于GPL-3.0协议开源)的ChatGPT聊天管理系统,它基于先进的GPT...
- 高性能计算(HPC)分布式训练:训练框架、混合精度、计算图优化
-
在深度学习模型愈发庞大的今天,分布式训练、高效计算和资源优化已成为AI开发者的必修课。本文将从数据并行vs模型并行、主流训练框架(如PyTorchDDP、DeepSpeed)、混合精度训练(...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 详解DNFSB2毒王的各种改动以及大概的加点框架
- 通篇干货!纵观 PolarDB-X 并行计算框架
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
- tpxm-19双相钢材质(双相钢f60材质)
- thinkphp6里怎么给layui数据表格输送数据接口
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)