Dicas de arquitetura para sistema web

7 respostas
prog.tiago

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:

7 Respostas

A
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 <a href="http://twitter.github.io/bootstrap/" data-bbcode="true">Twitter Bootstrap</a> 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.

prog.tiago

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!

A

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.

&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;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"&gt;

    &lt;ui:define name="titulo"&gt;Currículo&lt;/ui:define&gt;
    
	&lt;ui:define name="menu"&gt;
		<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));
prog.tiago

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:

A

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

Espero ter ajudado.

prog.tiago

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.

prog.tiago

Alcionj,

Testei suas dicas e funcionou perfeitamente. Muito obrigado!

Bons dias.

Criado 2 de julho de 2013
Ultima resposta 3 de jul. de 2013
Respostas 7
Participantes 2