DataBinder

All lectures for AM purposes
1 уровень , 594 лекция
Открыта

Անոթացիաներով @Controller կամ @ControllerAdvice դասերը կարող են ունենալ մեթոդներ, որոնք նշված են @InitBinder անոթացիայով, որոնք ինիցիալիզացնում են WebDataBinder ից՝ որոնք կարող են.

  • Կցել հարցման պարամետրերը (այսինքն՝ ֆորմայի կամ հարցման տվյալները) մոդելի օբյեկտին:

  • Փոխարկում հարցման տողային արժեքները (օրինակ՝ հարցման պարամետրեր, ճանապարհի փոփոխականներ, վերնագրեր, cookie տվյալներ և այլն) վերահսկիչ մեթոդի նպատակային պրոտոտիպի:

  • Ֆորմատավորում մոդելի օբյեկտների արժեքները որպես String արժեքներ, երբ ցուցադրվում են HTML-ֆորմեր:

@InitBinder անոթացիայով մեթոդները կարող են գրանցել վերահսկիչի համար հատուկ java.beans.PropertyEditor կամ Converter և Formatter Spring-ից: Բացի այդ, կարող եք օգտագործել MVC-ի կարգավորումները՝ գրանցելու համար Converter և Formatter տիպերը գլոբալ կիսվող FormattingConversionService-ում:

@InitBinder անոթացիայով նշված մեթոդները աջակցում են նույնատիպ բազմաթիվ արգումենտներ, ինչպիսիք են @RequestMapping անոթացիայով մեթոդները, բացառությամբ @ModelAttribute (հրամանի օբյեկտ) անոթացիայով արգումենտների: Սովորաբար, դրանք հայտարարվում են WebDataBinder արգումենտով (գրանցման ընթացակարգերի համար) և վերադարձվող արժեքով void : Հաջորդ օրինակով դա ցույց է տալիս.

Java
@Controller
public class FormController {
    @InitBinder 
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
    // ...
}
  1. @InitBinder անոթացիայով մեթոդի սահմանում.
Kotlin
@Controller
class FormController {
    @InitBinder 
    fun initBinder(binder: WebDataBinder) {
        val dateFormat = SimpleDateFormat("yyyy-MM-dd")
        dateFormat.isLenient = false
        binder.registerCustomEditor(Date::class.java, CustomDateEditor(dateFormat, false))
    }
    // ...
}
  1. @InitBinder անոթացիայով մեթոդի սահմանում.

Բացի այդ, եթե դուք օգտագործում եք Formatter-ի հիման վրա կարգավորումը ընդհանուր FormattingConversionService-ի միջոցով, ապա կարող եք կրկին օգտագործել նույն մոտեցումը և գրանցել վերահսկիչի համար հատուկ Formatter իրականացման օրինակ, ինչպես ցույց է տրված հետևյալ օրինակով.

Java
@Controller
public class FormController {
    @InitBinder 
    protected void initBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
    // ...
}
  1. @InitBinder անոթացիայով մեթոդի սահմանում հատուկ ձևակերպիչի համար:
Kotlin
@Controller
class FormController {
    @InitBinder 
    protected fun initBinder(binder: WebDataBinder) {
        binder.addCustomFormatter(DateFormatter("yyyy-MM-dd"))
    }
    // ...
}
  1. @InitBinder անոթացիայով մեթոդի սահմանում հատուկ ձևակերպիչի համար:

Մոդելի կառուցվածքը

Վեբ-հավելվածների համատեքստում տվյալների կցում ենթադրում է HTTP հարցման պարամետրերի (այսինքն՝ ֆորմայի կամ հարցման պարամետրերի տվյալների) կցումը մոդելի օբյեկտի և նրա ներդրված օբյեկտների հատկություններին:

Տվյալների կցման համար բացվում են միայն public հատկությունները, որոնք համապատասխանում են JavaBeans անվանման կանոններին՝ օրինակ, public String getFirstName() և public void setFirstName(String) մեթոդները firstName հատկության համար:

Մոդելի օբյեկտը և նրա ներդրված օբյեկտների գրաֆը հաճախ կոչվում են հրամանի օբյեկտ, ֆորմայի հիմավոր օբյեկտ կամ POJO ("հին լավ Java օբյեկտ"):

Նախնական կարգավորմամբ, Spring-ը թույլ է տալիս կցում բոլոր public հատկություններին մոդելի օբյեկտների գրաֆում: Սա նշանակում է, որ անհրաժեշտ է ուշադիր մտածել, թե ինչ public հատկություններ ունի մոդելում, որովհետև հաճախորդը կարող է նպատակ ունենալ յուրաքանչյուր public հատկություն, նույնիսկ այն, որը չի ենթադրվում տվյալ օգտագործման դեպքի համար:

Օրինակ, եթե առկա է HTTP ֆորմայի տվյալների վերջնական կետ, վնասակար հաճախորդը կարող է փոխանցել արժեքներ մոդելի օբյեկտների գրաֆում առկա հատկությունների համար, բայց որոնք չեն հանդիսանում HTML ֆորմայում ներկայացված բրաուզերում: Սա կարող է հանգեցնել մոդելի օբյեկտի և նրա ցանկացած ներդրված օբյեկտի տվյալների փոփոխման, որին չի սպասվում:

Խորհուրդ է տրվում օգտագործել մասնագիտացված մոդելի օբյեկտ, որը բացում է միայն այն հատկությունները, որոնք կապված են ֆորմայի ուղարկման հետ: Օրինակ, օգտատիրոջ էլեկտրոնային հասցեն փոփոխելու ֆորմայում, մոդելի օբյեկտը պետք է հայտարարի հատկությունների նվազագույն հավաքածու, ինչպես ցույց է տրված հետևյալ ChangeEmailForm օրինակով:

public class ChangeEmailForm {
    private String oldEmailAddress;
    private String newEmailAddress;
    public void setOldEmailAddress(String oldEmailAddress) {
        this.oldEmailAddress = oldEmailAddress;
    }
    public String getOldEmailAddress() {
        return this.oldEmailAddress;
    }
    public void setNewEmailAddress(String newEmailAddress) {
        this.newEmailAddress = newEmailAddress;
    }
    public String getNewEmailAddress() {
        return this.newEmailAddress;
    }
}

Եթե դուք չեք կարող կամ չեք ուզում օգտագործել մասնագիտացված մոդելի օբյեկտ յուրաքանչյուր օգտագործման դեպքի համար, ապա դուքպետք է սահմանափակեք տվյալների կցման համար թույլատրելի հատկությունները: Իդեալում, դա կարող եք անել՝ գրանցելով թույլատրելի դաշտերի նախշերը setAllowedFields() մեթոդի միջոցով WebDataBinder-ում:

Օրինակ, ձեր հավելվածում թույլատրելի դաշտերի նախշերը գրանցելու համար, կարող եք իրականացնել @InitBinder անոթացիայով մեթոդ @Controller կամ @ControllerAdvice անոթացիայով կոմպոնենտում, ինչպես ցույց է տրված ներքևում.

@Controller
public class ChangeEmailController {
    @InitBinder
    void initBinder(WebDataBinder binder) {
        binder.setAllowedFields("oldEmailAddress", "newEmailAddress");
    }
    // մեթոդներ նշված @RequestMapping և այլն
}

Հավելյալ, կարող եք նաև գրանցել թույլատրելի դաշտերի նախշերը setDisallowedFields() մեթոդի օգնությամբ DataBinder-ում և նրա ենթադասերում: Սակայն նկատի ունեցեք, որ «թույլատրելի ցանկը» ավելի անվտանգ է քան «արգելքի ցանկը»: Հետևաբար, setAllowedFields() կիրառումը պետք է գերադասել setDisallowedFields()-ի կիրառմանը:

Նկատի ունեցեք, որ թույլատրելի դաշտերի նախշեր համակցման դեպքում մեծատառերը և փոքրատառերը ազդում են. մինչդեռ արգելքի նախշերի համակցման դեպքում՝ ոչ: Բացի այդ, դաշտը, որը համապատասխանում է արգելքի նախշին, չի ընդունվի, նույնիսկ եթե համապատասխանում է նաև թույլատրելի ցանկի նախշին:

Շատ կարևոր է ճիշտ կարգավորել թույլատրելի և արգելքի դաշտերի նախշերը, երբ բացում եք ոլորտի մոդելը տվյալների կցման համար: Հակառակ դեպքում դա կարող է մեծ ռիսկ լինել անվտանգության համար.

Բացի այդ, հորդորում ենքչօգտագործել ձեր ոլորտի մոդելի տիպերը, ինչպես օրինակ JPA կամ Hibernate էկզեմպլյարները, որպես մոդելի օբյեկտ տվյալների կցման սցենարներում:

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ