Статьи

Милен Петров: почему IDE NetBeans отлично подходит для обучения Java

Теперь мы встретились с несколькими учителями, использующими IDE NetBeans, в классе:  Михил Нобак из Университета прикладных наук Ханце в Гронингене, Нидерланды , Зоран Севарац из Белградского университета в СербииПитер ван ден Хомберг из Университета прикладных наук Фонтиса в Венло, Нидерланды , Тушар Джоши из Нагпура, Индия и Йоханнес Вейгенд из Университета прикладных наук в Розенхайме, Германия .

Тем временем Кен Фогель из колледжа Доусон в Монреале, Канада, объяснил, как начать работу с NetBeans в классе . Далее давайте отправимся в Софию в Болгарию и встретимся с Миленом Петровым. — команда NetBeans

Меня зовут я работаю на кафедре программной инженерии на факультете математики и информатики ( Софийский университет , Болгария). 

« Здесь мы предоставляем знания с качеством, которое будет длиться вечно — гарантия — один год, как обычно! » 

Как преподаватель и исследователь, я по-разному использую IDE NetBeans для Java и веб-программирования, а также для преподавания связанных с программированием курсов. В этой статье я остановлюсь на моих любимых функциях IDE NetBeans в контексте типичного варианта использования при разработке программного обеспечения, то есть интернационализации. Такие функции, как выбор блока, показанные на скриншоте ниже, будут выделены по пути.

Я использую IDE NetBeans в классе для двух целей, а именно для демонстрации:

  1. Как быстро вы можете ошибиться при написании программного обеспечения, если вы действительно не понимаете основных (и не только базовых) концепций и не можете объяснить / написать это на листе бумаги или в простом текстовом редакторе, таком как Блокнот (или + + если хочешь).
  2. Насколько быстрым и приятным может быть программирование ПОСЛЕ того, как вы знаете, что вы на самом деле делаете.

В среде IDE NetBeans мне очень нравится следующее:

  • чрезвычайно быстрое прототипирование GUI
  • хорошее форматирование исходного кода
  • генераторы исходного кода
  • ре-факторинг кода
  • разные волшебники
  • вспомогательные инструменты

Выше приведены лишь некоторые из них, и последнее по порядку, но не по значению. Мне действительно нравятся многочисленные превосходные онлайн-ресурсы, учебные пособия, видео и презентации с официального веб-сайта NetBeans,  а также из многих блогов сообщества, которые пригодятся вам, когда вы ‘ Мы пытаемся расширить кругозор учащихся по заданному предмету (который часто выходит за рамки конкретного курса) и обеспечивает основу для непрерывного самостоятельного обучения. И, таким образом, это не дает ученикам застревать на определенной теме

Ниже я расскажу об особенностях, изложенных выше. И в качестве варианта использования я буду использовать интернационализацию — как одну из функций Java с самого начала, это один из значительных факторов успеха (на мой взгляд) для языка Java в целом.

Здесь я представлю, как вы можете использовать инструменты в IDE NetBeans для интернационализации веб-контента, в частности, в JavaEE и JSF2 +. В Интернете есть много полезных ресурсов по этой теме, но все же кто-то может найти информацию ниже полезной.

интернационализация

В разработке программного обеспечения концепция интернационализации (для краткости «i18n») состоит, в основном, из поддержки одинакового пользовательского интерфейса для клиентов, использующих информацию на разных языках и в разных странах. С этим связаны визуальные значения таких вещей, как язык, название и код страны, валюта, время представления и десятичные точки.

Один из возможных способов изменить язык приложения без изменения и перестройки исходного кода — через упаковку и перераспределение с использованием класса ResourceBundle . При таком подходе нам нужно создавать так называемые файлы ресурсов. Файл ресурсов содержит списки строковых ресурсов, также известные как «сообщения». 

Сообщения хранятся в файле ресурсов в следующем формате:

key=value

В приложении «ключ» используется для доступа к соответствующему тексту, то есть «значение».

Также возможно настроить сообщения с параметрами, как показано ниже:

buttonLabel=Back

welcomeMessage=Welcome, {0}

Соглашения об именах для ключей


Рекомендуется использовать соглашения об именах для ресурсов.
В относительно больших проектах полезно иметь префикс для каждого модуля или типа сообщения. 

Я встречаю несколько стилей в наборе имен клавиш. Существуют различные возможности, и вот список возможных обозначений для имени ключей:

  • обозначение змеи (snake_case) 
    • пример: message_button = Heaveno дорогой!
  • точечная нотация ( точечная нотация
    • пример:  message.button = Heaveno дорогой!
  • чехол для верблюда (CamelCase)
    • пример: M essageButton = Heaveno дорогой!
  • случай Паскаля (pascalCase). 
    • пример:  messageButton = Heaveno дорогой!

Другое важное «правило» — это порядок сообщений.
Существует возможность именовать ресурсы по модулю или по типу, например:
  • module-name_key  module, имя сообщения может быть  usermgmt_button_ login = Login
  • если это по типу buttons_back_user = назад
Например, использование соглашения об именах в ключах ресурсов помогает, когда вы находитесь на рабочем сервере. Очень редко можно найти хорошие графические инструменты для спасения. Тогда упорядочение сообщений по соглашению может помочь. В статье ниже я покажу, как вы можете легко управлять сообщениями с помощью NetBeans.

Соглашения об именовании языковых ресурсов

Для каждого письменного языка у нас есть отдельный текстовый файл с расширением .properties. Есть файл ядро языка и набор специфических для каждого языкового файла под названием Resource Bundle .

Текстовые файлы для разных физических языков следуют соглашению — добавление суффикса, соответствующего языку, стране и варианту / сленгу, например: 

  • Bundle_bg_BG_WIN.properties

В примере — название пакета «Bundle», язык bg (болгарский) в BG (страна Болгария), а WIN происходит из окон.

Платформа Java позволяет каскадно искать сообщения по ключу. Если в файле Bundle_bg_BG_WIN.properties отсутствует сообщение с указанным ключом, выполняется поиск ключа в файле верхнего уровня — Bundle_bg_BG.properties ; если все еще не найден, ищет ключ в Bungdle_bg.properties , а затем в Bungle.properties (который должен быть независимым от языка).

«Вариант» характерен для клиента. В зависимости от языковых настроек, выбирается соответствующий файл с ресурсами (см. Рис. 1. ниже):

Рис. 1 Основные языковые ресурсы (bg, en, es, fr и нейтральный язык)

Рис. 2 Языковые ресурсы с файлами для страны и варианта (bg_BG — болгарский язык в Болгарии; bg_BG_WIN — такой же, как bg_BG, но для специализации платформы Windows)

Простой пример интернационализации JSF2 +


Интернационализация в веб-приложениях потенциально даже важнее, чем в любом другом типе приложений.
Давайте посмотрим, как создать работающее веб-приложение JSF2 + с поддержкой разных языков.

Во-первых, добавьте поддерживаемые языки в «face-config.xml «- как показано в исходном коде (рис. 3) ниже. Здесь поддерживаются следующие локали: bg — болгарский, en — английский, nl — голландский, франц. Французский и албанский. Вы можете добавить столько языков, сколько пожелаете, но можете начать с поддержки только одного или двух языков.

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
    <application>
        <locale-config>
            <default-locale>bg</default-locale>
            <supported-locale>en</supported-locale>
            <supported-locale>es</supported-locale>
            <supported-locale>nl</supported-locale>
            <supported-locale>fr</supported-locale>
            <supported-locale>al</supported-locale>
        </locale-config>
        <resource-bundle>
            <base-name>Bundle</base-name>
            <var>i18n</var>
        </resource-bundle>
    </application>
</faces-config>

Рис. 3 Исходный код для файла конфигурации (face-config.xml)

Отличной (и относительно новой) функцией в IDE NetBeans является возможность редактирования в режиме «столбец» или «блок». Чтобы использовать его, вы можете скопировать приведенный выше исходный код (на рис.3) и вставить его в файл <project_root> /WEB-INF/faces-config.xml. Затем включите режим редактирования столбца (сочетание клавиш: CTRL + SHIFT + R или  значок выбора  ).

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

Рис. 4 Редактирование режима колонки (сочетание клавиш: CTRL + SHIFT + R)

Выберите первые столбцы с пустыми пробелами и номерами строк, а затем нажмите клавишу DEL на клавиатуре. Вы можете увидеть результат на рис. 5 ниже.

Рис. 5 Результат в NetBeans (WEB-INF /face-config.xml)

Следующим шагом в нашем примере является создание страницы «index.xhtml» (см. Исходный код на рис. 6 ниже) и попытайтесь применить ту же технику снова.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <head>
        <title>
            <h:outputText value="#{i18n['index.title']}"/>
        </title>
    </head>
    <f:loadBundle basename="UIResources" var="i18n"/>
    <body>
        <f:view locale="en">
          <p>Heaven-o my friend!</p>
          <h:outputText value="#{i18n['index.helloworld']}" />
          <h:outputLink id ="link01" value="#{i18n['index.link']}" >
           <h:outputText value="#{i18n['index.linkdescription']}" />
          </h:outputLink>
        </f:view>
    </body>
</html>

Рис. 6
Интернационализированная страница с ресурсами в i18n

Обратите внимание на строку, где пакет ресурсов сопоставлен с переменной страницы:

<f:loadBundle basename="UIResources" var="i18n"/>

Вы можете увидеть результат в редакторе, где у вас есть удобное автозаполнение. Если вы наберете # {} — вы получите список доступных компонентов.

Рис. 7 Исходный код результата в редакторе NetBeans

IDE NetBeans и расположение ресурсов

Важно организовать ваши файлы в логической структуре. На рис. 8 ниже, вы можете увидеть расположение «face-config.xml »,« web.xml »(в WEB-INF),« images »(зависит от конфигурации — здесь оно находится в resources / images / *. Png ) и «файлы свойств» (должны находиться в исходных пакетах — зависит от конфигурации):

Рис. 8 Структура веб-проекта в NetBeans

Редактировать все строки ресурсов одновременно в NetBeans

There is a convenient editor in NetBeans, where you can open side by side all resource files and check for missing translations. This can be done from the Open menu when you right-click on a bundle (see on fig. 9, below).

Fig. 9 Open for editing multiple strings at once in NetBeans

You now have a handy editor which can be used to edit several language files at once and to check if there are missing translations, which is normally a task that is not trivial to perform manually (fig. 10).

Fig. 10 Edit all text resources (property files) at once in NetBeans 

Notice also, back in the source code from fig.4, that resources can be changed:

<f:view locale="en">

Instead of English «en», you can put «bg» there, or any other of the supported locales.

Then run project.

If you change «en» to «bg», for example – and you refresh the page in the browser – you will see the page translated in Bulgarian (or at least see that the pages uses the Bulgarian language resource files).

Here is a result screenshot (fig. 11):

Fig. 11. Result page in bg locale.

Icons used can be found in [1] in reference section at the bottom of  article.

Here are several improvements to the scenario described above.

Change Language Dynamically

Firstly, use request parameters for language locales. It is not very convenient to change manually the language, so here are two other ways to achieve the same.

You can read language parameters from the page URL. Change line 15 as follows:

<f:view locale="#param.lang">

Чтобы передать параметры через URL, используйте следующий стандартный подход:

http: // localhost: 8084 / i18n_lab05 / face / index.xhtml ? lang = en (английский язык)

http: // localhost: 8084 / i18n_lab05 / face / index.xhtml ? lang = en_US (английский язык в США)

http: // localhost: 8084 / i18n_lab05 / face / index.xhtml ? lang = bg (болгарский язык)

Альтернативный синтаксис может быть: 
http: // localhost: 8084 / i18n_lab05 /? Lang = bg 

Параметры сообщения

Во-вторых, вы можете использовать параметры для настройки окончательного сообщения.

Чтобы добавить настраиваемые сообщения с параметрами, вы можете изменить тело страницы JSF, как показано на рис.12 ниже:

<body>
  <p>Heaven o-my friend!</p>
  <br/>
  <h:outputText value="#{i18n['index.helloworld']}" /><br/>
  <h:outputLink id="link01" value="#{i18n['index.link']}">
  <h:outputText value="#{i18n['index.linkdescription']}" />
  </h:outputLink><br/><br/>
  <h:outputFormat value="#{i18n['formattedMessage']}">
     <f:param value="Milen"/>
     <f:param value="555-666"/>
  </h:outputFormat><br/><br/>
  <h:graphicImage value="#{i18n['imagePath']}"   />
</body>

Fig. 12 Formatted messages with parameters and access to images

Loading More than One Resource Bundle

It is possible to manually load different bundles in JSF pages (see the code below):

<f:loadBundle basename="BundleLocal" var="i18n_1" />
<body>
<h1><h:outputText value="#{i18n_1['page1.heaveno']}" /></h1>

The idea here is to have separate resource files for specific modules or functionality.

Conclusions and Further Extensions

The application and steps presented here are simple, but they show an important process and the steps of facilitating internationalization in Java web applications in the NetBeans environment. Many of these solutions are not NetBeans-specific, but still NetBeans IDE speeds up development and helps in editing, deployment, and testing of these aspects of Java web applications.

A possible extension of the application is to let the language be saved in a session or database, parsed/received trough HTTP header; while other enhancements might be to change the language through AJAX requests, as well as to provide support for better navigation. But these are other stories for another time!

Resources

[1] Open Icon Library, http://openiconlibrary.sourceforge.net/, last visited 2014-02-07