Işleýji usullar

All lectures for TK purposes
Dereje , Sapak
Elýeterli

@RequestMapping deprekler bilen işlemek üçin usullaryň çeýe dizaýny bar we dolandyryjy usulynyň goldanýan argümentlerinden we yzyna berilýän bahalaryndan saýlap bilerler.

Usulyň argumentleri

Aşakdaky tablisada dolandyryjynyň usulynyň goldanýan argumentleri beýan edilýär. Reaktiw görnüşler hiç bir argumente goldaw berilmeýär.

java.util.Optional JDK 8-den, required atributy bolan belliklerle bilelikde, usulyň argumenti hökmünde goldanýar (meselem, @RequestParam, @RequestHeader we beýlekiler) we required=false bilen deňdir.

Dolandyryjy usulyň argumenti Beýannama

WebRequest, NativeWebRequest

Talap parametrlerine we sessiýanyň atributlaryna taýyn görnüşde girmäge mümkinçilik berýär, Servlet API göni ulanylmazdan.

javax.servlet.ServletRequest, javax.servlet.ServletResponse

Islendik belli bir talapyň ýa-da jogabynyň görnüşini saýlamak üçin niýetlenendir – meselem, ServletRequest, HttpServletRequest ýa-da MultipartRequest, Spring-den MultipartHttpServletRequest.

javax.servlet.http.HttpSession

Sessiýanyň bolmagyny üpjün edýär. Şeýlelikde, beýle argument hiç haçan null bolup bilmez. Sessiýa girmegiň togtadyjylyksyz däldigine üns beriň. Birnäçe talaplaryň sessiýa bir wagtda girmegine rugsat berilýärse, RequestMappingHandlerAdapter nusgasynyň synchronizeOnSession flagyny true ýagdaýyna goýmagy göz öňünde tutuň.

javax.servlet.http.PushBuilder

Servlet 4.0-da HTTP/2 resurslaryny itermek üçin itekleýän gurluş guralynyň API-y. Servlet spesifikasiýasyna görä, girizilen PushBuilder nusgasy hiç hili funksiýa goldaw berilmeýän müşderi bilen boş bolup biler.

java.security.Principal

Şu wagtky autentifikasiýalanan ulanyjy – belli bolsa, Principal realizasiýasynyň belli bir klassy bolup biler.

Bu argument kesgitli tanalýanok, egerde bir kiçi tanlaýjy ony anyk tanamak üçin ulanylsa, soňra HttpServletRequest#getUserPrincipal arkaly deslapky tanlamana gaýtarylar. Mysal üçin, Spring Security-dan Authentication Principal-y realizasiýa we HttpServletRequest#getUserPrincipal arkaly şeýle gurnalar, eger-de @AuthenticationPrincipal bilen bellik edilmedik bolsa, başga ýagdaýda Spring Security-nyň kastom tanlaýjysy arkaly Authentication#getPrincipal arkaly çözüler.

HttpMethod

Talapyň HTTP usuly.

java.util.Locale

Talapyň häzirki lokal konfigurasiýasy, iň anyk elýeterli LocaleResolver bilen kesgitlenýär (aslynda, konfigurasiýa edilen LocaleResolver ýa-da LocaleContextResolver).

java.util.TimeZone + java.time.ZoneId

Talap bilen baglanyşykly wagt zolaklary, LocaleContextResolver tarapyndan kesgitlenýär.

java.io.InputStream, java.io.Reader

Servlet API-da görkezilýän talapyň çig bedenine girmegi üpjün etmek üçin niýetlenendir.

java.io.OutputStream, java.io.Writer

Servlet API-da açyk bolan jogapyň çig bedenine girmegi üpjün etmek üçin niýetlenendir.

@PathVariable

URI identifikatorynyň şablon üýtgeýänlerine girmegi üpjün etmek üçin niýetlenendir.

@MatrixVariable

URI identifikatorlarynyň ýoly segmentlerinde "ad-soň" toparlaryna girmegi üpjün etmek üçin niýetlenendir.

@RequestParam

Servlet talap parametrlerine girmegi üpjün etmek üçin niýetlenendir, köp sahypaly faýllaryň goşuldygy ýaly. Parametrleriň bahalary usulyň argumentleriniň görkezilen görnüşine öwrülýär.

Adaty parametr bahalary üçin @RequestParam annotasiýasynyň ulanylmagy şert däl. Bu tablisaň ahyryndaky "Haýsy-da bolsa başga bir argument" bölümine serediň.

@RequestHeader

Talap başlyklaryna girmegi üpjün etmek üçin niýetlenendir. Başlyk bahalary usulyň görkezilen argument görnüşine öwrülýär.

@CookieValue

Cookie bahalaryna girmegi üpjün etmek üçin niýetlenendir. Cookie bahalary usulyň görkezilen argument görnüşine öwrülýär.

@RequestBody

HTTP talap bedeni girmegi üpjün etmek üçin niýetlenendir. Beden mazmuny HttpMessageConverter realizasiýalary arkaly usulyň görkezilen argument görnüşine öwrülýär.

HttpEntity<B>

Başlyklar we talap bedeni girmegi üpjün etmek üçin niýetlenendir. Beden HttpMessageConverter arkaly öwrülýär.

@RequestPart

Köp bölek/form-data görnüşindäki talapyň bir elementi girmegi üpjün etmek we şol bölümiň bedeni HttpMessageConverter arkaly öwrülmegini üpjün etmek üçin niýetlenendir.

java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap

HTML dolandyryjyda ulanylýan we görkezijiniň wizualizasiýasynyň bir bölegi hökmünde şablonlarda görkezilen modele girmegi üpjün etmek üçin niýetlenendir.

RedirectAttributes

Gönükdirme ýagdaýynda ulanylýan atributlary kesgitleýär (meselem, sorag setirine goşulýar), gönükdirme talabyň gelendiginde wagtlaýyn saklanjak flash atributlar.

@ModelAttribute

Modelde bar bolan bir attribute girmegi üpjün etmek üçin niýetlenendir (onuň nusgasy ýok bolsa döredilýär), maglumat birleşdirmegi we barlagy bilen bilelikde.

Üns beriň, @ModelAttribute annotasiýasynyň ulanylmagy hökman däl (meselem, attributlaryny bellemek üçin). Bu tablisaň ahyryndaky "Haýsy-da bolsa başga bir argument" bölümine serediň.

Errors, BindingResult

Komanda obýektiňin (meselem, @ModelAttribute bilen bellik edilen argument) ýa-da @RequestBody ýa-da @RequestPart annotasiýalary bilen barlanylan argumentleriň näsazlyklarynyň barlaglaryň näsazlyklaryna girmegi üpjün etmek üçin niýetlenendir. Errors ýa-da BindingResult argumenti derrew barlaglanan usulyň argumenti bilen bilelikde bellemek zerurdyr.

SessionStatus + class-level @SessionAttributes

Formanyň işlenip gutaranlygyny bellik etmek üçin niýetlenendir, bu @SessionAttributes annotasiýasy bilen klass derejesinde bellik edilen sessiýa atributlaryny arassalamagy döredýär.

UriComponentsBuilder

Talapyň häzirki haýsyda, ulgamy, kontekst ýoly bilen baglanyşykly URL taýýarlamak we servletiň wizualizasiýasynyň göni komponenti üçin niýetlenendir.

@SessionAttribute

Başgaça @SessionAttributes annotasiýasy arkaly klass derejesinde bellik edilen modelleriň atributlarynyň üstüni ýetirmek üçin niýetlenendir.

@RequestAttribute

Talap atributyna girmegi üpjün etmek üçin niýetlenendir.

Haýsy-da bolsa başga bir argument

Eger usulyň argumenti ýokardaky bahalaryň hiç birine laýyk gelmeýän bolsa we BeanUtils#isSimpleProperty tarapyndan kesgitlenişi ýaly ýönekeý görnüş bolsa, ol @RequestParam hökmünde çözülýär. Başgaça, @ModelAttribute hökmünde çözülýär.

Yzyna berilýän bahalar

Aşakdaky tablisada dolandyryjy usulynyň goldanýan yzyna berilýän bahalary beýan edilýär. Reaktiw görnüşler ähli yzyna berilýän bahalar üçin goldanylýar.

Dolandyryjy usulynyň yzyna berilýän bahasy Beýannama

@ResponseBody

Yzyna berilýän baha HttpMessageConverter realizasiýasy arkaly öwrülýär we jogaba ýazylýar.

HttpEntity<B>, ResponseEntity<B>

Başlyklary we bedeni öz içine alýan doly jogap yzyna berilýär, HttpMessageConverter realizasiýasy arkaly öwrülýär we jogaba ýazylýar.

HttpHeaders

Beden bolmazdan başlyklary bilen jogap yzyna berilýän maksat üçin niýetlenendir.

String

ViewResolver realizasiýalary arkaly tanalmaly we @ModelAttribute bellikli komanda obýektleri we usullary bilen kesgitlenen täsirlenmedik model bilen birlikde ulanylýan görnüşiň ady. Şeýle hem, ýerine ýetiriji usul Model argumentini belligi bilen modeli goşmaça programmalaşdyrmak maksady bilen redaktirläp biler.

View

Ekzemplýar View, görnüşi görkezmek üçin niýetlenendir, kömek edilýän model bilen birlykda ulanylýar – komanda obýektleri we @ModelAttribute bellikli usullar arkaly kesgitlenýär. Şeýle hem, ýerine ýetiriji usul Model argumentini belligi bilen modeli goşmaça programmalaşdyrmak maksady bilen redaktirläp biler.

java.util.Map, org.springframework.ui.Model

Modelle goşulan atributlar, RequestToViewNameTranslator arkaly täsirlenmedik görnüş bilen täsirlenen görnüşiň ady bilen kesgitlenýär.

@ModelAttribute

Modelle goşulan atribut, RequestToViewNameTranslator tarapyndan täsirlenmedik görnüş bilen kesgitlenýän görnüşiň adyny yzyna berýär.

Üns beriň, @ModelAttribute annotasiýasy hökman däl. Bu tablisaň ahyryndaky "Haýsy-da bolsa başga bir yzyna berilýän baha" bölümine serediň.

ModelAndView obýekti

Ulanylan görnüş we modeliň atributlary we zerur bolsa, jogap statusy.

void

Eger-de usul ServletResponse, OutputStream argumentini ýa-da @ResponseStatus bellikli bolsa, şol usul doly jogap işledi diýip hasaplaýar. Şuňa meňzeş ýagdaý, eger-de kontrolleýjiniň ETag ýa-da lastModified barlagy pozitiw barlasa, bolýar.

Ýokardaky maglumatlaryň hiç hili dogry däl bolsa, void işleýiş görnüşi REST kontrolleýjiler üçin "jogapyň ýoklugyna" ýa-da HTML kontrolleýjiler üçin deslapky görnüş adyny saýlamak hökmünde görkezilýär.

DeferredResult<V>

Öňki yzyna berilýän bahalaryň islendikini amatsyz görnüşde, islendik sapardan getirýär – meselem, haýsydyr bir wakanyň netijesinde ýa-da alternatiw ýagdaýda.

Callable<V>

Spring MVC tarapyndan dolandyrylan saparda beýlekileriň asynkronylykda yzyna berilýän bahalaryň islendikini getirýär.

ListenableFuture<V>, java.util.concurrent.CompletionStage<V>, java.util.concurrent.CompletableFuture<V>

DeferredResult üçin has amatly alternatiwa (meselem, esasy hyzmatlaryň birini yzyna berýän bolsa).

ResponseBodyEmitter, SseEmitter

HttpMessageConverter realizasiýalary arkaly jogaba ýazmaga obýektleriň akymyny asynkron görnüşde döredýär. Şeýle hem ResponseEntity üçin beden hökmünde goldaw berilýär.

StreamingResponseBody

Jogap OutputStream akymyna asynkron ýazmak. Şeýle hem ResponseEntity üçin beden hökmünde goldaw berilýär.

Reaktiw görnüşler - Reactor, RxJava, ýa-da ReactiveAdapterRegistry arkaly beýlekiler

DeferredResult üçin alternatiwa, köpgörnüşli akym (meselem, Flux, Observable), toplanyp, List bolýar.

Akym skriptlərində (meselem, text/event-stream, application/json+stream) onuň ýerine SseEmitter we ResponseBodyEmitter ulanylýar, bu ýerde ServletOutputStream ulanylýar, girizmek üçin Spring MVC tarapyndan akym dolandyrylýar, we her ýazgy tamamlanandan soň reaksiýa bolýar.

Haýsy-da bolsa başga bir yzyna berilýän baha

Aşaky tablisalaryň hiç birine laýyk gelmeýän we String ýa-da void bolan yzyna berilýän baha, RequestToViewNameTranslator arkaly täsirlenmediği sanalan baýda ýüze çykar, we diňe beýleki anyk geçirmeýän anyklamany gurnamaýar. Iň ýönekeý görnüşde baha hökmünde kesgitlenen baha çözülmeýär.

Görnüş öwrülişigi

Belli bir annotasiýaly dolandyryjy usulynyň girizme talaplaryny görkezýän (meselem, @RequestParam, @RequestHeader, @PathVariable, @MatrixVariable we @CookieValue ýaly String-e esaslanan) argumentler awtomatik görnüş öwrülişik talap edip biler, eger-de argument String diýip kesgitlenmedik bolsa.

Şeýle ýagdaýlarda görnüş öwrülişik awtomatik gurnalan öwrüjiçlere esaslanýan awtomatik öwrüilýär. Adaty ýagdaýda int, long, Date we beýlekiler ýaly ýönekeý görnüş goly bar. Siz görnüş öwrülişigi WebDataBinder arkaly ýa-da FormattingConversionService-de Formatters-i registrirläp biler.

Görnüş öwrülişigini işleýän iş geň galdyryjy meýilnamasy ýaly bolýar, eger null görnüş öwrülişiginiň netijesi hökmünde gurulsa. Bu Long, UUID we başga maksat görnüşleri ýaly bolup biler. Eger size null bardangulystrak, бәлки бери required belgisi bilen ya @Nullable diýlip kesgitlenmeli.

Versiýa 5.3-den başlap, anyk däl argumentler görnüş öwrülişiginden soň hem amal edilýär. Ähli ýagdaýda işlän usulyň void görnüş bellenýän bolsa, şol usul ýokaryda baglaşylanlar bilen doly işlenýär. Bu öňki ýagdaýlar bilen baglanyşykly ähli ýagdaýlar üçin öňki ýagdaýlar doly ýagdaýlarda.

Meselem, @PathVariable annotasiýasynda hökman gerekdir,. Şu sandan soň null görnüş öwrülişigi awtomatik ýagdaýda baştutat üçin zerur bolup biler, sebäbi 'ýok' başládaplatform döredilip bolar, şol sebäpli Missing…Exception görnüşi döredilýär.

Matriks üýtgeýänleri

RFC 3986 ýoly segmentlerde "ad-soň" toparlaryny beýan edýär. Spring MVC-de biz olary "matrix üýtgeýänleri" diýip atlandyrýarys, "köne ýazgy" Tim Berners-Lee tarapyndan döredilen ýokarda, ol URI identifikatorlarynyň ýol parametri bolup biler.

Matrix üýtgeýänleri islendik ýol segmentsi üçin bolup biler, her bir üýtgeýän nokat bilen aýrylýar we birnäçe bahalar, we birnäçe bahalar-dele at bilen aýrylýar (meselem, /cars;color=red,green;year=2012). Şeýle hem, birnäçe bahalar birnäçe üýtgeýän atlary bilen görkezilip bilner (meselem, color=red;color=green;color=blue).

Eger URL-de matrix üýtgeýänler bolar diýip umyt edilse, bir dolandyryjy usulyň talap kartasyna matrix üýtgeýänleriň içeriklerini maska ýapmagy, matrix üýtgeýänleriň buýruklary we bar bolmagy bilen baglanyşykly talaplaryň üýtgeýänlerine maska ýapmagy üpjün etmeli. Takyk mysalda matrix üýtgeýäniň ulanyşy görkezilýär:

Java
// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
    // petId == 42
    // q == 11
}
Kotlin
// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}")
fun findPet(@PathVariable petId: String, @MatrixVariable q: Int) {
    // petId == 42
    // q == 11
}

Tutuş ýol segmentleri matrix üýtgeýänleri bolup biler, käwagt matrix üýtgeýäniň haýsy üýtgeýäniň ýol üýtgeýäni bolmalydygyny kesgitlemek gerek bolup biler. Aşakdaky mysalda munuň nähili ediljekdigi görkezilýär:

Java
// GET /owners/42;q=11/pets/21;q=22
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
        @MatrixVariable(name="q", pathVar="ownerId") int q1,
        @MatrixVariable(name="q", pathVar="petId") int q2) {
    // q1 == 11
    // q2 == 22
}
Kotlin
// GET /owners/42;q=11/pets/21;q=22
@GetMapping("/owners/{ownerId}/pets/{petId}")
fun findPet(
        @MatrixVariable(name = "q", pathVar = "ownerId") q1: Int,
        @MatrixVariable(name = "q", pathVar = "petId") q2: Int) {
    // q1 == 11
    // q2 == 22
}

Matrix üýtgeýäni hökman däl diýip kesgitlenip bilner we aşakdaky mysalda görkezilişi ýaly deslapky baha belgilenip bilner:

Java
// GET /pets/42
@GetMapping("/pets/{petId}")
public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {
    // q == 1
}
Kotlin
// GET /pets/42
@GetMapping("/pets/{petId}")
fun findPet(@MatrixVariable(required = false, defaultValue = "1") q: Int) {
    // q == 1
}

Ähli matrix üýtgeýänlerini almak üçin, aşakdaky mysalda görkezilişi ýaly MultiValueMap-i ulanyp bolýar:

Java
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
        @MatrixVariable MultiValueMap<String, String> matrixVars,
        @MatrixVariable(pathVar="petId") MultiValueMap<String, String> petMatrixVars) {
    // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
    // petMatrixVars: ["q" : 22, "s" : 23]
}
Kotlin
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}")
fun findPet(
        @MatrixVariable matrixVars: MultiValueMap<String, String>,
        @MatrixVariable(pathVar="petId") petMatrixVars: MultiValueMap<String, String>) {
    // matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
    // petMatrixVars: ["q" : 22, "s" : 23]
}

Matrix üýtgeýänleriň ulanylmagyny işjeňleşdirmek zerur. Java-da MVC konfigurasiýasynda UrlPathHelper-i removeSemicolonContent=false ýerine Path Matching arkaly gurnalyň. XML görnüşindäki MVC at giňişliginde <mvc:annotation-driven enable-matrix-variables="true"/> hökmünde gurnalyň.

@RequestParam

Servlet talap parametri (meselem, talap parametrleri ýa-da forma maglumatlary) usulynyň argumentine baglamak üçin @RequestParam annotasiýasyny ulanyp bilersiňiz.

Aşakdaky mysalda munuň nähili edilýändigi görkezilýär:

Java
@Controller
@RequestMapping("/pets")
public class EditPetForm {
    // ...
    @GetMapping
    public String setupForm(@RequestParam("petId") int petId, Model model) { 
        Pet pet = this.clinic.loadPet(petId);
        model.addAttribute("pet", pet);
        return "petForm";
    }
    // ...
}
  1. petId baglamak üçin @RequestParam annotasiýasynyň ulanylmagy.
Kotlin
import org.springframework.ui.set
@Controller
@RequestMapping("/pets")
class EditPetForm {
    // ...
    @GetMapping
    fun setupForm(@RequestParam("petId") petId: Int, model: Model): String { 
        val pet = this.clinic.loadPet(petId);
        model["pet"] = pet
        return "petForm"
    }
    // ...
}
  1. petId baglamak üçin @RequestParam annotasiýasynyň ulanylmagy.
  2. Adaty ýagdaýda bu annotasiýany ulanaýan usulyň parametrleri hökman bolar, emma usulyň parametriniň hökman bolmaýandygyny belliklemek üçin, @RequestParam annotasiýasynyň required flagyny false ýa-da java.util.Optional sarp ediji bilen belläň.

    Eger görkezilen maksat usulyntiň parametri String bolmasa, görnüş öwrülişigi awtomatik amal edilýär.

    Eger argument görnüşi massaýlap ýa-da sanaw görnüşinde kesgitlenmedik bolsa, birnäçe parametr bahasy bir parametr ady üçin çözüler.

    Eger @RequestParam annotasiýasy Map<String, String> ýa-da MultiValueMap<String, String> görnüşinde kesgitlenmedik bolsa, Map her parametr ady üçin talap parametr bahalary bilen doldurylýar.

    Üns beriň, @RequestParam annotasiýasynyň ulanylmagy şert däl (meselem, atributlaryň kesgitlenmegi üçin). Adaty ýagdaýda, islendik anyklanmadyk anyk geçirmeýän argument ýönekeý bahalar (BeanUtils#isSimpleProperty tarapyndan kesgitlenişi ýaly) üçin @RequestParam ýaly işleýär.

    @RequestHeader

    Dolandyryjy usulyň argumentine talap başlygyna baglamak üçin @RequestHeader annotasiýasy ulanyp bolýar.

    Aşakdaky talap başlyklary bilen göz önüne düzüň:

    Host                    localhost:8080
    Accept                  text/html,application/xhtml+xml,application/xml;q=0.9
    Accept-Language         fr,en-gb;q=0.7,en;q=0.3
    Accept-Encoding         gzip,deflate
    Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive              300

    Aşakdaky mysalda Accept-Encoding we Keep-Alive başlyklarynyň bahalarynyň nähili alynjakdygy görkezilýär:

    Java
    @GetMapping("/demo")
    public void handle(
            @RequestHeader("Accept-Encoding") String encoding, 
            @RequestHeader("Keep-Alive") long keepAlive) { 
        //...
    }
    1. Accept-Encoding başlygy bahalary alynýar.
    2. Keep-Alive başlygy bahalary alynýar.
    Kotlin
    @GetMapping("/demo")
    fun handle(
            @RequestHeader("Accept-Encoding") encoding: String, 
            @RequestHeader("Keep-Alive") keepAlive: Long) { 
        //...
    }
    1. Accept-Encoding başlygy bahalary alynýar.
    2. Keep-Alive başlygy bahalary alynýar.

    Eger görkezilen maksat usulyň parametri String ýa-da HttpHeaders bolmasa, görnüş öwrülişigi awtomatik amala aşyrylyar.

    Eger @RequestHeader annotasiýasy Map<String, String>, MultiValueMap<String, String>, ýa-da HttpHeaders bilen ulanylýan bolsa, Map ähli başlyk bahalary bilen doldurylýar.

    Çekimden aýrylan setirleriň massyawa ýa-da tapgyryna öwrülmegi üçin taýýarlanan awtomatik goldaw bardyr ýa-da görnüş öwrülişgipचे. Meselem, @RequestHeader("Accept") atly usulyň parametri String formasynda bolýan, hem-de String[] ýa-da List<String> görnüşinde bolup biler.

    @CookieValue

    HTTP cookie maglumatlarynyň bahalaryny dolandyryjy usulyň argumentine baglamak üçin @CookieValue annotasiýasyny ulanyp bilersiňiz.

    Aşakdaky cookie bilen talapy göz öňüne getiriň:

    JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84

    Aşakdaky mysalda cookie bahalarynyň nähili alynjakdygy görkezilýär:

    Java
    @GetMapping("/demo")
    public void handle(@CookieValue("JSESSIONID") String cookie) { 
        //...
    }
    1. JSESSIONID cookie bahasynyň alynmagy.
    Kotlin
    @GetMapping("/demo")
    fun handle(@CookieValue("JSESSIONID") cookie: String) { 
        //...
    }
    1. JSESSIONID cookie bahasynyň alynmagy.

    Eger görkezilen maksat usulyň parametri String bolmasa, görnüş öwrülişigi awtomatik amala aşyrylyar.

    @ModelAttribute

    @ModelAttribute annotasiýasy dolandyryjy usulynyň argumenti üçin modelden attribute almak ýa-da ol ýok bolsa atribut nusgasyny döretmek üçin ulanylýar. Model attribute HTTP servlet talap parametrlerinden bahalar kabul etmegi hem öz içine alýar, göräýmäge birmeňzeş sahypalary bilen meňzeş atlar düşüner. Bu maglumatlary baglamak diýilýär we aýratyn talap parametrlerini we forma sahypalaryny analizlemek we öwrülişik etmek esasy meseleleri çözmekden gorap durýar. Aşakdaky mysalda munuň nähili ediljekdigi görkezilýär:

    Java
    @PostMapping("/owners/{ownerId}/pets/{petId}/edit")
    public String processSubmit(@ModelAttribute Pet pet) {
        // method logic...
    }
    Kotlin
    @PostMapping("/owners/{ownerId}/pets/{petId}/edit")
    fun processSubmit(@ModelAttribute pet: Pet): String {
        // method logic...
    }

    Yzky belgili Pet nusgasyna aşakdaky usullar bilen ýetip bolýar:

    • @ModelAttribute bellikli usulynyň attribute modeline goşulmagy bilen modelden çykarylýar.

    • HTTP sessiýasyndan çykarylýar, eger klas derejeli @SessionAttributes annotasiýasy bilen model attribute kesgitlenen bolsa.

    • Anyklanmaly bir Converter bilen talap edilen atribut modeliň kesgitlenen talap bahasy bilen meňzeş wagtynda elmydama getirilýär, meselem, ýol üýtgeýänini ýa-da sorag parametrini alamatlandyrýar (aşakdaky mysala serediň).

    • Default konstruktory arkaly döredilýär.

    • Girilýän servlet talap elementleri bilen gabat gelýän argumentleri bilen 'birinji derejeli' konstruktory arkaly döredilýär. Argument atlary JavaBeans klaslarynda @ConstructorProperties annotasiýasy ýa-da byte kodda serwer tarapyndan saklanýan wagtynda kesgitlenýär.

    @ModelAttribute annotasiýasynyň ulanylmagynyň alternatiwasy we model attribute mümkinçiligi bilen üpjünçilik üpjün edilmeginiň alternatiwasy Converter<String, T> ulanylmagyny üpjün etmegi arkaly bolýar. Bu belli bir baha diýiniň attribute modeliniň ady talap bahasy attribute ady bilen meňzeş bolanda we model attribute görnüşine Converter bardygynda bolýar. Aşakdaky mysalda model attribute ady - account, URI identifikatory ýol üýtgeýäniniň account we String in Account formatda registrirlenen Converter tarapyndan ýüklenen Account bolanlygynda:

    Java
    @PutMapping("/accounts/{account}")
    public String save(@ModelAttribute("account") Account account) {
        // ...
    }
    Kotlin
    @PutMapping("/accounts/{account}")
    fun save(@ModelAttribute("account") account: Account): String {
        // ...
    }

    Öz görnüş nusgasyny alan soň, Data Bindings dolandyryş işlemesi başa çykýar. WebDataBinder servlet talap parametrleriniň (sorag parametrleri we forma sahypalary) atlaryny nyşana taýýarlanan obýektiň sahypadagüzenleşdirýär. Öndürilen sahypalar öwrülişigiň görnüşi bilen talap edilýär, zerur gerek bolsa.

    Data Bindsings näsazlyklara getirýär, gadyr-gamat bolmanda BindException ýüze çykýar. Ýöne dolandyryjy usulyň argumenti BindingResult getirilip, @ModelAttribute bilen belgilenenden soň, aşakdaky mysalda görkezilişi ýaly barlamak üçin ulanyp boljakneteýar:

    Java
    @PostMapping("/owners/{ownerId}/pets/{petId}/edit")
    public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) { 
        if (result.hasErrors()) {
            return "petForm";
        }
        // ...
    }
    1. @ModelAttribute bilen BindingResult goşa goşulýar.
    Kotlin
    @PostMapping("/owners/{ownerId}/pets/{petId}/edit")
    fun processSubmit(@ModelAttribute("pet") pet: Pet, result: BindingResult): String { 
        if (result.hasErrors()) {
            return "petForm"
        }
        // ...
    }
    1. @ModelAttribute bilen BindingResult goşa goşulýar.
    2. Kähalatlarda model attribute döwrüniçe ulanyp bolmazdan öň, model attributy doly elýeterli bolmaly bolýar. Şeýle ýagdaýlarda, @ModelAttribute(binding=false) goýýança kontrolleýjide Model girmek ýa-da interfeýsi gönüden-göni ulanmak mümkinçiligi bar.

      Java
      @ModelAttribute
      public AccountForm setUpForm() {
          return new AccountForm();
      }
      @ModelAttribute
      public Account findAccount(@PathVariable String accountId) {
          return accountRepository.findOne(accountId);
      }
      @PostMapping("update")
      public String update(@Valid AccountForm form, BindingResult result,
              @ModelAttribute(binding=false) Account account) { 
          // ...
      }
      1. @ModelAttribute(binding=false).
      Kotlin
      @ModelAttribute
      fun setUpForm(): AccountForm {
          return AccountForm()
      }
      @ModelAttribute
      fun findAccount(@PathVariable accountId: String): Account {
          return accountRepository.findOne(accountId)
      }
      @PostMapping("update")
      fun update(@Valid form: AccountForm, result: BindingResult,
                 @ModelAttribute(binding = false) account: Account): String { 
          // ...
      }
      1. @ModelAttribute(binding=false).
      2. Maglumatlar birlikden baglanyşma awtomatik ulanmak üçin - annotasiýasy javax.validation.Valid ýa-da Spring-dan @Validated ulanyp biler. Aşakdaky mysalda munuň nähili edilýändigi görkezilýär:

        Java
        @PostMapping("/owners/{ownerId}/pets/{petId}/edit")
        public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) { 
            if (result.hasErrors()) {
                return "petForm";
            }
            // ...
        }
        1. Pet'iň nusgasy barlanýar.
        Kotlin
        @PostMapping("/owners/{ownerId}/pets/{petId}/edit")
        fun processSubmit(@Valid @ModelAttribute("pet") pet: Pet, result: BindingResult): String { 
            if (result.hasErrors()) {
                return "petForm"
            }
            // ...
        }

        Üns beriň, @ModelAttribute annotasiýasy hökman däl (meselem, attributlaryň kesgitlenmegi üçin). Adaty ýagdaýda, islendik bahasy anyklanmaýandyklaryna garamazdan BeanUtils#isSimpleProperty tarapyndan kesgitlelen ýaly bolup @ModelAttribute ýaly işleýär.

        @SessionAttributes

        @SessionAttributes annotasiýasy konduktor HTTP servlet-iň sessiýasynda talaplar arasynda model atributlaryny saklamak üçin ulanylýar. Bu tolkun derejeli annotation, model atributlary bilen ulanylýan görkeziji kontrolleýýjiler tarapyndan ulanylýar. Bu ýerde adatça ulanylýan model attributlarynyň atlary ýa-da modeliň atributlarynyň görnüşleri görkezilýär, ýerli görünmek üçin sessiýaňda saklanýar we görkezilýär, ýerli.

        Aşakdaky mysalda @SessionAttributes annotasiýasynyň ulanylyşy görkezilýär:

        Java
        @Controller
        @SessionAttributes("pet") 
        public class EditPetForm {
            // ...
        }
        1. @SessionAttributes annotasiýasynyň ulanylşy.
        Kotlin
        @Controller
        @SessionAttributes("pet") 
        class EditPetForm {
            // ...
        }
        1. @SessionAttributes annotasiýasynyň ulanylşy.

        Ilkinji talabyň wagtynda, pet model attribute modeline goşulsa, awtomatik ýagdaýda yza çekilýär we HTTP servlet sessiýasynda saklanýar. Şeýlelikde ol başga bir kontrolleýjiniň usuly SessionStatus usulyň argumentini ulanýança saklanýar, we bu aşakdaky mysalda görkezilişi ýaly arassalaýar:

        Java
        @Controller
        @SessionAttributes("pet") 
        public class EditPetForm {
            // ...
            @PostMapping("/pets/{id}")
            public String handle(Pet pet, BindingResult errors, SessionStatus status) {
                if (errors.hasErrors) {
                    // ...
                }
                status.setComplete(); 
                // ...
            }
        }
        1. Pet bahasy servlet sessiýasynda saklanýar.
        2. Pet bahasy servlet sessiýasyndan arassalanýar.
        3. Kotlin
          @Controller
          @SessionAttributes("pet") 
          class EditPetForm {
              // ...
              @PostMapping("/pets/{id}")
              fun handle(pet: Pet, errors: BindingResult, status: SessionStatus): String {
                  if (errors.hasErrors()) {
                      // ...
                  }
                  status.setComplete() 
                  // ...
              }
          }
          1. Pet bahasy servlet sessiýasynda saklanýar.
          2. Pet bahasy servlet sessiýasyndan arassalanýar.
          3. @SessionAttribute

            Birinjiden ulanylan we öz içine üçin doly üpjün edilmedik atributlara elýeterli bolmaýan ýagdaýlarda tölkeliaryň usulynyň argumenti hökmünde @SessionAttribute annotasiýasyny ulanyp bolýar. Bu şeýle bir görnüşdäki global dolandyrylýan atributlary (meselem, filtler bilen üpjün edilen) saklamak üçin ulanylýar. Aşakdaky mysalda görkeziň:

            Java
            @RequestMapping("/")
            public String handle(@SessionAttribute User user) { 
                // ...
            }
            1. @SessionAttribute annotasiýasynyň ulanylşy.
            2. Kotlin
              @RequestMapping("/")
              fun handle(@SessionAttribute user: User): String { 
                  // ...
              }

              Wagtlaýyn saklanýan attributlaryň talap edilmesi ýa-da goşulmagy üçin dolandyryjy usulda org.springframework.web.context.request.WebRequest ýa-da javax.servlet.http.HttpSession girizmegi göz öňünde tutuň.

              Dolandyryjynyň iş meýilnamasy ýaly sessiýada wagtlaýyn saklamak maksatlary üçin @SessionAttributes annotasiýasy ulanylmagyny göz öňünde tutuň.

              @RequestAttribute

              Bu @SessionAttribute ýaly, öňden bar bolan talap attributlaryna geçmek üçin @RequestAttribute annotasiýasynyň ulanylmagy mümkin, käwagtlar talap bilen bir ýerdäki servlet Filter ýa-da HandlerInterceptor ýaly:

              Java
              @GetMapping("/")
              public String handle(@RequestAttribute Client client) { 
                  // ...
              }
              1. @RequestAttribute annotasiýasynyň ulanylşy.
              2. Kotlin
                @GetMapping("/")
                fun handle(@RequestAttribute client: Client): String { 
                    // ...
                }
                1. @RequestAttribute annotasiýasynyň ulanylşy.
                2. Gönükdirme atributlary

                  Adaty ýagdaýda, ähli model attributlary URL-niň ýagdaýda köki URI şablonynyň görkezişini ulanýar. Galan atributlardan, primitiw görnüşde ýa-da ýygyndylarda ýa-da primitiw görnüşler bolan massaýwaklar kömege ýöňkelmegine awtomatik ýagdaýda goşulýar.

                  Primitiw görnüşleriň atributlarynyň goşulmagy adatça ähli talap üçin talap edilýär, eger gönükdirme üçin görülmeli model attributy bolsa. Emma annotasiýaly kontrolleýjilerde görünmek üçin

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION