Как запустить сервлет до запуска главной страницы?
Есть такой вопрос: как запустить сервлет до запуска главной страницы? У меня есть страница index.html , и перед тем как она запустилась мне нужно, чтобы сервлет выполнялся и вносил данные на эту страницу. Подскажите мне как это можно реализовать.
Отслеживать
8,984 4 4 золотых знака 19 19 серебряных знаков 28 28 бронзовых знаков
задан 27 мая 2018 в 18:39
63 5 5 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Надо переименовать index.html в index.jsp , а сервлет маппиниг определить как «/» .
Данные можно ложить в request scope. После чего диспатчером перенаправлить на index.jsp .
Вы можете использовать JSP тэги, и/или EL выражения для отображения данных.
Отслеживать
ответ дан 27 мая 2018 в 18:46
8,984 4 4 золотых знака 19 19 серебряных знаков 28 28 бронзовых знаков
Есть вот такой код в сервлете: req.setAttribute(«buyUsd», arrayUsd.get(0)); req.setAttribute(«saleUsd», arrayUsd.get(1)); req.getRequestDispatcher(«/index.jsp»).forward(req, resp); В index.jsp :
Buy USD:
Buy EUR: Но при запуске страницы там null, если сделать кнопку с вызовом данного сервлета, то все норм, а вот при начальном запуске страницы не отрабатывает, даже с аннотацией @WebServlet(«/»)
27 мая 2018 в 19:29
@ivani, с маппингом «/», сервлет будет вызван по адресу «localhost:8080». Попробуйте «/*».
27 мая 2018 в 19:42
в данном случае также не работает, страница очень долго грузится и не отрабатывает, так как цикл отрабатывает, там идет же forward на нее же
27 мая 2018 в 19:53
@ivani я немного не точно ответил. Если Вы упаковываете Ваше приложение в war-файл и кладете его в папку webapps (tomcat), то при маппинге «/», доступ к странице будет следующим «localhost:8080/RootDirectory».
28 мая 2018 в 7:41
@ivani смаппите Ваш сервлет, допустим, «/home». В адресной строке введите «localhost:8080/RootDirectory/home». Используйте
Как запустить сервлет в Томэкт без IDE?

Добрый вечер. Начал изучать Java servlets Скачал распоковал томкэт в папке webapps создал папку helloworld
В папке web-inf создал класс classes/HelloWorld.java и скомпилировал через cmd javac -cp ../../lib/servlet-api.jar HelloWorld.java
вот содержимый файла
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Hello world! * */ public class HelloWorld extends HttpServlet < protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException < PrintWriter printWriter = resp.getWriter(); printWriter.print("Apple
"); > >
Содержимый файла web.xml
mainServlet HelloWorld mainServlet /hello
Запускаю localhost:8080/helloworld запускается индекс html пишу localhost:8080/helloworld/hello not found
- Вопрос задан более трёх лет назад
- 301 просмотр
6 комментариев
Простой 6 комментариев
Сервлеты — Java: Веб-технологии
Javalin — это не единственный фреймворк на Java, вместе со Spring Boot их десятки. Несмотря на это многообразие, все они базируются на механизме сервлетов (servlets). В этом уроке мы обсудим, что это такое и почему об этом нужно знать.
Клей между фреймворками и веб-серверами
Любой веб-фреймворк работает не сам по себе. Для запуска написанного на нем приложения нужен веб-сервер. Такой веб-сервер загружает приложение внутрь себя и запускает. Из этого следует два вывода:
- Такой веб-сервер должен быть написан на том же языке — например, в Java среди основных веб-серверов выделяют Tomcat и Jetty
- Веб-сервер и фреймворк должны знать друг о друге, чтобы они могли работать совместно
Теперь представьте, что у нас есть десятки фреймворков и десятки веб-серверов. Как им всем знать друг о друге? В худшем случае нам пришлось бы писать код для совместимости каждого с каждым. Это было бы пустой тратой ресурсов команд разработчиков, а создание нового фреймворка было бы очень затруднено.
К счастью, эта проблема решилась еще в конце девяностых, когда появилась спецификация сервлетов. С тех пор все веб-сервера ориентируются только на сервлеты, а фреймворки, используют сервлеты для своей работы «под капотом». Все, что мы писали на Javalin, внутри фреймворка превращается в сервлеты:
Эта спецификация описывает способ написания универсального веб-приложения под Java, в котором код состоит из сервлетов.
Каждый сервлет – это класс, отвечающий за определенный маршрут. Во время работы веб-сервер принимает входящие запросы и передает их сервлетам, отвечающим за запрошенные адреса. Затем сервлеты возвращают ответы, которые отправляются клиентам.
Можно ли сделать вид, что для работы с фреймворками мы не обязаны ничего знать про сервлеты? С одной стороны, да, ведь сервлеты существуют только где-то внутри. На каком-то уровне их можно не замечать. С другой стороны, игнорировать сервлеты не стоит. Они встречаются везде: то в выводах в логах, то в настройках. Даже в Spring Boot настройки часто работают с механизмом сервлетов напрямую. Кроме того, о них могут спросить на собеседовании.
Первый сервлет
Рассмотрим создание полноценного приложения с помощью сервлетов на примере репозитория java-servlet-gradle . Начнем с класса сервлета:
package io.hexlet.servlet; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet(name = "MainServlet", urlPatterns = "/about") public class MainServlet extends HttpServlet @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException res.setContentType("text/plain"); res.getWriter().write("Hello, Simple Servlet!"); > >
Здесь мы видим переопределенный метод doGet() . Он вызывается на Get-запрос по адресу /about, указанному в аннотации. Внутри есть доступ к объектам запроса и ответа. В нашем примере данные запроса не используются, а вот в ответе отдается строчка текста. Перечислим моменты, на которые нужно обратить внимание:
- Jakarta (Jakarta EE) — это набор спецификаций и компонентов, предоставляющих решения для различных прикладных приложений. Туда входят и сервлеты и многое другое, что встречается в реальных проектах
- Сервлет наследуется от класса HttpServlet , импортированного из Jakarta
- Сервлет нужно пометить аннотацией @WebServlet с указанием имени и маршрута, за который этот сервлет отвечает
Так можно добавить любое количество сервлетов:
Чтобы запустить веб-сервер с нашим приложением, понадобится кое-что еще установить и настроить. Ниже урезанная версия файла build.gradle.kts :
plugins id("java") // Плагин, который устанавливает и автоматически настраивает веб-сервер id("org.gretty") version "4.1.0" // И другие плагины > dependencies // Необходимые классы implementation("jakarta.servlet:jakarta.servlet-api:6.0.0") > gretty // Эта настройка веб-сервера указывает, что нужно работать от корня // По умолчанию базовый путь равен названию проекта contextPath = '/' >
После этого можно запустить приложение:
; built: 2023-04-11T18:37:53.775Z; git: 5bc5e562c8d05c5862505aebe5cf83a61bdbcb96; jvm 20.0.2+9-78 2023-08-19 21:03:52.224:INFO :oejs.AbstractConnector:main: Started ServerConnector@7af1cd63HTTP/1.1, (http/1.1)>0.0.0.0:8080> 2023-08-19 21:03:52.243:INFO :oejs.Server:main: Started Server@5cf8edcfSTARTING>[11.0.15,sto=0] @1461ms 2023-08-19 21:03:52.639:INFO :oejss.DefaultSessionIdManager:main: Session workerName=node0 2023-08-19 21:03:52.664:INFO :oejsh.ContextHandler:main: Started o.a.g.JettyWebAppContext@186cb891/,/,file:///Users/kirillmokevnin/repos/java-servlet-gradle/build/inplaceWebapp/,AVAILABLE> 2023-08-19 21:03:52.673:INFO :oag.JettyConfigurerImpl:main: Jetty 11.0.15 started and listening on port 8080 2023-08-19 21:03:52.689:INFO :oag.JettyConfigurerImpl:main: runs at: 2023-08-19 21:03:52.690:INFO :oag.JettyConfigurerImpl:main: http://localhost:8080/ > Task :appRun Press any key to stop the server. ===========--> 87% EXECUTING [25s] > :appRun
После этого приложение станет доступно в браузере по адресу http://localhost:8080 . Если открыть страницу https://localhost:8080/about , то мы увидим текст Hello, Simple Servlet!.
Шаблонизатор Java Server Pages (JSP)
Кроме сервлетов, Jakarta содержит в себе JSP. Это простой шаблонизатор, который можно использовать для генерации HTML-страниц на сервере. Для примера создадим другой сервлет и посмотрим, как использовать JSP:
package io.hexlet.servlet; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet(name = "UsersServlet", urlPatterns = "/users") public class UsersServlet extends HttpServlet @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException String message = "Hello from Jakarta Servlet!"; String[] users = "Mike", "Nina">; req.setAttribute("message", message); req.setAttribute("users", users); req.getRequestDispatcher("/WEB-INF/users.jsp").forward(req, resp); > >
Общая структура сервлета не поменялась, но добавилось несколько деталей:
- Данные, которые мы хотим передать в шаблон, нужно записывать в объект запроса через метод setAttribute()
- Нужно явно указать, какой шаблон использовать
Для хранения шаблонов используется стандартная директория src/main/resources/webapp/WEB-INF:
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> %@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> JSP Example %= request.getAttribute("message") %>
items="$" var="user"> $
В шаблоне можно отметить четыре важных элемента:
- Первой строчкой идет c:forEach — директива для работы JSP-тегов (они начинаются с префикса c )
- Запрос и ответ доступны в шаблоне напрямую через переменные request и response
- Для вывода данных используется синтаксис , внутри которого можно вызывать Java-код
- Для управляющих конструкций используется синтаксис на нестандартных тегах, которые превращаются в обычный HTML после обработки
Для работы JSP нужно добавить несколько зависимостей:
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Сервлеты
Сервлет представляет специальный тип классов Java, который выполняется на веб-сервере и который обрабатывает запросы и возвращает результат обработки.
Создадим первый сервлет. Определим где-нибудь на жестком диске файл HelloServlet.java со следующим кодом:
import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet < protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < response.setContentType("text/html"); PrintWriter writer = response.getWriter(); try < writer.println("Hello from HelloServlet
"); > finally < writer.close(); >> >
Класс сервлета наследуется от класса HttpServlet . Перед определением класса указана аннотация WebServlet , которая указывает, с какой конечной точкой будет сопоставляться данный сервлет. То есть данный сервлет будет обрабатывать запросы по адресу «/hello».
Для обработки GET-запросов (например, при обращении к сервлету из адресной строки браузера) сервлет должен переопределить метод doGet . То есть, к примеру, в данном случае get-запрос по адресу /hello будет обрабатываться методом doGet.
Этот метод принимает два параметра. Параметр типа HttpServletRequest инкапсулирует всю информацию о запросе. А параметр типа HttpServletResponse позволяет управлять ответом. В частности, с помощью вызова response.setContentType(«text/html») устанавливается тип ответа (в данном случае, мы говорим, что ответ представляет код html). А с помощью метода getWriter() объекта HttpServletResponse мы можем получить объект PrintWriter, через который можно отправить какой-то определенный ответ пользователю. В данном случае через метод println() пользователю отправляет простейший html-код. По завершению использования объекта HttpServletResponse его необходимо закрыть с помощью метода close() .
Для запуска сервлета воспользуемся опять же контейнером сервлетов Apache Tomcat. В каталоге Tomcat в папке webapps создадим каталог для нового приложения, который назовем helloapp .
В папке приложения классы сервлетов должны размещаться в папке WEB-INF/classes . Создадим в каталоге helloapp папку WEB-INF, а в ней папку classes. И в папку helloapp/WEB-INF/classes поместим файл HelloServlet.java.

Но нам нужен не код сервлета, а скомпилированный класс сервлета. Поэтому скомпилируем сервлет. Для этого нам нужно использовать специальную утилиту servlet-api.jar , которая находится в каталоге Tomcata в папке lib.
В начале в командной строке/терминале перейдем с помощью команды cd к папке helloapp/WEB-INF/classes , где расположен код сервлета.
Потом для компиляции сервлета выполним следующую команду:
javac -cp .;"C:\Program Files\Apache Software Foundation\Tomcat 9.0\lib\servlet-api.jar" HelloServlet.java
В моем случае предполагается, что Tomcat размещен в каталоге C:\Program Files\Apache Software Foundation\Tomcat 9.0.

После этого в папке helloapp/WEB-INF/classes должен появиться класс сервлета. Перезапустим Tomcat и обратимся к нашему сервлету в браузере:

Поскольку с помощью аннотации WebServlet в классе сервлета была указана точка «/hello», то при обращении к сервлету после домена и порта идет название приложения (helloapp) и конечная точка (hello).