Dicas de arquitetura para sistema web

Bom dia turma,

Necessito de algumas dicas…

Vou começar em poucos dias, o desenhvolvimento de um sistema web. Estou escolhendo quais ferramentas usarei.
Um forte escudo que tenho na mão é o JSF com primefaces, pois já tenho bons conhecimentos o que facilitaria na produtividade.
A implementação JPA que desejo usar é o Hibernate. No entanto, gostaria de algumas dicas quanto essa arquitertura.

O que vocês me indicariam para controle transacional? O Hibernate já me fornece formas de controlar transação? Uma alternativa seria usar o Spring, mas será que comprometeria muito o desempenho do sistema?

Critiquem, apoiem, fiquem a vontade para comentar a arquitetura que estou imaginando…

Um abraço! :slight_smile:

Eu atualmente para meus projetos pessoais (WEB em Java) utilizo a seguinte arquitetura:
JSF 2.1;
Apache Tomcat 7 (por suportar jsf 2), mesmo não possuindo o controle transacional do Glassfish ou Jboss, é infinitamente mais rápido.
JPA;
EclipseLink (acho a documentação muito mais rica que a do hibernate, consigo resolver problemas mais facilmente);
Para a camada de visão parei com o primefaces, agora uso o Twitter Bootstrap por 2 motivos:

* Layout: Acho muito mais bonito os componentes (Existe um skin do boostrap para o primefaces mas não é a mesma coisa);
* Desempenho: Lógico que não posso comparar com as funcionalidades e facilidades existentes no primefaces, mas com o boostrap consigo fazer a tela carregar apenas o necessário, diferente do primefaces que por default carrega tudo. (genericamente falando)

O lado negativo do boostrap é a necessidade de construir tudo na mão, mas acredito que o esforço vale a pena, depois que você pega o geito o trabalho flui.
Para o controle das transações no Bean utilizo as “scope session” do JSF e as do banco faço na mão mesmo.

PS: Aproveitando a oportunidade, se alguém souber como utilizar a paginação do boostrap avisa, pois este foi o único componente que não consigo utilizar.

Olá Alcionj,

Muito interessante sua resposta… Pesquisei sobre o bootstrap, até pensei em fazer as interfaces gráficas com ele.
Como você acessa os componentes do bootstrap com os ManagedBeans do JSF? Não consegui compreender.

Vlw!

Segue abaixo um exemplo de um bean e um .xhtml de formulário.
Os imports dos .css e javascripts do boostrap estão no template “template=”/template/default_f4.xhtml", neste projeto criei alguns templates, pois assim só carreguei apenas o necessário em cada tela, deixando assim a página mais leve.


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	template="/template/default_f4.xhtml">

    <ui:define name="titulo">Currículo</ui:define>
    
	<ui:define name="menu">
		<li><a >Início</a></li>
		<li><a >Planos</a></li>
		<li><a >Contato</a></li>
		<li ><a >Currículo</a></li>
		<li><a >Sair</a></li>
	&lt;/ui:define&gt;

    &lt;ui:define name="cabecalho"&gt;
    	Curriculum Vitae
    &lt;/ui:define&gt;

	&lt;ui:define name="esquerda"&gt;
	
	&lt;table&gt;
	&lt;tr&gt;
    &lt;td style="background-color: #fff; margin-left: 20px; float: left; height:500px;"&gt;
 
	&lt;h:form class="form-horizontal" id="formContato" &gt;
	<br></br>
    
    &lt;h:message id="system" for="system"   errorClass="alert alert-error" infoClass="alert alert-info" warnClass="alert alert-warning" /&gt;        
  
    &lt;fieldset&gt;
      &lt;div id="legend" class=""&gt;
        &lt;legend class=""&gt;Formulário de contato.&lt;/legend&gt;
      &lt;/div&gt;

    &lt;div class="control-group"&gt;

          &lt;!-- Text input--&gt;
          &lt;label class="control-label" for="input01"&gt;Nome:&lt;/label&gt;
          &lt;div class="controls"&gt;
            &lt;h:inputText class="input-xlarge" value="#{contatoBean.nome}" id="nome" required="true" requiredMessage="O campo nome é obrigatório!" /&gt;
            <p  >&lt;h:message for="nome" errorClass="alert alert-error"&gt;&lt;/h:message&gt;</p>
            
          &lt;/div&gt;
        &lt;/div&gt;

    &lt;div class="control-group"&gt;

          &lt;!-- Text input--&gt;
          &lt;label class="control-label" for="input01"&gt;Email:&lt;/label&gt;
          &lt;div class="controls"&gt;
			&lt;h:inputText class="input-xlarge" value="#{contatoBean.email}" id="email" required="true" requiredMessage="O campo email é obrigatório!" validatorMessage="O campo email é inválido!"&gt;
				&lt;f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" /&gt;
			&lt;/h:inputText&gt;           
		     <p  >&lt;h:message for="email" errorClass="alert alert-error"&gt;&lt;/h:message&gt;</p>
          &lt;/div&gt;
        &lt;/div&gt;

    &lt;div class="control-group"&gt;

          &lt;!-- Textarea --&gt;
          &lt;label class="control-label"&gt;Mensagem:&lt;/label&gt;
          &lt;div class="controls"&gt;
            &lt;div class="textarea"&gt;
            &lt;h:inputTextarea class="input-xlarge" rows="3" style="resize:none; margin-bottom:10px;"  value="#{contatoBean.mensagem}" id="mensagem" required="true" requiredMessage="O campo mensagem é obrigatório!" &gt;&lt;/h:inputTextarea&gt;				
            &lt;/div&gt;
             <p  >&lt;h:message for="mensagem" errorClass="alert alert-error"&gt;&lt;/h:message&gt;</p>
          &lt;/div&gt;
        &lt;/div&gt;

      &lt;div class="control-group"&gt;
          &lt;!-- Form Actions --&gt;
            &lt;div class="form-actions"&gt;
              &lt;h:commandButton class="btn btn-large btn-primary" type="submit"
					value="Confirmar" actionListener="#{contatoBean.salva}"
					onclick="return checkValues(this.form);"&gt;
					&lt;f:ajax render=":formContato" /&gt;
				&lt;/h:commandButton&gt;
				 &nbsp;
				&lt;h:commandButton class="btn btn-large" value="Cancelar"
					actionListener="#{contatoBean.limpa}"&gt;
					&lt;f:ajax render=":formContato" /&gt;
				&lt;/h:commandButton&gt;
            &lt;/div&gt;
        &lt;/div&gt;

    &lt;/fieldset&gt;
    &lt;/h:form&gt;
	&lt;/td&gt;	
	&lt;/tr&gt;
	&lt;/table&gt;
						
	&lt;/ui:define&gt;
&lt;/ui:composition&gt;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

@ManagedBean(name="contatoBean")
@RequestScoped
public class ContatoBean {

	private String nome;
	private String email;
	private String mensagem;
	
	public ContatoBean() {

	}

	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 getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public void salva() {
            // exemplo de retorno de mensagem
		FacesContext.getCurrentInstance().addMessage("formContato:system", new FacesMessage(FacesMessage.SEVERITY_INFO,"Enviado com sucesso!", null));
	    // continua ...
	}
	public void limpa() {
		nome = "";
		email = "";
		mensagem = "";
	}
}

Note que estou setando o formuário e o parâmetro de retorno da mensagem individualmente:

FacesContext.getCurrentInstance().addMessage("formContato:system", new FacesMessage(FacesMessage.SEVERITY_INFO,"Enviado com sucesso!", null));

Interessante,

Em resumo, o que você faz é aplicar os estilos do bootstrap nos componentes do jsf. Estou certo?

Se estou certo, não havia pensado nessa possibilidade. :smiley:

Isso mesmo …
Esqueci de falar, para o resto uso ui, <ui: repeater>, etc …

Espero ter ajudado.

Haha.

Hoje a noite vou testar e amanhã compartilho aqui minhas impressões.

Quem mais quiser e puder dar opiniões, agradeço.

Vlw Alcionj.

Alcionj,

Testei suas dicas e funcionou perfeitamente. Muito obrigado!

Bons dias.