SpringMVC框架面试专题(初级-中级)-第三节

news/2024/12/22 9:18:46/

欢迎大家一起探讨~如果可以帮到大家请为我点赞关注哦~后续会持续更新

问题:

1.Spring MVC框架中的HandlerMapping是什么?请举例说明如何自定义一个HandlerMapping。

解析:

在Spring MVC框架中,HandlerMapping是用来将请求映射到对应的处理器(handler)的组件。Spring MVC中的HandlerMapping接口定义了一组方法,用于解析请求并确定应该使用哪个处理器来处理请求。

Spring MVC框架提供了多个HandlerMapping的默认实现,包括:

  • BeanNameUrlHandlerMapping:根据处理器的名字和请求的URL来确定处理器。
  • SimpleUrlHandlerMapping:根据请求的URL来确定处理器。
  • DefaultAnnotationHandlerMapping:根据处理器上的注解来确定处理器。

如果默认的HandlerMapping实现无法满足需求,我们可以自定义HandlerMapping来实现自己的映射策略。下面是一个自定义HandlerMapping的例子:

public class MyHandlerMapping extends AbstractUrlHandlerMapping {private Map<String, Object> urlMap;public MyHandlerMapping() {this.urlMap = new HashMap<>();}public void setUrlMap(Map<String, Object> urlMap) {this.urlMap = urlMap;}@Overrideprotected Object lookupHandler(String urlPath, HttpServletRequest request) throws Exception {Object handler = urlMap.get(urlPath);if (handler == null){// 如果urlMap中没有对应的处理器,则返回null,交给下一个HandlerMapping处理。return null;}return handler;}
}

这个自定义HandlerMapping实现了Spring MVC中的AbstractUrlHandlerMapping抽象类,并重写了其中的lookupHandler方法。在lookupHandler方法中,我们可以根据请求的URL在urlMap中查找对应的处理器,如果找到了,则返回处理器,否则返回null,交给下一个HandlerMapping处理。

下面是如何在Spring配置文件中配置这个自定义HandlerMapping:

<bean id="myHandlerMapping" class="com.example.MyHandlerMapping"><property name="urlMap"><map><entry key="/hello" value-ref="helloController"/></map></property>
</bean><bean id="helloController" class="com.example.HelloController"/>

在上面的配置中,我们先定义了一个MyHandlerMapping的Bean,并将其urlMap属性设置为一个Map,其中key为请求的URL,value为对应的处理器Bean。然后我们再定义一个HelloController的Bean作为处理器。这样,当请求的URL为/hello时,MyHandlerMapping就会将其映射到HelloController处理。

问题:

2.Spring MVC框架中的HandlerAdapter是什么?请举例说明如何自定义一个HandlerAdapter。

解析:

在Spring MVC框架中,HandlerAdapter是用来将处理器(handler)适配成可处理请求的对象的组件。Spring MVC中的HandlerAdapter接口定义了一组方法,用于将请求转换为处理器所需的参数类型,并调用处理器来处理请求。

Spring MVC框架提供了多个HandlerAdapter的默认实现,包括:

  • RequestMappingHandlerAdapter:用于处理使用@RequestMapping注解的处理器。
  • HttpRequestHandlerAdapter:用于处理实现HttpRequestHandler接口的处理器。
  • SimpleControllerHandlerAdapter:用于处理实现Controller接口的处理器。

如果默认的HandlerAdapter实现无法满足需求,我们可以自定义HandlerAdapter来实现自己的适配策略。下面是一个自定义HandlerAdapter的例子:

public class MyHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {// 判断处理器是否是自定义处理器的类型return handler instanceof MyController;}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 将请求转换为处理器所需的参数类型,并调用处理器来处理请求MyController myController = (MyController) handler;String result= myController.handleRequest(request.getParameter("name"));// 将处理结果封装成ModelAndView并返回ModelAndView mav = new ModelAndView("hello");mav.addObject("result", result);return mav;}@Overridepublic long getLastModified(HttpServletRequest request, Object handler) {// 返回处理器的最后修改时间,用于支持HTTP缓存return -1;}
}

这个自定义HandlerAdapter实现了Spring MVC中的HandlerAdapter接口,并重写了其中的supports和handle方法。在supports方法中,我们判断处理器是否是自定义处理器的类型,如果是,则返回true,表示当前适配器可以处理该处理器,否则返回false,交给下一个HandlerAdapter处理。在handle方法中,我们将请求转换为处理器所需的参数类型,并调用处理器来处理请求,最后将处理结果封装成ModelAndView并返回。

下面是如何在Spring配置文件中配置这个自定义HandlerAdapter:

<bean id="myHandlerAdapter" class="com.example.MyHandlerAdapter"/><bean id="myController" class="com.example.MyController"/><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="urlMap"><map><entry key="/hello" value-ref="myController"/></map></property><property name="interceptors"><list><ref bean="myInterceptor"/></list></property><property name="order" value="0"/>
</bean><bean id="myInterceptor" class="com.example.MyInterceptor"/>

在上面的配置中,我们先定义了一个MyHandlerAdapter的Bean,并将其作为处理器的适配器。然后我们定义了一个MyController的Bean作为处理器,在SimpleUrlHandlerMapping中将请求的URL为/hello的请求映射到MyController处理器,并将MyInterceptor添加为拦截器。这样,当请求的URL为/hello时,MyHandlerAdapter就会将其适配成MyController处理器来处理请求。

问题:

3.Spring MVC框架中的ViewResolver是什么?请举例说明如何自定义一个ViewResolver。

解析:

在Spring MVC框架中,ViewResolver是用来将逻辑视图名称(例如:hello)解析为具体的视图(例如:hello.jsp)的组件。Spring MVC中的ViewResolver接口定义了一组方法,用于根据逻辑视图名称和请求上下文来确定具体的视图。

Spring MVC框架提供了多个ViewResolver的默认实现,包括:

  • InternalResourceViewResolver:用于解析JSP视图。
  • FreeMarkerViewResolver:用于解析FreeMarker视图。
  • VelocityViewResolver:用于解析Velocity视图。

如果默认的ViewResolver实现无法满足需求,我们可以自定义ViewResolver来实现自己的视图解析策略。下面是一个自定义ViewResolver的例子:

public class MyViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) throws Exception {// 根据逻辑视图名称和请求上下文来确定具体的视图if (viewName.startsWith("my:")) {return new MyView();} else {return null;}}
}

这个自定义ViewResolver实现了Spring MVC中的ViewResolver接口,并重写了其中的resolveViewName方法。在resolveViewName方法中,我们可以根据逻辑视图名称和请求上下文来确定具体的视图。在这个例子中,如果逻辑视图名称以"my:"开头,则返回一个自定义的MyView视图,否则返回null,交给下一个ViewResolver处理。

下面是如何在Spring配置文件中配置这个自定义ViewResolver:

<bean id="myViewResolver" class="com.example.MyViewResolver"/><bean id="myController" class="com.example.MyController"><property name="viewName" value="my:view"/>
</bean>

在上面的配置中,我们先定义了一个MyViewResolver的Bean,并将其作为视图解析器。然后我们定义了一个MyController的Bean作为处理器,并将其逻辑视图名称设置为"my:view"。这样,当MyController处理器处理请求并返回逻辑视图名称为"my:view"时,MyViewResolver就会将其解析成自定义的MyView视图来展示。

问题:

4.Spring MVC框架中的文件上传和下载是什么?请举例说明如何处理文件上传和下载。

解析:

Spring MVC框架中的文件上传和下载是指通过HTTP协议将文件从客户端上传到服务器或从服务器下载到客户端的过程。Spring MVC框架提供了一组组件和API来支持文件上传和下载。

文件上传:

Spring MVC框架中的文件上传主要涉及到以下几个组件和API:

  • MultipartFile:用于封装上传文件的信息。
  • MultipartResolver:用于解析上传的文件,将其封装为MultipartFile对象。
  • CommonsMultipartResolver:Spring提供的MultipartResolver实现,使用Apache Commons FileUpload来解析上传的文件。
  • @RequestParam:用于从请求参数中获取上传的文件或文件数组。
  • @RequestPart:用于从请求体中获取上传的文件或文件数组。

下面是一个处理文件上传的例子:

@Controller
public class FileUploadController {@Autowiredprivate ServletContext servletContext;@RequestMapping(value = "/upload", method = RequestMethod.POST)public String upload(@RequestParam("file") MultipartFile file, Model model) throws IOException {String fileName = file.getOriginalFilename();String filePath = servletContext.getRealPath("/upload/") + fileName;File dest = new File(filePath);file.transferTo(dest);model.addAttribute("fileName", fileName);return "uploadResult";}}

在这个例子中,我们定义了一个FileUploadController的控制器,其中upload方法用于处理文件上传。在这个方法中,我们使用@RequestParam注解从请求参数中获取上传的文件,并使用file.transferTo方法将文件保存到服务器上指定的目录中。最后,我们将上传的文件名添加到Model中,并返回上传结果页面。

文件下载:

Spring MVC框架中的文件下载主要涉及到以下几个组件和API:

  • HttpServletResponse:用于向客户端发送文件。
  • @RequestMapping:用于映射下载请求的URL。
  • @ResponseBody:用于将方法返回值作为响应体发送给客户端。
  • InputStreamResource:用于封装要下载的文件流。

下面是一个处理文件下载的例子:

@Controller
public class FileDownloadController {@Autowiredprivate ServletContext servletContext;@RequestMapping(value = "/download", method = RequestMethod.GET)@ResponseBodypublic ResponseEntity<InputStreamResource> download(@RequestParam("fileName") String fileName) throws IOException {String filePath = servletContext.getRealPath("/upload/") + fileName;File file = new File(filePath);InputStreamResource resource = new InputStreamResource(new FileInputStream(file));HttpHeaders headers = newHttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getName());headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(file.length()));return ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource);}}

在这个例子中,我们定义了一个FileDownloadController的控制器,其中download方法用于处理文件下载。在这个方法中,我们使用@RequestParam注解从请求参数中获取要下载的文件名,并使用FileInputStream将文件读取为InputSteamResource对象。然后我们使用ResponseEntity将文件流封装成响应体,并设置响应头信息。最后,我们返回ResponseEntity对象,让Spring MVC框架将文件流发送给客户端。

需要注意的是,如果要使用文件上传和下载功能,还需要在Spring配置文件中配置MultipartResolver组件和静态资源处理器,具体配置方法可以参考Spring官方文档。

问题:

5.Spring MVC框架中的异步请求处理是什么?请举例说明如何处理异步请求。

解析:

Spring MVC框架中的异步请求处理是指在处理请求时,不会阻塞当前线程,而是将请求交给另一个线程来处理,从而提高系统的并发能力和响应速度。Spring MVC框架提供了一组组件和API来支持异步请求处理。

在Spring MVC框架中,异步请求处理主要涉及到以下几个组件和API:

  • DeferredResult:用于处理异步请求的结果。
  • Callable:用于处理异步请求的任务。
  • @Async:用于将方法标记为异步执行的方法。
  • @RequestMapping:用于映射异步请求的URL。
  • AsyncConfigurer:用于配置异步请求处理器的线程池等参数。

下面是一个处理异步请求的例子:

@Controller
public class AsyncController {@Autowiredprivate MyService myService;@RequestMapping("/async")@ResponseBodypublic DeferredResult<String> async() {DeferredResult<String> deferredResult = new DeferredResult<>(5000L);Callable<String> task = () -> myService.doSomething();myService.executeAsyncTask(task, deferredResult);return deferredResult;}}@Service
public class MyService {@Asyncpublic void executeAsyncTask(Callable<String> task, DeferredResult<String> deferredResult) {try {String result = task.call();deferredResult.setResult(result);} catch (Exception e) {deferredResult.setErrorResult(e.getMessage());}}public String doSomething() throws InterruptedException {Thread.sleep(3000L);return "Async Request Completed!";}}

在这个例子中,我们定义了一个AsyncController的控制器,其中async方法用于处理异步请求。在这个方法中,我们创建了一个DeferredResult对象,用于处理异步请求的结果,并将一个Callable任务交给MyService中的executeAsyncTask方法来异步执行。在executeAsyncTask方法中,我们使用@Async注解将该方法标记为异步执行,然后将Callable任务执行结果设置为DeferredResult的结果,并返回给客户端。

需要注意的是,如果要使用异步请求处理功能,还需要在Spring配置文件中配置AsyncConfigurer组件和静态资源处理器,具体配置方法可以参考Spring官方文档。


http://www.ppmy.cn/news/85978.html

相关文章

小黑子—MySQL数据库:第一章 -基础篇

MySQL数据库入门1.0 MySQL基础篇1. MySQL概述1.1 MySQL相关概念1.2 MySQL的安装及启动1.3 数据模型 2. SQL2.1 SQL的通用语法2.2 SQL语句的分类2.3 DDL语句2.3.1 DDL - 数据库操作2.3.2 DDL - 表操作 - 查询2.3.3 DDL - 表操作 - 创建2.3.4 DDL - 表操作 - 数据类型2.3.5 DDL -…

【MyBatis】PageHelper实现分页

分页 1.引入pom 普通mvc项目引入 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version> </dependency> springboot引入<dependency><groupId>co…

C++ 函数模板基础

文章目录 一、什么是函数模板二、函数模板的优点1、代码重用2、类型安全3、可读性4、泛型编程5、性能优化6、库开发 三、函数模板的使用场景1、通用操作2、数据结构与容器操作3、排序与查找算法4、数学与统计函数5、类型转换器6、自定义函数对象 四、模板参数的声明&#xff08…

Spark 3:Spark Core RDD持久化

RDD 的数据是过程数据 RDD 的缓存 # coding:utf8 import timefrom pyspark import SparkConf, SparkContext from pyspark.storagelevel import StorageLevelif __name__ __main__:conf SparkConf().setAppName("test").setMaster("local[*]")sc SparkC…

Java并发体系-锁与同步-[1]

本阶段文章讲的略微深入&#xff0c;一些基础性问题不会讲解&#xff0c;如有基础性问题不懂&#xff0c;可自行查看我前面的文章&#xff0c;或者自行学习。本篇文章比较适合校招和社招的面试&#xff0c;笔者在2020年面试的过程中&#xff0c;也确实被问到了下面的一些问题。…

【腾讯云FinOps Crane 集训营】 Crane入门

前言 随着云计算的快速发展和云原生应用的兴起&#xff0c;容器技术成为了现代化应用部署和管理的重要工具。 越来越多的公司正在选择将应用运行在云上或者自建的 Kubernetes 集群上&#xff0c;但是许多机构的调研 发现&#xff0c;绝大多数的用户集群资源利用率并不高&…

软件测试基础知识整理(八)- 软件缺陷

目录 一、软件缺陷 1.1 缺陷定义 1.2 缺陷判定标准 1.3 软件缺陷产生的原因 1.4 软件缺陷产生的根源 1.5 软件缺陷信息 1.5.1 缺陷状态 1.5.2 缺陷严重程度 1.5.3 缺陷优先级 1.6 缺陷报告模板 1.7 缺陷报告注意事项 1.8 缺陷跟踪流程 1.9 缺陷数据分析关注的问题 …

我的创作纪念日 - 拥抱AI时代

思考三个可行的用AI创业方案&#xff0c;且每个方案的成本控制到不超500美元 1. 基于机器学习的翻译工具 执行步骤&#xff1a; 使用机器学习技术&#xff0c;如神经网络&#xff0c;构建翻译模型 将翻译功能整合到网站或App上&#xff0c;实现智能在线翻译 不断优化并添加新…