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

JDBC (Java Database Connectivity) Java: Веб-технологии

Example.java

public class App {

    public static void main(String[] args) throws LifecycleException, SQLException, IOException {
        // Создаём новое соединение с базой данных H2
        // Указываем путь до файла, в котором будет находиться база данных
        // База hexlet будет находиться в файле в текущей директории
        Connection connection = DriverManager.getConnection("jdbc:h2:./hexlet");
        // Выполняем запросы из файла init.sql

        Statement statement = connection.createStatement();
        // Читаем запросы из файла
        String initSql = getFileContent("init.sql");
        // Выполняем запросы
        statement.execute(initSql);
        int port = getPort();
        Tomcat app = getApp(port, connection);
        app.start();
        app.getServer().await();
    }
}

Servlet

public class CompanyServlet extends HttpServlet {

    // Метод для получения id компании, как часть пути
    private String getId(HttpServletRequest request) {
        String pathInfo = request.getPathInfo();
        if (pathInfo == null) {
            return null;
        }
        String[] pathParts = pathInfo.split("/");
        return ArrayUtils.get(pathParts, 1, null);
    }

    // Метод ля получения экшена
    private String getAction(HttpServletRequest request) {
        String pathInfo = request.getPathInfo();
        if (pathInfo == null) {
            return "list";
        }
        String[] pathParts = pathInfo.split("/");
        return ArrayUtils.get(pathParts, 2, getId(request));
    }

    @Override
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
                throws IOException, ServletException {

        String action = getAction(request);

        switch (action) {
            case "list":
                showArticles(request, response);
                break;
            default:
                showArticle(request, response);
                break;
        }
    }

    private void showCompanies(HttpServletRequest request,
                          HttpServletResponse response)
                throws IOException, ServletException {

        // Получаем из контекста соединение с базой данных
        ServletContext context = request.getServletContext();
        Connection connection = (Connection) context.getAttribute("dbConnection");

        List<Map<String, String>> companies = new ArrayList<>();

        // Запрос для получения данных компании. Вместо знака ? буду подставлены определенные значения
        String query = "SELECT id, name FROM companies LIMIT ?";

        try {
            // Используем PreparedStatement
            // Он позволяет подставить в запрос значения вместо знака ?
            PreparedStatement statement = connection.prepareStatement(query);
            // Указываем номер позиции в запросе (номер начинается с 1) и значение,
            // которое будет подставлено
            statement.setInt(1, 20);
            // Выполняем запрос
            // Результат выполнения представлен объектом ResultSet
            ResultSet rs = statement.executeQuery();

            // При помощи метода next() можно итерировать по строкам в результате
            // Указатель перемещается на следующую строку в результатах
            while (rs.next()) {
                companies.add(Map.of(
                    // Так можно получить значение нужного поля в текущей строке
                    "id", rs.getString("id"),
                    "name", rs.getString("name")
                    )
                );
            }

        } catch (SQLException e) {
            // Если произошла ошибка, устанавливаем код ответа 500
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }
        // Устанавливаем значения атрибутов
        request.setAttribute("companies", companies);
        // Передаём данные в шаблон
        TemplateEngineUtil.render("companies/index.html", request, response);
    }
}

Шаблон

<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  layout:decorate="~{layouts/application.html}">
<head>
  <title>Companies</title>
</head>

<section layout:fragment="content">
  <table class="table">
    <thead>
      <th>ID</th>
      <th>Название</th>
    </thead>
    <tbody>
      // Вывод результата в цикле
      <tr th:each="company : ${companies}" th:object="${article}">
        <td th:text="*{id}"></td>
        <td>
          <a th:text="*{title}" th:href="@{/articles/{id}(id=*{id})}"></a>
        </td>
      </tr>
  </table>
  <div class="container">
   // Так при помощи модификатора th:href можно динамически
   // сформировать ссылку со строкой запроса
   // Эквивалентно <a href="/companies?key=15">Ссылка</a> при value=5
    <a th:href="@{/companies(key=${value + 10})}">Ссылка</a>
  </div>
  <!-- END -->
</section>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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