为什么@ViewScoped Managed Bean的@PostConstruct init()方法从未调用过?

时间:2016-04-29 12:45:54

标签: jsf-2.2 java-ee-7

我是JSF / Java ee7的新手,并尝试测试一些功能以了解其工作原理。 我使用模板进行测试。以下是相关的JSF模板客户端:

<ui:define name="content">
    <h:panelGroup class="keret" id="tartalom">
        <h:form id="email" rendered="#{emailManagedBean.urlap}">
            <h:messages/>
            <h:outputLabel for="emailbox" value="Add meg az email címed, és juss hozzá bestsellerünkhöz 5Ft-ért"/>
            <h:inputText value="#{emailManagedBean.newEmail.email}"/>
            <h:commandButton actionListener="#{emailManagedBean.saveEmail()}" value="Mentés">
                <f:ajax immediate="true" execute="@form" render=":tartalom"/>
            </h:commandButton>
        </h:form>
        <h:panelGroup id="szoveg" rendered="#{not emailManagedBean.urlap}">
            <h3>Köszönjük!</h3>
            <p>
                Hamarosan emailt fogsz kapni tőlünk. Kérlek, ellenőrizd a levélszemét, illetve spam mappákban is a tőlünk kapott levelet. A levlében lévő linkre kattintva hozzájuthatsz az ajándékodhoz.
            </p>
        </h:panelGroup>
    </h:panelGroup>
</ui:define>

我的托管bean:

@Named(value = "emailManagedBean")
@ViewScoped
public class emailManagedBean implements Serializable {

    @EJB
    EmailsFacadeLocal emailFacade;

    private Emailcamp newEmail;

    private boolean urlap;

    public Emailcamp getNewEmail() {
        return newEmail;
    }

    public void setNewEmail(Emailcamp newEmail) {
        this.newEmail = newEmail;
    }

    @PostConstruct
    public void init() {
        newEmail = new Emailcamp();
        urlap=true;
    }

    public boolean isUrlap() {
        return urlap;
    }

    public void setUrlap(boolean urlap) {
        this.urlap = urlap;
    }


    public void validateEmail(FacesContext context, UIComponent comp,
        Object value) {

        String input = (String) value;
        EmailValidator validator = EmailValidator.getInstance();
        if (!validator.isValid(input)) {
            ((UIInput) comp).setValid(false);
            FacesMessage message = new FacesMessage(
                "Helytelen email cím formátum");
            context.addMessage(null, message);
        } else {
            if(!emailFacade.exist(newEmail.getEmail())){
                ((UIInput) comp).setValid(true);
            }
            else {
                context.addMessage(null, new FacesMessage("Már megadtad korábban az email címed"));
            }
        }
    }

    public void saveEmail() {
        /*Get current date and time*/
        Calendar c = Calendar.getInstance();
        newEmail.setRecemaildate(c.getTime());

        /*Get Referral*/
        HttpServletRequest hr = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        newEmail.setReferer((hr.getHeader("referer")==null) ? "not available" : hr.getHeader("referer") );
        newEmail.setStatus(Status.NOT_SENT.toString());
        emailFacade.create(newEmail);
        urlap=false;
    }
}

预期的行为是init函数将urlap boolean变量设置为true,因此h:form应该显示为视图端有条件渲染。 稍后客户点击保存(“Mentés”),新的电子邮件地址和一些数据将存储在数据库中。在ajax调用之后,我将urlap boolean varaible设置为false,不再渲染表单,而是渲染一条感谢信息。 不幸的是,从不调用init函数,所以boolean变量永远不会设置为true。结果显示我的感谢信息没有收集电子邮件。 第二个奇怪的事情是ajax组件的结果(我猜)我收到了一条错误信息:outputScript没有库,没有名称,也没有正文内容。我没有在我的xhtml中声明任何outputScript。

0 个答案:

没有答案