Выбрать главу

··@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 являются простейшими транзакционными сущностями и могут быть использованы как в сложных корпоративных, так и в простых веб-приложениях.

Листинг 1.4. Компонент 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).

Листинг 1.5. Веб-служба RESTful (с сохранением состояния представления)

@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.

Листинг 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 содержит пример объявления дженериков как с применением ромбовидного оператора, так и без него.