Перейти к содержимому

Как запустить сервлет java

  • автор:

Как запустить сервлет до запуска главной страницы?

Есть такой вопрос: как запустить сервлет до запуска главной страницы? У меня есть страница 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?

5dda85050d5e1680879886.png

Добрый вечер. Начал изучать 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.

Сервлет в Apache Tomcat

Но нам нужен не код сервлета, а скомпилированный класс сервлета. Поэтому скомпилируем сервлет. Для этого нам нужно использовать специальную утилиту 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.

Компиляция сервлета для Apache Tomcat

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

Создание сервлета на Java

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *