Статические файлы
Статические файлы — файлы, которые сервер отдаёт как есть, без обработки: 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.cssHTTP/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 | Папка с файлами |
location | Location.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 не копирует.