Продолжается подписка на наши издания! Вы не забыли подписаться?

Что нового в Java SE 6

Автор: Danny Coward
Sun Microsystems
Опубликовано: 18.04.2007

Платформа Java Standard Edition 6 – новая версия платформы Java SE. Любой из десяти основных моментов, представленных здесь, мог бы стать достаточной причиной для перехода на новую версию с используемой в настоящее время. Независимо от того, какие области для вас важнее всего, выпуск Java SE 6 – самое время, чтобы бросить новый взгляд на платформу. Давайте рассмотрим основные новшества новой версии.

Web-сервисы

Возможно, самое большое добавление к набору – появление API Web-сервисов. Вы, скорее всего, знаете, что в Java Platform, Enterprise Edition (Java EE) уже некоторое время развивается направление Web-сервисов, но введение в Java SE 6 основных API из Java EE может быть весьма полезным во многих ситуациях. Мы все видели возникновение в Интернете ряда мощных Web-сервисов, например, предоставляемых eBay или Google, и можем ожидать, что найдутся разработчики, которые займутся созданием клиентов для этих Web-сервисов.

Разработчики могут захотеть поэкспериментировать с технологией Web-сервисов перед размещением приложений на сервере приложений. Java SE 6 – замечательная платформа для этого. Низкоуровневые элементы в стеке также означают, что разработчики, использующие XML непосредственно в своих приложениях, теперь могут использовать в работе действительно богатый набор API (см. таблицу 1).

API Java SE 6 Описание
Java API for XML Web Services (JAX-WS) Новый Простые в использовании API для создания и работы с Web-сервисами
Java Architecture for XML Binding (JAXB) Новый API для конвертации Java-объектов XML и наоборот
Streaming API for XML (STAX) Новый API для разбора XML (pull-модель)
HTTP Server Новый Минимальная реализация HTTP-сервера
Java API for XML Processing (JAXP) Изменен API для разбора XML на базе W3C Document Object Model (DOM)
Таблица 1. Стек включает богатый набор API.

Если вы новичок в Web-сервисах, основной и единственный API, который вам потребуется - JAX-WS. Особенно хорошо то, что создавать Web-сервисы очень просто. Возьмем метод, добавляющий два числа:

public class NumberAdderUpperer 
{
  public int addEmUp(int number1, int number2) 
  {
    return number1 + number2;
  }
} 

И превратим его в Web-сервис:

import javax.jws.WebService

@WebService
public class NumberAdderUpperer 
{
  public int addEmUp(int number1, int number2) 
  { 
    return number1 + number2;
  }
}

Этот Web-сервис можно сделать доступным через Интернет, просто добавив аннотацию @WebService как часть технологии JAX-WS.

Пример Web-сервиса можно найти в каталоге <JDK6>/samples/Webservices. Он состоит из двух частей. Пример сервера определяет фиктивную версию API eBay. Вы можете запустить эту версию локально на собственной машине, и она будет ожидать запросов об информации по предметам, выставленным на аукцион. Подключиться к примеру сервера можно с помощью примера клиента Web-сервиса, GUI-приложения, использующего JAX-WS API, которое будет выводить предметы по их ID. Можно также использовать пример клиента, чтобы подключиться к eBay через Интернет и просматривать предметы на аукционе, как показано на рисунке 1.


Рисунок 1. Пример клиента может обратиться к аукциону eBay через Интернет.

Между прочим, все примеры и демонстрации в Sun Java SE 6 Development Kit (JDK 6), например, упомянутый пример Web-сервиса eBay, доступны как NetBeans 5.5-проекты. Это существенно облегчает их изучение, сборку и запуск.

Скриптовые языки

Язык Java – лучший для создания высококачественного долгоживущего кода приложений, который легко поддерживать. Однако есть ситуации, когда разработчикам нужно быстро создавать прототипы частей приложения, или когда имеющееся приложение постоянно эволюционирует (Web-разработчики должны быть хорошо знакомы с такими ситуациями). Три возможности Java SE 6 делают эти сценарии выполнимыми:

Использовать API довольно просто, особенно при включении в приложение кода на JavaScript, поскольку движок уже включен в JDK. Нужно запомнить только имя класса javax.script.ScriptEngine. Вот как это можно сделать, попросив движок JavaScript выполнить некий код на JavaScript, выводящий простой диалог:

ScriptEngineManager m = 
   new ScriptEngineManager();
   // Получаем экземпляр движка JavaScript
   // get an instance of 
   // JavaScript script engine
ScriptEngine engine = 
   m.getEngineByName("js");
   // простой JavaScript-диалог
   // a simple JavaScript dialog
engine.eval(
" alert(\"Hello World!\") ");

Естественно, скриптовые движки для других языков, которые вы, возможо, сконфигурирете сами, будут иметь другие имена. На самом деле, есть гораздо лучший пример, иллюстрирующий эту возможность – scriptpad, лежащий в каталоге /samples. Запустив пример, вы сможете написать собственный JavaScript, запустить его на исполнение, сохранить для дальнейшего использования или открыть один из множества примеров скриптов. На рисунке 2 показан JavaScript, используемый для создания некого GUI. При выборе Tools > Run Scriptpad исполняет этот скрипт и выводит GUI (рисунок 3).

Разработчики, желающие использовать в своих приложениях скриптовые языки, отличные от JavaScript, могут воспользоваться коллекцией скриптовых движков, работающих с Java SE 6, на scripting.dev.java.net. Если это интересует вас, скачайте движок и настройте JDK на работу с ним. На момент создания этой статьи были доступны 22 движка, в том числе для таких популярных языков как as Ruby, Python и Groovy.


Рисунок 2. Этот пример JavaScript создает простой GUI.


Рисунок 3. Scriptpad исполняет этот скрипт и выводит GUI.

Работа с БД

Sun JDK впервые включает полностью написанную на Java РСУБД, технологически основанную на Java Database Connectivity (JDBC). Возможно, она покажется вам знакомой, так как основана на СУБД Apache Derby. Любой разработчик, сражавшийся с конфигурированием БД перед использованием, или нуждавшийся в реляционной СУБД, которую можно использовать в процессе разработки приложения (с переходом на промышленную СУБД при развертывании), оценит это нововведение.

Чтобы использовать Java СУБД, нужно указать в переменной среды DERBY_HOME каталог <JDK6>/db, а затем запустить СУБД, используя один из скриптов запуска (например, можно запустить отдельный экземпляр СУБД с помощью скрипта <JDK6>/db/NetworkServer/bin/startNetworkServer.bat). Заполнить БД также несложно с помощью ij.bat. Для этого с помощью ij создайте простую таблицу. Из командной строки ij подключитесь к только что запущенному экземпляру БД, используя порт по умолчанию, 1527:

connect 'jdbc:derby:
   //localhost:1527/JavaProArticle;
   create=true';

Теперь создайте простую таблицу, перечисляющую разработчиков и их любимые языки:

CREATE TABLE DEVELOPER (
   Name varchar(30), 
   Language varchar(30));
INSERT INTO DEVELOPER VALUES (
   'Danny', 'Java');
INSERT INTO DEVELOPER VALUES (
   'Jane', 'JavaScript');
   (и т.д...)

Чтобы получить вот это:

To get this table:

NAME                    LANGUAGE
----------------------------------
Danny                   Java
Jane                    JavaScript
Bob                     Ruby
Alice                   Smalltalk

Еще один аспект поддержки работы с БД в Java SE 6 – обновления и улучшения JDBC API. Есть множество усовершенствований на уровне API, включая новый интерфейс java.sql.RowID для представления SQL Row ID, а также поддержка типа данных SQL XML через новый интерфейс java.sql.SQLXML. Мне больше всего нравится новая автозагрузка JDBC-драйвера, устраняющая необходимость в прежней явной загрузке класса драйвера:

// Класс драйвера в Java SE 6 загружать не надо:
// Class.forName("com.myorg.jdbc.jdbcDriverImpl");
Connection con = DriverManager.getConnection(url, user, pass);

Это всего один пример того, как Java SE в целом улучшилась в плане экономии времени разработки.

Больше Desktop API

More Desktop APIs

Хорошим настольным приложениям нужны хорошие пользовательские интерфейсы, и в этой области сосредоточено много важных улучшений Java SE 6. Вот три наиболее важных.

Новый менеджер раскладки практически устраняет потребность в других менеджерах раскладки. javax.swing.GroupLayout – это новый менеджер раскладки, лежащий также в основе популярного инструмента NetBeans Matisse GUI Builder. Новый менеджер GroupLayout очень хорош при раскладке компонентов, которые должны быть выровнены как по вертикали, так и по горизонтали, и равномерно распределены. Эти соглашения очень часто используются дизайнерами форм, где колонка из текcтовых полей и их подписей должна быть выровнена по вертикали, или где кнопки OK, Cancel, Help нужно выровнять по горизонтали и правильно распределить. Промах в несколько пикселей для дизайнера GUI – это все равно, что надеть черный ремень с коричневыми ботинками. С новым менеджером раскладки это исключено!

Сортировка и фильтрация для таблиц. В Java SE 6 появился новый класс javax.swing.RowSorter. Его экземпляр можно назначить каждому создаваемому JTable. RowSorter использует реализацию интерфейса java.util.Comparator, предоставляемого вами для упорядочивания строк в представлении таблицы. Для фильтрации используется экземпляр нового класса javax.swing.RowFilter. Между прочим, RowFilter содержит ряд фабричных методов для создания общеупотребительных фильтров, например, фильтров по дате, номеру или некоторой строке.

API интеграции. Существует несколько возможностей, общих для пользовательского интерфейса как Windows, так и Unix. Они практически всегда содержат браузер, е-mail клиент и некоторую схему для ассоциирования приложений с MIME-типами. Почти всегда есть возможность представить исполняемые в данный момент приложения в графическом виде. В Java SE 6 есть пара новых классов в java.awt.Desktop для запуска браузера, е-mail клиента или приложения, ассоциированного с файлом.

Новый класс javax.swing.SystemTray позволяет отобразить приложение в system tray. Эту возможность поддерживают почти все ОС, а для поддержки переносимости API предоставляет проверку. Вот как ее использовать:

if (SystemTray.isSupported()) 
{
   SystemTray myTray = SystemTray.getSystemTray();
   Image image = Toolkit.getDefaultToolkit().getImage("geek.jpg");
   TrayIcon trayIcon = new TrayIcon(image, "JavaPro Demo", null);
   myTray.add(trayIcon);
}

Таким образом, Java SE 6 может устранить одну из примет, выдающих пользователю, что данное приложение – это Java-приложение (см. рисунок 4), то есть иконку в виде кофейной чашки (заменив ее собственной).


Рисунок 4. Java SE 6 не раскрывает пользователю Java-природу приложения.

Название Тип Описание Java SE 6
jconsole GUI Простое в использовании GUI-средство общего назначения для управления памятью и потоками Обновлено
Jmap командная строка Инструмент для создания по запросу снимка использования память всеми объектами приложения, выдающее jmap-файл Обновлено
jhat командная строка Средство анализа потребления памяти, генерирующее по jmap-файлу простой Web-сайт Новое
jstack командная строка Инструмент, создающий снимок активности всех потоков приложения и фреймов стека каждого потока. Обновлено
jstat командная строка Средство анализа текущего состояния динамического компилятора HotSpot и сборщиков мусора Обновлено
jps командная строка Перечисляет текущие Java-процессы и их ID, нужные другим средствам для идентификации анализируемых процессов не изменилось
Таблица 2. Некоторые из инструментов Java SE JDK изменились в новой версии.

Мониторинг и управление

Когда вы устранили все ошибки в поведении вашего приложения (особенно в случае больших или долгоживущих приложений), могут проявиться более тонкие скрытые проблемы в вашем коде. Эти проблемы могут включать большое или постоянно растущее потребление памяти, или нечасто встречающееся, но потенциально разрушительное зависание многопоточного приложения.

Java Virtual Machine (JVM) обычно изолирует вас от таких эзотерических проблем, но иногда приходится засучить рукава, достать инструменты и залезть под капот. Инструменты, предоставляемые JDK (в каталоге <JDK>/bin), приведены в таблице 2.

Большое улучшение в Java SE 6 состоит в том, что все инструменты теперь подключаются по требованию. Это значит, что вам больше не нужно перезапускать анализируемое проблемное приложение с различными параметрами командной строки для того, чтобы проанализировать состояние JVM. Эта возможность – хорошее подспорье для диагностики проблем на месте.

Доступ к компилятору

Новые API компилятора обеспечивают программный доступ к компилятору; наиболее важный новый класс – javax.tools.JavaCompilerTool. Этот API выполняет два типа задач.

In-process компиляция исходного кода. Это задача общего назначения, рассчитанная на опытных разработчиков, создающих очень динамичные виды приложений. Хорошим примером приложений такого рода является движок JavaServer Pages (JSP) на платформе Java EE. Когда браузер запрашивает некую JSP-страницу, движок, разбирая JSP, пишет сервлет, затем компилирует код, создает экземпляр сервлета, вызывает его и передает результат работы сервлета обратно браузеру. Возможность выполнять компиляцию программно, а не в отдельном процессе, дает движку JSP больший контроль над процессом и сулит значительное снижение времени компиляции.

Детальный анализ исходного кода внутри приложения. В не зависимости от того, собираетесь вы использовать эту возможность или нет, с сообщениями компилятора об ошибках вы наверняка хорошо знакомы. Кто не встречал чего-то наподобие "try without 'catch' or 'final'" или "Cannot find symbol: myUndeclaredInstanceVariable"? Появление Java Compiler API позволяет опытным разработчикам передать исходный код компилятору, проанализировать его и получить детализированный диагноз всех синтаксических и ссылочных проблем в коде, отображаемом в командной строке. Теперь вы знаете, как NetBeans выводят всплывающие сообщения об ошибках в редакторе кода.

Встраиваемые аннотации

Java-аннотации появились в Java SE 5 как способ подключения метаданных к частям Java-кода. Как можно заметить, другие API в Java SE использовали этот механизм, чтобы упростить программирование приложений. В Java SE 6 мы добавили механизм общего назначения, позволяющий Java-разработчику создавать собственные аннотации и писать маленькие компоненты, названный процессорами аннотаций, к которым компилятор обращается при компиляции, передавая соответствующие части исходного текста, помеченного аннотацией.

Предположим, что вы разрабатываете приложение в команде, и хотите пометить часть кода для просмотра его руководителем команды. Возможно, вы не уверены в написанном методе или классе, возможно, ваш руководитель – фанатик соглашений по именованию (со всеми бывает, правда?). Вы можете создать Java-аннотацию @ForReview и использовать ее в исходном коде для метода, который должен проверить руководитель:

import com.dannyc.extras.ForReview

@ForReview
public void myTrickyMethod()
{
  ...
}

Теперь вы можете написать компонент-процессор, который добавит этот метод в список кода для просмотра, который вы создаете при компиляции проекта. Создайте класс ReviewProcessor как наследника нового класса AbstractProcessor:

import javax.annotation.processing.*;

public class ForReviewProcessor extends AbstractProcessor
{
   // логика добавления элементов кода в список
}

Теперь для создания списка просто скажите компилятору использовать процессор:

javac -processor ForReviewProcessor project/*.java

Развертывание desktop-приложений

Если у вас есть настольное приложение, разработанное с использованием Java SE 5 или более ранней версии, под Java SE 6 оно будет лучше выглядеть и вести себя. Эта лучшая производительность создается за счет множества мелких улучшений, не говоря уж о куда более гладких процессах установки Java Web Start и Java Runtime Environment (JRE). Рассмотрим некоторые из этих улучшений.

В Java SE 6, кроме важных улучшений в графической акселерации под Windows, изменился способ отрисовки компонентов Swing. В предыдущей версии элементы Swing отрисовывались Java-кодом в Java SE. В Java SE 6 на платформах Windows и Unix инструкции отрисовки элементов теперь отправляются операционной системе. Это изменение не только повышает производительность, но и позволяет по мере эволюции ОС сохранять соответствующий ей вид и поведение элементов.

Одним из недостатков предыдущей версии Java SE было то, что в случае Swing-приложений перед разработчиком стояла довольно неприятная проблема – при перерисовке все окно приложения становилось серым, даже если перерисовывался только уголок, перекрытый другим окном. Отрисовка Swing в Java SE 6 выполняется с использованием двойной буферизации, и эффекта серых прямоугольников больше нет.

Безопасность

Рассмотрим некоторые важные улучшения механизмов безопасности в Java SE 6. В новой версии появилось несколько совершенно новых API безопасности. Новые Java XML Dsig API предназначены для создания и манипуляций цифровыми подписями согласно стандарту W3C. Они пригодятся в основном разработчикам приложений Web-сервисов. Новые API (из нового пакета new javax.xml.smartcardio) для получения и управления информацией, хранящейся на смарткартах, не являются официальным стандартом для платформы, но имеются в JDK от Sun.

В Java SE 6 появилась возможность интеграции механизма аутентификации с LDAP-сервером, Generic Security Service (GSS) или сервисом Kerberos.

Качество, совместимость, стабильность

Последнее и самое важное – эта версия является лучшим и самым протестированным релизом Java SE. Например, выполнено более 100000 тестов на соответствие спецификациям платформы. То, что приложения, написанные для предыдущих версий Java SE, будут без проблем работать на Java SE 6, было проверено на множестве больших коммерческих программных продуктов, использующих Java SE.

Процесс выпуска Java SE 6 также слегка отличался от того, что было раньше. В предыдущих случаях выпускалась одна или несколько бета-версий, после чего начиналось ожидание баг-репортов. Поскольку еженедельные сборки Java SE 6 были доступны начиная с 2005 года, всегда был список багов, которые устранялись на более ранних стадиях процесса разработки. Спасибо тем из вас, кто участвовал в этом, поскольку вы проявили куда больше внимания к вопросам обратной совместимости, что значительно повысило качественно конечного продукта.

Вы можете заметить также, что Java SE 6 существенно быстрее. Тесты производительности и анализ результатов могут колебаться от науки до искусства, но мы знаем по нашим тестам SwingMark и SpecJbb, что даже первая бета-версия была быстрее, чем Java SE 5. Попробуйте сами: http://java.sun.com/javase/.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

Copyright © 1994-2016 ООО "К-Пресс"