Pessoal, boa tarde!
Eu fiz um sisteminha (para fins de estudo) em JSF 2.
Terminei ele e esta funcionando da maneira como idealizei…mas eu quero uma ajudinha em um outro ponto, boas práticas…
Seguinte…
Trata-se de um CRUD de versão criadas para sistemas que tem as seguintes páginas:
-listagem de versão
-cadastro de versão
-listagem de sistema
-cadastro de sistema
Funcionamento:
CRUD Sistemas - OK
CRUD Versão - OK
Na pagina de listagem de sistemas eu tenho um botão que quando acionado ele vai para a página de versões cadastradas para um o sistema especifico.
Segue código:
[code]@SessionScoped
@ManagedBean(name=“sistemaMB”)
public class SistemaMB extends BaseMB implements Serializable {
private static final long serialVersionUID = 1L;
private Sistema sistema;
private DataModel<Sistema> sistemas;
@EJB
private SistemaBean sistemaBean;
/*
* Outcomes utilizados para navegação.
* Os valores são utilizados no faces-config na configuração da regra de navegação.
*/
private final String OUTCOME_LISTAGEM_VERSOES_SISTEMA = "listarVersoesSistema";
private final String OUTCOME_LISTAGEM_SISTEMA = "listarSistemas";
private final String OUTCOME_ADICIONAR_SISTEMA = "adicionarNovoSistema";
private final String OUTCOME_EDITAR_SISTEMA = "editarSistema";
public SistemaMB() {
}
/*Métodos gets e sets*/
public Sistema getSistema() {
return this.sistema;
}
public void setSistema(Sistema sistema) {
this.sistema = sistema;
}
public SistemaBean getSistemaBean() {
return sistemaBean;
}
public void setSistemaBean(SistemaBean sistemaBean) {
this.sistemaBean = sistemaBean;
}
public void setSistemas(DataModel<Sistema> sistemas) {
this.sistemas = sistemas;
}
public DataModel<Sistema> getSistemas() {
return sistemas;
}
/*
* Esse método é executado pelo constainer logo após a execução do construtor
* para inicializar os componentes da classe.
*/
@PostConstruct
public void inicializar() {
inicializarSistema();
carregarListaSistemas();
} // fim do método inicializar
/**
* Método utilizado para a funcionalidade de gravação de sistemas.
*/
public void gravarSistema() {
try {
this.sistemaBean.gravarSistema(this.sistema);
inicializarSistema();
displayInfoMessageToUser("Sistema cadastrado com sucesso!");
} catch (VersionamentoException e) {
displayErrorMessageToUser(e.getMessage());
} // fim do bloco try/catch
} // fim do método gravarSistema
/**
* Método utilizado para a funcionalidade de edição de sistemas.
*/
public void alterarSistema() {
try {
this.sistemaBean.alterarSistema(this.sistema);
displayInfoMessageToUser("Sistema alterado com sucesso!");
} catch (VersionamentoException e) {
displayErrorMessageToUser(e.getMessage());
} // fim do bloco try/catch
} // fim do método alterarSistema
/**
* Método utilizado para a funcionalidade de remoção de sistemas.
*/
public void deletarSistema() {
try {
this.sistemaBean.deletarSistema(this.sistema);
carregarListaSistemas();
displayInfoMessageToUser("Sistema deletado com sucesso!");
} catch (VersionamentoException e) {
displayErrorMessageToUser(e.getMessage());
} // fim do bloco try/catch
} // fim do método deletarSistema
/*
* Método utilizado para carregar a lista com os sistemas cadastrados no banco de dados.
*/
private void carregarListaSistemas() {
try {
this.sistemas = new ListDataModel<Sistema>(this.sistemaBean.listar());
} catch (VersionamentoException e) {
this.sistemas = new ListDataModel<Sistema>();
} // fim do bloco try/catch
} // fim do método carregarListaSistemas
/*
* Método utilizado para navegação entre a página de cadastro de sistema.
*/
public String adicionarSistema() {
inicializarSistema();
return OUTCOME_ADICIONAR_SISTEMA;
} // fim do método novoSistema
/*
* Método utilizado para navegação para a página de edição de sistema.
*/
public String editarSistema() {
carregarSistemaDataTable();
return OUTCOME_EDITAR_SISTEMA;
} // fim do método editarSistema
/*
* Método utilizado para navegação para a página de listagem de versões
* cadastradas para o sistema na base da aplicação..
*/
public String listarVersoesSistema() {
carregarSistemaDataTable();
return OUTCOME_LISTAGEM_VERSOES_SISTEMA;
} // fim do método listarVersoesSistema
/*
* Método utilizado para navegação para a página de listagem de sistemas
* cadastrado na base da aplicação.
*/
public String listarSistemas() {
carregarListaSistemas();
return OUTCOME_LISTAGEM_SISTEMA;
} // fim do método listarSistemas
/*
* Método utilizado para inicializar o atributo sistema da classe.
*/
private void inicializarSistema() {
this.sistema = new Sistema();
} // fim do método inicializarSistema
/*
* Método utilizado para carregar o item selecionado no DataTable da tela
* no atributo sistema da classe.
*/
private void carregarSistemaDataTable() {
this.sistema = sistemas.getRowData();
} // fim do método carregarSistemaDataTable
} // fim da classe SistemaMB[/code]
[code]@RequestScoped
@ManagedBean(name=“versaoMB”)
public class VersaoMB extends BaseMB implements Serializable {
private static final long serialVersionUID = 1L;
private Versao versao;
private DataModel<Versao> versoes;
@ManagedProperty(value = "#{sistemaMB}")
private SistemaMB sistemaMB;
@EJB
private VersaoBean versaoBean;
/*
* Outcomes utilizados para navegação.
* Os valores são utilizados no faces-config na configuração da regra de navegação.
*/
private final String OUTCOME_LISTAGEM_VERSOES = "listarVersoes";
private final String OUTCOME_ADICIONAR_VERSAO = "adicionarNovaVersao";
private final String OUTCOME_EDITAR_VERSAO = "editarVersao";
public void setVersao(Versao versao) {
this.versao = versao;
}
public VersaoMB() {
}
public Versao getVersao() {
return this.versao;
}
public void setVersoes(DataModel<Versao> versoes) {
this.versoes = versoes;
}
public DataModel<Versao> getVersoes() {
return versoes;
}
public void setSistemaMB(SistemaMB sistemaMB) {
this.sistemaMB = sistemaMB;
}
public SistemaMB getSistemaMB() {
return sistemaMB;
}
public void setVersaoBean(VersaoBean versaoBean) {
this.versaoBean = versaoBean;
}
public VersaoBean getVersaoBean() {
return versaoBean;
}
@PostConstruct
public void inicializar() {
inicializarVersao();
carregarListaVersoes();
} // fim do método inicializar
/**
* Método utilizado para a funcionalidade de gravação de versão.
*/
public void gravarVersao() {
this.versao.setSistema(this.sistemaMB.getSistema());
try {
this.versaoBean.gravarVersao(this.versao);
inicializarVersao();
displayInfoMessageToUser("Versão cadastrada com sucesso!");
} catch (VersionamentoException e) {
displayErrorMessageToUser(e.getMessage());
} // fim do bloco try/catch
} // fim do método gravarVersao
/**
* Método utilizado para a funcionalidade de edição de versões.
*/
public void alterarVersao() {
this.versao.setSistema(this.sistemaMB.getSistema());
try {
this.versaoBean.alterarVersao(this.versao);
displayInfoMessageToUser("Versão alterada com sucesso!");
} catch (VersionamentoException e) {
displayErrorMessageToUser(e.getMessage());
} // fim do bloco try/catch
} // fim do método alterarVersao
/**
* Método utilizado para a funcionalidade de remoção de versões.
*/
public void deletarVersao() {
try {
this.versaoBean.deletarVersao(this.versao);
inicializarVersao();
carregarListaVersoes();
displayInfoMessageToUser("Versão deletada com sucesso!");
} catch (VersionamentoException e) {
displayErrorMessageToUser(e.getMessage());
} // fim do bloco try/catch
} // fim do método deletarVersao
/*
* Método utilizado para inicializar a propriedade versao da classe.
*/
private void inicializarVersao() {
this.versao = new Versao();
} // fim do método inicializarVersao
/*
* Método utilizado para carregar as versõe cadastradas para o sistema
* guardado na sessão.
*/
private void carregarListaVersoes() {
try {
Integer id = this.sistemaMB.getSistema().getId();
this.versoes = new ListDataModel<Versao>(this.versaoBean.buscarPorIdSistema(id));
} catch (VersionamentoException e) {
this.versoes = new ListDataModel<Versao>();
} // fim do bloco try/catch
} // fim do método carregarListaVersoes
/*
* Método utilizado para navegação entre a página de cadastro de versão.
*/
public String adicionarVersao() {
inicializarVersao();
return OUTCOME_ADICIONAR_VERSAO;
} // fim do método adicionarVersao
/*
* Método utilizado para navegação entre a página de edição de versão.
*/
public String editarVersao() {
this.versao = this.versoes.getRowData();
return OUTCOME_EDITAR_VERSAO;
} // fim do método editarVersao
/*
* Método utilizado para navegação para a página de listagem de versões
* cadastradas na base da aplicação.
*/
public String listarVersoes() {
carregarListaVersoes();
return OUTCOME_LISTAGEM_VERSOES;
} // fim do método listarVersões
} // fim da classe VersaoMB[/code]
[code]<!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:ui=“http://java.sun.com/jsf/facelets”
xmlns:h=“http://java.sun.com/jsf/html”
xmlns:f=“http://java.sun.com/jsf/core”
xmlns:p=“http://primefaces.org/ui”>
<ui:composition template="/template/template.xhtml">
<ui:define name=“conteudo”>
<h:form id="formListaSistema">
<p:growl globalOnly="true" autoUpdate="true" life="3000" showSummary="true" showDetail="true" />
<p:panel id="panelSistemas">
<f:facet name="header">
<h:outputText value="#{msgs.label_view_systems_frame}" />
</f:facet>
<p:dataTable id="dataTableSistemas" value="#{sistemaMB.sistemas}" var="sistema" paginator="true" rows="10" emptyMessage="#{msgs.label_empty_list_message}"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15" sortBy="#{sistema.id}">
<p:column headerText="#{msgs.label_table_system_id}" sortBy="#{sistema.id}">
<h:outputText value="#{sistema.id}" />
</p:column>
<p:column headerText="#{msgs.label_table_system_name}" sortBy="#{sistema.nome}">
<h:outputText value="#{sistema.nome}" />
</p:column>
<p:column>
<p:commandButton action="#{sistemaMB.editarSistema()}" title="#{msgs.label_action_edit_record}" icon="ui-icon ui-icon-pencil" ajax="true" />
<p:commandButton title="#{msgs.label_action_delete_record}" icon="ui-icon ui-icon-trash" onclick="confirmacao.show();" ajax="true">
<f:setPropertyActionListener target="#{sistemaMB.sistema}" value="#{sistema}" />
</p:commandButton>
<p:commandButton action="#{sistemaMB.listarVersoesSistema()}" title="#{msgs.label_action_view_system_versions}" icon="ui-icon ui-icon-search" ajax="true" />
</p:column>
</p:dataTable>
<f:facet name="footer">
<p:commandButton action="#{sistemaMB.adicionarSistema()}" title="#{msgs.label_action_new_record}" icon="ui-icon ui-icon-circle-plus" ajax="false" />
</f:facet>
</p:panel>
<p:confirmDialog message="#{msgs.label_question_delete_registry}" header="#{msgs.label_index_frame}" severity="alert" widgetVar="confirmacao">
<p:commandButton id="botaoSim" value="#{msgs.label_action_yes}" actionListener="#{sistemaMB.deletarSistema()}" oncomplete="confirmacao.hide();" ajax="true" update="dataTableSistemas" />
<p:commandButton id="botaoNao" value="#{msgs.label_action_no}" oncomplete="confirmacao.hide();" ajax="true" />
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>
</html>[/code]
[code]<!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:ui=“http://java.sun.com/jsf/facelets”
xmlns:h=“http://java.sun.com/jsf/html”
xmlns:f=“http://java.sun.com/jsf/core”
xmlns:p=“http://primefaces.org/ui”>
<ui:composition template="/template/template.xhtml">
<ui:define name=“conteudo”>
<h:form id="formListaVersao">
<p:growl globalOnly="true" autoUpdate="true" life="3000" showSummary="true" showDetail="true" />
<p:panel id="panelVersoes">
<f:facet name="header">
<h:outputText value="#{msgs.label_view_versions_frame}" />
</f:facet>
<p:dataTable id="dataTableVersoes" var="versao" value="#{versaoMB.versoes}" paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15" emptyMessage="#{msgs.label_empty_list_message}" sortBy="#{versao.id}">
<p:column headerText="#{msgs.label_table_system_name}">
<h:outputText value="#{versaoMB.sistemaMB.sistema.nome}" />
</p:column>
<p:column headerText="#{msgs.label_table_version_name}" sortBy="#{versao.nomeVersao}">
<h:outputText value="#{versao.nomeVersao}" />
</p:column>
<p:column headerText="#{msgs.label_table_version_branch}" sortBy="#{versao.nomeBranch}">
<h:outputText value="#{versao.nomeBranch}" />
</p:column>
<p:column headerText="#{msgs.label_table_version_author}" sortBy="#{versao.autorVersao}">
<h:outputText value="#{versao.autorVersao}" />
</p:column>
<p:column headerText="#{msgs.label_table_version_head}">
<p:selectBooleanCheckbox value="#{versao.versaoHead}" disabled="true" />
</p:column>
<p:column headerText="#{msgs.label_table_version_production}">
<p:selectBooleanCheckbox value="#{versao.versaoProducao}" disabled="true" />
</p:column>
<p:column headerText="#{msgs.label_table_version_pdate}" sortBy="#{versao.dataPublicacao}">
<h:outputText value="#{versao.dataPublicacao}" />
</p:column>
<p:column>
<h:inputHidden value="#{versao.descricaoVersao}" />
<p:commandButton action="#{versaoMB.editarVersao()}" title="#{msgs.label_action_edit_record}" icon="ui-icon ui-icon-pencil" />
<p:commandButton title="#{msgs.label_action_delete_record}" icon="ui-icon ui-icon-trash" onclick="confirmacao.show();" ajax="true" update=":formListaVersao:idDelete" >
<f:setPropertyActionListener target="#{versaoMB.versao.id}" value="#{versao.id}" />
</p:commandButton>
<p:commandButton title="#{msgs.label_action_view_description_of_version}" icon="ui-icon ui-icon-search" onclick="dialogDescricao.show();" update=":formListaVersao:descricao" ajax="true">
<f:setPropertyActionListener target="#{versaoMB.versao}" value="#{versao}" />
</p:commandButton>
</p:column>
</p:dataTable>
<f:facet name="footer">
<p:commandButton title="#{msgs.label_action_new_record}" icon="ui-icon ui-icon-circle-plus" action="#{versaoMB.adicionarVersao()}" />
<p:commandButton title="#{msgs.label_action_return_systems}" icon="ui-icon ui-icon-circle-arrow-w" action="#{sistemaMB.listarSistemas()}" />
</f:facet>
</p:panel>
<p:dialog header="#{msgs.label_dialog_version_description}" modal="true" widgetVar="dialogDescricao" height="100" width="500" resizable="false" draggable="false">
<h:inputTextarea id="descricao" style="height:90%; width:99%;" value="#{versaoMB.versao.descricaoVersao}" disabled="true" />
</p:dialog>
<p:confirmDialog message="#{msgs.label_question_delete_registry}" header="#{msgs.label_index_frame}" severity="alert" widgetVar="confirmacao">
<h:inputHidden value="#{versaoMB.versao.id}" id="idDelete" />
<p:commandButton id="botaoSim" value="#{msgs.label_action_yes}" actionListener="#{versaoMB.deletarVersao()}" oncomplete="confirmacao.hide();" ajax="true" update="dataTableVersoes" />
<p:commandButton id="botaoNao" value="#{msgs.label_action_no}" oncomplete="confirmacao.hide();" ajax="true" />
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>
</html>[/code]
Para essa funcionar eu deixei o ManagedBean de sistema no escopo de sessão e acesso a propriedade dele no ManagedBean de Versão.
Foi a maneira que eu encontrei, pois com escopo de request a listegem de versão não funcionava corretamente quando eu criava uma nova versão para o sistema, pois existe troca de pagina para o cadastro de novos registros.
Alguém sabe se segui o caminho correto na minha abordagem ou se teria uma maneira mais simples e efetiva para essa funcionalidade?
Agradeço.