SpringMVC 面试重点题目及答案分享_第1页
SpringMVC 面试重点题目及答案分享_第2页
SpringMVC 面试重点题目及答案分享_第3页
SpringMVC 面试重点题目及答案分享_第4页
SpringMVC 面试重点题目及答案分享_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SpringMVC面试重点题目及答案分享考试时间:______分钟总分:______分姓名:______一、选择题(每题2分,共20分)1.在SpringMVC中,负责接收用户请求并将请求分发到具体处理器(Controller)的核心组件是?A.`HandlerAdapter`B.`HandlerMapping`C.`DispatcherServlet`D.`ViewResolver`2.以下哪个注解通常用于标记Spring的控制器类(Controller)?A.`@Service`B.`@Repository`C.`@Component`D.`@Controller`3.如果一个SpringMVC控制器方法需要返回JSON数据给客户端,除了使用`@ResponseBody`注解外,该控制器类通常应该使用哪个注解?A.`@RestController`B.`@RequestMapping`C.`@Service`D.`@Component`4.在SpringMVC中,`@RequestMapping("/users/{id}")`中的`{id}`部分表示什么?A.一个请求参数B.一个请求头C.一个路径变量(PathVariable)D.一个请求体5.当使用`@RequestParam`注解绑定请求参数时,如果请求参数不存在,且没有指定`required`属性或将其设置为`false`,会发生什么?A.抛出`NullPointerException`B.绑定值为`null`C.绑定值为空字符串`""`D.请求处理会中断6.SpringMVC中,用于将请求体中的JSON数据绑定到控制器方法参数的对象通常是?A.`@RequestParam`对象B.`@SessionAttribute`对象C.`@RequestBody`对象D.`@CookieValue`对象7.`@GetMapping`,`@PostMapping`等注解是哪个注解的派生注解?A.`@RequestMapping`B.`@Controller`C.`@ResponseBody`D.`@InitBinder`8.如果想全局性地配置SpringMVC的消息转换器(如将字符串转换为整数),可以通过实现哪个接口并注册到Spring容器中?A.`HandlerInterceptor`B.`HandlerMapping`C.`WebMvcConfigurer`D.`HandlerExceptionResolver`9.在SpringMVC中,`Model`对象的作用是什么?A.存储拦截器中的数据B.配置`DispatcherServlet`C.传递数据到视图进行渲染D.处理请求参数的校验10.`@SessionAttributes`注解用于什么场景?A.配置拦截器B.处理控制器方法抛出的异常C.将模型数据存储在HTTP会话中D.自定义数据绑定器二、多选题(每题3分,共30分)1.SpringMVC的工作流程中,哪些组件(或接口)会参与到请求处理的各个环节?A.`DispatcherServlet`B.`HandlerInterceptor`C.`ViewResolver`D.`HandlerAdapter`E.`MessageConverter`2.以下哪些注解可以用于标注在SpringMVC控制器的方法上,以指定该方法的访问路径?A.`@RequestMapping`B.`@GetMapping`C.`@PostMapping`D.`@PutMapping`E.`@InitBinder`3.关于SpringMVC的`@RequestParam`注解,以下说法哪些是正确的?A.可以用于绑定路径变量B.可以通过`params`属性指定必须存在的请求参数C.可以通过`headers`属性指定必须存在的请求头D.可以通过`value`属性指定请求参数名E.可以通过`required`属性指定请求参数是否必须存在4.SpringMVC中,以下哪些类或接口与异常处理相关?A.`HandlerExceptionResolver`B.`@ControllerAdvice`C.`@ExceptionHandler`D.`@InitBinder`E.`BindingResult`5.文件上传在SpringMVC中需要哪些配置或组件支持?A.表单必须设置`enctype="multipart/form-data"`B.需要配置一个`MultipartResolver`BeanC.控制器方法参数需要使用`@RequestParam("file")`或`@RequestPart`注解D.SpringMVC默认支持大文件上传,无需额外配置E.需要导入`spring-web`依赖6.`WebMvcConfigurer`接口提供了哪些扩展点,允许开发者自定义SpringMVC的行为?A.配置视图解析器B.配置消息转换器C.配置格式化器D.注册拦截器E.配置静态资源处理7.在SpringMVC中,`@Controller`、`@Service`、`@Repository`注解的主要区别是什么?A.`@Controller`用于控制器层,`@Service`用于服务层,`@Repository`用于数据访问层B.三者都用于标记Spring的组件,使它们能被Spring容器扫描和管理C.被`@Controller`标注的类不能注入其他层(`@Service`或`@Repository`)的BeanD.被`@Service`标注的类通常处理业务逻辑,被`@Repository`标注的类负责数据库操作E.使用`@Repository`注解的类在运行时会进行AOP代理以实现事务管理8.关于SpringMVC的拦截器(`HandlerInterceptor`),以下说法哪些是正确的?A.拦截器可以修改请求参数B.拦截器可以在请求处理完成后修改`Model`数据C.拦截器必须实现`HandlerInterceptor`接口的三个方法D.拦截器执行顺序是根据注册时的顺序决定的E.拦截器可以用来实现登录验证9.以下哪些注解与SpringMVC中的数据校验相关?A.`@NotNull`B.`@Valid`C.`@Size`D.`@InitBinder`E.`BindingResult`10.`@ResponseBody`注解的作用是什么?它通常与哪个注解一起使用?A.用于将方法返回的对象序列化为JSON或XML并写入响应体B.它会覆盖视图解析器的默认行为C.它主要用于RESTfulAPI的开发D.当控制器类使用了`@RestController`注解时,其方法可以不加`@ResponseBody`也能返回JSONE.它与`@RequestMapping`注解共同定义了请求的路径和方法三、判断题(每题1分,共10分)1.SpringMVC的`DispatcherServlet`是每个Web应用中都必须存在的唯一前端控制器。()2.使用`@SessionAttributes`注解添加的属性默认会存储在HTTP会话中,直到会话过期。()3.`@ExceptionHandler`注解必须标注在一个使用了`@ControllerAdvice`注解的类中才能生效。()4.`HandlerMapping`只负责根据请求路径找到对应的Controller方法,不关心方法如何执行。()5.在SpringMVC中,任何返回`void`类型的控制器方法,其视图名称默认与请求路径一致。()6.`@InitBinder`注解可以用于自定义请求参数的绑定逻辑,例如日期格式的转换。()7.SpringMVC默认使用`InternalResourceViewResolver`作为视图解析器,需要手动配置才能使用其他类型的视图解析器。()8.拦截器(Interceptor)和Spring的AOP一样,都可以实现跨方法的通知。()9.`@RestControllerAdvice`是`@ControllerAdvice`的专门版本,仅用于REST控制器的异常处理。()10.`MultipartFile`接口实现了`java.io.InputStream`接口,因此可以像处理普通文件一样处理上传的文件流。()四、简答题(每题5分,共20分)1.简述SpringMVC中`DispatcherServlet`的主要职责。2.解释`@RequestMapping`注解的`params`和`headers`属性的作用,并各举一个应用场景。3.描述SpringMVC中使用`@ControllerAdvice`和`@ExceptionHandler`结合处理全局异常的基本步骤。4.说明SpringMVC如何将请求参数(如字符串、日期)绑定到Java对象的属性上,并简述处理自定义类型转换(如日期格式)的方法。五、综合题(每题10分,共20分)1.假设需要开发一个SpringMVC控制器方法,用于处理用户登录请求。该方法的请求路径为`/login`,使用POST方法。请求体中包含用户名(username)和密码(password)两个字符串参数。如果登录成功,希望返回一个包含用户信息的JSON对象;如果失败,则返回一个错误码和错误信息。请写出该控制器方法的基本实现,并说明需要哪些配置或注解支持。2.设计一个简单的SpringMVC拦截器,用于记录所有进入SpringMVC控制器方法的请求信息(如请求路径、请求时间),并在请求处理完成后记录响应时间。请简述该拦截器需要实现哪些`HandlerInterceptor`接口方法,并说明在这些方法中应该如何实现记录逻辑。试卷答案一、选择题1.C解析:`DispatcherServlet`是前端控制器,负责接收所有Web请求,并统一调度处理。2.D解析:`@Controller`是Spring用于标注控制器的注解,表明该类是一个控制器组件。3.A解析:`@RestController`综合了`@Controller`和`@ResponseBody`,使得控制器方法默认返回的数据会被视为JSON处理。4.C解析:`@RequestMapping`的`value`或`path`属性中的`{id}`是PathVariable的语法,用于从URL中提取变量。5.B解析:`@RequestParam`的默认绑定行为是,如果参数不存在且`required=false`,则绑定值为`null`。6.C解析:`@RequestBody`用于将请求体中的JSON(或其他格式)数据反序列化绑定到指定的对象上。7.A解析:`@GetMapping`,`@PostMapping`等sontdesdérivésde`@RequestMapping`,spécifientlesméthodesHTTPpardéfaut.8.C解析:`WebMvcConfigurer`接口提供了多种`void`方法,允许自定义SpringMVC的各种配置,如视图解析器、消息转换器等。9.C解析:`Model`对象是一个`Map`,用于存储要传递给视图的数据。10.C解析:`@SessionAttributes`用于指定哪些模型属性需要放入HTTP会话中。二、多选题1.A,B,C,D,E解析:所有选项都参与到SpringMVC的请求处理流程中。`DispatcherServlet`是入口,`HandlerMapping`分发,`HandlerAdapter`执行,`Interceptor`拦截,`MessageConverter`转换,`ViewResolver`渲染。2.A,B,C,D解析:`@RequestMapping`是基础,`@GetMapping`等是`@RequestMapping`的方法级别变种。3.B,C,D,E解析:`params`和`headers`用于更精确地匹配请求,`value`指定参数名,`required`指定是否必须。`A`错误,路径变量用`@PathVariable`。4.A,B,C解析:`HandlerExceptionResolver`是传统异常处理器,`@ControllerAdvice`+`@ExceptionHandler`是现代全局异常处理方式,`@ExceptionHandler`是`@ControllerAdvice`中处理异常的方法。5.A,B,C解析:文件上传需要`multipart/form-data`表单,配置`MultipartResolver`,方法参数用`@RequestParam`或`@RequestPart`接收`MultipartFile`。`D`错误,大文件可能需要配置。6.A,B,C,D解析:这些都是`WebMvcConfigurer`提供的扩展配置点。7.A,B,D解析:`A`描述了三层架构中常见注解的用途;`B`是正确的基本功能;`C`错误,`@Controller`也可以注入其他层Bean;`D`描述了服务层和仓库层的典型职责。`E`错误,事务管理通常通过`@Transactional`注解或AOP实现。8.A,B,C,D,E解析:拦截器可以在预处理、后处理、完成处理阶段修改请求、响应、模型数据。需要实现三个方法,执行顺序取决于注册顺序,可用于登录验证等。9.A,B,C解析:`@NotNull`,`@Valid`,`@Size`都是JSR303/JSR349校验注解。`D`用于自定义参数绑定。`E`是`@Valid`注解的作用对象。10.A,B,C,E解析:`A`是`@ResponseBody`的核心作用。`B`正确,它会阻止默认的视图解析。`C`正确,是RESTAPI的常用场景。`D`错误,`@RestController`的方法可以不加`@ResponseBody`返回对象,但会自动被`@ResponseBody`处理。`E`正确,`@RestController`内部集成了`@ResponseBody`。三、判断题1.错误解析:一个Web应用可以配置多个`DispatcherServlet`,但通常只有一个用于处理普通请求,可能还有专门用于静态资源或特定模块的。2.正确解析:`@SessionAttributes`添加的属性默认存储在会话中,除非指定了其他存储类型(如`sessionAttributes`)。3.错误解析:`@ExceptionHandler`注解可以直接标注在`@Controller`或`@RestController`类的方法上,处理该类抛出的异常。4.正确解析:`HandlerMapping`负责根据请求信息(如URL、HTTP方法)查找合适的`Handler`(即Controller方法),`HandlerAdapter`才负责调用该方法。5.错误解析:返回`void`的方法需要显式使用`@RequestMapping`指定`produces`或`responseStatus`,否则SpringMVC会尝试寻找匹配的视图,如果没有则报错。默认行为不是与请求路径一致。6.正确解析:`@InitBinder`用于注册`PropertyEditor`或自定义`BindingResult`的`CustomEditorConfigurer`,可以处理复杂类型转换。7.错误解析:`InternalResourceViewResolver`是默认视图解析器,其行为可以通过配置修改(如设置前缀、后缀),但它本身是默认配置的一部分。使用其他视图解析器需要显式配置。8.正确解析:拦截器在方法调用前后执行代码,AOP在方法执行前后(或返回后)通过切点表达式拦截方法执行,都能实现跨方法通知。9.正确解析:`@RestControllerAdvice`是`@ControllerAdvice`的子注解,专门用于增强REST控制器的异常处理能力。10.正确解析:`MultipartFile`接口继承自`java.io.InputStream`,可以从`InputStream`读取文件内容,因此可以像处理普通输入流一样处理上传文件。四、简答题1.答:`DispatcherServlet`的主要职责是:*作为SpringMVC应用程序的前端控制器(FrontController),统一接收所有来自客户端的HTTP请求。*解析请求中的参数,并将请求分发到合适的处理器(Handler,通常是某个Controller方法)。*调用`HandlerMapping`查找对应的`Handler`。*使用`HandlerAdapter`执行找到的`Handler`(即调用Controller方法)。*使用`MessageConverter`将Controller方法返回的对象转换为适合HTTP响应的数据格式(如JSON、XML)。*将模型数据(Model)传递给`ViewResolver`。*使用`ViewResolver`找到对应的视图(如JSP文件),并将模型数据渲染成完整的HTML页面或其他格式的响应内容。*将最终的响应对象返回给客户端。*管理`WebApplicationContext`,为SpringMVC核心组件和其他请求相关的Bean提供依赖注入。2.答:`@RequestMapping`的`params`属性用于指定方法必须接收的请求参数名及其值,否则请求不会被处理。例如,`@RequestMapping("/user")`配置`params={"id=123"}`表示只有当请求参数`id`的值为`123`时,该方法才会被调用。场景:在一个包含多个用户信息的列表页面中,每个用户的详情页面URL需要包含该用户的唯一ID。可以使用`params`来确保请求详情页时,URL中必须带有正确的`id`参数。3.答:使用`@ControllerAdvice`和`@ExceptionHandler`处理全局异常的基本步骤如下:*创建一个类,并使用`@ControllerAdvice`注解标记,表示该类是全局异常处理器。*在该类中,使用`@ExceptionHandler`注解标记方法,指定该方法用于处理特定类型的异常(如`@ExceptionHandler(Exception.class)`处理所有异常,或`@ExceptionHandler({MyException1.class,MyException2.class})`处理指定异常)。*`@ExceptionHandler`方法可以接收异常对象作为参数(通常是`Exception`或其子类)。*方法可以返回`View`对象(重定向或渲染视图)、`String`(视图名称)、`ResponseEntity`(包含状态码和体的响应)、`void`(直接写入响应体,常用于异步场景或RESTAPI返回JSON/XML)。*配置完成后,当任何SpringMVC控制器(或被`@ControllerAdvice`处理的控制器)抛出指定类型的异常时,对应的`@ExceptionHandler`方法会被自动调用,执行异常处理逻辑。4.答:SpringMVC通过以下方式绑定请求参数到Java对象属性:*简单类型和基本类型:根据`name`属性匹配请求参数名,使用Spring的`ConversionService`将请求参数字符串转换为对应的Java类型(如`"123"`->`123`,`"true"`->`true`)。*JavaBean:如果请求参数名与JavaBean的属性名匹配,Spring会调用该属性的`setter`方法,并将转换后的参数值传入。例如,请求参数`=John`会被绑定到`User`对象的`setName("John")`方法。*集合类型:使用`@RequestParam`的`value`或`name`属性指定数组或集合类型的属性名,Spring会将请求参数(通常是多个同名参数)解析为`String[]`或`List<String>`并绑定。处理自定义类型转换(如日期格式)的方法:*自定义`PropertyEditor`:使用`@InitBinder`注解在Controller中注册一个`CustomEditorConfigurer`,配置自定义的`PropertyEditor`来处理特定类型的转换。*`@DateTimeFormat`:在需要转换的日期类型属性上使用`@DateTimeFormat(pattern="yyyy-MM-dd")`注解,Spring会自动使用`SimpleDateFormat`(或其他配置的格式化器)进行转换。*`JavaTimeFormatter`:对于Java8的日期时间API(如`LocalDate`,`LocalDateTime`),可以使用`@DateTimeFormat(iso=ISO.DATE_TIME)`等注解进行转换。五、综合题1.答:基本实现如下:```javaimportorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.http.HttpStatus;importjava.util.Map;@RestController@RequestMapping("/api")//可以放在类级别publicclassLoginController{@PostMapping("/login")publicMap<String,Object>login(@RequestBodyMap<String,String>loginInfo){Stringusername=loginInfo.get("username");Stringpassword=loginInfo.get("password");//...这里应该调用Service层进行验证booleanisValid="correctUsername".equals(username)&&"correctPassword".equals(password);if(isValid){//假设返回用户信息returnMap.of("status","success","user",Map.of("id",1,"name",username));}else{//返回错误信息,状态码由@ResponseStatus或自定义ResponseBuilder设置thrownewRuntimeException("Invalidusernameorpassword");//抛出异常,后续可全局处理或这里用@ResponseStatus//或者使用@ResponseStatus(HttpStatus.UNAUTHORIZED)直接返回状态码}//如果使用@ResponseStatus(HttpStatus.OK),则返回的JSON会默认带有success状态}//可选:如果不用全局异常处理,可以在这里捕获异常并返回错误信息/*@ExceptionHandler(RuntimeException.class)publicMap<String,Object>handleLoginError(RuntimeExceptione){returnMap.of("status","error","message",e.getMessage());}*/}```需要的配置或注解:*`@RestController`:标记控制器类,并使其方法默认返回的数据被视为JSON。*`@RequestMapping("/api")`:类级别路径前缀。*`@PostMapping("/login")`:指定方法处理POST请求的`/api/login`路径。*`@RequestBody`:将请求体中的JSON数据绑定到`loginInfo`Map对象。*`@ResponseStatus`(可选):如果希望直接返回HTTP状态码(如401Unauthorized),可以使用此注解标记方法或异常。*`perties`或`application.yml`:可能需要配置`spring.mvc.hiddenmethod.filter.enabled=true`以启用对请求体中`userId`等参数的保护(如果存在)。2.答:*需要实现的`HandlerInterceptor`方法:*`preHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)`:在Controller方法执行前调用。可以在此记录请求路径(`request.getRequestURI()`),请求时间(`System.currentTimeMillis()`)。*`postHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)`:在Controller方法执行后、视图渲染前调用。可以在此记录响应时间,并可以修改`modelAndView`。*`afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)`:在整个请求处理完成后调用(即视图渲染完毕后)。可以在此记录最终响应时间,并且如果处理过程中发生了异常,`ex`参数会非空。可以在此进行资源清理或最终记录。*记录逻辑实现(伪代码/思路):*在`preHandle`中:获取当前时间戳`startTime`;记录`requestURI`和`startTime`。*在`postHandle`中:获取当前时间戳`responseTime`;记录`responseTime`;计算处理时间`processTime=responseTime-startTime`。*在`afterCompletion`中:如果`ex`为`null`,表示无异常;记录最终`responseTime`和`processTime`;如果`ex`非空,记录异常信息`ex.getMessage()`和最终时间。```javaimportorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.util.concurrent.atomic.AtomicLong;publicclassLoggingInterceptorimplementsHandlerInterceptor{privateAtomicLongrequestCount=newAtomicLong(0);@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{longstartTime=System.currentTimeMillis();request.setAttribute("requestStartTime",startTime);//存储在request中,可能在postHandle或afterCompletion读取System.out.println("Pre-handle:Request"+requestCount.incrementAndGet()+"-Path:"+request.getRequestURI()+",Time:"+startTime);returntrue;//继续执行后续处理器}@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论