Гобелен пытается максимально использовать доступные возможности Java. Например, все страницы Гобелена просто POJO. Он не требует каких-либо пользовательских интерфейсов или базового класса для написания приложения. Вместо этого он использует аннотацию (облегченный вариант для расширения функциональности класса Java) для предоставления функций. Он основан на проверенном в бою API сервлетов Java и реализован в виде фильтра сервлетов. Он предоставляет новое измерение веб-приложению, и программирование довольно простое, гибкое, понятное и надежное.
Workflow
Давайте обсудим последовательность действий, выполняемых при запросе страницы гобелена.
Шаг 1 — Сервлет Java получает запрос страницы. Этот сервлет Java настроен таким образом, что входящий запрос будет перенаправлен на гобелен. Конфигурация выполняется в файле web.xml, как указано в следующей программе. Filter и Filter Mapping tag перенаправляет весь запрос в Tapestry Filter .
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>My Tapestry Application</display-name> <context-param> <param-name>tapestry.app-package</param-name> <param-value>org.example.myapp</param-value> </context-param> <filter> <filter-name>app</filter-name> <filter-class>org.apache.tapestry5.TapestryFilter</filter-class> </filter> <filter-mapping> <filter-name>app</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
Шаг 2 — Фильтр Tapestry вызывает сервис HttpServletRequestHandler с помощью метода Service () .
Шаг 3 — HttpServletRequestHandler сохраняет запрос и ответ в RequestGlobals . Он также упаковывает запрос и ответ в качестве объекта запроса и ответа и отправляет его в RequestHandler.
Шаг 4 — RequestHandler — это абстракция поверх HttpServletRequest Servlet API. Некоторые из характерных особенностей гобелена сделаны в разделе RequestHandler . Функцию гобелена можно расширить, написав фильтр в RequestHandler. RequestHandler предоставляет несколько встроенных фильтров, которые включают в себя:
-
CheckForUpdates Filter — отвечает за перезагрузку класса в реальном времени. Этот фильтр проверяет классы Java на наличие изменений и обновляет приложение по мере необходимости.
-
Фильтр локализации — определяет местоположение пользователя и обеспечивает поддержку локализации для приложения.
-
Фильтр StaticFiles — определяет статический запрос и прерывает процесс. Как только процесс прерван, сервлет Java берет на себя управление и обрабатывает запрос.
-
Фильтр ошибок — ловит необнаруженное исключение и представляет страницу отчета об исключении.
CheckForUpdates Filter — отвечает за перезагрузку класса в реальном времени. Этот фильтр проверяет классы Java на наличие изменений и обновляет приложение по мере необходимости.
Фильтр локализации — определяет местоположение пользователя и обеспечивает поддержку локализации для приложения.
Фильтр StaticFiles — определяет статический запрос и прерывает процесс. Как только процесс прерван, сервлет Java берет на себя управление и обрабатывает запрос.
Фильтр ошибок — ловит необнаруженное исключение и представляет страницу отчета об исключении.
RequestHandler также изменяет и сохраняет запрос и ответ в RequestQlobals и вызывает службу MasterDispatcher.
Шаг 5 — MasterDispatcher отвечает за рендеринг страницы, вызывая несколько диспетчеров определенного порядка. Четыре главных диспетчера, вызываемые MasterDispatcher, следующие:
RootPath Dispatcher — распознает корневой путь «/» запроса и отображает его так же, как стартовая страница.
Диспетчер активов — он распознал запрос актива (актива Java), проверив шаблон URL / assets / и отправил запрошенные активы в виде потоков байтов.
PageRender Dispatcher — основная часть операций с гобеленами выполняется в PageRender Dispatcher и следующем диспетчере компонентов Dispatcher. Этот диспетчер распознает конкретную страницу этого запроса и его контекст активации (дополнительная информация). Затем он отображает эту конкретную страницу и отправляет ее клиенту. Например, если URL-адрес запроса / product / 12123434, диспетчер проверит, доступен ли какой-либо класс с именем product / 12123434. Если он найден, он вызывает класс product / 12123434, генерирует ответ и отправляет его клиенту. Если нет, он проверяет класс продукта. Если найдено, он вызывает класс продукта с дополнительной информацией 121234434, генерирует ответ и отправляет его клиенту. Эта дополнительная информация называется «Активация контекста». Если класс не найден, он просто перенаправляет запрос в диспетчер компонентов.
Компонент Dispatcher — Компонент Dispatcher сопоставляет URL-адрес страницы с шаблоном — / <class_name> / <component_id>: <event_type> / <активации_context>. Например, / product / grid: sort / asc представляет класс продукта, компонент сетки, тип sortevent и контекст активации asc. Здесь event_type является необязательным, и если ничего не указано, будет инициировано действие типа события по умолчанию. Обычно ответ диспетчера компонентов заключается в отправке перенаправления клиенту. В основном, перенаправление будет соответствовать PageRender Dispatcher в следующем запросе, и правильный ответ будет отправлен клиенту.