Если вы не интересуетесь фреймворками, ваш код должен по крайней мере использовать подходящие интерфейсы и уровни. Ваше приложение будет хорошо структурировано, если у вас есть интерфейсы для сервисов и репозиториев, используете ли вы платформу или нет.
У вас должен быть сервлет фронт-контроллера, который принимает все запросы.
Вы должны связать и проверить все запросы до обработки на уровне сервиса.
Услуги должны быть полностью отделены от вашего веб-уровня. Если вы не можете разблокировать веб-интерфейс и все остальное работает, вы делаете это неправильно.