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

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

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

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

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

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

получается get-запрос идет в обход jsf цикла?
...
Рейтинг: 0 / 0
28.05.2014, 12:42
    #38654349
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: почему создается бин?
rema174,
"классический" jsf цикл включает 6 фаз, самая последняя - render_view. В GET-запросах выполняется только эта последняя фаза, и никаких действий по восстановлению предыдущего состояния не происходит.
...
Рейтинг: 0 / 0
28.05.2014, 12:47
    #38654360
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jsf: почему создается бин?
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
Форумы / Java [игнор отключен] [закрыт для гостей] / jsf: почему создается бин? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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