Я слышал, что JSF реализует MVC на основе компонентов и Spring MVC реализует MVC на основе запроса. Я хотел бы знать, какова техническая разница между этими двумя типами.
Разница между запросом MVC и компонентом MVC
Ответ 1
В MVC с запросом (действием) один сервлет суперконтроллера будет делегировать модели действий на основе URL-адреса или параметров запроса. Вы работаете непосредственно с исходными объектами HttpServletRequest
и HttpServletResponse
в модели действий. Вы должны сами писать код, чтобы собирать, конвертировать и проверять параметры запроса и при необходимости обновлять значения модели, прежде чем вы сможете когда-либо вызвать бизнес-действие.
В MVC на основе компонентов один фронт-контроллер будет собирать, преобразовывать и проверять параметры запроса и обновлять сами значения модели, так что вам нужно только беспокоиться о бизнес-действии самостоятельно. Как контроллер должен собирать/конвертировать/проверять/обновлять значения, определяется в одном месте, в представлении. Поскольку это невозможно с "простым" HTML, для достижения цели требуется определенный язык разметки. В случае JSF 2.0 этот XML (XHTML) основан. Вы используете XML для определения компонентов пользовательского интерфейса, которые, в свою очередь, содержат информацию о том, как контроллер должен собирать/конвертировать/проверять/обновлять значения модели и генерировать/отображать необходимое представление HTML.
Преимущества и недостатки должны быть понятны: на основе MVC, основанной на запросах, вам нужно написать больше (шаблонный) код для достижения цели. Однако вы получаете гораздо более тонкий контроль над процессом и вывод HTML/CSS/JS. При использовании структуры MVC на основе компонентов вам не нужно писать много кода самостоятельно. Однако у вас есть менее мелкозернистый контроль над процессом и выход HTML/CSS/JS. Поэтому, если вы хотите сделать что-то немного иначе, чем описывает стандарт и/или реализация, тогда вы будете тратить много времени на компонентную инфраструктуру MVC, когда вы не хорошо разбираетесь в своих силах и выходах.
Манфред Рим (член команды JSF 2.x и экс-лидер Java Java EE 8 MVC 1.0) хорошо описал его во время его речь о MVC 1.0 (JSR 371) на Devoxx 14: