SpringMVC面试题

介绍

讲一下你对SpringMVC的认识。

SpringMVC是一个基于请求驱动的web框架,主要是实现了MVC设计模式。MVC设计模式就是把整个项目分成 Model层View层Controller层,让整体的逻辑清晰,层次分明。
Model层:写一些JavaBean在里面,主要是包含整个项目的数据对象。
View层:页面的视图配置
Controller层:接收前端的请求,返回响应

SpringMVC的流程

  1. 张三进店,说我要只叫化鸡!(发送请求RequestMapping)。
    老板 前端控制器DispatcherServlet接到后,将请求转到后厨打杂的小工处理器映射器HandlerMapping,说你去冰箱拿只肉鸡 Handler 过来,小工很快就带着肉鸡回来了。
  2. 老板得到Handler后,就将它给了厨子处理器适配器HandlerAdapter,厨子就找了个合适的烤炉处理器Handler进行加工处理。加工完毕后,厨子将黄泥包着的烤鸡ModelAndView重新交给了老板。
  3. 烤鸡一到老板手上,老板心说这不行,这么一坨,顾客也不会拆啊,还得再加工!于是就把包裹送到了摆盘师傅视图解析器ViewResolver,说你给他拾掇好了再给我端过来。摆盘师傅迅速把鸡和荷叶黄泥壳之类的分开,并把鸡美美地拆成一冷盘(解析视图),端给了老板。
  4. 老板看了看很满意,但是感觉缺少一点灵魂,现场表演撒盐哥招牌动作(渲染视图),终于大功告成!于是把这一盘叫化鸡端给了张三(响应请求)。

说人话版:

  1. 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
  2. DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)。
  3. DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller。
  4. HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet。
  5. DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
  6. DispatcherServlet将模型数据填充到视图中。
  7. DispatcherServlet将结果响应给用户。

图文版:
在这里插入图片描述
在这里插入图片描述

SpringMVC和Strus2的区别?

  1. 入口不同
    SpringMVC入口是servlet,Struts2入口是filter
  2. 生命周期不同
    SpringMVC Controller是单例的,所以效率更高,但是不能使用成员变量获取参数。
    Struts2 Action是多例的,可以使用成员变量获取参数,导致效率比较低。

SpringMVC的控制器是什么设计模式?有什么问题?如何解决?

是单例模式,所以在多线程访问的时候有线程安全问题,所以不要用同步,会影响性能。

解决方案是不要在controller中定义成员变量,也就是不要在controller中定义比如private String name; 这类操作。如果非要用,这个时候就可以用Spring的注解@Scope来实现,设置成员变量的范围。

比如把这个bean 的范围设置成session,表示这bean是会话级别的:@Scope(“session”),当我们首次访问这个Controller的时候,他会根据判断这个会话是不是处于同一个session中,如果是一个新的,容器会执行init方法,如果一样就不会。

为什么设计成单例设计模式?

因为单例模式可以提高程序运行效率,节省内存空间,不需要每次访问都创建新的对象,所以,不需要花费额外的性能去创建对象,销毁对象,管理对象等等。

SpringMVC的常用注解有哪些。

Controller:标注该类是控制器。
@RequestMapping:后面跟个具体的url路径,用在方法上是该方法的具体路径,用在类上表示是所有方法的父路径。
@RequestBody:接收体,将客户端请求过来的Json转成Java对象
@ResponseBody:响应体,将Java对象转成Json,并且发送给客户端。
@PathVariable:用于获取URI中的参数,比如 xxx.com/user/{id} ,中id的值
@RestController:RESTful 风格的新API,还有@GetMapping,@DeleteMapping,@PostMapping,@PutMapping等。
@RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射。

注解的原理

注解的本质是一个继承了Annotation类的接口,注解接口的实现类实际上是Java通过反射在运行时生成的动态代理类。

@Component@Bean的区别是什么?

区别@Bean@Component
作用对象方法
使用位置在标有该注解的方法中定义产生这个bean,告诉Spring这是某个类的实例,当我需要用它的时候还给我。通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@ComponentScan注解定义要扫描的路径)。
自定义性比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。\

SpringMvc用什么对象从后台向前台传递数据的?

通过Model对象或Map对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。

### 关于Spring MVC的常见面试题 以下是关于Spring MVC的一些高频面试问题及其解答: #### 1. **什么是Spring MVC?** Spring MVC 是一种基于Java的轻量级Web开发框架,它是Spring Framework的一部分。它遵循MVC(模型-视图-控制器)设计模式,用于构建清晰分离的应用程序结构[^1]。 #### 2. **Spring MVC中的DispatcherServlet是什么?** `DispatcherServlet` 是Spring MVC的核心组件之一,作为前端控制器负责接收所有的HTTP请求并将其分发到相应的处理器(Handler)。通过配置文件或注解方式定义映射规则来实现这一过程[^1]。 #### 3. **Spring MVC如何处理请求流程?** 当客户端发起一个请求时,该请求会被转发给 `DispatcherServlet` 。随后按照如下顺序执行: - 调用合适的 HandlerMapping 来找到对应的 Controller; - 执行目标方法并将结果交给适配器进行解析; - 将最终的数据与逻辑视图名称返回至 DispatcherServlet ,再由其渲染实际页面后响应用户[^1]。 #### 4. **Spring Bean默认作用范围是什么?如果存在状态怎么办?** 在Spring容器中,默认情况下所有Bean都是以Singleton形式创建出来的。然而对于那些具有内部状态的对象来说可能会引发线程安全性方面的问题。因此建议要么让此类对象无状态化;要么考虑改变它们的作用域为Prototype从而每次注入新实例[^2]。 #### 5. **Spring MVC支持哪些类型的返回值?哪种更推荐使用?为什么?** 返回值可以是多种类型,包括但不限于String、ModelAndView等。其中较为常用的是String表示跳转路径名或者视图名字串。而 ModelAndView 则允许我们同时指定模型(Model)以及试图(View),不过通常为了简化代码书写习惯上还是倾向于采用字符串形式更好一些[^3]。 #### 6. **怎样向Session存储数据并通过Spring MVC管理生命周期?** 可以通过@SessionAttributes 注解读取特定属性保存进HttpSession 中直到超时期间结束为止。例如下面例子展示了如何利用Map接口参数自动绑定request scope内的键值对,并且还能把这些信息存入session里供后续访问[^4]: ```java @Controller @SessionAttributes(names={"key"}) // 或者 types={SomeType.class} public class ExampleController { @RequestMapping("/example") public String exampleMethod(@RequestParam String param, Map<String,Object> model){ model.put("attributeName","valueToBeStoredInSession"); return "viewName"; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值