命令按钮不会调用操作方法,只会刷新页面

时间:2013-05-24 14:35:16

标签: jsf primefaces facelets

我的index.xhtml页面包含这个以及更多其他小东西,如页脚,标题,菜单等......:

index.html包含:

<h:head/>
<h:body>
 <p:layout fullPage="true">
  <p:layoutUnit position="center" >
  <h:panelGroup id="content" layout="block">

    <h:form id="contentform">
<!-- Cas page contact == page affichée lors du clic sur contact -->
     <h:form id="contact">
      <h:panelGroup rendered="#{navBean.page == 'contact'}">
       <ui:include src="contact.xhtml" />
      </h:panelGroup>
     </h:form>
    </h:form>
<!--Fin de gestion des cas possible -->
 </h:panelGroup>
</p:layoutUnit>
<!-- Fin layout central --> 
 </p:layout>
</h:body>

我正在使用JSF 2.1和PrimeFaces。我在contact.xhtml上有以下命令按钮:

<h:head/>
 <h:body> 
  <p:commandButton value="Envoie la sauce" action="#{mail.sendEmail()}"  >
   <f:ajax execute="@form" render="@form" />
  </p:commandButton>
</h:body>

它引用以下bean操作:

@ManagedBean(name="mail")
@SessionScoped
public class MailBean {
public void sendEmail() throws IOException {
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");

    Session session = Session.getDefaultInstance(props,
        new javax.mail.Authenticator() {
                            @Override
    protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication("username","password");
            }
        });

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("toto@yopmail.com"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("toto@gmail.com"));
        message.setSubject("Demande de Contact");
        message.setText("Dear Mail Crawler," +
                "\n\n No spam to my email, please!");

        Transport.send(message);

                    //to see if message was send
        System.out.println("Done");

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
}
}

这应该通过JavaMail发送邮件,但是除了刷新页面之外,该按钮不会执行任何操作。

我已将SendHTMLEmail类作为独立的Java应用程序进行了测试,它运行良好。

我想要做的是使用JSF2.1在xhtml中创建的简单联系表单。

更新 - 好的今天有些新闻! 如果我使用这个东西:页面上的<p:commandButton action="#{mail.send()}"/> index.xhtml发生了什么事我必须确定为什么这个类无法找到......:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class javax.faces.el.EvaluationException</error-name><error-message><![CDATA[/index.xhtml @35,47 action="#{mail.send()}": Target Unreachable, identifier 'mail' resolved to null]]></error-message></error></partial-response>

但是在contact.xhtml上,我只使用相同的按钮:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="log:messages"><![CDATA[<div id="log:messages" class="ui-messages ui-widget" aria-live="polite"></div>]]></update><update id="javax.faces.ViewState"><![CDATA[-2283025416922274948:-229809047557820449]]></update></changes></partial-response>

所以我的所有人都有一个独特的身份!有人知道发生了什么? edit1:添加完整代码 edit2:添加了所有应答器的index.html edit3:在我的xhtml页面中发现了关于操作按钮的内容

1 个答案:

答案 0 :(得分:1)

因此,经过几天坚持这个问题,我终于找到了解决方案

   <h:form id="contact">
    <h:panelGroup rendered="#{navBean.page == 'contact'}">
     <ui:include src="contact.xhtml" />
    </h:panelGroup>
   </h:form>

在我的index.xhtml中,<h:form>位于<h:panelgroup>内,更确切地说是我的contact.xhtml!如果我将这些形式的balise放在<h:panelGroup>之外并且不在contact.xhtml中放置任何形式的balise,一切正常,点击我的按钮就可以调用正确的动作!

我会在第一篇文章中发布最终代码! 如果您需要,请随意使用! 谢谢大家对我的帮助!