Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Часть 7 - Первые шаги в Интернет

Поиск:
Интернет-приложения на 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 Вам надо прочитать немало книг. Но мне будет достаточно, если Вы будете это воспринимать не так глубоко, а именно понимать две основные вещи:
- IP адрес
- порт

Рекомендуем - существует очень неплохой ресурс, на котором Вы можете найти немало статей по TCP/IP - http://www.citforum.ru/internet/tifamily/. Также очень неплохая статья для тех, кто не знает ничего о протоколе - http://www.codenet.ru/webmast/tcpip.php

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
Формат запроса выглядит следующим образом:

GET <URL> HTTP/1.0
<Имя_заголовка_1>:<значение_заголовка_1>

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

GET <URL> HTTP/1.1
Host: <host>
<Имя_заголовка_1>:<значение_заголовка_1>

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

Команда 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 запрос. Эти методы реализуются крайне редко, т.к. сами команды тоже очень редко встречаются.
init, destroy - для управления ресурсами в момент создания сервлета и в момент его уничтожения.
Если же необходимо перехватывать все команды, то проще переопределить метод service. Именно этот метод вызывается при приходе запроса от клиента. В HttpServlet происходит разбор запроса и в соответствии с указанной командой вызывается метод doGet, do Post и т.д.

Мы напишем очень простой сервлет, который выведет традиционное Hello, world!.
Но прежде нам необходимо запустить WEB-сервер, который поддерживает сервлеты. Наиболее простым для нас будет Tomcat.


HTML и XML

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

Рекомендуем: Мне очень понравилась статья по HTML "Изучение HTML 3.2 на примерах" - http://www.citforum.ru/internet/html3.2ex/index.shtml. По XML Вы можете посмотреть статью на том же ресурсе - http://www.citforum.ru/internet/xml/index.shtml и http://www.citforum.ru/internet/xml2/index.shtml
В двух словах - оба языка используют систему "тэгов". Тэг - это набор символов, который заключен в угловые скобки "<", ">".
Для примера:
Код

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

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


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

Загрузить Tomcat можно с сервера - http://tomcat.apache.org/

ВНИМАНИЕ: Прежде чем загрузить файл посмотрите, какую версию JVM Вы используете. Если 1.4, то Tomcat версии 5.5 Вам не подойдет. Существует дополнительная библиотека, которая решает проблему совместимости, но мой Вам искренний совет - поставьте себе JVM 1.5 и Вы избежите проблем с установкой. Да и вообще - лучше пробовать последние достижения.

По сути вы загрузите архив, который надо просто распаковать в какую-либо директорию. Я обычно создаю отдельную папку JAVA в которую устанавливаю все свои пакеты, IDE, JDK и прочие штуки. Само собой каждый пакет имеет свою собственную директорию.
В будущем я буду использовать значение TOMCAT_HOME, чтобы показать, в какой директории внутри  Вы должны что-то запускать, устанавливать или менять.
Также ОЧЕНЬ ВАЖНО - Вам надо установить переменную окружения 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>\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-сервер.


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

Как выясняется, просто написать сервле мало - его надо скомпилировать и после этого установить на наш сервер. И надо установить так, чтобы сервер знал, как им пользоваться.
Все приложения, которые регистрируются в 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=windows-1251");

    PrintWriter pw = resp.getWriter();
    pw.println("<H1>Hello, world!</H1>");
    
  }
}

Как видите мы унаследовались от библиотечного класса HttpServlet и переопределили один метод - doGet.
Теперь остановимся на нескольких важных моментах:
1. Вызов setContentType. Этот метод важен для тех, кто использует русский язык - прежде чем показывать страницу с русским текстом броузер должен быть проинформирован, что именно русский текст мы собираемся выводить на экран и броузер должен использовать кодировку, которая нам подходит (для пользователей Unix видимо больше подойдет кодировка UTF-8).
2. Получение Writer-класса для вывода данных. Здесь очень важно отметить следующий момент - вывод может осуществляться как посимвольно, так и побайтно. Для вывода текста используется посимвольный вывод, для вывода двоичных файлов используется побайтный. Для более полного понимания лучше посмотреть информацию как устроены потоки ввода/вывода для JAVA.
Для JAVA разница между символом и байтом очень важна - т.к. JAVA расчитана на будущее, то для символа в ней используется два байта, а не один как это было в ранних языка С или Паскаль.
Именно для разделения типов потоков ввода/вывода используются разные классы. Reader/Writer - чтение/запись символов. InputStream/OutputStream - чтение/запись байтов.
В нашем случае мы выводим текст и поэтому получаем Writer. Этот класс позволяет нам писать в него самый обычный HTML текст. Что мы и делаем.
Реккомендуется: Очень хорошее руководство (на английском) находится здесь - http://java.sun.com/docs/books/tutorial/es...l/io/index.html

Для сборки сервлета Вам не хватит стандартной библиотеки JDK - необходимо подключить дополнительные библиотеки. И такая библиотека на наше счастье есть в поставке Tomcat - посмотрите ее в директории <TOMCAT_HOME>\common\lib. Это servlet-api.jar.
Давайте подключим ее к строке сборки. Я просто скопировал нужный JAR в каталог с проектом. Наша строка для сборки будет выглядеть следующим образом:
Код

javac -classpath .;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 - может они вам потом будут помогать. Но для начала мы можем написать этот файл самостоятельно.
Выглядит он достаточно просто:
Код

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

Стоит выделить несколько моментов:
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\hello\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

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

Код

package students.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.Iterator;
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=windows-1251");

    PrintWriter pw = resp.getWriter();
    pw.println("<B>Список групп</B>");
    pw.println("<table border=1>");
    try {
      List l = ManagementSystem.getInstance().getGroups();
      for (Iterator it = l.iterator(); it.hasNext();) {
        Group gr = (Group) it.next();
        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 (SQLException e) {
      throw new ServletException(e);
    }
    pw.println("</table>");
    
  }
}

Как можно видеть из кода мы создали более сложную конструкцию HTML - table (таблица). Строки обозначаются тэгом <tr>, а ячейка - тегом <td>.
Т.к. для сборки нам потребуется уже два каталога, то строка будет выглядеть следующим образом:
Код

javac -classpath .;servlet-api.jar students\web\*.java students\logic\*.java


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

WEB-INF
   students
      logic
         -Group.class
         -ManagementSystem.class
         -Student.class
      web
         -HelloWorldServlet.class
   lib
      -mysql-connector-java-3.1.13-bin.jar
   -web.xml

Теперь мы можем запустить наш Tomcat и попробовать исполнить обновленную версию сервлета.
Как уже заведено приведем исходные коды для всех классов, которые нам потребуются для сборки

Student.java
Код

package students.logic;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.util.Date;


public class Student implements Comparable
{
    private int studentId;
    private String firstName;
    private String surName;
    private String patronymic;
    private Date dateOfBirth;
    private char sex;
    private int groupId;
    private int educationYear;

    public Student(ResultSet rs) throws SQLException
    {
        setStudentId(rs.getInt(1));
        setFirstName(rs.getString(2));
        setPatronymic(rs.getString(3));
        setSurName(rs.getString(4));
        setSex(rs.getString(5).charAt(0));
        setDateOfBirth(rs.getDate(6));
        setGroupId(rs.getInt(7));
        setEducationYear(rs.getInt(8));
    }

    public Student()
    {
      
    }
    
    public Date getDateOfBirth()
    {
      return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth)
    {
      this.dateOfBirth = dateOfBirth;
    }

    public int getEducationYear()
    {
      return educationYear;
    }

    public void setEducationYear(int educationYear)
    {
      this.educationYear = educationYear;
    }

    public int getGroupId()
    {
      return groupId;
    }

    public void setGroupId(int groupId)
    {
      this.groupId = groupId;
    }

    public int getStudentId()
    {
      return studentId;
    }

    public void setStudentId(int studentId)
    {
      this.studentId = studentId;
    }

    public String getFirstName()
    {
      return firstName;
    }

    public void setFirstName(String firstName)
    {
      this.firstName = firstName;
    }

    public String getPatronymic()
    {
      return patronymic;
    }

    public void setPatronymic(String patronymic)
    {
      this.patronymic = patronymic;
    }

    public String getSurName()
    {
      return surName;
    }

    public void setSurName(String surName)
    {
      this.surName = surName;
    }

    public char getSex()
    {
      return sex;
    }

    public void setSex(char sex)
    {
      this.sex = sex;
    }

    public String toString()
    {
      return surName
        + " "
        + firstName
        + " "
        + patronymic
        + ", "
        + DateFormat.getDateInstance(DateFormat.SHORT).format(
          dateOfBirth) + ", Группа ИД=" + groupId+ " Год:"+educationYear;
    }

    public int compareTo(Object obj)
    {
      return this.toString().compareTo(obj.toString());
    }
}


Group.java
Код

package students.logic;

public class Group
{
    private int groupId;
    private String nameGroup;
    private String curator;
    private String speciality;

    public String getCurator()
    {
      return curator;
    }

    public void setCurator(String curator)
    {
      this.curator = curator;
    }

    public int getGroupId()
    {
      return groupId;
    }

    public void setGroupId(int groupId)
    {
      this.groupId = groupId;
    }

    public String getNameGroup()
    {
      return nameGroup;
    }

    public void setNameGroup(String nameGroup)
    {
      this.nameGroup = nameGroup;
    }

    public String getSpeciality()
    {
      return speciality;
    }

    public void setSpeciality(String speciality)
    {
      this.speciality = speciality;
    }

    public String toString()
    {
      return nameGroup;
    }
}


ManagementSystem.java
Код

package students.logic;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ManagementSystem
{
  private static Connection con; 
  private static ManagementSystem instance;

  private ManagementSystem() {
    try {
      Class.forName("com.mysql.jdbc.Driver");
      String url = "jdbc:mysql://localhost/students";
      con = DriverManager.getConnection(url,"root", "");
    } catch (ClassNotFoundException e1) {
      e1.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }

  public static synchronized ManagementSystem getInstance()
  {
    if (instance == null) {
      instance = new ManagementSystem();
    }
    return instance;
  }

  public List getGroups() throws SQLException
  {
    List groups = new ArrayList();
    
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT group_id, groupName, curator, speciality FROM groups");
    while(rs.next()) {
      Group gr = new Group();
      gr.setGroupId(rs.getInt(1));
      gr.setNameGroup(rs.getString(2));
      gr.setCurator(rs.getString(3));
      gr.setSpeciality(rs.getString(4));

      groups.add(gr);
    }
    rs.close();
    stmt.close();
    
    return groups;
  }
    
  public Collection getAllStudents() throws SQLException
  {
    Collection students = new ArrayList();

    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(
        "SELECT student_id, firstName, patronymic, surName, "+
        "sex, dateOfBirth, group_id, educationYear FROM students ORDER BY surName, firstName, patronymic");
    while(rs.next()) {
      Student st = new Student(rs);
      students.add(st);
    }
    rs.close();
    stmt.close();

    return students;
  }

  public Collection getStudentsFromGroup(Group group, int year) throws SQLException 
  {
    Collection students = new ArrayList();

    PreparedStatement stmt = con.prepareStatement(
        "SELECT student_id, firstName, patronymic, surName, "+
        "sex, dateOfBirth, group_id, educationYear FROM students " +
        "WHERE group_id=? AND educationYear=? "+
        "ORDER BY surName, firstName, patronymic");
    stmt.setInt(1, group.getGroupId());
    stmt.setInt(2, year);
    ResultSet rs = stmt.executeQuery();
    while(rs.next()) {
      Student st = new Student(rs);
    
      students.add(st);
    }
    rs.close();
    stmt.close();
    
    return students;
  }

  public void moveStudentsToGroup(Group oldGroup, int oldYear, Group newGroup, int newYear) throws SQLException
  {
    PreparedStatement stmt = con.prepareStatement(
        "UPDATE students SET group_id=?, educationYear=? " +
        "WHERE group_id=? AND educationYear=?");
    stmt.setInt(1, newGroup.getGroupId());
    stmt.setInt(2, newYear);
    stmt.setInt(3, oldGroup.getGroupId());
    stmt.setInt(4, oldYear);
    stmt.execute();
  }
    
  public void removeStudentsFromGroup(Group group, int year) throws SQLException
  {
    PreparedStatement stmt = con.prepareStatement(
        "DELETE FROM students WHERE group_id=? AND educationYear=?");
    stmt.setInt(1, group.getGroupId());
    stmt.setInt(2, year);
    stmt.execute();
  }

  public void insertStudent(Student student) throws SQLException
  {
    PreparedStatement stmt = con.prepareStatement(
        "INSERT INTO students "+
        "(firstName, patronymic, surName, sex, dateOfBirth, group_id, educationYear) " +
        "VALUES (?, ?, ?, ?, ?, ?, ?)");
    stmt.setString(1, student.getFirstName());
    stmt.setString(2, student.getPatronymic());
    stmt.setString(3, student.getSurName());
    stmt.setString(4, new String(new char[] {student.getSex()} ));
    stmt.setDate(5, new Date(student.getDateOfBirth().getTime()));
    stmt.setInt(6, student.getGroupId());
    stmt.setInt(7, student.getEducationYear());

    stmt.execute();
  }
    
  public void updateStudent(Student student) throws SQLException
  {
    PreparedStatement stmt = con.prepareStatement(
        "UPDATE students SET "+
        "firstName=?, patronymic=?, surName=?, "+
        "sex=?, dateOfBirth=?, group_id=?, educationYear=? " +
        "WHERE student_id=?");
    stmt.setString(1, student.getFirstName());
    stmt.setString(2, student.getPatronymic());
    stmt.setString(3, student.getSurName());
    stmt.setString(4, new String(new char[] {student.getSex()} ));
    stmt.setDate(5, new Date(student.getDateOfBirth().getTime()));
    stmt.setInt(6, student.getGroupId());
    stmt.setInt(7, student.getEducationYear());
    stmt.setInt(8, student.getStudentId());
  
    stmt.execute();
  }
    
  public void deleteStudent(Student student) throws SQLException
  {
    PreparedStatement stmt = con.prepareStatement(
      "DELETE FROM students WHERE student_id=?");
    stmt.setInt(1, student.getStudentId());
    stmt.execute();
  }
}


HelloWorldServlet.java
Код

package students.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.Iterator;
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=windows-1251");

    PrintWriter pw = resp.getWriter();
    pw.println("<B>Список групп</B>");
    pw.println("<table border=1>");
    try {
      List l = ManagementSystem.getInstance().getGroups();
      for (Iterator it = l.iterator(); it.hasNext();) {
        Group gr = (Group) it.next();
        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 (SQLException e) {
      throw new ServletException(e);
    }
    pw.println("</table>");
    
  }
}


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






Просмотров: 6567

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную