В этом посте мы разберемся как создать самое простое web-приложение на Java. Для разработки web-приложений я использую IDE NetBeans 6.7. Итак, к делу.
Чтобы создать web-приложение в NetBeans, зайдите в меню File->New Project… В появившемся окне в списке Categories выберите Java Web после чего в списке Projects щелкните на Web Application. Нажмите Next.
В следующем окне нужно указать имя и расположение проекта в файловой системе. Установим имя для нашего проекта в test-servlet, а расположение оставим по умолчанию. Все остальные настройки также оставляем как есть.
В следующем диалоговом окне необходимо выбрать сервер, на котором будет выполняться наше web-приложение. Я выбрал Apache Tomcat 6.0.18. В выпадающем списке Java EE Version выберите Java EE 5, а Context path оставим без изменений (/test-servlet). Жмем Finish. На этом создание web-приложения закончено. Можно нажать F6 или кнопку Run Main Project и посмотреть на результат нашей с Вами работы. В браузере должна открыться страница со словами “Hello World!”.
Вторым шагом будет создание сервлета, являющегося частью web-приложения.
Для начала создадим в Source Packages структуру пакетов нашего приложения. У меня это ru.topcode.testserv.
Что такое сервлет? Сервлет – это класс Java, предназначенный для динамического формирования содержимого ответа на запрос клиента по сети. Сервлеты часто называют web-компонентами. Они выполняются в специальной среде исполнения, создаваемой контейнером сервлетов или web-контейнером, таким, как Tomcat.
Сервлеты устанавливаются в web-контейнерах как часть web-приложения. Такие приложения по сути являются набором web-ресурсов: HTML-страниц, изображений, мультимедийных данных, сервлетов, JSP, XML-файлов конфигурации, классов и библиотек поддержки Java. После развертывания web-приложения в web-контейнере контейнер создает и загружает экземпляр класса сервлета в виртуальную машину Java (JVM) для обслуживания запросов, поступающих на сервер.
Сервлет обслуживает каждый запрос в отдельном потоке. Таким образом, создатели сервлетов должны сами решать, надо ли обеспечивать синхронизацию доступа к переменным экземпляра и переменным класса или нужно использовать разделяемые ресурсы, например соединение с БД, в зависимости от того, как эти ресурсы используются.
Все сервлеты реализуют интерфейс javax.servlet.Servlet. Разработчики web-приложений обычно пишут сервлеты, расширяющие javax.servlet.http.HttpServlet – абстрактный класс, который реализует интерфейс Servlet и создан специально для обслуживания HTTP-запросов. При создании web-контейнером экземпляра сервлета, осуществляются следующие действия.
- Контейнер вызывает метод init() сервлета, который предназначен для инициализации ресурсов, необходимых сервлету. Метод init() вызывается один раз за время жизни сервлета.
- Метод init() инициализирует объект, реализующий интерфейс javax.servlet.ServletConfig. Этот объект открывает сервлету доступ к параметрам инициализации, объявленным в дескрипторе развертывания. ServletConfig также открывает сервлету доступ к объекту javax.servlet.ServletContext, с помощью которого сервлет может протоколировать события, перенаправлять запросы к другим web-компонентам и получать доступ к прочим web-ресурсам этого же приложения. Разработчикам не нужно реализовывать метод init() в своих подклассах класса HttpServlet.
- При запросе к сервлету контейнер вызывает метод service() сервлета. В терминах HttpServlet, метод service() для обработки запроса автоматически вызывает подходящий HTTP-метод сервлета: doPost() или doGet(). Например, при посылке от пользователя HTTP-запроса POST сервлет отзывается выполнением метода doPost().
- При вызове двух главных методов сервлета HttpServlet (doPost() или doGet()) контейнер сервлета создает объекты javax.servlet.http.HttpServletRequest и javax.servlet.http.HttpServletResponse и передает их в качестве параметров этим методам обработки запроса. Объект HttpServletRequest представляет исходный запрос, а HttpServletResponse инкапсулирует ответ сервлета на этот запрос.
- Не разработчик, а сам сервлет или web-контейнер управляют жизненным циклом сервлета, то есть тем, как долго экземпляр сервлета существует в JVM и обрабатывает запросы. Когда контейнер сервлета намеревается исключить сервлет из обслуживания, он вызывает метод destroy() сервлета, в котором сервлет может освободить любые ресурсы, например соединение с БД.
Создадим теперь в пакете ru.topcode.testserv класс FirstServlet. Этот класс расширяет класс HttpServlet и содержит два метода: doGet() и doPost().
package ru.topcode.testserv; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author dmitrii.leontiev */ public class FirstServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding("Cp1251"); // Устанавливаем MIME response.setContentType("text/html;charset=Windows-1251"); PrintWriter out = response.getWriter(); out.println("<html><head>"); out.println("<title>Мой первый сервлет</title></head><body>"); out.println("<h2>Введите информацию о себе:</h2>"); out.println("<form method=\"post\" action=\"" + request.getContextPath() + "/firstservlet\">"); out.println("<table border=\"0\"><tr><td align=\"top\">"); out.println("Имя:</td> <td valign=\"top\">"); out.println("<input type=\"text\" name=\"firstname\" size=\"20\">"); out.println("</td></tr><tr><td valign=\"top\">"); out.println("Фамилия: </td> <td valign=\"top\">"); out.println("<input type=\"text\" name=\"lastname\" size=\"20\">"); out.println("</td></tr><tr><td valign=\"top\">"); out.println("E-Mail: </td> <td valign=\"top\">"); out.println("<input type=\"text\" name=\"email\" size=\"20\">"); out.println("</td></tr><tr><td valign=\"top\">"); out.println("<input type=\"submit\" value=\"Отправить\"></td></tr>"); out.println("</table></form>"); out.println("</body></html>"); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding("Cp1251"); Enumeration paramNames = request.getParameterNames(); String parName; boolean emptyEnum = false; if (!paramNames.hasMoreElements()) { emptyEnum = true; } response.setContentType("text/html;charset=Windows-1251"); PrintWriter out = response.getWriter(); out.println("<html><head>"); out.println("<title>Отправленные параметры</title></head><body>"); if (emptyEnum) { out.println("<h2>Запрос не содержит параметров</h2>"); } else { out.println("<h2>Это значения переданных параметров:</h2>"); } while (paramNames.hasMoreElements()) { parName = (String) paramNames.nextElement(); out.println("<strong>" + parName + "</strong> : " + request.getParameter(parName)); out.println("<br />"); } out.println("</body></html>"); } }
Как видно из примера, методы doGet() и doPost() могут вызывать исключения ServletException и IOException. Сервлет может вызвать IOException, поскольку вызов метода response.getWriter() (как и метода PrintWriter.close()) может вызвать это исключение. Методы doGet() и doPost() могут вызывать исключение ServletException, чтобы сигнализировать о возникновении ошибки в ходе обработки запроса.
Итак, сервлет написан, осталось теперь проверить как он работает.
Для того, чтобы запустить сервлет, нам нужно отредактировать дескриптор развертывания. Дескриптор развертывание – очень важная часть web-приложения. В нем, в кратком виде, содержатся требования web-приложения. Его можно прочитать в большинстве XML-редакторов. Web.xml файл – это место, где вы:
- Регистрируете и создаете отображение URL на ваши сервлеты;
- Регистрируете и задаете любые фильтры и слушатели приложения;
- Задаете начальные параметры контекста в виде пар имя/значение;
- Конфигурируете страницы ошибок;
- Указываете начальные файлы приложения;
- Задаете время простоя сеанса (тайм-аут);
- Задаете настройки безопасности, управляющие тем, кто к каким web-компонентам может обращаться.
И это только часть тех настроек, которые можно задать в web.xml.
В нашем приложении web.xml находится в Web Pages/WEB-INF/. Откройте его в NetBeans и перейдите в режим правки XML.
Подробней о дескрипторе развертывания я расскажу в следующих постах, а сейчас просто добавьте внутрь тега web-app следующие строки:
<servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>ru.topcode.testserv.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/firstservlet</url-pattern> </servlet-mapping>
Теперь нажмите F6. Ваше приложение должно запуститься, а на экране вы увидите все тот же “Hello World!”. Добавьте в URL firstservlet так, чтобы получился следующий адрес: http://localhost:8084/test-servlet/firstservlet и перейдите по нему.
Если вы все выполняли по инструкции, то на вашем экране должно быть примерно следующее:

Теперь заполните текстовые поля и нажмите “Отправить”. Если вы все сделали правильно, то должны наблюдать следующий результат:

Вы создали и запустили ваш первый сервлет. С чем вас и поздравляю. В следующем посту мы научимся создавать JSP-страницы и добавлять их в web-приложение.


Pingback: Создание JSP » J2EE Dev
Pingback: Как скомпилировать сервлет » J2EE Dev
#1 by доброжелатель on 28 Июнь 2009 - 2:47
Quote
супер…. спсибо за статью, а то 5 часов мучался с тем как запустить сервлет на выполнение во всех книжках пишут только как его написать но ни где не дается объяснения как его запустить
#2 by Дмитрий Леонтьев on 29 Июнь 2009 - 10:37
Quote
Пожалуйста
Именно для этого и пишется этот блог. Если что не понятно или не работает, спрашивайте.
#3 by Андрей on 13 Июль 2009 - 14:36
Quote
Здравствуйте! Я студент технического универа, и мне задали задание разработать web-приложение интернет – магазин комплектующих c использованием JSP и сервлетов. Подскажите пожалуйста, существуют ли уже готовые шаблоны интернет – магазинов и где их скачать?
#4 by Дмитрий Леонтьев on 13 Июль 2009 - 15:28
Quote
Здравствуйте, Андрей. Готовое решение посоветовать не могу, но могу привести несколько ссылок, которые помогут вам разработать интернет-магазин.
1) http://docs.rinet.ru/JSol/ – Chapter 29 Creating a Java Shopping Cart (англ.)
2) http://adipt.wordpress.com/2006/07/03/open-source-and-java-based-shopping-cart/ – обзор опенсорсных java-магазинов. (англ.)
3) http://www.java-course.ru/. Информация не совсем по вашей теме, но может пригодиться.
#5 by Константин on 19 Ноябрь 2009 - 6:46
Quote
А можно указать в статье, как создать класс FirstServlet. Какие кнопки надо нажимать в NetBeans?
#6 by Дмитрий Леонтьев on 19 Ноябрь 2009 - 21:22
Quote
Вы шутите? Нет? Хм…
Сервлет – это обычный класс и создается он также как обычный класс. Правый щелчок на нужном пакете, New -> Java Class…
#7 by George on 22 Ноябрь 2009 - 18:57
Quote
Спасибо Дмитрий! За доступный язык, которым вы пользуетесь в постах…
#8 by Дмитрий Леонтьев on 25 Ноябрь 2009 - 10:14
Quote
George, спасибо что читаете мой блог. Постараюсь и впредь писать таким же доступным языком.
#9 by XOglan on 27 Ноябрь 2009 - 17:43
Quote
Возможно, это один из самых интересных блогов, которые я когда-либо видел
. Интересные статьи, Занимательные комментарии. Так держать!
#10 by Алексей on 30 Ноябрь 2009 - 23:45
Quote
Огромное спасибо!
#11 by Igor on 5 Декабрь 2009 - 15:18
Quote
Дмитрий, очень рад, что натолкнулся на Ваш блог! Спасибо, так держать!
#12 by Дмитрий Леонтьев on 14 Декабрь 2009 - 12:01
Quote
Здравствуйте, XOglan, Алексей и Igor! Спасибо что читаете мой блог. Рад что вам нравится.
#13 by Олег on 23 Декабрь 2009 - 0:55
Quote
Здравствуйте, Дмитрий. Хороший блог.
Такой вопрос, не могли бы Вы проконсультировать по разработке сервлетов, выполняющих логический вывод при интеллектуальном анализе данных? Спасибо.
#14 by Foli on 31 Декабрь 2009 - 0:49
Quote
Спасибо за такое хорошее объяснение.
Один вопрос.
Я удалил index.jsp и хочу что бы сервлет сразу запускался в броузере. Как это сделать? Спасибо.
#15 by Павел on 7 Январь 2010 - 17:00
Quote
Спасибо огромное Дмитрий за этот пример , а не могли бы вы добавить комментарии к коду в классе FirstServlet?
#16 by Стас on 20 Март 2010 - 2:10
Quote
Спасибо очень информативно.хотелось бы узнать как без NetBeans ,а самому расположить папки и откомпелированные сервлеты в tomcat 6.0 чтоб они работали.
#17 by Диана on 24 Апрель 2010 - 21:02
Quote
Спасибо огромное за ваш блог, Дмитрий! За нужную информацию и доступный язык.
#18 by Дмитрий Леонтьев on 27 Апрель 2010 - 9:49
Quote
Здравствуйте, Диана! Рад что оказался вам полезен
#19 by Dexif on 9 Май 2010 - 23:48
Quote
> Я выбрал Apache Tomcat 6.0.18.
У меня проблемка с выбором… выбираю TomCat 6, а дальше просит ввести путь до сервера… пробовал ввести
/etc/tomcat6
и
/etc/tomcat6/Catalina
и
/etc/tomcat6/Catalina/localhost
но ни один из каталогов не подошёл… хотя просит “Catalina home”
Есть идеи?
P.S.: За статью спасибо
#20 by Dexif on 10 Май 2010 - 21:26
Quote
Оу… Директории сам нашёл… всё прописалось… а при попытке запустить просит ввести логин и пароль менеджера tomcat’а ввожу тот что использовал при создании сервера… но меня не пускает… всю голову сломал…
#21 by Дмитрий Леонтьев on 11 Май 2010 - 9:18
Quote
Здравствуйте, Dexif. Чтобы установить логин и пароль для менеджера tomcat, нужно зайти в CATALINA_HOME\conf\ и отредактировать xml-файл tomcat-users.xml. Выглядеть это должно примерно так:
В этом случае и логин и пароль менеджера tomcat будут manager.
#22 by Dexif on 11 Май 2010 - 14:50
Quote
Спасибо
Уже разобрался:)
#23 by madreyg on 1 Июнь 2010 - 0:46
Quote
Здравствуйте,Дмитрий. У меня 2 вопроса:
1.Как залить созданный сервлет на бесплатный хостинг.
2. КАк прописывать различные события на разные кнопки в сервлете.
#24 by Дмитрий Леонтьев on 1 Июнь 2010 - 9:28
Quote
to Foli: Если Вы хотите чтобы сервлет был стартовой страницей вашего web-приложения, то можно сделать так:
#25 by Jony on 5 Июнь 2010 - 18:56
Quote
Добрый вечер, Дмитрий! У вас очень интересный блог! ))
Могли бы вы подсказать одну вещь – когда-то видел интересное решение в интернете (года так 3 назад), опять взялся за javy и не могу найти куда копать: на jave написано меню с красивыми выпадающими эффектами, ассинхронной загрузкой пунктов и т.п., если я не ошибаюсь на страницу оно подключалось с помощью тега . Могли бы вы подсказать какая это технология (тоже самое java servlet или просто “чистый” java) и формат этого самого , может какие-нить ссылки или наводящие слова, а то в инете очень много мусора.
Зараннее спасибо!
——
С уважением Иван.
#26 by Отэц on 24 Июнь 2010 - 15:54
Quote
Все сделал как по указке, НО когда отправляю пустую форму сервлет мне возвращает “Это значение переменных” и пусто, а должен вернуть “Запрос не содержит параметров”. ХДЭ ошибка? А?
#27 by Дмитрий Леонтьев on 24 Июнь 2010 - 16:33
Quote
Эта программа выводит:
где email, lastname и firstname – это имена переданных параметров, а их значения – это пустые строки (в вашем случае).
В программе выполняется проверка на наличие параметров таким образом:
У нас параметры есть, не важно какие у них значения. Поэтому и вывод соответствующий. Если вы хотите проверять значения параметров – это уже валидация пользовательского ввода.
Значение конкретного параметра извлекается из запроса по его имени, например так
#28 by Tester on 21 Август 2010 - 22:47
Quote
Интересная и познавательная статья, спасибо. Вот только у меня курсач, а я все не могу понять, как сделать связку сервлет + апплет (таково задание). Типа сервлет тянет информацию из базы, передает апплету, с которым работает пользователь. А апплет уже возвращает обработанную информацию назад сервлету, а тот – в базу…
#29 by Дмитрий Леонтьев on 21 Август 2010 - 23:10
Quote
Здравствуйте, Tester. Рад что статья Вам понравилась. Про взаимодействие сервлета с аплетом куча статей в Интернете. Например:
Servlet – Обмен сообщениями апплета с сервлетом
Applet and Servlet Communication
Applet Servlet communication