Блог программатора

Our partner
Главная | Последние правки | Поиcк | Все страницы | Редактор | Админ | Печать

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

Проблема - хранение 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>
</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>
</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 (не сжатом!) или любом другом.

Коментарии

Отслеживать новые комментарии

Прокоментируйте эту статью!

Автор:
Введите текст с картинки:
Коментарий


Главная
Софт
Хард
Политеги

SimpleWiki 

Почта 



Мой номер ICQ
 456824974 

Архив:

01.2010
02.2010
03.2010
04.2010
05.2010
06.2010
07.2010


Радио «Анонимус» 
Реклама java
Wed, 30 Jun 2010 13:56:00 -0400
Копипаста: История программных революций от Microsoft
Mon, 14 Jun 2010 04:19:00 -0400
Как восстановить grub2 и mbr
Thu, 10 Jun 2010 17:33:00 -0400
Установить/сменить пароль администратора на свежем postgresql'е
Sun, 23 May 2010 18:18:00 -0400
Президент Виктор Янукович получил по морде венком
Tue, 18 May 2010 09:31:00 -0400
Наконец-то ! Контакт с инопланетянами !
Thu, 18 Mar 2010 08:01:00 -0400
Панкота: группа Флiт
Sat, 13 Mar 2010 08:11:00 -0500

Blog

Add bookmark:
Bookmark and Share



© Komenda Viacheslav
Запрещается перепечатка материалов, без письменного разрешения автора.

Последнее обновление: Tue, 05 May 2009 23:25:58 -0400