A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Desenvolvimento Java para Web Osvaldo Pinali Doederlein Visionnaire.

Apresentações semelhantes


Apresentação em tema: "Desenvolvimento Java para Web Osvaldo Pinali Doederlein Visionnaire."— Transcrição da apresentação:

1 Desenvolvimento Java para Web Osvaldo Pinali Doederlein Visionnaire

2 Introdução à Plataforma J2EE 1.4

3 Agenda Containers Containers Padrões JCP Padrões JCP Servidores de Aplicação Servidores de Aplicação

4 J2EE e Containers Container: Conceito fundamental do J2EE Container: Conceito fundamental do J2EE Aplicação executa num casulo que assume ou facilita diversas responsabilidades Aplicação executa num casulo que assume ou facilita diversas responsabilidades Administração / Ciclo de vida Administração / Ciclo de vida Conectividade (SGBD, Messaging, HTTP, SOAP etc.) Conectividade (SGBD, Messaging, HTTP, SOAP etc.) Funcionalidades: Persistência, Segurança... Funcionalidades: Persistência, Segurança...

5

6 APIs O Container também implementa APIs J2EE O Container também implementa APIs J2EE APIs J2SE: stand-alone (bibliotecas simples) APIs J2SE: stand-alone (bibliotecas simples) APIs J2EE: maior dependência de serviços APIs J2EE: maior dependência de serviços XML-RPC: exige server HTTP XML-RPC: exige server HTTP JMS: exige middleware de mensagens JMS: exige middleware de mensagens Connector: exige bridges com outros sistemas Connector: exige bridges com outros sistemas EJB: exige servidor RMI/IIOP EJB: exige servidor RMI/IIOP

7

8 APIs do J2EE 1.4: Diversos JavaMail JavaMail Envio e recepção de por POP, IMAP, SMTP Envio e recepção de por POP, IMAP, SMTP JavaBeans Activation Framework JavaBeans Activation Framework Ativação de funcionalidades via tipos MIME Ativação de funcionalidades via tipos MIME JNDI (Java Naming and Directory) JNDI (Java Naming and Directory) LDAP, NDS, DNS, NIS, CosNaming; serviços J2EE LDAP, NDS, DNS, NIS, CosNaming; serviços J2EE JAAS (Autenthication & Authorization Service) JAAS (Autenthication & Authorization Service) Autorização e Autenticação; PAM Autorização e Autenticação; PAM

9 APIs do J2EE 1.4: Middleware JMS (Java Message Service) JMS (Java Message Service) Comunicação assíncrona robusta Comunicação assíncrona robusta JTA (Java Transaction API) JTA (Java Transaction API) Transações de alto nível Transações de alto nível JCA (J2EE Connector Architecture) JCA (J2EE Connector Architecture) Integração com sistemas não-J2EE Integração com sistemas não-J2EE JDBC (Java Database Connectivity) JDBC (Java Database Connectivity) J2SE + DataSources, transações XA J2SE + DataSources, transações XA

10 APIs do J2EE 1.4: Web Servlets Servlets Programação Web dinâmica Programação Web dinâmica JSP (Java Sever Pages) JSP (Java Sever Pages) Idem, mais visual Idem, mais visual JSTL (Java Standard Template Library) JSTL (Java Standard Template Library) Idem, mais estruturado Idem, mais estruturado Alternativas/Complementos: Struts, Spring... Alternativas/Complementos: Struts, Spring... Futuro (J2SE 5.0): JSF (JavaServerFaces) Futuro (J2SE 5.0): JSF (JavaServerFaces)

11 APIs do J2EE 1.4: XML e Web Services JAXP (Java API for XML Processing) JAXP (Java API for XML Processing) DOM, SAX, XSLT DOM, SAX, XSLT SAAJ (SOAP with Attachments API for Java) SAAJ (SOAP with Attachments API for Java) Web Services: SOAP (modelo documento) Web Services: SOAP (modelo documento) JAX-RPC (Java API for XML-based RPC) JAX-RPC (Java API for XML-based RPC) Web Services: SOAP (modelo RPC), WSDL Web Services: SOAP (modelo RPC), WSDL JAXR (Java API for XML Registries) JAXR (Java API for XML Registries) Web Services: UDDI / ebXML Web Services: UDDI / ebXML

12 APIs do J2EE 1.4: EJB EJB (Enterprise Java Beans) EJB (Enterprise Java Beans) Componentes Distribuídos; Session; RMI/IIOP Componentes Distribuídos; Session; RMI/IIOP EJB BMP / CMP / CMR EJB BMP / CMP / CMR Entity; Persistência Automática (mapeamento O/R) Entity; Persistência Automática (mapeamento O/R) EJB MDB (Message-Driven Beans) EJB MDB (Message-Driven Beans) Facilidade de alto nível para JMS e Web Services Facilidade de alto nível para JMS e Web Services Transações, Segurança Transações, Segurança Facilidades declarativas Facilidades declarativas

13 Padrões do JCP J2EE 1.4 (JSR JSRs, jcp.org) J2EE 1.4 (JSR JSRs, jcp.org) Padroniza quase tudo Padroniza quase tudo APIs APIs Schemas, Deployment Schemas, Deployment Comportamentos (ciclos de vida, etc.) Comportamentos (ciclos de vida, etc.) Não cobre: Não cobre: Ferramentas, Metodologias Ferramentas, Metodologias QoS QoS Integração (ex.: suporte a SGBDs e middlewares) Integração (ex.: suporte a SGBDs e middlewares)

14 Tomcat 5.5 Apache + Sun; RI de JSRs de Servlet, JSP, etc. Apache + Sun; RI de JSRs de Servlet, JSP, etc. Container Web do JBoss, Sun AppServer, … Container Web do JBoss, Sun AppServer, … Conectores para Apache e IIS Conectores para Apache e IIS

15 JBoss 4.0 JBoss Group JBoss Group Open Source & Comercial Open Source & Comercial Arquitetura: Microkernel (JMX), AOP Arquitetura: Microkernel (JMX), AOP

16 Design Patterns para J2EE

17 Agenda Design Patterns Design Patterns Singleton Singleton Façade Façade Factory Factory DAO DAO MVC MVC

18 Design Patterns Design Patterns (GoF, 1995) Design Patterns (GoF, 1995) Pattern = design reutilizável; problema+solução Pattern = design reutilizável; problema+solução Modelos; ex.: Intenção, Motivação, Aplicabilidade, Estrutura, Implementação, Implicações, Categoria... Modelos; ex.: Intenção, Motivação, Aplicabilidade, Estrutura, Implementação, Implicações, Categoria... Instanciável, mas não reusável, como código Instanciável, mas não reusável, como código Linguagem de Patterns: Coleção de patterns relacionados, com modelo comum Linguagem de Patterns: Coleção de patterns relacionados, com modelo comum

19 Singleton: Motivação Garantir que uma classe tenha instância única Garantir que uma classe tenha instância única Sem abrir mão do suporte à herança (como static ) Sem abrir mão do suporte à herança (como static ) Implementação robusta de entidades que precisam ser únicas; ex: configuração Implementação robusta de entidades que precisam ser únicas; ex: configuração Alternativa OO às variáveis globais Alternativa OO às variáveis globais Facilita a inicialização lazy Facilita a inicialização lazy

20 Singleton: Estrutura

21 class Configuracao { private static Configuracao singleton ; private static Configuracao singleton ; private final Properties props; private final Properties props; private Configuracao (Properties props) { this.props = props; } private Configuracao (Properties props) { this.props = props; } public static Configuracao getInstance () { public static Configuracao getInstance () { if (singleton == null) { if (singleton == null) { properties props = //... Lê properties de um arquivo properties props = //... Lê properties de um arquivo singleton = new Configuracao(props); singleton = new Configuracao(props); } return singleton; return singleton; } public getProperties () { return props; } public getProperties () { return props; }} Properties props = Configuracao.getInstance().getProperties();

22 Façade: Motivação Interface única e simples para um sistema Interface única e simples para um sistema Simplifica API, reduz curva de aprendizado Simplifica API, reduz curva de aprendizado Reduz dependências e acoplamento Reduz dependências e acoplamento Se o modelo interno do sistema evoluir, basta mudar a implementação da Façade; clientes são preservados Se o modelo interno do sistema evoluir, basta mudar a implementação da Façade; clientes são preservados Conduz a modelos em camadas (layers) Conduz a modelos em camadas (layers) Ex: Cliente (JSP) Façade (Session Bean) Negócio Ex: Cliente (JSP) Façade (Session Bean) Negócio

23 Façade: Estrutura

24 Façade (Session / J2EE)

25 public class SistemaPagamentos { public void alteraSalario (String matricula, double salario) { public void alteraSalario (String matricula, double salario) { Funcionario func = CadastroFuncs.getInstance().find(matricula); Funcionario func = CadastroFuncs.getInstance().find(matricula); if (func != null && func.isAtivo()) if (func != null && func.isAtivo()) func.setSalario(salario); func.setSalario(salario); } //... Outros métodos da Façade //... Outros métodos da Façade} // Cliente não precisa conhecer Funcionario, CadastroFuncs, etc. SistemaPagamentos sp = //... sp.alteraSalario(" ", );

26 Factory: Motivação Cria objetos sem saber suas classes concretas Cria objetos sem saber suas classes concretas Encapsula decisões sobre a criação de objeto Encapsula decisões sobre a criação de objeto Melhoram OO (construtores não são polimórficos!) Melhoram OO (construtores não são polimórficos!) Variante: Factory Method Variante: Factory Method Útil com herança, delega criação à subclasse Útil com herança, delega criação à subclasse Evita instanceof para criar objetos relacionados Evita instanceof para criar objetos relacionados Variante: Abstract Factory Variante: Abstract Factory Suporta um conjunto de entidades relacionadas Suporta um conjunto de entidades relacionadas Suporta implementações "plugáveis", ex.: JDBC, XML Suporta implementações "plugáveis", ex.: JDBC, XML

27 Factory Method: Estrutura

28 public interface Cliente { public Conta abreConta (); public Conta abreConta ();} public class ClienteSimples implements Cliente { public Conta abreConta () { public Conta abreConta () { return new ContaComum(this); return new ContaComum(this);} public class ClientePremier implements Cliente { public Conta abreConta () { public Conta abreConta () { return new ContaEspecial(this); return new ContaEspecial(this);} Cliente cli = //... obtém da database ou outra fonte Conta ct = cli.abreConta(); // cria conta do tipo correto

29 Abstract Factory: Estrutura

30 // Utiliza fábrica abstrata de engine XML (Xerces, Crimson, etc.) SAXParserFactory spf = SAXParserFactory.newInstance() ; spf.setValidating(true);spf.setNamespaceAware(true); // Utiliza fábrica abstrata de parser (com ou sem validação, etc.) SAXParser parser = spf.newSAXParser() ; XMLReader reader = parser.getXMLReader(); reader.setContentHandler(this);reader.parse(config);

31 DAO: Motivação Desacoplar o acesso a dados dos clientes Desacoplar o acesso a dados dos clientes Ocultar a complexidade do acesso a dados Ocultar a complexidade do acesso a dados Permitir alternância fácil e dinâmica da implementação de persistência Permitir alternância fácil e dinâmica da implementação de persistência Não é necessário com ferramentas ORM (como Hibernate), mas facilita migração JDBC ORM Não é necessário com ferramentas ORM (como Hibernate), mas facilita migração JDBC ORM

32 DAO: Estrutura

33 public class Venda { /* nenhum acesso a dados */ } public interface VendaDao { public Venda find (String id) throws SQLException; public Venda find (String id) throws SQLException;} public class VendaDaoJDBC implements VendaDao { private DataSource ds; private DataSource ds; public Venda find (String id) throws SQLException { public Venda find (String id) throws SQLException { try { try { Connection c = ds.getConnection(); Connection c = ds.getConnection(); Statement stmt = c.createStatement(); Statement stmt = c.createStatement(); ResultSet rs = stmt.executeQuery("SELECT…"); ResultSet rs = stmt.executeQuery("SELECT…"); if (rs.next()) return new Venda(id, rs.getString("produto"), …); if (rs.next()) return new Venda(id, rs.getString("produto"), …); } finally { if (c != null) try { c.close(); } catch (SQLException e){} } } finally { if (c != null) try { c.close(); } catch (SQLException e){} } return null; // Objeto não encontrado return null; // Objeto não encontrado}

34 MVC-2: Motivação Desacoplar responsabilidades de uma GUI: Desacoplar responsabilidades de uma GUI: Model: Camada de Implementação das Regras de Negócio Model: Camada de Implementação das Regras de Negócio View: Layout dos dados (ex.: telas HTML) View: Layout dos dados (ex.: telas HTML) Controller: Comportamento da GUI (ex.: consultas, atualizações, tratamento de erros, defaults) Controller: Comportamento da GUI (ex.: consultas, atualizações, tratamento de erros, defaults) Permite variar/evoluir cada um separadamente Permite variar/evoluir cada um separadamente View editável por não-programadores View editável por não-programadores Back-end pode variar sem afetar GUI Back-end pode variar sem afetar GUI

35 MVC-2: Estrutura Controller ModelView Requisição Envio de Dados Resposta do Envio de dados Seleção do Visualizador Resposta

36 Login: Login: Senha: Senha: OK OK alert(' '); alert(' '); View

37 public class LoginAction extends DispatchAction { public ActionForward login (ActionMapping map, public ActionForward login (ActionMapping map, ActionForm form, HttpServletRequest req, HttpServletResponse resp) throws Exception { ActionForm form, HttpServletRequest req, HttpServletResponse resp) throws Exception { audit(request, PortalAudit.ACCESS); audit(request, PortalAudit.ACCESS); if (isFirstLogin(request)) if (isFirstLogin(request)) return mapping.findForward("firstLogin") ; return mapping.findForward("firstLogin") ; else else return mapping.findForward("loginOk") ; return mapping.findForward("loginOk") ; } private boolean isFirstLogin (HttpServletRequest req) {...} private boolean isFirstLogin (HttpServletRequest req) {...} //... Outras ações... //... Outras ações...}Controller

38 Logging

39 Agenda Log4J Log4J java.util.logging java.util.logging

40 Log4J Biblioteca do projeto Apache Jakarta Biblioteca do projeto Apache Jakarta Substitui System.out.println()... Substitui System.out.println()... Níveis de log; ativação dinâmica sem mudar código Níveis de log; ativação dinâmica sem mudar código Opções de output (console, arquivo, rede, DB etc.) Opções de output (console, arquivo, rede, DB etc.) Formatação, Extensibilidade Formatação, Extensibilidade Logs detalhados, de qualidade; fácil e eficiente Logs detalhados, de qualidade; fácil e eficiente Para diagnóstico de problemas (debug ou produção) Para diagnóstico de problemas (debug ou produção) Para auditoria, etc. Para auditoria, etc.

41 Log4J: Exemplo Logger logger = Logger.getLogger("SIST"); logger.debug("x= + x); logger.log(Level.DEBUG, "x= + x); if (logger.isDebugEnabled()) // Se não estiver habilitado... logger.debug(a+b+c+d+e+f); //...evita custo de gerar dados logger.debug(a+b+c+d+e+f); //...evita custo de gerar dados

42 Log4J: log4j.properties log4j.logger.SIST = INFO, APP_SIST log4j.appender.APP_SIST = org.apache.log4j.RollingFileAppender log4j.appender.APP_SIST.File =../logs/SIST.log log4j.appender.APP_SIST.MaxFileSize = 10MB log4j.appender.APP_SIST.MaxBackupIndex = 10 log4j.appender.APP_SIST.layout = org.apache.log4j.PatternLayout log4j.appender.APP_SIST.layout.ConversionPattern = [%p] %d{HH:mm:ss} - %m%n [%p] %d{HH:mm:ss} - %m%n

43 Log4J: log4j.xml

44 java.util.logging API padrão do J2SE 1.4+ (JSR-47) API padrão do J2SE 1.4+ (JSR-47) Semelhante à Log4J, mas não igual/compatível Semelhante à Log4J, mas não igual/compatível Menos poderosa; Mais leve, simples, eficiente Menos poderosa; Mais leve, simples, eficiente Log4J ou java.util.logging ? Log4J ou java.util.logging ? Log4J não é o padrão, mas ainda é mais popular Log4J não é o padrão, mas ainda é mais popular java.util.logging melhor para componentes reusáveis (não impõe dependência da Log4J para projetos) java.util.logging melhor para componentes reusáveis (não impõe dependência da Log4J para projetos) A Jakarta Commons Logging só piora as coisas A Jakarta Commons Logging só piora as coisas

45 java.util.logging : Exemplo Logger logger = Logger.getLogger("SIST"); logger.fine("x= + x); logger.log(Level.FINE, "x= + x); if (logger.isLoggable(Level.FINE)) // Se não estiver habilitado... logger.fine(a+b+c+d+e+f); //...evita custo de gerar dados logger.fine(a+b+c+d+e+f); //...evita custo de gerar dados

46 java.util.logging : logging.properties handlers= java.util.logging.FileHandler SIST.level = INFO java.util.logging.FileHandler.pattern =../logs/SIST%u.log java.util.logging.FileHandler.limit = java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

47 JDBC

48 Agenda JDBC API J2EE/DataSources

49 A API JDBC Baseada na ODBC (Microsoft; Open Group CLI) Baseada na ODBC (Microsoft; Open Group CLI) Microsoft: novas APIs (OleDB, ADO, RDO, RDS...) Microsoft: novas APIs (OleDB, ADO, RDO, RDS...) JDBC: evolução compatível + frameworks O/R JDBC: evolução compatível + frameworks O/R Características Características Baixo nível: conexões, statements, cursores, SQL Baixo nível: conexões, statements, cursores, SQL Leve e eficiente Leve e eficiente Infra-estrutura para todas as outras soluções Infra-estrutura para todas as outras soluções

50 JDBC: Connection Representa sessão com o SGBD, e transação Representa sessão com o SGBD, e transação Alto custo de criação. Usar pools! Alto custo de criação. Usar pools! Default: auto-commit, não usar!! Default: auto-commit, não usar!! Connection conn = null; try { conn = DriverManager.getConnection(url, user, password); conn = DriverManager.getConnection(url, user, password); // Utiliza a conexão... // Utiliza a conexão... } catch (SQLException e) { if (conn != null) try { conn.close(); } catch (SQLException e) {} if (conn != null) try { conn.close(); } catch (SQLException e) {}}

51 JDBC: Statement e ResultSet Statement : Query, Update, ou DDL Statement : Query, Update, ou DDL Prefira PreparedStatement sempre! Prefira PreparedStatement sempre! ResultSet : Cursor (resultado de Statement ) ResultSet : Cursor (resultado de Statement ) Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT id,nome FROM FUNC"); while (rs.next()) { System.out.println(rs.getInt(1)); System.out.println(rs.getInt(1)); System.out.println(rs.getString("nome")); System.out.println(rs.getString("nome"));}stmt.close();

52 JDBC: PreparedStatement Estende Statement, mais poderoso e eficiente Estende Statement, mais poderoso e eficiente Binding (?), reduz recompilação e formatação de SQL Binding (?), reduz recompilação e formatação de SQL Cache no cliente (driver JDBC) Cache no cliente (driver JDBC) Também é mais seguro (evita "injeção de SQL") Também é mais seguro (evita "injeção de SQL") PreparedStatement stmt = conn.prepareStatement( "SELECT id,nome FROM FUNC WHERE salario >= ?"); "SELECT id,nome FROM FUNC WHERE salario >= ?"); stmt.setDouble(1, 3000); ResultSet rs = stmt.executeQuery();...stmt.close();

53 JDBC: CallableStatement Invocação de stored procedures / functions Invocação de stored procedures / functions Anti-OO, mas reduz tráfego com SGBD Anti-OO, mas reduz tráfego com SGBD CallableStatement stmt = conn.prepareCall( {call CALCULA_SALARIO (?,?)}"); {call CALCULA_SALARIO (?,?)}"); stmt.setInt(1, idFuncionario); stmt.registerOutParameter(2, Types.DOUBLE); stmt.executeUpdate(); double salario = stmt.getDouble(2); stmt.close();

54 Gerenciamento de Recursos Invocação dos métodos close() Invocação dos métodos close() Connection.close() : fecha todos Statement s e blobs Connection.close() : fecha todos Statement s e blobs Statement.close() : fecha ResultSet corrente Statement.close() : fecha ResultSet corrente Statemet.execute*() : também fecha ResultSet anterior Statemet.execute*() : também fecha ResultSet anterior ResultSet.close() : não fecha seus blobs! ResultSet.close() : não fecha seus blobs! Regra: fechar só o objeto raiz local do método Regra: fechar só o objeto raiz local do método Ex.: Se um método recebe a Connection como parâmetro, basta fechar os Statement criados Ex.: Se um método recebe a Connection como parâmetro, basta fechar os Statement criados Evite dividir responsabilidades (um método cria, outro faz o close() ) bugs, bugs, bugs!! Evite dividir responsabilidades (um método cria, outro faz o close() ) bugs, bugs, bugs!!

55 Opções: Connection TRANSACTION_READ_UNCOMMITTED TRANSACTION_READ_UNCOMMITTED Permite dirty/non-repeatable/phantom reads TRANSACTION_READ_COMMITTED TRANSACTION_READ_COMMITTED Permite non-repeatable/phantom reads TRANSACTION_REPEATABLE_READ TRANSACTION_REPEATABLE_READ Permite phantom reads TRANSACTION_SERIALIZABLE TRANSACTION_SERIALIZABLE Isolamento ACID total DESEMPENHO CONFIABILIDADE CONFIABILIDADE

56 Opções: ResultSet FETCH_FORWARD/REVERSE/UNKNOWN FETCH_FORWARD/REVERSE/UNKNOWN Direção da leitura (hints para o driver) CONCUR_READ_ONLY/UPDATABLE CONCUR_READ_ONLY/UPDATABLE Somente leitura, ou cursor atualizável TYPE_FORWARD_ONLY/ TYPE_FORWARD_ONLY/ SCROLL_SENSITIVE/SCROLL_SENSITIVE SCROLL_SENSITIVE/SCROLL_SENSITIVE Leitura randômica ou aleatória DESEMPENHO PRODUTIVIDADE PRODUTIVIDADE

57 DataSource Abstração sobre obtenção de conexões Abstração sobre obtenção de conexões J2EE, mas também pode ser usada sem container J2EE, mas também pode ser usada sem container Suporte a JNDI, pools, transações distribuídas Suporte a JNDI, pools, transações distribuídas Configuração no container Configuração no container Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/Sistema");... Connection conn = ds.getConnection();

58 Testes Unitários

59 Agenda Testes Unitários Testes Unitários JUnit JUnit

60 Testes Unitários TDD (Test-Driven Development), XP TDD (Test-Driven Development), XP 1 funcionalidade = 1 teste 1 funcionalidade = 1 teste Funcionalidade: método, classe, caso de uso, cenário Funcionalidade: método, classe, caso de uso, cenário Escrever teste antes do código a testar Escrever teste antes do código a testar Objetivos: melhorar qualidade e produtividade Objetivos: melhorar qualidade e produtividade Planejar componentes, do ponto de vista do cliente Planejar componentes, do ponto de vista do cliente Proteção contra bugs de regressão Proteção contra bugs de regressão Otimizações, refactoring... " fearless programming " Otimizações, refactoring... " fearless programming "

61

62

63 JUnit Framework para testes unitários em Java Framework para testes unitários em Java Kent Beck (XP) + Erich Gamma (Patterns, Eclipse) Kent Beck (XP) + Erich Gamma (Patterns, Eclipse) Simples Simples Extensível Extensível Exemplos públicos para examinar... Exemplos públicos para examinar... J2SE/TCK ( testes) J2SE/TCK ( testes) Eclipse (feito com o JUnit) Eclipse (feito com o JUnit)

64

65 public class TestaRaizes extends TestCase { public void test Ok () { public void test Ok () { double[] x = Raizes.calcula(3, 4, 1); // 3x 2 +4x+1=0 double[] x = Raizes.calcula(3, 4, 1); // 3x 2 +4x+1=0 assertTrue (x[0] == -3 && x[1] == -9); assertTrue (x[0] == -3 && x[1] == -9); System.out.println(x[0] + "," + x[1]); System.out.println(x[0] + "," + x[1]); } public void test DeltaNegativo () { public void test DeltaNegativo () { try { try { double[] x = Raizes.calcula(3, 0, 1); // 3x 2 =-1 double[] x = Raizes.calcula(3, 0, 1); // 3x 2 =-1 fail() ; fail() ; } catch (IllegalArgumentException e) {} catch (IllegalArgumentException e) {} }}

66 public class Raizes { public static double[] calcula (double a, double b, double c) { public static double[] calcula (double a, double b, double c) { double delta = Math.sqrt(b*b-4*a*c); double delta = Math.sqrt(b*b-4*a*c); if (Double.isNaN(delta)) throw new if (Double.isNaN(delta)) throw new IllegalArgumentException("Delta negativo"); IllegalArgumentException("Delta negativo"); double x1 = (-b+delta)/2*a; double x1 = (-b+delta)/2*a; double x2 = (-b-delta)/2*a; double x2 = (-b-delta)/2*a; return new double[]{x1,x2}; return new double[]{x1,x2}; }}

67 Servlets

68 Agenda Servlet Servlet Inicialização Inicialização Filtros Filtros Redirecionamento Redirecionamento Sessões Sessões Cookies Cookies

69 Servlet Servlet = Classe Java que responde a HTTP Servlet = Classe Java que responde a HTTP Exige um conector HTTP (webserver) Exige um conector HTTP (webserver) Servlet recebe um request Servlet recebe um request Conector cuida de headers, TCP/IP, etc. Conector cuida de headers, TCP/IP, etc. Base para todo stack Java Web Base para todo stack Java Web JSP, JSTL, JSF, Struts, Velocity, Spring, etc. JSP, JSTL, JSF, Struts, Velocity, Spring, etc.

70

71 public class AloMundo extends HttpServlet { public void doGet (HttpServletRequest req, public void doGet (HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html"); resp.setContentType("text/html"); PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter(); out.println(" "); out.println(" "); out.println(" Alô Mundo "); out.println(" Alô Mundo "); out.println(" "); out.println(" "); out.println(" Alô, Mundo! "); out.println(" Alô, Mundo! "); out.println(" "); out.println(" "); }}

72 Web.xml:AloMundoAloMundo AloMundo/alo

73 Inicialização e Shutdown Servlet.init(), Servlet.destroy() Servlet.init(), Servlet.destroy() init() na primeira invocação, ou load-on-startup=true init() na primeira invocação, ou load-on-startup=true ServletContextListener ServletContextListener Mecanismo apropriado para ciclo de vida da aplicação como um todo Mecanismo apropriado para ciclo de vida da aplicação como um todo

74 public class MeuListener implements ServletContextListener{ public void contextInitialized (ServletContextEvent sce) { System.out.println("inicializando..."); System.out.println("inicializando...");} public void contextDestroyed (ServletContextEvent sce) { System.out.println("terminando..."); System.out.println("terminando...");}}Web.xml: TesteListener TesteListener

75 Filtros Interceptação de requests Interceptação de requests Verificação de desempenho Verificação de desempenho Logging automatizado Logging automatizado Controle de segurança, transações, etc. Controle de segurança, transações, etc. Transformações, ex.: via XSLT Transformações, ex.: via XSLT Implementação de frameworks dinâmicos, ex.: Struts Implementação de frameworks dinâmicos, ex.: Struts Implementação do próprio container Implementação do próprio container

76 public class PSSFilter implements Filter { // Omitidos: init(), destroy() // Omitidos: init(), destroy() public void doFilter (ServletRequest req, ServletResponse resp, public void doFilter (ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { FilterChain chain) throws ServletException, IOException { try { chain.doFilter(req, resp); } try { chain.doFilter(req, resp); } finally { Catalog.closeConnection(); } finally { Catalog.closeConnection(); } }}Web.xml: PSSFilter PSSFilter com.visionnaire.PSS.servlet.PSSFilter com.visionnaire.PSS.servlet.PSSFilter PSSFilter *.jsp PSSFilter *.jsp

77 Forward e Include Forward: Desvio para outra URL Forward: Desvio para outra URL request.get RequestDispatcher ("/Header.jsp"). forward (request, response);. forward (request, response); Include: Cópia do output de uma URL Include: Cópia do output de uma URL request.get RequestDispatcher ("/OK.jsp"). include (request, response);. include (request, response);

78 Contexto, Sessões e Cookies ServletContext : Representa a web-app ServletContext : Representa a web-app MIME, dispatchers, resources, servlets, atributos, log MIME, dispatchers, resources, servlets, atributos, log HttpSession : Permite armazenar informações sobre um cliente, através de várias páginas HttpSession : Permite armazenar informações sobre um cliente, através de várias páginas ID, atributos, criação, último acesso, timeout ID, atributos, criação, último acesso, timeout Cookies ou URL rewriting Cookies ou URL rewriting Cookie : Pacote de dados armazenável no browser Cookie : Pacote de dados armazenável no browser Utiliza headers do HTTP Utiliza headers do HTTP Pode ser restrito pelo cliente (número, tamanho) Pode ser restrito pelo cliente (número, tamanho)

79 JSP

80 Agenda JSP JSP Taglibs Taglibs Expression Language Expression Language JSTL JSTL

81 JSP Servlet: Java com HTML, JSP: HTML com Java Servlet: Java com HTML, JSP: HTML com Java Semelhante a ASP, PHP, etc. Semelhante a ASP, PHP, etc. JSP gera uma Servlet JSP gera uma Servlet Compilado pelo container, em demanda ou deploy Compilado pelo container, em demanda ou deploy Acesso a toda a API de Servlets Acesso a toda a API de Servlets Diretrizes de página Diretrizes de página Scriptlets Scriptlets Ações Ações

82 JSP: Sintaxe Comentário Comentário Expressão Expressão Scriptlet Scriptlet Declaração Declaração Diretiva include Diretiva include Diretiva page Diretiva page language="java", import="pkg" errorPage=" url ", extends=" classe " info=" msg ", contentType=" MIME " buffer=" kb|none ", isErrorPage, session, autoflush, isThreadSafe

83 JSP: Ações Ação include Ação include Ação useBean Ação useBean Ação getProperty Ação getProperty Ação forward Ação forward Ação plugin Ação plugin id=" nome " scope="page|request| session|application" type=" class " class=" class " beanName=" class "

84 JSP: Variáveis predefinidas As mesmas que estariam disponíveis na Servlet As mesmas que estariam disponíveis na Servlet HttpServletRequest request HttpServletRequest request HttpServletResponse response HttpServletResponse response HttpSession session HttpSession session PrintWriter out PrintWriter out Seu host é: Seu host é:

85 Alo, mundo! Agora são Alo, mundo! Agora são

86 Taglibs Declaração e Uso (JSP) Declaração e Uso (JSP) Configuração (web.xml) Configuração (web.xml) /tags/osvaldo /tags/osvaldo /WEB-INF/tags/osvaldo.tld /WEB-INF/tags/osvaldo.tld

87 Taglib Demo Taglib Demo alo alo tags.AloTag tags.AloTag empty empty nome nome true true java.lang.String java.lang.String

88 public class AloTag extends BodyTagSupport { private String nome; private String nome; public void setNome (String nome) { public void setNome (String nome) { this.nome = nome; this.nome = nome; } public int doEndTag () throws JspException { public int doEndTag () throws JspException { try { try { pageContext.getOut().write("Alo, " + nome); pageContext.getOut().write("Alo, " + nome); } catch (IOException e) {} catch (IOException e) {} return SKIP_BODY; return SKIP_BODY; }}

89 EL (Expression Language) Parâmetros de tags; reduz uso de scriptlets Parâmetros de tags; reduz uso de scriptlets Sintaxe: Sintaxe: ${ var } (= var) ${ var } (= var) ${ var.x.y } (= var.getX().getY()) ${ var.x.y } (= var.getX().getY()) Operadores extra; números e strings Operadores extra; números e strings div, mod, and, or, not, eq, ne, lt, gt, le, ge, empty div, mod, and, or, not, eq, ne, lt, gt, le, ge, empty Ex.: ${(10 mod 4 == 5) and empty x} ${(10 % 4 == 5) && x == null} ${(10 % 4 == 5) && x == null}

90 EL (Expression Language) Variáveis predefinidas Variáveis predefinidas pageContext (servletContext, session, request, response) pageContext (servletContext, session, request, response) param, paramValues param, paramValues header, headerValues header, headerValues cookie, initParam cookie, initParam pageScope, requestScope, sessionScope, applicationScope pageScope, requestScope, sessionScope, applicationScope Sintaxe [ ] para acesso a variáveis Map ( get() ) Sintaxe [ ] para acesso a variáveis Map ( get() ) ${header [ "host" ] } ${pageScope.departamentos [ nomeDepto ] }

91 JSTL (JSP Standard TagLib) JSR-52: Biblioteca padrão de tags para JSP JSR-52: Biblioteca padrão de tags para JSP Core: Iteração, Condições, Output… Core: Iteração, Condições, Output… FMT: Formatação, Internacionalização FMT: Formatação, Internacionalização SQL: Acesso a dados via JDBC SQL: Acesso a dados via JDBC XML: Parsing, Xpath, XSLT XML: Parsing, Xpath, XSLT Functions: Manipulação de strings Functions: Manipulação de strings

92 Demo de JSTL Demo de JSTL SELECT * FROM PRODUTO SELECT * FROM PRODUTO Componentes de Hardware Componentes de Hardware

93 JSTL: Core

94 JSTL: Core

95 JSTL: Formatação corpo corpo

96 JSTL: Formatação

97 JSTL: SQL params

98 JSTL: SQL...

99 Mais taglibs... JSTL JSTL XML ( ) XML ( ) Internacionalização ( ) Internacionalização ( ) Funções EL definidas pelo usuário Funções EL definidas pelo usuário JSR-128: JESI, JSP TagLib for Edge Side Includes JSR-128: JESI, JSP TagLib for Edge Side Includes JSR-267: JSP TagLib for Web Services JSR-267: JSP TagLib for Web Services

100 Deployment

101 Agenda Pacotes jar, war, ear Pacotes jar, war, ear Deploy em servidores J2EE Deploy em servidores J2EE

102 Pacotes jar, war, ear JAR: J2SE JAR: J2SE / Classes, Resources / Classes, Resources /META-INF/ Manifest.MF /META-INF/ Manifest.MF WAR: J2EE WAR: J2EE / Páginas (e subdiretórios) / Páginas (e subdiretórios) /WEB-INF Configurações, TLDs /WEB-INF Configurações, TLDs /WEB-INF/classes Classes /WEB-INF/classes Classes /WEB-INF/lib JARs /WEB-INF/lib JARs /WEB-INF/tags tagfiles /WEB-INF/tags tagfiles EAR: J2EE (EJB) EAR: J2EE (EJB)

103

104 Deploy em servidores J2EE "Hot deploy", copiar WAR/EAR para diretório "Hot deploy", copiar WAR/EAR para diretório Tomcat: /webapps Tomcat: /webapps JBoss: server/ config /deploy JBoss: server/ config /deploy DataSources: deploy de.XML DataSources: deploy de.XML Outros (JBoss): Outros (JBoss): RAR (Resource Adapter) RAR (Resource Adapter) SAR (Service) SAR (Service) Deploy "explodido" (opcional / debug) Deploy "explodido" (opcional / debug) Ferramentas GUI de Deploy: overrides Ferramentas GUI de Deploy: overrides

105 Struts

106 Agenda Model (forms) Model (forms) View View Controller (actions) Controller (actions) Configuração Configuração Taglibs Taglibs Tiles Tiles Validação Validação

107 Controller ModelView Requisição Envio de Dados Resposta do Envio de dados Seleção do Visualizador Resposta

108 View Página JSP "amarrada" à Struts Página JSP "amarrada" à Struts Action (Controller) Action (Controller) Campos Form (View) Campos Form (View)

109 Controller Herda Action Herda Action Predefinidas: Tiles, Download, Forward, Include... Predefinidas: Tiles, Download, Forward, Include... Implementar execute() Implementar execute() Uma ou mais actions: request.getParameter("action") Uma ou mais actions: request.getParameter("action") Dispara alguma ação de negócio Dispara alguma ação de negócio Determina próxima página (forward) Determina próxima página (forward) DispatchAction : implementar métodos similares ao execute(), mas com nome igual à da ação DispatchAction : implementar métodos similares ao execute(), mas com nome igual à da ação

110 Configuração WEB-INF/struts-config.xml WEB-INF/struts-config.xml Mapeamento MVC, page flow Mapeamento MVC, page flow WEB-INF/web.xml WEB-INF/web.xml Configuração padrão da Struts, ex.: ActionServlet Configuração padrão da Struts, ex.: ActionServlet WEB-INF/: Outros arquivos da Struts WEB-INF/: Outros arquivos da Struts WEB-INF/lib: Binários da Struts WEB-INF/lib: Binários da Struts WEB-INF/.struts-config.mex: Layout visual para o struts-config.xml (MyEclipse) WEB-INF/.struts-config.mex: Layout visual para o struts-config.xml (MyEclipse)

111

112 public class ContatoForm extends ActionForm { private String nome="", sobrenome="", ="", fone="", warning=""; private String nome="", sobrenome="", ="", fone="", warning=""; public String getNome () { return nome; } public String getNome () { return nome; } public void setNome (String nome) { this.nome = nome; } public void setNome (String nome) { this.nome = nome; } // Omitido: outros getters/setters // Omitido: outros getters/setters public String valida () { public String valida () { if (nome == null || nome.length() == 0) return "nome"; if (nome == null || nome.length() == 0) return "nome"; if (sobrenome == null || sobrenome.length() == 0) return "sobrenome"; if (sobrenome == null || sobrenome.length() == 0) return "sobrenome"; if ( == null || .length() == 0 || if ( == null || .length() == 0 || == -1) return " "; == -1) return " "; if (fone == null || fone.length() == 0) return "fone"; if (fone == null || fone.length() == 0) return "fone"; return null; return null; }}

113 public class MessageBean { private String message = ""; private String message = ""; public String getMessage () { public String getMessage () { return message; return message; } public void setMessage (String message) { public void setMessage (String message) { this.message = message; this.message = message; }}

114 public class AssinaAction extends Action { public ActionForward execute (ActionMapping map, public ActionForward execute (ActionMapping map, ActionForm aForm, HttpServletRequest req, ActionForm aForm, HttpServletRequest req, HttpServletResponse resp) throws Exception { HttpServletResponse resp) throws Exception { ContatoForm form = (ContatoForm)aForm; ContatoForm form = (ContatoForm)aForm; String campoRuim = form.valida(); String campoRuim = form.valida(); if (campoRuim != null) { if (campoRuim != null) { warn(req, campoRuim); warn(req, campoRuim); return map.findForward("valor-errado"); return map.findForward("valor-errado"); } else return map.findForward("sucesso"); else return map.findForward("sucesso"); } protected void warn (HttpServletRequest req, String msg) { protected void warn (HttpServletRequest req, String msg) { MessageBean msgBean = new MessageBean(); MessageBean msgBean = new MessageBean(); msgBean.setMessage(msg); msgBean.setMessage(msg); req.setAttribute("messageBean", msgBean); req.setAttribute("messageBean", msgBean); }}

115 assina.jsp: Assinatura Assinatura Assinatura Digite seus dados de contato para receber nossa Newsletter! Digite seus dados de contato para receber nossa Newsletter!

Nome: Nome: Sobrenome: Sobrenome: Fone: Fone:

116 confirma.jsp: (Usando taglib Struts Beans – NÃO PROGRAMAR ASSIM!!! ) Confirmação

Confirmação

Muito obrigado, prepare seu Inbox para nosso spam! Nome: Nome: Sobrenome: Sobrenome: Fone: Fone:

117 confirma.jsp: (Usando taglib JSTL Core – FAZER DESSA MANEIRA!!! ) Confirmação

Confirmação

Muito obrigado, prepare seu Inbox para nosso spam! Nome: Nome: Sobrenome: Sobrenome: Fone: Fone:

118 valor-errado.jsp: Valor faltando ou incorreto! Valor faltando ou incorreto!

Valor faltando ou incorreto: ! Valor faltando ou incorreto: ! Por favor, Tente novamente.

119 assina2.jsp: Assinatura Assinatura Assinatura Digite seus dados de contato para receber nossa Newsletter! Digite seus dados de contato para receber nossa Newsletter! Campo faltando ou inválido: Campo faltando ou inválido: Nome: Nome: Sobrenome: Sobrenome: Fone: Fone:

120 struts-config.xml:

121 Struts Taglibs Struts inclui várias taglibs: Struts inclui várias taglibs: Bean, Logic (maior parte obsoleta; usar JSTL) Bean, Logic (maior parte obsoleta; usar JSTL) HTML: Gera elementos, útil para forms HTML: Gera elementos, útil para forms Nested: Relacionamentos entre tags (pai/filho) Nested: Relacionamentos entre tags (pai/filho) Utilities: Diversos Utilities: Diversos Tiles Tiles

122 Tiles Taglib da Struts Taglib da Struts Permite compor páginas complexas, juntando fragmentos (tiles) reutilizáveis Permite compor páginas complexas, juntando fragmentos (tiles) reutilizáveis Como, mas mais flexível e estruturado Como, mas mais flexível e estruturado Facilidade de template Facilidade de template Separa estrutura, layout e componentes Separa estrutura, layout e componentes Permite recombinar estes elementos facilmente Permite recombinar estes elementos facilmente

123 Tiles: Preparando Configuração do struts-config.xml: (copiar do struts-blank.war)

124 Tiles: Planejando Comece planejando seu layout "master"... Comece planejando seu layout "master"... Cabeçalho Corpo Menu Rodapé

125 Tiles: Planejando Defina estrutura de página/layout/fragmentos Defina estrutura de página/layout/fragmentos CabeçalhoCorpo Menu Rodapé layout página1página2página3

126 Tiles: Implementando Página (instancia/parametriza o layout) pagina1.jsp:

127 Tiles: Implementando Layout layout.jsp:

128 Tiles: Implementando os Tiles JSPs, HTMLs ou imagens, normais JSPs, HTMLs ou imagens, normais Exemplo: cabecalho.html Exemplo: cabecalho.html

129 Tiles: Usando Definitions Especificação declarativa das páginas Especificação declarativa das páginas Suporta herança de páginas Suporta herança de páginas JSPs de página reduzidas 1 insert JSPs de página reduzidas 1 insert: Ainda mais facilidade para sites dinâmicos JSP pode decidir entre várias definitions

130 Tiles-defs.xml: "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

131 pagina3.jsp layout.jsp (titulo="Página 3") cabecalho.html corpo3.jsp menu.jsp rodape.jsp pagina2.jsp layout.jsp (titulo="Página 2") cabecalho.html corpo2.jsp menu.jsp rodape.jsp pagina1.jsp layout.jsp (titulo="Página 1") cabecalho.html corpo1.jsp menu.jsp rodape.jsp

132 Validação Opções de validação Opções de validação Sem Validator: ad-hoc Sem Validator: ad-hoc Validação Manual (ou semi-automática) Validação Manual (ou semi-automática) Validação Automática Validação Automática Código de validação, onde? Código de validação, onde? Form (e/ou JavaScript): Só regras encapsuláveis no bean; ex.: formato de string; valores mín/máx Form (e/ou JavaScript): Só regras encapsuláveis no bean; ex.: formato de string; valores mín/máx Action: Acesso à lógica de negócio, database, etc. Action: Acesso à lógica de negócio, database, etc.

133 Validação Manual Implementar ActionForm.validate() Implementar ActionForm.validate() public ActionErrors validate ( ActionMapping map, HttpServletRequest req) { ActionMapping map, HttpServletRequest req) { ActionErrors ae = super.validate(map, req); ActionErrors ae = super.validate(map, req); if (ae == null) ae = new ActionErrors(); if (ae == null) ae = new ActionErrors(); if (... ) ae.add("nome", new ActionMessage("contatoForm.nome")); if (... ) ae.add("nome", new ActionMessage("contatoForm.nome")); if (... ) ae.add(" ", new ActionMessage("contatoForm. ")); if (... ) ae.add(" ", new ActionMessage("contatoForm. "));... return ae;... return ae;} Detecte todos os erros, não só o primeiro! Detecte todos os erros, não só o primeiro!

134 struts-config.xml: input="/assina.jsp" validate="true" > parameter="MessageResources" null="false"/>WEB-INF/classes/MessageResources.properties: contatoForm.nome=Nome não pode ser vazio contatoForm. = deve ter formato

135 assina.jsp: Assinatura Assinatura Assinatura Digite seus dados de contato para receber nossa Newsletter! Digite seus dados de contato para receber nossa Newsletter!

Nome: Nome: Sobrenome: Sobrenome: Fone: Fone:

136 public class AssinaAction extends Action { public ActionForward execute (ActionMapping map, public ActionForward execute (ActionMapping map, ActionForm aForm, HttpServletRequest req, ActionForm aForm, HttpServletRequest req, HttpServletResponse resp) throws Exception { HttpServletResponse resp) throws Exception { // Se chegou até aqui, é porque o Struts já // Se chegou até aqui, é porque o Struts já // executou a validação com sucesso! // executou a validação com sucesso! return map.findForward("sucesso"); return map.findForward("sucesso"); }}

137 Validação Automática Validação declarada em arquivo XML Validação declarada em arquivo XML Validação Server-Side (Validator), obrigatória Validação Server-Side (Validator), obrigatória Mais segura, não contornável pelo usuário Mais segura, não contornável pelo usuário Validação Client-Side (JavaScript), opcional Validação Client-Side (JavaScript), opcional Mais eficiente, evita request ao servidor e refresh Mais eficiente, evita request ao servidor e refresh

138 struts-config.xml: className="org.apache.struts.validator.ValidatorPlugIn"> value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/> validator-rules.xml, validation.xml: extraia do struts-blank.war WEB-INF/classes/MessageResources.properties: # Mensagens-padrão (copiar do comentário no validator-rules.xml): errors.required={0} é obrigatório. errors.minlength={0} não pode ter menos que {1} caracteres....

139 validation.xml: mask mask

140 assina.jsp: Assinatura Assinatura Assinatura Digite seus dados de contato para receber nossa Newsletter! Digite seus dados de contato para receber nossa Newsletter!

Nome: Nome: Sobrenome: Sobrenome: Fone: Fone:

141 public class ContatoForm extends ValidatorForm { private String nome=""; private String nome=""; private String sobrenome=""; private String sobrenome=""; private String =""; private String =""; private String fone=""; private String fone=""; public String getNome () { return nome; } public String getNome () { return nome; } public void setNome (String nome) { this.nome = nome; } public void setNome (String nome) { this.nome = nome; } public String getSobrenome () { return sobrenome; } public String getSobrenome () { return sobrenome; } public void setSobrenome (String sn) {this.sobrenome = sn;} public void setSobrenome (String sn) {this.sobrenome = sn;} public String get () { return ; } public String get () { return ; } public void set (String ) { this. = ; } public void set (String ) { this. = ; } public String getFone () { return fone; } public String getFone () { return fone; } public void setFone (String nome) { this.fone = fone; } public void setFone (String nome) { this.fone = fone; } } // Nenhum código de validação!

142 Validação no Servidor

143 Validação no Cliente

144 Validação: Capacidades Validações predefinidas: Validações predefinidas: required, requiredif, validwhen, minlength, maxlength mask, creditCard, , url integer, float, double, long, short, byte, date intRange, longRange, floatRange, doubleRange Definições globais (constantes) Definições globais (constantes) Validadores plugáveis Validadores plugáveis Validação Híbrida (Manual + Automática) Validação Híbrida (Manual + Automática)

145 Visionnaire Informática S.A. R. Eng Roberto Fischer, 228 CIC - Curitiba - PR Tel: (41) Muito Obrigado


Carregar ppt "Desenvolvimento Java para Web Osvaldo Pinali Doederlein Visionnaire."

Apresentações semelhantes


Anúncios Google