首页 > Java > java教程 > Spring MVC 面试问问题

Spring MVC 面试问问题

王林
发布: 2024-07-16 17:15:18
原创
377 人浏览过

1. 什么是 Model 1 架构?

模型 1 架构 是一种用于开发 Web 应用程序的早期设计模式。在此架构中,JSP(JavaServer Pages)扮演着核心角色,处理表示和业务逻辑。

alt text

如上图所示,有一张图片显示了 Model1 架构的流程。

  1. 浏览器发送JSP页面请求
  2. JSP访问Java Bean并调用业务逻辑
  3. Java Bean 连接数据库并获取/保存数据
  4. 响应被发送到由JSP生成的浏览器
  • 流程:

    • 客户端请求直接发送到JSP页面。
    • JSP 页面处理请求,与模型(数据)交互,并生成响应。
  • 特征

    • 对于小型应用来说简单明了。
    • JSP 页面将表示逻辑 (HTML) 与业务逻辑(Java 代码)混合在一起。
    • 有限的关注点分离。
  • 缺点

    • 难以维护和扩展。
    • 混合表示和业务逻辑可能会导致意大利面条式代码。

2. 什么是 Model 2 架构?

Spring MVC Interview Asked Questions

Model 2 架构 是一种用于开发 Web 应用程序的高级设计模式,通常称为 MVC(模型-视图-控制器)架构。它将应用程序逻辑分为三个主要组件:模型、视图和控制器。

  • 流程:

    • 客户端请求被发送到控制器。
    • 控制器处理请求,与模型交互,并将响应转发给视图。
    • 视图将响应呈现给客户端。
  • 组件

    • 模型:代表应用程序的数据和业务逻辑。
    • View:表示表示层(通常是 JSP 或其他模板引擎)。
    • 控制器:处理用户请求并控制应用程序的流程。
  • 特征

    • 明确的关注点分离。
    • 更容易维护和扩展。
    • 对于更大的应用程序来说更具可扩展性。

3. Model 2 前端控制器架构是什么?

Model 2 前端控制器架构 是 Model 2 (MVC) 架构的改进,其中单个控制器(称为前端控制器)处理所有传入请求。该模式进一步将请求处理逻辑与业务逻辑和视图渲染解耦。

  • 流程:

    • 客户端请求被发送到单个前端控制器。
    • 前端控制器将请求委托给特定的处理程序或控制器。
    • 这些处理程序与模型交互并将响应转发到适当的视图。
  • 组件

    • 前端控制器:处理所有传入请求并将它们路由到适当的处理程序的中央控制器。
    • 处理程序/控制器:处理单个请求和业务逻辑的特定控制器。
    • 模型:代表应用程序的数据和业务逻辑。
    • View:表示表示层(通常是 JSP 或其他模板引擎)。
  • 特征

    • 集中控制请求处理。
    • 简化应用程序流程的配置和管理。
    • 增强的安全性和预处理功能(例如身份验证、日志记录)。
    • 更容易实现身份验证、日志记录和异常处理等常见功能。

您能展示 Spring MVC 中的示例控制器方法吗?

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "helloView";
    }
}
登录后复制
登录后复制

总结:上面的示例演示了 Spring MVC 中的一个简单控制器方法,它将 /hello 请求映射到 sayHello 方法。该方法向模型添加一条消息并返回一个视图名称(helloView)。


Can you explain a simple flow in Spring MVC?

  1. Client Request: A user sends an HTTP request to a URL mapped to a Spring MVC controller.
  2. DispatcherServlet: The request is received by the DispatcherServlet, the front controller in Spring MVC.
  3. Handler Mapping: The DispatcherServlet consults the HandlerMapping to determine the appropriate controller to handle the request.
  4. Controller: The controller processes the request. In the example above, MyController's sayHello method handles the request.
  5. Model: The controller interacts with the model to retrieve or update data. It adds data to the model to be used in the view.
  6. View Name: The controller returns the view name (e.g., helloView).
  7. ViewResolver: The ViewResolver resolves the logical view name to a physical view (e.g., helloView.jsp).
  8. Render View: The view (e.g., JSP, Thymeleaf) is rendered and returned to the client.

Summary: A Spring MVC request flow starts with a client request and goes through the DispatcherServlet, HandlerMapping, and controller. The controller interacts with the model, returns a view name, and the ViewResolver resolves it to a physical view which is then rendered and returned to the client.


What is a ViewResolver?

A ViewResolver is a component in Spring MVC that resolves view names to actual view files. It maps the logical view name returned by the controller to a specific view implementation (e.g., JSP file, Thymeleaf template).

Example:

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}
登录后复制

Summary: A ViewResolver in Spring MVC maps logical view names to physical view files, enabling the separation of view names in controllers from the actual view files.


What is a Model?

A Model in Spring MVC is an interface that provides a way to pass attributes to the view for rendering. It acts as a container for the data to be displayed in the view.

Example:

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "helloView";
    }
}
登录后复制
登录后复制

Summary: The Model in Spring MVC is used to pass data from the controller to the view. It allows adding attributes that will be available in the view for rendering.


What is ModelAndView?

ModelAndView is a holder for both the model and the view in Spring MVC. It encapsulates the data (model) and the view name or view object in one object.

Example:

@Controller
public class MyController {

    @RequestMapping("/greeting")
    public ModelAndView greeting() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("greetingView");
        modelAndView.addObject("message", "Hello, Spring MVC!");
        return modelAndView;
    }
}
登录后复制

Summary: ModelAndView in Spring MVC combines both the model data and the view name into one object, simplifying the return type from controllers when both model and view need to be specified.


What is a RequestMapping?

@RequestMapping is an annotation used to map HTTP requests to handler methods of MVC and REST controllers. It can map requests based on URL, HTTP method, request parameters, headers, and media types.

Example:

@Controller
@RequestMapping("/home")
public class HomeController {

    @RequestMapping(value = "/welcome", method = RequestMethod.GET)
    public String welcome(Model model) {
        model.addAttribute("message", "Welcome to Spring MVC!");
        return "welcomeView";
    }
}
登录后复制

Summary: @RequestMapping is an annotation in Spring MVC that maps HTTP requests to specific controller methods based on URL patterns, HTTP methods, and other parameters, allowing precise routing of requests.


Summary of All Concepts with Examples

  • Controller Method:

    • Handles HTTP requests and returns a view name or ModelAndView.
    • Example: @RequestMapping("/hello") public String sayHello(Model model)
  • Flow in Spring MVC:

    • Client request → DispatcherServlet → HandlerMapping → Controller → Model → View name → ViewResolver → Render view → Response to client.
    • Example: MyController's sayHello method.
  • ViewResolver:

    • Maps logical view names to actual view files.
    • Example: InternalResourceViewResolver mapping helloView to helloView.jsp.
  • Model:

    • Passes data from the controller to the view.
    • Example: model.addAttribute("message", "Hello, World!")
  • ModelAndView:

    • Encapsulates both model data and view name.
    • Example: ModelAndView modelAndView = new ModelAndView("greetingView"); modelAndView.addObject("message", "Hello, Spring MVC!");
  • RequestMapping:

    • Maps HTTP requests to controller methods.
    • Example: @RequestMapping(value = "/welcome", method = RequestMethod.GET)

What is Dispatcher Servlet?

The DispatcherServlet is the central dispatcher for HTTP request handlers/controllers in a Spring MVC application. It is responsible for routing incoming web requests to appropriate controller methods, handling the lifecycle of a request, and returning the appropriate response.


How do you set up Dispatcher Servlet?

In a traditional Spring MVC application, you set up the DispatcherServlet in the web.xml configuration file or via Java configuration.

Using web.xml:

<web-app>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
登录后复制

Using Java Configuration:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
登录后复制

In this setup, RootConfig and WebConfig are configuration classes annotated with @Configuration.


Do we need to set up Dispatcher Servlet in Spring Boot?

No, in Spring Boot, you do not need to explicitly set up the DispatcherServlet. Spring Boot automatically configures the DispatcherServlet for you. By default, it is mapped to the root URL pattern (/), and Spring Boot will scan your classpath for @Controller and other related annotations.

Spring Boot Application Class:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}
登录后复制

In this setup, Spring Boot handles the DispatcherServlet setup internally, allowing you to focus on your application's logic without worrying about the boilerplate configuration.

Summary

  • DispatcherServlet: The core of Spring MVC that routes requests to appropriate handlers.
  • Traditional Setup: Configured via web.xml or Java configuration.
  • Spring Boot: Automatically configured, no explicit setup required.

What is a Form Backing Object?

A form backing object in Spring MVC is a Java object that is used to capture form input data. It acts as a data holder for form fields, facilitating the transfer of form data between the view and the controller. The form backing object is typically a POJO (Plain Old Java Object) with properties that correspond to the form fields.

Example:

public class User {
    private String name;
    private String email;
    // Getters and setters
}
登录后复制

How is Validation Done Using Spring MVC?

Validation in Spring MVC is typically done using JSR-303/JSR-380 (Bean Validation API) annotations and a validator implementation. Spring provides support for validating form backing objects using these annotations and the @Valid or @Validated annotation in controller methods.

Example:

  1. Form Backing Object with validation annotations:

    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotEmpty;
    
    public class User {
        @NotEmpty(message = "Name is required")
        private String name;
    
        @Email(message = "Email should be valid")
        @NotEmpty(message = "Email is required")
        private String email;
    
        // Getters and setters
    }
    
    登录后复制
  2. Controller method with @Valid:

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PostMapping;
    
    import javax.validation.Valid;
    
    @Controller
    public class UserController {
    
        @GetMapping("/userForm")
        public String showForm(Model model) {
            model.addAttribute("user", new User());
            return "userForm";
        }
    
        @PostMapping("/userForm")
        public String submitForm(@Valid @ModelAttribute("user") User user, BindingResult result) {
            if (result.hasErrors()) {
                return "userForm";
            }
            // Process the form submission
            return "success";
        }
    }
    
    登录后复制

What is BindingResult?

BindingResult is an interface provided by Spring that holds the results of the validation and binding of form backing objects. It contains information about validation errors and can be used to determine whether the form submission is valid.

Example:

@PostMapping("/userForm")
public String submitForm(@Valid @ModelAttribute("user") User user, BindingResult result) {
    if (result.hasErrors()) {
        return "userForm";
    }
    // Process the form submission
    return "success";
}
登录后复制

How Do You Map Validation Results to Your View?

Validation results are automatically mapped to the view using the BindingResult object. The view can then access the error messages through the Spring form tags.

Example (JSP):

<form:form modelAttribute="user" method="post">
    <form:errors path="*" cssClass="error" />
    <div>
        <form:label path="name">Name:</form:label>
        <form:input path="name" />
        <form:errors path="name" cssClass="error" />
    </div>
    <div>
        <form:label path="email">Email:</form:label>
        <form:input path="email" />
        <form:errors path="email" cssClass="error" />
    </div>
    <input type="submit" value="Submit" />
</form:form>
登录后复制

What are Spring Form Tags?

Spring form tags are a set of JSP tags provided by the Spring Framework to simplify the development of web forms. These tags bind form fields to form backing objects, making it easier to handle form data and validation errors.

Common Spring Form Tags:

  • : Represents the form element.
  • : Creates an input field.
  • : Creates a label for a field.
  • : Displays validation errors.
  • : Creates a select (dropdown) field.
  • : Represents an option in a dropdown field.
  • : Creates a checkbox input.
  • : Creates a radio button input.
  • : Creates a hidden input field.

Example:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html>
<body>
    <h2>User Form</h2>
    <form:form modelAttribute="user" method="post">
        <div>
            <form:label path="name">Name:</form:label>
            <form:input path="name" />
            <form:errors path="name" cssClass="error" />
        </div>
        <div>
            <form:label path="email">Email:</form:label>
            <form:input path="email" />
            <form:errors path="email" cssClass="error" />
        </div>
        <input type="submit" value="Submit" />
    </form:form>
</body>
</html>
登录后复制

Summary:

  • Form Backing Object: A Java object that holds form data.
  • Validation in Spring MVC: Done using JSR-303/JSR-380 annotations and the @Valid annotation in controllers.
  • BindingResult: Holds validation and binding results.
  • Mapping Validation Results: Done via the BindingResult object and Spring form tags.
  • Spring Form Tags: JSP tags for simplifying form handling and validation in views.

What is a Path Variable?

A Path Variable in Spring MVC is used to extract values from the URI of a web request. It allows you to capture dynamic values from the URI and use them in your controller methods.

Example:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getUserById(@PathVariable("id") String userId) {
        return "User ID: " + userId;
    }
}
登录后复制

In this example, if a request is made to /user/123, the method getUserById will capture 123 as the userId parameter.


What is a Model Attribute?

A Model Attribute in Spring MVC is used to bind a method parameter or a return value to a named model attribute, which can be accessed in the view. It is typically used to prepare data for rendering in the view.

Example:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MyController {

    @RequestMapping(value = "/form", method = RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("user", new User());
        return "userForm";
    }

    @RequestMapping(value = "/form", method = RequestMethod.POST)
    public String submitForm(@ModelAttribute User user) {
        // Process form submission
        return "result";
    }
}
登录后复制

In this example, the User object is added to the model and made available to the view (userForm.jsp). When the form is submitted, the User object is populated with the form data and processed in the submitForm method.


What is a Session Attribute?

A Session Attribute in Spring MVC is used to store model attributes in the HTTP session, allowing them to persist across multiple requests. This is useful for maintaining state between requests.

Example:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@SessionAttributes("user")
public class MyController {

    @RequestMapping(value = "/form", method = RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("user", new User());
        return "userForm";
    }

    @RequestMapping(value = "/form", method = RequestMethod.POST)
    public String submitForm(@ModelAttribute User user) {
        // Process form submission
        return "result";
    }

    @RequestMapping(value = "/clearSession", method = RequestMethod.GET)
    public String clearSession(SessionStatus status) {
        status.setComplete();
        return "sessionCleared";
    }
}
登录后复制

In this example, the User object is stored in the session and can be accessed across multiple requests. The clearSession method can be used to clear the session attributes.

Summary:

  • Path Variable: Extracts values from the URI to use in controller methods.
  • Model Attribute: Binds method parameters or return values to model attributes, making them accessible in views.
  • Session Attribute: Stores model attributes in the HTTP session to maintain state across multiple requests.

What is an Init Binder?

An Init Binder in Spring MVC is a mechanism that allows you to customize the way data is bound to the form backing objects. It is used to initialize WebDataBinder, which performs data binding from web request parameters to JavaBean objects. @InitBinder methods are used to register custom editors, formatters, and validators for specific form fields or types.

Key Uses of Init Binder:

  • Register Custom Property Editors: To convert form field values to specific types.
  • Register Custom Formatters: To format the input/output of date, number, or other complex types.
  • Add Validators: To perform custom validation logic.

Example of Init Binder

Scenario: You have a form that includes a date field and you want to use a specific date format.

Step 1: Define a form backing object

public class User {
    private String name;
    private Date birthDate;

    // Getters and setters
}
登录后复制

Step 2: Define a controller with an @InitBinder method

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
public class UserController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

    @RequestMapping(value = "/form", method = RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("user", new User());
        return "userForm";
    }

    @RequestMapping(value = "/form", method = RequestMethod.POST)
    @ResponseBody
    public String submitForm(@ModelAttribute User user) {
        // Process form submission
        return "Name: " + user.getName() + ", Birth Date: " + user.getBirthDate();
    }
}
登录后复制

Explanation:

  1. Form Backing Object: User class with name and birthDate fields.
  2. Controller:
    • The @InitBinder method initBinder is defined to customize the data binding process.
    • WebDataBinder is used to register a custom editor (CustomDateEditor) for Date class.
    • CustomDateEditor uses a SimpleDateFormat to parse and format dates in the "yyyy-MM-dd" format.
    • The showForm method adds a new User object to the model and returns the view name userForm.
    • The submitForm method processes the form submission and returns a response with the user's name and birth date.

Step 3: Define the form view (JSP example)

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html>
<body>
    <h2>User Form</h2>
    <form:form modelAttribute="user" method="post">
        <div>
            <form:label path="name">Name:</form:label>
            <form:input path="name" />
        </div>
        <div>
            <form:label path="birthDate">Birth Date (yyyy-MM-dd):</form:label>
            <form:input path="birthDate" />
        </div>
        <input type="submit" value="Submit" />
    </form:form>
</body>
</html>
登录后复制
登录后复制

Summary:

  • Init Binder: A method annotated with @InitBinder in a Spring MVC controller that customizes data binding.
  • Key Uses:
    • Register custom property editors.
    • Register custom formatters.
    • Add validators.
  • Example:
    • Custom date formatting using CustomDateEditor.
    • Binding form data to a User object with a birthDate field formatted as "yyyy-MM-dd".

This customization allows precise control over how form data is converted and validated before it is bound to the controller's method parameters.


To set a default date format in a Spring application, you typically use an @InitBinder method in your controller to register a custom date editor. This approach allows you to specify the date format that should be used for all date fields in your form backing objects.

Here is a detailed example:

Step-by-Step Guide to Setting a Default Date Format

1. Define the Form Backing Object

Create a simple Java class to represent your form data.

public class User {
    private String name;
    private Date birthDate;

    // Getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
}
登录后复制

2. Define the Controller

Create a Spring MVC controller with an @InitBinder method to register the custom date editor.

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
public class UserController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

    @RequestMapping(value = "/form", method = RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("user", new User());
        return "userForm";
    }

    @RequestMapping(value = "/form", method = RequestMethod.POST)
    public String submitForm(@ModelAttribute User user, Model model) {
        // Process form submission
        model.addAttribute("user", user);
        return "result";
    }
}
登录后复制

3. Define the View (JSP Example)

Create a JSP file for the form (e.g., userForm.jsp).

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html>
<body>
    <h2>User Form</h2>
    <form:form modelAttribute="user" method="post">
        <div>
            <form:label path="name">Name:</form:label>
            <form:input path="name" />
        </div>
        <div>
            <form:label path="birthDate">Birth Date (yyyy-MM-dd):</form:label>
            <form:input path="birthDate" />
        </div>
        <input type="submit" value="Submit" />
    </form:form>
</body>
</html>
登录后复制
登录后复制

Create another JSP file to display the result (e.g., result.jsp).

<html>
<body>
    <h2>Form Submitted</h2>
    <p>Name: ${user.name}</p>
    <p>Birth Date: ${user.birthDate}</p>
</body>
</html>
登录后复制

Summary

  1. Form Backing Object: Define a class (e.g., User) with a date field.
  2. Controller:
    • Use @InitBinder to register a CustomDateEditor with a specific date format.
    • Handle form display and submission.
  3. Views: Create JSP files for the form and the result display.

This approach ensures that all date fields in your form backing objects use the specified date format ("yyyy-MM-dd" in this example), simplifying date handling and validation in your Spring application.


Exception Handling in Spring MVC

Exception handling in Spring MVC can be done in various ways, from using traditional try-catch blocks to leveraging Spring's @ExceptionHandler and @ControllerAdvice annotations for a more centralized and sophisticated approach.

1. Using @ExceptionHandler in Controllers

You can handle exceptions locally within a controller by using the @ExceptionHandler annotation. This annotation is used to define a method that will handle exceptions thrown by request handling methods in the same controller.

Example:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String test() {
        if (true) {
            throw new RuntimeException("Test exception");
        }
        return "test";
    }

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public String handleRuntimeException(RuntimeException ex) {
        return "Handled RuntimeException: " + ex.getMessage();
    }
}
登录后复制

2. Using @ControllerAdvice

For a more global approach to exception handling, you can use @ControllerAdvice. This annotation allows you to define a class that will handle exceptions for all controllers or specific controllers.

Example:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public String handleRuntimeException(RuntimeException ex) {
        return "Handled by GlobalExceptionHandler: " + ex.getMessage();
    }

    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}
登录后复制
登录后复制

In this example, GlobalExceptionHandler will handle RuntimeException and Exception globally for all controllers in the application.

Summary

  • Local Exception Handling:

    • Use @ExceptionHandler in a controller to handle exceptions thrown by methods in the same controller.
  • Global Exception Handling:

    • Use @ControllerAdvice to create a global exception handler that applies to multiple controllers.
    • @ExceptionHandler methods within @ControllerAdvice can handle specific exceptions or a range of exceptions.

Detailed Example with Controller Advice

Step 1: Create a Controller

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/api")
public class MyApiController {

    @GetMapping("/test")
    @ResponseBody
    public String test() {
        if (true) {
            throw new RuntimeException("Test exception in API");
        }
        return "test";
    }
}
登录后复制

Step 2: Create a Global Exception Handler with @ControllerAdvice

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public String handleRuntimeException(RuntimeException ex) {
        return "Handled by GlobalExceptionHandler: " + ex.getMessage();
    }

    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView mav = new ModelAndView("error");
        mav.addObject("message", ex.getMessage());
        return mav;
    }
}
登录后复制
登录后复制

In this setup:

  • Any RuntimeException thrown by any controller will be handled by the handleRuntimeException method in GlobalExceptionHandler.
  • Any general Exception will be handled by the handleException method, returning a view named error with an error message.

Summary Points

  • Exception Handling in Controllers:

    • @ExceptionHandler methods handle exceptions within the same controller.
  • Global Exception Handling with @ControllerAdvice:

    • Centralized exception handling for all controllers.
    • Can handle specific exceptions and provide common handling logic across the application.
    • Simplifies maintenance by separating exception handling from business logic.
  • Use Cases:

    • 本地处理:用于单个控制器内的特定异常处理需求。
    • 全局处理:在整个应用程序中实现一致且可重用的异常处理策略。

为什么 Spring MVC 如此受欢迎?

Spring MVC 流行有以下几个原因:

  • 简单:Spring MVC 提供了一种创建 Web 应用程序的简单方法,只需最少的配置。

  • 模块化:它允许采用模块化方法进行设计,这使得维护和更新代码变得更加容易。

  • 集成:Spring MVC 可以轻松与其他流行的 Java 框架(如 Hibernate、JPA 等)集成

  • 可测试性:为测试提供了出色的支持,可以更轻松地保证应用程序的质量。

  • 社区支持:它拥有一个庞大且活跃的社区,这意味着可以随时获得帮助。

  • 多功能性:它可用于开发各种应用程序,从简单的网站到复杂的企业应用程序。

  • 文档:有丰富详细的文档,方便学习和使用。

以上是Spring MVC 面试问问题的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板