График вызовов сервлета
Мы изучили жизненный цикл сервлетов раньше, и мы рисуем диаграмму вызовов сервлетов в соответствии с жизненным циклом сервлетов, чтобы углубить наше понимание.
Детали сервлета
Зарегистрированный сервлет может быть отображен несколько раз
Один и тот же сервлет может быть сопоставлен с несколькими URL-адресами.
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>zhongfucheng.web.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/Demo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/ouzicheng</url-pattern>
</servlet-mapping>
Независимо от того, посещаю ли я http://localhost:8080/Demo1 или http://localhost:8080/ouzicheng. Все, что я посещаю, это Demo1.
URL-адреса сопоставления сервлетов могут использовать подстановочные знаки
Подстановочные знаки имеют два формата:
- *.имя расширения
- Начинайте с косой черты (/) и заканчивайте «/*».
соответствовать всем
соответствует файлам с расширением .jsp
Если расширение *. и косая черта (/) начинаются и заканчиваются на «/*», появляются оба подстановочных знака, какой из них соответствует?
- Тот, кто имеет наибольшее соответствие, будет выбран
-
*.
Расширения имеют самый низкий приоритет
URL-адреса, отображаемые сервлетами, могут использовать подстановочные знаки, а сервлеты могут быть сопоставлены с несколькими URL-адресами:
- На каком языке программирования написан скрытый сайт?[.php,.net,.asp фактически обращаются к одному и тому же ресурсу]
- ИспользоватьСуффикс Заявление об авторских правах【Сокращение компании】
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>zhongfucheng.web.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>*.net</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>*.asp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
Сервлеты являются синглтонами
Почему сервлеты являются синглтонами
Браузер делает несколько запросов к сервлету, в целом,Сервер создает только объект сервлета, то есть объект сервлетаПосле создания, будетНаходится в памяти и обслуживает последующие запросы, пока сервер не выключится..
Объект запроса и объект ответа обновляются каждый раз, когда вы посещаете
заза запрос на посещение, механизм сервлетаСоздайте новый объект запроса HttpServletRequest и новый объект ответа HttpServletResponse., а затем объединить эти дваОбъект передается в качестве параметра методу service() вызываемого им сервлета.,Затем метод вызывает вариант осуществления метода запроса на обслуживание, соответственно, doXXX..
вопросы безопасности потоков
Когда несколько пользователей обращаются к сервлету,Сервер создаст поток для каждого пользователя.Проблемы безопасности потоков возникают, когда несколько пользователей одновременно обращаются к общим ресурсам сервлета..
в общем:
- еслиПеременные должны быть общими для нескольких пользователей, то при обращении к переменнойДобавить механизм синхронизации synchronized (объект) {}
- если переменнаяНе нужно делиться,ноОпределяется непосредственно в doGet() или doPost(), Таким образом, не будет проблем с безопасностью потоков.
load-on-startup
Если элемент настроен в элементе, тоВЕБ-приложение при запуске, будетЗагрузите и создайте экземпляр объекта сервлета,а такжеВызвать метод init() объекта экземпляра сервлета.
эффект:
- Напишите InitServlet для веб-приложения, этоСервлет настроен на загрузку при запуске, для всего веб-приложенияСоздайте необходимые таблицы базы данных и данные
- Выполните несколько задач на время [регулярно записывайте журналы, регулярно делайте резервные копии данных]
Доступ к любому ресурсу в Интернете является доступом к сервлету
Когда вы запускаете Tomcat, вы вводите http://localhost:8080 в URL-адресе. Почему появляется страница котенка Tomcat?
Это сделаноСервлет по умолчанию служит вам!
- Давайте посмотрим на конфигурацию в файле web.xml.Файл web.xml настраивает сервлет по умолчанию.
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- Что такое сервлет по умолчанию? Что-нибудь в файле web.xmlURL-адрес соответствующего элемента не найден, их доступЗапросы будут переданы сервлету по умолчанию для обработки., это,Сервлет по умолчанию используется для обработки запросов доступа, которые не обрабатываются всеми другими сервлетами.
- Поскольку я сказал, что доступ к любому ресурсу в Интернете является доступом к сервлету, тоКогда я обращаюсь к статическим ресурсам [локальным изображениям, локальным файлам HTML], я также обращаюсь к этому сервлету по умолчанию [DefaultServlet]
- Просто для подтверждения: когда я не настраиваю сервлет по умолчанию вручную,Доступ к локальным изображениям доступен
- Теперь я сам настраиваю сервлет по умолчанию,Demo1 — это сервлет по умолчанию, который я настроил вручную, перезаписав сервлет по умолчанию, настроенный в web.xml.
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>zhongfucheng.web.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- Далее я буду продолжать посещать картину только сейчас, и выход в это времяСодержимое, написанное в сервлете Demo1
- Резюме: ** Независимо от того, к какому ресурсу [включая JSP] осуществляется доступ в Интернете, он обращается к сервлету. **Если сервлет по умолчанию не настроен вручную,Вы посещаете статическое изображение, статическую веб-страницу, сервлет по умолчанию будет искать изображение или веб-страницу на вашем веб-сайте., если есть, вернуть в браузер, если нет, сообщить об ошибке 404
Объект ServletConfig
Каково использование объекта ServletConfig?
Через этот объект можно прочитать параметры инициализации, настроенные в web.xml.
Теперь возникает вопрос,Почему мы помещаем информацию о параметрах в файл web.xml?? Мы можем определить информацию о параметрах непосредственно в программе,В чем преимущество файла web.xml??
Преимущества:Может сделать вашу программу более гибкой[Для замены требований достаточно изменить файл конфигурации web.xml, код программы менять не нужно]
Получите информацию о параметрах, настроенную файлом web.xml.
- Настройте параметр для Servlet Demo1, имя параметра — имя, а значение — zhongfucheng.
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>zhongfucheng.web.Demo1</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>zhongfucheng</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/Demo1</url-pattern>
</servlet-mapping>
- Получите объект ServletConfig в сервлете и получите параметры, настроенные в файле web.xml, через объект ServletConfig.
Объект ServletContext
Что такое объект servletContext?
Когда Tomcat запускается, он создает объект ServletContext. Этопредставляет текущий веб-сайт
Какая польза от ServletContext?
- Поскольку ServletContext представляет текущий веб-сайт, тоВсе сервлеты совместно используют объект ServletContext.,такСвязь между сервлетами может быть достигнута через ServletContext.
- ServletConfig получает информацию о параметрах одного настроенного сервлета.ServletContext может получать информацию о параметрах для настройки всего веб-сайта.
- Используйте ServletContext для чтения файлов ресурсов веб-сайтов.
- Реализовать переадресацию сервлета [Не так много переадресации с ServletContext, в основном с переадресацией запроса]
Связь между сервлетами
Объект ServletContext можно вызватьдоменный объект
Здесь может возникнуть вопрос, а что такое доменный объект? На самом деле объект предметной области может быть просто понят какКонтейнер [похожий на коллекцию карт]
Необходимо реализовать связь между сервлетамиИспользуйте метод setAttribute (имя строки, объект объекта) ServletContext, Первый параметр — это ключевое слово, а второй параметр — это объект, который вы хотите сохранить.
- Вот код для Demo2
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
String value = "zhongfucheng";
//MyName作为关键字,value作为值存进 域对象【类型于Map集合】
servletContext.setAttribute("MyName", value);
- Это код демо3
//获取ServletContext对象
ServletContext servletContext = this.getServletContext();
//通过关键字获取存储在域对象的值
String value = (String) servletContext.getAttribute("MyName");
System.out.println(value);
- При доступе к Demo3 можно получить информацию, хранящуюся в Demo2, чтобы реализовать связь между несколькими сервлетами.
Получить информацию о конфигурации веб-сайта
Если я хочу, чтобы все сервлеты могли получать информацию о подключении к базе данных, то невозможно настроить каждый сервлет в файле web.xml, поэтому объем кода слишком велик! И это будет выглядеть очень многословно и избыточно.
- поддержка файла web.xmlНастройка информации о параметрах для всего сайта【Все сервлеты могут получать информацию об этом параметре.】
<context-param>
<param-name>name</param-name>
<param-value>zhongfucheng</param-value>
</context-param>
- Код демо4
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
//通过名称获取值
String value = servletContext.getInitParameter("name");
System.out.println(value);
- Попробуйте посмотреть, может ли Demo3 получить его, тот же код
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
//通过名称获取值
String value = servletContext.getInitParameter("name");
System.out.println(value);
прочитать файл ресурсов
Первый способ:
- Теперь я хочу прочитать изображение 1.png через Servlet111
- Как мы привыкли, код должен выглядеть так.
FileInputStream fileInputStream = new FileInputStream("1.png");
System.out.println(fileInputStream);
- Когда мы посетили, что-то пошло не так! Сказать1.png файл не найден
- Почему это? мыПри чтении файла ранее, если программа и файл находятся в одном и том же имени пакета, вы можете напрямую получить имя файла через имя файла.! , причина проста,Раньше программы, которые мы писали, запускались через JVM, но теперь мы запускаем их через Tomcat.
- Согласно спецификации веб-каталога, скомпилированные файлы классов сервлета хранятся в папке WEB-INF\classes.
- Увидев здесь, мы знаемЧтобы войти в каталог классов, чтобы прочитать файл, поэтому мы меняем код на следующий
FileInputStream fileInputStream = new FileInputStream("D:\\zhongfucheng\\web\\WEB-INF\\classes\\zhongfucheng\\web\\1.png");
System.out.println(fileInputStream);
- Когда вы прочитаете его снова, вы обнаружите, что можете получить файл.
- Но вот опять проблема,Когда я прочитал файл, который будет написан на абсолютном пути, это слишком негибкое. Представьте, если бы я былМодуль, который читает файл, перемещен на другой веб-сайт.,Мой код нужно снова изменить [потому что название веб-сайта другое].
- мы проходимЧтение ServletContext может избежать изменения кода, так как объект ServletContext создается на основе текущего веб-сайта.
- Код выглядит следующим образом:
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
//调用ServletContext方法获取到读取文件的流
InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/classes/zhongfucheng/web/1.png");
Второй способ:
- если мойфайл в веб-каталоге, то все намного проще! ,Вы можете получить его непосредственно по имени файла
- Код выглядит так
//获取到ServletContext对象
ServletContext servletContext = this.getServletContext();
//调用ServletContext方法获取到读取文件的流
InputStream inputStream = servletContext.getResourceAsStream("2.png");
Третий способ:
пройти черезЗагрузчик классов читает файл ресурсов.
- мой файл находится вВ каталоге src [также называемом каталогом классов]
- Код выглядит так
//获取到类装载器
ClassLoader classLoader = Servlet111.class.getClassLoader();
//通过类装载器获取到读取文件流
InputStream inputStream = classLoader.getResourceAsStream("3.png");
- Мои файлы находятся под пакетом в каталоге src
- Код выглядит следующим образом, просто добавьте путь к имени пакета.
//获取到类装载器
ClassLoader classLoader = Servlet111.class.getClassLoader();
//通过类装载器获取到读取文件流
InputStream inputStream = classLoader.getResourceAsStream("/zhongfucheng/web/1.png");
в общем:Если файл слишком большой, он не может быть прочитан загрузчиком классов, что вызовет переполнение памяти.
Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже 5,8 тыс. звезд):GitHub.com/Zhongf UC очень…
если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, поищите в WeChat.Java3y.
Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).