Некоторое время назад я работал над веб-проектом на основе JAVA и обнаружил, что этот веб-сайт очень полезен во многих случаях.
Итак, теперь у меня есть некоторые проблемы - и буду признателен, если вы поможете!
Хорошо, вот в чем дело -
Я пытаюсь отобразить список сообщений, каждое из которых состоит из заголовка сообщения и тела сообщения. Уловка, над которой я работаю, заключается в том, что тело сообщения, пока заголовок (который является a4j: commandLink) не был нажат, должно быть скрыто. И как только заголовок щелкнет - тело должно быть отображено. И как только его снова щелкнули - скрыть. И пр.
Вот что я сделал на стороне JSF (некоторые части для простоты опущены):
<a4j:repeat var="msg" value="#{ForumRenderJSF.messages}">
<a4j:region id="msgAjaxRegion" renderRegionOnly="true">
<a4j:outputPanel id="msgPanel" ajaxRendered="true">
<rich:panel style="width: 100%; border: 0">
<a4j:form id="msgForm">
<!--
The message's title.
Each click results in either the revealing or hiding of the message's body.
-->
<a4j:commandLink value="#{msg.title}" action="#{ForumRenderAssistJSF.reevaluateRender}"/>
<h:outputText value=" By: <i>#{msg.userNick}</i>, #{msg.timestamp}" escape="false"/>
<!--
The message's body.
-->
<!-- A (textual) flag, indicating whether the body should be rendered. -->
<h:inputText id="renderBodyFlag"/>
<br/>
<!-- The body. -->
<a4j:outputPanel rendered="#{rich:findComponent('renderBodyFlag').value == true}">
<h:outputText value="#{msg.body}"/>
</a4j:outputPanel>
</a4j:form>
</rich:panel>
</a4j:outputPanel> <!-- msgPanel -->
</a4j:region>
</a4j:repeat>
Обратите внимание на использование:
1. Пустое поле renderFlag (должно быть, в конце концов, скрыто), значение которого указывает, следует ли отображать тело.
2. вспомогательный компонент для оказания помощи (ForumRenderAssistJSF); Его цель - перевернуть правильное значение renderFlag с «true» на «false» и наоборот.
3. Область a4j: для изоляции каждого сообщения при запуске запроса для ForumRenderAssistJSF.reevaluateRender () - так, чтобы компонент мог найти правильное поле «renderFlag».
Что касается бобов:
public class ForumRenderAssistJSF {
public void reevaluateRender()
{
FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot root = context.getViewRoot();
UIComponent renderFlagComp = (new UIComponentLookup()).lookup(root, compLookup); // My recursive search
String renderFlagVal = (String) ((HtmlInputText)renderFlagComp).getValue();
if (!renderFlagVal.equals("true"))
{
((HtmlInputText)renderFlagComp).setValue("true");
}
else
{
((HtmlInputText)renderFlagComp).setValue("false");
}
}
}
И ПРОБЛЕМА ЕСТЬ:
Трюк действительно работает - но только для первого сообщения в списке!
В остальном я вижу, что сервер может получить доступ к нужному компоненту ввода текста renderFlag (проверяется путем вставки значений на клиенте), но по какой-то причине - клиент всегда отображает его пустым (без содержимого) при ответе AJAX!
Я попытался покопаться в уроках и руководствах по richfaces, и мне кажется, что все так, как должно быть. Итак, я немного потерян здесь, и, как я уже сказал, буду очень признателен за вашу помощь в этом!
Спасибо!