JavaWeb编程面试题——Spring Web MVC
引言
面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待。不以刷题进大厂为目的,而是以学习为目的。这里的知识点会持续更新,目录也会随时进行调整。
关注公众号:编程火箭车。在【粉丝福利】中点击【面题大全】,其中的Java面试题在线实时更新、查看。
一、面试题导航
点这里进入JavaWeb编程面试题——导航
面试题持续更新中…...
二、面试题目
1.Spring MVC是什么?
Spring MVC 是 Spring Framework 中的一个模块,它是一个基于 Java 的 Web 框架,用于创建 Web 应用程序。也是一个基于 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 分离,将 Web 层进行职责解耦,把复杂的 Web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
2.Spring MVC有哪些优点?
-
灵活性:Spring MVC 可以很好地与其他 Spring 框架组件集成,也可以与其他框架和技术进行集成。
-
易于测试:Spring MVC 通过依赖注入的机制轻松实现了针对控制器的单元测试,使开发人员随时可以测试自己的代码。
-
高可维护性:Spring MVC 采用了 MVC 设计模式,将应用程序划分为Model、View和Controller三个部分,这使得应用程序的各个部分之间的耦合性较低,使得应用程序高可维护性受益。
-
支持多种视图技术:Spring MVC 支持多种视图技术,如 JSP、FreeMarker、Velocity、Thymeleaf 等。开发人员可以根据自己的需求和技能选择最适合自己的视图技术。
-
支持注解:Spring MVC 支持使用注解进行配置,并采用了统一的注解方式,简化了配置过程。
-
安全性:Spring MVC 可以集成 Spring Security 框架,提供了安全的访问控制和身份验证。
-
可定制性:Spring MVC 框架中的各个组件都可以通过继承、接口实现、AOP 等方式进行个性化定制,定制出符合自己需求的框架。
-
RESTful支持:Spring MVC 内置对 RESTful 架构支持很好,是构建 RESTful Web 服务的首选框架之一。
总之,Spring MVC 具有高度的灵活性和定制性,使得开发人员可以根据自己的业务需求来选择最适合自己的配置和设计方式。此外,Spring MVC 还具有高性能、安全、可维护、易于测试等诸多优点,这使得它在 Web 应用程序开发中得到了广泛的应用。
3.Spring MVC有哪些组件?
Spring MVC 的核心组件:
-
DispatcherServlet:中央控制器,将请求转发到具体的控制类。
-
Controller:具体处理请求的控制器。
-
HandlerMapping:映射处理器,负责映射中央处理器转发给 Controller 时的映射策略。
-
ModelAndView:服务层返回的数据和视图层的封装类。
-
ViewResolver:视图解析器,解析具体的视图。
-
Interceptors:拦截器,负责拦截我们定义的请求然后做处理工作。
4.请简单说一下SpringMVC的请求处理过程?
(1)发起请求到前端控制器(DispatcherServlet)。
(2)前端控制器请求 HandlerMapping 查找 Handler,可以根据 xml 配置、注解进行查找。
(3)处理器映射器 HandlerMapping 向前端控制器返回 Handler。
(4)前端控制器调用处理器适配器去执行 Handler。
(5)处理器适配器去执行 Handler。
(6)Handler 执行完成给适配器返回 ModelAndView。
(7)处理器适配器向前端控制器返回 ModelAndView,ModelAndView 是SpringMVC 框架的一个底层对象,包括 Model 和 view。
(8)前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)。
(9)视图解析器向前端控制器返回 View。
(10)前端控制器进行视图渲染,视图渲染将模型数据(在 ModelAndView 对象中)填充到 request 域。
(11)前端控制器向用户响应结果。
5.Spring 和 Spring MVC 的关系?
最开始只有 Spring,提供 IOC 和 AOP 核心功能,后来出现了 MVC、Security、Boot 等。原来的 Spring 就变成了现在的 Spring Core。
Spring MVC 就是一个 MVC 框架,其实大范围上来说属于 Spring,Spring MVC 是一个类似于 Struts 的 MVC 模式的 Web 开发框架,Spring MVC 是基于 Spring 功能之上添加的 Web 框架,Spring 跟 SpringMVC 可以理解为父子容器的关系,想用 Spring MVC 必须先依赖 Spring。
Spring MVC 是控制层,用来接收前台传值,调用 service 层和持久层,返回数据再通过 Spring MVC 把数据返回前台。
6.Spring MVC 和 Struts2 的区别有哪些?
-
Spring MVC 的入口是一个 servlet 即前端控制器,而 struts2 入口是一个 filter 过虑器。
-
Spring MVC 是基于方法开发(一个 url 对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例。
-
Struts 采用值栈存储请求和响应的数据,通过 OGNL 存取数据, springmvc 通过参数解析器是将 request 请求内容解析,并给方法形参赋值,将数据和视图封装成 ModelAndView 对象,最后又将 ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认使用 jstl。
7.SpringMVC怎么样设置重定向和转发?
-
在返回值前面加
forward:
就可以让结果转发,如:"forward:user?name=admin
" -
在返回值前面加
redirect:
就可以让返回值重定向,如:"redirect:http://www.baidu.com
"
8.SpringMVC返回JSON数据的注解?
@ResponseBody
9.SpringMVC还有什么方式返回JSON数据?
使用 JSON 工具将对象序列化成 JSON,常用工具 Jackson
,fastjson
,gson
。
利用 HttpServletResponse
,然后获取 response.getOutputStream()
或 response.getWriter()
。
10.SpringMVC Controller中的常用注解?
@Controller
@RequestMapping
@GetMapping
@PostMapping
@Autowired
@ResponseBody
@RequestBody
@RequestParam
@PathVariable
@Validated
11.SpringMVC常用注解都有哪些?
-
@requestMapping:用于请求 url 映射。
-
@RequestBody:注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
-
@ResponseBody :注解实现将 controller 方法返回对象转化为 json 响应给客户。
-
@Controller:控制器的注解,表示是表现层,不能用用别的注解代替。
12.SpringMVC 是线程安全的么?
-
SpringMVC 是线程安全的,因为 SpringMVC 是基于方法拦截处理请求,参数的变量全部是局部变量,并且 Spring 容器中的 Bean 默认也是单例模式,所以一般情况下不会产生线程安全问题。
-
如果非得要在 SpringMVC 中定义成员变量,设置为只读状态或者无状态也不会有线程安全问题。
-
如若非得在 Controller 中定义带状态的对象,并且多线程可以操作,则两种方式解决线程安全问题。
-
在 Controller 中使用
ThreadLocal
变量,对于 SpringMVC 中的数据共享,是通过ThreadLocal
实现,ThreadLocal
相当于一个Map
集合,只不过key
实现线程对象,value
是共享数据,针对共享数据进行线程隔离,同一个变量,不同的线程访问,会得到不同的结果,互相不干扰。 -
在 Spring 配置文件 Controller 中声明
scope="prototype"
,每次都创建新的 Controller。
-
13.过滤器和拦截器的区别?
执行顺序 :过滤前 - 拦截前 - Action 处理 - 拦截后 - 过滤后。
-
拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
-
拦截器不依赖与Servlet容器,过滤器依赖与Servlet容器。
-
拦截器只能对处理器(Controller、Action)请求起作用,而过滤器则可以对几乎所有的请求起作用。
-
拦截器可以访问上下文对象,而过滤器不能访问。
-
在Servlet的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
14.@PathVariable和@RequestParam的区别?
在 Spring MVC 中,@PathVariable
和 @RequestParam
都是用来从访问的 URL 中接收传递的参数的注解,但它们使用方式和处理的参数种类不同。
@PathVariable
注解用于解析 URL 中的占位符参数,即获取 URL 中的某一部分作为参数,比如获取 URL 中的ID
,如下面的示例:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
//处理id参数
}
在这个例子中,@PathVariable
注解将 URL 中的 id
参数映射到方法参数上,方法中的参数 id 将获取 URL 路径上的 {id}
值。
@RequestParam
注解用于获取请求中的查询参数,即获取 URL 中问号?后面的参数,如下面的示例:
@GetMapping("/users")
public List<User> getUsers(@RequestParam("page") int page, @RequestParam("size") int size) {
//处理page和size参数
}
在这个例子中,@RequestParam("page")
将从请求 URL 中获取名为 page
的参数值,并将其映射到方法中的 page
参数上。这个注解还可以指定参数的默认值、是否必需等。
综上所述,@PathVariable
用于接收 URL 中的占位符参数,@RequestParam
用于接收 URL 上的查询参数,两者的使用方式和处理的参数种类不同。
关注公众号:编程火箭车
我们定期发布编程相关的文章、资讯、活动等内容。帮助编程爱好者、初学者或初级程序员快速入门、打牢基础。欢迎大家关注,和我们一起探索编程的精彩世界。
本文来自博客园,作者:编程火箭车,转载请注明原文链接:https://www.cnblogs.com/coding-rocket/p/17433506.html