我是JSF的新手。我正在做一个基本的编辑/删除dataTable,可以选择将用户的属性“active”(ativo)设置为true / false。我的整个数据表工作正常,显示用户数据,我可以编辑/删除用户,但“setActive”不能按预期工作。代码是基于我正在阅读的一本书,我再次阅读了很多代码,试图调试,制作了一些“println”来调试var stats,但似乎没什么用。 如果我尝试以另一种形式“编辑”“活动”状态,它会正确保存在mysql上。我希望我能得到一些帮助。
屏幕截图和代码存在问题,任何帮助都会被贬低。
屏幕:
在屏幕上。微笑链接表示用户活动/非活动,当我单击“微笑”链接时,其处于反转状态,活动变为非活动状态等等。 但它只是不起作用。所有的笑容总是相同的,即使在数据库中值不等于。当我第一次点击时。看起来没有任何反应。但它在managedBean中调用“ativar”并更改“usuario.ativo”状态。但不要在屏幕上更改任何内容或保存在数据库中。
当我点击2或3次时。微笑(以及用于调试的真/假文本)发生了变化,但每个记录都会发生变化。并且仍然没有保存。
因此,按钮/微笑链接不起作用,它也不会在浏览器中显示数据库中属性的真实状态。
我使用SQL5和hibernate。我现在发布了代码。
Usuario.java - 实体类
package entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="usuarios")
public class Usuario implements Serializable {
private static final long serialVersionUID = 7573666040150534335L;
@Id
@GeneratedValue
private Integer codigo;
private String nome;
@org.hibernate.annotations.NaturalId //define uma chave natural.Que nao eh primary key
private String email;
@org.hibernate.annotations.NaturalId //define uma chave natural.Que nao eh primary key
private String login;
private String senha;
private Date nascimento;
private String celular;
private String idioma;
@Column
private boolean ativo;
public Usuario() {
super();
}
public Integer getCodigo() {
return codigo;
}
public void setCodigo(Integer codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public Date getNascimento() {
return nascimento;
}
public void setNascimento(Date nascimento) {
this.nascimento = nascimento;
}
public String getCelular() {
return celular;
}
public void setCelular(String celular) {
this.celular = celular;
}
public String getIdioma() {
return idioma;
}
public void setIdioma(String idioma) {
this.idioma = idioma;
}
public boolean isAtivo() {
return ativo;
}
public void setAtivo(boolean ativo) {
this.ativo = ativo;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (ativo ? 1231 : 1237);
result = prime * result + ((celular == null) ? 0 : celular.hashCode());
result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((idioma == null) ? 0 : idioma.hashCode());
result = prime * result + ((login == null) ? 0 : login.hashCode());
result = prime * result + ((nascimento == null) ? 0 : nascimento.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
result = prime * result + ((senha == null) ? 0 : senha.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Usuario other = (Usuario) obj;
if (ativo != other.ativo)
return false;
if (celular == null) {
if (other.celular != null)
return false;
} else if (!celular.equals(other.celular))
return false;
if (codigo == null) {
if (other.codigo != null)
return false;
} else if (!codigo.equals(other.codigo))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (idioma == null) {
if (other.idioma != null)
return false;
} else if (!idioma.equals(other.idioma))
return false;
if (login == null) {
if (other.login != null)
return false;
} else if (!login.equals(other.login))
return false;
if (nascimento == null) {
if (other.nascimento != null)
return false;
} else if (!nascimento.equals(other.nascimento))
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
if (senha == null) {
if (other.senha != null)
return false;
} else if (!senha.equals(other.senha))
return false;
return true;
}
@Override
public String toString() {
return "Usuario [codigo=" + codigo + ", nome=" + nome + ", email=" + email + ", login=" + login + ", senha="
+ senha + ", nascimento=" + nascimento + ", celular=" + celular + ", idioma=" + idioma + ", ativo="
+ ativo + "]";
}
}
呈现表格的XHTML:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Administração de usuarios</title>
</h:head>
<h:body>
<h1>Cadastro de usuarios</h1>
<br/>
<h:form>
<h:messages/>
<!-- usurio eh variavel/propriedae com dados da linha (usuario) -->
<h:dataTable value="#{usuarioBean.lista}" var="usuario" rules="rows" cellpadding="5">
<f:facet name="caption">
A listagem a seguir exibe relacao de todos os usuarios do sistema. É possivel ativar/desativar, excluir e editar os mesmos.
</f:facet>
<f:facet name="header">Listagem de usuarios</f:facet>
<f:facet name="footer">Fim da listagem</f:facet>
<h:column>
<h:outputText value="#{usuarioBean.usuario.ativo} "/>
<h:commandLink action="#{usuarioBean.ativar}">
<h:graphicImage library="images" name="usuario_ativo_#{usuarioBean.usuario.ativo}.png" style="border:0"/>
<f:setPropertyActionListener value="#{usuario}" target="#{usuarioBean.usuario}"/>
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">Codigo</f:facet>
<h:outputText value="#{usuario.codigo}"/>
</h:column>
<h:column>
<h:graphicImage library="images" name="bandeira_#{usuario.idioma}.png"/>
</h:column>
<h:column>
<f:facet name="header">Nome</f:facet>
#{usuario.nome}
</h:column>
<h:column>
<f:facet name="header">e-Mail</f:facet>
<a href="mailto:#{usuario.email}">#{usuario.email}</a>
</h:column>
<h:column>
<h:commandLink action="#{usuarioBean.editar}" >
<h:graphicImage library="images" name="editar16.png" style="border:0"/>
<!-- Passa valor da linha para o bean, setando propriedade usuario -->
<f:setPropertyActionListener value="#{usuario}" target="#{usuarioBean.usuario}"/>
<!-- Passa um valor fixo de navegacao para usuarioBean.destinoSalvar a fim de ser a saida de editar -->
<f:setPropertyActionListener value="/admin/principal" target="#{usuarioBean.destinoSalvar}"/>
</h:commandLink>
</h:column>
<h:column>
<h:commandLink action="#{usuarioBean.excluir}"
onclick="if (!confirm('Deseja excluir #{usuario.nome}?' )) return false;">
<h:graphicImage library="images" name="excluir16.png" style="border:0"/>
<f:setPropertyActionListener value="#{usuario}" target="#{usuarioBean.usuario}"/>
</h:commandLink>
</h:column>
<h:column>
<h:commandLink action="#{usuarioBean.mostrar}">
Show
<f:setPropertyActionListener value="#{usuario}" target="#{usuarioBean.usuario}"/>
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
<br/>
<a href="../index.jsf">Inicio</a>
</h:body>
</html>
managedBean
package control;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import business.UsuarioRN;
import entity.Usuario;
@ManagedBean(name="usuarioBean") //nome padrao
@RequestScoped
public class UsuarioBean {
private Usuario usuario;
private String confirmarSenha;
private List<Usuario> lista;
private String destinoSalvar;
public UsuarioBean() {
super();
this.usuario=new Usuario();
}
/**
* retorna o usuario
* @return
*/
public Usuario getUsuario() {
return usuario;
}
/**
* define usuario
* @param usuario
*/
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
/**
* retorna confirma senha
* @return
*/
public String getConfirmarSenha() {
return confirmarSenha;
}
/**
* seta confirmarsenha
* @param confirmarSenha
*/
public void setConfirmarSenha(String confirmarSenha) {
this.confirmarSenha = confirmarSenha;
}
/**
*
* @return
*/
public String getDestinoSalvar() {
return destinoSalvar;
}
/**
*
* @param destinoSalvar
*/
public void setDestinoSalvar(String destinoSalvar) {
this.destinoSalvar = destinoSalvar;
}
/**
* Retorna lista de usuarios cadastrados
* @return
*/
public List<Usuario> getLista() {
//Se a lista for null. Usado como flag e para verificar alteracoes.
if (this.lista==null){
//carrega nova lista do BD
this.lista=new UsuarioRN().listar();
}
return this.lista;
}
/**
* Metodo desnecessario
* Retorna lista de usuarios
* @param lista
*/
public void setLista(List<Usuario> lista) {
this.lista = lista;
}
/**
* Define novo usuario com "ativo" true e pagina de sucesso ao fim do cadastro de novo.
* @return
*/
public String novo(){
//Define pagina a ser carregada apos execucao. Se for novo user, ir para usuariosucesso
this.destinoSalvar="usuariosucesso";
this.usuario=new Usuario();
this.usuario.setAtivo(true);
return "/publico/usuario"; //.jsf?
}
/**
* Salva dados do formulario. Seja novo usuario ou edição. A diferenca eh dada pela chamada do metodo "novo"
* em caso de novos usuarios
* @return
*/
public String salvar(){
//Context da mensagem
FacesContext context=FacesContext.getCurrentInstance();
//pega a senha
String senha=this.usuario.getSenha();
//compara senha e confirmacao
if (!senha.equals(this.confirmarSenha)){
//Erro caso senha seja confirmada incorretamente
FacesMessage message=new FacesMessage("A senha não foi confirmada corretamente.");
context.addMessage(null, message);
return null; //mantem na mesma pagina
}
//Caso nao tenha havido erros, grava o usuario e direciona para destinosalvar, que pode ser lista ou pagina de sucesso.
new UsuarioRN().salvar(this.usuario);
//carrega pagina de acordo com resultado.
return this.destinoSalvar;
}
/**
* Edita dados do usuario.
* @return
*/
public String editar(){
//Apenas pega a senha e copia em confirmar senha e carrega pagina de inclusao/edicao.
this.confirmarSenha=this.usuario.getSenha();
return "/publico/usuario";
}
/**
* Exclui usuario cadastrado
* @return
*/
public String excluir(){
//Exclui usuario
new UsuarioRN().excluir(usuario);;
//Ao definir a lista como null. Forca o "getLista()" a recarregar os dados do BD.
this.lista=null;
return null;
}
/**
* Ativa usuario
* @return
*/
public String ativar(){
//inverte estado de ativo
System.out.println(lista);
if (this.usuario.isAtivo())
this.usuario.setAtivo(false);
else
this.usuario.setAtivo(true);
//Salva os dados
new UsuarioRN().salvar(this.usuario);
System.out.println(lista);
return null;
}
public String mostrar(){
System.out.println("**********************************************************");
System.out.println(usuario);
System.out.println(lista);
return null;
}
}
保存,删除,编辑,获取记录列表的业务类..
package business;
import java.util.List;
import entity.Usuario;
import persistense.UsuarioDaoHibernate;
import util.DaoFactory;
/**
* Classe de regra de negocios para Usuario
* @author X8
*
*/
public class UsuarioRN {
private UsuarioDaoHibernate usuarioDao;
/** http://i.imgur.com/gVqtsR8.png
* Cria UsuarioDaoHibernate no construtor
*/
public UsuarioRN() {
super();
//Retorna UsuarioDao. Cast para UsuarioDaoHibernate.
this.usuarioDao=(UsuarioDaoHibernate) DaoFactory.criarUsuarioDao();
}
/**
* Retorna um unico usuario pelo seu codigo unico.
* @param codigo
* @return
*/
public Usuario carregar(Integer codigo){
return this.usuarioDao.carregar(codigo);
}
/**
* Retorna um unico usuario atravez de seu login unico.
* @param login
* @return
*/
public Usuario buscaPorLogin(String login){
return this.usuarioDao.buscarPorLogin(login);
}
/**
* Salva dados de usuario novo ou ja existente.
* @param usuario
*/
public void salvar(Usuario usuario){
Integer codigo=usuario.getCodigo();
//codigo nulo ou zero, usuario nunca foi salvo. Eh novo
if (codigo==null || codigo==0){
this.usuarioDao.salvar(usuario);
} else {
this.usuarioDao.atualizar(usuario);
}
}
/**
* Exclui usuario cadastrado.
* @param usuario
*/
public void excluir(Usuario usuario){
this.usuarioDao.excluir(usuario);
}
/**
* Lista todos os usuarios cadastrados
* @return
*/
public List<Usuario> listar(){
return this.usuarioDao.listar();
}
}
启动/结束/提交Hibernate连接/事务的过滤器:
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import util.HibernateUtil;
@WebFilter(urlPatterns={"*.jsf"})
public class ConexaoHibernateFilter implements Filter{
private SessionFactory sf;
@Override
public void init(FilterConfig config) throws ServletException {
//Criar sessao do Hibernate
this.sf=HibernateUtil.getSessionFactory();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//Pegar sessao corrente
Session currentSession=this.sf.getCurrentSession();
Transaction transaction = null;
try {
transaction = currentSession.beginTransaction();
//passa processamento do aplicativo para ser realisado (save(),delete(), etc)
chain.doFilter(request,response);
//Processamento foi concluido, entao salva com commit
transaction.commit();
if (currentSession.isOpen()) {
currentSession.close();
}
} catch (Throwable ex) {
try {
//Substitui transaction.isActive();
//if (transaction.getStatus()!= TransactionStatus.ACTIVE) {
if (!transaction.isActive()) {
transaction.rollback();
}
} catch (Throwable t) {
t.printStackTrace();
}
throw new ServletException(ex);
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
Dao Class:
package persistense;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import entity.Usuario;
public class UsuarioDaoHibernate implements UsuarioDao {
private Session session;
public UsuarioDaoHibernate() {
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
@Override
public void salvar(Usuario usuario) {
this.session.save(usuario);
}
@Override
public void atualizar(Usuario usuario) {
this.session.update(usuario);
}
@Override
public void excluir(Usuario usuario) {
this.session.delete(usuario);
}
@Override
public Usuario carregar(Integer codigo) {
Usuario u=(Usuario) this.session.get(Usuario.class, codigo);
return u;
}
@Override
public List<Usuario> listar() {
@SuppressWarnings("unchecked")
List<Usuario> usuarios=this.session.createCriteria(Usuario.class).list();
return usuarios;
}
@Override
public Usuario buscarPorLogin(String login) {
/*Criteria criteria=this.session.createCriteria(Usuario.class);
criteria.add(Restrictions.eq("login", login));
//considerando login unico.
return (Usuario)criteria.uniqueResult();*/
//Fazendo com HQL
String hql="select u from Usuario u where u.login = :login";
Query consulta=this.session.createQuery(hql);
consulta.setString("login",login);
return (Usuario) consulta.uniqueResult();
}
}
的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nacionalsal</groupId>
<artifactId>Financeirolivro</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>Projeto Financeiro</name>
<description>Projeto Financeiro</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<debug>true</debug>
<debuglevel>lines,vars,source</debuglevel>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jvnet-nexus-releases</id>
<name>jvnet-nexus-releases</name>
<url>https://maven.java.net/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- Verificar em caso de erro -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- Hibernate core
http://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
</dependencies>
</project>
Hibernate Util:
package util;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
StandardServiceRegistryBuilder registradorServico = new StandardServiceRegistryBuilder();
registradorServico.applySettings(cfg.getProperties());
StandardServiceRegistry servico = registradorServico.build();
return cfg.buildSessionFactory(servico);
} catch (Throwable e) {
System.out.println("Criação inicial do objeto SessionFactory falhou. Erro: " + e);
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Hibernate CFG
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Configuração da conexão com o banco MySQL e dialeto -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/financeiro1</property>
<property name="connection.username">root</property>
<property name="connection.password">lalalala</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Configurações de debug -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="generate_statistics">true</property>
<property name="use_sql_comments">true</property>
<!-- Mapeando classes -->
<mapping class="entity.Usuario"/>
</session-factory>
</hibernate-configuration>