* Shorttags и множество блокове
Публикувано на 02 февруари 2015 в раздел Уеб JSP.
При писането на по-сложни уеб страници не е толкова лесно да се отдели статичният от динамичния код. Подходите за решаване на този проблем като цяло са два. Първият е да направим всичко в документа динамичен код и да използваме навсякъде, където трябва да се отпечати статичен HTML, оператор out.print. Това е възможен вариант, но ще се убедите с практиката, че е много трудно осъществим, защото ще ви се наложи на множество места да правите "escape" на символи в текстовите низове. Има и по-добро решение, което води до по-лесно четими документи. То се базира на възможността да отваряме и затваряме <% и %> тагове на множество места в JSP страницата и по този начин да "миксираме" HTML и Java код. Още по-голямо удобство ни носи т.нар. съкратен таг (shorttag) <%=. Когато извършите например <%=var%> то ще бъде еквивалентно на <% out.print(var); %>. По този начин лесно можем да вмъкваме възможно най-компактно динамичен код сред статичния, без това да вреди сериозно на четимостта му (от гледна точка на програмиста естествено, защото в крайния си компилиран вариант няма да има разлика на самата уеб страница).
Друго много важно нещо, което трябва да се знае е, че независимо къде в документа дефинирате променлива, тя е видима във всички динамични тагове в този документ. Тоест когато вие затворите таг с %>, вие не "губите" нищо от локалните променливи, които са дефинирани в него. Още повече - вие можете спокойно да прекъснете част от динамичния код и да довършите този фрагмент в съвсем друг таг. Нека демонстрираме това с пример. Ще направим HTML страница, с която ще отпечатаме таблица с класирането на отборите от българското футболно първенство.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF8" %> <% // Приемаме, че сме попълнили този масив от някоя база от данни String[][] apfg = { {"Номер", "Отбор", "Голова разлика", "Точки"}, {"1", "ЦСКА (София)", "39-10", "44"}, {"2", "Лудогорец (Разград)", "42-13", "41"}, {"3", "Литекс (Ловеч)", "35-24", "32"}, {"4", "Локомотив (София)", "25-23", "32"}, {"5", "Берое (Стара Загора)", "30-21", "31"}, {"6", "Левски (София)", "24-24", "28"}, {"7", "Ботев (Пловдив)", "25-26", "27"}, {"8", "Черно море (Варна)", "22-22", "25"}, {"9", "Славия (София)", "19-24", "20"}, {"10", "Локомотив (Пловдив)", "13-30", "20"}, {"11", "Марек (Дупница)", "8-38", "13"}, {"12", "Хасково (Хасково)", "11-38", "7"}, }; %> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="bg"> <head> <title>Класиране на А ПФГ</title> </head> <body> <p>Класиране за А ПФГ преди пролетния полусезон</p> <table border="1"> <thead> <tr> <th><%=apfg[0][0]%></th> <th><%=apfg[0][1]%></th> <th><%=apfg[0][2]%></th> <th><%=apfg[0][3]%></th> </tr> </thead> <tbody> <% for(int i=1; i<apfg.length; i++){ %> <tr> <% for(int j=0; j<apfg[0].length; j++){ %> <td><%= apfg[i][j] %></td> <% } %> </tr> <% } %> </tbody> </table> </body> </html>
Виждате как на много места използвахме съкратения таг и това направи кода компактен. Освен това дефинираният в началото на страницата масив е очевидно видим и за таговете надолу в кода. Още повече - циклите for от динамичните тагове направиха така, че статичния текст между техните отварящи и затварящи скоби (които забележете, че скобите са в различни <% %> тагове!) да бъде повторен с броя на завъртанията на циклите. Казано по друг начин, трябва да гледате на кода в документа както на едно цяло, като затварянето на динамичен таг последвано от статичен текст и отварянето отново на динамичен таг трябва да приемете просто като отпечатване на статичния текст на екрана - така, както вие бихте го направили с out.print ако не бяхте затваряли динамичните тагове въобще.
Добави коментар