Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Статические файлы

Статические файлы — файлы, которые сервер отдаёт как есть, без обработки: HTML-страницы, стили CSS, картинки, скрипты JavaScript. Рядом с API часто нужна хотя бы стартовая страница или готовый фронтенд. Javalin отдаёт такие файлы одной строкой настроек.

Где лежат файлы

Создайте папку src/main/resources/public и положите в неё два файла:

<!-- src/main/resources/public/index.html -->
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Блог</title>
    <link rel="stylesheet" href="/style.css">
</head>
<body>
<h1>Блог</h1>
<p>API находится по адресу <a href="/posts">/posts</a>.</p>
</body>
</html>
/* src/main/resources/public/style.css */
body { font-family: sans-serif; max-width: 40rem; margin: 2rem auto; }

Всё из src/main/resources Maven копирует в target/classes, то есть в classpath — набор папок и jar-файлов, откуда Java загружает классы и ресурсы. Поэтому файлы попадут и в итоговый jar.

Подключение

Добавьте строку в блок настроек:

// src/main/java/com/example/blog/Main.java
config.staticFiles.add("/public", Location.CLASSPATH);   // io.javalin.http.staticfiles.Location

Первый аргумент — папка внутри classpath, второй — где её искать. При старте Javalin пишет в лог: Static file handler added: StaticFileConfig(hostedPath=/, directory=/public, location=CLASSPATH, ...).

Файлы доступны от корня сайта: public/style.css открывается по адресу /style.css, а на / Javalin отдаёт index.html:

curl -i http://localhost:8080/style.css
HTTP/1.1 200 OK
Content-Type: text/css
Cache-Control: max-age=0

body { font-family: sans-serif; max-width: 40rem; margin: 2rem auto; }

Тип содержимого Javalin определил по расширению файла. Ещё он добавляет заголовок ETag (здесь опущен): по нему браузер понимает, изменился ли файл. Откройте http://localhost:8080 в браузере — появится страница со ссылкой на API.

Порядок обработки

Сначала Javalin ищет маршрут, и только если маршрута нет — файл. Поэтому маршрут config.routes.get("/", ...) из первого урока закроет index.html. Удалите его, чтобы на / открывалась страница.

Настройки

Для тонкой настройки есть вариант с лямбдой:

СвойствоЧто задаёт
hostedPathАдрес, с которого доступны файлы, например /assets
directoryПапка с файлами
locationLocation.CLASSPATH (внутри jar) или Location.EXTERNAL (папка на диске)
headersЗаголовки для всех файлов, например кеширование
// src/main/java/com/example/blog/Main.java
config.staticFiles.add(files -> {
    files.hostedPath = "/assets";
    files.directory = "/public";
    files.location = Location.CLASSPATH;
});

С такими настройками стиль доступен по адресу /assets/style.css.

Частая ошибка

Если указанной папки нет в classpath, сервер не запускается:

Exception in thread "main" io.javalin.util.JavalinException: Static resource directory with path: '/static' does not exist. Depending on your setup, empty folders might not get copied to classpath.

Проверьте, что имя папки в коде совпадает с папкой в src/main/resources и что в ней есть хотя бы один файл: пустые папки Maven не копирует.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.