1. Давайте начнем с контейнера сервлета: контейнер сервлета, с которым все знакомы, это Tomcat. Как контейнер сервлетов управляет сервлетами?
Давайте сначала посмотрим на контейнерную модель Tomcat:
Из приведенной выше рисунка мы видим, что контейнер Tomcat разделен на четыре уровня. Контейнер, который действительно управляет сервлетами, является контекстным контейнером, и контекст соответствует веб -проекту
На уровне контейнера Tomcat контекстный контейнер представляет собой контейнер, который непосредственно управляет оберткой обертки класса (StandardWrapper) сервлета в контейнере, поэтому то, как контейнер -контейнер будет напрямую повлиять на то, как работает сервлет.
Здесь я объясню класс обертывания сервлета: StandardWrapper. Здесь есть вопрос, почему сервлет должен быть завершен в StandardWrapper вместо того, чтобы быть объектом Сервлета напрямую. Поскольку StandardWrapper является частью контейнера Tomcat, он имеет характеристики контейнера, а сервлет является независимым стандартом веб -разработки и не должен тесно связан с Tomcat.
За исключением обертывания сервлета в StandardWrapper и добавление его в контекст в качестве субконфинтера, все другие свойства web.xml проанализируются в контекст, поэтому контекстный контейнер - это контейнер сервлета, который действительно запускает сервлет. Веб -приложение соответствует контекстному контейнеру. Свойства конфигурации контейнера определяются с помощью приложения web.xml, поэтому мы можем понять, какую роль играет web.xml.
2. Следующее кратко описывает рабочий проект Сервлета:
Когда веб -сервер взаимодействует с клиентом, рабочий процесс Сервлета:
1. Сделайте запрос на веб -сервер на клиенте
2. Веб -сервер отправляет его в сервис после получения запроса
3. Контейнер сервлета генерирует объект экземпляра для этого и вызывает соответствующий метод в API Servlet для обработки клиента HTTP -запроса, а затем возвращает результат обработанного ответа на веб -сервер.
4. Веб -сервер отправляет структуру ответа, полученную из объекта экземпляра сервлета обратно клиенту.
3. Жизненный цикл сервлета:
Как показано на рисунке выше, жизненный цикл сервлета можно разделить на четыре этапа, а именно класс загрузки и этап создания, этап инициализации, этап обслуживания и этап разрушения экземпляра. Ниже приведено подробное описание задач программирования и мер предосторожности для каждого этапа.
1. Создайте экземпляр сервлета:
По умолчанию экземпляры сервлета создаются, когда первый запрос прибывает, и позже используются повторно. Если некоторые сервлеты требуют сложных операций, которые необходимо выполнить при загрузке инициализации, такие как открытие файлов, инициализация сетевых подключений и т. Д., Вы можете уведомить сервер для создания экземпляра сервлета при запуске. Конкретная конфигурация заключается в следующем:
<servlet> <servlet-name> timeservlet </servlet-name> <servlet-class> com.allanlxf.servlet.basic.timeservlet </servlet> <dut on-startup> 1 </load-on-startup> </servlet>
Создайте соответствующую классовую структуру объекта сервлета:
2. Инициализация
После создания экземпляра сервлета веб -сервер автоматически вызовет метод init (конфигурация ServletConfig) для инициализации сервлета. Конфигурация параметра метода содержит информацию о конфигурации сервлета, такую как параметр инициализации, который создается сервером.
I. Как настроить параметры инициализации сервлета?
Например, в теге определения сервлета в web.xml:
<servlet> <servlet-name> timeservlet </servlet-name> <servlet-class> com.allanlxf.servlet.basic.timeservlet </servlet-class> <init-param> <par am-name> user </param-name> <param-value> имя пользователя </param-value> </init-param> <init-param> <param-name> blog </param-name> <param-value> http: //. Полем Полем </param-value> </init-param> </servlet>
Два параметра инициализации Пользователь и блог настроены со значениями имени пользователя и http: //. Полем Полем Таким образом, чтобы изменить имя пользователя и адрес блога в будущем, вам не нужно изменять код сервлета, просто изменить файл конфигурации.
II Как прочитать параметры инициализации сервлета?
ServletConfig определяет следующий метод для чтения информации о параметрах инициализации:
public String getInitParameter (String name)
Параметр: имя параметра инициализации.
Возвращает: значение параметра инициализации, если не настроено, возвращает NULL.
Количество времен выполнения метода III.init (ServletConfig)
Этот метод выполняется один раз в течение жизненного цикла сервлета.
IV.Init (ServletConfig) и поток
Этот метод выполняется в одной резьбе, поэтому разработчикам не нужно рассматривать проблемы безопасности потока.
Метод и исключение V.Init (ServletConfig)
Во время выполнения этот метод может выбросить сервис -экзамен, чтобы уведомить веб -сервер, который не смог инициализировать экземпляр Сервлета. После того, как ServletException будет выброшено, веб -сервер не передаст запрос клиента в экземпляр Servlet для обработки, но сообщит об исключении об отказе от инициализации клиенту, которая будет уничтожена из памяти. Если новый запрос сделан, веб -сервер создаст новый экземпляр сервлета и выполнит работу инициализации нового экземпляра.
3. Сервис
После того, как экземпляр Сервлета успешно создан и инициализирован, экземпляр сервера может использоваться сервером для обслуживания запроса клиента и создания ответа. На этапе службы веб -сервер будет вызвать метод сервиса (запрос ServletRequest, ответ ServletResponse). Объект запроса и объект ответа создаются сервером и передаются в экземпляр Сервлета. Объект запроса инкапсулирует информацию, отправляемую клиентом на сервер, а объект ответа инкапсулирует информацию, отправляемую сервером, клиенту.
I. Обязанности метода Service ()
Метод Service () является основным методом сервлета. Бизнес -логика клиента должна быть выполнена в рамках этого метода. Процесс разработки типичного метода обслуживания:
Анализировать запрос клиента-> Выполнить бизнес-логику-> Страница ответа вывода на клиент
Ii.service () Метод и поток
Чтобы повысить эффективность, спецификация сервлета требует, чтобы экземпляр сервлета должен был выполнять несколько запросов клиентов одновременно. То есть метод Service () работает в многопоточной среде, и разработчики сервлета должны обеспечить безопасность потока метода.
III.Service () Метод и исключение
Метод Service () может бросить ServletException и ioException во время выполнения. Среди них ServletException может быть выброшено в процессе обработки запросов клиентов, таких как запрошенный ресурс недоступен, база данных недоступна и т. Д. После того, как исключение будет выпущено, контейнер должен переоценить объект запроса и сообщать об исключении клиента. IOException указывает на входную и выходную ошибку. Программист не должен заботиться об исключении и сообщает о его клиенте с помощью контейнера.
Меры предосторожности программирования:
1) Когда поток потока сервера выполняет метод init () экземпляра Сервлета, все потоки потоков службы клиента не могут выполнить метод Service () экземпляра, и ни один поток не может выполнить метод Dressust () экземпляра. Следовательно, метод init () сервлета работает в одной среде потока, и разработчикам не нужно рассматривать какие -либо проблемы безопасности потока.
2) Когда сервер получает несколько запросов от клиента, сервер выполнит метод Service () экземпляра Servlet в отдельном потоке службы клиента для обслуживания каждого клиента. В настоящее время несколько потоков будут выполнять метод Service () одного и того же экземпляра сервлета одновременно, поэтому необходимо учитывать проблемы безопасности потоков.
3) Обратите внимание, что, хотя метод Service () работает в многопоточной среде, нет необходимости синхронизировать метод. Вместо этого это зависит от типа ресурса, доступного к этому методу во время выполнения и от того, как он обращается к ресурсам. Анализ заключается в следующем:
я. Если метод Service () не получает доступ к переменным члена Сервлета или глобальным ресурсам, таким как статические переменные, файлы, подключения к базе данных и т. Д., Он использует только собственные ресурсы текущего потока, такие как временные переменные, запросы и объекты ответа, которые не указывают на глобальные ресурсы. Этот метод сам по себе является потоком и не требует какого-либо управления синхронизацией.
II Если метод Service () обращается к переменной элемента сервлета, но операция на переменной является операцией только для чтения, сам метод безопасен для потока и не требует какого-либо управления синхронизацией.
iii. Если метод Service () обращается к переменной элемента сервлета, а операция переменной считывается и написана, обычно требуется оператор управления синхронизацией.
IV Если метод Service () обращается к глобальной статической переменной, если в системе могут быть и другие потоки, доступа к статической переменной одновременно, если есть операции чтения и записи, обычно требуется операция управления синхронизацией.
v. Если метод Service () обращается к глобальным ресурсам, таким как файлы, подключения к базе данных и т. Д., Обычно необходимо добавлять операторы управления синхронизацией.
4. Разрушение
Когда веб -сервер считает, что экземпляр Servlet не является необходимым, таким как перезагрузка приложений или выключение сервера, и сервис не был доступен в течение долгого времени. Сервер может уничтожить (также называемый удаляющим) экземпляр из памяти. Веб -сервер должен убедиться, что метод Destress () экземпляра сервлета вызывается перед удалением экземпляра Сервлета, чтобы переработать ресурсы, запрашиваемые сервлетом или выполнить другую важную обработку.
Веб -сервер должен убедиться, что перед вызовом метода Destry () все потоки, работающие в методе Service () выхода экземпляра или ожидания этих потоков в течение определенного периода времени. После того, как метод Destry () будет выполнен, веб -сервер отклонит все новые запросы для экземпляра Servlet. Метод Destry () и экземпляр сервлета может быть собрана мусором.
4. Блок -схема сервлета для анализа клиента HTTP -запрос:
1. Веб -клиент выдает HTTP -запрос в контейнер сервлета;
2. Контейнер сервлета анализирует веб -запрос HTTP.
3. Контейнер сервлета создает объект httprequest, инкапсулируя информацию HTTP -запроса в этом объекте;
4. Контейнер сервлета создает объект httpresponse;
5. Контейнер Сервлета (если доступный сервис не создан при запуске сервера, сначала создайте экземпляр сервлета и вызовите метод init () для инициализации объекта) вызовите метод службы () httpservlet и перенести параметры httprequest и httpresponse в качестве методов обслуживания в объект Httpservlet;
6. Httpservlet вызывает соответствующие методы Httprequest для получения информации о запросе HTTP;
7. Httpservlet вызывает соответствующие методы HTTPResponse для генерации данных ответа;
8. Контейнер сервлета передает результат ответа HTTPServlet в веб -клиент.
Приведенная выше статья основана на принципе исполнения Сервлета, а жизненный цикл (всесторонний анализ) - это все контент, которым я делюсь с вами. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.