Ajuda com boas práticas JSF

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

	&lt;h:form id="formListaSistema"&gt;
		&lt;p:growl globalOnly="true" autoUpdate="true" life="3000" showSummary="true" showDetail="true" /&gt;
		&lt;p:panel id="panelSistemas"&gt;
			&lt;f:facet name="header"&gt;
				&lt;h:outputText value="#{msgs.label_view_systems_frame}" /&gt;
			&lt;/f:facet&gt;
			&lt;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}"&gt;
				&lt;p:column headerText="#{msgs.label_table_system_id}" sortBy="#{sistema.id}"&gt;
					&lt;h:outputText value="#{sistema.id}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_system_name}" sortBy="#{sistema.nome}"&gt;
					&lt;h:outputText value="#{sistema.nome}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column&gt;
					&lt;p:commandButton action="#{sistemaMB.editarSistema()}" title="#{msgs.label_action_edit_record}" icon="ui-icon ui-icon-pencil" ajax="true" /&gt;
					&lt;p:commandButton title="#{msgs.label_action_delete_record}" icon="ui-icon ui-icon-trash"  onclick="confirmacao.show();" ajax="true"&gt;
						&lt;f:setPropertyActionListener target="#{sistemaMB.sistema}" value="#{sistema}" /&gt;
					&lt;/p:commandButton&gt;
					&lt;p:commandButton action="#{sistemaMB.listarVersoesSistema()}" title="#{msgs.label_action_view_system_versions}" icon="ui-icon ui-icon-search" ajax="true" /&gt;
				&lt;/p:column&gt;
			&lt;/p:dataTable&gt;
			&lt;f:facet name="footer"&gt;
				&lt;p:commandButton action="#{sistemaMB.adicionarSistema()}" title="#{msgs.label_action_new_record}" icon="ui-icon ui-icon-circle-plus" ajax="false" /&gt;
			&lt;/f:facet&gt;
		&lt;/p:panel&gt;

		&lt;p:confirmDialog	message="#{msgs.label_question_delete_registry}" header="#{msgs.label_index_frame}" severity="alert" widgetVar="confirmacao"&gt;
			&lt;p:commandButton id="botaoSim" value="#{msgs.label_action_yes}" actionListener="#{sistemaMB.deletarSistema()}" oncomplete="confirmacao.hide();" ajax="true" update="dataTableSistemas" /&gt;
			&lt;p:commandButton id="botaoNao" value="#{msgs.label_action_no}" oncomplete="confirmacao.hide();" ajax="true" /&gt;
		&lt;/p:confirmDialog&gt;
	&lt;/h:form&gt;

&lt;/ui:define&gt;

</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”>

	&lt;h:form id="formListaVersao"&gt;

		&lt;p:growl globalOnly="true" autoUpdate="true" life="3000" showSummary="true" showDetail="true" /&gt;

		&lt;p:panel id="panelVersoes"&gt;
			&lt;f:facet name="header"&gt;
				&lt;h:outputText value="#{msgs.label_view_versions_frame}" /&gt;
			&lt;/f:facet&gt;
			&lt;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}"&gt;
				&lt;p:column headerText="#{msgs.label_table_system_name}"&gt;
					&lt;h:outputText value="#{versaoMB.sistemaMB.sistema.nome}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_version_name}" sortBy="#{versao.nomeVersao}"&gt;
					&lt;h:outputText value="#{versao.nomeVersao}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_version_branch}" sortBy="#{versao.nomeBranch}"&gt;
					&lt;h:outputText value="#{versao.nomeBranch}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_version_author}" sortBy="#{versao.autorVersao}"&gt;
					&lt;h:outputText value="#{versao.autorVersao}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_version_head}"&gt;
					&lt;p:selectBooleanCheckbox value="#{versao.versaoHead}" disabled="true" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_version_production}"&gt;
					&lt;p:selectBooleanCheckbox value="#{versao.versaoProducao}" disabled="true" /&gt;
				&lt;/p:column&gt;
				&lt;p:column headerText="#{msgs.label_table_version_pdate}" sortBy="#{versao.dataPublicacao}"&gt;
					&lt;h:outputText value="#{versao.dataPublicacao}" /&gt;
				&lt;/p:column&gt;
				&lt;p:column&gt;
					&lt;h:inputHidden value="#{versao.descricaoVersao}" /&gt;
					&lt;p:commandButton action="#{versaoMB.editarVersao()}" title="#{msgs.label_action_edit_record}" icon="ui-icon ui-icon-pencil" /&gt;
					&lt;p:commandButton title="#{msgs.label_action_delete_record}" icon="ui-icon ui-icon-trash" onclick="confirmacao.show();" ajax="true"  update=":formListaVersao:idDelete" &gt;
						&lt;f:setPropertyActionListener target="#{versaoMB.versao.id}" value="#{versao.id}" /&gt;
					&lt;/p:commandButton&gt;
					&lt;p:commandButton title="#{msgs.label_action_view_description_of_version}" icon="ui-icon ui-icon-search" onclick="dialogDescricao.show();" update=":formListaVersao:descricao" ajax="true"&gt;
						&lt;f:setPropertyActionListener target="#{versaoMB.versao}" value="#{versao}" /&gt;
					&lt;/p:commandButton&gt;
				&lt;/p:column&gt;
			&lt;/p:dataTable&gt;

			&lt;f:facet name="footer"&gt;
				&lt;p:commandButton title="#{msgs.label_action_new_record}" icon="ui-icon ui-icon-circle-plus" action="#{versaoMB.adicionarVersao()}" /&gt;
				&lt;p:commandButton title="#{msgs.label_action_return_systems}" icon="ui-icon ui-icon-circle-arrow-w" action="#{sistemaMB.listarSistemas()}" /&gt;
			&lt;/f:facet&gt;

		&lt;/p:panel&gt;

		&lt;p:dialog header="#{msgs.label_dialog_version_description}" modal="true" widgetVar="dialogDescricao" height="100" width="500" resizable="false" draggable="false"&gt;
			&lt;h:inputTextarea id="descricao" style="height:90%; width:99%;" value="#{versaoMB.versao.descricaoVersao}" disabled="true" /&gt;
		&lt;/p:dialog&gt;

		&lt;p:confirmDialog message="#{msgs.label_question_delete_registry}" header="#{msgs.label_index_frame}" severity="alert" widgetVar="confirmacao"&gt;
			&lt;h:inputHidden value="#{versaoMB.versao.id}" id="idDelete" /&gt;
			&lt;p:commandButton id="botaoSim" value="#{msgs.label_action_yes}" actionListener="#{versaoMB.deletarVersao()}" oncomplete="confirmacao.hide();" ajax="true" update="dataTableVersoes" /&gt;
			&lt;p:commandButton id="botaoNao" value="#{msgs.label_action_no}" oncomplete="confirmacao.hide();" ajax="true" /&gt;
		&lt;/p:confirmDialog&gt;

	&lt;/h:form&gt;
	
&lt;/ui:define&gt;

</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.

Cara, desculpa. Você colocou tanto código que naõ li.

=/

Só li seu texto final, e te aconselharia a utilizar ViewScoped ao invés de SessionScoped.

Faço das palavras do Hebert as minhas. =]

[quote=Hebert Coelho]Cara, desculpa. Você colocou tanto código que naõ li.

=/

Só li seu texto final, e te aconselharia a utilizar ViewScoped ao invés de SessionScoped.[/quote]

Então…fiz o teste.
Acho que não me entenderam.

Eu não consigo fazer com ViewScoped pois para as operações de cadastro/edição eu troco de página, porém eu fiz um ManagedBean para Sistema e outro ManagedBean para Versão.
Eu dei uma olhada no código pensando alguma solução e só vi a de fazer Manageds Beans para essas operações a parte (o que eu achei porco demais)…
Usando ViewScoped funcionaria se eu estivesse utilizando dialog para essas operações, mas eu fiz em páginas diferentes.

Alguém tem alguma sugestão?

[quote=BLV-DOOM JAVA][quote=Hebert Coelho]Cara, desculpa. Você colocou tanto código que naõ li.

=/

Só li seu texto final, e te aconselharia a utilizar ViewScoped ao invés de SessionScoped.[/quote]

Então…fiz o teste.
Acho que não me entenderam.

Eu não consigo fazer com ViewScoped pois para as operações de cadastro/edição eu troco de página, porém eu fiz um ManagedBean para Sistema e outro ManagedBean para Versão.
Eu dei uma olhada no código pensando alguma solução e só vi a de fazer Manageds Beans para essas operações a parte (o que eu achei porco demais)…
Usando ViewScoped funcionaria se eu estivesse utilizando dialog para essas operações, mas eu fiz em páginas diferentes.

Alguém tem alguma sugestão?[/quote]

  1. Coloque as dialogs na mesma página. Não tem problema algum, eu sempre fiz isso com include.
  2. Use ConversationScoped, troque todos os seus pacotes para funcionarem com CDI
  3. Coloque os valores no FlashScope e depois recupere do outro lado.