Студенческий отдел кадров
Пособие по JAVA-технологиям
(с) AntonSaburov
Когда начинающий программист (я тоже им был и испытывал подобные ощущения) первый раз сталкивается
с программированием для Интернет, то количество информации, которое на него обрушивается настолько
огромно, что может просто напугать. Странные сочетания TCP/IP, IP-адрес, HTTP, HTML, XML, WEB, JSP,
SNMP, SMPP, ICMP, UDP, servlet, proxy, порт, DNS (и это только малая часть всего) могут любого
заставить как минимум задуматься: "А смогу ли я это осилить ?". Смело заверяю вас - сможете :)
Я постараюсь провести вас через бОльшую часть моментов, которые вам потребуются для того, чтобы
научиться программировать Интернет-приложения на Java. Конечно эта информация будет не полной и
много информации вам придется искать самим, но небольшую тропинку через цикл создания такого рода
программ мы пройдем.
Если вы уже знакомы с основными принципами работы Web-сервера, то возможно, что эта часть вам будет
не очень интересна. Но все-таки мне бы хотелось остановиться на некоторых моментах, которые я считаю
важными для понимания того, как писать Web-приложения на Java. В принципе кто-то может сказать - да
и это в общем-то не особо важно, но тем не менее хотелось бы упомянуть. В конце концов это же моя
статья, а не ваша :)
Итак, первое с чего мы начнем - это протоколы TCP/IP и HTTP. Для глубокого понимания 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 - это
Hyper Text Transfer Protocol - протокол передачи гипертекста. По большому
счету передается не какой-то загадочный гипертекст, а самый обычный текст, но раз уж назвали так,
значит так тому и быть. Гипертекстом он становиться тогда, когда его пказвает броузер. Именно броузер
в соответсвтии с тэгами (мы о них поговорим чуть позже) форматирует текст, делает ссылки (именно
это делает текст гипертекстом), показывает рисунки и т.д.
Когда приложение создает TCP/IP соединение с другим приложением (на другом компьютере или на вашем же),
то это можно представить себе как некая труба, по которой теперь в обе стороны могут передаваться
байты.
HTTP как раз и описывает какие байты (символы) и в каком порядке надо передавать, чтобы клиента и
сервер понимали друг друга. HTTP возможно один из самых простых протоколов. На сегодняшний день
существует две версии протокола HTTP - 1.0 и 1.1. Наиболее распространеннымим командами являются
GET и POST. Формат запроса выглядит
следующим образом:
GET <URL> HTTP/1.0
<Имя_заголовка_1>:<значение_заголовка_1>
Для 1.1 запрос несколько сложнее
GET <URL> HTTP/1.0
Host: <host>
<Имя_заголовка_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 (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 для понимания дальнейшего.
Хватит простого понимания - тонкости будете изучать сами в дальнейшей самостоятельной работе.
Загрузить 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. Поищите в нем строки
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
Как видите, можно поменять порт 8080 на любой другой, который вам удобен. Не забудьте, что при
изменении файла вам необохдимо перезапустить Tomcat.
Итак, если вы набрали указанный URL, то перед вашим взором откроется главная страница сервера
Tomcat с симпатичным и (могу вас уверить) очень широко известным котом в левом верхнем углу.
(Хотя мне кажется, что это больше напоминает тигра - может так оно и есть ?)
В правой верхней части будет успокаивающая надпись
If you're seeing this page via a web browser, it means you've setup Tomcat successfully. Congratulations!
И примите мои поздравления тоже - вы только что запустили свой личный Web-сервер.
Как выясняется, просто написать сервлет мало. Его надо скомпилировать и после этого установить на
наш сервер. И надо установить так, чтобы сервер знал, как им пользоваться.
Все приложения, которые регистрируются в Tomcat обычно помещаются в директорию
<TOMCAT_HOME>\webapps. Хотя существует способ, позволяющий
размещать ваши прилоежния там, где вам удобно. Но мы не будем пока пользоваться этим вариантом -
если захотите, можете самостоятельно проработать это вопрос. Учтите, что другие Web-сервера с
возможностью работы с сервлетами могут использовать другие каталоги - будьте внимательны.
Давайте напишем самый просто сервлет и прокомментируем его код. Важно отметить, что мы поместили
наш сервлет (класс) в новый пакет - students.web. Так что вам надо
будет создать необходимые каталоги.
package students.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.println("<H1>Hello, world! или Привет мир</H1>"); } }
Как видите мы унаследовались от библиотечного класса
HttpServlet и переопределили один метод -
doGet.
Теперь остановимся на нескольких важных моментах:
javac -cp .;servlet-api.jar students\web\*.java
Для примера надо
javac -encoding UTF-8 -cp .;servlet-api.jar students\web\*.java
Обратите внимание - в архиве приведено две версии. Уберите ненужные комментарии и поставьте там,
где надо.
Итак наш сервлет собран и готов к установке. Для установки нам необходимо проделать еще ряд действий.
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>students.web.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
Стоит выделить несколько моментов:
<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
Ну и конечно же изменим наш сервлет для того, чтобы он получал данные из базы данных. Новый код для нашего сервлета станет несколько сложнее.
package students.web; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import students.logic.Group; import students.logic.ManagementSystem; public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.println("<B>Список групп</B>"); pw.println("<table border=1>"); try { List<Group> l = ManagementSystem.getInstance().getGroups(); for (Group gr : l) { pw.println("<tr>"); pw.println("<td>" + gr.getGroupId() + "</td>"); pw.println("<td>" + gr.getNameGroup() + "</td>"); pw.println("<td>" + gr.getCurator() + "</td>"); pw.println("<td>" + gr.getSpeciality() + "</td>"); pw.println("</tr>"); } } catch (Exception e) { throw new ServletException(e); } pw.println("</table>"); } }
Наша строка для сборки будет выглядеть следующим образом:
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\ выглядит теперь так:
WEB-INF
classes
students
logic
-Group.class
-ManagementSystem.class
-Student.class
web
-HelloWorldServlet.class
lib
-mysql-connector-java-3.1.13-bin.jar
-web.xml
Теперь мы можем запустить наш Tomcat и попробовать исполнить обновленную версию сервлета. Я советую вам поэкспериментировать с нашим сервлетом - попробуйте вывести список студентов, студентов для определенной группы и т.п. А впереди нас ждут Java Server Pages - Часть 8 - JSP: расширяем возможности
Архив с исходными кодами: Исходный код
Содержание