螺竹编程
发布于 2024-05-19 / 6 阅读
0

Java面试题/后端框架:Spring MVC面试题

总体

Spring MVC是什么?它的工作原理是什么?

Spring MVC是一个基于Java的Web应用程序框架,它是Spring Framework的一部分。它的工作原理是:当一个请求到达Spring MVC应用程序时,DispatcherServlet将请求分发给适当的控制器(Controller),然后控制器处理请求并将处理结果返回给DispatcherServlet,DispatcherServlet再将结果呈现给用户。

Spring MVC框架的优点是什么?

Spring MVC框架的优点如下:

  • 易于使用和学习

  • 分层架构,可实现松耦合

  • 支持多种视图技术,如JSP、Thymeleaf、Freemarker等

  • 可以使用拦截器拦截请求和响应

  • 可以通过注解、XML配置或Java配置进行配置

  • 支持RESTful Web服务开发

Spring MVC框架有什么作用

Spring Web MVC 框架提供”模型-视图-控制器”( Model-View-Controller )架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。

MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

核心

Spring MVC的请求处理流程?

Spring MVC 的请求处理流程主要包括以下几个步骤:

  1. 当客户端发送请求时,请求会被 Servlet 容器(如 Tomcat)捕获,然后将请求转发给 Spring 的 DispatcherServlet。

  2. DispatcherServlet 是 Spring MVC 的核心组件,它会根据请求的 URL 信息,将请求分发给相应的处理器(Controller)。这个过程是通过 HandlerMapping 来实现的,HandlerMapping 会根据请求的 URL 信息,找到对应的处理器。

  3. 找到处理器后,DispatcherServlet 会通过 HandlerAdapter 调用处理器的方法来处理请求。HandlerAdapter 可以适配不同类型的处理器方法,例如带有 @RequestMapping 注解的方法、实现 Controller 接口的类等。

  4. 处理器方法执行完成后,会返回一个 ModelAndView 对象,该对象包含了响应结果的逻辑视图名和模型数据。

  5. DispatcherServlet 会将 ModelAndView 对象传递给 ViewResolver,ViewResolver 会根据逻辑视图名找到相应的视图对象,并返回给 DispatcherServlet。

  6. 最后,DispatcherServlet 会将模型数据传递给视图对象,视图对象将根据模型数据渲染视图,生成最终的响应结果。

  7. 在整个请求处理流程中,还可以使用拦截器(HandlerInterceptor)来进行请求的预处理和后处理,以及异常处理器(HandlerExceptionResolver)来处理请求处理过程中产生的异常。

SpringMVC的核心组件?

Spring MVC 是一个基于 Spring 框架的 Web 框架,其核心组件包括:

  1. DispatcherServlet:Spring MVC 的核心组件,负责接收请求、分发请求、处理请求并返回响应。

  2. HandlerMapping:用于将请求映射到具体的处理器(Controller)上。

  3. HandlerAdapter:用于调用处理器(Controller)方法并返回 ModelAndView 对象。

  4. ViewResolver:用于将 ModelAndView 对象中的逻辑视图名解析为具体的视图对象。

  5. View:视图对象,用于渲染响应结果。

  6. HandlerInterceptor:拦截器,用于在请求到达处理器之前或之后进行预处理或后处理。

  7. HandlerExceptionResolver:异常处理器,用于处理请求处理过程中产生的异常。

  8. MultipartResolver:文件上传解析器,用于处理文件上传功能。

  9. LocaleResolver:区域解析器,用于解析请求的区域信息。

Spring MVC中的DispatcherServlet是什么?它是如何工作的?

DispatcherServlet是Spring MVC框架的核心组件,它充当了所有HTTP请求的前端控制器。当一个请求到达DispatcherServlet时,它会根据请求的URL路径和配置的URL映射规则找到对应的控制器,然后将请求分发给控制器。控制器处理完请求后,将处理结果返回给DispatcherServlet,DispatcherServlet再将结果呈现给用户。

Spring MVC中的控制器是什么?如何定义一个控制器?

控制器是Spring MVC中用于处理HTTP请求的组件。可以使用@Controller注解或实现Controller接口来定义一个控制器。

例如:

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String handleRequest(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "hello";
    }
}

在上面的代码中,@Controller注解标志着MyController是一个控制器,@RequestMapping注解指定控制器方法应该处理的请求路径。

Spring MVC中的视图是什么?如何定义一个视图?

视图是Spring MVC中用于呈现响应的组件。可以使用JSP、Thymeleaf、Freemarker等多种视图技术来定义一个视图。在控制器中,可以使用Model对象来传递数据到视图中。

例如,在JSP中使用Model对象传递数据的示例代码如下:

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String handleRequest(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "hello";
    }
}

在上面的代码中,"hello"是视图的名称,它对应的视图文件是"hello.jsp",Model对象中的"message"属性的值会传递到视图中。

Spring MVC中的拦截器是什么?如何定义一个拦截器?

在Spring MVC中,拦截器是一种用于拦截请求并进行处理的组件。它可以在请求被处理前、处理过程中或处理后执行一些额外的操作。常见的应用场景包括记录日志、权限认证等。

Spring MVC中定义一个拦截器需要遵循以下步骤:

  1. 创建一个实现了HandlerInterceptor接口的类,该接口包含了3个方法:preHandle、postHandle和afterCompletion。这些方法分别对应拦截器在请求处理之前、请求处理后以及视图渲染完成后执行的操作。

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前执行的操作
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在请求处理之后视图渲染之前执行的操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在整个请求完成之后执行的操作
    }
}
  1. 在Spring MVC的配置文件中注册拦截器。可以通过实现WebMvcConfigurer接口或继承WebMvcConfigurationSupport类来进行配置。

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}

在上面的代码中,通过调用addInterceptor方法向InterceptorRegistry对象中添加一个MyInterceptor类型的拦截器。

需要注意的是,拦截器的执行顺序与它们被添加的顺序有关。如果有多个拦截器,它们会按照添加的顺序依次执行。如果其中一个拦截器返回false,请求处理将会中止,后续的拦截器将不会被执行。

Spring MVC中的数据绑定是什么?如何进行数据绑定?

数据绑定是Spring MVC中将请求参数绑定到控制器方法参数或JavaBean属性的过程。可以使用@ModelAttribute注解、@RequestParam注解或@RequestBody注解来进行数据绑定。

例如,在控制器中使用@ModelAttribute注解进行数据绑定的示例代码如下:

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String handleRequest(@ModelAttribute("user") User user) {
        // 在此处使用User对象
        return "hello";
    }
}

在上面的代码中,@ModelAttribute注解将请求参数绑定到名为"user"的User对象中。

Spring MVC中的异常处理是什么?如何进行异常处理?

异常处理是Spring MVC中处理控制器方法抛出的异常的过程。可以使用@ExceptionHandler注解、HandlerExceptionResolver接口或@ControllerAdvice注解来进行异常处理。

例如,在控制器中使用@ExceptionHandler注解进行异常处理的示例代码如下:

@Controller
public class MyController {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception ex) {
        // 处理异常并返回错误视图
        return "error";
    }

    @RequestMapping("/hello")
    public String handleRequest() throws Exception {
        throw new Exception("Something went wrong");
    }
}

在上面的代码中,@ExceptionHandler注解处理控制器方法抛出的Exception异常,并返回一个名为"error"的错误视图。

Spring MVC中的RESTful Web服务是什么?如何进行RESTful Web服务开发?

RESTful Web服务是一种基于HTTP协议的Web服务架构,它使用HTTP方法(GET、POST、PUT、DELETE等)来实现资源的增删改查操作。可以使用Spring MVC框架来开发RESTful Web服务。

例如,在控制器中使用@RequestMapping注解进行RESTful Web服务开发的示例代码如下:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        // 根据id获取用户信息
        return user;
    }

    @PostMapping("/")
    public void addUser(@RequestBody User user) {
        // 添加用户信息
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable int id, @RequestBody User user) {
        // 根据id更新用户信息
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable int id) {
        // 根据id删除用户信息
    }
}

在上面的代码中,@RestController注解标志着UserController是一个RESTful Web服务的控制器,@RequestMapping注解指定控制器方法应该处理的请求路径。@GetMapping、@PostMapping、@PutMapping和@DeleteMapping注解分别指定控制器方法应该处理的HTTP方法。@PathVariable注解将URL路径中的变量映射到控制器方法的参数中。@RequestBody注解将请求体中的JSON数据绑定到Java对象中。