2015-03-06 3 views
0

У меня есть приложение JSF, которое создает и представляет около 50 отчетов. Эти отчеты отображаются PNG, а под изображениями отображается таблица.JSF слишком много commandLinks (h: form) приводит к ViewExpiredException

В этой таблице используется RichTaces 4 togglePanel с ключом = "клиент". TogglePanel предназначен только для свертывания и расширения таблицы.

<h:form> 
     <rich:togglePanel id="#{param.reportWrapper}_togglePanel" 
      stateOrder="opened,closed" activeItem="opened" switchType="client"> 
      <rich:togglePanelItem name="closed"> 
       <h:panelGroup> 
        <div class="myclass"> 
         <ul class="container-icons"> 
          <li> 
           <h:commandLink styleClass="container-max" value="maximieren"> 
             <rich:toggleControl targetPanel="#{param.reportWrapper}_togglePanel" targetItem="@next" /> 
           </h:commandLink> 
          </li> 
         </ul> 
         <h3>My Heading</h3> 
        </div> 
       </h:panelGroup> 
      </rich:togglePanelItem> 
      <rich:togglePanelItem name="opened"> 
       <h:panelGroup> 
        <div class="myclass"> 
         <ul class="container-icons"> 
          <li> 
           <h:commandLink styleClass="container-min" value="minimieren"> 
             <rich:toggleControl targetPanel="#{param.reportWrapper}_togglePanel" targetItem="@prev" /> 
           </h:commandLink> 
          </li> 
         </ul> 
         <h3>Another Heading</h3> 
         <div class="scrolling-table-content"> 
          <rich:dataTable> 
             // ... 
          </rich:dataTable> 
         </div> 
        </div> 
       </h:panelGroup> 
      </rich:togglePanelItem> 
     </rich:togglePanel> 
     </h:form> 

Проблема в том, что иногда я получаю ViewExpiredExceptions при загрузке отчетов. Мой numberOfLogicalViews и numberOfViewsInSession - 14. Я не хочу устанавливать его на 50 из-за проблем с памятью и потому, что это не обязательно, потому что одновременно отображается только один отчет.

Я попытался удалить теги h: form, которые рассматриваются как логический. На мой взгляд, togglePanel - это не тот элемент, который нуждается в форме, потому что это тип коммутатора - клиент (а не сервер и ajax, которым нужны теги формы). Но для командной строки нужен тег формы, потому что, если я удалю его, возникает ошибка, говорящая, что «эта ссылка отключена, поскольку она не вложена в форму jsf».

Поэтому я попытался заменить commandLink на commandButton. Сначала это сработало, и форма больше не нужна. Но почему-то поведение сейчас совершенно случайное. Иногда таблицы могут быть расширены, иногда ничего не происходит, когда я нажимаю кнопку «Развернуть». Когда я снова добавляю теги формы, он отлично работает, но не решает проблему ViewExpiredException.

Надежда, кто-то может помочь мне здесь ...

Спасибо за вашу помощь!

Buntspecht

+0

Возможно, вы захотите использовать '', если вам нужно что-то свернутое. Но я вижу только 2 команды, как их слишком много? – Makhiel

+0

Это слишком много, потому что это всего лишь пример для одного из 50 загружаемых отчетов. Текущий выбранный отчет отображается в большем кадре, а остальные отчеты загружаются в виде миниатюр в виде предварительного просмотра. Таким образом, во всем есть около 100 commandLinks. – buntspecht

+0

И вам нужно общаться с сервером? Потому что тогда вам не понадобятся командные ссылки. – Makhiel

ответ

0

Большое спасибо за вашу помощь Makhiel. Наконец, мне удалось решить проблему с помощью решения commandButtons. Я не могу объяснить, почему, но идентификаторы моих togglePanelItems дублировались в разных отчетах.

Предоставление каждому togglePanelItem уникальный идентификатор, как

<rich:togglePanelItem name="closed" id="#{param.reportWrapper}_opened"> 

и

<rich:togglePanelItem name="opened" id="#{param.reportWrapper}_closed"> 

решил проблему ...

Так что теперь мы избавились от всех часов: теги формы и, таким образом, меньше 50 логических просмотров! :)

0

Если вам нужно только переключить панель можно использовать <a4j:commandLink>, что позволяет ограничить объем выполнения (поэтому он не будет представлять всю форму). Или вы можете удалить компоненты команды в целом и просто использовать JavaScript API из togglePanel:

<a onclick="#{rich:component('panelId')}.switchToItem(#{rich:component('panelId')}.nextItem())">Next</a>