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
դասարակի օրինակ, որը ներկայացված է ստորև:
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;
}
}
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
էլեմենտների, որոնց type
-ը checkbox
է:
Այս բաժինն հիմնված է 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>
Այս օրինակում ենթադրվում է, որ interestList
-ը List
է, որը հասանելի է որպես մոդելատրի փոխման, որում պարունակվում են ընտրության համար արժեքների տողերը: Եթե օգտագործում եք 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>
- Նկատեք
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>
- Նկատեք
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
, ինչպես ցույց է տրված հաջորդ օրինակով:
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.");
}
}
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
ցուցանակ թվարկությամբ համապատասխան մեթոդը:
@RequestMapping(method = RequestMethod.DELETE)
public String deletePet(@PathVariable int ownerId, @PathVariable int petId) {
this.clinic.deletePet(petId);
return "redirect:/owners/" + ownerId;
}
@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
տեսակը կանխատրված է:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ