Проучване - Dev, Blog Archive, JSTL Шаблони за разработване на уеб приложения в java

JSTL: Шаблони за разработване на уеб приложения в java. Част 1

В този пример, ако променливата fio не е била предоставена на входа на страницата, тогава ще се покаже фразата „НЯМА ДАННИ“. Атрибутът escapeXML служи за бягство (замяна на специални xml знаци: по-голямо от, по-малко от, кавички ...) с техните обекти (т.е. ...)

След като научихте как да показвате променливи, е време да помислите как да създадете тези променливи. В допълнение към очевидните опции: от параметри на заявка, от обект на java bean с логика, от сесия, има и начин да поставите някаква променлива в един от горните контексти в страницата. Използваме тага c:set за това. Като негови атрибути са посочени името на контекста, където искаме да поставим променливата, името на променливата и стойността:

Тук показвам някои трудни моменти в работата с jstl. Първо, забележете как имената на контекста се различават между операциите put (set) и extract (out). В първия случай трябва да напиша думата session, а във втория случай sessionScope. Вижте също, че създадох променливата petyan във всичките четири контекста едновременно. Когато показвам тази променлива на екрана, не съм посочил името на контекста, към който принадлежи променливата. В този случай правилото за търсене на желания контекст работи: търсим променлива вътре в pageScope, ако не бъде намерена в requestScope, ако отново не е намерена в sessionScope и накрая в applicationScope.

Има друг вариант на синтаксиса на оператора c: set, когато трябва да зададете стойността на свойство на някакъв java bean, вграден в страницата.

Сега нека да разберем как да работим с цикли в JSTL. Има два вида примки: за преминаванеелементи от някакъв списък (за преминаване на всички числа в сегмента ОТ и ДО). А вторият вид се използва за преминаване през списъка с токени (части, на които низът е разделен въз основа на някакъв разделителен знак). Първият таг “c:ForEach” има цели 6 атрибута, които контролират работата му, но нито един от тях не е задължителен. Работата е там, че c:ForEach също е предназначен за преминаване през елементите на определен списък, например така:

На първо място, въведох няколко нови метода (като реални свойства) в класа HelloMachineBean, описан по-горе, които връщат масив от елементи и списък с елементи.

Както можете да видите, трябваше да използвам два атрибута на маркера ForEach - това са елементи, които играят ролята на източник на данни и var - променлива, в която елементите на масива / списъка ще бъдат последователно поставени.

Втората версия на цикъла ForEach е проектирана да итерира цели числа в диапазона от X до Y, например по този начин:

Моля, имайте предвид, че мога да използвам индекса (квадратни скоби) за достъп до елементите не само на масив, но и на списък.

Друг атрибут за маркера forEach е стъпка. Целта му е да контролира размера на стъпката, с която се извършва преминаването през елементите на масива. Моля, обърнете внимание, че в следния пример атрибутът стъпка може да работи правилно не само когато цикълът итерира числата в сегмента от X до Y, но също и когато се итерира съдържанието на някаква колекция от елементи.

Но можем да постигнем истинска гъвкавост само когато включеното съдържание е динамично. Нека проверим дали импортирането може да "включи" в jsp страницата резултата от друга jsp страница:

Страница за включване (footer.jsp):

Имайте предвид, че тук имам достъп и искам да покажа променливата externalVar. Откъде идва тяидвам от?

А сега пример за кода на главната страница (имайте предвид, че посочих обхвата на променливата externalVar - тя ще бъде достъпна за всички страници, обслужващи тази заявка):

По подобен начин променливите могат да се предават от вложена страница към външна (не забравяйте за контекста на променливата).

Естествено тези променливи, които са били предадени на основния скрипт от html формата, също ще бъдат достъпни на включената страница.

Последният атрибут за импортиране е varReader. Ако го посочим, тогава резултатът от вмъкването на страницата няма нито да бъде показан, нито поставен в променливата var string, а ще бъде достъпен само при четене на потока varReader.