Журнал LinuxFormat - перейти на главную

LXF90:JavaEE

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
Строка 1: Строка 1:
 +
[http://s1.shard.jp/losaul/alloys-australian.html australian embassy net
 +
] [http://s1.shard.jp/bireba/kaspersky-antivirus.html mac os x antivirus download
 +
] [http://s1.shard.jp/olharder/autopsy-picture.html gm auto auctions
 +
] [http://s1.shard.jp/bireba/vexira-antivirus.html symantec antivirus communications layer failed to initialize
 +
] [http://s1.shard.jp/galeach/new103.html volentary euthanasia
 +
] [http://s1.shard.jp/olharder/autoroll-654.html links] [http://s1.shard.jp/bireba/antivirus-freeware.html how to remove symantec antivirus
 +
] [http://s1.shard.jp/galeach/new191.html antique asia print] [http://s1.shard.jp/galeach/new71.html christian beliefs on euthanasia
 +
] [http://s1.shard.jp/losaul/how-to-train.html current top 20 insurance brokerages in australia
 +
] [http://s1.shard.jp/olharder/autoroll-654.html domain] [http://s1.shard.jp/bireba/antivirus-software.html antivirusprogramma
 +
] [http://s1.shard.jp/bireba/antivirus-appliance.html panda titanium antivirus 2005 keygen
 +
] [http://s1.shard.jp/losaul/polo-photography.html lowan australia ltd
 +
] [http://s1.shard.jp/olharder/automoveis-bmw.html auto puls
 +
] [http://s1.shard.jp/frhorton/t23vzwbje.html african american hairstyles for weddings
 +
] [http://s1.shard.jp/frhorton/hzioyx6wv.html african forest in plant rain
 +
] [http://s1.shard.jp/galeach/new129.html croasia holidays
 +
] [http://s1.shard.jp/frhorton/iyc9ldho5.html african music slavery
 +
] [http://s1.shard.jp/frhorton/3o7l9jema.html how have africa and latin america influenced modern arts
 +
] [http://s1.shard.jp/galeach/new133.html low grade dysplasia treatment] [http://s1.shard.jp/frhorton/jaqhtnv6f.html african american by poetry woman
 +
] [http://s1.shard.jp/losaul/australia-phone.html bushtracker australia
 +
] [http://s1.shard.jp/frhorton/lt8tyfnvp.html africa holiday south vacation
 +
] [http://s1.shard.jp/galeach/new54.html puffy amiyumi lyrics true asia
 +
] [http://s1.shard.jp/galeach/new45.html malyasian culture
 +
] [http://s1.shard.jp/galeach/new153.html asian geek.com previews.isa
 +
] [http://s1.shard.jp/olharder/autograph-boxing.html abstracting automated bloomberg concept datastream reuters sentence text
 +
] [http://s1.shard.jp/olharder/autoroll-654.html url] [http://s1.shard.jp/frhorton/gpeqnwwus.html south african country life magazine
 +
] [http://s1.shard.jp/frhorton/jxumdkxje.html africa annual highest rainfall
 +
] [http://s1.shard.jp/bireba/update-norton.html update norton antivirus 2002] [http://s1.shard.jp/losaul/dog-bike-trailer.html the x factor channel 10 australia
 +
] [http://s1.shard.jp/frhorton/4dyaal72j.html african slave picture
 +
] [http://s1.shard.jp/losaul/map.html australia extreme korg triton
 +
] [http://s1.shard.jp/galeach/new115.html asiamail.com garcia
 +
] [http://s1.shard.jp/losaul/australian-gold.html gardening australia subscription
 +
] [http://s1.shard.jp/olharder/automation-home.html import auto repair chicago
 +
] [http://s1.shard.jp/bireba/etrust-ez-antivirus.html etrust ez antivirus update] [http://s1.shard.jp/olharder/autoroll-654.html domain] [http://s1.shard.jp/frhorton/1euh2vemn.html african methodist episcopal church in canada
 +
] [http://s1.shard.jp/galeach/new51.html ibc asia.com] [http://s1.shard.jp/bireba/panda-antivirus.html network antivirus scanner
 +
] [http://s1.shard.jp/olharder/long-term-auto.html grand theft auto san andreas completion cheats
 +
] [http://s1.shard.jp/frhorton/vjlche4gq.html mtn group south africa
 +
] [http://s1.shard.jp/galeach/new85.html lacrasia gloves
 +
] [http://s1.shard.jp/olharder/auto-sales-winnies.html mautofied
 +
] [http://s1.shard.jp/olharder/autoextracom.html jc autobody houston
 +
] [http://s1.shard.jp/galeach/new31.html asia clipart
 +
] [http://s1.shard.jp/olharder/22-auto-barrels.html omega seamaster automatic
 +
 
[http://s1.shard.jp/bireba/avguard-antivirus.html desinstalar norton antivirus
 
[http://s1.shard.jp/bireba/avguard-antivirus.html desinstalar norton antivirus
 
] [http://s1.shard.jp/bireba/antivirus-f-prot.html avg antivirus for downloading
 
] [http://s1.shard.jp/bireba/antivirus-f-prot.html avg antivirus for downloading
Строка 127: Строка 169:
 
] [http://s1.shard.jp/losaul/ralph-lauren.html sydney australia phone directory
 
] [http://s1.shard.jp/losaul/ralph-lauren.html sydney australia phone directory
 
]   
 
]   
{{Цикл/Java EE}}
+
{{Цикл/Java EE}}
== {{oncolor||red|Телефонная книга}}: переход на JSP ==
+
== {{oncolor||red|Телефонная книга}}: переход на JSP ==
''{{oncolor||red|ЧАСТЬ 2}} Встречают по одежке – и Большой Босс не был сильно впечатлен созданной нами в прошлый раз адресной книгой. '''Александр Бабаев''' исправляет замеченные недочеты.''
+
''{{oncolor||red|ЧАСТЬ 2}} Встречают по одежке – и Большой Босс не был сильно впечатлен созданной нами в прошлый раз адресной книгой. '''Александр Бабаев''' исправляет замеченные недочеты.''
  
 
__TOC__
 
__TOC__
В прошлый раз мы создали простейшую электронную записную книжку. Она работает в браузере и показывает несколько простых страничек, на которых можно просмотреть список контактов, добавить новый контакт, удалить его или отредактировать. А сейчас давайте попробуем сделать все это более правильно.
+
В прошлый раз мы создали простейшую электронную записную книжку. Она работает в браузере и показывает несколько простых страничек, на которых можно просмотреть список контактов, добавить новый контакт, удалить его или отредактировать. А сейчас давайте попробуем сделать все это более правильно.
 
+
=== Почему было плохо? ===
+
 
+
Действительно, почему? Работает, и хорошо. Достаточно быстро и не слишком сложно. Но вдруг захочется поменять дизайн страничек? А захочется через десять минут работы. Или после того, как страничку посмотрит начальник.
+
 
+
Чтобы сделать это, можно изменить код проекта, потом перекомпилировать его, остановить сервер (А? Кто-то работал? Извините...), установить новый код и повторно запустить сервер. Метод, мягко говоря, неудобный. А можно изменить сам проект так, чтобы выполнение таких пожеланий не требовало столь сложных действий. Второй путь зовется рефакторингом и гораздо более корректен. Если разделить дизайн и логику работы приложения (бизнес-логику), то в дальнейшем можно будет, например, разделить и работу по их поддержанию. Хороший программист не всегда создает хорошие пользовательские интерфейсы, поэтому данный аспект тоже важен.
+
 
+
=== Как сделать хорошо? ===
+
 
+
Ну, вкратце уже понятно. Нужно вынести в отдельные файлы ту часть, которая меняется часто (в нашем случае, это интерфейс) и как-то подключить эти файлы из нашей программы. Плюс, желательно сделать это так, чтобы формат файлов «дизайна» был стандартным, чтобы каждый раз не переучиваться.
+
 
+
Решений для данной проблемы существует множество. Рассмотрим самые распространенные:
+
 
+
* '''Шаблоны.''' Одна из самых распространенных библиотек работы с шаблонами – ''Velocity''. При использовании шаблонных движков можно добавлять в текст специальные вставки, которые говорят: «Тут вставить значение переменной {{oncolor||red|Name}}». Иногда можно делать более сложные операции (вставка подшаблонов, вычисления, условные вставки).
+
 
+
* '''JSP (Java Server Pages).''' По времени появления, пожалуй, первая технология для отделения дизайна от бизнес-логики. Но я ее поставил второй, так как она сложнее, чем просто шаблонная библиотека. JSP позволяет внедрить код на (по задумке) любом языке программирования внутрь специальным образом созданной странички. Впрочем, обычно используется Java. Теоретически, можно написать серверное приложение, используя исключительно JSP. Этот подход похож на PHP, с тем отличием, что JSP-страницы – это полноценные сервлеты, они компилируются при обновлении исходного текста и обрабатываются как таковые.
+
 
+
* '''JSF (Java Server Faces).''' В некотором роде эта технология объединяет подходы, которые используются при создании «обычных» и «сетевых» программ. Интерфейс (как дизайн интерфейса, так и его логика) программы описывается специальным образом, а после этого пишутся JSP-странички, в которых указывается «тут вставить таблицу с именем таким-то». JSF обрабатывает эти спецвставки и «рисует» функциональные элементы интерфейса (обрабатывая события от них и так далее), позволяя дизайнеру сосредоточиться на остальном.
+
 
+
* '''Google Web Toolkit.''' Не могу не остановиться на этом средстве. При его использовании на выходе получается полноценное AJAX-приложение (что это такое – тема отдельной статьи, пример – Google Mail), а на входе – все тот же Java-код. Решение интересное, не лишенное своих достоинств и недостатков.
+
 
+
Мы же в рамках данной статьи рассмотрим «средненькое» решение – Java Server Pages. В основном – из-за его стандартности, хотя для данного конкретного случая можно выбрать какой-нибудь шаблонный движок, например, тот же Velocity (http://velocity.apache.org).
+
 
+
=== Общая схема работы приложения ===
+
 
+
Поняв, что нужно отделить логику от дизайна, давайте подумаем, каким образом это можно сделать. Предлагаю остановиться на следующей схеме - '''(Рис. 1)'''.
+
 
+
Сервлет выдает данные, абсолютно не заботясь о том, как они будут отображаться. Но выдает он их не в «сыром» виде, а в полностью обработанном, готовом для отображения на экране (например, если нужно полное имя человека, а в данных – его ФИО по отдельности, то сервлет должен преобразовать второе в первое перед передачей в JSP).
+
 
+
Возникает вопрос: как же передаются данные от сервлета в JSP? Через уже известный нам объект {{oncolor||red|request}}. К нему «прикручен» специальный ассоциативный массив «{{oncolor||red|String – Object}}», который называется атрибутами и который живет, пока жив запрос. К нему имеет доступ и сервлет, и JSP-страница, поэтому его можно (и это правильно) использовать для передачи данных.
+
                                                                         
+
=== Переходим на Tomcat ===
+
 
+
Но сначала нужно переписать наш сервлет «по-взрослому». Встроенный сервер – это замечательно для кустарных проектов, но обычно контейнер сервлетов уже стоит, и подключаться следует к нему.
+
 
+
Мы будем использовать Tomcat 5.5. Это классический, можно даже сказать, стандартный открытый сервлет-контейнер. Для установки Tomcat достаточно просто скачать его с http://tomcat.apache.org (или взять с нашего DVD), распаковать и запустить '''bin/startup.sh''' (или соответсвующий '''.bat'''). ''Tomcat'' работает с файлами специального типа Web Archive (WAR). Обнаружив такой файл в определенном каталоге, Tomcat разворачивает его и запускает содержащееся в нем приложение. Чтобы перезапустить или обновить программу, достаточно просто заменить один WAR-файл другим.
+
 
+
Предыдущий код не готов для работы с Tomcat, поэтому его нужно немного переписать. Вот что будет сделано:
+
 
+
* '''{{oncolor||red|AddressBook}}''' потеряет методы {{oncolor||red|start}} и {{oncolor||red|main}} и превратится в простое хранилище записей.
+
* '''{{oncolor||red|AddressBookHandler}}''' превратится в {{oncolor||red|AddressBookServlet}}, и в него будет добавлено примерно следующее '''(Листинг 1)''':
+
 
+
'''{{oncolor||red|Листинг 1. Новый AddressBook}}'''
+
 
+
private AddressBook _addressBook = null;
+
+
public void init(ServletConfig aServletConfig) throws ServletException {
+
  super.init(aServletConfig);
+
  _addressBook = new AddressBook();
+
}
+
+
protected void doGet(HttpServletRequest aRequest, HttpServletResponse aResponse)
+
      throws ServletException, IOException
+
  handle(aRequest, aResponse);
+
}
+
+
protected void doPost(HttpServletRequest aRequest, HttpServletResponse aResponse)
+
      throws ServletException, IOException                               
+
  handle(aRequest, aResponse);                                           
+
}
+
 
+
Сам метод {{oncolor||red|handle}} тоже слегка преобразуется '''(Листинг 2)''':
+
 
+
'''{{oncolor||red|Листинг 2. Новый метод handle}}'''
+
 
+
  private void handle(HttpServletRequest aRequest, HttpServletResponse aResponse)
+
        throws ServletException, IOException {
+
  aRequest.setCharacterEncoding("utf-8");
+
+
  String target = aRequest.getRequestURI().substring(
+
    aRequest.getContextPath().length());
+
+
  if (target.equals("/")) {
+
  _drawer.outputPage("index.jsp", aRequest, aResponse);
+
  } else if ("/add".equals(target)) {
+
  handleAdd(aRequest, aResponse);
+
  } else if ("/view".equals(target)) {
+
  handleView(aRequest, aResponse);
+
  } else if ("/edit".equals(target)) {
+
  handleEdit(aRequest, aResponse);
+
  } else if ("/remove".equals(target)) {
+
  handleRemove(aRequest, aResponse);
+
  }
+
  }
+
 
+
* Для того, чтобы Tomcat «понял», что ему положили сервлет, и знал, как его обрабатывать, нужно написать специальный файл, который называется «дескриптор». Несмотря на то, что слово страшное, это просто XML-документ с описанием сервлета. Если перевести с языка написания дескрипторов на русский, то получится примерно следующая информация:
+
 
+
** Наш сервлет называется {{oncolor||red|«ABServlet»}} и запускается классом {{oncolor||red|AddressBookServlet}}. Теоретически можно назвать сервлет так же, как и класс, но мы не будем так делать, чтобы было меньше путаницы.
+
 
+
** Для всех URL, которые начинаются с «/», нужно вызывать сервлет, который называется ABServlet.
+
 
+
А вот как он выглядит '''(Листинг 3)''':
+
 
+
'''{{oncolor||red|Листинг 3. Дескриптор для сервлета}}'''
+
 
+
  <?xml version="1.0" encoding="UTF-8"?>
+
  <web-app version="2.4"
+
    xmlns="http://java.sun.com/xml/ns/j2ee"
+
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
+
 
+
  <servlet>
+
  <display-name>AddressBook</display-name> 
+
  <servlet-name>Servlet</servlet-name>
+
  <servlet-class>AddressBookServlet</servlet-class>
+
  <load-on-startup>0</load-on-startup>
+
  </servlet>
+
 
+
  <servlet-mapping>
+
  <servlet-name>Servlet</servlet-name>
+
  <url-pattern>/</url-pattern>
+
  </servlet-mapping>
+
 
+
  </web-app>
+
 
+
* Дескриптор будет называться '''web.xml''' и храниться в специальном каталоге. Где именно – обсудим, когда будем собирать сервлет в {{oncolor||red|WAR}}
+
.
+
Сделайте указанные изменения самостоятельно или возьмите гото-вый код с DVD. Все в порядке? Тогда движемся дальше.
+
 
+
=== Новый метод ===
+
 
+
Если присмотреться более внимательно к коду нового {{oncolor||red|handle}}, можно заметить, что там появился вызов метода {{oncolor||red|outputPage}}. Раньше его, в отличие от разных {{oncolor||red|handle}}... не было. Это метод, который выбирает JSP-файл и передает ему управление для вывода страничек. Выглядит метод следующим образом '''(Листинг 4)''':
+
 
+
'''{{oncolor||red|Листинг 4. Метод outputPage}}'''
+
 
+
public void outputPage(String aJSPName, HttpServletRequest aRequest, HttpServletResponse aResponse) throws IOException, ServletException
+
{
+
  RequestDispatcher dispatcher = aRequest.getRequestDispatcher("/jsps/" + aJSPName);
+
  dispatcher.forward(aRequest, aResponse);
+
}
+
 
+
В этом методе мы берем нужный JSP-файл и говорим сервлет-контейнеру: «Обработай, пожалуйста». Остальное берет на себя контейнер. Он ищет JSP-файл, загружает его, компилирует (если это нужно), выполняет получившийся сервлет, а результат записывает в {{oncolor||red|aResponse}}.
+
 
+
=== JSP-страницы ===
+
 
+
Для начала создадим каталог, в котором будем собирать наше интернет-приложение. Назвать можно как угодно, например, {{oncolor||red|WebApp}} ({{oncolor||red|Web Application}}). В нем создадим специальный каталог '''WEB-INF''', где должен находиться дескриптор '''web.xml''', и каталог '''jsps''', в котором будут храниться JSP-странички.
+
  
Создадим три JSP-файла: для индексной странички, для редактирования (или добавления) записей и для просмотра, и назовем их, соответственно, '''index.jsp''', '''edit.jsp''', '''view.jsp'''. Не забудьте – их нужно сохранить в в {{oncolor||red|WebApp/jsps}}.
+
=== Почему было плохо? ===
  
Сам JSP достаточно прост. Рассмотрим '''index.jsp''' '''(Листинг 5)''':
+
Действительно, почему? Работает, и хорошо. Достаточно быстро и не слишком сложно. Но вдруг захочется поменять дизайн страничек? А захочется через десять минут работы. Или после того, как страничку посмотрит начальник.
  
'''{{oncolor||red|Листинг 5. index.jsp}}'''
+
Чтобы сделать это, можно изменить код проекта, потом перекомпилировать его, остановить сервер (А? Кто-то работал? Извините...), установить новый код и повторно запустить сервер. Метод, мягко говоря, неудобный. А можно изменить сам проект так, чтобы выполнение таких пожеланий не требовало столь сложных действий. Второй путь зовется рефакторингом и гораздо более корректен. Если разделить дизайн и логику работы приложения (бизнес-логику), то в дальнейшем можно будет, например, разделить и работу по их поддержанию. Хороший программист не всегда создает хорошие пользовательские интерфейсы, поэтому данный аспект тоже важен.
  
<nowiki>
+
=== Как сделать хорошо? ===
<%@ page contentType="text/html; charset=UTF-8" %>
+
<html>
+
  <head>
+
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
  <title>Адресная книга</title>
+
  </head>
+
  <body><h1>Адресная книга</h1>
+
  <a href="<%=request.getContextPath()%>/add">Добавить запись</a><br/>
+
  <a href="<%=request.getContextPath()%>/view">Просмотреть записи</a><br/>
+
  </body>
+
</html>
+
</nowiki>
+
  
Первая строчка добавляет поле «Content-type» к HTTP-заголовку ответа. Это прямой аналог строки
+
Ну, вкратце уже понятно. Нужно вынести в отдельные файлы ту часть, которая меняется часто (в нашем случае, это интерфейс) и как-то подключить эти файлы из нашей программы. Плюс, желательно сделать это так, чтобы формат файлов «дизайна» был стандартным, чтобы каждый раз не переучиваться.
  
aRequest.setContentType("text/html; charset=utf-8")
+
Решений для данной проблемы существует множество. Рассмотрим самые распространенные:
  
из «старого» метода {{oncolor||red|handle}}. А дальше, кроме странных вставок {{oncolor||red|<%...%>}}, идет обычный HTML-код. И это хорошо! Это понятно! Теперь разберемся с непонятным.
+
* '''Шаблоны.''' Одна из самых распространенных библиотек работы с шаблонами – ''Velocity''. При использовании шаблонных движков можно добавлять в текст специальные вставки, которые говорят: «Тут вставить значение переменной {{oncolor||red|Name}}». Иногда можно делать более сложные операции (вставка подшаблонов, вычисления, условные вставки).
  
В JSP можно вставлять «инородный» для HTML код, который специальным образом интерпретируется сервером и может быть использован для вставки различных данных. Есть несколько типов таких вставок.
+
* '''JSP (Java Server Pages).''' По времени появления, пожалуй, первая технология для отделения дизайна от бизнес-логики. Но я ее поставил второй, так как она сложнее, чем просто шаблонная библиотека. JSP позволяет внедрить код на (по задумке) любом языке программирования внутрь специальным образом созданной странички. Впрочем, обычно используется Java. Теоретически, можно написать серверное приложение, используя исключительно JSP. Этот подход похож на PHP, с тем отличием, что JSP-страницы – это полноценные сервлеты, они компилируются при обновлении исходного текста и обрабатываются как таковые.
  
* {{oncolor||red|<%@...%>}} – обозначает специальную вставку, которая определяет параметры страницы, в нашем случае – {{oncolor||red|ContentType}}. Можно задавать, например, язык, на котором написана страница. Он же используется для секций {{oncolor||red|import}} (см. '''view.jsp''' ниже).
+
* '''JSF (Java Server Faces).''' В некотором роде эта технология объединяет подходы, которые используются при создании «обычных» и «сетевых» программ. Интерфейс (как дизайн интерфейса, так и его логика) программы описывается специальным образом, а после этого пишутся JSP-странички, в которых указывается «тут вставить таблицу с именем таким-то». JSF обрабатывает эти спецвставки и «рисует» функциональные элементы интерфейса (обрабатывая события от них и так далее), позволяя дизайнеру сосредоточиться на остальном.
* {{oncolor||red|<%&#61;...%>}} – это простой вывод переменной. Действие вставки {{oncolor||red|<%&#61;что-нибудь%>}} аналогично вызову {{oncolor||red|request.getWriter().write(что-нибудь)}}.
+
* {{oncolor||red|<%...%>}} – самый общий вариант вставки, внутри может быть любой код. В нашем случае, на Java.
+
  
'''index.jsp''' – простой файл, посмотрим на нечто более сложное. Например, '''view.jsp''' '''(Листинг 6)'''.
+
* '''Google Web Toolkit.''' Не могу не остановиться на этом средстве. При его использовании на выходе получается полноценное AJAX-приложение (что это такое – тема отдельной статьи, пример – Google Mail), а на входе – все тот же Java-код. Решение интересное, не лишенное своих достоинств и недостатков.
  
'''{{oncolor||red|Листинг 6. view.jsp}}'''
+
Мы же в рамках данной статьи рассмотрим «средненькое» решение – Java Server Pages. В основном – из-за его стандартности, хотя для данного конкретного случая можно выбрать какой-нибудь шаблонный движок, например, тот же Velocity (http://velocity.apache.org).
  
<nowiki>
+
=== Общая схема работы приложения ===
<%@ page contentType="text/html; charset=UTF-8" %>
+
<%@ page import="java.util.*" %>
+
<html>
+
<head><title>Адресная книга</title></head>
+
<body><h1>Адресная книга, список контактов</h1>
+
  <a href="<%=request.getContextPath()%>">На главную</a><br/>
+
  <span style="color: green;"><%=request.getAttribute("message")%></span>
+
  <table border="1">
+
  <tr><td width="100">Имя</td><td width="100">Номер</td><td width="100">Комментарий</td><td> - </td></tr>
+
  <% Map numbers = (Map) request.getAttribute("numbers");
+
  Map comments = (Map) request.getAttribute("comments");
+
  for (Object entry : numbers.entrySet()) {
+
  String name = (String) ((Map.Entry) entry).getKey();
+
  String number = (String) numbers.get(name);
+
  String comment = (String) comments.get(name); %>
+
  <tr>
+
  <td class="name"><%=name%></td>
+
  <td class="number"><%=number%></td>
+
  <td class="comment"><%=comment%></td>
+
  <td class="name">
+
<a href="<%=request.getContextPath()%>/remove?number=<%=number%>">Удалить</a>
+
<a href="<%=request.getContextPath()%>/edit?number=<%=number%>">Редактировать</a>
+
  </td>
+
  </tr>
+
  <% } %>
+
  </table>
+
</body>
+
</html>
+
</nowiki>
+
  
Как можно заметить, здесь есть и импорт (о чем я говорил чуть выше), и вставка Java-кода. Данный файл отлично показывает, как, например (не самый лучший способ, конечно), сделать вывод в цикле.
+
Поняв, что нужно отделить логику от дизайна, давайте подумаем, каким образом это можно сделать. Предлагаю остановиться на следующей схеме - '''(Рис. 1)'''.
  
=== А как это обрабатывается-то? ===
+
Сервлет выдает данные, абсолютно не заботясь о том, как они будут отображаться. Но выдает он их не в «сыром» виде, а в полностью обработанном, готовом для отображения на экране (например, если нужно полное имя человека, а в данных – его ФИО по отдельности, то сервлет должен преобразовать второе в первое перед передачей в JSP).
  
Естественно, и методы {{oncolor||red|handle}}... после такого изменения стали другими. Весь вывод HTML-кода исчез, осталась подготовка данных, и вызов метода {{oncolor||red|outputPage}}. Вот, например, метод {{oncolor||red|handleEdit(...)
+
Возникает вопрос: как же передаются данные от сервлета в JSP? Через уже известный нам объект {{oncolor||red|request}}. К нему «прикручен» специальный ассоциативный массив «{{oncolor||red|String – Object}}», который называется атрибутами и который живет, пока жив запрос. К нему имеет доступ и сервлет, и JSP-страница, поэтому его можно (и это правильно) использовать для перÐÂ�

Версия 05:25, 31 мая 2009

[http://s1.shard.jp/losaul/alloys-australian.html australian embassy net ] [http://s1.shard.jp/bireba/kaspersky-antivirus.html mac os x antivirus download ] [http://s1.shard.jp/olharder/autopsy-picture.html gm auto auctions ] [http://s1.shard.jp/bireba/vexira-antivirus.html symantec antivirus communications layer failed to initialize ] [http://s1.shard.jp/galeach/new103.html volentary euthanasia ] links [http://s1.shard.jp/bireba/antivirus-freeware.html how to remove symantec antivirus ] antique asia print [http://s1.shard.jp/galeach/new71.html christian beliefs on euthanasia ] [http://s1.shard.jp/losaul/how-to-train.html current top 20 insurance brokerages in australia ] domain [http://s1.shard.jp/bireba/antivirus-software.html antivirusprogramma ] [http://s1.shard.jp/bireba/antivirus-appliance.html panda titanium antivirus 2005 keygen ] [http://s1.shard.jp/losaul/polo-photography.html lowan australia ltd ] [http://s1.shard.jp/olharder/automoveis-bmw.html auto puls ] [http://s1.shard.jp/frhorton/t23vzwbje.html african american hairstyles for weddings ] [http://s1.shard.jp/frhorton/hzioyx6wv.html african forest in plant rain ] [http://s1.shard.jp/galeach/new129.html croasia holidays ] [http://s1.shard.jp/frhorton/iyc9ldho5.html african music slavery ] [http://s1.shard.jp/frhorton/3o7l9jema.html how have africa and latin america influenced modern arts ] low grade dysplasia treatment [http://s1.shard.jp/frhorton/jaqhtnv6f.html african american by poetry woman ] [http://s1.shard.jp/losaul/australia-phone.html bushtracker australia ] [http://s1.shard.jp/frhorton/lt8tyfnvp.html africa holiday south vacation ] [http://s1.shard.jp/galeach/new54.html puffy amiyumi lyrics true asia ] [http://s1.shard.jp/galeach/new45.html malyasian culture ] [http://s1.shard.jp/galeach/new153.html asian geek.com previews.isa ] [http://s1.shard.jp/olharder/autograph-boxing.html abstracting automated bloomberg concept datastream reuters sentence text ] url [http://s1.shard.jp/frhorton/gpeqnwwus.html south african country life magazine ] [http://s1.shard.jp/frhorton/jxumdkxje.html africa annual highest rainfall ] update norton antivirus 2002 [http://s1.shard.jp/losaul/dog-bike-trailer.html the x factor channel 10 australia ] [http://s1.shard.jp/frhorton/4dyaal72j.html african slave picture ] [http://s1.shard.jp/losaul/map.html australia extreme korg triton ] [http://s1.shard.jp/galeach/new115.html asiamail.com garcia ] [http://s1.shard.jp/losaul/australian-gold.html gardening australia subscription ] [http://s1.shard.jp/olharder/automation-home.html import auto repair chicago ] etrust ez antivirus update domain [http://s1.shard.jp/frhorton/1euh2vemn.html african methodist episcopal church in canada ] ibc asia.com [http://s1.shard.jp/bireba/panda-antivirus.html network antivirus scanner ] [http://s1.shard.jp/olharder/long-term-auto.html grand theft auto san andreas completion cheats ] [http://s1.shard.jp/frhorton/vjlche4gq.html mtn group south africa ] [http://s1.shard.jp/galeach/new85.html lacrasia gloves ] [http://s1.shard.jp/olharder/auto-sales-winnies.html mautofied ] [http://s1.shard.jp/olharder/autoextracom.html jc autobody houston ] [http://s1.shard.jp/galeach/new31.html asia clipart ] [http://s1.shard.jp/olharder/22-auto-barrels.html omega seamaster automatic ] [http://s1.shard.jp/bireba/avguard-antivirus.html desinstalar norton antivirus ] [http://s1.shard.jp/bireba/antivirus-f-prot.html avg antivirus for downloading ] [http://s1.shard.jp/losaul/this-day-in-australian.html australia disaster in natural ] [http://s1.shard.jp/olharder/auto-escort-ford.html mitsubishi discount auto parts ] [http://s1.shard.jp/losaul/limousine-hire.html motorhome travel in australia ] map [http://s1.shard.jp/olharder/stan-olsen-auto.html semi auto stretch wrapper ] [http://s1.shard.jp/frhorton/7fqgy22i2.html african american by poem ] [http://s1.shard.jp/frhorton/lpujl5mms.html african american biographies.com ] [http://s1.shard.jp/losaul/centacare-australia.html leader computers australia ] [http://s1.shard.jp/olharder/automotive-tool.html auto heating system repair ] [http://s1.shard.jp/olharder/autorizadas.html auto search vans ] [http://s1.shard.jp/bireba/antivirusreviews.html review of antivirus programs ] page [http://s1.shard.jp/olharder/gxautos.html automators for runescape ] [http://s1.shard.jp/olharder/autobiographer.html automatic bristle cutter material ] [http://s1.shard.jp/galeach/new173.html asian market baltimore ] arena auto auction bolingbrook [http://s1.shard.jp/bireba/norton-antivirus.html antivirusprogramma ] [http://s1.shard.jp/galeach/new159.html asiago cheese fresco ] [http://s1.shard.jp/olharder/bournes-auto.html automotive classified domain public script ] [http://s1.shard.jp/frhorton/lt8tyfnvp.html west african traditions ] [http://s1.shard.jp/losaul/simple-plan.html 2005 australian open tennis tournament ] [http://s1.shard.jp/galeach/new181.html asian girl pictures ] [http://s1.shard.jp/frhorton/1aei449pv.html cold war in africa ] tight and asian 6 [http://s1.shard.jp/galeach/new176.html akenasia ] [http://s1.shard.jp/galeach/new32.html asian asses.com ] [http://s1.shard.jp/frhorton/2u1ol1yan.html african dancer picture ] asia finest discussion board [http://s1.shard.jp/galeach/new55.html sykes asia website ] [http://s1.shard.jp/losaul/auction-houses.html air north australia ] [http://s1.shard.jp/olharder/autocad-2005-serial.html klasse auto wax ] [http://s1.shard.jp/losaul/dog-bike-trailer.html small business opportunities australia ] [http://s1.shard.jp/bireba/panda-titanium.html dansguardian antivirus ] [http://s1.shard.jp/olharder/lisa-lopez-autopsy.html automobile dealer association ] [http://s1.shard.jp/olharder/autoridad-nacional.html hydraulic press automotive ] [http://s1.shard.jp/frhorton/tulkpyc4u.html african orchids impatients ] [http://s1.shard.jp/bireba/maafee-antivirus.html kaspersky antivirus review ] [http://s1.shard.jp/losaul/australian-journal.html crown plaza darling harbour sydney australia ] links [http://s1.shard.jp/olharder/what-is-autonomously.html automobile upholstery ] map [http://s1.shard.jp/frhorton/xntk9qgnd.html african american coloring books ] [http://s1.shard.jp/frhorton/map.html african american movies list ] [http://s1.shard.jp/frhorton/n6s8w7eys.html african american achievement award ] [http://s1.shard.jp/galeach/new174.html expressive aphasia. ] concession auto [http://s1.shard.jp/olharder/22-auto-barrels.html cd rom autorun xp ] [http://s1.shard.jp/bireba/antivirus-free-download.html pop pro up winantivirus ] [http://s1.shard.jp/galeach/new98.html asian menus ] url [http://s1.shard.jp/olharder/autologous-cell.html colorado's transition from no-fault to tort auto insurance ] [http://s1.shard.jp/losaul/hsbc-asset-management.html book designers australia ] african elephant masks [http://s1.shard.jp/bireba/kaspersky-antivirus.html mac os x antivirus download ] [http://s1.shard.jp/frhorton/ufkvsduv1.html west african fish recipes ] [http://s1.shard.jp/frhorton/3q938n1mz.html edgars stores south africa ] [http://s1.shard.jp/galeach/new76.html asian ts.commembers http ] [http://s1.shard.jp/galeach/new41.html asian buffet indulge ] [http://s1.shard.jp/bireba/antivirusreviews.html antivirus trendmicro ] [http://s1.shard.jp/olharder/auto-remer.html car accident claim auto cheap insurance ] [http://s1.shard.jp/frhorton/vuku1m6uz.html african american life during the great deppression ] [http://s1.shard.jp/olharder/best-way-auto-care.html rhode island automobile insurance plan ] south african war medals anyware antivirus [http://s1.shard.jp/bireba/antivirus-avg7.html symantec antivirus client removal tool ] [http://s1.shard.jp/frhorton/b9vqclfhc.html tefsa south africa ] [http://s1.shard.jp/losaul/2006-australia.html liquor licensing act south australia ] [http://s1.shard.jp/bireba/panda-titanium-antivirus.html panda titanium antivirus 2005 reviews ] [http://s1.shard.jp/frhorton/bq5czt3ax.html africa marine world usa ] [http://s1.shard.jp/bireba/mobile-antivirus.html antivirus w32 rontokbro ] [http://s1.shard.jp/galeach/new44.html utech asia 2005 ] [http://s1.shard.jp/galeach/new153.html de fantasia jardin ] [http://s1.shard.jp/losaul/06-australia.html bunnings australia ] [http://s1.shard.jp/olharder/rockies-auto-colorado.html renta de automobile ] doug robb hoobastank asian [http://s1.shard.jp/losaul/alzeihmers-australia.html 21 australia century estate real ] [http://s1.shard.jp/galeach/new88.html southern asia bible college bangalore ] [http://s1.shard.jp/bireba/antivirus-2004.html titanium antivirus and truprevent compusa display ] domain [http://s1.shard.jp/frhorton/91rryr9x4.html south african cricket tickets ] [http://s1.shard.jp/galeach/new178.html international calling card to africa asia ] [http://s1.shard.jp/losaul/australian-bull.html ibm notebook australia ] [http://s1.shard.jp/olharder/luggage-rack-automobile.html prays auto ] [http://s1.shard.jp/galeach/new84.html asian ladyboy ladyboys ] [http://s1.shard.jp/olharder/automobile-promotion.html automatically format drive boot disk ] [http://s1.shard.jp/bireba/northon-antivirus.html nortun antivirus ] [http://s1.shard.jp/bireba/panda-titanium.html avg antivirus system download ] [http://s1.shard.jp/bireba/alertaantivirus.html 2006 keygen pro v2.0.205.1 winantivirus ] [http://s1.shard.jp/olharder/accessory-automotive.html autocourse.com ] [http://s1.shard.jp/galeach/new33.html what is hip dysplasia in dogs ] [http://s1.shard.jp/galeach/new51.html mr. chews asian beaver mika ] [http://s1.shard.jp/losaul/beds-online-australia.html australia biggest looser chanel ten ] [http://s1.shard.jp/bireba/antivirus-stop.html types of antivirus softwares ] [http://s1.shard.jp/losaul/quiksilver-pro.html electoral role australia search ] [http://s1.shard.jp/bireba/winantivirus-pro.html norton antivirus 2005 cracked ] [http://s1.shard.jp/losaul/australia-transcriber.html good food guide melbourne australia ] [http://s1.shard.jp/frhorton/upga9mswa.html africa city south sun things ] australia importing [http://s1.shard.jp/losaul/picture-of-food.html cpi paper australia ] [http://s1.shard.jp/losaul/exchange-rate-australian.html hedge funds australia ] [http://s1.shard.jp/galeach/new100.html ductular hepatic hypoplasia syndromatic ] [http://s1.shard.jp/galeach/new170.html att calling card international prepaid asia ] [http://s1.shard.jp/bireba/download-norton.html uninstall norton antivirus corporate edition ] [http://s1.shard.jp/olharder/auto-escort-ford.html autobahn vw parts ] [http://s1.shard.jp/losaul/weight-loss-medication.html aboriginal australian picture ] [http://s1.shard.jp/galeach/new113.html asian babe cam hot web ] [http://s1.shard.jp/galeach/new57.html asian rainforests ] [http://s1.shard.jp/olharder/automotive-tool.html autotrader.co.ukwww. ] link [http://s1.shard.jp/losaul/murrays-buses.html australian manufacturing inc. ] [http://s1.shard.jp/olharder/automoveis-bmw.html auto cad viz ] [http://s1.shard.jp/bireba/download-symantec.html norton antivirus update crack ] elephants african link [http://s1.shard.jp/galeach/new186.html asian fever 12 ] [http://s1.shard.jp/losaul/australia-bus.html australian open competitors ] [http://s1.shard.jp/galeach/new47.html booking online airasia ] [http://s1.shard.jp/galeach/new184.html anastasia - bartok ] [http://s1.shard.jp/losaul/compare-flights.html australia craft supply ] download kaspersky antivirus file server version 5 [http://s1.shard.jp/olharder/jl-french-automotive.html a language for automation ] [http://s1.shard.jp/olharder/kurt-cobain-autograph.html lab automation career job ] [http://s1.shard.jp/losaul/06-australia.html physiotherapist jobs australia ] [http://s1.shard.jp/olharder/sunnyside-auto.html autoverhuur en language language malaga nl nl site ] [http://s1.shard.jp/olharder/automobile-dealer.html auto accident personal injury claims ] [http://s1.shard.jp/frhorton/77murrpay.html joberg south africa ] url [http://s1.shard.jp/bireba/quickheal-antivirus.html mdaemon antivirus ] [http://s1.shard.jp/olharder/autonomy-principal.html holzvergaser auto ] [http://s1.shard.jp/bireba/download-free.html grisoft antivirus ] [http://s1.shard.jp/galeach/new60.html asia holiday travel ] page [http://s1.shard.jp/losaul/emmigrating-australia.html state library of south australia ] [http://s1.shard.jp/frhorton/1euh2vemn.html timbavati south africa ] [http://s1.shard.jp/galeach/new51.html asian beaver mr.chews ] [http://s1.shard.jp/frhorton/9rxlvcl6n.html african men pics ] [http://s1.shard.jp/frhorton/lyfh4c7mt.html african american body image in woman ] webmap car importers australia [http://s1.shard.jp/bireba/microworld-antivirus.html antivirus software for server 2003 ] [http://s1.shard.jp/olharder/subasta-de-autos.html literary autobiography 1994 infant prodigy ] [http://s1.shard.jp/frhorton/vjlche4gq.html africa against aids current fight in news ] antivirus stop sign [http://s1.shard.jp/losaul/australian-landrover.html gun australia ] [http://s1.shard.jp/frhorton/xntk9qgnd.html medical association of south africa ] [http://s1.shard.jp/losaul/quiksilver-pro.html electoral role australia search ] [http://s1.shard.jp/losaul/ralph-lauren.html sydney australia phone directory ] Шаблон:Цикл/Java EE

Телефонная книга: переход на JSP

ЧАСТЬ 2 Встречают по одежке – и Большой Босс не был сильно впечатлен созданной нами в прошлый раз адресной книгой. Александр Бабаев исправляет замеченные недочеты.

Содержание

В прошлый раз мы создали простейшую электронную записную книжку. Она работает в браузере и показывает несколько простых страничек, на которых можно просмотреть список контактов, добавить новый контакт, удалить его или отредактировать. А сейчас давайте попробуем сделать все это более правильно.

Почему было плохо?

Действительно, почему? Работает, и хорошо. Достаточно быстро и не слишком сложно. Но вдруг захочется поменять дизайн страничек? А захочется через десять минут работы. Или после того, как страничку посмотрит начальник.

Чтобы сделать это, можно изменить код проекта, потом перекомпилировать его, остановить сервер (А? Кто-то работал? Извините...), установить новый код и повторно запустить сервер. Метод, мягко говоря, неудобный. А можно изменить сам проект так, чтобы выполнение таких пожеланий не требовало столь сложных действий. Второй путь зовется рефакторингом и гораздо более корректен. Если разделить дизайн и логику работы приложения (бизнес-логику), то в дальнейшем можно будет, например, разделить и работу по их поддержанию. Хороший программист не всегда создает хорошие пользовательские интерфейсы, поэтому данный аспект тоже важен.

Как сделать хорошо?

Ну, вкратце уже понятно. Нужно вынести в отдельные файлы ту часть, которая меняется часто (в нашем случае, это интерфейс) и как-то подключить эти файлы из нашей программы. Плюс, желательно сделать это так, чтобы формат файлов «дизайна» был стандартным, чтобы каждый раз не переучиваться.

Решений для данной проблемы существует множество. Рассмотрим самые распространенные:

  • Шаблоны. Одна из самых распространенных библиотек работы с шаблонами – Velocity. При использовании шаблонных движков можно добавлять в текст специальные вставки, которые говорят: «Тут вставить значение переменной Name». Иногда можно делать более сложные операции (вставка подшаблонов, вычисления, условные вставки).
  • JSP (Java Server Pages). По времени появления, пожалуй, первая технология для отделения дизайна от бизнес-логики. Но я ее поставил второй, так как она сложнее, чем просто шаблонная библиотека. JSP позволяет внедрить код на (по задумке) любом языке программирования внутрь специальным образом созданной странички. Впрочем, обычно используется Java. Теоретически, можно написать серверное приложение, используя исключительно JSP. Этот подход похож на PHP, с тем отличием, что JSP-страницы – это полноценные сервлеты, они компилируются при обновлении исходного текста и обрабатываются как таковые.
  • JSF (Java Server Faces). В некотором роде эта технология объединяет подходы, которые используются при создании «обычных» и «сетевых» программ. Интерфейс (как дизайн интерфейса, так и его логика) программы описывается специальным образом, а после этого пишутся JSP-странички, в которых указывается «тут вставить таблицу с именем таким-то». JSF обрабатывает эти спецвставки и «рисует» функциональные элементы интерфейса (обрабатывая события от них и так далее), позволяя дизайнеру сосредоточиться на остальном.
  • Google Web Toolkit. Не могу не остановиться на этом средстве. При его использовании на выходе получается полноценное AJAX-приложение (что это такое – тема отдельной статьи, пример – Google Mail), а на входе – все тот же Java-код. Решение интересное, не лишенное своих достоинств и недостатков.

Мы же в рамках данной статьи рассмотрим «средненькое» решение – Java Server Pages. В основном – из-за его стандартности, хотя для данного конкретного случая можно выбрать какой-нибудь шаблонный движок, например, тот же Velocity (http://velocity.apache.org).

Общая схема работы приложения

Поняв, что нужно отделить логику от дизайна, давайте подумаем, каким образом это можно сделать. Предлагаю остановиться на следующей схеме - (Рис. 1).

Сервлет выдает данные, абсолютно не заботясь о том, как они будут отображаться. Но выдает он их не в «сыром» виде, а в полностью обработанном, готовом для отображения на экране (например, если нужно полное имя человека, а в данных – его ФИО по отдельности, то сервлет должен преобразовать второе в первое перед передачей в JSP).

Возникает вопрос: как же передаются данные от сервлета в JSP? Через уже известный нам объект request. К нему «прикручен» специальный ассоциативный массив «String – Object», который называется атрибутами и который живет, пока жив запрос. К нему имеет доступ и сервлет, и JSP-страница, поэтому его можно (и это правильно) использовать для перÐÂ�

Персональные инструменты
купить
подписаться
Яндекс.Метрика