JSP եւ JSTL

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

Spring Framework-ն ունի ինտեգրված լուծում՝ Spring MVC-ն օգտագործելու համար JSP եւ JSTL-ով:

Դիտողական ռեսուրսների լուծիչներ

JSP մշակման ժամանակ սովորաբար հայտարարվում է InternalResourceViewResolver բինը:

InternalResourceViewResolver-ը կարող է օգտագործվել սերվլետների ցանկացած ռեսուրսին ուղղորդելու համար, հատկապես JSP-երին։ Որպես ամենաօպտիմալ մեթոդ խորհուրդ ենք տալիս տեղադրել JSP ֆայլերը "WEB-INF" ենթադիրեկտորիայում, որպեսզի հաճախորդները չկարողանան ուղղակի մուտք ունենալ դրանց վրա:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

JSPs ընդդեմ JSTL-ի

JSP Ստանդարտ Տեգերի Գիրք (JSTL) օգտագործելիս անհրաժեշտ է օգտվել հատուկ JstlView դասից, քանի որ JSTL պահանջում է որոշակի նախապատրաստում, որպեսզի այնպիսի բաներ, ինչպիսիք են I18N ֆունկցիաները, աշխատեն:

Spring-ի համար JSP Տեգերի Գիրք

Spring-ը ապահովում է տվյալների կապի հատկությունը հարցման պարամետրերի և հրամանների օբյեկտների միջև, ինչպես նկարագրված է նախորդ գլուխներում։ JSP էջեր մշակելիս այս տվյալների կապի ֆունկցիաների հետ, Spring-ը սահմանում է մի քանի տեգեր, որոնք ավելի հեշտ են դարձնում գործընթացը։ Spring-ի բոլոր տեգերն ունեն HTML-ը էկրանավորելու հատկություն, որը կարելի է ակտիվացնել կամ դեզակտիվացնել նշանների էկրանավորման համար:

spring.tld (TLD) տեգերի գրադարանը ընդգրկված է spring-webmvc.jar-ում։ Տեգերի վերաբերյալ լիարժեք տեղեկատվություն ստանալու համար ստուգեք API ուղղորդում կամ դիմեք տեգերի գրադարանի նկարագրությանը:

Spring-ի ձևերի տեգերի գրադարան

Սկսած 2.0 տարբերակից, Spring-ն ապահովում է տեգերի ամբողջական հավաքածու, որոնք աջակցում են տվյալների կապը օգտագործելիս JSP և Spring Web MVC-ի հետ։ Յուրաքանչյուր տեգ աջակցում է համապատասխան HTML տեգի հատկությունների հավաքածուին, ինչը դարձնում է տեգերը սովորական և ինտուիտիվ օգտագործման համար։ Տեգերի արտադրած HTML-ը համապատասխանում է HTML 4.01/XHTML 1.0 ստանդարտներին:

Ի տարբերություն այլ ձևերի/մուտքագրումների տեգերի գրադարանների, Spring-ի ձևերի տեգերի գրադարանը ինտեգրված է Spring Web MVC-ի հետ, ինչը հնարավորություն է տալիս տեգերին մուտք ունենալ հրավիրած օբյեկտին և հղման տվյալներին, որոնց հետ աշխատում է Ձեր տվյալների կարգավորիչը։ Ինչպես ցույց է տրված հետևյալ օրինակներում, ձևերի տեգերը հեշտացնում են JSP-ի մշակումը, ընթերցումը և սպասարկումը:

Այս գիրքը կզբաղվի ձևերի տեգերով և կտեսնենք յուրաքանչյուր տեգի օգտագործման օրինակ։ Մենք ներառել ենք սաղմնային HTML բաժիններ, որտեղ որոշակի տեգեր պահանջում են հավելյալ մեկնաբանություններ:

Կոնֆիգուրացիա

Տեգերի գրադարանն ընդգրկված է spring-webmvc.jar-ում։ Տեգերի գրադարանի անունն է spring-form.tld.

Տեգերի գրադարանից օգտվելու համար ավելացրեք հետևյալ դիրեկտիվը Ձեր JSP էջի վերևում.

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

որտեղ form տեգի անունն է, որը ցանկանում եք օգտագործել այս գրադարանից:

Ձևերի տեգ

Այս տեգը ցույց է տալիս HTML-ի "form" էլեմենտը և բացում ճանապարհ դեպի ներքին տեգերի կապը։ Այն տեղադրում է հրամանի օբյեկտը PageContext-ում, որպեսզի ներքին տեգերը կարողանան դիմել հրամանի օբյեկտին։ Այս գրադարանի բոլոր մյուս տեգերը form տեգի ներքո գտնվող առաջնային տեգեր են:

Ենթադրենք, որ ունենք User անունով գործադիր տարածքի օբյեկտ։ Դա JavaBean է այնպիսի հատկություններով, ինչպիսիք են firstName և lastName: Կարելի է օգտագործել այն որպես մեր ձևի կառավարման բազային օբյեկտ, որը վերադարձնում է form.jsp ֆայլը: Հաջորդ օրինակը ցույց է տալիս, թե ինչպես կարող է form.jsp-ը տեսք ունենալ:

<form:form>
    <table>
        <tr>
            <td>First Name:</td>
            <td><form:input path="firstName"/></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><form:input path="lastName"/></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form:form>

firstName եւ lastName արժեքները դուրս են գալիս հայտարարության օբյեկտից, որը տեղադրված է PageContext մոդելում: Շարունակեք տեգերի թեմայի ավելի վերևում գտնվելու համար ՝ ներքին տեգերի օգտագործման օրինաչափությունների հետ պարզաբանման համար:

Հաջորդ ցուցումը ցույց է տալիս HTML-ի արտադրանքը, որը ստանդարտ ձև է:

<form method="POST">
    <table>
        <tr>
            <td>First Name:</td>
            <td><input name="firstName" type="text" value="Harry"/></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><input name="lastName" type="text" value="Potter"/></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form>

Վերոհիշյալ JSP-ում ենթադրվում է, որ ձևի բազային օբյեկտի փոփոխականի անունը command է։ Եթե Դուք այդ ձևերի բազային օբյեկտը տեղադրել եք մոդելի այլ անունով, կարող եք կապել ձևը այն փոփոխականի հետ, ինչպես ցույց է տրված ստորև մատնանշված օրինակով:

<form:form modelAttribute="user">
    <table>
        <tr>
            <td>First Name:</td>
            <td><form:input path="firstName"/></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><form:input path="lastName"/></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form:form>

Տեգ input

Այս տեգը ցուցադրում է HTML-ի input էլեմենտը, որը կապակցված արժեքով և type='text' ըստ կանխատրվածի։ Դուք կարող եք նաև օգտագործել HTML5-ի հատուկ տեսակները, ինչպիսիք են email, tel, date և այլ:

Տեգ checkbox

Այս տեգը ցուցադրում է HTML-ի input էլեմենտը, որի type միասին է checkbox:

Ենթադրենք, որ User ունի անձնական կանխատեսություններ, ինչպիսիք են բաժանորդագրության նորություններ և հետաքրքրությունների ցուցակ։ Հաջորդ օրինակով ցույց է տրվում Preferences դասարակի օրինակ, որը ներկայացված է ստորև:

Java
public class Preferences {
    private boolean receiveNewsletter;
    private String[] interests;
    private String favouriteWord;
    public boolean isReceiveNewsletter() {
        return receiveNewsletter;
    }
    public void setReceiveNewsletter(boolean receiveNewsletter) {
        this.receiveNewsletter = receiveNewsletter;
    }
    public String[] getInterests() {
        return interests;
    }
    public void setInterests(String[] interests) {
        this.interests = interests;
    }
    public String getFavouriteWord() {
        return favouriteWord;
    }
    public void setFavouriteWord(String favouriteWord) {
        this.favouriteWord = favouriteWord;
    }
}
Kotlin
class Preferences(
        var receiveNewsletter: Boolean,
        var interests: StringArray,
        var favouriteWord: String
)

Համապատասխան form.jsp ֆայլը կարող է այսպիսին լինել:

<form:form>
    <table>
        <tr>
            <td>Subscribe to newsletter?:</td>
            <%-- Մոտեցում 1: Հատկությունը ունի java.lang.Boolean տեսակ --%>
            <td><form:checkbox path="preferences.receiveNewsletter"/></td>
        </tr>
        <tr>
            <td>Interests:</td>
            <%-- Մոտեցում 2: Հատկությունը զանգված է կամ java.util.Collection տեսակ --%>
            <td>
                Quidditch: <form:checkbox path="preferences.interests" value="Quidditch"/>
                Herbology: <form:checkbox path="preferences.interests" value="Herbology"/>
                Defence Against the Dark Arts: <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
            </td>
        </tr>
        <tr>
            <td>Favourite Word:</td>
            <%-- Մոտեցում 3: Հատկությունը ունի java.lang.Object տեսակ --%>
            <td>
                Magic: <form:checkbox path="preferences.favouriteWord" value="Magic"/>
            </td>
        </tr>
    </table>
</form:form>

Երեք մոտեցում կա checkbox տեգի համար, որոնք պետք է բավարարեն ձեր բոլոր պահանջները կապված checkbox-ների հետ:

  • Մոտեցում առաջինը: Եթե կապակցված արժեքը java.lang.Boolean տեսակ է, input(checkbox)-ը նշվում է որպես checked, եթե կապակցված արժեքը true է: value հատկությունը համապատասխանում է setValue(Object) արժեքի հատկության թույլատրված արժեքին:

  • Մոտեցում երկրորդը: Եթե կապակցված արժեքը array կամ java.util.Collection տեսակ ունի, input(checkbox)-ը նշվում է որպես checked, եթե կոնֆիգուրացված setValue(Object) արժեքը առկա է կապակցված Collection-ում:

  • Մոտեցում երրորդը: Երկարաժամկետ ցանկացած այլ կապակցված արժեքի դեպքում input(checkbox)-ը նշվում է որպես checked, եթե կոնֆիգուրացված setValue(Object) արժեքը նույնն է ից կապակցված արժեքի:

Նկատեք, որ անկախ մոտեցումից, արտադրանքը նույն HTML կառուցվածքը է: Հաջորդ HTML ֆասցիան ցուցադրում է մի քանի checkbox:

<tr>
    <td>Interests:</td>
    <td>
        Quidditch: <input name="preferences.interests" type="checkbox" value="Quidditch"/>
        <input type="hidden" value="1" name="_preferences.interests"/>
        Herbology: <input name="preferences.interests" type="checkbox" value="Herbology"/>
        <input type="hidden" value="1" name="_preferences.interests"/>
        Defence Against the Dark Arts: <input name="preferences.interests" type="checkbox" value="Defence Against the Dark Arts"/>
        <input type="hidden" value="1" name="_preferences.interests"/>
    </td>
</tr>

Դուք կարող է չնախատել տեսնել լրացուցիչ կոճական (hidden) դաշտը checkbox-ի յուրաքանչյուր ստուգումից հետո: Եթե checkbox-ը HTML էջում չնշված է, նրա արժեքը չի ուղարկվում սերվերին HTTP հարցման պարամետրերի մասի ընտրված կոճակները ներառում են այն կատարման ժամանակ: Spring-ը հաճախ օգտագործում է պարամետրի հետ կապված արձանագրված վերամշակումը Spring-ի տվյալների ստուգման տեգերի գրադարանի հետ՝ ներկայացնելով պարամետրի ընդհանուր կոնվենցիան:

Տեգ checkboxes

Այս տեգը ներկայացնում է մի քանի HTML input էլեմենտների, որոնց typecheckbox է:

Այս բաժինն հիմնված է checkbox տեգի նախորդ բաժնի օրինակի վրա: Երբեմն նախընտրելի է չթվարկել բոլոր հնարավոր շահերը JSP էջում: Ավելի լավ է ապահովել հասանելի տարբերակների ցուցակը ծրագրավորած ժամանակ և փոխանցել այն տեգին: checkboxes տեգը այս նպատակն ունի: Դուք կարող եք փոխանցել Array, List կամ Map, որն ունի հասանելի տարբերակներ items հատկությամբ: Սովորաբար կապակցված հատկությունը հավաքածու է, որպեսզի օգտվողը կարողանա ընտրել մի քանի արժեքներից: Հաջորդ օրինակը ցույց է տալիս JSP էջը, որտեղ օգտագործվում է այս տեգը:

<form:form>
    <table>
        <tr>
            <td>Interests:</td>
            <td>
                <%-- Հատկությունը զանգված է կամ java.util.Collection է --%>
                <form:checkboxes path="preferences.interests" items="${interestList}"/>
            </td>
        </tr>
    </table>
</form:form>

Այս օրինակում ենթադրվում է, որ interestListList է, որը հասանելի է որպես մոդելատրի փոխման, որում պարունակվում են ընտրության համար արժեքների տողերը: Եթե օգտագործում եք Map, ծրագրի Map-ի գրառման բանալին օգտագործվում է որպես արժեք, իսկ գրառման արժեքը որպես ցուցադրվող պիտակ: Կարող եք օգտագործել նաև սեփական օբյեկտ, որում կարող ենք նշել գույքության անունների համար արժեքը itemValue և պիտակը՝ itemLabel:

Տեգ radiobutton

Այս տեգը ներկայացնում է HTML input էլեմենտը, որը type ունի radio:

Սովորական օգտագործման սցենարն ապահովում է մի քանի տեգի օրինակներ, որոնք կապված են մեկ և նույն հատկությանը, բայց տարբեր արժեքներով, ինչպես ցույց է տրված հաջորդ օրինակով:

<tr>
    <td>Sex:</td>
    <td>
        Male: <form:radiobutton path="sex" value="M"/> <br/>
        Female: <form:radiobutton path="sex" value="F"/>
    </td>
</tr>

Տեգ radiobuttons

Այս տեգը ներկայացնում է մի քանի HTML input էլեմենտների, որոնց type նույն ծագումը շառաչով է radio:

Ինչպես և նախորդ դեպքում checkboxes տեգի դեպքում, կարող եք հասանելի տարբերակները ժամանակի աջակցման համար փոփոխական փոխանցել: Այս տեգով զուգորդված լուծումից օգտվելու համար օգտագործեք radiobuttons տեգը: Դուք փոխանցում եք Array, List կամ Map, որը պարունակում է հասանելի տարբերակները items հատկությամբ: Եթե օգտագործում եք Map, ծրագրի Map-ի գրառման բանալին օգտագործվում է որպես արժեք, իսկ գրառման արժեքը որպես ցուցադրվող պիտակ: Կարող եք նշել նաև itemValue և itemLabel գույքություններ, ինչպես ցույց է տրված հետևյալ օրինակով:

<tr>
    <td>Sex:</td>
    <td><form:radiobuttons path="sex" items="${sexOptions}"/></td>
</tr>

Տեգ password

Այս տեգը ներկայացնում է HTML input էլեմենտը, որը type ունի password, կապված արժեքով:

<tr>
    <td>Password:</td>
    <td>
        <form:password path="password"/>
    </td>
</tr>

Նկատեք, որ ըստ կանխատրվածի դրա արժեքը ցույց չի տրվում: Եթե անհրաժեշտ է, որ արժեքը ցույց տրվի, ապա կարող եք showPassword հատկությունը սահմանել true, ինչպես ցույց է տրված հաջորդ օրինակով:

<tr>
    <td>Password:</td>
    <td>
        <form:password path="password" value="^76525bvHGq" showPassword="true"/>
    </td>
</tr>

Տեգ select

Այս տեգը ներկայացնում է HTML "select" էլեմենտը: Այն աջակցում է տվյալների կապը ընտրված տարբերակին և օգտագործումը option եւ options ինտեգրալ տեգեր:

Ենթադրենք, որ User ունի հմտությունների ցուցակ: Համապատասխան HTML-ն այսպես կարող է տեսք ունենալ:

<tr>
    <td>Skills:</td>
    <td><form:select path="skills" items="${skills}"/></td>
</tr>

Եթե User-ն ունի հմտություններ սննդագիտություն, ապա HTML "Skills" բաժնի աղբյուրը այսպես կարող է տեսք ունենալ:

<tr>
    <td>Skills:</td>
    <td>
        <select name="skills" multiple="true">
            <option value="Potions">Potions</option>
            <option value="Herbology" selected="selected">Herbology</option>
            <option value="Quidditch">Quidditch</option>
        </select>
    </td>
</tr>

Տեգ option

Այս տեգը ներկայացնում է HTML option էլեմենտը: Այն որոշում է selected հատկությունը ըստ կապակցված արժեքի: Հաջորդ HTML-ը ցույց է տալիս դրա տիպիկ արդյունքը:

<tr>
    <td>House:</td>
    <td>
        <form:select path="house">
            <form:option value="Gryffindor"/>
            <form:option value="Hufflepuff"/>
            <form:option value="Ravenclaw"/>
            <form:option value="Slytherin"/>
        </form:select>
    </td>
</tr>

Եթե User-ի տունը Գրիվենդառն է, ապա HTML "House" բաժնի աղբյուրը կերևա այսպես:

<tr>
    <td>House:</td>
    <td>
        <select name="house">
            <option value="Gryffindor" selected="selected">Gryffindor</option> 
            <option value="Hufflepuff">Hufflepuff</option>
            <option value="Ravenclaw">Ravenclaw</option>
            <option value="Slytherin">Slytherin</option>
        </select>
    </td>
</tr>
  1. Նկատեք selected հատկության ավելացումը:

Տեգ options

Այս տեգը ներկայացնում է HTML option էլեմենտների ցուցակ: Այն որոշում է selected հատկությունը ըստ կապակցված արժեքի: Հաջորդ HTML-ը ցույց է տալիս դրա տիպիկ արտածանքը:

<tr>
    <td>Country:</td>
    <td>
        <form:select path="country">
            <form:option value="-" label="--Please Select"/>
            <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
        </form:select>
    </td>
</tr>

Եթե User-ն ապրում է Մեծ Բրիտանիայում, ապա HTML "Country" բաժնի աղբյուրը կերևա այսպես:

<tr>
    <td>Country:</td>
    <td>
        <select name="country">
            <option value="-">--Please Select</option>
            <option value="AT">Austria</option>
            <option value="UK" selected="selected">United Kingdom</option> 
            <option value="US">United States</option>
        </select>
    </td>
</tr>
  1. Նկատեք selected հատկության ավելացումը:

Ցուցադրված նախորդ օրինակում, option տեգը options տեգի հետ համատեղ օգտագործելիս ստեղծում է նույն ստանդարտ HTML-ը, բայց թույլ է տալիս հստակ նշել ցուցադրվող արժեքը (որտեղ պետք է լինի), ինչպես օրինակ "-- Please Select" շղթան:

items հատկությունը սովորաբար լրացվում է տվյալների հավաքածուի կամ զանգվածի օբյեկտներով: itemValue և itemLabel հղումներն ուղղված են բինայ զույգերի հատկություններին, եթե դրանք նշված են: Եթե ոչ, տվյալների զույգերի օբյեկտները իրենք են փոփոխվում տողերի մեջ: Այնպես, որ Map որպես արժեք կարող է լինել ներառված տարբերակների համար, որի դեպքում Map-ի բանալիներն են ընդունվում որպես արժեք, իսկ Map-ի արժեքներն ընդունվում են որպես պիտակներ: Եթե նաև նշված են itemValue կամ itemLabel (կամ երկուսն էլ), ապա տարրի արժեքի հատկությունը կկիրառվի Map-ի բանալուն և տարրի պիտակային հատկությունը Map-ի արժեքին:

Տեգ textarea

Այս տեգը ներկայացնում է HTML textarea էլեմենտը: Հաջորդ HTML-ը ներկայացնում է դրա տիպիկ արդյունքը:

<tr>
    <td>Notes:</td>
    <td><form:textarea path="notes" rows="3" cols="20"/></td>
    <td><form:errors path="notes"/></td>
</tr>

Տեգ hidden

Այս տեգը ներկայացնում է HTML input էլեմենտը type-ով hidden՝ կապված արժեքով: Որպեսզի փոխանցել չկապակցված թաքնված արժեք, օգտագործեք HTML input տեգը որը type ունի արդեն hidden։ Հաջորդ HTML-ը ցույց է տալիս դրա տիպիկ արդյունքը:

<form:hidden path="house"/>

Երբ որոշվի, որ անհրաժեշտ է house արժեքը փոխանցել որպես թաքնված, HTML-ը կերևա այսպես:

<input name="house" type="hidden" value="Gryffindor"/>

Տեգ errors

Այս տեգը ներկայացնում է դաշտի սխալները HTML span էլեմենտում: Այն տրամադրում է մուտք սխալներին, որոնք ստեղծվել են ձեր տվյալների կարգավորիչում կամ որևէ վալիդատորների կողմից, որոնք կապված են ձեր տվյալների կարգավորիչի հետ:

Ենթադրենք, մեզ անհրաժեշտ է ցուցադրել բոլորս սխալները firstName և lastName դաշտերի համար դաշտերի համար ձևի ուղարկումից հետո: Մենք ունենք վալիդատոր User դասի համար, որը կոչվում է UserValidator, ինչպես ցույց է տրված հաջորդ օրինակով:

Java
public class UserValidator implements Validator {
    public boolean supports(Class candidate) {
        return User.class.isAssignableFrom(candidate);
    }
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
    }
}
Kotlin
class UserValidator : Validator {
    override fun supports(candidate: Class<*>): Boolean {
        return User::class.java.isAssignableFrom(candidate)
    }
    override fun validate(obj: Any, errors: Errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.")
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.")
    }
}

form.jsp կարող է այսպես տեսք ունենալ:

<form:form>
    <table>
        <tr>
            <td>First Name:</td>
            <td><form:input path="firstName"/></td>
            <%-- Ցուցադրեք սխալները firstName դաշտի համար --%>
            <td><form:errors path="firstName"/></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><form:input path="lastName"/></td>
            <%-- Ցուցադրեք սխալները lastName դաշտի համար --%>
            <td><form:errors path="lastName"/></td>
        </tr>
        <tr>
            <td colspan="3">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form:form>

Եթե մենք ուղարկենք ձևը դատարկ firstName և lastName արժեքներով, այդ թվում հոդվածը այսպես կտեսք ունենա:

<form method="POST">
    <table>
        <tr>
            <td>First Name:</td>
            <td><input name="firstName" type="text" value=""/></td>
            <%-- firstName դաշտի համար ցուցադրվող սխալները --%>
            <td><span name="firstName.errors">Field is required.</span></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><input name="lastName" type="text" value=""/></td>
            <%-- lastName դաշտի համար ցուցադրվող սխալները --%>
            <td><span name="lastName.errors">Field is required.</span></td>
        </tr>
        <tr>
            <td colspan="3">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form>

Ի՞նչ կլինի, եթե մենք ցանկանանք ցուցադրել էջի բոլոր սխալների ցուցակը: Հաջորդ օրինակով ցուցադրվում է, որ errors տեգը աջակցում է որոշ հիմնական ֆունկցիաներ:

  • path="*": Ցուցադրում է բոլոր սխալները:

  • path="lastName": Ցուցադրում է բոլոր սխալները, որոնք վերաբերում են lastName դաշտին.

  • Եթե path նշված չէ, ապա ցուցադրվում են միայն օբյեկտի սխալները.

Հաջորդ օրինակով էջի վերևում ցուցադրվում է սխալների ցուցակը, իսկ դաշտերի մոտ՝ ճշգրիտ սխալները:

<form:form>
    <form:errors path="*" cssClass="errorBox"/>
    <table>
        <tr>
            <td>First Name:</td>
            <td><form:input path="firstName"/></td>
            <td><form:errors path="firstName"/></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><form:input path="lastName"/></td>
            <td><form:errors path="lastName"/></td>
        </tr>
        <tr>
            <td colspan="3">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form:form>

HTML-ը այսպես կերևա:

<form method="POST">
    <span name="*.errors" class="errorBox">Field is required.<br/>Field is required.</span>
    <table>
        <tr>
            <td>First Name:</td>
            <td><input name="firstName" type="text" value=""/></td>
            <td><span name="firstName.errors">Field is required.</span></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><input name="lastName" type="text" value=""/></td>
            <td><span name="lastName.errors">Field is required.</span></td>
        </tr>
        <tr>
            <td colspan="3">
                <input type="submit" value="Save Changes"/>
            </td>
        </tr>
    </table>
</form>

spring-form.tld (TLD) գրադարանի տեգերի գրադարանի նկարագիրը ավելացված է spring-webmvc.jar-ում: Տեգերի վերաբերյալ լրիվ տեղեկություններ ստանալու համար ստուգեք API ուղեցույցը կամ դիմեք տեգերի գրադարանի նկարագրությանը:

HTTP մեթոդների փոխարկումը

REST-ի հիմնական սկզբունքը այն է, որ օգտագործվում է "միացվող ինտերֆեյս": Սա նշանակում է, որ բոլոր ռեսուրսների (URL-ների) գործողությունները կարելի է անել նույն չորս HTTP մեթոդներով: GET, PUT, POST եւ DELETE: Յուրաքանչյուր մեթոդի համար HTTP բնութագիրը որոշում է հատուկ սեմնատիկա։ Օրինակ, GET-ը միշտ պետք է լինեն ապահով գործողություն, այսինքն՝ չգործել չընտրովի ազդեցություններ ունենալ, մինչդեռ PUT կամ DELETE-ը պետք է լինեն իդեմպոտենտ, այնպես որ նրանք կրկնեք կարող եք կրկնել այս գործողություններն անընդհատ, բայց վերջնական արդյունքը մեկ և նույնը պետք է լինի։ Չնայած HTTP-ն որոշում է այս չորս մեթոդները, HTML-ն աջակցում է միայն երկու տեսակի: GET եւ POST: Բարեբախտաբար, կա երկու հնարավոր խառնակման ճանապարհ: Դուք կարող եք JavaScript օգտագործել PUT կամ DELETE-ին գործարկելու համար, կամ կարող եք POST անել "իրական" մեթոդը պարամետր որպես (օրինակ, թաքնված դաշտի վանդակում HTML ձևում): Spring-ի HiddenHttpMethodFilter-ը օգտագործում է այս վերջին գործնթացը:

Հատուկ HTTP մեթոդների փոխարկումն ապահովելու համար Spring MVC ձևի տեգը դեռևս աջակցում է HTTP մեթոդների տեղադրման աջակցությանը: Օրինակ, հետևյալ տեքստը վերցված է Pet Clinic-ի օրինակից:

<form:form method="delete">
    <p class="submit"><input type="submit" value="Delete Pet"/></p>
</form:form>

Վերոնշյալ օրինակով գործում է HTTP մեթոդ POST, իսկ "իրական" մեթոդը DELETE պարամետր է ծածկված հարցման հետ: Սա վերցվում է HiddenHttpMethodFilter-ի կողմից, որը սահմանվում է web.xml-ում, ինչպես ցույց է տրված հաջորդ օրինակով:

<filter>
    <filter-name>httpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>httpMethodFilter</filter-name>
    <servlet-name>petclinic</servlet-name>
</filter-mapping>

Հաջորդ օրինակով ցուցադրվում է @Controller ցուցանակ թվարկությամբ համապատասխան մեթոդը:

Java
@RequestMapping(method = RequestMethod.DELETE)
public String deletePet(@PathVariable int ownerId, @PathVariable int petId) {
    this.clinic.deletePet(petId);
    return "redirect:/owners/" + ownerId;
}
Kotlin
@RequestMapping(method = [RequestMethod.DELETE])
fun deletePet(@PathVariable ownerId: Int, @PathVariable petId: Int): String {
    clinic.deletePet(petId)
    return "redirect:/owners/$ownerId"
}

HTML5 Տեգերը

Spring ձևերի տեգերի գիրքը թույլ է տալիս մուտքագրել դինամիկ հատկություններ, որը նշանակում է, որ դուք կարող եք մուտքագրել ցանկացած հատկություններ, որոնք հատուկ են HTML5-ին:

input ձևի տեգը աջակցում է մուտքագրված հատկության տեսակի, այլ text-ից: Սա թույլ է տալիս մասնավոր HTML5-ի նոր մուտքագրված տեսակները, ինչպիսիք են email, date, range և այլ: Նկատեք, որ type='text' գրելը որպես անհրաժեշտություն չկա, քանի որ text տեսակը կանխատրված է:

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