Desenvolvimento WEB em JAVA Palestrante: Lourival F. de Almeida Júnior Agenda • • • • • • • Introdução Servlet Arquitetura de Software Velocity Struts Conclusão Referências Introdução (antes) Programador Produto Introdução (hoje) Arquiteto de Software Programador Produto GCS GQS Analista de Sistemas Gestão de Projeto Engenheiro de Software Introdução Softwares maiores e mais complexos exigem uma organização também maior e mais complexa Arquitetura Web Process Servlet Servlet Primeiro Servlet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(“<html>”); out.println(“<title>Primeiro Servlet</title>"); out.println(“<body><h1>Olá Mundo!!!</h1></body>”); out.println(“</html>”); } Arquitetura de Software APRESENTAÇÃO Objeto CONTROLE Objeto PERSISTÊNCIA VELOCITY Agenda • • • • Introdução Arquitetura Velocity Template Language (VTL) Linkando com Java Introdução • Velocity é um motor de templates (template engine) escrito em Java; • Serve bem como divisor das camadas de apresentação e negócio, facilitando o desenvolvimento paralelo entre web designers e programadores; • Bastante usado atualmente no desenvolvimento de aplicações web; • Alternativa viável para o uso de JSP. Problemas com JSP • Problemas de design conhecidos e relatados em estudos; • JSP embute código Java dentro das páginas HTML (contra MVC); • JSP é editado -> transformado -> compilado -> carregado -> executado, o que faz necessário um compilador java na máquina servidora; • Difícil aprendizado por designers; • “Solução” Taglibs: Estende a linguagem JSP; • Ao invés de colocar código Java dentro de páginas HTML, agora colocamos XML dentro dos HTML. Exemplo de Taglibs <%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <!-- Is the number guess right? --> <logic:equal parameter="number" value="7"> You guessed right! You win a high speed blender! </logic:equal> <!-- If the number guessed was wrong --> <logic:notEqual parameter="number" value="7"> <!-- Less Than --> <logic:lessThan parameter="number" value="7"> A little higher... </logic:lessThan> <!-- Greater Than --> <logic:greaterThan parameter="number" value="7"> A little lower... </logic:greaterThan> </logic:notEqual> Problemas com JSP • Funcional apenas com aplicações Web; • Gerenciamento de Erros • Erros confusos, os problemas reportados estão no código Java gerado a partir do .jsp; • O parser do .jsp pode gerar um conjunto de erros enquanto o compilador gera outros tipos de erros, tudo isso no mesmo stack trace; • Para fazer o tratamento de erros é inevitável o uso de Java dentro das páginas HTML. Hello World em JSP <html> <head><title>Hello</title></head> <body> <h1> <% if (request.getParameter("name") == null) { out.println("Hello World"); } else { out.println("Hello, " + request.getParameter ("name")); } %> </h1> </body></html> Hello World em Velocity <html> <head><title>Hello</title></head> <body> <h1> #if ($valor == null) Hello World #else Hello, $valor #end </h1> </body> </html> Arquitetura Templates Templates Templates Dados Dados Dados Velocity (Motor de Templates) merge Stream (html, xml, texto, etc.) Velocity Template Language • Linguagem simples que define a forma como os templates serão escritos para referenciar objetos em Java; • Bastante poderosa; • De fácil aprendizado em relação ao JSP; • Facilmente assimilada por web designers no desenvolvimento web. Velocity Template Language • Variáveis • $cliente, $!cliente, $(cliente) • Propriedades • $cliente.endereco, $(cliente.endereco) • Métodos • $cliente.getEndereco(), $(cliente.getEndereco ()) • $cliente.getEndereco(“completo”) • $cliente.endereco Velocity Template Language • #if #if (condicao) <corpo> #elseif (condicao2) <corpo> #else <corpo> #end #if ($cliente.condicao == “em debito”) <H1>Cliente em débito</H1> #else <H1>Seja bem vindo!</H1> #end Velocity Template Language • #foreach #foreach ($ref in arg) <corpo> #end <table> #foreach( $cliente in $listaCliente ) <tr><td>$velocityCount</td><td>$cliente.nome</td></tr> #end </table> Velocity Template Language • #include • Inclui um arquivo que não passará pelo parser do Velocity • #include (arg) • #parse • Inclui um arquivo que passará pelo parser do Velocity • #parse (arg) Velocity Template Language • #macro #macro (vname $arg1 <código> #end [$arg2 $arg3]) ##Definicao #macro (messageMarkupForProperty $property) #if ($messages.exist($property) ) <ul> #foreach ($m in $messages.get($property)) $m #end </ul> #end #end ##Uso #messageMarkupForProperty(“nome”) Velocity Template Language <HTML> <HEAD>Testando aplicacao de Velocity</HEAD> <BODY> <H1>Olá $Cliente</H1> #foreach ($item in $menu) <h2>$item.nome eh ligado a: $item.action</H2><br> #end </BODY> </HTML> Fazendo a ligação com Java • • • • • Inicializar o Velocity Criar um objeto Context Adicionar seus dados ao contexto Escolher um template Ligar o template e o contexto para produzir uma saída Struts Introdução • Framework open-source para construção de aplicações web; • Implementação do padrão MVC, construído sobre padrões de projeto (Design Patterns) bem conhecidos pela comunidade; • Apresentação (JSP, Velocity, XSLT, ...) • Persistência (JDBC, Hibernate, EJB, ...) Introdução Características do Struts: Controlador central; Sistema de apresentação externo ao framework; Tratamento de erros; Internacionalização; Sincronizadores; Validação de parâmetros (cliente/servidor); Sistema de log; Upload; Plugins; ... Arquitetura - MVC • Módulos especialistas; • Divisão de tarefas e papéis dos envolvidos; • Poderosa ajuda no desenvolvimento de aplicações complexas e de tamanho considerável. Arquitetura - MVC • Model • a base de dados envolvida na aplicação • camada de persistência • View • responsável pela renderização dos dados desejados na interface de saída esperada • camada de apresentação • Controller • mantém e controla o fluxo entre as várias telas da aplicação, mais a conversação entre as camadas de apresentação e persistência Arquitetura - Model I Arquitetura - Model II Velocity Hibernate Struts Arquitetura Struts Conceitos Básicos Parte I • ActionServlet • Controlador central da aplicação; • Responsável por delegar tarefas para as ações correspondentes; • Actions • Responsável por executar as regras de negócio da aplicação em desenvolvimento; • Forms • Responsável por armazenar os dados HTTP em um objeto Java. Arquitetura Struts Arquitetura Struts Controle Negócio Modelo Apresentação Conceitos Básicos Parte II • RequestProcessor • Dita a seqüência de eventos que ocorrem dentro da aplicação desde uma requisição até a preparação da resposta; • ActionForward • Controla o fluxo de navegação entre as páginas da aplicação; • ActionMapping • Cataloga e configura uma lógica de negócio disponível para uma aplicação Struts; • struts-config.xml • Arquivo principal de configuração do framework; • VelocityServlet/VelocityLayoutServlet • Responsáveis pela renderização da apresentação para o cliente; Fluxo do Struts Construção... • struts-config.xml • Arquivo contendo as configurações gerais da aplicação que está em execução sobre o Struts; • Elementos: • • • • • • • • <data-sources> <form-beans> <global-exceptions> <global-forwards> <action-mappings> <controller> <message-resources> <plug-in> Construção (struts-config.xml) • <data-sources> • Configura o controle das fontes de dados para o Controller Construção (struts-config.xml) • <form-beans> • Descreve um bean que será utilizado pelo Action correspondente Construção (struts-config.xml) • <global-exceptions> • Funciona como um container exceções lançadas pelo Action Construção (struts-config.xml) • <global-forwards> • Define direcionamentos de URL Construção (struts-config.xml) • <action-mappings> • Define os Actions da aplicação Struts Construção (struts-config.xml) • <message-resources> • Contem o mensageiro da aplicação Construção (struts-config.xml) • <plug-in> • Descreve plugins para serem usados no Struts Construção... • Actions • Estendem de org.apache.struts.action.Action; • Possuem um método execute() que é chamado pelo RequestProcessor; • Contem a lógica de negócio. Fazem parte da camada de controle; • São criadas uma única vez, reutilizadas e são passíveis de concorrência. Action Construção... • Forms • Estendem de org.apache.struts.action.ActionForm; • Os forms são JavaBeans que representam as screens da aplicação; • Só pode conter propriedades String e boolen; • São preenchidos pelo RequestProcessor; • Caso a configuração no struts-config.xml para o ActionMapping seja setada como validate = true, o método validate() da classe será chamado. ActionForm Construção... • Template • Arquivos texto que misturam HTML com a VTL (Velocity Template Language) • Intimamente ligados ao Velocity Tools (conjunto de classes criadas para apoiar a construção de aplicações com Struts) Links e bibliografia • Struts http://jakarta.apache.org/struts http://jakarta.apache.org/velocity/tools/struts/ • Patterns http://developer.java.sun.com/developer/technica lArticles/J2EE/despat/ Links e bibliografia • Velocity • http://jakarta.apache.org/velocity • Artigos • http://jakarta.apache.org/velocity/ymtd/ymtd.html • http://www.javaworld.com/javaworld/jw-12-2001/jw1228-velocity.html • http://www.javaworld.com/javaworld/jw-07-2001/jw0727-templates.html • http://today.java.net/pub/a/today/2003/12/16/veloci ty.html Questões Lourival F. de Almeida Júnior [email protected]