| ||||||||||||||||
| ||||||||||||||||
| ||||||||||||||||
Введение в технологию шаблонов Проблема - хранение html-кода в теле скрипта. - Нам необходимо отделить код скрипта (java-сервлет, perl, php) от html кода - чтобы дизайнеры могли вносить изменения. При этом нам надо (например) вставлять в страничку результаты выполнения запросов к sql базе. Или например нам нужно разослать пользователся сайта письмо вида: "Уважаемы Иван Иванович...". Для этого нам надо чтобы документ (html страничка) хранился на диске, а мы при необходимости загружали ее в память каким-то образом заполняли. <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 мы накапливаем строки, после этого вставляем их в шапку (как значение одной переменной). Пример: <HTML> <BODY> Справочник товаров 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 (не сжатом!) или любом другом. |
|
| ||||||||||||||||
|