C, PHP, VB, .NET

Дневникът на Филип Петров


* 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 ако не бяхте затваряли динамичните тагове въобще.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*