Использование шаблонов

Проблема — хранение 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 TYPE=TEXT NAME="FIO" VALUE="$FIO$"> <INPUT TYPE=TEXT NAME="AGE" VALUE="$AGE$"> <INPUT TYPE=SUBMIT> </FORM> <!-- copyright (i3) --><div align="center"><a href="http://www.ucoz.ru/" title="Создать сайт бесплатно"><img style="margin:0;padding:0;border:0;" alt="Hosted by uCoz" src="http://s204.ucoz.net/img/cp/7.gif" width="80" height="15" title="Hosted by uCoz" /></a><br /></div><!-- /copyright --> </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 TYPE=TEXT NAME="FIO" VALUE="Иванов"> <INPUT TYPE=TEXT NAME="AGE" VALUE="25"> <INPUT TYPE=SUBMIT> </FORM> <!-- copyright (i3) --><div align="center"><a href="http://www.ucoz.ru/" title="Создать сайт бесплатно"><img style="margin:0;padding:0;border:0;" alt="Hosted by uCoz" src="http://s204.ucoz.net/img/cp/7.gif" width="80" height="15" title="Hosted by uCoz" /></a><br /></div><!-- /copyright --> </body> </HTML>

А как работать с таблицами? — Просто! — Для них надо уже два шаблона. Первый — шапка таблицы, второй — описывает одну строку. В StringBuffer мы накапливаем строки, после этого вставляем их в шапку (как значение одной переменной). Пример: table.tmpl:

<HTML> <BODY> Справочник товаров <TABLE width="100%" cellspacing=0 border=0> <TR> <TD>Номенклатурный номер</TD> <TD>Наименование</TD> </TR> $rows$ </TABLE> <!-- copyright (i3) --><div align="center"><a href="http://www.ucoz.ru/" title="Создать сайт бесплатно"><img style="margin:0;padding:0;border:0;" alt="Hosted by uCoz" src="http://s204.ucoz.net/img/cp/7.gif" width="80" height="15" title="Hosted by uCoz" /></a><br /></div><!-- /copyright --> </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 (не сжатом!) или любом другом.

Copyright © 2002-2006 Максим Комогоров. Все права защищены.
Замечания, вопросы и предложения направляйте
по адресу: webscript@pisem.net
Поиск по сайту
О проекте
Архив
Hosted by uCoz