我无法显示存储在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
}
答案 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;
}
}