Portais e Frameworks MVC DAS 5316 Integração de Sistemas Corporativos Rui J. Tramontin Jr. 1
Tópicos Introdução Web Dinâmica Portais Web Portlets JSR-168 WSRP Frameworks MVC Struts Ruby on Rails 2
Servidor Web Páginas Estáticas Pedido Resposta Docu mento Cliente Servidor Web 3
Servidor Web CGI Common Gateway Interface Pedido Aplicação Externa Gera Cliente Resposta Servidor Web Docu mento 4
Java Servlets Pedido Servlet Engine JVM Servlet Gera Cliente Resposta Servidor Web Docu mento 5
Java Servlets Servlets são objetos Java, rodando dentro de uma máquina virtual Java, que ampliam a funcionalidade de servidores Web Servlets rodam em threads dentro do processo do servidor, e podem interagir com ele Limitação: Código HTML precisa ficar escrito dentro de uma classe Java, dificultando o uso de editores visuais de HTML 6
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; Servlet Exemplo public class HelloWorld extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException,IOException { response.setcontenttype("text/html"); PrintWriter pw = response.getwriter(); pw.println("<html>"); pw.println("<head><title>hello World</title></title>"); pw.println("<body>"); pw.println("<h1>hello World</h1>"); pw.println("</body></html>"); } } 7
Páginas Dinâmicas - JSP Pedido Aplicação Web Gera Cliente Resposta Docu mento Templates Servidor Web 8
JSP Exemplo <% String cliente = request.getremoteaddr(); %> <html> <body> Olá <%= cliente %>! </body> </html> 9
Portais Web Portais são sites que: Agregam diversas fontes de conteúdo e serviços Permitem personalização a seus visitantes Exemplos: Google, Yahoo!, Terra, UOL Portais Empresariais: Portais Web utilizados no contexto de uma empresa. 10
Portais Empresariais: Características Segurança Administradores podem limitar o acesso a determinados conteúdos 11
Portais Empresariais: Características Single Sign-on Permite que usuários do portal acessem diversas funcionalidades tendo que se autenticar apenas uma vez. 12
Portais Empresariais: Características Personalização Membros do portal podem se cadastrar para ver tipos específicos de conteúdo Configuração da aparência do ambiente 13
Portais Empresariais: Características Gerenciamento de documentos e de conteúdo Suporte ao ciclo de vida de conteúdo e documentos: criação edição aprovação controle de versões 14
Portais Empresariais: Características Busca Indexação dos conteúdos e serviços providos pelo portal para busca eficiente Quanto mais conteúdo disponível, mais valioso o portal, mas mais difícil de se encontrar aquilo que se quer 15
Portais Empresariais: Características Colaboração Membros do portal podem comunicar-se entre si por meio de: Troca de mensagens Fóruns de discussão Blogs 16
Portlets Portlets são componentes de interface de usuário plugáveis, gerenciados por e apresentados em portais web Portais apresentam portlets como pequenas janelas Cada portlet pode ser visto como uma aplicação independente, rodando na página do portal 17
Agregação de Portlets Portlet A Portlet B Portlet C Portlet D Servidor de Portais Página de Portal Portlet B Portlet A Portlet C Portlet D 18
Portlets - Vantagens Permitem o desenvolvimento modularizado O desenvolvedor se preocupa com um portlet de cada vez O gerenciamento de ciclo de vida de cada portlet e a montagem da página com eles é trabalho do portal Portlet pode ser reutilizado em outros portais. 19
JSR-168 Padrão Java para o desenvolvimento de portlets Portlets possuem modos (visualização, edição, ajuda, etc) para indicar a tarefa sendo excetutada no momento Janelas de portlets com estado (normal, maximizado, minimizado) 20
JSR-168 (cont.) Processamento de requisições separado Requisição por conteúdo (renderização) Requisição para alterar estado (ação) Gerenciamento de sessão e armazenamento de preferências de usuário Oferece padrão para empacotar portlets para distribuição 21
Exemplo Portlet class GrettingsPortlet extends GenericPortlet { } public void doview(...) {...} public void doedit(...) {...} public void processaction(...) {...} 22
Exemplo Portlet doview public void doview(renderrequest request, RenderResponse response) throws PortletException, IOException { response.setcontenttype("text/html"); PortletContext context = getportletcontext(); PortletRequestDispatcher rd = context.getrequestdispatcher("/view.jsp"); } rd.include(request, response); 23
Exemplo Portlet edit.jsp <%@ taglib prefix="portlet" uri="http://java.sun.com/portlet" %> <portlet:actionurl var="changeurl" portletmode="view" /> <portlet:actionurl var="reseturl" portletmode="edit" /> <form action="${ changeurl }" method="post"> Name: <input name="name"> <input type="submit" value="change Name"> </form> <a href="${ reseturl }">Reset to Default</a> 24
Exemplo Portlet processaction public void processaction(actionrequest request, ActionResponse response) throws PortletException, IOException { PortletPreferences prefs = request.getpreferences(); String name = request.getparameter("name"); if (name!= null) prefs.setvalue("name", name); else prefs.setvalue("name", "World"); } prefs.store(); 25
Resultado 26
WSRP Web Services for Remote Portlets Padrão que permite acesso remoto a portlets através de serviços web Cria o conceito de serviços web orientados à apresentação 27
WSRP - Características Separa requisições por conteúdo e de ação da mesma forma que JSR-168 Portlets não são acessados diretamente, mas através de seus contêineres X X Cliente Servidor 28
Portlets Locais Portal Portlet A Serviço A Portlet B Serviço B 29
Portlets Remotos Portal Proxy Portlet A Serviço A Proxy Portlet B Serviço B 30
MVC Modelo-Visão-Controlador 31
MVC Modelo-Visão-Controlador Arquitetura que divide aplicações interativas em três componentes distintos: Modelo: mantém o estado da aplicação Visão: apresentam o modelo ao usuário Controlador: trata as entradas do usuário para atualizar o modelo e apresenta os visualizadores apropriados ao usuário 32
MVC Modelo-Visão-Controlador O controlador atua diretamente sobre o modelo e a visão, sendo notificado de operações efetuadas pelo usuário através da visão Controlador A visão acessa diretamente os dados do modelo e pode ser notificada de alterações neste. Visão Modelo 33
MVC Foi criado no final da década de 70, para o desenvolvimento de aplicações gráficas no ambiente Smalltalk Recentemente foi redescoberto e aplicado ao desenvolvimento de aplicações interativas na web 34
Struts Projeto da Apache para o desenvolvimento de aplicações web em Java de acordo com a arquitetura MVC Requisições são tratadas por um servlet, que instancia componentes (Javabeans) e redireciona a requisição para uma página JSP. Componentes ficam disponíveis para a página e encapsulam o acesso a bases de dados. 35
Arquitetura Struts Requisições Servlet (Controlador) Instancia Redireciona ActiveRecor Javabens (Modelo) ActiveRecor d (Modelo) d (Modelo) Dados Respostas Páginas JSP (Visão) Páginas JSP (Visão) JSP (Visão) Interação com Modelo 36
Exemplo Struts Modelo import org.apache.struts.action.*; public class RegisterForm extends ActionForm { private String username; private String password1; private String password2; public String getusername () { return username; } public void setusername (String username) { this.username = username; } //outros getters e setters } 37
Exemplo Struts Visão <%@ taglib uri="/web-inf/struts-form.tld" prefix="form" %> <form:form action="register.do"> Nome: <form:text property="username"/><br> Password: <form:password property="password1"/><br> Repita a password: <form:password property="password2"/><br> <form:submit value="registrar"/> </form:form> 38
Exemplo Struts Ação import org.apache.struts.action.*; import javax.servlet.http.*; import java.io.*; public class RegisterAction extends Action { public ActionForward perform ( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //implementação } } 39
Exemplo Struts Ação (cont) public ActionForward perform (ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { RegisterForm rf = (RegisterForm) form; if (rf.getpassword1().equals(rf.getpassword2())) { try { UserDirectory.getInstance(). setuser(rf.getusername(),rf.getpassword1()); return mapping.findforward("success"); } catch (UserDirectoryException e) { return mapping.findforward("failure"); } } else return mapping.findforward("failure"); } 40
Exemplo Struts Configuração <?xml version="1.0"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"> <struts-config> <form-beans> <form-bean name="registerform" type="registerform" /> </form-beans> <action-mappings> <action path="/register" name="registerform" type="registeraction" > <forward name="success" path="/success.html" /> <forward name="failure" path="/failure.html" /> </action> </action-mappings> </struts-config> 41
Ruby on Rails Framework MVC baseado na linguagem Ruby Nessecidade de arquivos de configuração eliminada Aplicações orientadas a bancos de dados 42
Ruby Linguagem de programação dinâmica orientada a objetos Focada em simplicidade e produtividade Sintaxe elegante e natural 43
Ruby Tudo são objetos 10.class => "Fixnum" -4.abs => 4 "ruby".upcase => "RUBY" 5.times do puts "Viva Ruby!" end 44
Ruby - Classes e Métodos class Mensagem def initialize(msg) @msg = msg end def saudacao(nome) puts "#{@msg} #{nome}!" end end m = Mensagem.new("Alô") m.saudacao("mundo") # Alô Mundo m.saudacao "Sem Parênteses" # Alô Sem Parênteses 45
Ruby - Arrays e Hashes a = ["a", "b", "c"] puts a[1] # imprime "b" a.size # 3 h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 } puts h["c"] # imprime 300 puts h[a[0]] # imprime 100 h.keys # ["a", "b", "c", "d"] 46
Ruby - Blocos cores = ["Azul", "Amarelo", "Vermelho"] cores.each do c puts c end cores.map { c c.size } => [4, 7, 8] cores.find_all { c c.include? "m" } => ["Amarelo", "Vermelho"] 47
Ruby - Tipagem Dinâmica class Galo def som "cocoricó!" end end class Pato def som "quaquá!" end end def cantar(aves) aves.each do ave if ave.respond_to? :som ave.som end end end aves = [Pato.new, Galo.new, Object.new] cantar(aves) 48
Ruby - method_missing class Roman def romantoint(str) #...? end def method_missing(metodo) str = metodo.to_s romantoint(str) end end r = Roman.new r.iv # 4 r.xxiii # 23 r.mm # 2000 49
Rails Bibliotecas Ruby que formam um framework MVC dinâmico Modelo baseado em banco de dados ActiveRecord Controlador e visão interligados 50
Arquitetura Rails Requisições Roteador Seleção de Controlador ActionControler (Controlador) Interação com Modelo Invocação da Visão Respostas Páginas ERb (Visão) Páginas JSP (Visão) JSP (Visão) ActiveRecord ActiveRecord (Modelo) ActiveRecord (Modelo) (Modelo) Dados 51
Active Record (Modelo) Mapeamento automático entre banco de dados e objetos CREATE TABLE entries ( id INTEGER(11) NOT NULL, name VARCHAR(255), comments VARCHAR(255), PRIMARY KEY (id) ); class Entry < ActiveRecord::Base # nada aqui dentro end entry = Entry.new entry.name = "Joãozinho" entry.comments = "Eu adoro essa aula!" entry.save entry = Entry.find(1) puts entry.name # saída: Joãozinho 52
Action Controller (Controlador) Responsável por tratar requisições Ações mapeadas para métodos Variáveis de instância acessíveis pela visão 53
Roteamento de URLs http://www.xxx.com/recados/list Controlador Método 54
Controlador e Visão class RecadosController < ActionController::Base def list @entries = Entry.find_all end def new @entry = Entry.new end end <html> <body> <h1>página de Recados</h1> <% @entries.each do e %> <p><%= e.name %> : <%= e.comments %></p> <% end %> </body> </html> views/recados/list.rhtml 55
Controlador e Visão <html> <body> <h1>novo Recado</h1> <%= star_form_tag :action => :create %> <p>nome: <%= text_field "entry", "name" %></p> <p>comentário: <%= text_area "entry", "comments" %></p> <%= submit_tag "Submeter Comentário" %> <%= end_form_tag %> </body> </html> views/recados/new.rhtml def create @entry = Entry.new(@params['entry']) if @entry.save redirect_to :action => :list else render_action :new end end 56
Validação no Modelo Validação class Project < ActiveRecord::Base validates_presence_of :name, :description validates_uniqueness_of :name validates_length_of :name, :maximum => 50 validates_numericality_of :size validates_format_of :name, :with => /^\w+$/ end Na visão: <%= error_messages_for "modelo" %> 57
Resultado 58