Введення в технологію шаблонів

Developers.com.ua

Проблема – зберігання html-коду в тілі скрипта. – Нам необхідно відокремити код скрипта (java-сервлет, perl, php) від html коду – щоб дизайнери могли вносити зміни. При цьому нам треба (наприклад) вставляти в сторінку результати виконання запитів до sql базі. Або наприклад нам потрібно розісланому користувачам сайту лист види: "Шановні Іван Іванович …". Для цього нам треба щоб документ (html сторінка) зберігався на диску, а ми при необхідності завантажували її в пам'ять якимось чином заповнювали.

Тобто ми підчитую файл-шаблон, підставляємо в нього обчислені значення змінних і видаємо його як результат роботи скрипта. Як куди і з якому вигляді підставляються наші дані? – Дуже просто – ми вважали в String весь html код і, наприклад, делем звичайну текстову заміну – $ AGE $ замінюємо на обчислень значення 25. AGE Виділенно значками $ щоб випадково не замінити щось зайве:).

Таку роботу по заміні якраз і виконують Template бібліотеки класів. Існує безліч бібліотек класів реалізують шаблонні технології, наприклад webmacro.

Спосіб виділення змінної шаблону скрізь різний – в webmacro, наприклад, мінлива AGE в тексті html-коду виглядала б як $ AGE, у разі мого класу – $ AGE $.

Розглянемо докладніше як це працює. Наприклад так ми можемо зробити форму редагування з default-значеннями в полях вводу:

Створимо шаблон (файл myform.tmpl):



<HTML>
<BODY>
<FORM>
<INPUT ENGINE=TEXT NAME=”FIO” VALUE=”$FIO$”>
<INPUT ENGINE=TEXT NAME=”AGE” VALUE=”$AGE$”>
<INPUT ENGINE=SUBMIT>
</FORM>
</BODY>
</HTML>

а у вихідному коді напишемо:



public final void doGet(HttpServletRequest req
,HttpServletResponse res)
throws ServletException,IOException

{ Template t=new Template(new File(“myform.tmpl”));t.addVar ("FIO", "Іванов");
t.addVar(“AGE”,”25″);

try { res.setContentType(“text/html”);
PrintWriter out = res.getWriter();
out.println(t.getPage());
} catch(Exception e)
{ System.out.println(“Exception: “+e);}
}

і в результаті сервлет видасть html-код:



<HTML>
<BODY>
<FORM><INPUT ENGINE=TEXT NAME="FIO" VALUE="Іванов">
<INPUT ENGINE=TEXT NAME=”AGE” VALUE=”25″>
<INPUT ENGINE=SUBMIT>
</FORM>
</BODY>
</HTML>

А як працювати з таблицями? – Просто! – Для них треба вже два шаблони. Перший – шапка таблиці, другий – описує один рядок. У StringBuffer ми накопичуємо рядки, після цього вставляємо їх у шапку (як значення однієї змінної). Приклад:

table.tmpl:



<HTML>
<BODY>Довідник товарів
<TABLE width=”100%” cellspacing=0 border=0>
<TR><TD> Номенклатурний номер </ TD><TD> Найменування </ TD>
</TR>
$rows$
</TABLE>
</BODY>
</HTML>

row.tmpl:



<TR>
<TD>$ITOVAR$</TD>
<TD>$HTOVAR$</TD>
</TR>

select.java:


public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException,IOException

{ Template tbl=new Template(new File(“table.tmpl”));
Template row=new Template(new File(“row.tmpl”));
StringBuffer rows=new StringBuffer();

try { Statement statement =
(someconnection.getConnection()).createStatement();

String str=”SELECT * FROM TOVAR”;
ResultSet rs = statement.executeQuery(str);
ResultSetMetaData md = rs.getMetaData();

int cnt= md.getColumnCount();
while(rs.next())
{ for(int i = 1; i <= Cnt; i + +) {String name = md.getColumnName (i); String s = rs.getString (i); if (s == null) s = "”;
if(s.trim().length()==0) s=” “;
row.addVar(name,s);
}
rows.append(row.getPage());
}
rs.close();
statement.close();

} catch(SQLException _ex) { System.out.println(“”+_ex);}
catch(Exception _ex) { System.out.println(“”+_ex);}

tbl.addVar(“rows”,rows.toString());

res.setContentType(“text/html”);
try{ res.getWriter().println(tbl.getPage());
} catch(Exception e) {System.out.println(“”+e);}
}

Достонство даної технології – такмі чином ми можемо генерувати не
тільки html текст але і дані в форматі PDF (не стислому!) або будь-якому іншому.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*