Всем привет. Стараюсь активно учить Java. Есть совсем небольшой проект, чтобы познакомиться с JSF + CDI.
Вот структура проекта
Содержимое файла example.xhtml
<?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://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>#{ExampleBean.title}</title>
</h:head>
<h:body>
<h:outputText value="#{ExampleBean.text}" />
</h:body>
</html>
Класс из которого хочу получить поля:
package webapp;
import javax.inject.Named;
@Named
public class ExampleBean {
private String text = "CDI example";
private String title = "Welcome to the club, Buddy";
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Проблема: При запуске сервера и перехода на веб страничку localhost.../example.xhtml получаю пустую страницу. Понял, что JSF файл не видит класс ExampleBean, но не могу понять почему.
Заранее спасибо.
Потому что сам по себе @Named
не делает класс видимым в CDI.
Нужно пометить класс одной из аннотаций для CDI в зависимости от того, какую зону видимости хотите получить для своего класса.
Стандартные аннотации:
@Dependent
@RequestScoped
@ViewScoped
(из пакета javax.faces.view)
@ConversationScoped
@SessionScoped
@ApplicationScoped
Не перепутайте с одноименными аннотациями JSF (аннотации cdi импортируются из пакета javax.enterprise.context, JSF из javax.faces.bean)
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class ExampleBean {
В зависимости от настроек в beans.xml
аннотация @Dependent
может автоматически подразумеваться, если не указана явно никакая другая.
И если Вы не указываете имя явно в @Named
, то именем бина будет имя класса с маленькой буквы: #{exampleBean.text}
Проблема была не в отсутствии иных аннотация, помимо @Named. Я ошибся в 2-ух местах: 1) Пытался вызвать bean в example.xhtml, в то время, как писал я имя бина с большой буквы. 2) Скорее всего были забыты подключёны cdi библиотеки. Ответ Сергея навёл меня на мысль о такой проблеме и я добавил в структуру проекта нужные джарники.
Спасибо большое всем за участие и терпение !
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите редактор, который я мог бы добавить себе на сайт для того, чтобы я мог создавать в нем статьиНужен похожий редактор как у StackOverflow...
Вот цитата из книги Oracle-Certified-Professiona-Java-SE-8-Programmer-Exam-1Z0-809
Как добавить несколько строк в таблицу если одно из значений будет полученно из SELECT? В запросе все значения не меняются кроме, product_id