Spring Framework Spring MVC ni JSP va JSTL bilan ishlatish uchun o'z tarkibiga integratsiyani oladi.
Ko'rinishni aniqlovchilar
JSP ishlab chiqishda odatda InternalResourceViewResolver benini e'lon qilishadi.
InternalResourceViewResolver servlet resurslariga, ayniqsa JSP-ga yo'naltirish uchun ishlatish mumkin. Eng optimal usul sifatida JSP fayllarini "WEB-INF" katalogi ostidagi katalogda joylashtirishni tavsiya etamiz, shunda mijozlar ularga to'g'ridan-to'g'ri kirish imkoniga ega bo'lmaydi.
<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 va JSTL
JSP standart taglar kutubxonasidan (JSTL) foydalanilganda JstlView maxsus ko'rinish sinfini ishlatish kerak, chunki JSTL I18N funksiyalari kabi ishlatilishi uchun ma'lum tayyorgarlikni talab qiladi.
Spring uchun JSP taglar kutubxonasi
Spring so'rov parametrlarini ob'ektlarga bog'lashni ta'minlaydi, bu oldingi boblarda bayon etilgan. JSP sahifalarini ushbu ma'lumotlarni bog'lash xususiyatlari bilan birgalikda ishlashni osonlashtirish uchun Spring bir nechta taglarni taqdim etadi, bu esa ishni yanada osonlashtiradi. Barcha Spring taglari HTML eskalatsiya xususiyatlariga ega, bu belgilarni eskalat qilish uchun yoqilishi yoki o'chirilishi mumkin.
spring.tld (TLD) taglar kutubxonasi deskriptori spring-webmvc.jar ichida. Alohida taglar bo'yicha to'liq ma'lumot olish uchun API qo'llanmasini ko'ring yoki taglar kutubxonasining tasviriga qarang.
Spring uchun forma taglar kutubxonasi
2.0 versiyasidan boshlab, Spring JSP va Spring Web MVC bilan ishlashda forma elementlari uchun ma'lumotlarni bog'lashni qo'llab-quvvatlaydigan to'liq taglar to'plamini taklif qiladi. Har bir tag tegishli HTML tagining atributlar to'plamini qo'llab-quvvatlaydi, bu esa taglarni tanish va intuitiv ishlatishni osonlashtiradi. Taglar tomonidan yaratilgan HTML HTML 4.01/XHTML 1.0 standartlariga mos keladi.
Boshqa forma/kiritish taglar kutubxonalaridan farqli o'laroq, Spring forma taglar kutubxonasi Spring Web MVC bilan birlashtirilib, taglarga sizning kontrolleringiz bilan ishlayotgan ob'ekt va ma'lumotlarga kirish imkonini beradi. Quyidagi misollarda ko'rsatilganidek, forma taglari JSP ishlab chiqishni, o'qishni va saqlashni osonlashtiradi.
Biz forma taglari orqali o'tamiz va har bir tag uchun foydalanish misolini ko'rib chiqamiz. Biz yaratilgan HTML bo'laklarini kiritdik, bu ayrim taglar qo'shimcha izohlarni talab qiladi.
Konfiguratsiya
Forma taglar kutubxonasi spring-webmvc.jar ichida joylashgan. Kutubxona deskriptori spring-form.tld deb ataladi.
Ushbu kutubxonadan taglarni ishlatish uchun JSP sahifangizning yuqori qismiga quyidagi buyruqni qo'shing:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
bu yerda form – ushbu kutubxonadan taglar uchun ishlatmoqchi bo'lgan tag nomi prefiksi.
Forma tag
Ushbu tag HTML "form" elementini vizualizatsiya qiladi va ichki taglarga bog'lanish yo'lini ochadi. U komanda ob'ektini PageContext ichiga joylashtiradi, shunda ichki taglar komanda ob'ektiga murojaat qilishi mumkin. Ushbu kutubxonadagi barcha boshqa taglar form tagining ichki taglari hisoblanadi.
Faraz qilamizki, bizda User nomli soha ob'ekti mavjud. Bu JavaBean va u firstName va lastName kabi xossalarga ega. Uni forma kontrollerining asosiy ob'ekti sifatida ishlatish mumkin, bu form.jsp faylini qaytaradi. Quyidagi misolda ko'rsatilgandek form.jsp qanday ko'rinishda bo'lishi mumkin:
<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 va lastName qiymatlari kontroller tomonidan PageContext ichiga joylashtirilgan komanda ob'ektidan olinadi. form tagi bilan ichki taglarni ishlatish bo'yicha murakkabroq misollar bilan tanishish uchun o'qishni davom eting.
Quyidagi listingda standart forma kabi ko'rinadigan yaratilgan HTML ko'rsatilgan:
<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>
Oldingi JSP da formaning asosiy ob'ekti o'zgaruvchisining nomi command deb taxmin qilingan. Agar siz asosiy forma ob'ektini modelda boshqa nomda joylashtirgan bo'lsangiz (aniq optimal variant), siz formani nomlangan o'zgaruvchiga bog'lab qo'yishingiz mumkin, quyidagi misolda ko'rsatilgandek:
<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>
Teg input
Ushbu teg HTML input elementini va bog'lash qiymatini type='text' bilan visualizatsiya qiladi. Siz HTML5 ga xos turlarni, masalan, email, tel, date va boshqalarni ishlatishingiz mumkin.
Teg checkbox
Ushbu teg HTML input tegi type ni checkbox ga o'rnatadi.
Faraz qilamizki, bizning User da, masalan, yangiliklar obunasi va qiziqishlar ro'yxati kabi shaxsiy foydalanuvchi parametrlari mavjud. Quyidagi misolda Preferences klassi ko'rsatilgan:
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
)
Shunga mos form.jsp fayli quyidagicha ko'rinishi mumkin:
<form:form>
<table>
<tr>
<td>Subscribe to newsletter?:</td>
<%-- Yondashuv 1: Xususiyat turi java.lang.Boolean --%>
<td><form:checkbox path="preferences.receiveNewsletter"/></td>
</tr>
<tr>
<td>Interests:</td>
<%-- Yondashuv 2: Xususiyat array yoki turi 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>
<%-- Yondashuv 3: Xususiyat turi java.lang.Object --%>
<td>
Magic: <form:checkbox path="preferences.favouriteWord" value="Magic"/>
</td>
</tr>
</table>
</form:form>
Teg checkbox uchun uchta usul mavjud, bu sizning checkbox bilan bog'liq barcha ehtiyojlaringizni qondiradi.
-
Birinchi yondashuv: Agar bog'liq qiymat turi
java.lang.Booleanbo'lsa,input(checkbox)truebo'lsacheckeddeb belgilanadi.valueattribute qiymatisetValue(Object)qiymati sifatida qabul qilinadi. -
Ikkinchi yondashuv: Agar bog'liq qiymat turi
arrayyokijava.util.Collectionbo'lsa,input(checkbox)konfiguratsiya qilingansetValue(Object)qiymati bog'liqCollectionda mavjud bo'lsacheckeddeb belgilanadi. -
Uchinchi yondashuv: Har qanday boshqa turdagi bog'liq qiymatni,
input(checkbox)konfiguratsiya qilingansetValue(Object)bog'liq qiymatga teng bo'lsacheckeddeb belgilanadi.
E'tibor bering, har qanday yondashuvda ham bir xil HTML tuzilishi yaratiladi. Quyidagi HTML bo'lagida bir nechta checkboxlar aniqlangan:
<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>
Har bir checkboxdan keyin qo'shimcha yashirin maydonni ko'rishingiz kutish mumkin emas. HTML sahifasidagi checkbox tiklanmagan bo'lsa, uning qiymati serverga forma jo'natilgandan keyin HTTP so'rov parametrlari qismi sifatida yuborilmaydi, shuning uchun Spring forma ma'lumotlarini bog'lash ishlashi uchun HTMLning ushbu xususiyatiga mantiqiy echim kerak. Teg checkbox har bir checkbox uchun pastki chizig'i (_) bilan yashirin parameter kiritishning mavjud amaliyoti Spring ga muvofiq keladi. Buni amalga oshirish orqali siz aslida Spring ga "Checkbox forma ichida ko'rinib turdi, va men forma ma'lumotlarini bog'layotgan ob'ektimning holatini, qanchalik mumkin bo'lsa ham, aks ettirishini istayman" deb aytasiz.
Teg checkboxes
Ushbu teg bir nechta HTML input taglarini type sifatida checkbox qilib visualizatsiya qiladi.
Bu bo'limdagi misol checkbox tegiga asoslangan. Ba'zan JSP sahifasida barcha mumkin bo'lgan hobilarni kiritmaslik afzalroq. Buning o'rniga ish vaqti davomida mavjud imkoniyatlar ro'yxatini belgilash va teggacha uzatish yaxshiroqdir. Teg checkboxes ning vazifasi shundadir. U items xususiyatda mavjud imkoniyatlarni o'z ichiga olgan Array, List yoki Map ni uzatishingiz mumkin. Odatda, bog'liq xususiyat ko'plab foydalanuvchi tanlovlarini o'z ichiga olishi uchun kolleksiyadir. Quyidagi misolda ushbu tegni ishlatgan JSP sahifasi ko'rsatilgan:
<form:form>
<table>
<tr>
<td>Interests:</td>
<td>
<%-- Xususiyat array yoki turi java.util.Collection --%>
<form:checkboxes path="preferences.interests" items="${interestList}"/>
</td>
</tr>
</table>
</form:form>
Ushbu misolda interestList bu model attribute sifatida mavjud List dan iboratligi va tanlash qiymatlari ketma-ketligiga ega ekanligi taxmin qilinadi. Agar Map dan foydalansangiz, Map yozuvi kaliti qiymat sifatida ishlatiladi va yozuv qiymati ekran yorlig'i sifatida ishlatiladi. Siz shuningdek, bor qiymati itemValue va yorliqqa itemLabel orqali namoyish etilishi mumkin bo'lgan custom ob'ektdan foydalanishingiz mumkin.
Teg radiobutton
Ushbu teg HTML input elementini type ni radio qilib visualizatsiya qiladi.
Odatda bir oilada bir necha tag instansiyalarini foydalanish uchun bir xil xususiyatga, lekin turli qiymatlar bilan, bog'lab ishlatiladi, quyidagi misolda ko'rsatilgandek:
<tr>
<td>Sex:</td>
<td>
Male: <form:radiobutton path="sex" value="M"/> <br/>
Female: <form:radiobutton path="sex" value="F"/>
</td>
</tr>
Teg radiobuttons
Ushbu teg bir nechta HTML input elementlarini type ni radio qilib visualizatsiya qiladi.
>Teg checkboxes bilan bir xil, siz mavjud imkoniyatlarni ish vaqti o'zgaruvchisi sifatida uzatishingiz mumkin. Buning uchun radiobuttons tegi ishlatiladi. Siz items xususiyatda mavjud imkoniyatlarni o'z ichiga olgan Array, List yoki Map uzatishingiz mumkin. Agar Map dan foydalansangiz, yozuv kaliti qiymat sifatida ishlatiladi va yozuv qiymati ekran yorlig'i sifatida. itemValue va itemLabel yordamida qiymat va yorliq xususiyatlarini ko'rsatishingiz mumkin bo'lgan custom ob'ektdan foydalanishingiz mumkin, quyidagi misolda ko'rsatilgandek:
<tr>
<td>Sex:</td>
<td><form:radiobuttons path="sex" items="${sexOptions}"/></td>
</tr>
Teg password
Ushbu teg HTML input tegi type='password' ni bog'langan qiymat bilan visualizatsiya qiladi.
<tr>
<td>Password:</td>
<td>
<form:password path="password"/>
</td>
</tr>
E'tibor bering, parol qiymati odatda ko'rsatilmaydi. Agar parol qiymatini ko'rsatishni istasangiz, showPassword attribute qiymatini true qilib o'rnatishingiz mumkin, quyidagi misolda ko'rsatilgandek:
<tr>
<td>Password:</td>
<td>
<form:password path="password" value="^76525bvHGq" showPassword="true"/>
</td>
</tr>
Teg select
Ushbu teg HTML ning "select" elementini visualizatsiya qiladi. U tanlangan imkoniyatni ma'lumotlar bilan bog'lashni qo'llab-quvvatlaydi hamda ichki option va options taglarini ishlatishni qo'llab-quvvatlaydi.
Faraz qilingki, User'ning ko'nikmalar ro'yxati mavjud. Shunga mos HTML quyidagi ko'rinishga ega bo'lishi mumkin:
<tr>
<td>Skills:</td>
<td><form:select path="skills" items="${skills}"/></td>
</tr>
Agar User o'simliklar fanini bilsa, "Skills" satrining HTML manbasi quyidagicha bo'ladi:
<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>
Teg option
Ushbu teg HTML ning option elementini visualizatsiya qiladi. U bog'langan qiymat asosida selected ni o'rnatadi. Quyidagi HTML typik natijani ko'rsatadi:
<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>
Agar User'ning uyi Griffindorda bo'lsa, "House" satrining HTML manbasi quyidagi ko'rinishga ega bo'ladi:
<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>
- E'tibor bering,
selectedattribute qo'shilgan.
Teg options
Ushbu teg bir nechta HTML option elementlarni visualizatsiya qiladi. U bog'langan qiymat asosida selected attribute ni o'rnatadi. Quyidagi HTML typik natijani ko'rsatadi:
<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>
Agar User Buyuk Britaniyada yashasa, "Country" satrining HTML manbasi quyidagi ko'rinishda bo'ladi:
<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>
- E'tibor bering,
selectedattribute qo'shilgan.
Oldingi misolda ko'rsatilgandek, option tegi bilan options tagning birgalikdagi ishlatilishi bir xil standart HTML ni yaratadi, lekin JSP da faqat ekran uchun mo'ljallangan qiymatni ochiq ravishda ko'rsatish imkonini beradi (masalan, oldingi misoldagi standart satrda: "-- Please Select").
items attribute odatda ma'lumotlar elementi ob'ektlarining kolleksiyasi yoki array bo'lishi bilan to'ldiriladi. itemValue va itemLabel ma'lumotlar elementi ob'ektlarining bean xususiyatlariga ishora qiladi, agar ular ko'rsatilgan bo'lsa. Aks holda, ma'lumotlar elementi ob'ektlari satrlar sifatida o'girlishadi. Shu bilan birga, Map elementi belgilanishi mumkin va bu holda Mapning kalitlari qiymatlar sifatida talqin qilinadi, Mapning qiymatlari esa etiketlar sifatida. Agar itemValue yoki itemLabel (yoki ikkalasi ham) ko'rsatilgan bo'lsa, bu holda ma'lumotlar elementi qiymat xususiyati Mapning kalitiga qo'llaniladi va ma'lumotlar elementi yorlig'i xususiyati Mapning qiymatiga qo'llaniladi.
Teg textarea
Ushbu teg HTML textarea elementini visualizatsiya qiladi. Quyidagi HTML da typik natija ko'rsatilgan:
<tr>
<td>Notes:</td>
<td><form:textarea path="notes" rows="3" cols="20"/></td>
<td><form:errors path="notes"/></td>
</tr>
Teg hidden
Ushbu teg HTML input tegi type'ni hidden qilib bog'langan qiymat bilan visualizatsiya qiladi. Bog'lmagan yashirin qiymatni yuborish uchun HTML input tegi type'ni hidden qilib foydalaning. Quyidagi HTML da typik natija ko'rsatilgan:
<form:hidden path="house"/>
Agar house qiymatini yashirin sifatida uzatishga qaror qilsangiz, HTML quyidagi ko'rinishda bo'ladi:
<input name="house" type="hidden" value="Gryffindor"/>
Teg errors
Ushbu teg HTML span elementi ichida maydon xatolarini visualizatsiya qiladi. U sizning kontrolleringizda yaratilgan xatolarga yoki kontrolleringiz bilan bog'langan har qanday validatordan yaratilgan xatolarga kirish imkonini beradi.
Faraz qilamizki, forma jo'natilganidan keyin firstName va lastName maydonlari uchun barcha xato xabarlarini ko'rsatishimiz kerak. Bizda User sinfi instansiyalari uchun validator mavjud, unga UserValidator deb nomlangan, quyidagi misolda ko'rsatilgandek:
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 quyidagicha ko'rinishi mumkin:
<form:form>
<table>
<tr>
<td>First Name:</td>
<td><form:input path="firstName"/></td>
<%-- firstName maydoni uchun xatolarni ko'rsatish --%>
<td><form:errors path="firstName"/></td>
</tr>
<tr>
<td>Last Name:</td>
<td><form:input path="lastName"/></td>
<%-- lastName maydoni uchun xatolarni ko'rsatish --%>
<td><form:errors path="lastName"/></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes"/>
</td>
</tr>
</table>
</form:form>
Agar formani firstName va lastName maydonlarida bo'sh qiymatlar bilan jo'natsak, HTML quyidagi ko'rinishda bo'ladi:
<form method="POST">
<table>
<tr>
<td>First Name:</td>
<td><input name="firstName" type="text" value=""/></td>
<%-- firstName maydoniga bog'liq xatolar ko'rsatilgan --%>
<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 maydoniga bog'liq xatolar ko'rsatilgan --%>
<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>
Agar biz ma'lum bir sahifa uchun barcha xatolar ro'yxatini ko'rsatishni xohlasak-chi? Quyidagi misolda errors tegi shuningdek bir nechta asosiy o'zgarish funktsiyalarini qo'llab-quvvatlaydi.
-
path="*": Barcha xatolarni beradi. -
path="lastName":lastNamemaydoniga bog'liq barcha xatolarni beradi. -
Agar
pathtushirilib ketgan bo'lsa, faqatgina ob'ekt xatolarini beradi.
Quyidagi misolda sahifaning yuqori qismida xatolar ro'yxatini ko'rsatilgan va har bir maydon yaqinida maydon xususidagi xatolar:
<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 quyidagi ko'rinishda bo'ladi:
<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>
Dasturlash kutubxonasi spring-form.tld (TLD) spring-webmvc.jar ga kiritilgan. Alohida taglar bo'yicha to'liq ma'lumot olish uchun API qo'llanmasini ko'ring yoki taglar kutubxonasining tasviriga qarang.
HTTP metodlarini o'zgartirish
REST ning asosiy tamoyili "birlashtirilgan interfeys" dan foydalanish hisoblanadi. Bu shuni anglatadiki, barcha resurslar (URL manzillari) to'rtta bir xil HTTP metodlari bilan boshqarilishi mumkin: GET, PUT, POST va DELETE. Har bir metod uchun HTTP spetsifikatsiyasi aniq semantikani belgilaydi. Masalan, GET har doim xavfsiz operatsiya bo'lishi kerak, ya'ni qo'shimcha ta'sirga ega bo'lmasligi kerak, va PUT yoki DELETE idempotent bo'lishi kerak, ya'ni siz ushbu operatsiyalarni yana va yana takrorlasangiz ham, yakuniy natija bir xil bo'lishi kerak. Garchi HTTP ushbu to'rtta metodni belgilasa-da, HTML faqat in'glikda ikkitasini qo'llab-quvvatlaydi: GET va POST. Yaxshiyamki, ikkita mumkin bo'lgan yondashuv mavjud: siz PUT yoki DELETEni bajarish uchun JavaScript dan foydalanishingiz yoki POSTni "haqiqiy" metodni qo'shimcha parametr sifatida (HTML forma ichida yashirin kiritish maydoniga o'xshatib) bajarishingiz mumkin. Spring dan HiddenHttpMethodFilter ushbu oxirgi qabulni amalga oshiradi. Ushbu filtr oddiy servlet filtri bo'lib, har qanday web dasturlash freymvorki (faqatgina Spring MVC emas) bilan birlashtirilishi mumkin. Ushbu filtrni web.xml ga qo'shing va yashirin method parametri bo'lgan POST mos tushuvchi HTTP metodiga o'zgartiriladi.
HTTP metodlarini o'zgartirish maqsadida Spring MVC forma tegi HTTP metodini o'rnatishni qo'llab-quvvatlash uchun yangilandi. Masalan, quyidagi bo'lak Pet Clinic misolidan olingan:
<form:form method="delete">
<p class="submit"><input type="submit" value="Delete Pet"/></p>
</form:form>
Oldingi misolda HTTP POST metodi amalga oshiriladi va "haqiqiy" metod DELETE so'rov parametri orqali yashirilgan. U web.xml da ko'rsatilgandek HiddenHttpMethodFilter tomonidan qo'lga olinadi:
<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>
Quyidagi misolda @Controller bilan anotatsiyalangan mos tushuvchi metod ko'rsatilgan:
@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 taglari
Spring forma taglar kutubxonasi dinamik atributlarni kiritishga imkon beradi, bu sizga HTML5 ga xos har qanday atributlarni kiritishga imkon beradi.
Forma tegi input type atributini text dan farq qiluvchi qiymat bilan kiritishni qo'llab-quvvatlaydi. Bu sizga HTML5 ga xos yangi turdagi kiritish ma'lumotlarini, masalan, email, date, range va boshqalarni vizualizatsiya qilish imkonini beradi. E'tibor bering, type='text' kiritishga hojat yo'q, chunki text - bu default tur hisoblanadi.
GO TO FULL VERSION