簡體   English   中英

如何在ActionListener中注入托管屬性

[英]How can I inject a managed property in an ActionListener

我想在ActionListener方法中從其他bean處理數據,但會拋出NullPointerException ,因此我嘗試使用@PostConstruct批注在init()方法中將bean的安全實例轉移到下一個實例,但仍會拋出NullPointerException 我知道可以通過FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(context, expression, expectedType);獲得bean FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(context, expression, expectedType); 但是可以通過@ManagedProperty嗎? 這是代碼:

Login.java

package sklad;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;

public class Login implements ActionListener{
        private Osoba os;

        @ManagedProperty(value="#{osoba}")
        private Osoba osoba;

        @PostConstruct
        public void init(){
            os = osoba;
        }

        @Override
        public void processAction(ActionEvent a) throws AbortProcessingException {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage("zprava", new FacesMessage(os.getId().toString() + " " + os.getHeslo()));

        }

        public Osoba getOsoba() {
            return osoba;
        }

        public void setOsoba(Osoba osoba) {
            this.osoba = osoba;
        }

        public Osoba getOs() {
            return os;
        }

        public void setOs(Osoba os) {
            this.os = os;
        }
    }

Osoba.java

package sklad;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

    @ManagedBean
    @SessionScoped
    public class Osoba{
        private Integer id;
        private String heslo;

        public Osoba(){}

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getHeslo() {
            return heslo;
        }

        public void setHeslo(String heslo) {
            this.heslo = heslo;
        }
    }

login.xhtml

 <!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<h:head>
    <title>title</title>
    <link rel="stylesheet" type="text/css" href="../styles/login.css" />
</h:head>
<h:body>
    <p:growl id="growl" showDetail="true" life="3000" />
    <p:panel id="panel_login" header="Přihlášení" styleClass="panel">
        <p:panelGrid styleClass="panelGrid">
            <h:form>
                <p:row>
                    <p:column>
                        <h:outputText value="ID: " />
                    </p:column>
                    <p:column>
                        <h:inputText id="id_login" value="${osoba.id}" />
                    </p:column>
                </p:row>

                <p:row>
                    <p:column>
                        <h:outputText value="Heslo: " />
                    </p:column>
                    <p:column>
                        <h:inputSecret id="heslo_login" value="${osoba.heslo}" />
                    </p:column>
                </p:row>

                <p:row>
                    <p:column colspan="2">
                        <h:commandButton id="btn_login" value="Přihlásit">
                            <f:actionListener type="sklad.Login"/>
                        </h:commandButton>
                    </p:column>
                </p:row>
            </h:form>
        </p:panelGrid>
    </p:panel>
</h:body>
</html>

調用動作偵聽器的更傳統的方法是使用方法綁定,如下所示:

@ManagedBean
@RequestScoped
public class Login {
  ...

  public void doLogin(ActionEvent event){
    // handle action
  }
}

然后在按鈕中:

<h:commandButton id="btn_login" value="Přihlásit" actionListener="#{login.doLogin}"/>

這種方法的好處是可以將Login轉換為ManagedBean,從而使它可以被JSF處理,以便對它的注釋進行處理-並使@ManagedProperty注釋按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM