powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / jsf: почему создается бин?
13 сообщений из 13, страница 1 из 1
jsf: почему создается бин?
    #38654074
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть страница, которая показывает список всех задач и DataBean, который отвечает за получение данных.
На странице имеем след-е
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<h:form>			
	<h:commandLink value="ссылка" action="#{formBean.newtask}" />			
</h:form>

<p:dataList id="dataList" value="#{dataBean.activeTasks}" var="task"
      type="ordered" emptyMessage="empty list">
...
</p:dataList>


Так вот, dataBean на этой странице и на других страницах больше не встречается.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import data.Dao;

@Named
@RequestScoped
public class DataBean {
	
	@Inject
	private Dao dao;
	
	@Inject
	private UserBean userBean;
	
	private List<Task> activeTasks = new ArrayList<>();
	
	@PostConstruct
	private void init() {
		activeTasks = dao.getTasks(userBean.getEmail());
	}

	public List<Task> getActiveTasks() {
		return activeTasks;
	}
} 



в dao
Код: java
1.
2.
3.
4.
5.
6.
7.
public List<Task> getTasks(String email) {
    ...
    if(activeTasks.isEmpty()) {
	logger.info("activeTasks is empty");
    }
    return activeTasks;
}


Этот метод вызывается только в DataBean и только в одном месте (см. выше). Также другие методы из дао не ипользуют этот метод. И другие бины не используют этот метод. Данных в базе нет, т.е. из этого метода будет "activeTasks is empty".
Когда мы открываем в браузере страницу, то понятно, что в логах нам покажет
автор07:30:43,843 INFO [MyLog] (http-localhost-127.0.0.1-8080-1) activeTasks is empty
Но когда переходим по ссылке, то почему-то появляется еще одни вывод, что на мой взгляд не логично
автор07:30:48,671 INFO [MyLog] (http-localhost-127.0.0.1-8080-1) activeTasks is empty
С какого перепуга берется этот вывод, если на странице, на которую мы переходим, getTasks(...) не вызывается, т.е. на новой странице не встречается dataBean, и другие бины, встречающиеся на этой странице не используют getTasks(...) ?

контейнер JBoss
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654109
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, Firebug может показать почему.
Возможно, по клику на гиперссылку делается не сразу переход по ссылке, а сначала POST на страницу со списком задач.
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654140
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
установлен firebug. не понятно где там это показывает?
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654142
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в окошке All при переходе по страницам не выдает никакую информацию
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654155
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так работает jsf - на сервере восстанавливается предыдущее состояние (view), валидируются и применяются новые значения, вызываются xxxListener-ы, и только потом запрашивается значение action. Поскольку бин @RequestScoped, его состояние нигде не сохраняется между запросами, и каждый раз воссоздается заново (самая первая фаза из перечисленных). Поэтому каждый раз вызывается dao.getTasks.
Чтобы избежать повторных вызовов, нужно либо сохранять состояние (@ViewScoped, @SessionScoped, saveState теги и т.п.), либо, если позволяют условия задачи, указать, что данная ссылка должна игнорировать сохраненное состояние и внесенные изменения (imediate="true")
Код: html
1.
<h:commandLink value="ссылка" action="#{formBean.newtask}" immediate="true" />
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654176
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174в окошке All при переходе по страницам не выдает никакую информацию

Закладка Консоль, кнопку "Не очищать" надо сделать нажатой, чтобы оставалась история при переходах по страницам.

Еще можно посмотреть access-логи сервера. Там тоже можно обнаружить "лишний" POST.
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654215
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
h:commandLink всегда работает через POST, можно никуда не заглядывать. Если нужна get-ссылка, то лучше использовать тег h:link
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654297
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, с файрбагом вроде понял

immediate true - немного не про эту ситуацию

при ViewScoped выскакивает аж шесть новых строк в логах...

все ок при SessionScoped, но хотелось как можно меньше использовать его

и все ок для RequestScoped при h:link, только не понял - при get запросе игнорируется jsf цикл и не восстанавливается предыдущее состояние (view)на сервере?

только есть еще кое-что, на странице так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<h:form>
	<h:link value="new task" outcome="newtask" />					
</h:form>
		
<p:panel id="panel">
				
	<p:dataList id="dataList" value="#{dataBean.activeTasks}" var="task">
		...
	</p:dataList>

	<h:form>
		<p:commandButton value="new task" action="newtask" />
	</h:form>
		
</p:panel>



хотелось бы оставить p:commandButton, так как там свой стиль, все дела, как тут быть? ведь эта кнопка тоже работает через post
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654314
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rema174,
Код: xml
1.
<p:button value="new task" outcome="newtask"/>
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654317
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У p:button еще есть атрибут href.
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654327
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да! то что доктор прописал, спасибо!

я как-то не встречал эту разницу между commnadButton и Button, пойду почитаю что ли

имхо, вполне устраивает и атрибут outcome у p:button

получается get-запрос идет в обход jsf цикла?
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654349
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rema174,
"классический" jsf цикл включает 6 фаз, самая последняя - render_view. В GET-запросах выполняется только эта последняя фаза, и никаких действий по восстановлению предыдущего состояния не происходит.
...
Рейтинг: 0 / 0
jsf: почему создается бин?
    #38654360
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,
ясно. видно этот момент не так уж был и очевиден если:
mkyong My thought…
No really sure why JSF 2.0 released this “h:button” tag, the JavaScript redirection is not practical, especially in JavaScript disabled browser. The best is integrate the “outcome” attribute into the “h:commandButton” tag, hope it can be done in future release.
а ведь сделали именно для get
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / jsf: почему создается бин?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]