2011-12-20 3 views
3

Мой код здесь выполняет итерации столбцов для каждой строки, а атрибут rendered вычисляется на каждую итерацию, перевыполняя testRule.Как установить переменную в JSF?

<p:dataTable ...> 
    <p:column ...> 
     ... 
    </p:column> 

    <p:column rendered="#{managedBean.testRule('rules.canDoActions')}"> 
     <!-- Action buttons --> 
     <h:commandButton ...> 
     <h:commandButton ...> 
    </p:column> 
</p:dataTable> 

Чтобы получить более высокую производительность, мне было интересно, чтобы установить результат в переменную, но я не знаю, как ... Это стало бы что-то вроде этого:

<?:??? var="canDoActions" value="#{managedBean.testRule('rules.canDoActions')}"> 
    <p:dataTable ...> 
     <p:column ...> 
      ... 
     </p:column> 

     <p:column rendered="#{canDoActions}"> 
      <!-- Action buttons --> 
      <h:commandButton ...> 
      <h:commandButton ...> 
     </p:column> 
    </p:dataTable> 

Кроме того, я 'm не разрешено использовать Библиотека тегов ядра, что означает, что <c:set ../> не может быть и речи.

В этой области действия, как я могу установить переменную? Или, если это невозможно, что вы предлагаете решить?

+1

Почему не вы "разрешено" использовать JSTL ядра TagLib? – BalusC

+0

@BalusC: Архитектор решил не использовать JSTL с JSF, потому что (если я не ошибаюсь) он работает в другой фазе других тегов, и люди здесь использовали его безрассудно, смешивая вещи, и появилось много ошибок и заметок (если Я не ошибаюсь, ядро ​​JSTL не переименовано в вызовы ajax). JSTL был создан для JSP, и он был логически разработан для него. Я знаю, что его можно использовать с JSF, но здесь архитектор решил, что использование JSTL не будет лучшей практикой. Несмотря на то, что мы жертвовали JSTL, наши проблемы были решены (верьте, JSTL не так уж и необходимо). Рад поговорить с тобой, @BalusC! – falsarella

+4

JSTL действительно не обязательно необходим. Но это может быть полезно, если вы хотите динамически создавать представление. См. Также http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense. Хотя ваш архитектор определенно имеет правильную точку (это действительно часто путается для начинающих), но полностью ограничивая его, он немного переусердствует , Ну, '' будет ответом на ваш вопрос. Если это не вариант (или выявляет другие проблемы, это не очень хорошо сочетается с просмотром фасоли, например), то вы должны кэшировать себя в getter. См. Ответ Джигара. – BalusC

ответ

5

Я не разрешается использовать библиотеку тегов Core, которым означает, что <c:set ../> вне вопроса

Затем вы можете их сохранить на самом Bean и проверить, если это нуль calculateRules и заданное значение или просто вернуться.

Для примера:

HashMap<String, Boolean> map; 

public boolean testRule(String stringInput) { 
    Boolean result = map.get(stringInput); 

    if (result == null) { 
     //calculate and set in map 
    } 

    return result; 
} 
Смежные вопросы