··@Inject
··private BookEJB bookEJB;
··private Book book = new Book();
··private List<Book> bookList = new ArrayList<Book>();
··public String doCreateBook() {
····book = bookEJB.createBook(book)
····bookList = bookEJB.findBooks();
····return "listBooks.xhtml";
··}
··// Геттеры, сеттеры
}
Компоненты EJB следуют той же модели. Как показано в листинге 1.4, если вам нужно обратиться к компоненту EJB локально, для этого достаточно простого аннотированного класса без интерфейса. Компоненты EJB могут также развертываться напрямую в файл WAR без предварительного упаковывания в файл JAR. Благодаря этому компоненты EJB являются простейшими транзакционными сущностями и могут быть использованы как в сложных корпоративных, так и в простых веб-приложениях.
@Stateless
public class BookEJB {
··@Inject
··private EntityManager em;
····public Book findBookById(Long id) {
····return em.find(Book.class, id);
··}
··public Book createBook(Book book) {
····em.persist(book);
····return book;
··}
}
Веб-службы RESTful широко распространились в современных приложениях. Спецификация JAX-RS для Java EE 7 была усовершенствована с учетом нужд больших предприятий. Как показано в листинге 1.5, веб-служба RESTful является аннотированным Java-классом, соответствующим действиям HTTP (подробнее читайте в главе 15).
@Path("books")
public class BookResource {
··@Inject
··private EntityManager em;
··@GET
··@Produces({"application/xml", "application/json"})
··public List<Book> getAllBooks() {
····Query query = em.createNamedQuery("findAllBooks");
····List<Book> books = query.getResultList();
····return books;
··}
}
В следующих главах вы будете периодически встречаться с кодом такого типа, где компоненты только содержат бизнес-логику, а метаданные представлены аннотациями (или XML). Таким образом гарантируется, что контейнер использует именно необходимые сервисы.
Java Standard Edition 7
Важно подчеркнуть, что Java EE — это расширенная версия Java SE. Это означает, что в Java EE доступны все возможности языка Java, а также API.
Официальный релиз платформы Java SE 7 состоялся в июле 2011 года. Она была разработана в рамках запроса на спецификацию JSR 336 и предоставляла много новых возможностей, обеспечивая простоту разработки платформ предыдущих версий. Напомню, что функционал Java SE 5 включал автобоксинг, аннотирование, дженерики (обобщенные сущности), перечисление и т. д. Новинками Java SE 6 стали инструменты диагностирования, управления, мониторинга и интерфейс JMX API, упрощенное выполнение сценарных языков на виртуальной машине Java. Java SE 7 объединяет запросы на спецификацию JSR 334 (чаще употребляется название Project Coin), JSR 292 (InvokeDynamic или поддержка динамических языков на виртуальной машине Java), JSR 203 (новый API ввода/вывода, обычно называемый NIO.2), а также несколько обновлений существующих спецификаций (JDBC 4.1 (JSR 221)). Даже если в этой книге не удастся подробно описать Java SE 7, некоторые из этих обновлений будут приведены в качестве примеров, поэтому я хочу предложить вам краткий обзор того, как они могут выглядеть.
Строковый оператор
До появления Java SE 7 в качестве оператора ветвления могли использоваться только числа (типов byte, short, int, long, char) или перечисления. Теперь стало возможным применять переключатель с цифро-буквенными значениями Strcompare. Это помогает избежать длинных списков, начинающихся с if/then/else, и сделать код более удобочитаемым. Теперь вы можете использовать в своих приложениях код, показанный в листинге 1.6.
Stringaction = "update";
switch (action) {
··case "create":
····create();
····break;
··case "read":
····read();
····break;
··case "udpate":
····udpate();
····break;
··case "delete":
····delete();
····break;
··default:
····noCrudAction(action);
}
Ромбовидная нотация
Дженерики впервые появились в Java SE 5, но синтаксис их был достаточно пространным. В Java SE 7 появился более лаконичный синтаксис, называемый ромбовидным. В таком варианте записи объявление объекта не повторяется при его инстанцировании. Листинг 1.7 содержит пример объявления дженериков как с применением ромбовидного оператора, так и без него.