Как правило простые (и не очень) приложения могут быть разбиты на следующие модули (уровни):
- Доменная модель - сущности вашей системы, например, если вы разрабатываете "магазин", то ваша доменная модель - это Магазин, Продукт, Покупатель, Пользователь и т.д.
- Уровень DAO - в этом уровне реализован доступ к БД или любому другому источнику данных. В классах DAO, например, могут быть такие методы как getUserByUsername(), deleteUser(), etc. Замечу, что на этом уровне нет транзакций, т.к. транзакции как правило принимают участие в бизнес операциях, на этом же уровне ни о какой логике приложения идти речи не может.
Классы этого уровня можно помещать в модуль model, самый нижний модуль, который не зависит от других. - Уровень Сервисов - на этом уровне реализована бизнес логика приложения, управление транзакциями и пр. Пусть не смущает то, что Сервис может повторять методы DAO, эти методы не просто повторяют, они еще и оборачивают в транзакции методы DAO.
В уровень Сервисов может сеттиться несколько DAO для того, чтоб удовлетворить выполнение какой-либо бизнес операции.
Классы этого уровня можно помещать в модуль с именем controller. Этот модуль зависит от модуля model. - Уровень обработки Вида. Если это веб приложение, здесь будут находиться Сервлеты, Контроллеры (Spring MVC), Действия (Struts), как бы там ни было здесь осуществляется обработка запроса и генерация ответа. Однако бизнес логика приложения на этом уровне не присутствует, она делегируется уровню Сервисов. В идеале, если у нас был веб интерфейс, но мы возжелали доступ к нашему приложению еще и по средствам веб сервисов, тогда мы только добавим еще одну реализацию данного уровня и никакого дублирования кода у нас не будет, ибо уровень Сервисов останется тот же.
Классы этого уровня можно помещать в модули по типу view-controller-springmvc, vew-controller-ws. Как правило этот модуль зависит от уровней model и controller. - Вид. Ну это обычный уровень работы с интерфейсом, здесь могут быть размещены, к примеру, JSP страницы.
Этот модуль можно назвать view, зависеть он будет от модуля view-controller, иногда и от model, если он может работать с объектами доменной модели (в идеале он должен работать только с DTO, которые находятся в view-controller).
Здесь есть пример: JT Webinar: Разработка Web-приложения в среде IntelliJ IDEA.
Правда он маленький.