| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Рендеринг при первой загрузке страницы JSF |
| Автор: nikss 4.3.2008, 10:44 |
| Привет! Столкнулся с такой проблемой: на странице jsp есть компонент <h:panelGrid bind="#{state.menu}" ... > с дочерними компонентами <h:commandLink/>. Во время первой загрузки страницы, в фазе RENDER_RESPONSE, пытаюсь изменить в бине аттрубут "style" дочерних компонентов <h:commandLink/>, но оказывается , что "menu" (в бине, как HtmlPanelGrid) содержит нуль дочерних компонентов. Во всех последующих рендерингах дочерние компоненты присутствуют. Бин state объявлен как session бин в faces-config. Может кто сталкивался с такой ситуацией? Жду помощи! Спасибо. |
| Автор: ivg 4.3.2008, 11:35 |
| А почему стили на самой странице не прописать? PS: Поставьте точки останова на геттер и сеттер поля menu, и увидите как работает биндинг, на каких фазах и т. п. Покажите код и содержимое страницы, если не разберётесь. |
| Автор: nikss 4.3.2008, 12:00 | ||
| ivg, стили прописать на странице можно, но в данном случае у меня отрисовывается текущий элемент меню. Привожу код: Бин state
Страница header.jsp: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <f:loadBundle basename="ua.com.nikss.beans.Resources.messages" var="msgs"/> <head> <script language="javascript" src="/resources/jscript.js"> <LINK href="/resources/styleclass.css" rel="stylesheet" type="text/css"> </head> <f:subview id="header" > <h:form> <center> <h:panelGrid columns="5" cellpadding="4" cellspacing="2" > <h:graphicImage url="/images/logo_nokia.gif"/> <h:outputText value="Пользователь: #{state.user.login}"/> <h:selectOneListbox size="1" onchange="submit()" valueChangeListener="#{state.changeLocale}" value="#{state.locale}"> <f:selectItems value="#{state.locales}"/> </h:selectOneListbox> <h:commandButton action="#{state.logoff}" value="Выйти"/> </h:panelGrid> </center> </h:form> <h:form> <h:panelGrid columns="6" border="0" styleClass="border" binding="#{state.menu}"> <h:commandLink value="Главная" action="#{state.onActionMenu}" actionListener="#{state.onClickMenu}"> <f:attribute name="itemMenu" value="/content/main.jsp"/> </h:commandLink> <h:commandLink value="Журнал тренингов" action="#{state.onActionMenu}" actionListener="#{state.onClickMenu}"> <f:attribute name="itemMenu" value="/content/listOfTrainings.jsp"/> </h:commandLink> <h:commandLink value="Управление тренингами" action="#{state.onActionMenu}" actionListener="#{state.onClickMenu}"> <f:attribute name="itemMenu" value="/content/manageOfTrainings.jsp"/> </h:commandLink> <h:commandLink value="Регистрация нового тренинга" action="#{state.onActionMenu}" actionListener="#{state.onClickMenu}"> <f:attribute name="itemMenu" value="/content/addNewTraining.jsp"/> </h:commandLink> <h:commandLink value="Статус регистрации" action="#{state.onActionMenu}" actionListener="#{state.onClickMenu}"> <f:attribute name="itemMenu" value="/content/statusOfRegistration.jsp"/> </h:commandLink> <h:commandLink value="Администрирование" action="#{state.onActionMenu}" actionListener="#{state.onClickMenu}"> <f:attribute name="itemMenu" value="/content/admin.jsp"/> </h:commandLink> </h:panelGrid> </h:form> </f:subview> Страница main.jsp: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <f:view> <jsp:include page="Header.jsp"/> <h:outputText value="Главная"/> </f:view> |
| Автор: Maksym 4.3.2008, 13:17 |
| nikss jsf инстанциирует managed beans по требованию (on demand), то есть тогда когда они необходимы для генерации ответа. Видимо, в твоем случае menu понадобилось позже. Ты проверял в beforePhase или afterPhase? |
| Автор: nikss 4.3.2008, 15:26 |
| Maksym, каким образом это можно проверить? |
| Автор: Maksym 4.3.2008, 15:46 |
| nikss я уже сам увидел в твоем коде -- ты вызываешь createMenu(); в beforePhase() PhaseListener'а. Попробуй сделать это в afterPhase(). Правда я не уверен что сработает |
| Автор: ivg 4.3.2008, 17:15 | ||
Цитата из JSF Spec, правда для 1.1:
Как я понимаю, всё дело в механизме этого самого биндинга. Попробуйте, на всякий случай, обнулить поле menu в 3 строке бина. |
| Автор: nikss 30.3.2008, 15:33 | ||||
В общем, все перепробовал! Объявлял и так
и так
в конечном счете все равно приходим к нулевому значению дочерних элементов. пытался сделать это в методе afterPhase() - возвращает правильное количество дочерних элементов, но в этой фазе я немогу ничего сделать, так как мои изменения не будут применены. Понемногу начинаю разочаровываться в JSF. :( |