Странное поведение с переносимыми перьями, вложенными в портлет JSF [дубликат]

Возможно, проблема в конфигурации почтового сервера, чтобы избежать подобных проблем или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать PHPMailer , это плагин у которого есть все необходимое для отправки почты, единственное, что вы должны учесть, это иметь SMTP-порт (порт: 25 и 465), включен

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
       //Server settings
       $mail->SMTPDebug = 0;                                 
       $mail->isSMTP();                                      
       $mail->Host = 'smtp.gmail.com';  
       $mail->SMTPAuth = true;                               
       $mail->Username = 'correo@gmail.com';                 
       $mail->Password = 'contrasenia';                           
       $mail->SMTPSecure = 'ssl';                          
       $mail->Port = 465;                                    

       //Recipients
       $mail->setFrom('correo@gmail.com', 'my name');    
       $mail->addAddress('destination@correo.com');               

       //Attachments
       $mail->addAttachment('optional file');         // Add files, is optional

       //Content
       $mail->isHTML(true);// Set email format to HTML
       $mail->Subject = utf8_decode("subject");
       $mail->Body    = utf8_decode("mail content");
       $mail->AltBody = '';
       $mail->send();
     }
     catch (Exception $e){
        $error = $mail->ErrorInfo;
     }

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

8 ответов

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

317
ответ дан Community 22 August 2018 в 11:22
поделиться
  • 1
    Просто не используйте геттеры для ведения бизнес-логики. Это все. Измените свою логику кода. Моя ставка на то, что она уже исправлена, просто используя конструктор, postconstruct или метод действий умным способом. – BalusC 19 January 2010 в 01:03
  • 2
    -1, сильно не согласны. Весь смысл спецификации javaBeans заключается в том, чтобы свойства allow были больше, чем просто значение поля, и "производные свойства" которые рассчитываются на лету, совершенно нормальны. Беспокойство по поводу избыточных геттерных вызовов - не что иное, как преждевременная оптимизация. – Michael Borgwardt 19 January 2010 в 01:30
  • 3
    Ожидайте, если они будут делать больше, чем возвращать данные, как вы так четко заявили о себе :) – BalusC 19 January 2010 в 04:10
  • 4
    вы можете добавить, что ленивая инициализация в геттерах все еще действительна в JSF :) – Bozho 19 January 2010 в 08:13
  • 5
    У нас обоих явно есть недоразумение :) Не беспокойтесь. – BalusC 19 January 2010 в 15:56
320
ответ дан Community 5 November 2018 в 08:53
поделиться

С 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 22 August 2018 в 11:22
поделиться

Первоначально опубликовано в форуме 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 22 August 2018 в 11:22
поделиться

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

2
ответ дан matt b 22 August 2018 в 11:22
поделиться
  • 1
    Этот весенний АОП вы говорите? Знаете ли вы, где я могу найти фрагмент кода или два аспекта с аспектами? Чтение всей 6-й главы весенней документации кажется излишним, поскольку я не использую Spring;) – Sevas 19 January 2010 в 00:53

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

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

-1
ответ дан Michael Borgwardt 22 August 2018 в 11:22
поделиться
  • 1
    Следовательно, вопрос - если someProperty соответствует чему-то дорогому вычислению (или по мере того, как вы добавляете его к базе данных или факторингам), какой лучший способ избежать вычисления несколько раз за запрос и является ли решение, указанное в вопросе лучший. Если вы не отвечаете на вопрос, комментарии - хорошее место для публикации, нет? Кроме того, ваше сообщение, похоже, противоречит вашему комментарию на посту BalusC - в комментариях, которые вы говорите, что делать «на лету» хорошо, и в вашем посте вы говорите, что это глупо. Могу ли я спросить, где вы рисуете линию? – Sevas 19 January 2010 в 15:24
  • 2
    Это скользящая шкала, а не черно-белая проблема. Некоторые вещи явно не являются проблемами, например. добавив несколько значений, потому что они занимают менее одной миллионной доли секунды ( much меньше). Некоторые из них явно представляют собой проблему, например, доступ к БД или файлу, поскольку они могут занимать 10 мс или более - и вам обязательно нужно их знать, чтобы избежать их, если это возможно, а не только в геттерах. Но для всего остального линия - это то, о чем говорит вам профайлер. – Michael Borgwardt 19 January 2010 в 15:42

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

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

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

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

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

0
ответ дан sbgoran 22 August 2018 в 11:22
поделиться
  • 1
    Вы можете кэшировать результат в RequestParameterMap – Christophe Roussy 19 April 2012 в 13: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 22 August 2018 в 11:22
поделиться
Другие вопросы по тегам:

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