Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Templating Java: Веб-технологии

Класс приложения

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.Context;
import java.io.File;

public class App {

    public static void main(String[] args) throws LifecycleException {

        Tomcat tomcat = new Tomcat();

        tomcat.setBaseDir(System.getProperty("java.io.tmpdir"));
        tomcat.setPort(8080);

        // Добавляем в контекст шаблоны
        // Указываем путь к директории, в которой будут находиться jsp-файлы
        Context ctx = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());


        // Регистрируем сервлет
        tomcat.addServlet(ctx, CompaniesServlet.class.getSimpleName(), new CompaniesServlet());
        // Назначаем сервлет как обработчик запросов по пути "/companies"
        ctx.addServletMappingDecoded("/companies", CompaniesServlet.class.getSimpleName());
        tomcat.start();
        tomcat.getServer().await();
    }
}

Servlet

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;

import java.util.List;
import java.util.Map;

public class CompaniesServlet extends HttpServlet {

    // Список всех компаний
    List<Map<String, String>> companies;

    @Override
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
                throws IOException, ServletException {
        // Получаем информацию о пути из URL-адреса, на который был выполнен запрос
        String pathInfo = request.getPathInfo();

        // Если метод вернул `null`, значит запрос был выполнен на адрес `/companies`
        // Нужно вывести список всех компаний
        if (pathInfo == null) {
            // Вызываем обработчик, выводящий список всех компаний
            showCompanies(request, response);
            return;
        }

        // Получаем экшен из пути. Например, в запросе к URL "/companies/show?id=1"
        // будет экшен "show", обозначающий, что нужно вывести станицу компании с id = 1
        String[] pathParts = pathInfo.split("/");
        String action = ArrayUtils.get(pathParts, 1, "");

        // Проверяем экшен
        switch (action) {
            case "show":
                // Если получен экшен "show", вызываем обработчик, выводящий страницу компании
                showCompany(request, response);
                break;
            default:
                // Если получен неизвестный экшен, возвращаем код ответа 404
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
    }

    // Обработчик, выводящий список всех компаний
    private void showCompanies(HttpServletRequest request,
                          HttpServletResponse response)
                throws IOException, ServletException {

        // Сохраняем атрибут в запросе. Так мы сможем передать данные в шаблон
        request.setAttribute("companies", companies);
        // Передаем управление в шаблон
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/company.jsp");
        requestDispatcher.forward(request, response);

    }

    // Обработчик, выводящий  страницу компании
    private void showCompany(HttpServletRequest request,
                         HttpServletResponse response)
                 throws IOException, ServletException {

        // Получаем id компании из строки запроса
        String id = request.getParameter("id");

        // Получаем компанию по её id
        Map<String, String> company = getCompanyById(id);

        // Если компания не найдена, нужно вернуть код ответа 404
        if (company == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        // Сохраняем атрибут в запросе. Так мы сможем передать данные компании в шаблон
        request.setAttribute("company", company);
        // Передаем управление в шаблон
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/show.jsp");
        requestDispatcher.forward(request, response);

    }
}

jsp-файл

// Устанавливаем тип содержимого и кодировку
<%@page contentType="text/html" pageEncoding="UTF-8"%>
// Подключаем библиотеку jstl
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Company</title>
        // Подключаем стили Bootstrap
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We"
            crossorigin="anonymous">
    </head>
    <body>
        // В цикле выводим все компании
        // Внутри jsp-файла нам доступна переменная companies, которую мы установили в сервлете
        <c:forEach var="company" items="${companies}">
            <tr>
            <td>${company.get("id")}</td>
            <td><a href='/companies/show?id=${company.get("id")}'>${company.get("name")}</a></td>
            </tr>
        </c:forEach>
    </body>
</html>

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
с нуля
Разработка приложений на языке Java
2 февраля 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

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