dataTable和managedBean

时间:2016-06-20 18:58:19

标签: java mysql hibernate jsf

我是JSF的新手。我正在做一个基本的编辑/删除dataTable,可以选择将用户的属性“active”(ativo)设置为true / false。我的整个数据表工作正常,显示用户数据,我可以编辑/删除用户,但“setActive”不能按预期工作。代码是基于我正在阅读的一本书,我再次阅读了很多代码,试图调试,制作了一些“println”来调试var stats,但似乎没什么用。 如果我尝试以另一种形式“编辑”“活动”状态,它会正确保存在mysql上。我希望我能得到一些帮助。

屏幕截图和代码存在问题,任何帮助都会被贬低。

屏幕:

Screen

在屏幕上。微笑链接表示用户活动/非活动,当我单击“微笑”链接时,其处于反转状态,活动变为非活动状态等等。 但它只是不起作用。所有的笑容总是相同的,即使在数据库中值不等于。当我第一次点击时。看起来没有任何反应。但它在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>

0 个答案:

没有答案