2016-12-21 9 views
-1

Ich kann den Wert eines String-Attributs eines in sessionMap gespeicherten Objekts nicht anzeigen: <h:outputText value="#{sessionScope.myObject.stringField}" />.
Es funktioniert auch nicht, wenn ich einen Wert einer String-Variablen einem Schlüssel in der Sitzungszuordnung zuweisen.
Es funktioniert nur, wenn ich einem Schlüssel einen String-Literalwert zuweisen.JSF Wie wird der aus der Sitzung abgerufene Stringwert angezeigt?


Beispiel:

test.xhtml

Ausgänge S1 bis S3 zeigen Klassenname + Hash-Code.
Die Ausgänge s4 bis s9 zeigen nichts an.
Der Ausgang s10 zeigt das Wort "test" an.

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:f="http://xmlns.jcp.org/jsf/core"> 

<h:head> 

</h:head> 
<h:body> 
    <h:outputText rendered="#{not empty usuarioLogado}" 
     value=" 
     s1 #{usuarioLogado} 
     s2 #{sessionScope.usuarioLogado} 
     s3 #{sessionScope['usuarioLogado']} 
     s4 #{usuarioLogado.nome} 
     s5 #{sessionScope.usuarioLogado.nome} 
     s6 #{sessionScope['usuarioLogado'].nome} 
     s7 #{nomeUsuarioLogado} 
     s8 #{sessionScope.nomeUsuarioLogado}    
     s9 #{sessionScope['nomeusuarioLogado'].nome} 
     s10 #{sessionScope.string_literal} "> 
    </h:outputText> 

</h:body> 
</html> 

LoginBean.java

@ManagedBean 
@SessionScoped 
public class LoginBean { 

    private Usuario usuario; 

    @PostConstruct 
    public void init(){ 
     this.usuario = new Usuario(); 
    } 

    public LoginBean() { 

    } 

    //getters and setters 

    public String efetuarLogin(){ 

     EntityManager em = JPAUtil.getEntityManager(); 
     boolean existeUsuario = new UsuarioDao(em).consultarUsuario(usuario); 
     em.close(); 

     FacesContext context = FacesContext.getCurrentInstance(); 

     if (existeUsuario) { 
      context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario); 
      context.getExternalContext().getSessionMap().put("nomeUsuarioLogado", this.usuario.getNome()); 
      context.getExternalContext().getSessionMap().put("string_literal", "test"); 

      return "index.xhtml?faces-redirect=true"; 
     } 

     return null; 
    } 

} 

Usuario.java

public class Usuario { 

    private int id; 
    private String nome; 
    private String login; 
    private String senha; 
    private String email; 

    public Usuario() { 
     // TODO Auto-generated constructor stub 
    } 

    //getters and setters 

} 
+0

Ihr Englisch ist sehr gut – zero01alpha

+0

ich vielleicht etwas offensichtlich vermissen, aber ich würde sagen, zunächst: S1 bis S3: logisch ist, Sie haben ein nicht umzusetzen ' toString() 'in Ihrem Objekt. s4 bis s9: dann ist 'nome' höchstwahrscheinlich in Ihrem Objekt leer. – Kukeltje

+0

@Kukeltje Ich habe es nicht erwähnt, aber "Nome" ist ein Pflichtfeld. Es gibt einen früheren Validierungsschritt, so dass "Nome" niemals leer ist. tks –

Antwort

0

entdeckte ich meine Schuld. Ein sehr elementarer Logikfehler. Ihr alle habt recht gehabt: Das "Nome" -Attribut war leer.
Ich hätte hier den Quellcode der xhtml-Login-Seite mitteilen sollen, wo ich die Daten für meine "LoginBean.Usuario" erfasst habe. Auf dieser Seite gibt es ein Formular zur Eingabe der Werte "Usuario.login" und "Usuario.senha". Also habe ich diese Werte als Kriterium für die Suche nach "Usuario" in der Datenbank verwendet, aber die Methode hat nur einen booleschen Wert zurückgegeben, nicht die Entität "Usuario", die in der Datenbank gefunden wurde.
Daher bestand die Lösung darin, die Suchmethode in der Datenbank (in der UsuarioDao-Klasse) zu ändern, sodass ein "Usuario" -Objekt (oder null) zurückgegeben und dem Feld "LoginBean.usuario" zugewiesen wurde.

LoginBean sieht nun wie folgt aus:

@ManagedBean 
@SessionScoped 
public class LoginBean { 

    private Usuario usuario; 

    @PostConstruct 
    public void init(){ 
     this.usuario = new Usuario(); 
    } 

    public LoginBean() { 

    } 

    //getters and setters 

    public String efetuarLogin(){ 

     EntityManager em = JPAUtil.getEntityManager(); 
     // now a Usuario is returned, in which the "nome" attribute is filled. 
     this.usuario = new UsuarioDao(em).consultarUsuario(this.usuario); 
     em.close(); 

     FacesContext context = FacesContext.getCurrentInstance(); 

     if (existeUsuario) { 
      context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario); 

      return "index.xhtml?faces-redirect=true"; 
     } 

     return null; 
    } 

} 
+0

Seltsam ... Sie sagten: _ "@ Kukeltje Ich habe es nicht erwähnt, aber" Nome "ist ein Pflichtfeld. Es gibt eine frühere Validierung Schritt, so dass" Nome "ist nie leer. Tks -" _ So war das nicht wahr. Sonst wäre es bevölkert worden! – Kukeltje

+0

@Kukeltje Sie haben Recht. Das tut mir leid. In der Tat ist Nome ein Pflichtfeld, wenn ein neues Usuario registriert ist. Es gibt eine Validierung im Usuario-Registrierungsformular, die "nome" erfordert. Also, in der Datenbank gibt es kein Usuario ohne Nome. Auf der Anmeldeseite werden jedoch nur die Felder "Login" und "Senha" eingegeben. Also mein "LoginBean.usuario" hatte "Nome" leer. –

0

Sie können eine Bean-Methode wie folgt verwenden:

public Usuario giveMeTheValue(String key){ 
return (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key); 
} 

Und in xhtml:

s6 #{bean.giveMeTheValue('usuarioLogado').nome} 
+0

Danke für die Antwort. Ich werde die Lösung versuchen, die Sie später vorgeschlagen haben, und dann komme ich zurück hier um das Ergebnis zu melden. –

+0

Sicher, Sie sind willkommen. – sunofkyuss

Verwandte Themen