Интернет-приложения на JAVA

Когда начинающий программист (я тоже им был и испытывал подобные ощущения) первый раз сталкивается с программированием для Интернет, то количество информации, которое на него обрушивается настолько огромно, что может просто напугать. Странные сочетания TCP/IP, IP-адрес, HTTP, HTML, XML, WEB, JSP, SNMP, SMPP, ICMP, UDP, servlet, proxy, порт, DNS (и это только малая часть всего) могут любого заставить как минимум задуматься: «А смогу ли я это осилить ?». Смело заверяю вас — сможете 🙂
Я постараюсь провести вас через бОльшую часть моментов, которые вам потребуются для того, чтобы научиться программировать Интернет-приложения на Java. Конечно эта информация будет не полной и много информации вам придется искать самим, но небольшую тропинку через цикл создания такого рода программ мы пройдем.

Сетевые протоколы

Если вы уже знакомы с основными принципами работы Web-сервера, то возможно, что эта часть вам будет не очень интересна. Но все-таки мне бы хотелось остановиться на некоторых моментах, которые я считаю важными для понимания того, как писать Web-приложения на Java. В принципе кто-то может сказать — да и это в общем-то не особо важно, но тем не менее хотелось бы упомянуть. В конце концов это же моя статья, а не ваша 🙂
Итак, первое с чего мы начнем — это протоколы TCP/IP и HTTP. Для глубокого понимания TCP/IP вам надо прочитать немало книг. Но мне будет достаточно, если вы будете это воспринимать не так глубоко, а именно понимать две основные вещи:

  1. IP адрес
  2. порт

Рекомендуем: существует очень неплохой ресурс, на котором Вы можете найти немало статей по TCP/IP — Семейство протоколов TCP/IP. Также очень неплохая статья для тех, кто не знает ничего о протоколе — Руководство по TCP/IP для начинающих

 

Если рассматривать эти понятия очень коротко, то IP адрес — это число, которое говорит о том, какой адрес в сети у вашей машины. На сегодня наиболее распространенным адресом является 4-х байтное число — протокол версии 4 (v4). Для удобства его записывают в виде четырех чисел через точку. Например: 96.34.23.11
Т.к. машин в сети становится все больше, то сейчас уже вводится протокол версии 6 (v6). Для него на адрес отводится гораздо больше чисел и превысить это предел уже практически невозможно. Когда-то давно никто не думал, что машин будет столько и поэтому казалось, что 4 байта — это вполне достаточно. Ошиблись.
IP (Internet Protocol) — это специальный протокол, который описывает как пакеты передаются от одной машины в сети к другой. Причем отметим, что передача пакетов в данном протоколе не гарантируется. Могут доставить, а могут и не доставить.
Гарантированной доставкой занимается протокол TCP. Если сравнить IP и TCP с почтовой службой, то IP — это обычная почта, а TCP — это заказные письма с уведомлением о вручении, которые доставят обязательно и вы об этом узнаете. Кроме того, что TCP дает гарантии доставки, этот протокол также занимается тем, что доставляет пакет определенному приложению. Вы же можете запустить несколько приложений для работы с сетью — как они будут понимать, кому какой пакет пришел ? Делается это с помощью дополнительного расширения — порта. Порт — это число от 0 до 2^16. Чаще всего на компьютере какие-то порты уже заняты системными приложениями. Считается, что занимать порт ниже 1000 своим нестандартным приложением — плохой тон. Для работы с Web наиболее популярным портом является порт 80. Хоть он и меньше 1000, но Web все-таки очень важный момент и для него это можно.
Таким образом когда приложение хочет «выйти в сеть», оно запускается и просит у операционной системы занять определенный порт. Если порт свободен — приложение получает его в свое пользование и все пакеты, которые в будущем придут на данную машину на этот порт будут переданы именно этому приложению.

Что еще важно отметить в TCP — это его направленность на соединение. Т.е. пытаясь связаться с другим компьютером в сети (а точнее с приложением находящимся на другом компьютере) TCP сначала убедится, что приложение отвечает и после этого сообщит, что соединение установлено и можно посылать пакеты. В какой-то степени TCP это даже не заказная почта, а телефонный звонок. Раз трубку не подняли — значит ничего посылать нельзя. Если подняли — значит все в порядке, можно говорить, обмениваться информацией. Т.е. TCP использует для соединения IP адрес машины и порт, который используется определенным приложением на данном компьютере.

Таким образом легко сделать вывод — Web-сервер является специальной программой, которая запускается на компьютере и занимает определенный порт. Как уже упоминалось выше наиболее популярный порт — 80.

HTTP — кто это ?

И теперь несколько слов о HTTP. HTTP — это Hyper Text Transfer Protocol — протокол передачи гипертекста. По большому счету передается не какой-то загадочный гипертекст, а самый обычный текст, но раз уж назвали так, значит так тому и быть. Гипертекстом он становиться тогда, когда его показвает браузер. Именно браузер в соответствии с тэгами (мы о них поговорим чуть позже) форматирует текст, делает ссылки (именно это делает текст гипертекстом), показывает рисунки и т.д.
Когда приложение создает TCP/IP соединение с другим приложением (на другом компьютере или на вашем же), то это можно представить себе как некая труба, по которой теперь в обе стороны могут передаваться байты.
HTTP как раз и описывает какие байты (символы) и в каком порядке надо передавать, чтобы клиента и сервер понимали друг друга. HTTP возможно один из самых простых протоколов. На сегодняшний день существует две версии протокола HTTP — 1.0 и 1.1. Наиболее распространенными командами являются GET и POST. Формат запроса выглядит следующим образом:

Для 1.1 запрос несколько сложнее

URL включает в себя путь до ресурса и параметры, которые передаются после пути. Ставим знак вопроса а потом идут пары <имя>=<значение> через знак &. Что-то вроде

GET /rfs/show?showName=direct&secondLetter=123

Как видите, здесь мы запросили ресурс /rfs/show а также передали параметры showName и secondLetter.

Команда POST используется в случае, если параметр в строке не передать. Например, Вы хотите передать двоичный файл — в этом случае команда GET Вам вряд ли подойдет. Формат ее похоже на GET, только параметры передаются более сложным образом — не в строке, а уже после заголовков. Повторю еще раз — после того, как приложения установили между собой TCP соединение они передают друг другу байты (символы). Как аналог TCP-соединение можно рассматривать как — Вы дозвонились по нужному телефону и на том конце подняли трубку. Теперь Вы начинаете общаться — и вот это уже HTTP. Т.е. как говорят «HTTP работает поверх TCP».
Как уже упоминалось выше клиент запрашивает у Web-сервера какой-либо ресурс по имени — URL. И получив запрос сервер уже может решить, что же реально просит пользователь. Иногда это самый простой статический файл, который надо передать. Но очень часто используя URL сервер создает HTML-страницу «на лету». (Это что-то вроде — по телефону спросить: «Продиктуйте мне данные клиента А». В ответ могут продиктовать уже с готового листа, а могут послать запрос в 3-4 места и выдать уже скомпанованную информацию). Созданием такой страницы может заниматься посторонняя программа, которая выводит свои данные не на экран, а в область данных сервера (не совсем точно, но здесь это не требуется) — эта технология до сих пор существует. Называется она CGI — Common Gateway Interface. Работает очень медленно, имеет ужасные возможности по кэшированию. Но тем не менее пока существует.
Java предлагает более элегантное решение — сервлеты.

Первое слово о сервлетах

Что же такое сервлет ? В двух словах описать работу сервлета можно так: Web-сервер, который умеет работать с сервлетами, запускает Java-машину, которая в свою очередь выполняет сервлет, а сервлет отдает данные, которые он сформирует. Т.е. при приходе запроса от клиента сервер с помощью специального конфигурационного файла может определить, какой сервлет выполнить, сервлет выполняется и создает HTML-страницу, которую сервер отправляет клиенту.
А теперь еще раз и медленно 🙂
На сервер приходит запрос от клиента, запрос содержит внутри себя URL и параметры. Сервер имеет специальный конфигурационный файл, который ему сообщает о том, какой сервлет надо выполнить в случае прихода определенного URL. Сервлет выполняется (там вы можете использовать параметры) и создает HTML-страницу, которая отсылается клиенту.
Сервер по сути является контейнером (теперь уже не визуальных компонентов), который загружает сервлеты, выполняет их, вызывая определенные методы и получив от них результат, отправляет его клиенту.
Таким образом сервлет — это Java-класс, который наследуется обычно от класса • HttpServlet и переопределяет часть методов:
• doGet — если мы хотим, чтобы сервлет реагировал на GET запрос.
• doPost — если мы хотим, чтобы сервлет реагировал на POST запрос.
• doPut, doDelete — если мы хотим, чтобы сервлет реагировал на PUT и DELETE запрос (есть и такие в HTTP). Эти методы реализуются крайне редко, т.к. сами команды тоже очень редко встречаются.
• init, destroy — для управления ресурсами в момент создания сервлета и в момент его уничтожения.

Если же необходимо перехватывать все команды, то проще переопределить метод service. Именно этот метод вызывается при приходе запроса от клиента. В HttpServlet происходит разбор запроса и в соответствии с указанной командой вызывается метод doGet, doPost и т.д.
Мы напишем очень простой сервлет, который выведет традиционное Hello, world!.
Но прежде нам необходимо запустить Web-сервер, который поддерживает сервлеты. Наиболее простым для нас будет Tomcat.

HTML и XML

Для понимания дальнейшего материала вам необходимо иметь некоторые знания о двух языках разметки — HTML (Hyper Text Markup Language) и XML (eXtensible Markup Language).

Рекомендуем:
Мне очень понравилась статья по HTML — Изучение HTML 3.2 на примерах.
По XML Вы можете посмотреть статьи на том же ресурсе:
Язык XML — практическое введение
Язык XML — практическое введение. Часть 2

В двух словах — оба языка используют систему «тэгов». Тэг — это набор символов, который заключен в угловые скобки «<«, «>». Для примера:

<B>Жирный текст</B>

Как видите я «открыл» тэг B и после текста «закрыл» его. В принципе ничего сложного. Важно, что будет делать браузер (или другое приложение) который встретит такую последовательность. Для HTML это значит, что текст, который нажодится внутри должен быть выделен «жирным» шрифтом.
Важно понять, что HTML — это просто способ «рассказать» браузеру как форматировать ваш текст. Т.е. используя разные теги вы указываете в каком виде будет выводится ваша информация. Т.е. HTML имеет конкретный набор тэгов, с помощью которых происходит форматирование текста — размеры шрифта, выравнивание, цвет фона и т.д.
В отличии от HTML назначение XML — хранить структуру данных. Вы определяете именно структуру вашего документа, что где и в каком порядке находится, но показывать такой документ браузер по идее не может — ему надо подсказывать как интерпретировать тот или иной тег. Вы можете придумать ваши собственные теги, которые очень важны и понятны именно для вас и вашего документа. К сожалению (а может и к радости) эта тема требует отдельной книжки, поэтому здесь мы останавливаться не будем.
Очень прошу только одного — ознакомиться с общими понятиями HTML И XML для понимания дальнейшего. Хватит простого понимания — тонкости будете изучать сами в дальнейшей самостоятельной работе.

Запускаем Web-сервер Tomcat

Загрузить Tomcat можно с сервера — Apache Tomcat.
Слева вы увидите список версий Tomcat – выбирайте подходящую (я тестировал свое приложение на версии 6). ВНИМАНИЕ: Прежде чем загрузить файл посмотрите, какую версию JVM Вы используете. Если 1.4, то Tomcat версии 6.x/5.5 вам не подойдет. Существует дополнительная библиотека, которая решает проблему совместимости, но мой вам искренний совет — поставьте себе JVM 1.5 и вы избежите проблем с установкой. В принципе вы не должны были легко пройти предыдущие части, т.к. там тоже требуется версия Java 1.5 и выше.

По сути вы загрузите архив, который надо просто распаковать в какую-либо директорию. Я обычно создаю отдельную папку JAVA в которую устанавливаю все свои пакеты, IDE, JDK и прочие штуки. Само собой каждый пакет имеет свою собственную директорию.
В будущем я буду использовать значение TOMCAT_HOME, чтобы показать, в какой директории внутри установленного сервера Tomcat вы должны что-то запускать, устанавливать или менять.
Также ОЧЕНЬ ВАЖНО — вам надо установить переменную окружения JAVA_HOME. Она должна указывать на путь до корневой директории установленного JDK.
Для Windows это делается так:
Пуск->Настройка->Панель управления->Система->Дополнительно->Переменные среды.
Для Unix вам просто необходимо из командной строки создать переменную JAVA_HOME или прописать ее в начальных настройках. (Думаю, что для тех, кто пользуется Unix это не составит проблем).
Если мне не изменяет память, для ранних версий Tomcat необходимо было также сосздать переменную TOMCAT_HOME, но теперь это не обязательно. Так что можно не делать.
После того, как вы установили Tomcat давайте проверим его работоспособность. Для этого зайдите в директорию <TOMCAT_HOME>\bin и запустите файл startup.bat. Если вы ничего не напутали, то должно запуститься DOS-окно, в которое выводится разная информация. Посмотрите за тем, чтобы не было сообщений об ошибках — их сразу видно — обычно выдается полный стек методов. Самое главное сообщение для вас должно появиться в самом конце (обычно надо подождать 5-10 секунд — при условии, что Tomcat не содержит много приложений)

INFO: Server startup in 8828 ms

Количество миллисекунд конечно может быть не таким. Если все прошло успешно запустите браузер и наберите в нем

http://localhost:8080/

8080 — это порт по умолчанию, который занимает Tomcat. Порт 80 он не трогает. Хотя если вам необходимо использовать другой порт — зайдите в директорию <TOMCAT_HOME>\conf и окройте файл server.xml. Поищите в нем строки

Как видите, можно поменять порт 8080 на любой другой, который вам удобен. Не забудьте, что при изменении файла вам необохдимо перезапустить Tomcat.
Итак, если вы набрали указанный URL, то перед вашим взором откроется главная страница сервера Tomcat с симпатичным и (могу вас уверить) очень широко известным котом в левом верхнем углу. (Хотя мне кажется, что это больше напоминает тигра — может так оно и есть ?)

В правой верхней части будет успокаивающая надпись

If you’re seeing this page via a web browser, it means you’ve setup Tomcat successfully. Congratulations!

И примите мои поздравления тоже — вы только что запустили свой личный Web-сервер.

Популярнейший сервлет — Hello, World

Как выясняется, просто написать сервлет мало. Его надо скомпилировать и после этого установить на наш сервер. И надо установить так, чтобы сервер знал, как им пользоваться.
Все приложения, которые регистрируются в Tomcat обычно помещаются в директорию <TOMCAT_HOME>\webapps. Хотя существует способ, позволяющий размещать ваши приложения там, где вам удобно. Но мы не будем пока пользоваться этим вариантом — если захотите, можете самостоятельно проработать это вопрос. Учтите, что другие Web-сервера с возможностью работы с сервлетами могут использовать другие каталоги — будьте внимательны.
Давайте напишем самый просто сервлет и прокомментируем его код. Важно отметить, что мы поместили наш сервлет (класс) в новый пакет -students.web. Так что вам надо будет создать необходимые каталоги.

Как видите мы унаследовались от библиотечного класса HttpServlet и переопределили один метод — doGet.
Теперь остановимся на нескольких важных моментах:

  1. Вызов setContentType. Этот метод важен для тех, кто использует русский язык — прежде чем показывать страницу с русским тесктом браузер должен быть проинформирован, что именно русский текст мы собираемся выводить на экран и браузер должен использовать кодировку. которая нам подходит.
  2. Получение Writer-класса для вывода данных. Здесь очень важно отметить следующий момент — вывод может осуществляться как посимвольно, так и побайтно. Для вывода текста используется посимвольный вывод, для вывода двоичных файлов используется побайтный. Для более полного понимания лучше посмотреть информацию как устроены потоки ввода/вывода для Java.

Для Java разница между символом и байтом очень важна — т.к. Java расчитана на будущее, то для символа в ней используется два байта, а не один как это было в ранних языка С или Паскаль. Именно для разделения типов потоков ввода/вывода используются разные классы. Reader/Writer — чтение/запись символов. InputStream/OutputStream — чтение/запись байтов.
В нашем случае мы выводим текст и поэтому получаем Writer. Этот класс позволяет нам писать в него самый обычный HTML текст. Что мы и делаем. Для сборки сервлета вам не хватит стандартной библиотеки JDK — необходимо подключить дополнительные библиотеки. И такая библиотека на наше счастье есть в поставке Tomcat — посмотрите ее в директории <TOMCAT_HOME>\common\lib. Это servlet-api.jar. Давайте подключим ее к строке сборки. Я просто скопировал нужный JAR в каталог с проектом. Наша строка для сборки будет выглядеть следующим образом:

 

javac -cp .;servlet-api.jar students\web\*.java
Для примера надо
javac -encoding UTF-8 -cp .;servlet-api.jar students\web\*.java
Обратите внимание — в архиве приведено две версии. Уберите ненужные комментарии и поставьте там, где надо.

Итак наш сервлет собран и готов к установке. Для установки нам необходимо проделать еще ряд действий.

  1. Создадим директорию studentsApp в каталоге <TOMCAT_HOME>\webapps
  2. Внутри созданной дирекотории создадим еще одну директорию — WEB-INF
  3. Внутри этой директории создайте директорию classes.
  4. Поместите туда наш тестовый класс с учетом пакетов. Т.е. полный путь до нашего класса должен быть таким:
    <TOMCAT_HOME>\webapps\studentsApp\WEB-INF\classes\students\web\HelloWorldServlet.class
  5. Теперь необходимо определить файл web.xml, который «расскажет» Tomcat о том, как пользоваться нашим сервлетом. Некоторые IDE предоставляют специальные редакторы для web.xml — может они вам потом будут помогать. Но для начала мы можем написать этот файл самостоятельно.

Выглядит он достаточно просто:

 

Стоит выделить несколько моментов:

  1. Тэг web-app является корневым тэгом. Он может содержать дополнительные аттрибуты, но нам они в данный момент не нужны. Все остальыне тэги находятся внутри него.
  2. Тэг servlet содержит внутри себя тэги, которые описывают сервлет. Тэг servlet-name содержит внутри себя какое-то имя — вы можете использовать то, что вам больше нравится. Тэг servlet-class должен содержать реальное имя класса. В нашем случае мы поместили наш класс в пакет students.web и полное имя класса будет students.web.HelloWorldServlet.
  3. Тэг servlet-mapping. Здесь мы определяем URL, который пользователь будет запрашивать для получения данных от нашего сервлета. Точнее будет сформулировать так: мы определяем какой сервлет будет обрабатывать введенный URL.

Тэг servlet-name содержит имя, которое мы определили в п.2 (там тоже есть тэг servlet-name), а тэг url-pattern включает в себя URL.
Файл web.xml должен располагаться в каталоге <TOMCAT_HOME>\webapps\studentsApp\WEB-INF\. Т.е полный путь до файла выглядит так:

 

<TOMCAT_HOME>\webapps\studentsApp\WEB-INF\web.xml

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

http://localhost:8080/studentsApp/hello

Стоит отметить, что т.к. мы разместили наш сервлет в отдельной директории studentsApp, то URL должен включать эту директорию. Если вы не ошиблись при наборе данных, то по идее вы должны увидеть текст, который мы создали в нашем сервлете. Принимайте поздравления.

Использование базы данных

Для того, чтобы начать использовать нашу базу данных все, что нам надо — создать еще один каталог и скопировать туда наш JAR для работы с базой данных — mysql-connector-java-3.1.13-bin.jar. Каталог называется <TOMCAT_HOME>\webapps\studetnsApp\WEB-INF\lib

Соответственно полный путь до файла будет: <TOMCAT_HOME>\webapps\studetnsApp\WEB-INF\lib\mysql-connector-java-3.1.13-bin.jar

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

Наша строка для сборки будет выглядеть следующим образом:
javac -cp .;servlet-api.jar students\web\*.java students\logic\*.java
Для примера надо
javac -encoding UTF-8 -cp .;servlet-api.jar students\web\*.java students\logic\*.java

Теперь мы должны скопировать не только файл HelloWorldServlet.class, но и все class-файлы из каталога students.logic. Таким образом структура каталога <TOMCAT_HOME>\webapps\studetnsApp\WEB-INF\ выглядит теперь так:

Теперь мы можем запустить наш Tomcat и попробовать исполнить обновленную версию сервлета. Я советую вам поэкспериментировать с нашим сервлетом — попробуйте вывести список студентов, студентов для определенной группы и т.п. А впереди нас ждут Java Server Pages — Часть 8 — JSP: расширяем возможности

Архив с исходными кодами: Исходный код

20 comments to WEB: что такое Servlet ?

  • Роман  says:

    Хорошая статья,но было бы неплохо видеть еще код ManagementSystem.class. А то не совсем понятно что там.
    Спасибо

  • Konstantin  says:

    Здравствуйте, в вашем примере, файл web.xml не работает. Автор писал что статьи старые и возможно, что-то уже работает по другому. Так вот файл web.xml надо скопировать из папки — C:\apache-tomcat-8.0.21\webapps\ROOT\WEB-INF в папку WEB-INF своего проекта и подправить под себя, дописав недостающие строки в конечном итоге он будет выглядеть так —
    ———————————————————————————

    Welcome to Tomcat

    Welcome to Tomcat

    hello
    students.web.HelloWorldServlet

    hello
    /hello

    —————————————————————————-

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

    • Konstantin  says:

      видимо стоит ограничение на код в комментариях и код правильного варианта web.xml не отображается. Но мысль я донес — в варианте этого файла, который предлагает автор, не хватает строк которые есть в web.xml который находится, повторюсь, в папке — C:\apache-tomcat-8.0.21(или какая там у вас версия)\webapps\ROOT\WEB-INF\web.xml

  • Alex  says:

    Спасибо за цикл статей, очень полезно.
    Одна только проблема, с которой столкнулся — никак не могу добиться корректного отображения кириллицы в браузере.
    Русский текст получается в таком виде: ��� ������ ���
    Думал, что проблема в томкате 8, установил 6, но проблема не ушла.
    Возможно, проблема возникает при компиляции (использую idea 14).
    В общем, разбираюсь еще.

    • Alex  says:

      Видимо, проблема с jdk 1.8, при компиляции из cmd выдает следующее:
      unmappable character for encoding utf-8
      на каждую русскую букву.
      Попробую установить более старую версию ждк

    • Alex  says:

      Попытка компиляции в 6й ждк ничего не дала, ошибка та же.
      В нете решения проблемы найти не могу.
      Возможно, проблема с кодировкой ОП, идей почти нет.
      Я уже близок к тому, чтобы отказатья от кириллицы пока.
      Реально жалко 2х дней, убитых на эту проблему.

      • admin  says:

        Так код какой ? Скачанный пример или что-то свое ?

        • Alex  says:

          Да и свой, и скачанный пример тоже не компилились корректно.
          Я уже разобрался. Сначала я открыл *.java файл в блокноте, сохранил его в формате UTF-8, после чего открыл это в Notepad++ и снова увидел там каракули)). Исправил текст заново в нотпаде и сохранил файл. После чего скомпилил его без ошибок через консоль.
          Потом в Idea создал новый проект и поменял все кодировки на UTF-8 (по умолчанию там было windows-1251), после чего все стало компилиться нормально в Idea.
          Изменения кодировки в уже существующем проекте не помогло, что я изначально и пробовал. Потому я и грешил то на томкат, то на ждк, то еще на что-то.
          Но опять же, странно, что и скачанный файл выдавал те же ошибки при компиляции, я не видел, чтобы еще у кого-то здесь были такие проблемы.
          Ну ничего, я рад, что это удалось пофиксить, как говорил А.С. Пушкин, опыт — сын ошибок трудных ))

          • admin  says:

            Для компиляции из командной строки надо использовать дополнительный ключик -encoding — иначе в UTF-8 из командной строки с русскими буквами может не скомпилироваться.

          • Alex  says:

            Да, конечно, компилил с ключом, на что и получал unmappable character for encoding utf-8
            на каждую русскую букву.

          • Dmitriy  says:

            Возникла ошибка, похожая на ошибку Alex (только у Alex русские символы выводились в ромбиках с вопросами, у меня просто выводились вопросы (ошибки на разных этапах)).
            В общем ошибку я нашел, но так и не понял в чем она.
            Ошибка находится в данной строке:
            response.setContentType(«text/html,charset=utf-8»); — ошибочная строка
            response.setContentType(«text/html;charset=utf-8»); — исправленная строка

            Не знаю почему, но эти с виду две одинаковые строки работают по разному. Первую я сам набрал в блокноте в кодировке UTF-8, вторую скопировал отсюда. Почему моя не работает — так и не понял.

          • admin  says:

            Лучше использовать не setContentType, а setCharacterEncoding.
            В первом случае устанавливается общий тип возвращаемой информации — в данном случае это HTML в кодировке UTF-8. Все перечисляется через точку с запятой.
            Во втором случае можно просто использовать «utf-8». Это простоу указаие, что кодировка UTF-8.

          • Dmitriy  says:

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

            Если кто-то знает, что здесь происходит, прошу прокомментировать.

            Спасибо!

          • Dmitriy  says:

            Я тупица. Вместо точки с запятой поставил запятую.
            Прошу прощения за беспокойство.

  • Log1c  says:

    Спасибо, наконец-то, статья с примером, который работает. До этого на 7 ресурсах примеры просто не компилировались.

    От себя добавлю что у меня была проблема с тем что правильный изменял файл java, компилировал в class, скидывал в соответствующую папку с Tomcat, заходил по url, а изменений не было.
    Решил тем что перезапустил Tomcat в службах. Видно он что-то у себя хеширует или chrome тем же занимается.

  • Женя  says:

    воистину, шокирует, когда пересаживаешься с десктоп-разработки… вообще поражаюсь, как это всё ещё работает. тыща конфигов, понятий. как дебажить, если не заводится, непонятно, документации официальной на целую библиотеку. это ещё простейшие примеры, там же целая тьма, всякие Maven, ivy, фреймворки — каждый со своей логикой и т.д. и т.п… до продакшна вообще не доживёшь, если начинаешь с нуля.
    руки опускаются всё это изучать, когда представляешь себе объёмы. не представляю, как это всё изучается в вузах.

    спасибо за статью!
    к сожалению, самая востребованная отрасль в программировании на текущий день. =(

    • admin  says:

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

  • Алексей  says:

    Спасибо за статью всё получилось с первого раза.
    Проблема была в том что делал через мавен проект, парился с зависимостью, може кому поможет. Нужно добавить в pom.xml след код.

    org.apache.tomcat
    tomcat-servlet-api
    8.5.3

    • admin  says:

      Можно обойтись

  • zilog  says:

    от 0 до 2^16-1

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.