百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

一篇文章带你完全了解SpringMVC,再也不用担心被面试官问了

yuyutoo 2025-01-23 22:09 4 浏览 0 评论

一丶SpringMVC概述

  • Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一
  • Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架
  • Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
  • 支持 REST 风格的 URL 请求
  • 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性

二丶SpringMVC简单使用

1)在 web.xml 中配置 DispatcherServlet:


????
????????dispatcherServlet
????????org.springframework.web.servlet.DispatcherServlet
????????
????????
????????
????????????contextConfigLocation
????????????classpath:springmvc.xml
????????
????????1
????
????
????????dispatcherServlet
????????/
????

2)加入 Spring MVC 的配置文件




????
????

????
????
????????
????????
????

3)编写处理请求的处理器,并使用@Controller 注解标识为处理器

@Controller
public?class?HelloWorldController?{
????/**
???????1.?使用?@RequestMapping?注解来映射请求的?URL
???????2.?返回值会通过视图解析器解析为实际的物理视图,?对于?InternalResourceViewResolver?视图解析器,?会做如下的解析:
??????????通过?prefix?+?returnVal?+?后缀?这样的方式得到实际的物理视图,?然会做转发操作
??????????==>?/WEB-INF/views/success.jsp
?????*/
????@RequestMapping("/helloworld")
????public?String?hello(){
????????System.out.println("hello?world");
????????return?"success";
????}
}

4) 编写视图 JSP

在/WEB-INF/views/目录下创建一个succes.jsp

<%@?page?language="java"?contentType="text/html;?charset=UTF-8"?pageEncoding="UTF-8"%>
<%@?taglib?prefix="fmt"?uri="http://java.sun.com/jsp/jstl/fmt"?%>




Insert?title?here


????

成功跳转页面

5)将项目运行起来访问 :localhost:8080/hellowoorld

三丶使用 @RequestMapping 映射请求

  • Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求
  • 在控制器的类定义及方法定义处都可标注 类定义:提供初步的请求映射信息。相对于 WEB 应用的根目录 方法:提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于` WEB 应用的根目录`
  • DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理 方法。

1)标准请求头

2)@RequestMapping

@RequestMapping 的valuemethodparamsheads 分别表示请求 URL请求方法请求参数请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。

/**
?????*?可以使用?params?和?headers?来更加精确的映射请求.?params?和?headers?支持简单的表达式.
?????*?
?????*?@return
?????*/
????@RequestMapping(value?=?"testParamsAndHeaders",
????????????????????params?=?{?"username","age!=10"?},
????????????????????headers?=?{?"Accept-Language=en-US,zh;q=0.8"?},
????????????????????method?=?RequestMethod.POST)
????public?String?test()?{
????????System.out.println("test...");
????????return?"success";
????}

3)支持Ant 风格

  • ? :匹配文件名中的一个字符

/user/createUser?

匹配 /user/createUsera 或者 user/createUserb 等 URL

  • * :匹配文件名中的任意字符

/user/*/createUser

匹配 /user/aaa/createUser 或者 /user/bbb/createUser 等 URL

  • ** :匹配多层路径

/user/**/createUser

匹配 /user/createUser 或者 /user/aaa/bbb/createUser 等 URL

四丶@PathVariable

映射 URL 绑定的占位符

  • 带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
  • 通过@PathVariable可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中。
/**
?*?@PathVariable?可以来映射?URL?中的占位符到目标方法的参数中.
?*/
@RequestMapping("/testPathVariable/{id}")
public?String?test(@PathVariable("id")?Integer?id)?{
????System.out.println("id:?"?+?id);
????return?"success";
}

五丶REST风格

REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用

示例:

  • /order/1 HTTP GET :得到 id = 1 的 order 记录
  • /order/1 HTTP DELETE:删除 id = 1的 order 记录
  • /order/1 HTTP PUT:更新 id = 1的 order 记录
  • /order HTTP POST:新增 一条order记录

六丶@RequestParam 绑定请求参数值

  • 在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
  • value:参数名
  • required:是否必须;默认为 true,表示请求参数中必须包含对应的参数,若不存在,将抛出异常
/**
?*?@RequestParam?来映射请求参数.?value?值即请求参数的参数名?required?该参数是否必须.?默认为?true
?*???????????????defaultValue?请求参数的默认值
?*/
@RequestMapping(value?=?"/testRequestParam")
public?String?testRequestParam(
????????@RequestParam(value?=?"username")?String?username,
????????@RequestParam(value?=?"age",?required?=?false,?defaultValue?=?"0")?int?age)?{
????System.out.println("testRequestParam,?username:?"?+?username?+?",?age:?"?+?age);
????return?"success";
}

七丶@RequestHeader 绑定请求报头的属性值

/**
?*???映射请求头信息?用法同?@RequestParam
?*/
@RequestMapping("/testRequestHeader")
public?String?testRequestHeader(
????????@RequestHeader(value?=?"Accept-Language")?String?al)?{
????System.out.println("testRequestHeader,?Accept-Language:?"?+?al);
????return?"success";
}

八丶@CookieValue 绑定请求中的 Cookie 值

/**
?*?@CookieValue:?映射一个?Cookie?值.?属性同?@RequestParam
?*/
@RequestMapping("/testCookieValue")
public?String?testCookieValue(@CookieValue("JSESSIONID")?String?sessionId)?{
????System.out.println("testCookieValue:?sessionId:?"?+?sessionId);
????return?"success";
}

九丶POJO 对象绑定请求参数值

/**
?*?Spring?MVC?会按请求参数名和?POJO?属性名进行自动匹配,?自动为该对象填充属性值。支持级联属性。
?*?如:dept.deptId、dept.address.tel?等
?*/
@RequestMapping("/testPojo")
public?String?testPojo(User?user)?{
????System.out.println("testPojo:?"?+?user);
????return?"success";
}

十丶MVC 中Handler 方法可以接收的ServletAPI 类型的参数

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Writer
  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader

十一丶处理模型数据

1)ModelAndView

处理方法返回值类型为 ModelAndView时,方法体可通过该对象添加模型数据,ModelAndView中既包含视图信息,也包含模型数据信息

2)Map 及 Model

入参为
org.springframework.ui.Model

org.springframework.ui.ModelMap
java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

3)@SessionAttributes:

将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性(从session域中获取)

  • 若希望在多个请求之间共用某个模型属性数据,则可以在 控制器类上标注一个 @SessionAttributes,Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。
  • @SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中 1)@SessionAttributes(types=User.class): 会将隐含模型中所有类型为 User.class 的属性添加到会话中 2)@SessionAttributes(value={“user1”, “user2”}):会将隐含模型中对象名为user1user2 的属性添加到会话中 3)@SessionAttributes(types={User.class, Dept.class}):会将隐含模型中所有类型为 User.classDept.class 的属性添加到会话中 4)@SessionAttributes(value={“user1”, “user2”}, types={Dept.class}):会将隐含模型中对象名为user1user2 的属性和所有类型为 Dept.class 的属性添加到会话中

4)@ModelAttribute

方法入参标注该注解后, 入参的对象就会放到数据模型中

十二丶@ModelAttribute

  • 在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
  • 在方法的入参前使用 @ModelAttribute 注解:
  • 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
  • 将方法入参对象添加到模型中

示例:

十三丶视图和视图解析器

  • 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 StringViewModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个 ModelAndView 对象,它包含了逻辑名和模型对象的视图。
  • Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP,也可能是 Excel、JFreeChart等各种表现形式的视图。
  • 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工 作上,从而实现 MVC 的充分解耦。

1)视图

我们只需要实现View这个接口就可以自定义视图

示例:

@Component
public?class?HelloView?implements?View{
????@Override
????public?String?getContentType()?{
????????return?"text/html";
????}
????@Override
????public?void?render(Map?model,?HttpServletRequest?request,
????????????HttpServletResponse?response)?throws?Exception?{
????????response.getWriter().print("hello?view,?time:?"?+?new?Date());
????}
}
@RequestMapping("/testView")
????public?String?testView(){
????????System.out.println("testView");
????????return?"helloView";?//这里返回的就是我们自定义的视图
????}

2)视图解析器

  • SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
  • 视图解析器的作用比较单一,将逻辑视图解析为一个具体的视图对象
  • 所有的视图解析器都必须实现 ViewResolver 接口。
  • 程序员可以选择一种视图解析器或混用多种视图解析器。
  • 每个视图解析器都实现了Ordered接口并开放出一个 order 属性,可 以通过order 属性指定解析器的优先顺序,order 越小优先级越高
  • SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常

SpringMVC.xml中的配置:



????
????





????

最后,关于面试我还通过一些渠道整理了大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。领取方式:转发+关注,然后私信【资料】即可免费领取~

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

以及架构技术进阶视频,也一起送给大家

资料领取方式

1、关注,转发

2、私信发送:资料

相关推荐

.NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......

...

全局和隐式 using 指令详解(全局命令)

1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...

请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍

1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...

ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战

我是一位多年后端经验的工程师,其中前几年用ASP.NET...

.NET AOT 详解(.net 6 aot)

简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...

一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)

哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...

asar归档解包(游戏arc文件解包)

要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...

在PyCharm 中免费集成Amazon CodeWhisperer

CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...

2014年最优秀JavaScript编辑器大盘点

1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...

基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享

项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...

JetBrains Toolbox推出全新产品订阅授权模式

捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...

idea最新激活jetbrains-agent.jar包,亲测有效

这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...

CountDownTimer的理解(countdowntomars)

CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...

反射为什么性能会很慢?(反射时为什么会越来越长)

1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...

btrace 开源!基于 Systrace 高性能 Trace 工具

介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...

取消回复欢迎 发表评论: