SpringMVC原理解析
存在
由 HandlerMapping 获取 HandlerExecutionChain 对象
获取 HandlerAdapter对象
不存在
是否配置 <mvc:default-servlet-
handler/>
没有
有配置
目标资源
404 页面
没有目标 资源
调用拦截器的 PreHandle 方法
调用目标 Handler 的目标方法得到 ModelAndView 对象
1、 vams,header
取出uri模板中的变量作为参数
4.2 RequestURL 匹配规则
① 1对1 : @RequestMapping(value = "/hello") ② 1对多 : @RequestMapping(value={"/index", "/hello"} ③ URL请求参数映射: @RequestMapping(value="/detail/{id}")
3.2 url如何找到相应的Controller??
SpringMVC的常用HandlerMapping ① DefaultAnnotationHandlerMapping; ② SimpleUrlHandlerMapping; ③ BeanNameUrlHandlerMapping; ④ ControllerClassNameHandlerMapping ⑤ RequestMappingHandlerMapping
01
Web MVC简介
➢ 1.1 Web开发中的请求-响应模型
➢ 1.2 Web端开发发展历程
……
➢ 1.3 标准MVC模型
MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更 加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离。
Model(模型):数据模 型,提供要展示的数据, 因此包含数据和行为
</dependency>
springboot自动配置SpringMVC------WebMvcAutoConfiguration
自定义SpringMVC配置------WebMvcConfigurerAdapter, WebMvcConfigurationSupport
4.4 你是怎么做api接口版本控制的? API一定得有版本,否则升级对于用户来说将是噩梦
@RequestBody / @ResponseBody 或是
HttpEntity<T> / ResponseEntity<T>
@RestController=@Controller+ @ResponseBody
小结
请求
springDispatcherServlet 的 url-pattern
SpringMVC 中 存在对应的映射?
@PathVariable(value="id") ④ URL通配符映射:通配符有“?”和“*”两个字符。其中“?”表示1个字
符,“*”表示匹配多个字符,“**”表示匹配0个或多个路径。 ⑤ URL正则表达式映射: @RequestMapping(value="/reg/{name:\\w+}-
{age:\\d+}", method = {RequestMethod.GET})
它包括一个处理器、多个HandlerInterceptor拦截器); c. 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器); d. 通过ViewResolver解析逻辑视图名到具体视图实现; e. 本地化解析; f. 渲染具体的视图等; g. 如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
基于SpringMVC设计一套api版本控制功能
http://127.0.0.1:8089/test/v2/hello http:// 127.0.0.1:8089/test/v3/hello
Q&A
View(视图):负责进行 模型的展示,一般就是我 们见到的用户界面,客户 想看到的东西。
Controller(控制器): 接收用户请求,委托给模 型进行处理(状态改变), 处理完毕后把返回的模型 数据返回给视图,由视图 负责展示。 也就是说控制 器做了个调度员的工作。
1.4 标准Web MVC模型
在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图更新,需要再发送一次请 求(即请求-响应模型)。
02
SpringMVC框架工作流程分析
2.1SpringMVC 概述
➢ SpringMVC是什么
SpringMVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,基于请求驱动指的就是使 用请求-响应模型 使用了MVC架构模式的思想,将web层进行职责解耦,框架的目的就是帮助我们简化开发
数据绑定流程
• Spring MVC 通过反射机制对目标处理方法进行解析,将 请 求消息绑定到处理方法的入参中。数据绑定的核心部件 是 DataBinder,运行机制如下:
ConversionService
ServletRequest
数据类型转换/格式化
3 1
DataBinder
数据校验 4
Validator
2 处理方法入参对象
5
处理方法的签名
BindingResult
3.4 SpringMVC如何解析视图
String ModelAndView
View
请求处理方法返回值类型
ModelAndView ViewResolver
视图对象 JSP/JSTL/PDF...
如不需返回视图,那SpringMVC 如何返回JSON数据??????
控制台:No mapping found for HTTP request with URI [/xx/xx] in
DispatcherServlet
是否存在异常
调用拦截器的 postHandle方法
由 HandlerExceptionResolver 组件处理异常,得到新的 ModelAndView 对象
总结:请求到达-->找到能够执行目标方法的适配器--->执行目标方法--->返回视图信息以及数据信息(MV)--->根据返回信息渲染视图--->展示视图
2.3 SpringMVC框架实现流程图
2.映射处理器
1.发送请求
7.返回响应 6.视图渲染
3.处理器适配
ModelAndView
5.视图解析
Model View
➢ SpringMVC能帮我们做什么
让我们能非常简单的设计出干净的Web层和薄薄的Web层 进行更简洁的Web层的开发 天生与Spring框架集成(如IoC容器、AOP等) 提供强大的约定大于配置的契约式编程支持 非常灵活的数据验证、格式化和数据绑定机制 支持Restful风格
2.2 SpringMVC工作流程图
存在
不存在
由 ViewResolver 组件根据 ModelAndView 对象得到实际的 View
调用拦截器的 afterCompletion方法
渲染视图
04
SpringMVC开发实战
4.1 常用的Springmvc 注解
1、@Controller 2、@RequestMapping 3、@Resource和@Autowired 4、@ModelAttribute和 @SessionAttributes 5、@PathVariable 6、@RequestParam 7、@ResponseBody @RequestBoay 组合注解 @RestController @GetMapping @PostMapping等
03
SpringMVC核心组件解析
3.1 DispatcherServlet作用
主要职责:调度工作、控制流程
a. 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析; b. 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,
View ViewResolver
Handler
HandlerMapping
Handler(如 UserController)
ModelAndView
4.调用业务 处理方法
HandlerAdapter
疑问???
DispatcherServlet的作用?在框架中有怎样的地位? url是怎样匹配到相应的Controller? SpringMVC如何进行数据解析及绑定的? Spring MVC如何解析视图?如何只返回JSON数据?
URL设计推荐遵循restful 设计风格
4.3 Springboot 如何接管SpringMVC的???
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>
url映射到Controller本质—Map查找
补充拓展点----HandlerInterceptor
常见应用场景 1、日志记录 2、权限检查
3.3 Springmvc如何进行数据绑定----HandlerAdapter
HandlerAdapter注册------默认读取DispatcherServlte.properties 1. HttpRequestHandlerAdapter 2. SimpleControllerHandlerAdapter 3. AnnotationMethodHandlerAdapter 4. RequestMappingHandlerAdapter
SpringMVC+Spring+Hibernate框架整合原理,作用及使用方法
SpringMVC+Spring+Hibernate框架整合原理,作⽤及使⽤⽅法SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层使⽤spring MVC负责请求的转发和视图管理spring实现业务对象管理,mybatis作为数据对象的持久化引擎原理:SpringMVC:1.客户端发送请求到DispacherServlet(分发器)2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller3.Controller调⽤业务逻辑处理后,返回ModelAndView4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图5.视图负责将结果显⽰到客户端Spring:我们平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们中的类,当然也包括service dao⾥⾯的),有了这个机制,我们就不⽤在每次使⽤这个类的时候为它初始化,很少看到关键字new。
另外spring的aop,事务管理等等都是我们经常⽤到的。
Mybatis:mybatis是对jdbc的封装,它让数据库底层操作变的透明。
mybatis的操作都是围绕⼀个sqlSessionFactory实例展开的。
mybatis通过配置⽂件关联到各实体类的Mapper⽂件,Mapper⽂件中配置了每个类对数据库所需进⾏的sql语句映射。
在每次与数据库交互时,通过sqlSessionFactory拿到⼀个sqlSession,再执⾏sql命令。
使⽤⽅法:要完成⼀个功能:1. 先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。
2. 写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进⾏的那些操作,⽐如 insert、selectAll、selectByKey、delete、update等。
spring MVC原理及配置
spring MVC原理及配置springmvc原理及配置springmvc原理及配置1.springmvc详述:springmvc就是spring提供更多的一个强悍而有效率的web框架。
借助注释,springmvc提供更多了几乎就是pojo的研发模式,使控制器的研发和测试更加直观。
这些控制器通常不轻易处置命令,而是将其委托给spring上下文中的其他bean,通过spring的倚赖转化成功能,这些bean被转化成至控制器中。
springmvc主要由dispatcherservlet、处理器映射、处理器(控制器)、视图解析器、视图组成。
他的两个核心是两个核心:处理器映射:选择使用哪个控制器来处理请求视图解析器:选择结果应该如何渲染通过以上两点,springmvc确保了如何挑选掌控处置命令和如何挑选视图展现出输入之间的松耦合。
2.springmvc运行原理这里写图片描述(2)找寻处理器:由dispatcherservlet控制器查阅一个或多个handlermapping,找出处置命令的controller。
(3)调用处理器:dispatcherservlet将请求提交到controller。
(4)(5)调用业务处置和回到结果:controller调用业务逻辑处置后,回到modelandview。
3.springmvc接口解释(1)dispatcherservlet接口:spring提供的前端控制器,所有的请求都有经过它来统一分发。
在dispatcherservlet将请求分发给springcontroller 之前,需要借助于spring提供的handlermapping定位到具体的controller。
(2)handlermappingUSB:能够完成客户请求到controller映射。
(3)controller接口:须要为mammalian用户处置上述命令,因此同时实现controllerUSB时,必须确保线程安全并且可以器重。
Struts、Spring、Hibernate三大框架的原理和优点
Struts的原理和优点.Struts工作原理MVC即Model—View—Controller的缩写,是一种常用的设计模式。
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。
MVC的工作原理,如下图1所示:Struts 是MVC的一种实现,它将Servlet和JSP 标记(属于J2EE 规范)用作实现的一部分。
Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展.Struts的工作原理,视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。
ActionServlet是一个通用的控制组件。
这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。
它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。
另外控制组件也负责用相应的请求参数填充Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。
动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。
最后动作类把控制权传给后续的JSP 文件,后者生成视图。
所有这些控制逻辑利用Struts-config.xml文件来配置。
模型:模型以一个或多个java bean的形式存在。
这些bean分为三类:Action Form、Action、JavaBean or EJB.Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。
Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门
SpringMVC源码总结(⼀)HandlerMapping和HandlerAdapter⼊门刚接触SpringMVC,对它的xml⽂件配置⼀直⽐较模模糊糊,最近花了⼀点时间稍微看了下源代码,再加上调试,开始逐渐理解它,⽹上的类似的内容有很多,写本⽂主要是⾃⼰加深⼀下理解。
本⽂适合⽤过SpringMVC的开发者,⾔归正传,⾸先搭建⼀个最简单的⼯程体验⼀下。
该⼯程是基于maven的,pom配置不再说明,所使⽤的spring版本4.0.5。
⾸先是web.xml⽂件配置,最简单的配置Java代码1. <!DOCTYPE web-app PUBLIC2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"3. "/dtd/web-app_2_3.dtd" >4.5. <web-app>6. <display-name>Archetype Created Web Application</display-name>7. <servlet>8. <servlet-name>mvc</servlet-name>9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>10. <load-on-startup>1</load-on-startup>11. </servlet>12.13. <servlet-mapping>14. <servlet-name>mvc</servlet-name>15. <url-pattern>/*</url-pattern>16. </servlet-mapping>17. </web-app>然后是mvc-servlet.xml⽂件的配置,上⾯配置DispatcherServlet会默认加载[servlet-name]-servlet.xml⽂件。
SpringMVC工作原理
SpringMVC工作原理SpringMVC的工作原理图:SpringMVC流程1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
组件说明:以下组件通常使用框架提供实现:DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。
组件:1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供作用:接收请求,响应结果,相当于转发器,中央处理器。
Spring注解方式防止重复提交原理详解
Spring注解⽅式防⽌重复提交原理详解Srping注解⽅式防⽌重复提交原理分析,供⼤家参考,具体内容如下⽅法⼀: Springmvc使⽤Token使⽤token的逻辑是,给所有的url加⼀个拦截器,在拦截器⾥⾯⽤java的UUID⽣成⼀个随机的UUID并把这个UUID放到session⾥⾯,然后在浏览器做数据提交的时候将此UUID提交到服务器。
服务器在接收到此UUID后,检查⼀下该UUID是否已经被提交,如果已经被提交,则不让逻辑继续执⾏下去…**1 ⾸先要定义⼀个annotation:⽤@Retention 和 @Target 标注接⼝@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Token {boolean save() default false;boolean remove() default false;}2 定义拦截器TokenInterceptor:public class TokenInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();Token annotation = method.getAnnotation(Token.class);if (annotation != null) {boolean needSaveSession = annotation.save();if (needSaveSession) {request.getSession(false).setAttribute("token", UUID.randomUUID().toString());}boolean needRemoveSession = annotation.remove();if (needRemoveSession) {if (isRepeatSubmit(request)) {return false;}request.getSession(false).removeAttribute("token");}}return true;} else {return super.preHandle(request, response, handler);}}private boolean isRepeatSubmit(HttpServletRequest request) {String serverToken = (String) request.getSession(false).getAttribute("token");if (serverToken == null) {return true;}String clinetToken = request.getParameter("token");if (clinetToken == null) {return true;}if (!serverToken.equals(clinetToken)) {return true;}return false;}}Spring MVC的配置⽂件⾥加⼊:<mvc:interceptors><!-- 使⽤bean定义⼀个Interceptor,直接定义在mvc:interceptors根下⾯的Interceptor将拦截所有的请求 --><mvc:interceptor><mvc:mapping path="/**"/><!-- 定义在mvc:interceptor下⾯的表⽰是对特定的请求才进⾏拦截的 --><bean class="****包名****.TokenInterceptor"/></mvc:interceptor></mvc:interceptors>@RequestMapping("/add.jspf")@Token(save=true)public String add() {//省略return TPL_BASE + "index";}@RequestMapping("/save.jspf")@Token(remove=true)public void save() {//省略}⽤法:在Controller类的⽤于定向到添加/修改操作的⽅法上增加⾃定义的注解类 @Token(save=true)在Controller类的⽤于表单提交保存的的⽅法上增加@Token(remove=true)在表单中增加⽤于存储token,每次需要报token值传⼊到后台类,⽤于从缓存对⽐是否是重复提交操作⽅法⼆:springboot中⽤注解⽅式每次操作,⽣成的key存放于缓存中,⽐如⽤google的Gruava或者Redis做缓存定义Annotation类@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface LocalLock {/*** @author fly*/String key() default "";/*** 过期时间 TODO 由于⽤的 guava 暂时就忽略这属性吧集成 redis 需要⽤到** @author fly*/int expire() default 5;}设置拦截类@Aspect@Configurationpublic class LockMethodInterceptor {private static final Cache<String, Object> CACHES = CacheBuilder.newBuilder()// 最⼤缓存 100 个.maximumSize(1000)// 设置写缓存后 5 秒钟过期.expireAfterWrite(5, TimeUnit.SECONDS).build();@Around("execution(public * *(..)) && @annotation(com.demo.testduplicate.Test1.LocalLock)")public Object interceptor(ProceedingJoinPoint pjp) {MethodSignature signature = (MethodSignature) pjp.getSignature();Method method = signature.getMethod();LocalLock localLock = method.getAnnotation(LocalLock.class);String key = getKey(localLock.key(), pjp.getArgs());if (!StringUtils.isEmpty(key)) {if (CACHES.getIfPresent(key) != null) {throw new RuntimeException("请勿重复请求");}// 如果是第⼀次请求,就将 key 当前对象压⼊缓存中CACHES.put(key, key);}try {return pjp.proceed();} catch (Throwable throwable) {throw new RuntimeException("服务器异常");} finally {// TODO 为了演⽰效果,这⾥就不调⽤ CACHES.invalidate(key); 代码了}}/*** key 的⽣成策略,如果想灵活可以写成接⼝与实现类的⽅式(TODO 后续讲解)** @param keyExpress 表达式* @param args 参数* @return ⽣成的key*/private String getKey(String keyExpress, Object[] args) {for (int i = 0; i < args.length; i++) {keyExpress = keyExpress.replace("arg[" + i + "]", args[i].toString());}return keyExpress;}}Controller类引⽤@RestController@RequestMapping("/books")public class BookController {@LocalLock(key = "book:arg[0]")@GetMappingpublic String save(@RequestParam String token) {return "success - " + token;}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
SpringMVC体系结构和处理请求控制器
SpringMVC体系结构和处理请求控制器MVC设计模式 通常的Web项⽬,架构模式基本分层 数据库访问接⼝:DAO层 处理业务逻辑:Service层 数据实体:POJO 负责前端请求的接受处理:Servlet 负责前端页⾯展⽰:JSP MVC设计模式:它是软件⼯程中的⼀种软件架构模式。
它强制性地使软件系统的输⼊、处理和输出分开。
把软件系统分为三个基本部分:模型(Model)、视图(View)、控制器(Controller) 视图(View):负责格式化数据并把他们呈现给⽤户,包括数据展⽰、⽤户交互、数据验证、界⾯设计等功能。
对应组件:JSP或者HTML⽂件 控制器(Controller):负责接收并转发请求,对进⾏处理后指派视图并将响应结果发送给客户端。
对应组件Servlet 模型(Model):模型对象拥有最多的处理任务,是应⽤程序的主体部分,负责数据逻辑(业务规则)的处理和实现数据操作。
对应组件:JavaBean(处理业务逻辑Service层,数据库操作相关的DAO层,贯穿各层之间的数据模型,数据实体POJO) MVC的两种模式 (1)JSP Model1 业务流程较为简单时,可以把控制器的功能交给视图实现。
故Model1模式只有视图和模型,没有控制器(JSP+JavaBean) 浏览器 - 请求 - JSP - JavaBean - 数据库 - JavaBean - JSP -响应 - 浏览器 (2) JSP Model2 相⽐JSPModel1,业务流程复杂时,就需要把业务流程控制交给控制器来实现。
即(JSP+Servlet+JavaBean) 浏览器 - 请求 - Servlet - JavaBean- JSP - 数据库 - JavaBean - JSP -Servlet -响应 - 浏览器 MVC处理过程 MVC的整体结构,对于MVC三个部分(模型、视图、控制器)功能职责分别进⾏了相应的阐述 (1)⾸先视图提供系统与⽤户交互的界⾯,并发送⽤户输⼊给控制器 (2)控制器接收⽤户的请求,并决定应该调⽤哪个模型来进⾏处理 (3)模型根据⽤户请求进⾏相应的业务逻辑处理,并返回处理结果(数据) (4)控制器根据返回的处理结果,调⽤相应的视图格式化模型返回的数据,并通过视图呈现给⽤户结果 MVC优缺点1. 优点1. 多视图共享⼀个模型,⼤⼤提⾼代码的可重⽤性2. MVC三个模块相互独⽴,松耦合架构3. 控制器提⾼了应⽤程序的灵活性和可配置性4. 有利于软件⼯程化管理 通过MVC的设计模式最终可以打造出⼀个松耦合+⾼重⽤性+⾼可适⽤性的架构 2.缺点1. 原理复杂2. 增加了系统结构和实现的复杂性3. 视图对模型数据的低效率访问 MVC来说:并不适合⼩型甚⾄中型规模的项⽬,花费⼤量时间将MVC应⽤到规模并不是很⼤的应⽤程序通常得不偿失Spring MVC介绍及其环境搭建 Spring MVC框架介绍 Spring MVC是Spring框架中⽤于Web应⽤开发的⼀个模块,是Spring提供的⼀个基于MVC设计式的优秀Web开发框架,本质上相当于Servlet。
简述springmvc工作原理
简述springmvc工作原理Spring MVC 是一个基于 Java 的轻量级的 web 框架,用来开发灵活、可扩展的 web 应用程序。
Spring MVC 的工作原理如下:1. 客户发出 HTTP 请求到前端控制器 DispatcherServlet。
2. DispatcherServlet 是应用的前端控制器,根据请求 URL 找到对应的处理器 Handler。
3. HandlerMapping 根据请求 URL 找到对应的处理器适配器HandlerAdapter,HandlerAdapter 是一个策略接口,负责执行具体的 Handler 。
4. HandlerAdapter 将处理器 Handler 封装成一个适配器,使其具备执行 Handler 的能力。
5. Handler 调用业务逻辑进行处理,并返回一个ModelAndView 对象。
6. ModelAndView 是 Spring MVC 的模型和视图对象,它包含处理结果数据和视图名称。
7. Handler 将处理结果数据存入 ModelAndView 中,并将视图名称返回给 HandlerAdapter。
8. HandlerAdapter 将 ModelAndView 传递给前端控制器DispatcherServlet。
9. DispatcherServlet 调用视图解析器 ViewResolver 解析视图名称,得到具体的视图对象 View。
10. View 是一个接口,负责渲染 ModelAndView 对象,将处理结果生成 HTML 返回给客户端。
11. 客户端浏览器接收到 HTML 文档,并将其呈现给用户。
以上是 Spring MVC 的工作流程,它的核心原理是通过前端控制器 DispatcherServlet 来实现请求的分发和处理,以及视图的解析和渲染。
通过 HandlerMapping、HandlerAdapter、视图解析器 ViewResolver 的配合,可以实现灵活的请求处理和视图展示,同时也能够很好地与 Spring 的依赖注入和面向切面编程等特性进行整合。
spring mvc 面试题
spring mvc 面试题Spring MVC 是一个在 Java Web 应用程序开发中广泛使用的轻量级框架。
它基于 MVC(Model-View-Controller)设计模式,提供了一种优雅的方式来构建可扩展、易维护和高效的Web 应用程序。
在面试中,常常会被要求深入了解 Spring MVC 的工作原理和常见问题。
本文将就Spring MVC 面试中常见的问题进行讨论和解答。
一、Spring MVC 的工作原理在面试中,经常会被问到 Spring MVC 的工作原理。
下面是关于Spring MVC 的工作原理的简要说明:1. 客户端发送请求:客户端通过浏览器发送一个 HTTP 请求给服务器。
2. DispatcherServlet 接收请求:由于在 web.xml 中配置了 Spring 的DispatcherServlet,它会接收到客户端的请求。
3. HandlerMapping 进行请求映射:根据配置的 URL 映射规则,DispatcherServlet 会将请求映射到相应的处理器(Controller)上。
4. Controller 处理请求:处理器(Controller)负责处理请求,并返回一个 ModelAndView 对象。
5. ViewResolver 进行视图解析:根据配置的视图解析规则,ViewResolver 会将 ModelAndView 对象中的逻辑视图名解析为具体的视图(JSP 页面等)。
6. View 渲染视图:解析得到具体视图之后,View 负责渲染模型数据到视图上。
7. 返回响应:服务器将渲染后的视图返回给客户端。
了解 Spring MVC 的工作原理对于面试中的问题回答至关重要,这样能够展示你对框架的整体理解,同时也能帮助面试官评估你的应用设计能力。
二、常见的 Spring MVC 面试题和解答1. 什么是 Spring MVC?Spring MVC 是一个基于 MVC 设计模式的 Web 应用程序开发框架,用于构建可扩展、可维护的 Java Web 应用程序。
详解SpringMVC中Controller的方法中参数的工作原理
详解SpringMVC中Controller的⽅法中参数的⼯作原理前⾔SpringMVC是⽬前主流的Web MVC框架之⼀。
SpringMVC中Controller的⽅法参数可以是Integer,Double,⾃定义对象,ServletRequest,ServletResponse,ModelAndView等等,⾮常灵活。
本⽂将分析SpringMVC是如何对这些参数进⾏处理的,使读者能够处理⾃定义的⼀些参数。
现象本⽂使⽤的demo基于maven。
我们先来看⼀看对应的现象。
@Controller@RequestMapping(value = "/test")public class TestController {@RequestMapping("/testRb")@ResponseBodypublic Employee testRb(@RequestBody Employee e) {return e;}@RequestMapping("/testCustomObj")@ResponseBodypublic Employee testCustomObj(Employee e) {return e;}@RequestMapping("/testCustomObjWithRp")@ResponseBodypublic Employee testCustomObjWithRp(@RequestParam Employee e) {return e;}@RequestMapping("/testDate")@ResponseBodypublic Date testDate(Date date) {return date;}}⾸先这是⼀个Controller,有4个⽅法。
他们对应的参数分别是带有@RequestBody的⾃定义对象、⾃定义对象、带有@RequestParam的⾃定义对象、⽇期对象。
