Сервлет — это специальный класс Java, представляющий собой небольшую программу Java (т. е. небольшое серверное приложение), работающую на веб-сервере. сервлеты обычно получают и отвечают на запросы от веб-клиентов через HTTP (протокол передачи гипертекста). Этот класс Java должен расширять HttpServlet. Каждый сервлет может отвечать на запросы клиентов, сервлеты предоставляют различные методы ответа на запросы клиентов, такие как doGet, doPost, doPut и т. д.
Отношения между Tomcat и Servlet
Tomcat — это сервер веб-приложений и контейнер Servlet/JSP.Как контейнер сервлетов, Tomcat отвечает за обработку клиентских запросов, отправку запросов сервлетам и отправку ответов сервлетов клиентам.Сервлеты — это своего рода сервлеты, работающие на языке Java. .Компоненты на сервере..
Чаще всего сервлеты используются для расширения функциональности веб-сервера Java, обеспечивая очень безопасную, переносимую и простую в использовании альтернативу CGI.
Из запроса и ответа в протоколе http можно узнать, что запрос, отправленный браузером, является текстом запроса, и то, что получает браузер, также должно быть текстом ответа.
Tomcat получает и анализирует текст HTTP-запроса, а затем инкапсулирует его в объект запроса типа HttpServletRequest.Все данные заголовка HTTP можно запросить, вызвав соответствующий метод объекта запроса.
В то же время Tomcat будет инкапсулировать информацию, на которую нужно ответить, как объект ответа типа HttpServletResponse.Установив атрибут ответа, вы можете управлять выводом содержимого в браузер, а затем передавать ответ tomcat, и tomcat будет преобразовать его в формат текста ответа и отправить в браузер.
Java Servlet API — это интерфейс между контейнером сервлета (tomcat) и сервлетом, он определяет различные методы сервлета, а также определяет класс объекта, который контейнер сервлета передает сервлету, наиболее важными из которых являются ServletRequest и ServletResponse. Поэтому, когда мы пишем сервлет, нам нужно реализовать интерфейс сервлета и работать в соответствии с его спецификациями.
Процесс выполнения сервлета
Введите в адресную строку браузера:http://ip:port/appNames/servlet
1) Установить соединение с этим сервером через браузер и ip:port. 2) Браузер сгенерирует пакет запроса (путь appNames/servlet) для отправки запроса на сервер. 3) Сервер получает пакет данных запроса, анализирует путь ресурса запроса для точного позиционирования, ищет appName в файле webapps через запрошенное appName и сопоставляет сервлет (сопоставление), который необходимо получить в web.xml. 4) Сервер создает два объекта: Первый объект: объект запроса, который реализует интерфейс HttpServletRequest, и сервер анализирует данные в пакете запроса и сохраняет их в объекте. Преимущество этого в том, что нет необходимости разбираться в протоколе http, достаточно прочитать запрос. Второй объект: объект-ответ, который реализует интерфейс HttpServletResponse.Функция заключается в том, что результат обработки сервлета может быть сохранен в объекте, а затем сервер формирует ответный пакет в соответствии с данными объекта. 5) Когда сервлет выполняет метод servlet(), он может получить данные запроса через запрос или сохранить результат обработки в ответе. Затем сервер и объект ответа напрямую заключают молчаливое соглашение о создании пакета ответа для браузера. 6) Браузер анализирует ответный пакет, возвращенный сервером, и генерирует результат ответа.
Процесс доступа к сервлету: Http-запрос---->web.xml-------> url-pattern----->servlet-name----->servlet-class-----> QuickStratServlet (соответствует классу файл)
Жизненный цикл сервлета
Жизненный цикл сервлета можно разделить на5шаги
Загрузите сервлет. Когда Tomcat обращается к сервлету в первый раз, Tomcat будет отвечать за создание экземпляра сервлета.
инициализация. Когда сервлет создан, Tomcat вызовет метод init() для инициализации объекта.
Услуги по обработке. Когда браузер обращается к сервлету, сервлет вызывает метод service() для обработки запроса.
разрушать. Когда Tomcat завершает работу или обнаруживает, что сервлет должен быть удален из Tomcat, он автоматически вызывает метод destroy(), чтобы позволить экземпляру освободить занятые ресурсы. Если сервлет не используется в течение длительного времени, он также будет автоматически уничтожен Tomcat.
Удалить. Когда сервлет вызывает метод destroy(), он ожидает сборки мусора. Если сервлет необходимо использовать снова, метод init() будет вызван снова для инициализации.
Краткое содержание:При каждом доступе к сервлету будет вызываться service(). init() вызывается только при первом доступе к сервлету.
destroy() будет вызываться только при закрытии Tomcat.
Настроить сервлет в web.xml###### Использование Springboot
Написать класс сервлета
Начать настройку класса в springboot
@SpringBootApplication
public class ServletApp {
@Bean
public ServletRegistrationBean MyServlet(){
return new ServletRegistrationBean(new MyServlet(),"/myserv/*");
}
public static void main(String[] args){
SpringApplication.run(ServletApp.class, args);
}
}
#Сведения о сервлете
Порядок сопоставления URL-адреса сервлета
Когда запрос отправляется в контейнер сервлета, контейнер сначала принимает запрошенный URL-адрес за вычетом пути текущего контекста приложения в качестве URL-адреса сопоставления сервлета. Например, если я посещаю http://localhost/hiway/user/aaa.html , I Контекст приложения hiway, контейнер удалит http://localhost/hiway, а оставшаяся часть /user/aaa.html будет использоваться для сопоставления сопоставления сервлетов. Процесс сопоставления соответствия является последовательным, и когда сервлет успешно сопоставлен, остальные сервлеты игнорируются. Правила и порядок сопоставления следующие:
точное соответствие пути. Пример: Например, шаблон URL-адреса сервлета A — /test, а шаблон URL-адреса сервлета B — /*. точный путь и обнаружите, что /test точно соответствует servletA, затем вызовите servletA и проигнорируйте другие сервлеты.
совпадение самого длинного пути. Пример: URL-шаблон сервлета A: /test/, а URL-шаблон servletB — /test/a/, при доступе к http://localhost/test/a контейнер выберет сервлет с самым длинным путем для соответствия, который здесь servletB.
Расширенный матч.Если последний сегмент URL-адреса содержит расширение, контейнер выберет соответствующий сервлет на основе расширения. Пример: URL-шаблон сервлета A: *.action
наконец-то,Если ни одно из предыдущих трех правил не найдет сервлет, контейнер выберет соответствующий ресурс запроса в соответствии с URL-адресом. Если приложение определяет сервлет по умолчанию, контейнер отбросит запрос к сервлету по умолчанию.
Являются ли сервлеты синглтоном?
В спецификации сервлета определение одноэлементного и нескольких экземпляров сервлета выглядит следующим образом:
"Дескриптор развертывания" управляет тем, как контейнер сервлета предоставляет экземпляры сервлета. Для сервлета, не размещенного в распределенной среде (по умолчанию), контейнер сервлета должен использовать только один экземпляр для каждого объявления сервлета. Однако для сервлета, реализующего SingleThreadModel интерфейс, контейнер сервлетов может создавать экземпляры нескольких экземпляров для обработки большой нагрузки запросов и сериализации запросов к конкретному экземпляру.
В приведенной выше спецификации упоминается:
Если сервлет не развернут в распределенной среде, обычно сервлет, объявленный в web.xml, соответствует только одному экземпляру.
И если сервлет реализует интерфейс SingleThreadModel, будет инициализировано несколько экземпляров. 20 по умолчанию
Поэтому я лично понимаю, что Servlet — это не синглтон, но контейнер позволяет его инстанцировать только один раз, и реализуется эффект синглтона.
#####Как разрабатывать потокобезопасные сервлеты
Реализовать интерфейс SingleThreadModel.
Используйте синхронизированный для синхронизации операций над общими данными
Избегайте использования переменных экземпляра
Тестирование трех вышеприведенных методов показывает, что с их помощью можно разрабатывать потокобезопасные программы сервлетов. Однако если сервлет реализует интерфейс SingleThreadModel, механизм сервлета будет создавать отдельный экземпляр сервлета для каждого нового запроса, что приведет к большим накладным расходам. SingleThreadModel больше не рекомендуется в Servlet 2.4; кроме того, если в программе используется синхронизация для защиты используемых общих данных, производительность системы будет значительно снижена. Это связано с тем, что блок синхронизированного кода может одновременно выполнять только один поток, что снижает пропускную способность обработки клиентских запросов в одно и то же время, и многие клиенты блокируются. Кроме того, чтобы обеспечить согласованность содержимого основной памяти и данных в рабочей памяти потока, кэш следует часто обновлять, что также сильно повлияет на производительность системы. Следовательно, код синхронизации в сервлете также следует избегать или сводить к минимуму при фактической разработке; ** отказ от использования переменных экземпляра в сервлете — лучший выбор для обеспечения безопасности потоков сервлета. **Из модели памяти Java также может быть известно, что временным переменным в методе выделяется место в стеке, и каждый поток имеет свое собственное пространство стека, поэтому они не будут влиять на безопасность потоков.
означает: Отмечает, должен ли контейнер загружать этот сервлет при запуске. Когда значение равно 0 или больше 0, это указывает на то, что контейнер загружает сервлет при запуске приложения; когда это отрицательное число или оно не указано, это указывает на то, что контейнер загружает сервлет только при выборе сервлета. Чем меньше положительное значение, тем выше приоритет запуска сервлета. После настройки загрузки при запуске сервлет загружается сразу после запуска, но вызывает только метод init() сервлета для инициализации ресурсов, связанных с сервлетом. После успешной инициализации сервлет может ответить на веб-запрос; если загрузка при запуске не настроена, контейнер обычно определяет, инициализирован ли сервлет, когда он отвечает на веб-запрос в первый раз. не инициализирован, вызывается init() сервлета Сначала инициализируйте, а затем отвечайте на запрос после успешной инициализации.
Сервлет по умолчанию по умолчанию
Вы можете настроить / в шаблоне URL, что означает, что сервлет является сервлетом по умолчанию. Что такое сервлет по умолчанию?
При доступе к адресу ресурса все сервлеты не совпадают, обработка назначения сервлетов по умолчанию. Фактически за ответ всех ресурсов в веб-приложении отвечает сервлет, включая статические ресурсы (html-страницы). (При настроенном сервлете по умолчанию доступ к статическим ресурсам невозможен.)