Spring MVC Interview-Fragen

Fragen in Vorstellungsgesprächen bei Spring MVC

1. Einführung

Spring MVC ist das ursprüngliche Webframework von Spring, das auf der Servlet-API basiert. Es bietet eine Model-View-Controller-Architektur, mit der flexible Webanwendungen entwickelt werden können.

In diesem Tutorial konzentrieren wir uns auf die damit verbundenen Fragen, da es sich häufig um ein Thema in einem Vorstellungsgespräch für Spring-Entwickler handelt.

Für weitere Fragen zum Spring Framework können Sieanother Spring related article unsererinterview questions series überprüfen.

2. Grundlegende Fragen zu Spring MVC

Q1. Warum sollten wir Spring MVC verwenden?

Spring MVC implements a clear separation of concerns that allows us to develop and unit test our applications easily.

Die Konzepte mögen:

  • Dispatcher-Servlet

  • Controller

  • Resolver anzeigen

  • Ansichten, Modelle

  • ModelAndView

  • Modell- und Sitzungsattribute

sind völlig unabhängig voneinander, und sie sind nur für eine Sache verantwortlich.

Daher istMVC gives us quite big flexibility. Es basiert auf Schnittstellen (mit bereitgestellten Implementierungsklassen) und wir können jeden Teil des Frameworks mithilfe benutzerdefinierter Schnittstellen konfigurieren.

Another important thing is that we aren’t tied to a specific view technology (for example, JSP), but we have the option to choose from the ones we like the most.

Auchwe don’t use Spring MVC only in web applications development but in the creation of RESTful web services as well.

Q2. Welche Rolle spielt die Annotation von@Autowired?

The @Autowired annotation can be used with fields or methods for injecting a bean by type. Mit dieser Annotation kann Spring zusammenarbeitende Beans auflösen und in Ihre Bean einfügen.

Weitere Informationen finden Sie im Tutorial zu@Autowired in Spring.

Q3. Erklären Sie ein Modellattribut

Die Annotation@ModelAttribute ist eine der wichtigsten Annotationen in Spring MVC. It binds a method parameter or a method return value to a named model attribute and then exposes it to a web view.

Wenn wir es auf Methodenebene verwenden, gibt es an, dass der Zweck dieser Methode darin besteht, ein oder mehrere Modellattribute hinzuzufügen.

Wenn es andererseits als Methodenargument verwendet wird, gibt es an, dass das Argument aus dem Modell abgerufen werden soll. Wenn es nicht vorhanden ist, sollten wir es zuerst instanziieren und dann zum Modell hinzufügen. Sobald das Modell vorhanden ist, sollten wir die Argumentfelder mit allen Anforderungsparametern füllen, die übereinstimmende Namen haben.

Weitere Informationen zu dieser Anmerkung finden Sie in unserenarticle related to the @ModelAttribute annotation.

Q4. Erklären Sie den Unterschied zwischen@Controller und@RestController?

Der Hauptunterschied zwischen den Anmerkungen@Controller und@RestController besteht darin, dassthe @ResponseBody annotation is automatically included in the @RestController. Dies bedeutet, dass wir unsere Handler-Methoden nicht mit@ResponseBody kommentieren müssen. Wir müssen dies in einer@Controller-Klasse tun, wenn wir den Antworttyp direkt in den HTTP-Antworttext schreiben möchten.

Q5. Beschreiben Sie aPathVariable

We can use the @PathVariable annotation as a handler method parameter in order to extract the value of a URI template variable.

Wenn wir beispielsweise einen Benutzer anhand seiner ID auswww.mysite.com/user/123 abrufen möchten, sollten wir unsere Methode in der Steuerung als/user/{id} zuordnen:

@RequestMapping("/user/{id}")
public String handleRequest(@PathVariable("id") String userId, Model map) {}

The @PathVariable has only one element named value. It’s optional and we use it to define the URI template variable name. Wenn Sie das value-Element weglassen, muss der Name der URI-Vorlagenvariablen mit dem Methodenparameternamen übereinstimmen.

Es ist auch zulässig, mehrere@PathVariable-Anmerkungen zu verwenden, indem Sie diese nacheinander deklarieren:

@RequestMapping("/user/{userId}/name/{userName}")
public String handleRequest(@PathVariable String userId,
  @PathVariable String userName, Model map) {}

oder setzen Sie sie alle inMap<String, String> oderMultiValueMap<String, String>:

@RequestMapping("/user/{userId}/name/{userName}")
public String handleRequest(@PathVariable Map varsMap, Model map) {}

Q6. Validierung mit Spring MVC

Spring MVC supports JSR-303 specifications by default. We need to add JSR-303 and its implementation dependencies to our Spring MVC application. Der Hibernate Validator ist beispielsweise eine der JSR-303-Implementierungen, die uns zur Verfügung stehen.

JSR-303 ist eine Spezifikation der Java-API für die Bean-Validierung, Teil von JavaEE und JavaSE, die sicherstellt, dass die Eigenschaften einer Bean bestimmte Kriterien erfüllen, indem Anmerkungen wie@NotNull,@Min und@Max. Weitere Informationen zur Validierung finden Sie im Artikel vonJava Bean Validation Basics.

Spring offers the @Validator annotation and the BindingResult class. Die Implementierung vonValidatorführt zu Fehlern in der Controller Request Handler-Methode, wenn ungültige Daten vorliegen. Dann können wir die KlasseBindingResultverwenden, um diese Fehler zu erhalten.

Neben den vorhandenen Implementierungen können wir auch unsere eigenen erstellen. Dazu erstellen wir zunächst eine Anmerkung, die den JSR-303-Spezifikationen entspricht. Dann implementieren wir die KlasseValidator. Eine andere Möglichkeit wäre, dieValidator-Schnittstelle von Spring zu implementieren und sie über die Annotation von@InitBinderin der Klasse vonControllerals Validator festzulegen.

Informationen zum Implementieren und Verwenden Ihrer eigenen Validierungen finden Sie im Tutorial zuCustom Validation in Spring MVC.

Q7. Was sind die@RequestBody und die@ResponseBody?

The @RequestBody annotation, used as a handler method parameter, binds the HTTP Request body to a transfer or a domain object. Spring deserialisiert eingehende HTTP-Anforderungen mithilfe von HTTP-Nachrichtenkonvertern automatisch für das Java-Objekt.

When we use the @ResponseBody annotation on a handler method in the Spring MVC controller, it indicates that we’ll write the return type of the method directly to the HTTP response body. Wir werden es nicht inModel setzen, und Spring wird nicht als Ansichtsname interpretiert.

Weitere Informationen zu diesen Anmerkungen finden Sie im Artikel zu@RequestBody and @ResponseBody.

Q8. Erklären SieModel,ModelMap undModelAndView?

The Model interface defines a holder for model attributes. The ModelMap has a similar purpose, with the ability to pass a collection of values. Diese Werte werden dann so behandelt, als ob sie innerhalb vonMap liegen. Wir sollten beachten, dass wir inModel (ModelMap) nur Daten speichern können. Wir geben Daten ein und geben einen Ansichtsnamen zurück.

Andererseits istwith the ModelAndView, we return the object itself. Wir legen alle erforderlichen Informationen wie die Daten und den Ansichtsnamen in dem Objekt fest, das wir zurückgeben.

Weitere Details finden Sie im Artikel zuModel, ModelMap, and ModelView.

Q9. Erklären SieSessionAttributes undSessionAttribute

The @SessionAttributes annotation is used for storing the model attribute in the user’s session. Wir verwenden es auf Controller-Klassenebene, wie in unserem Artikel überSession Attributes in Spring MVC gezeigt:

@Controller
@RequestMapping("/sessionattributes")
@SessionAttributes("todos")
public class TodoControllerWithSessionAttributes {

    @GetMapping("/form")
    public String showForm(Model model,
      @ModelAttribute("todos") TodoList todos) {
        // method body
        return "sessionattributesform";
    }

    // other methods
}

Im vorherigen Beispiel wird das Modellattribut 'todos' zur Sitzung hinzugefügt, wenn@ModelAttribute und@SessionAttributes dasselbe Namensattribut haben.

If we want to retrieve the existing attribute from a session that is managed globally, we’ll use @SessionAttribute annotation as a method parameter:

@GetMapping
public String getTodos(@SessionAttribute("todos") TodoList todos) {
    // method body
    return "todoView";
}

Q10. Was ist der Zweck von@EnableWebMVC?

The @EnableWebMvc annotation’s purpose is to enable Spring MVC via Java configuration. Dies entspricht<mvc: annotation-driven> in einer XML-Konfiguration. Diese Anmerkung importiert die Spring MVC-Konfiguration ausWebMvcConfigurationSupport. Es ermöglicht die Unterstützung von mit@Controller annotierten Klassen, die@RequestMapping verwenden, um eingehende Anforderungen einer Handlermethode zuzuordnen.

Weitere Informationen zu diesen und ähnlichen Anmerkungen finden Sie in unserenGuide to the Spring @Enable Annotations.

Q11. Was istViewResolver im Frühjahr?

The ViewResolver enables an application to render models in the browser - ohne die Implementierung an eine bestimmte Ansichtstechnologie zu binden -by mapping view names to actual views.

Weitere Informationen zuViewResolverfinden Sie in unserenGuide to the ViewResolver in Spring MVC.

Q12. Was ist dieBindingResult?

BindingResult is an interface from org.springframework.validation package that represents binding results. We can use it to detect and report errors in the submitted form. Es ist einfach aufzurufen - wir müssen nur sicherstellen, dass wir es direkt nach dem Formularobjekt, das wir validieren, als Parameter einfügen. Der optionale ParameterModel sollte nachBindingResult stehen, wie incustom validator tutorial zu sehen ist:

@PostMapping("/user")
public String submitForm(@Valid NewUserForm newUserForm,
  BindingResult result, Model model) {
    if (result.hasErrors()) {
        return "userHome";
    }
    model.addAttribute("message", "Valid form");
    return "userHome";
}

When Spring sees the @Valid annotation, it’ll first try to find the validator for the object being validated. Anschließend werden die Validierungsanmerkungen abgerufen und der Validator aufgerufen. Schließlich werden gefundene Fehler inBindingResult eingefügt und letztere dem Ansichtsmodell hinzugefügt.

Q13. Was ist ein Formular-Sicherungsobjekt?

The form backing object or a Command Object is just a POJO that collects data from the form we’re submitting.

Wir sollten bedenken, dass es keine Logik enthält, nur Daten.

In unserem Artikel überForms in Spring MVC erfahren Sie, wie Sie ein Formularunterstützungsobjekt mit den Formularen in Spring MVC verwenden.

Q14. Welche Rolle spielt die Annotation von@Qualifier?

It is used simultaneously with the @Autowired annotation to avoid confusion when multiple instances of a bean type are present.

Sehen wir uns ein Beispiel an. Wir haben zwei ähnliche Beans in der XML-Konfiguration deklariert:


    


    

Wenn wir versuchen, die Bohne zu verdrahten, erhalten wirorg.springframework.beans.factory.NoSuchBeanDefinitionException.. Um dies zu beheben, müssen wir@Qualifier verwenden, um Spring mitzuteilen, welche Bohne verdrahtet werden soll:

@Autowired
@Qualifier("person1")
private Person person;

Q15. Welche Rolle spielt die Annotation von@Required?

Die Annotation@Required wird für Setter-Methoden verwendet und gibt an, dass die Bean-Eigenschaft, die diese Annotation enthält, zur Konfigurationszeit ausgefüllt werden muss. Andernfalls löst der Spring-Container eineBeanInitializationException-Ausnahme aus.

Außerdem unterscheidet sich@Required von@Autowired - da es auf einen Setter beschränkt ist, während dies bei@Autowired nicht der Fall ist. @Autowired kann auch zum Verdrahten mit einem Konstruktor und einem Feld verwendet werden, während@Required nur prüft, ob die Eigenschaft festgelegt ist.

Sehen wir uns ein Beispiel an:

public class Person {
    private String name;

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

Jetzt müssen diename derPerson-Bean in der XML-Konfiguration wie folgt festgelegt werden:


    

Bitte beachten Sie, dass@Required doesn’t work with Java based @Configuration classes by default. Wenn Sie sicherstellen müssen, dass alle Ihre Eigenschaften festgelegt sind, können Sie dies tun, wenn Sie die Bean in den mit Anmerkungen versehenen Methoden von@Beanerstellen.

Q16. Beschreiben Sie das Front Controller-Muster

In the Front Controller pattern, all requests will first go to the front controller instead of the servlet. It’ll make sure that the responses are ready and will send them back to the browser. This way we have one place where we control everything that comes from the outside world.

Der Front-Controller identifiziert das Servlet, das die Anfrage zuerst bearbeiten soll. Wenn die Daten vom Servlet zurückerhalten werden, wird entschieden, welche Ansicht gerendert werden soll, und schließlich wird die gerenderte Ansicht als Antwort zurückgesendet:

image

Um die Implementierungsdetails zu sehen, lesen Sie bitte unsereGuide to the Front Controller Pattern in Java.

Q17. Was sind Modell 1- und Modell 2-Architekturen?

Modell 1 und Modell 2 stellen zwei häufig verwendete Entwurfsmodelle für den Entwurf von Java-Webanwendungen dar.

In Model 1, a request comes to a servlet or JSP where it gets handled. Das Servlet oder die JSP verarbeitet die Anforderung, verarbeitet die Geschäftslogik, ruft Daten ab, validiert sie und generiert die Antwort:

image

Da diese Architektur einfach zu implementieren ist, verwenden wir sie normalerweise in kleinen und einfachen Anwendungen.

Auf der anderen Seite ist es für große Webanwendungen nicht praktisch. Die Funktionen werden häufig in JSPs dupliziert, in denen Geschäfts- und Präsentationslogik gekoppelt sind.

Das Modell 2 basiert auf dem Entwurfsmuster des Model View Controllers und trennt die Ansicht von der Logik, die den Inhalt bearbeitet.

Furthermore, we can distinguish three modules in the MVC pattern: the model, the view, and the controller. Das Modell repräsentiert die dynamische Datenstruktur einer Anwendung. Es ist für die Manipulation von Daten und Geschäftslogik verantwortlich. Die Ansicht ist für die Anzeige der Daten zuständig, während der Controller als Schnittstelle zwischen den beiden vorherigen dient.

In Modell 2 wird eine Anforderung an die Steuerung übergeben, die die erforderliche Logik verarbeitet, um den richtigen Inhalt zu erhalten, der angezeigt werden soll. Der Controller stellt den Inhalt dann in der Regel als JavaBean oder POJO wieder in die Anforderung. Sie entscheidet auch, welche Ansicht den Inhalt rendern soll, und leitet die Anforderung schließlich an ihn weiter. Die Ansicht rendert dann die Daten:

image

3. Erweiterte Spring MVC-Fragen

Q18. Was ist der Unterschied zwischen@Controller,@Component,@Repository, und@Service Anmerkungen im Frühjahr?

Gemäß der offiziellen Spring-Dokumentation ist@Component ein generisches Stereotyp für jede von Spring verwaltete Komponente. @Repository,@Service und@Controller sind Spezialisierungen von@Component für spezifischere Anwendungsfälle, z. B. in den Ebenen Persistenz, Service und Präsentation.

Werfen wir einen Blick auf bestimmte Anwendungsfälle der letzten drei:

  • @Controller - Gibt an, dass die Klasse die Rolle eines Controllers übernimmt und@RequestMapping Annotationen innerhalb der Klasse erkennt

  • @Service - Gibt an, dass die Klasse Geschäftslogik enthält und Methoden in der Repository-Schicht aufruft

  • @Repository - gibt an, dass die Klasse ein Datenrepository definiert; Seine Aufgabe ist es, plattformspezifische Ausnahmen abzufangen und sie als eine der einheitlichen ungeprüften Ausnahmen von Spring erneut auszulösen

Q19. Was sindDispatcherServlet undContextLoaderListener?

Einfach ausgedrückt, im Entwurfsmuster des Front Controllers ist ein einzelner Controller dafür verantwortlich, eingehendeHttpRequests an alle anderen Controller und Handler einer Anwendung weiterzuleiten.

DispatcherServletvon Spring implementiert dieses Muster und ist daher dafür verantwortlich, dieHttpRequests korrekt an die rechten Handler zu koordinieren.

Auf der anderen Seite startetContextLoaderListener und schaltet Spring's rootWebApplicationContext ab. Es verknüpft den Lebenszyklus vonApplicationContext mit dem Lebenszyklus vonServletContext.. Wir können ihn verwenden, um gemeinsam genutzte Beans zu definieren, die in verschiedenen Spring-Kontexten arbeiten.

Weitere Informationen zuDispatcherServlet finden Sie unterto this tutorial.

Q20. Was ist einMultipartResolver und wann sollten wir es verwenden?

The MultipartResolver interface is used for uploading files. Das Spring-Framework bietet eineMultipartResolver-Implementierung für die Verwendung mit Commons FileUpload und eine weitere für die Verwendung mit der mehrteiligen Servlet 3.0-Anforderungsanalyse.

Mit diesen können wir das Hochladen von Dateien in unseren Webanwendungen unterstützen.

Q21. Was ist Spring MVC Interceptor und wie wird es verwendet?

Mit Spring MVC Interceptors können wir eine Client-Anfrage abfangen und an drei Stellen verarbeiten - vor der Bearbeitung, nach der Bearbeitung oder nach der Fertigstellung (wenn die Ansicht gerendert wird) einer Anfrage.

Der Interceptor kann für übergreifende Probleme verwendet werden und um zu vermeiden, dass sich wiederholender Handler-Code wie Protokollierung, Ändern global verwendeter Parameter im Spring-Modell usw. verwendet wird.

Einzelheiten und verschiedene Implementierungen finden Sie im Artikel vonIntroduction to Spring MVC HandlerInterceptor.

Q22. Was ist ein Init-Ordner?

A method annotated with @InitBinder is used to customize a request parameter, URI template, and backing/command objects. Wir definieren es in einem Controller und es hilft bei der Steuerung der Anforderung. In this method, we register and configure our custom PropertyEditors, a formatter, and validators.

Die Anmerkung enthält das Element 'value'. Wenn wir es nicht festlegen, werden die mit@InitBinderkommentierten Methoden bei jeder HTTP-Anforderung aufgerufen. Wenn wir den Wert festlegen, werden die Methoden nur für bestimmte Befehls- / Formularattribute und / oder Anforderungsparameter angewendet, deren Namen dem Element 'value' entsprechen.

It’s important to remember that one of the arguments must be WebDataBinder. Andere Argumente können von jedem Typ sein, den Handler-Methoden unterstützen, mit Ausnahme von Befehls- / Formularobjekten und entsprechenden Validierungsergebnisobjekten.

Q23. Erklären Sie einen Controller-Rat

The @ControllerAdvice annotation allows us to write global code applicable to a wide range of controllers. Wir können die Controller-Palette an ein ausgewähltes Paket oder eine bestimmte Anmerkung binden.

Standardmäßig ist@ControllerAdvice applies to the classes annotated with @Controller (or @RestController). Wir haben auch einige Eigenschaften, die wir verwenden, wenn wir spezifischer sein möchten.

If we want to restrict applicable classes to a package, we should add the name of the package to the annotation:

@ControllerAdvice("my.package")
@ControllerAdvice(value = "my.package")
@ControllerAdvice(basePackages = "my.package")

Es ist auch möglich, mehrere Pakete zu verwenden, diesmal müssen wir jedoch ein Array anstelle derString verwenden.

Besides restricting to the package by its name, we can do it by using one of the classes or interfaces from that package:

@ControllerAdvice(basePackageClasses = MyClass.class)

Das Element 'assignableTypes' wendet@ControllerAdvice auf die spezifischen Klassen an, während 'annotations' dies für bestimmte Anmerkungen tut.

It’s noteworthy to remember that we should use it along with @ExceptionHandler. Diese Kombination ermöglicht es uns, einen globalen und spezifischeren Fehlerbehandlungsmechanismus zu konfigurieren, ohne ihn jedes Mal für jede Steuerungsklasse implementieren zu müssen.

Q24. Was macht die Annotation von@ExceptionHandler?

The @ExceptionHandler annotation allows us to define a method that will handle the exceptions. We may use the annotation independently, but it’s a far better option to use it together with the @ControllerAdvice. Somit können wir einen globalen Fehlerbehandlungsmechanismus einrichten. In this way, we don’t need to write the code for the exception handling within every controller.

Schauen wir uns das Beispiel aus unserem Artikel überError Handling for REST with Spring an:

@ControllerAdvice
public class RestResponseEntityExceptionHandler
  extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class,
      IllegalStateException.class })
    protected ResponseEntity handleConflict(RuntimeException ex,
      WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(),
          HttpStatus.CONFLICT, request);
    }
}


Wir sollten auch beachten, dass dies@ExceptionHandler Methoden für alle Controller bereitstellt, dieIllegalArgumentException oderIllegalStateException auslösen. Die mit@ExceptionHandler deklarierten Ausnahmen sollten mit der als Argument der Methode verwendeten Ausnahme übereinstimmen. Andernfalls schlägt der Mechanismus zum Auflösen von Ausnahmen zur Laufzeit fehl.

Hierbei ist zu beachten, dass für dieselbe Ausnahme mehr als ein@ExceptionHandlerdefiniert werden kann. Wir können dies jedoch nicht in derselben Klasse tun, da Spring sich beschweren würde, indem er eine Ausnahme auslöst und beim Start fehlschlägt.

Andererseits istif we define those in two separate classes, the application will start, but it’ll use the first handler it finds, possibly the wrong one.

Q25. Ausnahmebehandlung in Webanwendungen

Wir haben drei Optionen für die Behandlung von Ausnahmen in Spring MVC:

  • pro ausnahme

  • pro Controller

  • global

Wenn während der Webanforderungsverarbeitung eine nicht behandelte Ausnahme ausgelöst wird, gibt der Server eine HTTP 500-Antwort zurück. Um dies zu verhindern,we should annotate any of our custom exceptions with the @ResponseStatus annotation. This kind of exceptions is resolved by HandlerExceptionResolver.

Dies führt dazu, dass der Server eine entsprechende HTTP-Antwort mit dem angegebenen Statuscode zurückgibt, wenn eine Controller-Methode unsere Ausnahme auslöst. Wir sollten bedenken, dass wir unsere Ausnahme nicht woanders behandeln sollten, damit dieser Ansatz funktioniert.

Another way to handle the exceptions is by using the @ExceptionHandler annotation. Wir fügen jedem Controller@ExceptionHandler Methoden hinzu und verwenden sie, um die Ausnahmen zu behandeln, die innerhalb dieses Controllers ausgelöst werden. Diese Methoden können Ausnahmen ohne die Annotation@ResponseStatusbehandeln, den Benutzer zu einer dedizierten Fehleransicht umleiten oder eine vollständig benutzerdefinierte Fehlerantwort erstellen.

Wir können auch die Servlet-bezogenen Objekte (HttpServletRequest,HttpServletResponse,HttpSession undPrincipal) als Parameter der Handler-Methoden übergeben. Wir sollten uns jedoch daran erinnern, dass wir dasModel-Objekt nicht direkt als Parameter verwenden können.

The third option for handling errors is by @ControllerAdvice classes. Auf diese Weise können wir dieselben Techniken anwenden, nur diesmal auf Anwendungsebene und nicht nur auf den jeweiligen Controller. Um dies zu ermöglichen, müssen wir die@ControllerAdvice und die@ExceptionHandler zusammen verwenden. Auf diese Weise behandeln Exception-Handler Exceptions, die von einem Controller ausgelöst werden.

Weitere Informationen zu diesem Thema finden Sie im ArtikelError Handling for REST with Spring.

4. Fazit

In diesem Artikel haben wir einige der Fragen zu Spring MVC untersucht, die beim technischen Interview für Spring-Entwickler auftauchen könnten. Sie sollten diese Fragen als Ausgangspunkt für weitere Recherchen berücksichtigen, da dies keine vollständige Liste ist.

Wir wünschen Ihnen viel Glück bei allen anstehenden Interviews!