Программирование Web-приложений на Java. Часть первая

advertisement
Программирование Web-приложений на Java. Часть первая. Основы веб-программирования
Вступительное слово. С чем мы будем работать.
Это первая вводная статья о разработке веб-приложений на Java. Цикл статей подразумевает что
читатель уже немного знаком с программированием на Java, Groovy, Scala, Jython, либо любом
другом языке, который поддерживается Java Virtual Machine, хотя бы на уровне общего понятия
что такое классы и способным написать хотя бы нечто вроде Hello World.
В этой статье мы немного коснёмся серверов для Java приложений а так же рассмотрим пример
простейшего приложения-счётчика хитов страницы.
Первое, что хочу сказать, выберите правильную операционную систему. FreeBSD и прочие BSD
(кроме, пожалуй, Mac OS X) сразу отпадают, так как Java приложения на них до сих пор работают
крайне нестабильно. Наилучшими будут Linux, Solaris либо Windows.
Основная JVM (Java Virtual Machine) которая сейчас используется – Sun Java 6. Java 5 так же до сих
пор популярна однако создавать под нее новые приложения уже не целесообразно. Java 7 в
данный момент находится в разработке и будет выпущена уже практически полностью Open
Source (Sun Microsystems недавно открыл код своей Java VM). Так же существуют менее
популярные JVM от Hewlett Packard, IBM, использующиеся в узком кругу задач, кроме того еще
существует (однако практически не поддерживается) JVM от Microsoft.
Выбираем сервер приложений для Java
Сервер приложений – система програмного обеспечения для запуска JVM и выполнения в ней
пользовательских приложений. Практически всегда сервер приложений является так же вебсервером, что позволяет использовать его как полноценную систему для веб-проекта, по крайней
мере пока проект небольшой.
Наиболее распространённый сервер приложений для Java – Apache Tomcat (tomcat.apache.org).
Однако мы будем рассматривать все примеры на другом, менее распространённом, но гораздо
более функциональном сервере – Caucho Resin (www.caucho.com) Существует как платная так и
бесплатная версия Resin, бесплатная вполне подходит для начала работы. О таких особенностях
платной версии как автоматический мониторинг, создание кластеров, поддержку PHP и прочее –
читайте в следующих номерах AWO Magazine.
Выбираем IDE
Существует множество IDE (средств разработок) для Java. Первое, чего не стоит пугаться –
практически все они написаны на самой Java. В первое время это создаёт неудобство однако со
временем приходит понимание что такой подход гораздо более мощный и функциональный чем
написание IDE для Java скажем на Visual C++. Кроме IDE конечно же можно пользоваться
любимым редактором вроде VIM или UltraEdit и компилировать приложения вручную из
командной строчки. Наиболее подходящими IDE для разработки веб-приложений, на мой взгляд,
являются бесплатный Eclipse (www.eclipse.org) и коммерческая Jetbrains IDEA. Плюсы у каждой
среды свои. Eclipse бесплатный и имеет множество плагинов. Под IDEA плагинов поменьше
однако сама среда разработки весьма хорошо сделана и действительно очень ускоряет работу и
стоит своих денег. Мы будем рассматривать примеры исходя из особенностей и структуры
приложений, принятых в IDEA, однако эти отличия в большинстве случаев с другими IDE весьма
незначительны. IDEA и Eclipse легко интегрируются как в Tomcat так и в Resin, позволяя делать
загркузку, выгрузку приложений а так же отладку.
Рис. 1. Интерфейс IDEA 7
WAR или не WAR?
WAR – аббривеатура от Web Archive. Представляет собой ZIP-архив веб-приложения, готового или
почти готового к запуску на сервере приложений. Фактически является аналогом JAR для Web.
Разработка приложений, функционирующих как WAR, требует некоторых особенностей:
конфигурационные файлы (и даже путь к ним) обычно являются уникальными для каждой
операционной системы а иногда и для каждого сервера. Приложение намного трудней а иногда
практически нереально обновлять по частям – WAR подразумевает чёткий релиз например «моя
TDS версии 1.0» и пока не будет «TDS версии 1.1», никаких промежуточных патчей в несколько
файлов не планируется. К правильному созданию WAR мы вернемся в следующих статьях, в
данный момент же будем просто разрабатывать приложение «как обычно», т.е. загружая в сервер
приложений просто набор файлов и каталогов.
Создаём наше первое приложение
В этой статье мы коснёмся одного из самых простых способов веб-программирования на Java – с
помощью Java Servlets.
Стуктура приложения на диске будет такой:
src – исходные тексты на Java или Groovy (я буду использовать в примерах только эти два языка, в
основном Java)
web – собственно корневой каталог нашего веб-приложения
остальные каталоги верхнеого уровня обычно являются промежуточными и как их назовете вы
или IDE, особой разницы имеет. Если использовали IDEA – данные папки будут созданы
автоматически, всё что требуется – при создании нового проекта указать что это проект под web.
Рис. 2. IDEA new project wizard. Всё что нужно для начала работы – поставить одну галочку.
В каталоге web обычно есть папка WEB-INF. В этой папке хранятся сами Java-приложения (WEBINF/classes), дополнительные библиотеки (WEB-INF/lib) а так же файлы конфигурации. Данная
папка автоматически после создания является недоступна для веб-клиентов и сюда записывается
всё что нужно скрыть от глаз пользователей, любящих «хакать» или просто исследовать сервера
перебором адресов.
Основной файл конфигурации приложения – web/WEB-INF/web.xml. Как вы наверное уже поняли
по названию, конфигурация хранится в виде XML-документа.
По умолчанию документ имеет вид типа
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchemainstance xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- тут пишем свою конфигурацию -->
</web-app>
Всё что нам нужно сделать для начала работы, это прописать несколько тегов – servlet и servletmapping. Тег servlet связывает Java Servlet с классом нашего приложения. Тег servlet-mapping
связывает сервлет с определенным веб-адресом. Пропишем сервлеты:
<servlet>
<servlet-name>loader</servlet-name>
<servlet-class>servletdemo.Loader</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>counter</servlet-name>
<servlet-class>servletdemo.Counter</servlet-class>
</servlet>
Обратите внимание на первый сервлет. Он имеет параметр load-on-startup, что указывает серверу
приложений автоматически запустить функцию servletdemo.Loader.init() непосредственно при
старте приложений. Практически все серьезные приложения обязательно проводят некоторую
инициализацию – подгружают данные из базы данных, приводят в порядок глобальные
переменные. Рекомендуется так же всегда вводить свой класс-Loader, даже если он пока не
используется – просто потому что в последствии он скорее всего обязательно понадобится. Теперь
свяжем сервлеты с веб-адресами.
Мы хотим показывать веб-пользователю только результаты выполнения сервлета counter. Потому
конфигруация будет такой.
<servlet-mapping>
<servlet-name>counter</servlet-name>
<url-pattern>/counter</url-pattern>
</servlet-mapping>
Это указывает серверу приложений для всех запросов по адресу mysite.com/counter вызывать
сервлет counter, а точнее использовать класс servletdemo.Counter.
В качестве шаблона адреса так же можно прописать wildcard, например /counter/*, в этом случае
сервлет counter отрабатывал бы для запросов в виде mysite.com/counter/1, /counter/abc и тд.
Прежде чем начать писать сервлеты, создадим статический класс для хранения данных нашего
счётчика. Статические классы в Java создаются один раз при старте приложения и данные в них
остаются до его остановки. Это позволяет не использовать для многих часто выполняемых
операций внешние хранилища, такие как файлы или базы данных.
Создадим класс servletdemo.Data, файл src/servletdemo/Data.java
package servletdemo;
public class Data {
private static Integer counter;
public static void setCounter(Integer value) { this.counter = value; }
public static Integer getCounter() { return this.counter; }
}
Перейдём созданию сервлетов. Начнём с Loader. Создаём файл src/servletdemo/Loader.java:
package servletdemo;
// import класса Data не нужен поскольку мы находимся с ним в одной папке.
// Остальные import'ы я пропускаю, поскольку любое современное IDE
// импортирует библиотеки самостоятельно.
public class Loader extends HttpServlet {
public void init() {
// в этом примере мы не будем использовать ни файлы ни базы данных
// просто присвоим нашему счётчику значение 0
Data.setCounter(0);
}
}
При старте веб-приложения счётчику посещений будет автоматически присвоено значение 0.
Создадим класс servletdemo.Counter, который по сути является сервлетом-счётчиком. У сервлетов
есть три основных фукнции – init, вызывается при первом старте, в случае если у сервлета есть
параметр load-on-startup, вызывается автоматически при старте приложения. doGet – выполняется
при получении GET и doPost – при получении POST-запроса от пользователя. В нашем сервлете
будут обрабатываться только методы GET.
package servletdemo;
public class Counter extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
// наша функция обработки GET-запросов автоматически получает два крайне
// важных объекта – req и resp. Первый используется для анализа запроса
// (браузер, адрес пользователя, параметры запроса), второй – для формирования
// веб-страницы, которая будет выдана пользователю
Integer counter = Data.getCounter(); // получаем текущее значение счётчика
counter = counter + 1; // увеличиваем значение на 1
Data.setCounter(counter); // записываем в глобальную переменную новые данные
PrintWriter out = resp.getWriter();
out.write(“<html><body>counter value: “ + counter.toString() + “</body></html>”);
}
}
Наше приложение готово. Можем его откомпилировать в байт-код и запустить. Для сервера
приложений интересна только папка web, на нее и устанавливаем корневой каталог. Если мы
использовали IDE, откомпилированные классы автоматически будут размещены в папке WEBINF/classes.
Важное замечание: при изменении файлов классов веб-сервер не читает новые версии
моментально. Это зависит от опций конфигурации – как часто следить за обновлениями. В случае
обновления статичеких классов происходит полный перезапуск веб-приложения.
В следующих статьях мы рассмотрим другую популярную технологию построения вебприложений – JSP, коснёмся работы с базами данных а так же работы с движком шаблонов для
технологии Servlets – FreeMarker.
Download