[Из песочницы] Java 8, Spring, Hibernate, SSP — начинаем играться
Совсем недавно вышла Java 8. И у меня возникло желание написать что-то с использованием новых плюшечек, которые дает 8-ерка.Конкретно Лямбы, новый collection api, позволяющий работать с коллекциями в более функциональном стиле и default-методы в интерфейсах.Статья является кратким обзором моего опыта по интегрированию Java 8, Spring MVC, Hibernate и SSP.
Кому интересно, прошу под кат.
Предисловие Я долгое время (и все еще) продолжаю восхищаться языком Scala, но к сожалению, мне все еще мой пропитанный ынтырпрайзом мозг мешает перейти на чистую Scala.В первую очередь из-за привязки ко внешним библиотекам (Hibernate, Spring, Spring MVC), к которым я до сих пор питаю слабость.Я пытался их и использовать в Scala-проектах, но остается постоянное впечатление, что занимаешься постоянной расстановкой костылей и подпорок и не удается писать в Scala-стиле, скорее пишешь на Java, но со Scala синтаксисом + костыли и подпорки в виде неявных преобразований Java-коллекций в Scala-коллекции и обратно.
Поэтому я решил пойти немного более «мягким» путем и использовать знакомый стек. Единственное изменение, к которому я пришел — использовать SSP (Scala Server Pages) вместо JSP (Java Server Pages), что бы получить статическую поддержку на стороне View и не иметь сильной головной боли с тем, что что-то ломается при рефакторинге и ты узнаешь это уже после деплоймента (когда какой-то блок тупо перестает отображаться либо что еще хуже подпортит данные в БД)
Начало Итак, начнем.Будем использовать мой любимый Maven.
Дадим Maven’у нампек, что проект у нас будет использовать Java 8:
…
Так же мы хотим, что бы наши SSP были прекомпилированы и мы узнали о проблеме при компиляции, а ни на продакшне.Поэтому добавляем плагин для этого:
Теперь можно начать баловаться с кодом и радоваться плюшкам JDK 8:
Мой базовый DAO:
public interface BaseDAO
default void persist (T entity) { if (entity.isNew ()) { entity.assignId (); }
getEntityManager ().persist (entity); getEntityManager ().flush (); }
default T find (ID id) { return getEntityManager ().find (getEntityClass (), id); }
default void delete (T entity) { getEntityManager ().remove (entity); }
default List
default List
public abstract class AbstractBaseDAO
@Override public EntityManager getEntityManager () { return entityManager; } } Конкретный интерфейс DAO:
public interface PersonDAO extends BaseDAO
List
@Repository
public class PersonDAOImpl extends AbstractBaseDAO
@Override
public List
Так же избавляемся от нужды использовать сторонние библиотеки типа Guava, который позволяют писать в более функциональном стиле и получаем все из коробки:
List
<%@ val people: java.util.List[name.dargiri.web.controller.PeopleController.PersonForm]%>
People
# | Username | Action |
---|---|---|
<%=person.id%> | <%=person.username%> | »>Edit | »>Delete |
Сборка проекта проста. В случае если вы выкачали мой проект и хотите его подеплоить в сервлет контейнер, скажем в Tomcat, то запустим: mvn -P=build clean packageИ видим как пре-компилируются наши SSP’шечки:
… [INFO] --- maven-scalate-plugin_2.10:1.6.1: precompile (default) @ web --- [INFO] Precompiling Scalate Templates into Scala classes… [INFO] processing /Users/dionis/projects/spring-mvc-java8-web-app-template/web/src/main/webapp/WEB-INF/views/scalate/main/person.ssp [INFO] processing /Users/dionis/projects/spring-mvc-java8-web-app-template/web/src/main/webapp/WEB-INF/views/scalate/main/people.ssp [INFO] processing /Users/dionis/projects/spring-mvc-java8-web-app-template/web/src/main/webapp/WEB-INF/scalate/layouts/default.ssp … Так что если не дай бог что-то пошло не так и мы что-то поломали в них из того, что компилируется, то мы узнаем об этом сейчас, а не после деплоймента на dev/qa/staging/production environment.
В примере использовал Twitter Bootstrap, ибо нравится он мне.
Скриншоты Создание пользователя: Список пользователей:
Редактирование пользователя:
Код примера: github.com/dargiri/spring-mvc-java8-web-app-template
В качестве бесплатного бонуса:
Тоже самое на Java 7: github.com/dargiri/spring-mvc-java-web-app-template
Тоже самое на Scala: github.com/dargiri/spring-mvc-scala-web-app-template
И если вы все еще это читаете и вытащили себе код и хотите с ним поиграться. Я предпочитаю запускать из-под IDE, а не пользоваться плагинами для IDE.Поэтому в модуле web-app-launcher находим класс Launcher.Если вы пользуетесь Idea, то все запустится без проблем.Если вы пользуетесь Eclipse/Netbeans, то нужны некоторые манипуляции.Для Eclipse — достать изначально Eclipse с поддержкой JDK 8: www.eclipse.org/downloads/index-java8.phpP.P. S. Пишите код и да пребудет с вами сила.
Далее для проекта нужно выбрать maven-профайл build.И в классе Launcher значение переменной MULTI_MODULE_DEFAULT_PATH сменить с «web/src/main/webapp» на »…/web/src/main/webapp» либо на полный путь от корня вашей файловой системы.
Ссылки: Apache Maven — maven.apache.org/Scalate — scalate.fusesource.org/Scala — www.scala-lang.org/Apache Tomcat — tomcat.apache.org/Twitter Bootstrap — getbootstrap.com/Spring Data JPA — projects.spring.io/spring-data-jpa/Hibernate ORM — hibernate.org/orm/JDK 8 — www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlSpring — projects.spring.io/spring-framework/