Как сделать сервер на java для сайта

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Основные компоненты приложения

Рассмотрим классовую структуру всего проекта, а потом перейдем к реализации.

Классовая структура клиент-серверного приложения

Исходный код клиента на Java

Разобраться с клиентом гораздо проще, он по сути своей не делает ничего супер сложного, просто создает сокет и подключается к сервер-сокету с помощью связки host:port. Лаунчер создает объект класса Client и запускает его работу. Исходный код привожу без импортов, ибо любая IDE вам их подключит(те, кто пишет на Java точно знают, что без IDE очень сложно). Кроме того, в конце статьи вы сможете скачать архив с этим проектом.

ClientLauncher.java

Client.java

Исходный код сервера на Java

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

ServerLauncher.java

Server.java

Context.java

ClientSession.java

SessionsManager.java

Заключение

Просто чтобы быть ясным, проблема, с которой я сталкиваюсь со многими примерами ServerSocket, которые я видел в Интернете, заключается в том, что они выполняют свои собственные синтаксический анализ / форматирование запросов и обработку ошибок, что утомительно, подвержено ошибкам и вряд ли будет всеобъемлющим, и я пытаюсь избежать этого по этим причинам.

Я знаю, что это не в духе SO, но я призываю вас пересмотреть свое отвращение к API Java EE. Как уже упоминалось в некоторых ответах, есть несколько очень простых реализаций, таких как Jetty, которые позволяют встроить веб-сервер в ваше автономное приложение, при этом все еще используя API сервлетов. Если по какой-то причине вы абсолютно не можете использовать API Java EE, не обращайте внимания на мой комментарий :-)

Вот начальный пример, скопированный из их документов (тем не менее, для всех, кто пытается его редактировать, потому что это уродливый кусок кода, пожалуйста, не копируйте, а не мой, более того, вы никогда не должны редактировать цитаты, если они не изменились. в первоисточнике). Вы можете просто скопировать и запустить его на Java 6+.

Следует отметить, что response.length() роль в их примере плохая, так и должно быть response.getBytes().length . Даже в этом случае getBytes() метод должен явно указывать кодировку, которую вы затем указываете в заголовке ответа. Увы, хотя и вводящий в заблуждение начинающих, в конце концов, это всего лишь базовый пример.

Классы, упомянутые здесь, помечены @jdk.Exported в исходном коде OpenJDK, что означает, что API считается общедоступным и будет доступен в Java 9 (некоторые другие com.sun.* пакеты станут недоступными из-за Project Jigsaw).

Кажется, это исправлено. Текущая версия генерирует 403 if (uri.startsWith ("..") || uri.endsWith ("..") || uri.indexOf ("../")> = 0).

РЕДАКТИРОВАТЬ: это на самом деле работает! Приведенный выше код выглядит как Groovy или что-то в этом роде. Вот перевод на Java, который я тестировал:

Я думаю, что вы могли бы сделать класс Server реализует Provider < . и затем указать Content-Type в методе getContentType () DataSource. Кроме того, вы также можете ввести WebServiceContext: @Resource WebServiceContext ctx; , чтобы установить другие заголовки и прочитать параметры запроса. К сожалению, установка типа контента через WebServiceContext не работает.

Нет, я так не думаю. Он не будет работать на Java-реализации IBM и, возможно, на других. И даже если это работает сейчас, внутренние API могут изменяться. Почему бы просто не использовать официальный API?

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

Варианты тонкого сервера

    . Хорошие вещи возможны с множеством вспомогательных конструкций, таких как Filters, Templates и т. Д. . стремится быть бонсай и вполне может быть таким ;-)


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

Полный код ClientSession приводится ниже, после идут небольшие пояснения к нему:


Первое, что делает ClientSession - это получает содержимое запроса и выводит его в стандартный поток вывода. Т.к. данная реализация не предусматривает реакции на параметры запроса, то тело запроса не представляет интереса и чтение самого запроса ограничивается только его заголовком:

Для удобства, корневой директорией сервера считается папка www, но это всего лишь несущественная условность.

Это сделано для того, чтобы можно было уместить весь сервер в одном jar архиве.


Собранный проект вы можете взять здесь . Для запуска требуется java версии 6 и выше. Команда для запуска проекта: java -jar webserver.jar . Номер порта можно не указывать, тогда сервер будет запущен на 9999 порту:

Чтобы проверить работоспособность сервера, перейдите по адресу: http://localhost:9999/index.html В случае успеха должна открыться страница, которая лежит в папке www внутри jar архива с сервером. Для размещения собственных ресурсов на сервере просто добавьте их в папку www внутри архива и перейдите по ссылке http://localhost:9999/ , где - это это путь к интересующему вас ресурсу относительно папки www внутри архива. Внимание! В в качестве разделителя необходимо использовать прямой слэш "/". Если путь будет содержать ссылку не на файл, а на директорию, будет выведено содержимое этой директории.

Содержимое, отправленное серверу можно увидеть в окне терминала из которого был запущен сервер. Помимо заголовка запроса будет выведен запрашиваемый адрес и код ответа сервера:

Для прекращения работы сервера воспользуйтесь стандартной комбинацией клавиш Ctrl+C

UPD: исправлена ошибка из-за которой страница открывалась как текстовый файл с исходным кодом. В заголовок проставляется тип содержимого Content-Type.

Web – это система интернет-серверов, которая поддерживает форматированные документы. Документы форматируются с использованием языка разметки, называемого HTML (HyperText Markup Language), который поддерживает ссылки на другие документы, такие как графические, аудио- и видеофайлы и т. д.

Введение в сервлеты

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

Сервлеты-введение

Жизненный цикл

Весь жизненный цикл сервлета управляется контейнером сервлета, который использует интерфейс javax.servlet.Servlet для понимания объекта сервлета и управления им.

Жизненный цикл сервлета проходит в основном четыре этапа:

Жизненный цикл сервлета

Загрузка

Когда сервер запускается, контейнер сервлета развертывается и загружает все сервлеты.

Инициализация

Затем сервлет инициализируется путем вызова метода init(). Метод Servlet.init() вызывается контейнером Servlet для уведомления о том, что этот экземпляр Servlet успешно создан и готов к запуску.

Обработка запросов

Затем сервлет вызывает метод service() для обработки запроса клиента и вызывается для информирования сервлета о клиентских запросах.

Уничтожение

Наконец, сервлет завершается вызовом destroy(). Метод запускается только один раз за время существования сервлета и сообщает об окончании экземпляра сервлета.

Методы init() и destroy() вызываются только один раз. Наконец, сервлет – это сборщик мусора сборщиком мусора JVM. Итак, на этом завершается жизненный цикл сервлета.

Шаги по созданию

Чтобы создать сервлет, нам нужно выполнить несколько шагов по порядку. Они заключаются в следующем:

  1. Создать структуру каталогов.
  2. Создать сервлет.
  3. Скомпилировать сервлет.
  4. Добавить сопоставления в файл web.xml.
  5. Запустить сервер и развернуть проект.
  6. Доступ к сервлету.

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

Для запуска программы сервлета у нас должен быть установлен и настроен сервер Apache Tomcat. Eclipse для Java EE предоставляет встроенный Apache Tomcat. Как только сервер настроен, вы можете начать с вашей программы. Следует отметить один важный момент – для любой программы сервлета вам нужно 3 файла – файл index.html, файл классов Java и файл web.xml. Самый первый шаг – создать динамический веб-проект, а затем продолжить.

Теперь давайте рассмотрим пример, в котором будем создавать простой сервлет входа в систему и отображать вывод в браузере.

Сначала создадим файл index.html.

Далее закодируем файл класса Java.

В приведенном выше коде установили условие – если имя пользователя и пароль равны edureka, только тогда он будет отображаться успешно вошли в систему, в противном случае вход будет отказано. После написания файла класса Java последний шаг – добавить сопоставления в файл web.xml. Давайте посмотрим, как это сделать.

Универсальные

Это независимый от протокола сервлет, который должен переопределять метод service() для обработки клиентского запроса. Метод service() принимает два аргумента: объект ServletRequest и объект ServletResponse. Работа объекта запроса состоит в том, чтобы информировать сервлет о запросе, сделанном клиентом, в то время как объект ответа возвращает ответ клиенту. GenericServlet является абстрактным классом, и у него есть только один абстрактный метод – service(). В этом вся концепция, когда мы создаем универсальный сервлет путем расширения класса GenericServlet, мы должны переопределить метод service().

Теперь давайте посмотрим, как создать и вызвать универсальный сервлет. Будем кодировать 3 файла, как показано ниже:

HTML-файл

Мы создаем файл HTML, который будет вызывать сервлет, как только нажмем на ссылку на веб-странице. Создайте этот файл в папке WebContent. Путь к этому файлу должен выглядеть следующим образом: WebContent / index.html

Файл класса Java

Здесь мы будем создавать универсальный сервлет, расширяя класс GenericServlet. При создании GenericServlet необходимо переопределить метод service(). Щелкните правой кнопкой мыши на папке src и создайте новый файл класса и назовите файл как общий. Путь к файлу должен выглядеть следующим образом: Java Resouces / src / default package / generic.java

web.xml

Этот файл можно найти по этому пути. WebContent / WEB-INF / web.xml. В этом файле мы сопоставим сервлет с конкретным URL. Поскольку вызываем страницу приветствия после нажатия на ссылку в index.html, она отобразит страницу приветствия в класс Servlet, который уже создали выше.

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

Отслеживание сеансов

Сессия просто означает определенный интервал времени. Отслеживание сеанса – это метод поддержания состояния (данных) пользователя, также известный как управление сеансом в сервлете. Таким образом, каждый раз, когда пользователь запрашивает сервер, сервер обрабатывает запрос как новый запрос.

сервер обрабатывает запрос

Чтобы распознать конкретного пользователя, нам нужно отслеживать сеанс.

Файлы cookie

Файл cookie – это небольшой фрагмент информации, который сохраняется между несколькими клиентскими запросами. Имеет имя, одно значение и дополнительные атрибуты, такие как комментарий, путь и квалификаторы домена, максимальный возраст и номер версии.

Как работает Cookie?

Поскольку это метод отслеживания сеансов, по умолчанию каждый запрос рассматривается как новый запрос.

Как работает Cookie

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

Давайте посмотрим пример создания файла cookie, добавления ответа и получения результатов.

Пример

Теперь давайте создадим простую HTML-форму для файлов cookie.

Теперь последний шаг – создать файл XML и добавить в него все сопоставления.

Теперь вы готовы к казни. Вы можете запустить код и получить желаемый результат. Вот как работает cookie.

Элементы сценариев

Элементы сценариев предоставляют возможность вставлять Java-код в JSP. Существует три типа элементов сценариев:

Тег скриптлета

Используется для выполнения исходного кода Java в JSP.

Тег выражения

Код, помещенный в тег выражения JSP, записывается в выходной поток ответа. Поэтому вам не нужно записывать out.print() для записи данных. Он в основном используется для печати значений переменной или метода.

Теперь давайте возьмем небольшой пример отображения текущего времени. Чтобы отобразить текущее время, мы использовали метод getTime() класса Calendar. GetTime() является методом экземпляра класса Calendar, поэтому мы вызвали его после получения экземпляра класса Calendar методом getInstance().

Тег объявления

Используется для объявления полей и методов. Код, написанный внутри тега объявления JSP, размещается вне метода service() автоматически сгенерированного сервлета. Так что он не получает память при каждом запросе.

В приведенном ниже примере тега объявления JSP мы определяем метод, который возвращает куб с заданным числом, и вызываем этот метод из тега выражения JSP. Но мы также можем использовать тег скриптлета JSP для вызова объявленного метода. Посмотрим как. Файл: index.jsp

Пример неявного объекта запроса JSP

Неявный объект ответа JSP

Читайте также: