Перейти к содержимому

Как работает веб приложение java

  • автор:

Java WEB

При разработке WEB приложения можно использовать одну из наиболее популярных технологий, к которым следует отнести Java Servlets, Java Server Page, PHP, ASP.NET, Node.js. В статье приводятся преимущества и недостатки данных технологий при разработки Web приложения.

Web приложения реализуют бизнес-логику на стороне сервера и генерируют код для клиента. Т.е. клиент, как правило, является тонким, без каких-либо серьезных ресурсов обработки информации на сервере. Также у всех этих приложений одинакова архитектура взаимодействия сервера и клиента и общий протокол взаимодействия — HTTP.

Схематично логика работы WEB приложения представлена на рисунке.

Как следует из рисунка, работа приложений в облаке происходит в три основных этапа:

  • Запрос клиента. Браузер (клиент) инициирует запрос к серверной части WEB-приложения.
  • Обработка запроса сервером. После получения запроса сервер приложения проводит обработку запрашиваемой информации.
    Если запрашивается статический ресурс типа страницы HTML, рисунок, документ, то данная информация форматируется согласно протоколу HTTP и передается клиенту в качестве ответа.
    Если требуется динамический ресурс, то запрос передается на обработку соответствующему серверному приложению («контейнеру» WEB приложения), где и происходит дальнейшая обработка параметров запроса.
  • Ответ клиенту. После обработки запроса и формирования ответа, данные передаются браузеру (клиенту) с использованием протокола HTTP. Ответ содержит данные (обычно в виде HTML кода, иногда двоичные данные), а также дополнительные параметры в заголовке HTTP ответа.

Данный подход к разработке приложений создает определенные сложности, основной из которых является отсутствие состояния WEB приложения (так называемое stateless programming). Это означает, что приложение работает исключительно в режиме запрос-ответ, не имея данных о предыдущих шагах пользователя или какой-либо иной постоянной информации. Для решения данной проблемы в различных WEB технологиях используется понятие пользовательской сессии, которая позволяет хранить определенную информацию на сервере в течение сеанса работы пользователя.

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

Выбор технологии

Какую выбрать технологию для разработки WEB приложения целиком и полностью зависит от руководителя проекта (конструктора, разработчика). Можно, конечно, освоить новую, самую модную на текущий момент технологию, для расширения своего кругозора и разработки в ней еще одного приложения. Это особенно оправданно, если за все это платят хорошие деньги. Но чтобы стать после этого хорошим специалистом в данной области требуется значительное время.

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

В каком случае проект может оказаться неудачным, с чем это может быть связано? Может быть с неумелым управлением? Или с неправильным выбором платформы, о чем стало известно на последнем этапе. Причин может несколько, а виновных нет. Как известно, только у Побед много родителей, а вот Поражение всегда сирота.

Управление проектом

Выбор конкретного подхода для разработки WEB приложения полностью зависит от руководителей проектов (конструкторов, разработчиков и т.п.), их опыта и знаний. Трудно сказать, что та или иная технология может решить все проблемы. У каждой есть определенные преимущества и недостатки.

В статье рассмотриваются различные подходы к созданию WEB приложений, их достоинства и недостатки, а также рассмотрены конкретные платформы. Использование различных подходов рассматривается с точки зрения построения сложных гетерогенных глобальных систем. Не все популярные технологии приводятся в данной статье.

Серверная часть приложения

Для различных платформ создания WEB приложений необходимо выделить два основных существующих подхода к разработке серверной части:

  1. Формирование кода в виде текста определенного формата.
  2. Встраивание кода в определенные шаблоны.

Первый подход предоставляет наибольшие возможности по повышению производительности. Он предусматривает передачу всех данных о запросе непосредственно серверу, который может как сформировать ответ со страницей для пользователя, так и открыть на передачу поток двоичных данных, например для передачи изображения. Однако при таком подходе все данные для передачи формируются программным путем, что замедляет разработку простых страниц. Примерами данног подхода являются технологии CGI, Java Servlets.

Второй подход использует оформленные особым образом шаблоны страниц, что позволяет вставлять в них участки кода. Этот подход особенно эффективен при создании WEB приложений, основная информация в которых статична, а динамическая информация может быть сгенерирована простыми программными конструкциями. При разработке больших систем этот вариант усложняет взаимодействие между компонентами и затрудняет реализацию сложной архитектуры. Также он менее эффективен по производительности и ограничивает возможности по реализации сложных страниц. Примерами данного подхода являются наиболее популярные на данный момент технологии PHP, ASP, JSP.

Наиболее важные требований, выдвигаемые при создании сложных Web систем, наличие которых делает систему привлекательной для использования:

  • платформная независимость;
  • язык реализации;
  • производительность, масштабируемость;
  • возможности расширения и интеграции;
  • простота использования, наличие средств разработки;
  • наличие необходимых программных библиотек;

Таким образом определены требования, необходимые для платформы разработки. Далее рассматриваются наиболее популярные на данный момент платформы, их особенности

Common Gateway Interface, CGI

Технология Common Gateway Interface (CGI) в отличии от остальных рассматриваемых технологий является наиболее низкоуровневой. Кроме этого данная технология является стандартом интерфейса, который служит для связи внешней программы с WEB сервером.

Протокол CGI разработан таким образом, чтобы можно было использовать любой язык программирования, который работает со стандартными устройствами ввода/вывода. Так как данная возможность присутствует на уровне операционной системы, то, если не требуется сложный скрипт, его можно оформить в виде командного файла.

Основные достоинства и недостатки технологии CGI :

CGI не налагает особых условий на платформу, поэтому работает на всех популярных платформах и WEB серверах. Также технология не привязана к конкретному языку программирования и может быть использована на любом языке, работающем со стандартными потоками ввода/вывода.

Производительность программ CGI не очень высока. Основной причиной этого является то, что при каждом обращении к серверу создается отдельный процесс, требующий большого количества системных ресурсов. Кроме этого встроенных средств масштабируемости данная технология не предусматривает, и об этом разработчик должен заботиться отдельно.

CGI программа представляет из себя готовый к исполнению файл, что препятствует легкому расширению системы.

Данные причины привели к тому, что сейчас разработке приложений в технологии CGI предпочитают более развитые платформы, предоставляющие больше удобства разработчикам и обладающие повышенной производительностью. Тем не менее знание CGI необходимо для понимания работы высокоуровневых платформ.

Java Servlets

Технология Java Servlets (сервлеты) была разработана компанией Sun Microsystems, чтобы использовать преимущества платформы Java для решения проблем технологии CGI и API расширений сервера. Технология решает проблему производительности, выполняя все запросы как потоки в одном процессе. Сервлеты не зависят от платформы поскольку выполняются внутри Java Virtual Machine (JVM), и могут легко разделять ресурсы.

Модель безопасности Java делает обеспечивает управление уровнем доступа, а обработка исключений делает сервлеты более надежным средством. Технология обладает широкими функциональными возможностями, и большое количество библиотек предоставляет самые разнообразные средства, необходимые в разработке.

Сервлет является классом Java должен быть выполнен внутри Java VM. «Контейнер» WEB приложения типа Tomcat загружает класс сервлета при первом обращении к нему, либо сразу при запуске сервера согласно настройки конфигурации. Далее сервлет остается загруженным для обработки запросов, пока он не выгружается явным образом, либо до остановки контейнера.

Технология сервлетов является распространенной и может быть использована со всеми популярными WEB серверами, выполняющими функции контейнера сервлетов (Apache Tomcat, Java Web Server от Sun).

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

В связи с тем, что сервлеты обрабатываются в одном процессе с помощью создания внутри него потоков, программный код сервлетов должен быть потокобезопасным. Это накладывает определенную ответственность на программиста. При этом сервлеты приобретают такое неоценимое преимущество как масштабируемость.

Таким образом, сервлеты обеспечивают компонентный, платформонезависимый метод построения WEB приложений без ограничений производительности. Они имеют широкий диапазон доступных прикладных API, позволяют использовать все преимущества Java, легко расширяются и масштабируются, поддерживаются всеми популярными WEB серверами. Все это обеспечивает использование данной технологии для разработки крупных WEB систем.

Java Server Page, JSP

Технология Java Server Pages (JSP) от компании Sun Microsystems является надстройкой над технологией Java Servlets, обеспечивающая более быструю и простую разработку WEB приложений с помощью использования шаблонов. Для понимания архитектуры и преимуществ JSP необходимо знать технологию Java Servlets, поскольку они тесно связаны.

Страницы JSP представляют из себя шаблоны страниц, схожие с шаблонами РНР и ASP. Основным отличием от других подобных технологий является то, что код, находящийся внутри страницы, предварительно компилируется в Java Servlet. Статические участки шаблона преобразуются в вызовы к функциям для их помещения в поток вывода. Код компилируется так, как если бы он находился внутри сервлета. Компиляция JSP страниц в сервлеты проводится один раз — либо при первом обращении к странице, либо при запуске контейнера сервлетов.

Технология JSP удачно объединяет все преимущества Java платформы b шаблонный подход к построению сайтов. Благодаря этому технология получила широкое распространение как среди профессиональных коммерческих разработчиков, так и при создании открытых бесплатных проектов.

Важным шагом к расширению шаблонного подхода стали так называемые библиотеки тэгов (tag libraries). Это гибкая возможность интегрировать стандартные, сторонние, или собственные программные компоненты в страницы. Простота создания и использования привели к большой популярности библиотек тэгов.

Технология JSP не привязана к конкретной аппаратной или программной платформе благодаря работе на основе Java. То есть JSP являются отличным решением для использования в гетерогенных средах.

Производительность технологии ограничена объективными особенностями архитектуры. Во-первых, страницы должны быть откомпилированы в сервлеты, но только один раз при первом к ним обращении. Во-вторых сервлеты выполняются в JVM, т.е. в режиме интерпретации. Однако эти ограничения компенсируются дополнительными возможностями. Так современные WEB «контейнеры» поддерживают кластеризацию серверов, что перекладывает нагрузку на аппаратное обеспечение. Это является экономически оправданным и простым решением.

Основными достоинствами JSP является простота разработки, характерная для шаблонного подхода, наличие большого количества сторонних библиотек, легкость их использования, мощные и разнообразные среды разработки. Благодаря всем этим факторам JSP является наиболее перспективной базовой технологией разработки при создании Web — сайтов. Однако при создании сложных WEB систем ограничения, накладываемые шаблонным подходом становятся серьезным препятствием к развитию.

Personal Home Page, PHP

Технология Personal Home Page (PHP) получила широкое распространение благодаря поддержке самых популярных платформ своей и бесплатности. Она базируется на принципе построения страниц на основе шаблонов. Страницы РНР имеют вид обычных HTML страниц, в которые могут быть включены специальные тэги вида . Между тэгами вставляются строки программного кода на специальном языке сценариев РНР.

Основные достоинства и недостатки платформы PHP :

  • Применяемый в РНР язык прост и удобен, однако не является в полном смысле объектно-ориентированным; Для РНР существуют обширные библиотеки, а также масса встроенных функций для решения самых разнообразных задач.
  • При использовании РНР с Web сервером Apache есть возможность эффективного исполнения ядра, как расширения сервера. В остальных случаях производительность платформы невысока. Собственных средств масштабирования РНР не имеет, все возможности по кластеризации целиком ложатся на WEB сервер и разработчиков.
  • Возможности интеграции ограничены включением модулей и использованием внешних функций, что не соответствует современным требованиям.

Хранение всего кода в файлах-страницах приводит к затруднению разделения бизнес-логики и интерфейса при создании больших систем.

Тем не менее можно заключить, что, благодаря простоте использования, наличию большого числа функций и библиотек, распространенности и поддержке большинства существующих WEB серверов и платформ, РНР является очень удобным средством разработки небольших систем. В то же время ограничения по производительности, масштабируемости, языку программирования и возможностям расширения и интеграции препятствуют использованию платформы при разработке масштабных систем.

Технология Microsoft .NET и среда ASP.NET

Технология .NET является последней разработкой компании Microsoft и заявлена как новый этап в развитии средств взаимодействия между приложениями. В настоящий момент она доступна в качестве дополнения .NET Framework к семейству операционных систем Microsoft Windows. Также продолжаются работы по созданию и совершенствованию технологии .NET Framework на других операционных системах.

Основой .NET является Common Language Runtime (CLR общая среда исполнения языков), опирающаяся на системные службы операционной системы и управляющая выполнением кода, написанного на любом языке программирования. Набор базовых классов дает доступ к сервисам платформы, которые можно использовать при программировании. CLR и базовые классы вместе составляют основу .NET платформы.

NET предлагает такие высокоуровневые сервисы для разработки WEB приложений как :

  • ASP .NET — новая версия ASP, позволяющая использовать любой (.NET совместимый) язык для программирования Web страниц;
  • Windows Forms и Web Forms — набор классов для построения пользовательского интерфейса локальных и WEB-ориентированных приложений.

Важной составляющей частью платформы .NET является обновленная среда ASP.NET (ранее использовалось ASP+). В ее основе лежит новая платформа, и основными языками программирования для нее выбраны С# и Visual Basic, вместо бывших скриптовых языков. В то же время, новая технология позволяет писать ASP страницы на любом подходящем языке программирования.

В технологию ASP.NET заложено все, чтобы сделать весь цикл разработки WEB приложения более быстрым, а поддержку проще. Основные возможности ASP.NET.

  1. Компилирование кода при первом обращении.
  2. Широкий выбор библиотек компонентов, поставляемых с .NET.
  3. Поддержка среды разработки Visual Studio.NET.
  4. Языковая независимость в пределах платформ для которых реализована общая языковая среда исполнения.
  5. Возможности расширения с помощью мультипроцессорных и кластерных решений.
  6. Новые возможности по обработке ошибок.
  7. Объектно-ориентированные языки разработки (С#).

Вместе с созданием технологии ASP.NET появились новые возможности по разработке WEB систем, отвечающие всем современным требованиям и позволяющие значительно ускорить и упростить разработку сложных приложений. Однако ASP.NET сильно привязана к серверу IIS, и, хотя архитектура .NET позволяет перенести приложения ASP.NET на другую платформу, на данный момент реальная возможность отсутствует.

Таким образом, многоплатформенность пока еще не может быть удовлетворена платформой .NET. Однако необходимо отметить, что такая система должна иметь возможности интеграции с платформой .NET (особенно WEB сервисы).

Node.js

Согласно Википедии Node или Node.js — это серверная реализация языка программирования JavaScript, основанная на движке V8. Предназначена Node для создания масштабируемых распределённых сетевых приложений, таких как WEB сервер. В отличие от большинства программ с использованием JavaScript, Node.js исполняется не в браузере клиента, а на стороне сервера.

Несомненно, Node.js и JavaScript имеют существенные отличия. В первую очередь Node.js — это платформа для разработки веб приложений, а JavaScript — это язык. Опять же под JavaScript подразумевают скрипт, выполняемый на стороне клиента (в браузере), а Node.js выполняется на сервере. То есть, Node.js просто другой контекст : он позволяет запускать JavaScript-код вне браузера.

Чтобы код JavaScript выполнился вне браузера (на backend), он должен быть интерпретирован. Именно это и делает Node.js. Для этого он использует движок V8 от Google — ту же самую среду исполнения для JavaScript, которую использует браузер Google Chrome.

Основные недостатки Node.js

1. Отсутствие полноценной IDE. Существуют плагины для Eclipse и NetBeans, есть частичная поддержка и в других IDE, но назвать их полноценными решениями на данный момент нельзя. Особый интерес представляет Cloud9 IDE для разработки на JavaScript прямо в браузере. Эта IDE быстро развивается и уже активно используется многими Node.JS разработчиками.

2. Необходимость перезапуска приложения после внесения изменения. Несмотря на существование утилит, автоматизирующих данный процесс, некоторое время на это всё равно уходит. Для сравнения, при использовании шаблонного подхода для разработки интерфейса (JSP, PHP) перезапуск приложения не требуется. Но если вносятся изменения к примеру в JavaBean или servlet, то также потребуется перезапуск WEB-приложения, и происходит это намного дольше.

Контроль за уечкой памяти. С этим сталкиваются начинающие Node.JS. За памятью надо следить всегда и везде, но быстро живущие PHP-скрипты или небольшой клиентский JavaScript сильно расслабляют. В таких приложениях многие разработчики особо не предают значения потере нескольких килобайт памяти, а некоторые вообще не следят за этим показателем. Node.JS таких поблажек не делает. Приложение на Node.JS работает долго, и в случае утечки, каждый запрос к сайту будет уносить с собой кусочек памяти, которая очень быстро закончится, что приведёт к известным последствиям. Специфика JavaScript также располагает к появлению этого типа ошибок.

Возврат ошибок из асинхронного кода. Например, в PHP весь код выполняется синхронно, поэтому отловить ошибку на любом уровне вложенности можно с помощью конструкции try-catch. Но в Node.js большая часть кода работает асинхронно (операции ввода/вывода). При этом исключительные ситуации, как правило, возникают не при вызове метода, а при работе его callback’а, который выполняется уже вне конструкции try-catch. Для передачи информации об ошибках в Node.JS принято использовать первый параметр callback-функции. Т.е. если у нас возникла ошибка, мы вызываем callback-функцию либо с одним единственным параметром, описывающем её, либо первый параметр выставляем в undefined/null, а в последующих передаём результаты работы нашего функционала. В реальных приложениях вложенность вызовов может быть довольно большой и каждый раз передавать ошибку наверх очень неудобно.

Сложные математические расчёты не для Node.JS. Конечно, можно и на велосипеде привезти кирпичи для дома. Но зачем? Так и в Node.JS всё же возможно производить сложные математические расчёты, путём разбиения задачи на короткие итерации, выполняемые за несколько витков event loop, но это уже извращения и фанатизм. Гораздо проще выносить такие задачи за пределы event loop или вообще выбрать другую технологию для разработки.

Достоинства Node.js

Асинхронный ввод/вывод. Это самое значимое преимущество Node.js и оно лежит в основе данной технологии. В Node.js можно одновременно выполнять несколько операций, не зависящих друг от друга. При синхронном выполнении, например в PHP, операции будут выполняться друг за другом последовательно, каждый раз ожидая завершения предыдущей. В Node.js запросы к СУБД можно отправить «параллельно». На самом деле запросы отправляются последовательно , но Node.JS не дожидается результата работы предыдущего запроса, чтобы отправить следующий. По мере выполнения запросов, будут вызваны callback-функции для обработки их результата.

Использование асинхронного ввода/вывода к примеру в JSP потребует включение в приложение дополнительной библиотеки jQuery, которая позволяет осуществлять Ajax-запрос к серверу без перезагрузки страницы.

Один и тот же язык на сервере и на клиенте. Это позволяет повторно использовать некоторый код для валидации форм, построения шаблонов на клиенте и т.п. В целом, это очень упрощает разработку, особенно, когда клиентская часть приложения сложная и требует серьёзной работы.

Обработка http-запроса внутри себя. Это значит, что для каждого нового запроса не выполняется инициализация, как, например, на PHP. Настройки загружены, соединения с БД и с кешем открыты, код скомпилирован и готов к работе. Благодаря такой архитектуре и гибкости открывается огромный простор для различных техник оптимизации. Например, один раз разобрав шаблон, можно хранить его в виде функции, принимающей на вход данные и возвращающей готовый HTML. Или можно легко организовать локальное (для процесса) кеширование, наиболее часто используемых данных, что даст прирост в скорости работы с ними.

Вокруг Node.JS образовалась солидная экосистема, включающая сотни модулей и, оответственно, их разработчиков. Во многом благодаря удобству github сообщество имеет отличный инструмент для развития этой экосистемы, которое идёт семимильными шагами, и свой вклад в это развитие может внести любой желающий. С помощью таких инструментов, как npm, процесс поиска, выбора и установки необходимых модулей становится простым и быстрым.

Сам язык JavaScript и API Node.js очень гибкие и лаконичные. Программы получаются компактными и легко читаемыми. Вы вряд ли увидите в них классы, состоящие практически целиком из геттеров и сеттеров, или десятки файлов с описаниями интерфейсов. Такие вещи, как замыкания и лямбда-функции, позволяют писать очень красивый код.

Что такое веб-разработка на Java

Откройте для себя мир веб-разработки на Java, узнайте о ключевых технологиях и преимуществах, а также изучите пример веб-приложения!

Алексей Кодов
Автор статьи
9 июня 2023 в 16:31

Веб-разработка на Java — это процесс создания веб-приложений с использованием языка программирования Java. Java является мощным, масштабируемым и надежным языком программирования, который применяется для разработки разнообразных типов веб-приложений, от небольших статических сайтов до крупных корпоративных систем.

Основы Java в веб-разработке

Для разработки веб-приложений на Java используются различные технологии и инструменты. Вот некоторые из них:

  • Java Servlets — это программы на Java, которые работают на стороне сервера и обрабатывают HTTP-запросы от клиентов (браузеров). Servlets являются базовой технологией для разработки веб-приложений на Java.
  • JavaServer Pages (JSP) — это технология, которая позволяет использовать Java-код внутри HTML-страниц. JSP упрощает разработку динамических веб-страниц и обеспечивает разделение логики приложения и представления.
  • JavaServer Faces (JSF) — это фреймворк для создания пользовательских интерфейсов веб-приложений на Java. JSF предоставляет готовые компоненты и шаблоны, которые упрощают разработку веб-приложений.
  • Spring — это популярный фреймворк для разработки веб-приложений на Java. Он предлагает множество модулей и инструментов для управления зависимостями, безопасности, шаблонами, доступом к данным и другими аспектами веб-разработки.

Java-разработчик: новая работа через 11 месяцев
Получится, даже если у вас нет опыта в IT

Преимущества Java в веб-разработке

Java обладает рядом преимуществ для веб-разработки, среди которых:

  1. Платформонезависимость: Java-приложения могут работать на любой платформе с установленной Java Virtual Machine (JVM), что обеспечивает большую гибкость и совместимость.
  2. Масштабируемость: Java позволяет разрабатывать масштабируемые веб-приложения, которые могут обрабатывать большое количество пользователей и данных.
  3. Безопасность: Java предлагает множество встроенных функций и инструментов для обеспечения безопасности веб-приложений, таких как шифрование, аутентификация и авторизация.
  4. Богатая экосистема: Java обладает огромной экосистемой библиотек, фреймворков и инструментов, которые упрощают разработку веб-приложений и сокращают время разработки.

Пример веб-приложения на Java

Давайте рассмотрим простой пример веб-приложения на Java с использованием Servlet и JSP.

// MyServlet.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyServlet extends HttpServlet < public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < String message = "Hello, Java Web Development!"; request.setAttribute("message", message); request.getRequestDispatcher("/displayMessage.jsp").forward(request, response); >>
    Java Web Development Example  

В этом примере мы создали простой сервлет, который устанавливает атрибут message и перенаправляет запрос на JSP-страницу displayMessage.jsp . На этой странице используется Java-код для отображения значения атрибута message .

Веб-разработка на Java предлагает множество возможностей для создания разнообразных веб-приложений. Онлайн-школы, такие как

Строим веб-приложение на Java без JEE и Spring

Данная статья будет интересна тем, кто вдруг осознал, что ему хочется
попробовать создать что-то без навязанного обществом JEE и Spring.

Вы, о дорогой Java Смельчак, не хотите быть винтиком в огромном механизме вашего Фреймворка?
Вам надоело чувствовать себя «машинисткой» по написанию конфигов и настроек?
Вы хотите решать задачи так, как хочется вам, а не так, как это видится автору унифицированной на нужды
миллионов библиотеки?

Тогда добро пожаловать под кат, где я поделюсь с вами полезными находками Мира без Фреймворка.

Все дело в Контейнере

Как вы помните JEE или Spring (далее просто Фреймворк) завлекает прежде всего
возможностью Контейнера в котором будут жить ваши небольшие компоненты и сервисы.
Но ведь мы можем создать его сами.

Это просто.
Создаем Контекст через который доступно все, что нужно для работы:

public class Context < public final DAO dao; public final MailService mails; public final AsyncService async; public App root; public Context( DAO dao, MailService mails, AsyncService async) < this.dao = dao; this.mails = mails; this.async = async; >> 

Создаем Контейнер, в котором будут жить все наши Сервисы:

public class App < public final SecurityService security; public final CommentService comments; public final UserService users; public App(Context c) < c.root = this; this.security = new SecurityService(c); this.users = new UserService(c); this.comments = new CommentService(c); >> 

В Сервисах у нас находятся бизнес-методы.
Через Контекст они смогут получить доступ к нужным ресурсам (как БД или другие Сервисы).

class CommentService < DAO dao; MailService mails; UserService users; public CommentService(Context c)< dao = c.dao; mails = c.mails; users = c.root.users; >public Result getComments(Req req) < List comments = dao.getComments(req); User user = users.getCurUser(); mails.sendMail(); >> 

Осталось только создать один экземпляр Контейнера на всё веб-приложение:

public class SingleApp < private static App app; public static synchronized App get() < if(app != null) return app; //создаем контекст DAO dao = new DAO(. ); MailService mails = new MailService(. ); AsyncService async = new AsyncService(. ); Context c = new Context(dao, mails, async); //создаем контейнер app = new App(c); return app; >> 

И использовать Сервисы из Контейнера в своей работе:

@WebServlet("/comments") public class GetCommentsServlet extends HttpServlet < CommentService comments; public void init() < App app = SingleApp.get(); comments = app.comments; >protected void doGet(HttpServletRequest req, HttpServletResponse resp) < List result = comments.getComments(. ); req.setAttribute("comments", result); req.getRequestDispatcher("/WEB-INF/jsp/comments.jsp").forward(req, resp); >> 
Итог

Двумя-тремя простейшими классами нам удалось создать себе условия для комфортной работы без Фреймворка.
Нам не понадобилось 5 мегабайт библиотек, наше решение стартует максимально быстро (т.к. в нем есть только то,
что нужно именно нам), его легко запустить в юнит тестах.
Но главное: мы видим весь цикл работы приложения и можем его менять как нам вздумается.

На примере данного подхода я создал вот этот небольшой веб-сервис. И остался доволен результатами.
Там нет JEE, там нет Spring. Но там есть всё, что мне нужно. 🙂

Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.

Как работают веб-приложения

Это статья для начинающих разработчиков и тех, кто хочет немного ориентироваться в терминах и технологиях современных веб-приложений. В статье написано о том, чем веб-приложения отличаются от сайтов, какие бывают веб-приложения, из чего они состоят и как работают.

1. Чем веб-приложения отличаются от сайтов

Для меня сайт это в первую очередь что-то информационное и статичное: визитка компании, сайт рецептов, городской портал или вики. Набор подготовленных заранее HTML-файлов, которые лежат на удаленном сервере и отдаются браузеру по запросу.

Сайты содержат различную статику, которая как и HTML-файл не генерируется на лету. Чаще всего это картинки, CSS-файлы, JS-скрипты, но могут быть и любые другие файлы: mp3, mov, csv, pdf.

Блоги, визитки с формой для контакта, лендинги с кучей эффектов я тоже отношу для простоты к сайтам. Хотя в отличие от совсем статических сайтов, они уже включают в себя какую-то бизнес-логику.

А веб-приложение — это что-то технически более сложное. Тут HTML-страницы генерируются на лету в зависимости от запроса пользователя. Почтовые клиенты, соцсети, поисковики, интернет-магазины, онлайн-программы для бизнеса, это все веб-приложения.

2. Какие бывают веб-приложения

Веб-приложения можно разделить на несколько типов, в зависимости от разных сочетаний его основных составляющих:

  1. Backend (бэкенд или серверная часть приложения) работает на удаленном компьютере, который может находиться где угодно. Она может быть написана на разных языках программирования: PHP, Python, Ruby, C# и других. Если создавать приложение используя только серверную часть, то в результате любых переходов между разделами, отправок форм, обновления данных, сервером будет генерироваться новый HTML-файл и страница в браузере будет перезагружаться.
  2. Frontend (фронтенд или клиентская часть приложения) выполняется в браузере пользователя. Эта часть написана на языке программирования Javascript. Приложение может состоять только из клиентской части, если не требуется хранить данные пользователя дольше одной сессии. Это могут быть, например, фоторедакторы или простые игрушки.
  3. Single page application (SPA или одностраничное приложение). Более интересный вариант, когда используются и бэкенд и фронтенд. С помощью их взаимодействия можно создать приложение, которое будет работать совсем без перезагрузок страницы в браузере. Или в упрощенном варианте, когда переходы между разделами вызывают перезагрузки, но любые действия в разделе обходятся без них.

3. Pyhon-фреймворк Django aka бэкенд

В разработке фреймворк — это набор готовых библиотек и инструментов, которые помогают создавать веб-приложения. Для примера опишу принцип работы фреймворка Django, написанного на языке программирования Python.

Первым этапом запрос от пользователя попадает в роутер (URL dispatcher), который решает какую функцию для обработки запроса надо вызвать. Решение принимается на основе списка правил, состоящих из регулярного выражения и названия функции: если такой-то урл, то вот такая функция.

Функция, которая вызывается роутером, называется вью (view). Внутри может содержаться любая бизнес-логика, но чаще всего это одно из двух: либо из базы берутся данные, подготавливаются и возвращаются на фронт; либо пришел запрос с данными из какой-то формы, эти данные проверяются и сохраняются в базу.

Данные приложения хранятся в базе данных (БД). Чаще всего используются реляционные БД. Это когда есть таблицы с заранее заданными колонками и эти таблицы связаны между собой через одну из колонок.

Данные в БД можно создавать, читать, изменять и удалять. Иногда для обозначения этих действий можно встретить аббревиатуру CRUD (Create Read Update Delete). Для запроса к данным в БД используется специальный язык SQL (structured query language).

В Джанго для работы с БД используются модели (model). Они позволяют описывать таблицы и делать запросы на привычном разработчику питоне, что гораздо удобнее. За это удобство приходится платить: такие запросы медленнее и ограничены в возможностях по сравнению с использованием чистого SQL.

Полученные из БД данные подготавливаются во вью к отправке на фронт. Они могут быть подставлены в шаблон (template) и отправлены в виде HTML-файла. Но в случае одностраничного приложения это происходит всего один раз, когда генерируется HTML-страница, на который подключаются все JS-скрипты. В остальных случаях данные сериализуются и отправляются в JSON-формате.

4. Javascript-фреймворки aka фронтенд

Клиентская часть приложения — это скрипты, написанные на языке программирования Javascript (JS) и исполняемые в браузере пользователя. Раньше вся клиентская логика основывалась на использовании библиотеки JQuery, которая позволяет работать с DOM, анимацией на странице и делать AJAX запросы.

DOM (document object model) — это структура HTML-страницы. Работа с DOM — это поиск, добавление, изменение, перемещеие и удаление HTML-тегов.

AJAX (asynchronous javascript and XML) — это общее название для технологий, которые позволяют делать асинхронные (без перезагрузки страницы) запросы к серверу и обмениваться данными. Так как клиентская и серверная части веб-приложения написаны на разных языках программирования, то для обмена информацией необходимо преобразовывать структуры данных (например, списки и словари), в которых она хранится, в JSON-формат.

JSON (JavaScript Object Notation) — это универсальный формат для обмена данными между клиентом и сервером. Он представляет собой простую строку, которая может быть использована в любом языке программирования.

Сериализация — это преобразование списка или словаря в JSON-строку. Для примера:

Десериализация — это обратное преобразование строки в список или словарь.

С помощью манипуляций с DOM можно полностью управлять содержимым страниц. С помощью AJAX можно обмениваться данными между клиентом и сервером. С этими технологиями уже можно создать SPA. Но при создании сложного приложения код фронтенда, основанного на JQuery, быстро становится запутанным и трудно поддерживаемым.

К счастью, на смену JQuery пришли Javascript-фреймворки: Backbone Marionette, Angular, React, Vue и другие. У них разная философия и синтаксис, но все они позволяют с гораздо большим удобством управлять данными на фронтенде, имеют шаблонизаторы и инструменты для создания навигации между страницами.

HTML-шаблон — это «умная» HTML-страница, в которой вместо конкретных значений используются переменные и доступны различные операторы: if, цикл for и другие. Процесс получения HTML-страницы из шаблона, когда подставляются переменные и применяются операторы, называется рендерингом шаблона.

Полученная в результате рендеринга страница показывается пользователю. Переход в другой раздел в SPA это применение другого шаблона. Если необходимо использовать в шаблоне другие данные, то они запрашиваются у сервера. Все отправки форм с данными это AJAX запросы на сервер.

5. Как клиент и сервер общаются между собой

Общение клиента с сервером происходит по протоколу HTTP. Основа этого протокола — это запрос от клиента к серверу и ответ сервера клиенту.

Для запросов обычно используют методы GET, если мы хотим получить данные, и POST, если мы хотим изменить данные. Еще в запросе указывается Host (домен сайта), тело запроса (если это POST-запрос) и много дополнительной технической информации.

Современные веб-приложения используют протокол HTTPS, расширенную версию HTTP с поддержкой шифрования SSL/TLS. Использование шифрованного канала передачи данных, независимо от важности этих данных, стало хорошим тоном в интернете.

Есть еще один запрос, который делается перед HTTP. Это DNS (domain name system) запроc. Он нужен для получения ip-адреса, к которому привязан запрашиваемый домен. Эта информация сохраняется в браузере и мы больше не тратим на это время.

Когда запрос от браузера доходит до сервера, он не сразу попадает в Джанго. Сначала его обрабатывает веб-сервер Nginx. Если запрашивается статический файл (например, картинка), то сам Nginx его отправляет в ответ клиенту. Если запрос не к статике, то Nginx должен проксировать (передать) его в Джанго.

К сожалению, он этого не умеет. Поэтому используется еще одна программа-прослойка — сервер приложений. Например для приложений на питоне, это могут быть uWSGI или Gunicorn. И вот уже они передают запрос в Джанго.

После того как Джанго обработал запрос, он возвращает ответ c HTML-страницей или данными, и код ответа. Если все хорошо, то код ответа — 200; если страница не найдена, то — 404; если произошла ошибка и сервер не смог обработать запрос, то — 500. Это самые часто встречающиеся коды.

6. Кэширование в веб-приложениях

Еще одна технология, с которой мы постоянно сталкиваемся, которая присутствует как веб-приложениях и программном обеспечении, так и на уровне процессора в наших компьютерах и смартфонах.

Cache — это концепция в разработке, когда часто используемые данные, вместо того чтобы их каждый раз доставать из БД, вычислять или подготавливать иным способом, сохраняются в быстро доступном месте. Несколько примеров использования кэша:

  • В Джанго пришел запрос на получение данных для графика в отчете. Мы достаем из БД данные, подготавливаем их и кладем в БД с быстрым доступом, например, memcached на 1 час. При следующем запросе мы сразу достанем их из memcached и отправим на фронтенд. Если мы узнаём, что данные перестали быть актуальными, мы их инвалидируем (удаляем из кэша).
  • Для кэширования статических файлов используются CDN (content delivery network) провайдеры. Это серверы, расположенные по всему миру и оптимизированные для раздачи статики. Иногда бывает эффективнее положить картинки, видео, JS-скрипты на CDN вместо своего сервера.
  • Во всех браузерах по умолчанию включено кэширование статических файлов. Благодаря этому, открывая сайт не в первый раз, все загружается заметно быстрее. Минус для разработчика в том, что со включенным кэшем не всегда сразу видны изменения сделанные в коде.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *