ui: повторить внутри или внутри ui: повторить не работать [дублировать]

Когда вы конвертируете .1 или 1/10 в base 2 (двоичный), вы получаете повторяющийся шаблон после десятичной точки, точно так же, как пытаетесь представить 1/3 в базе 10. Значение не является точным, и поэтому вы можете 't делать точную математику с ней, используя обычные методы с плавающей запятой.

238
задан BalusC 2 March 2016 в 23:39
поделиться

7 ответов

Если вы используете CDI, вы можете использовать методы Producers. Он будет вызываться много раз, но результат первого вызова кэшируется в объеме компонента и эффективен для геттеров, которые вычисляют или инициализируют тяжелые объекты! См. здесь , для получения дополнительной информации.

317
ответ дан Community 27 August 2018 в 06:29
поделиться

С JSF 2.0 вы можете присоединить слушателя к системному событию

<h:outputText value="#{ManagedBean.someProperty}">
   <f:event type="preRenderView" listener="#{ManagedBean.loadSomeProperty}" />
</h:outputText>

. В качестве альтернативы вы можете заключить страницу JSF в тег f:view

<f:view>
   <f:event type="preRenderView" listener="#{ManagedBean.loadSomeProperty}" />

      .. jsf page here...

<f:view>
14
ответ дан César Alforde 27 August 2018 в 06:29
поделиться

Первоначально опубликовано в форуме PrimeFaces @ http://forum.primefaces.org/viewtopic.php?f=3&t=29546

Недавно я был одержим оценивая производительность моего приложения, настраивая запросы JPA, заменяя динамические SQL-запросы именованными запросами, и только сегодня утром я узнал, что метод getter больше похож на HOT SPOT в Java Visual VM, чем остальная часть моего кода (или большинства мой код).

Метод Getter:

PageNavigationController.getGmapsAutoComplete()

Ссылка на ui: include in in index.xhtml

Ниже вы увидите, что PageNavigationController.getGmapsAutoComplete () является HOT SPOT (проблема с производительностью) в Java Visual VM. Если вы посмотрите дальше, на экране захвата, вы увидите, что getLazyModel (), PrimeFaces ленивый метод datatable getter, также является горячей точкой, только когда enduser делает много «ленивых данных» типа вещей / операций / задач в приложении. :]

Java Visual VM: showing HOT SPOT [/g1]

См. (исходный) код ниже.

public Boolean getGmapsAutoComplete() {
    switch (page) {
        case "/orders/pf_Add.xhtml":
        case "/orders/pf_Edit.xhtml":
        case "/orders/pf_EditDriverVehicles.xhtml":
            gmapsAutoComplete = true;
            break;
        default:
            gmapsAutoComplete = false;
            break;
    }
    return gmapsAutoComplete;
}

Называется в index.xhtml:

<h:head>
    <ui:include src="#{pageNavigationController.gmapsAutoComplete ? '/head_gmapsAutoComplete.xhtml' : (pageNavigationController.gmaps ? '/head_gmaps.xhtml' : '/head_default.xhtml')}"/>
</h:head>

Решение: поскольку это метод «getter», переместите код и присвойте значение gmapsAutoComplete до вызова метода; см. код ниже.

/*
 * 2013-04-06 moved switch {...} to updateGmapsAutoComplete()
 *            because performance = 115ms (hot spot) while
 *            navigating through web app
 */
public Boolean getGmapsAutoComplete() {
    return gmapsAutoComplete;
}

/*
 * ALWAYS call this method after "page = ..."
 */
private void updateGmapsAutoComplete() {
    switch (page) {
        case "/orders/pf_Add.xhtml":
        case "/orders/pf_Edit.xhtml":
        case "/orders/pf_EditDriverVehicles.xhtml":
            gmapsAutoComplete = true;
            break;
        default:
            gmapsAutoComplete = false;
            break;
    }
}

Результаты теста: PageNavigationController.getGmapsAutoComplete () больше не является HOT SPOT в Java Visual VM (больше не отображается)

тема, так как многие из опытных пользователей посоветовали младшим разработчикам JSF НЕ добавлять код в методы «getter». :)

4
ответ дан Howard 27 August 2018 в 06:29
поделиться

Вероятно, вы можете использовать AOP для создания своего рода Aspect, который кэшировал результаты наших геттеров для настраиваемого количества времени. Это может помешать вам копировать и вставлять код шаблона в десятки аксессуаров.

2
ответ дан matt b 27 August 2018 в 06:29
поделиться

Если значение someProperty дорого рассчитать, это потенциально может быть проблемой.

Это то, что мы называем преждевременной оптимизацией. В редком случае, когда профилировщик говорит вам, что вычисление свойства настолько необычайно дорого, что его трижды, а не один раз оказывает значительное влияние на производительность, вы добавляете кеширование, как вы описываете. Но если вы не делаете что-то действительно глупое, как факторинговые простые числа или получаете доступ к базе данных в геттере, ваш код, скорее всего, имеет десяток худших недостатков в тех местах, о которых вы никогда не думали.

-1
ответ дан Michael Borgwardt 27 August 2018 в 06:29
поделиться

Это все еще большая проблема в JSF. Fo, если у вас есть метод isPermittedToBlaBla для проверок безопасности, и в вашем представлении у вас есть rendered="#{bean.isPermittedToBlaBla}, тогда метод будет вызываться несколько раз.

Проверка безопасности может быть сложной, например. LDAP-запрос и т. Д. Поэтому вы должны избегать этого с помощью

Boolean isAllowed = null ... if(isAllowed==null){...} return isAllowed?

, и вы должны убедиться в этом в каждом сеансе.

Ich думаю, что JSF должен реализовать здесь некоторые расширения, чтобы избежать множественных вызовы (например, аннотация @Phase(RENDER_RESPONSE) вычисляет этот метод только один раз после фазы RENDER_RESPONSE ...)

0
ответ дан sbgoran 27 August 2018 в 06:29
поделиться

Я написал статью о том, как кешировать бобы JSF с помощью Spring AOP.

Я создаю простой MethodInterceptor, который перехватывает все методы, аннотированные специальной аннотацией:

public class CacheAdvice implements MethodInterceptor {

private static Logger logger = LoggerFactory.getLogger(CacheAdvice.class);

@Autowired
private CacheService cacheService;

@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {

    String key = methodInvocation.getThis() + methodInvocation.getMethod().getName();

    String thread = Thread.currentThread().getName();

    Object cachedValue = cacheService.getData(thread , key);

    if (cachedValue == null){
        cachedValue = methodInvocation.proceed();
        cacheService.cacheData(thread , key , cachedValue);
        logger.debug("Cache miss " + thread + " " + key);
    }
    else{
        logger.debug("Cached hit " + thread + " " + key);
    }
    return cachedValue;
}


public CacheService getCacheService() {
    return cacheService;
}
public void setCacheService(CacheService cacheService) {
    this.cacheService = cacheService;
}

}

Этот перехватчик используется в файле конфигурации пружины:

    <bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <property name="pointcut">
        <bean class="org.springframework.aop.support.annotation.AnnotationMatchingPointcut">
            <constructor-arg index="0"  name="classAnnotationType" type="java.lang.Class">
                <null/>
            </constructor-arg>
            <constructor-arg index="1" value="com._4dconcept.docAdvance.jsfCache.annotation.Cacheable" name="methodAnnotationType" type="java.lang.Class"/>
        </bean>
    </property>
    <property name="advice">
        <bean class="com._4dconcept.docAdvance.jsfCache.CacheAdvice"/>
    </property>
</bean>

Надеюсь, что это поможет!

6
ответ дан sth 27 August 2018 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: