JSF如何显示从会话中检索的字符串值?

时间:2016-12-21 15:57:26

标签: session jsf

我无法显示存储在sessionMap中的对象的String属性的值:<h:outputText value="#{sessionScope.myObject.stringField}" /> 当我将一个String变量的值赋给会话映射中的键时,它也不起作用 它仅在我将字符串文字值分配给键时才有效。

示例:

test.xhtml

输出s1到s3显示类名+哈希码 输出s4到s9什么都不显示 输出s10显示单词“test”。

<?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

}

2 个答案:

答案 0 :(得分:1)

您可以使用这样的bean方法:

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

在xhtml中:

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

答案 1 :(得分:0)

我发现了自己的错。一个非常基本的逻辑错误。你们所有人都是对的:&#34; nome&#34;属性是空的。
我应该在这里告知xhtml登录页面的源代码,我在其中捕获了我的&#34; LoginBean.Usuario&#34;的数据。在此页面上,有一个用于输入值的表单&#34; Usuario.login&#34;和&#34; Usuario.senha&#34;。所以我使用这些值作为搜索标准&#34; Usuario&#34;在数据库中,但该方法只返回一个布尔值,而不是实体&#34; Usuario&#34;在数据库中找到。
因此,解决方案是更改数据库中的搜索方法(在UsuarioDao类中),以便它返回一个&#34; Usuario&#34; object(或null),并将其分配给&#34; LoginBean.usuario&#34;字段。

LoginBean 现在看起来像这样:

@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;
    }

}