Proljetna pitanja za MVC intervju

1. Uvod

Spring MVC izvorni je web okvir iz Springa izgrađen na API-ju Servlet. Pruža arhitekturu Model-View-Controller koja se može koristiti za razvoj fleksibilnih web aplikacija.

U ovom uputstvu usredotočit ćemo se na pitanja u vezi s tim, jer je to često tema proljetnog razgovora za posao programera.

Za više pitanja o Proljetnom okviru možete pogledati još jedan članak u vezi s proljećem naše serije pitanja s intervjua.

2. Osnovna proljetna MVC pitanja

Q1. Zašto bismo trebali koristiti proljetni MVC?

Spring MVC provodi jasno razdvajanje briga što nam omogućuje da lako razvijemo i jedinstveno testiramo svoje aplikacije.

Koncepti poput:

  • Dispečer Servlet
  • Kontroleri
  • Pogledajte razrješivače
  • Pogledi, modeli
  • ModelAndView
  • Atributi modela i sesije

potpuno su neovisni jedni o drugima i odgovorni su samo za jedno.

Stoga, MVC nam pruža prilično veliku fleksibilnost. Temelji se na sučeljima (s predviđenim razredima implementacije), a svaki dio okvira možemo konfigurirati pomoću prilagođenih sučelja.

Druga važna stvar je da nismo vezani uz određenu tehnologiju prikaza (na primjer, JSP), ali imamo mogućnost birati između onih koji nam se najviše sviđaju.

Također, Spring MVC ne koristimo samo u razvoju web aplikacija, već i u stvaranju RESTful web usluga.

Q2. Koja je uloga @Autowired Bilješka?

The @Autowired napomena se može koristiti s poljima ili metodama za ubrizgavanje zrna prema vrsti. Ova bilješka omogućuje Springu da razriješi i ubrizga grah koji surađuje u vaš grah.

Za više detalja, pogledajte tutorial o @Autowired u proljeće.

Q3. Objasnite atribut modela

The @ModelAttribute anotacija je jedna od najvažnijih napomena u proljetnom MVC-u. On veže parametar metode ili povratnu vrijednost metode na imenovani atribut modela, a zatim ga izlaže web prikazu.

Ako ga koristimo na razini metode, to znači da je svrha te metode dodati jedan ili više atributa modela.

S druge strane, kada se koristi kao argument metode, to znači da argument treba dohvatiti iz modela. Ako nije prisutan, prvo bismo ga trebali instancirati, a zatim dodati u model. Jednom prisutni u modelu, trebali bismo popuniti polja argumenata iz svih parametara zahtjeva koji imaju podudarna imena.

Više o ovoj bilješci možete pronaći u našem članku vezanom uz @ModelAttribute bilješka.

Q4. Objasnite razliku između @Controller i @RestController?

Glavna razlika između @Controller i @RestController napomene je to the @ResponseBody napomena se automatski uključuje u @RestController. To znači da ne trebamo bilježiti metode obrađivača s @ResponseBody. Moramo to učiniti u a @Controller klase ako želimo upisati vrstu odgovora izravno u HTTP tijelo odgovora.

P5. Opiši a Promjenjiva putanja

Možemo koristiti @PathVariable napomena kao parametar metode rukovatelja kako bi se izvukla vrijednost varijable URI predloška.

Na primjer, ako želimo dohvatiti korisnika pomoću ID-a iz www.mysite.com/user/123, svoju bismo metodu u upravljaču trebali mapirati kao / user / {id}:

@RequestMapping ("/ user / {id}") javni String handleRequest (@PathVariable ("id") String userId, karta modela) {}

The @PathVariable ima samo jedan imenovani element vrijednost. Nije obavezno i ​​koristimo ga za definiranje naziva varijable predloška URI. Ako izostavimo element vrijednosti, tada se naziv varijable predloška URI mora podudarati s imenom parametra metode.

Dopušteno je i višestruko @PathVariable napomene, bilo deklariranjem jednog za drugim:

@RequestMapping ("/ user / {userId} / name / {userName}") javni niz handleRequest (@PathVariable String userId, @PathVariable String userName, karta modela) {}

ili stavljajući ih sve u Karta ili MultiValueMap:

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

P6. Provjera valjanosti pomoću Spring MVC-a

Opruga MVC prema zadanim postavkama podržava specifikacije JSR-303. Moramo dodati JSR-303 i njegove ovisnosti o implementaciji u našu Spring MVC aplikaciju. Hibernate Validator, na primjer, jedna je od implementacija JSR-303 koja nam stoji na raspolaganju.

JSR-303 je specifikacija Java API-ja za provjeru graha, dio Jakarta EE i JavaSE, koji osigurava da svojstva graha zadovoljavaju određene kriterije, koristeći bilješke kao što su @NotNull, @ Min, i @Max. Više o provjeri valjanosti dostupno je u članku Osnove provjere valjanosti Java Bean-a.

Proljeće nudi @Validator bilješka i BindingResult razred. The Provjerivač implementacija će dovesti do pogrešaka u metodi obrade zahtjeva kontrolora kada imamo nevaljane podatke. Tada možemo koristiti BindingResult klase da biste dobili te pogreške.

Osim korištenja postojećih implementacija, možemo izraditi i vlastite. Da bismo to učinili, najprije izrađujemo napomenu koja je u skladu sa specifikacijama JSR-303. Zatim implementiramo Provjerivač razred. Drugi način bio bi provođenje Spring-a Provjerivač sučelje i postavite ga kao validator putem @InitBinder bilješka u Kontroler razred.

Da biste provjerili kako implementirati i koristiti vlastite provjere valjanosti, pogledajte vodič o prilagođenoj provjeri valjanosti u proljetnom MVC-u.

P7. Što su @RequestBody i @ResponseBody?

The @RequestBody napomena, koja se koristi kao parametar metode rukovatelja, veže tijelo HTTP zahtjeva za prijenos ili objekt domene. Spring automatski deserijalizira dolazni HTTP zahtjev Java objektu pomoću pretvarača poruka Http.

Kada koristimo @ResponseBody napomena o metodi rukovatelja u proljetnom MVC kontroleru, to znači da ćemo tip povratne metode napisati izravno u tijelo HTTP odgovora. Nećemo ga staviti u Model, a Spring neće protumačiti kao naziv pogleda.

Molimo pogledajte članak na @RequestBody i @ResponseBody da biste vidjeli više pojedinosti o tim bilješkama.

P8. Objasniti Model, ModelMap i ModelAndView?

The Model sučelje definira držač za atribute modela. The ModelMap ima sličnu svrhu, s mogućnošću prenošenja zbirke vrijednosti. Tada te vrijednosti tretira kao da su unutar a Karta. To bismo trebali primijetiti u Model (ModelMap) možemo pohranjivati ​​samo podatke. Unosimo podatke i vraćamo ime prikaza.

S druge strane, s ModelAndView, vraćamo sam objekt. Sve potrebne podatke, poput podataka i imena pogleda, postavljamo u objekt koji vraćamo.

Više detalja možete pronaći u članku na Model, ModelMap, i ModelView.

P9. Objasniti Atributi sesije i SessionAttribute

The @SessionAttributes napomena se koristi za spremanje atributa modela u korisničkoj sesiji. Koristimo ga na razini klase kontrolera, kao što je prikazano u našem članku o atributima sesije u proljetnom MVC-u:

@Controller @RequestMapping ("/ sessionattributes") @SessionAttributes ("todos") javna klasa TodoControllerWithSessionAttributes {@GetMapping ("/ form") javni String showForm (Model model, @ModelAttribute ("todos") TodoList tododistos) TodoList tododistos povratak tijela "sessionattributesform"; } // ostale metode}

U prethodnom primjeru atribut modela ‘todos'Bit će dodan sesiji ako @ModelAttribute i @SessionAttributes imaju isti atribut imena.

Ako želimo dohvatiti postojeći atribut iz sesije kojom se globalno upravlja, koristit ćemo @SessionAttribute napomena kao parametar metode:

@GetMapping javni niz getTodos (@SessionAttribute ("todos") TodoList todos) {// povratak tijela metode "todoView"; }

Q10. Čemu služi @EnableWebMVC?

The @EnableWebMvc Svrha napomene je omogućiti Spring MVC putem Java konfiguracije. To je ekvivalentno u XML konfiguraciji. Ova napomena uvozi Spring MVC Configuration iz WebMvcConfigurationSupport. Omogućuje podršku za @Controller-anotirane klase koje koriste @RequestMapping za mapiranje dolaznih zahtjeva u metodu rukovatelja.

O ovom i sličnim bilješkama možete saznati više u našem Vodiču za proljeće @Omogućiti Bilješke.

Q11. Što je ViewResolver u proljeće?

The ViewResolver omogućuje aplikaciji da generira modele u pregledniku - bez vezivanja implementacije za određenu tehnologiju prikaza - preslikavanjem imena pogleda u stvarne poglede.

Za više detalja o ViewResolver, pogledajte naš vodič za ViewResolver u proljetnom MVC-u.

Q12. Što je BindingResult?

BindingResult je sučelje od org.springframework.valifikacija paket koji predstavlja rezultate vezanja. Pomoću nje možemo otkriti i prijaviti pogreške u podnesenom obrascu. Jednostavno je pozvati se - samo trebamo osigurati da ga stavimo kao parametar odmah nakon objekta obrasca koji provjeravamo. Neobvezno Model parametar bi trebao doći nakon BindingResult, kao što se može vidjeti u vodiču prilagođenog validatora:

@PostMapping ("/ user") javni niz submitForm (@Valid NewUserForm newUserForm, rezultat BindingResult, model modela) {if (result.hasErrors ()) {return "userHome"; } model.addAttribute ("poruka", "Važeći obrazac"); vratiti "userHome"; }

Kad proljeće ugleda @Valid napomena, prvo će pokušati pronaći validator za objekt koji se provjerava. Tada će pokupiti bilješke o provjeri i pozvati validator. Napokon, stavit će pronađene pogreške u BindingResult i dodajte ovo drugo modelu prikaza.

Q13. Što je objekt koji podupire obrazac?

Objekt koji podupire obrazac ili naredbeni objekt samo je POJO koji prikuplja podatke iz obrasca koji šaljemo.

Morali bismo imati na umu da ne sadrži nikakvu logiku, već samo podatke.

Da biste naučili kako koristiti objekt za podlogu obrazaca s obrascima u Spring MVC, pogledajte naš članak o Obrascima u Spring MVC.

P14. Koja je uloga @Kvalifikator Bilješka?

Koristi se istodobno s @Autowired napomena kako bi se izbjegla zabuna kada je prisutno više primjeraka graha.

Pogledajmo primjer. Deklarirali smo dva slična graha u XML config:

Kad pokušamo povezati grah, dobit ćemo org.springframework.beans.factory.NoSuchBeanDefinitionException. Da bismo to popravili, moramo koristiti @Kvalifikator reći Springu o tome koji grah treba ožičiti:

@Autowired @Qualifier ("person1") privatna osoba;

P15. Koja je uloga @Potreban Bilješka?

The @Potreban napomena se koristi na metodama postavljača i označava da svojstvo graha koje ima ovu napomenu mora biti popunjeno u vrijeme konfiguracije. U suprotnom, proljetni spremnik će baciti a BeanInitializationException iznimka.

Također, @Potreban razlikuje se od @Autowired - budući da je ograničen na postavljača, dok @Autowired nije. @Autowired može se koristiti i za povezivanje s konstruktorom i poljem, dok @Potreban samo provjerava je li svojstvo postavljeno.

Pogledajmo primjer:

javni razred Osoba {ime privatnog niza; @Required public void setName (Ime niza) {this.name = name; }}

Sada, Ime od Osoba bean treba postaviti u XML config ovako:

Imajte na umu da @Potreban ne radi s Javom @Konfiguracija klase prema zadanim postavkama. Ako trebate biti sigurni da su postavljena sva vaša svojstva, to možete učiniti kad u grafu kreirate grah @Grah anotirane metode.

Q16. Opišite obrazac prednjeg kontrolera

U obrascu prednjeg upravljača, svi zahtjevi prvo će ići na prednji upravljač umjesto na servlet. Osigurat će da su odgovori spremni i vratit će ih natrag u preglednik. Na ovaj način imamo jedno mjesto na kojem kontroliramo sve što dolazi iz vanjskog svijeta.

Prednji kontroler identificirat će servlet koji bi trebao prvo obraditi zahtjev. Zatim, kada dobije podatke natrag iz servleta, odlučit će koji će prikaz prikazati i, napokon, vratit će prikazani prikaz natrag kao odgovor:

Da biste vidjeli detalje o implementaciji, pogledajte naš Vodič za obrazac prednjeg upravljača na Javi.

Q17. Što su arhitekture modela 1 i modela 2?

Model 1 i Model 2 predstavljaju dva često korištena dizajnerska modela kada je riječ o dizajniranju Java web aplikacija.

U modelu 1 zahtjev dolazi do servleta ili JSP-a gdje se njime obrađuje. Servlet ili JSP obrađuje zahtjev, obrađuje poslovnu logiku, dohvaća i provjerava podatke i generira odgovor:

Budući da je ovu arhitekturu jednostavno implementirati, obično je koristimo u malim i jednostavnim aplikacijama.

S druge strane, nije prikladan za velike web aplikacije. Funkcionalnosti se često dupliciraju u JSP-ovima gdje su poslovna i prezentacijska logika povezane.

Model 2 zasnovan je na uzorku dizajna upravljača modela prikaza i on odvaja pogled od logike koja manipulira sadržajem.

Nadalje, u MVC uzorku možemo razlikovati tri modula: model, pogled i kontroler. Model predstavlja dinamičku strukturu podataka aplikacije. Odgovorna je za manipulaciju podacima i poslovnom logikom. Pogled je zadužen za prikaz podataka, dok kontroler služi kao sučelje između prethodna dva.

U modelu 2 zahtjev se prosljeđuje kontroloru koji obrađuje potrebnu logiku kako bi dobio pravi sadržaj koji bi trebao biti prikazan. Kontrolor zatim vraća sadržaj natrag u zahtjev, obično kao JavaBean ili POJO. Također odlučuje koji prikaz treba prikazati sadržaj i konačno mu prosljeđuje zahtjev. Zatim prikaz prikazuje podatke:

3. Napredna proljetna MVC pitanja

Q18. Koja je razlika između @Controller, @Komponenta, @ Repozitorij, i @Servis Bilješke u proljeće?

Prema službenoj proljetnoj dokumentaciji, @Komponenta je generički stereotip za bilo koju komponentu kojom upravlja proljeće. @ Repozitorij, @Servis, i @Controller su specijalizacije za @Komponenta za specifičnije slučajeve upotrebe, na primjer u postojanosti, usluzi i slojevima prezentacije.

Pogledajmo konkretne slučajeve uporabe posljednja tri:

  • @Kontroler - označava da klasa služi kao kontrolor i otkriva @RequestMapping napomene unutar razreda
  • @Servis - označava da klasa sadrži poslovnu logiku i poziva metode u sloju spremišta
  • @Spremište - označava da klasa definira spremište podataka; njegov je posao uhvatiti iznimke specifične za platformu i ponovno ih baciti kao jednu od proljetnih objedinjenih neprovjerenih iznimki

Q19. Što su DispatcherServlet i ContextLoaderListener?

Jednostavno rečeno, u uzorku dizajna prednjeg upravljača, jedan je upravljač odgovoran za usmjeravanje dolaznih HttpRequests svim ostalim kontrolorima i voditeljima aplikacije.

Spring's DispatcherServlet provodi ovaj obrazac i stoga je odgovoran za ispravnu koordinaciju HttpRequests pravim voditeljima.

S druge strane, ContextLoaderListener pokreće se i isključuje Springov korijen WebApplicationContext. Povezuje životni ciklus ApplicationContext životnom ciklusu ServletContext. Pomoću njega možemo definirati zajednički grah koji radi u različitim kontekstima Proljeća.

Za više detalja o DispatcherServlet, pogledajte ovaj vodič.

Q20. Što je a MultipartResolver i kada bismo ga trebali koristiti?

The MultipartResolver sučelje se koristi za prijenos datoteka. Proljetni okvir pruža jedan MultipartResolver implementacija za upotrebu s Commons FileUpload i druga za upotrebu s raščlanjivanjem višedijelnih zahtjeva Servlet 3.0.

Pomoću njih možemo podržati prijenos datoteka u našim web aplikacijama.

Q21. Što je proljetni MVC presretač i kako ga koristiti?

Proljetni MVC presretači omogućuju nam da presretnemo zahtjev klijenta i obradimo ga na tri mjesta - prije rukovanja, nakon rukovanja ili nakon završetka (kada je prikaz izveden) zahtjeva.

Presretač se može koristiti za međusobne brige i za izbjegavanje ponavljajućih kodova rukovatelja poput bilježenja, promjene globalno korištenih parametara u Spring modelu itd.

Za detalje i razne implementacije pogledajte članak Uvod u Spring MVC HandlerInterceptor.

Q22. Što je Init vezivo?

Metoda označena s @InitBinder koristi se za prilagodbu parametra zahtjeva, URI predloška i sigurnosnih / naredbenih objekata. Definiramo ga u kontroloru i pomaže u kontroli zahtjeva. Ovom metodom registriramo i konfiguriramo svoj običaj PropertyEditors, program za oblikovanje i validatore.

Napomena ima "vrijednost‘Element. Ako ga ne postavimo, @InitBinder anotirane metode bit će pozvane na svakom HTTP zahtjevu. Ako postavimo vrijednost, metode će se primijeniti samo za određene atribute naredbe / obrasca i / ili parametre zahtjeva čija imena odgovaraju oznaci 'vrijednost‘Element.

Važno je zapamtiti da jedan od argumenata mora biti WebDataBinder. Ostali argumenti mogu biti bilo koje vrste koje metode rukovatelja podržavaju, osim za objekte naredbe / obrasca i odgovarajuće objekte rezultata provjere valjanosti.

Q23. Objasnite savjet za kontrolore

The @ControllerAdvice anotacija nam omogućuje pisanje globalnog koda primjenjivog na širok raspon kontrolera. Raspon kontrolera možemo povezati s odabranim paketom ili određenom napomenom.

Prema zadanim postavkama, @ControllerAdvice odnosi se na klase označene s @Controller (ili @RestController). Također imamo nekoliko svojstava koja koristimo ako želimo biti konkretniji.

Ako želimo ograničiti primjenjive klase na paket, u bilješku bismo trebali dodati naziv paketa:

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

Također je moguće koristiti više paketa, ali ovaj put trebamo koristiti niz umjesto Niz.

Osim što se ograničavamo na paket imenom, to možemo učiniti i upotrebom jedne od klasa ili sučelja iz tog paketa:

@ControllerAdvice (basePackageClasses = MyClass.class)

"assignableTypes'Element primjenjuje @ControllerAdvice na određene razrede, dokbilješke'Radi za određene bilješke.

Vrijedno je zapamtiti da bismo ga trebali koristiti zajedno s @ExceptionHandler. Ova kombinacija omogućit će nam da konfiguriramo globalni i specifičniji mehanizam za rukovanje pogreškama bez potrebe da ga implementiramo svaki put za svaku klasu kontrolera.

Q24. Što to @ExceptionHandler Bilješka Do?

The @ExceptionHandler anotacija nam omogućuje definiranje metode koja će se nositi s iznimkama. Bilješku možemo koristiti samostalno, ali daleko je bolja opcija da je koristimo zajedno s oznakom @ControllerAdvice. Dakle, možemo postaviti globalni mehanizam za rukovanje pogreškama. Na taj način, ne trebamo pisati kôd za rukovanje iznimkama unutar svakog kontrolera.

Pogledajmo primjer iz našeg članka o postupanju s pogreškama za REST s Springom:

@ControllerAdvice javna klasa RestResponseEntityExceptionHandler proširuje ResponseEntityExceptionHandler {@ExceptionHandler (value = {IllegalArgumentException.class, IllegalStateException.class}) zaštićen ResponseEntition RuleConfenceTextEntityTextEntityExceptionTextEnticeTextEntityExceptionTextConfenceTextEntityException return handleExceptionInternal (ex, bodyOfResponse, novi HttpHeaders (), HttpStatus.CONFLICT, zahtjev); }}

Također bismo trebali napomenuti da će to pružiti @ExceptionHandler metode svim kontrolerima koji bacaju IlegalArgumentException ili IllegalStateException. Iznimke deklarirane sa @ExceptionHandler treba odgovarati iznimci koja se koristi kao argument metode. Inače, mehanizam za rješavanje iznimki neće uspjeti tijekom izvođenja.

Ovdje treba imati na umu da je moguće definirati više njih @ExceptionHandler za istu iznimku. Ne možemo to učiniti u istoj klasi, jer bi se Spring žalio bacajući iznimku i neuspješno prilikom pokretanja.

S druge strane, ako definiramo one u dvije odvojene klase, aplikacija će se pokrenuti, ali upotrijebit će prvi pronađeni rukovatelj, možda pogrešan.

Q25. Rukovanje iznimkama u web aplikacijama

Imamo tri mogućnosti za rukovanje iznimkama u Spring MVC-u:

  • po iznimci
  • po kontroloru
  • globalno

Ako se tijekom obrade web zahtjeva izbaci neobrađena iznimka, poslužitelj će vratiti HTTP 500 odgovor. Da biste to spriječili, trebali bismo napomenuti bilo koji od naših prilagođenih izuzetaka s @ResponseStatus bilješka. Ovu vrstu iznimki rješava HandlerExceptionResolver.

To će uzrokovati da poslužitelj vrati odgovarajući HTTP odgovor s navedenim statusnim kodom kada metoda kontrolera izbaci našu iznimku. Trebali bismo imati na umu da ne bismo trebali postupati s našom iznimkom negdje drugdje da bi takav pristup funkcionirao.

Drugi način rješavanja iznimaka je pomoću @ExceptionHandler bilješka. Mi dodajemo @ExceptionHandler metode bilo kojem kontroloru i koriste ih za rukovanje iznimkama izbačenim iz tog kontrolera. Te se metode mogu nositi s iznimkama bez @ResponseStatus napomena, preusmjerite korisnika na namjenski prikaz pogreške ili izradite potpuno prilagođeni odgovor na pogrešku.

Također možemo ući u objekte povezane sa servletima (HttpServletRequest, HttpServletResponse, HttpSession, i Glavni) kao parametri metoda rukovatelja. Ali, trebali bismo se sjetiti da ne možemo staviti Model objekt kao parametar izravno.

Treća opcija za rukovanje pogreškama je @ControllerAdvice razreda. Omogućit će nam primjenu istih tehnika, samo ovaj put na razini aplikacije, a ne samo na određeni kontroler. Da bismo to omogućili, moramo koristiti @ControllerAdvice i @ExceptionHandler zajedno. Na taj će se način obrađivači iznimki baviti iznimkama koje je bacio bilo koji kontroler.

Za detaljnije informacije o ovoj temi pročitajte članak Rukovanje pogreškama za REST s proljetnim člankom.

4. Zaključak

U ovom smo članku istražili neka pitanja vezana uz Spring MVC koja bi se mogla pojaviti na tehničkom razgovoru za programere Springa. Ova biste pitanja trebali uzeti u obzir kao polazište za daljnja istraživanja, jer ovo nipošto nije iscrpan popis.

Želimo vam puno sreće u bilo kojim nadolazećim intervjuima!