A small Spring Boot app that aggregates a university dining menu and campus shuttle schedules, stores them in an in-memory database, and serves HTML fragments consumed by an HTMX + Bootstrap frontend.
- Scrapes the weekly menu (normal + vegan) from the university website.
- Calls a SOAP API for bus schedules.
- Normalizes and stores data in H2 on startup.
- Serves HTML table fragments for HTMX swaps.
- Dockerized runtime.
- Java 17
- Spring Boot (Web, JPA)
- H2 in-memory database
- Jsoup (HTML parsing)
- Java XML + XPath (SOAP parsing)
- HTMX + Bootstrap (UI)
Layered design:
- Controller: HTTP endpoints returning HTML fragments
- Service: integration logic (scraping, SOAP calls, parsing)
- Repository: persistence via Spring Data JPA
- Entity:
Menu,BusRoute
GET /index.html→ UI pageGET /menu/{isVegan}→ menu table (normal/vegan)GET /busTable/{departureFrom}→ bus schedule table (kavacikortau)
- On startup,
@PostConstructin services fetches menu + bus data. - External HTML/SOAP responses are parsed into domain entities.
- Data is saved to H2 for fast reads.
- HTMX requests HTML fragments to update tables without a full page reload.
Build the jar and run it:
mvn clean package
java -jar target/*.jarThen open:
http://localhost:8080/index.html
Build and run the container:
docker build -t tau-portal-demo .
docker run -p 8080:8080 tau-portal-demoThen open:
http://localhost:8080/index.html
- The app uses H2 in-memory DB, so data resets on restart.
- External data sources must be reachable at startup.