Kratki vodič za opružne kontrolere

1. Uvod

U ovom ćemo se članku usredotočiti na temeljni koncept Spring MVC - Controllers.

2. Pregled

Krenimo od koraka unatrag i pogleda koncept Prednji kontroler u tipično Proljeće Model View Controller arhitektura.

Na vrlo visokoj razini, evo glavnih odgovornosti koje promatramo:

  • Presreće dolazne zahtjeve
  • Pretvara korisni teret zahtjeva u unutarnju strukturu podataka
  • Podaci šalje na Model za daljnju obradu
  • Dobiva obrađene podatke iz Model i prosljeđuje te podatke na Pogled za prikazivanje

Evo kratkog dijagrama za protok visoke razine u Proljetni MVC:

Kao što vidite, DispatcherServlet igra ulogu Prednji kontroler u arhitekturi.

Dijagram je primjenjiv kako na tipične MVC kontrolere, tako i na RESTful kontrolere - s nekim malim razlikama (opisanim u nastavku).

U tradicionalnom pristupu, MVC aplikacije nisu orijentirane na uslugu stoga postoji View Razrješivač koji daje konačne prikaze na temelju podataka dobivenih od Kontroler.

Miran aplikacije su dizajnirane da budu orijentirane na usluge i vraćaju neobrađene podatke (obično JSON / XML). Budući da ove aplikacije ne vrše prikaz prikaza, nema ih Pogledajte razrješivače - the Kontroler obično se očekuje da podatke šalje izravno putem HTTP odgovora.

Počnimo s kontrolerima u stilu MVC0.

3. Ovisnosti Mavena

Da bih mogao raditi s Proljetni MVC, prvo se pozabavimo Mavenovim ovisnostima:

 org.springframework spring-webmvc 5.0.6.OBUSTAVLJANJE 

Da biste dobili najnoviju verziju knjižnice, pogledajte spring-webmvc na Maven Central.

4. Projekt Web Config

Prije nego što pogledamo same kontrolere, prvo moramo postaviti jednostavan web projekt i to brzo Servlet konfiguracija.

Pogledajmo prvo kako DispatcherServlet može se postaviti bez upotrebe web.xml - ali umjesto toga koristite inicijalizator:

javna klasa StudentControllerConfig implementira WebApplicationInitializer {@Override public void onStartup (ServletContext sc) baca ServletException {AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext (); root.register (WebConfig.class); root.refresh (); root.setServletContext (sc); sc.addListener (novi ContextLoaderListener (korijen)); DispatcherServlet dv = novi DispatcherServlet (novi GenericWebApplicationContext ()); ServletRegistration.Dynamic appServlet = sc.addServlet ("test-mvc", dv); appServlet.setLoadOnStartup (1); appServlet.addMapping ("/ test / *"); }}

Svakako postavite stvari bez XML-a servlet-api 3.1.0 na putu do predavanja.

Evo kako web.xml izgledalo bi kao:

 test-mvc org.springframework.web.servlet.DispatcherServlet 1 contextConfigLocation /WEB-INF/test-mvc.xml 

Postavljamo contextConfigLocation svojstvo ovdje - pokazuje na XML datoteka koja se koristi za učitavanje konteksta Spring. Ako svojstvo nije tamo, Spring će potražiti datoteku s imenom {ime_servleta} -servlet.xml.

U našem slučaju ime_servleta je test-mvc i tako, u ovom primjeru DispatcherServlet tražio bi datoteku pod nazivom test-mvc-servlet.xml.

Napokon, postavimo DispatcherServlet i mapirati ga na određenu URL - dovršiti naš Prednji kontroler ovdje zasnovan sustav:

 test-mvc / test / * 

Tako je u ovom slučaju DispatcherServlet presrela bi sve zahtjeve unutar uzorka /test/* .

5. Spring MVC Web Config

Pogledajmo sada kako Dispečer Servlet može se postaviti pomoću Spring Config:

@Configuration @EnableWebMvc @ComponentScan (basePackages = {"com.baeldung.controller.controller", "com.baeldung.controller.config"}) javna klasa WebConfig implementira WebMvcConfigurer {@Override public void configureDefaultConfigurerHavnerHavnerHandConfurrHaver (); } @Bean public ViewResolver viewResolver () {InternalResourceViewResolver bean = new InternalResourceViewResolver (); bean.setPrefix ("/ WEB-INF /"); bean.setSuffix (". jsp"); grah za povratak; }}

Pogledajmo sada postavljanje Dispečer Servlet koristeći XML . Snimka DispatcherServlet XML datoteka - XML datoteku koju DispatcherServlet koristi za učitavanje prilagođenih kontroleri i druge Proljećeentiteta prikazano je dolje:

    / WEB-INF / .jsp 

Na temelju ove jednostavne konfiguracije, okvir će naravno inicijalizirati bilo koji grah kontrolera koji će se naći na putu puta.

Primijetite da definiramo i View Resolver, odgovoran za prikazivanje pogleda - koristit ćemo Springov InternalResourceViewResolver ovdje. Ovo očekuje ime a pogled koje treba riješiti, što znači pronalaženje odgovarajuće stranice pomoću prefiksa i sufiksa (obje definirane u XML konfiguracija).

Tako na primjer ako Kontroler vraća a pogled nazvan “Dobrodošli", the pogledrazrješivač pokušat će riješiti stranicu pod nazivom "Dobrodošli.jsp" u WEB-INF mapu.

6. MVC kontroler

Ajmo sada napokon implementirati kontroler stila MVC.

Primijetite kako vraćamo a ModelAndView objekt - koji sadrži a model karte i a pogled objekta; obje će koristiti View Razrješivač za prikaz podataka:

@Controller @RequestMapping (value = "/ test") javna klasa TestController {@GetMapping public ModelAndView getTestData () {ModelAndView mv = new ModelAndView (); mv.setViewName ("dobrodošli"); mv.getModel (). put ("podaci", "Dobrodošao kući čovječe"); povratak mv; }}

Pa, što smo točno postavili ovdje.

Prvo smo stvorili kontroler koji se zove TestController i preslikao ga na "/test" staza. U klasi smo stvorili metodu koja vraća a ModelAndView objekt i preslikava se u DOBITI zatražite tako bilo koji URL poziv koji se završava s „test”Preusmjerio bi DispatcherServlet prema getTestData metoda u TestController.

I naravno vraćamo ModelAndView objekt s nekim podacima o modelu za dobru mjeru.

Objekt pogleda ima naziv postavljen na "Dobrodošli“. Kao što je gore spomenuto, Pogledajte rješenje potražit će stranicu u WEB-INF mapa pod nazivom "dobrodošli.jsp“.

Ispod možete vidjeti rezultat primjera DOBITI operacija:

Imajte na umu da URL završava sa "test". Uzorak URL je “/ Test / test“.

Prvi "/test" dolazi iz Servleta, a drugi dolazi iz mapiranja kontrolera.

7. Više proljetnih ovisnosti za REST

Počnimo sada gledati RESTful kontroler. Naravno, dobro mjesto za početak su dodatne Mavenove ovisnosti koje su nam potrebne za to:

  org.springframework spring-webmvc 5.0.6.RELEASE org.springframework spring-web 5.0.6.RELEASE com.fasterxml.jackson.core jackson-databind 2.9.5 

Pogledajte najnovije verzije tih ovisnosti na veze jackson-core, spring-webmvc i spring-web.

Jackson ovdje naravno nije obvezan, ali svakako je dobar način za omogućavanje JSON podrške. Ako ste zainteresirani zaroniti dublje u tu podršku, pogledajte članak o pretvaračima poruka ovdje.

8. REST kontroler

Postavljanje za Proljeće ODMORNO aplikacija je ista kao i aplikacija za MVC aplikacija s jedinom razlikom što nema View Razrješivači i ne model karte.

API će klijentu obično jednostavno vratiti sirove podatke - XML i JSON reprezentacije obično - pa tako i DispatcherServlet zaobilazi pregled rješavača i vraća podatke pravo u tijelo odgovora HTTP.

Pogledajmo jednostavnu implementaciju kontrolera RESTful:

@Controller javna klasa RestController {@GetMapping (value = "/ student / {studentId}") public @ResponseBody Student getTestData (@PathVariable Integer studentId) {Student student = new Student (); student.setName ("Petar"); student.setId (studentId); povratak student; }}

Napomena @ResponseBody napomena o metodi - koja nalaže Springu da zaobiđe pogled razrješivač i u osnovi zapišite izlaz direktno u tijelo HTTP odgovora.

Kratka snimka rezultata prikazana je u nastavku:

Gornji izlaz rezultat je slanja datoteke DOBITI zahtjev API-ju sa studentom iskaznica od 1.

Jedna kratka napomena ovdje je - @RequestMapping anotacija je jedna od onih središnjih bilješki koju ćete zaista morati istražiti kako biste je iskoristili u potpunosti.

9. Spring Boot i @RestController Bilješka

The @RestController napomena iz Spring Boota u osnovi je brzi prečac koji nas spašava da uvijek moramo definirati @ResponseBody.

Evo prethodnog primjera kontrolera koji koristi ovu novu napomenu:

@RestController javna klasa RestAnnotatedController {@GetMapping (value = "/ annotated / student / {studentId}") public Student getData (@PathVariable Integer studentId) {Student student = new Student (); student.setName ("Petar"); student.setId (studentId); povratak student; }}

10. Zaključak

U ovom vodiču istražujemo osnove korištenja kontrolera u proljeće, kako s gledišta tipične MVC aplikacije, tako i RESTful API-ja.

Naravno, sav kôd u članku dostupan je na GitHubu.