Сервлет, часть II [диаграмма вызова сервлета, сведения о сервлете, ServletConfig, ServletContext]

задняя часть сервер Безопасность Tomcat
Сервлет, часть II [диаграмма вызова сервлета, сведения о сервлете, ServletConfig, ServletContext]

График вызовов сервлета

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

Детали сервлета

Зарегистрированный сервлет может быть отображен несколько раз

Один и тот же сервлет может быть сопоставлен с несколькими 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-адреса сопоставления сервлетов могут использовать подстановочные знаки

Подстановочные знаки имеют два формата:

  1. *.имя расширения
  2. Начинайте с косой черты (/) и заканчивайте «/*».

соответствовать всем

соответствует файлам с расширением .jsp

Если расширение *. и косая черта (/) начинаются и заканчиваются на «/*», появляются оба подстановочных знака, какой из них соответствует?

  1. Тот, кто имеет наибольшее соответствие, будет выбран
  2. *.Расширения имеют самый низкий приоритет

URL-адреса, отображаемые сервлетами, могут использовать подстановочные знаки, а сервлеты могут быть сопоставлены с несколькими URL-адресами:

  1. На каком языке программирования написан скрытый сайт?[.php,.net,.asp фактически обращаются к одному и тому же ресурсу]
  2. ИспользоватьСуффикс Заявление об авторских правах【Сокращение компании】

		 <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..

вопросы безопасности потоков

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

в общем:

  1. еслиПеременные должны быть общими для нескольких пользователей, то при обращении к переменнойДобавить механизм синхронизации synchronized (объект) {}
  2. если переменнаяНе нужно делиться,ноОпределяется непосредственно в doGet() или doPost(), Таким образом, не будет проблем с безопасностью потоков.

load-on-startup

Если элемент настроен в элементе, тоВЕБ-приложение при запуске, будетЗагрузите и создайте экземпляр объекта сервлета,а такжеВызвать метод init() объекта экземпляра сервлета.

эффект:

  1. Напишите InitServlet для веб-приложения, этоСервлет настроен на загрузку при запуске, для всего веб-приложенияСоздайте необходимые таблицы базы данных и данные
  2. Выполните несколько задач на время [регулярно записывайте журналы, регулярно делайте резервные копии данных]

Доступ к любому ресурсу в Интернете является доступом к сервлету

Когда вы запускаете 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?

  1. Поскольку ServletContext представляет текущий веб-сайт, тоВсе сервлеты совместно используют объект ServletContext.,такСвязь между сервлетами может быть достигнута через ServletContext.
  2. ServletConfig получает информацию о параметрах одного настроенного сервлета.ServletContext может получать информацию о параметрах для настройки всего веб-сайта.
  3. Используйте ServletContext для чтения файлов ресурсов веб-сайтов.
  4. Реализовать переадресацию сервлета [Не так много переадресации с 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-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).