Последний раз работал с JSP версий 2.0, так-то может я какие-то важные вещи из JPS2.1/2.2 упустил — с ними имел дело только мельком. Но в целом так чтоб совсем радикально вроде ничего не поменялось.
Проблемы JSP:
1. Спагетти код
Скриптлеты = гарантированный спагетти код. Без них же часто толком не обойтись.
2. Громоздкий синтаксис
К примеру if/then/else в JSP обычно пишут JSTL-ным c:choose/c:when/c:otherwise. Это очень verbose и громоздко.
3. Проблематичность создания реюзабельного кода
Объявлять методы прямо в JSP странице можно, но их не вызовешь из другой JSP страницы. Написание таглибов в 2.0 было отдельным сложным таском, который не сравнится с написанием макроса в Velocity, где это дело элементарное.
Может .tag файлы JSP2.1 решают это, я не знаю.
4. Завязка на request/response и всевозможные context-ы.
В чём проблема? Например, у вас есть JSP страница, которая используется как темплит для рендера отчёта об исполнении какой-то задачи. Пока это делается по клику юзером кнопки в браузере — всё отлично.
Но вот появилась задача исполнять тот же таск регулярно с помощью планировщика, и отсылать этот же отчёт юзеру на email. Что делать? С Velocity/Freemarker/Jelly проблем не будет — тот же темплит будет реюзатся.
С JSP прийдётся всё переделывать.
5. Сложности спецификации — JSP2.2 появился аж в 2009-м году, и добавил вызовы методов с аргументами в EL — то, что было 100500 лет назад в темплитин енджайнах.
Меня здесь агитировали, что вызовы методов с аргументами — признак прохого дизайна, но я категорически не согласен.
Зато признак какого дизайна — наличие SQL тегов в JSTL например? Явно не хорошего.
Больше здесь:
stackoverflow.com/questions/4812755/difference-between-jsp-el-jsf-el-and-unified-el
adamgent.com/post/6091183966/jsp-el-2-1-versus-el-2-2