public interface Coder {
public String codeString(String s, int tval);
}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
В примере encoder
показано, как использовать альтернативы для выбора между двумя компонентами во время развёртывания, как описано в Использование альтернатив в приложениях CDI. Пример включает в себя интерфейс и две его реализации, Managed-бин, страницу Facelets и файлы конфигурации.
Исходные файлы находятся в каталоге tut-install/examples/cdi/encoder/src/main/java/javaeetutorial/encoder/
.
Здесь рассматриваются следующие темы:
Интерфейс Coder
содержит только один метод, codeString
, принимающий два аргумента: строку и целочисленное значение, определяющее способ транспонирования букв в строке.
public interface Coder {
public String codeString(String s, int tval);
}
Интерфейс имеет два класса реализации: CoderImpl
и TestCoderImpl
. Реализация codeString
в CoderImpl
сдвигает строковый аргумент вперед в алфавите на количество букв, указанное во втором аргументе. Любые символы, которые не являются буквами, остаются без изменений. (Этот простой код смены известен как шифр Цезаря, потому что Юлий Цезарь по сообщениям использовал его для связи со своими генералами.) Реализация в TestCoderImpl
просто отображает значения аргументов. Реализация TestCoderImpl
аннотирована @Alternative
:
import javax.enterprise.inject.Alternative;
@Alternative
public class TestCoderImpl implements Coder {
@Override
public String codeString(String s, int tval) {
return ("input string is " + s + ", shift value is " + tval);
}
}
Файл beans.xml
примера encoder
содержит элемент alternatives
для класса TestCoderImpl
, но по умолчанию элемент закомментирован:
<beans ...>
<!--<alternatives>
<class>javaeetutorial.encoder.TestCoderImpl</class>
</alternatives>-->
</beans>
Это означает, что по умолчанию класс TestCoderImpl
, аннотированный @Alternative
, не будет использоваться. Вместо этого будет использован класс CoderImpl
.
Простая страница Facelets index.xhtml
примера encoder
просит пользователя ввести строковые и целочисленные значения и передаёт их в Managed-бин, CoderBean
как coderBean.inputString
и coderBean.transVal
:
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<h:outputStylesheet library="css" name="default.css"/>
<title>String Encoder</title>
</h:head>
<h:body>
<h2>String Encoder</h2>
<p>Type a string and an integer, then click Encode.</p>
<p>Depending on which alternative is enabled, the coder bean
will either display the argument values or return a string that
shifts the letters in the original string by the value you
specify. The value must be between 0 and 26.</p>
<h:form id="encodeit">
<p><h:outputLabel value="Enter a string: " for="inputString"/>
<h:inputText id="inputString"
value="#{coderBean.inputString}"/>
<h:outputLabel value="Enter the number of letters to shift by: "
for="transVal"/>
<h:inputText id="transVal" value="#{coderBean.transVal}"/></p>
<p><h:commandButton value="Encode"
action="#{coderBean.encodeString()}"/></p>
<p><h:outputLabel value="Result: " for="outputString"/>
<h:outputText id="outputString"
value="#{coderBean.codedString}"
style="color:blue"/></p>
<p><h:commandButton value="Reset"
action="#{coderBean.reset}"/></p>
</h:form>
...
</h:body>
</html>
Когда пользователь кликает кнопку «Encode», страница вызывает метод encodeString
Managed-бина и отображает результат coderBean.codedString
синим цветом. На странице также есть кнопка сброса, которая очищает поля.
Managed-бин CoderBean
является компонентом @RequestScoped
, который объявляет свои свойства ввода и вывода. Свойство transVal
имеет три ограничения Bean Validation, которые устанавливают ограничения на целочисленное значение, поэтому, если пользователь вводит недопустимое значение, на странице Facelets появляется сообщение об ошибке по умолчанию. Бин также инъецирует объект интерфейса Coder
:
@Named
@RequestScoped
public class CoderBean {
private String inputString;
private String codedString;
@Max(26)
@Min(0)
@NotNull
private int transVal;
@Inject
Coder coder;
...
В дополнение к простым get- и set-методам для трёх свойств, бин определяет метод действия encodeString
, вызываемый страницей Facelets. Этот метод устанавливает для свойства codedString
значение, возвращаемое при вызове метода codeString
реализации Coder
:
public void encodeString() {
setCodedString(coder.codeString(inputString, transVal));
}
Наконец, бин определяет метод reset
для очистки полей страницы Facelets:
public void reset() {
setInputString("");
setTransVal(0);
}
Вы можете использовать IDE NetBeans или Maven для сборки, упаковки, развёртывания и запуска приложения encoder
.
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
В меню «Файл» выберите «Открыть проект».
В диалоговом окне «Открыть проект» перейдите к:
tut-install/examples/cdi
Выберите каталог encoder
.
Нажмите Открыть проект.
На вкладке Проекты кликните правой кнопкой мыши проект encoder
и выберите Сборка.
Эта команда собирает и упаковывает приложение в WAR-файл encoder.war
, расположенный в каталоге target
, а затем развёртывает его на сервере GlassFish.
В веб-браузере введите следующий URL:
http://localhost:8080/encoder
На странице String Encoder введите строку и количество букв для сдвига, а затем нажмите Encode.
Закодированная строка отображается синим цветом в строке результатов. Например, если вы введёте Java
и 4
, результатом будет Neze
.
Теперь отредактируйте файл beans.xml
, чтобы включить альтернативную реализацию Coder
.
На вкладке «Проекты» в проекте encoder
разверните узел Веб-страницы, затем разверните узел WEB-INF.
Выполните двойной клик на файле beans.xml
, чтобы открыть его.
Удалите символы комментария, которые окружают элемент alternatives
, чтобы он выглядел следующим образом:
<alternatives>
<class>javaeetutorial.encoder.TestCoderImpl</class>
</alternatives>
Сохраните файл.
Кликните правой кнопкой мыши проект encoder
и выберите команду «Очистить и собрать».
В веб-браузере повторно введите URL, чтобы отобразить страницу String Encoder для повторно развёрнутого проекта:
http://localhost:8080/encoder/
Введите строку и количество букв для сдвига, а затем нажмите «Encode».
На этот раз в строке результатов отображаются ваши аргументы. Например, если вы введёте Java
и 4
, результат будет следующим:
Result: input string is Java, shift value is 4
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
В окне терминала перейдите в:
tut-install/examples/cdi/encoder/
Введите следующую команду для развёртывания приложения:
mvn install
Эта команда собирает и упаковывает приложение в WAR-файл encoder.war
, расположенный в каталоге target
, а затем развёртывает его на сервере GlassFish.
В веб-браузере введите следующий URL:
http://localhost:8080/encoder/
Откроется страница String Encoder.
Введите строку и количество букв для сдвига, а затем нажмите «Encode».
Закодированная строка отображается синим цветом в строке результатов. Например, если вы введёте Java
и 4
, результатом будет Neze
.
Теперь отредактируйте файл beans.xml
, чтобы включить альтернативную реализацию Coder
.
В текстовом редакторе откройте следующий файл:
tut-install/examples/cdi/encoder/src/main/webapp/WEB-INF/beans.xml
Удалите символы комментария, которые окружают элемент alternatives
, чтобы он выглядел следующим образом:
<alternatives>
<class>javaeetutorial.encoder.TestCoderImpl</class>
</alternatives>
Сохраните и закройте файл.
Введите следующую команду:
mvn clean install
В веб-браузере повторно введите URL, чтобы отобразить страницу String Encoder для повторно развёрнутого проекта:
http://localhost:8080/encoder
Введите строку и количество букв для сдвига, а затем нажмите «Encode».
На этот раз в строке результатов отображаются ваши аргументы. Например, если вы введёте Java
и 4
, результат будет следующим:
Result: input string is Java, shift value is 4
Назад | Вперёд | Содержание |