FERRAMENTA PARA CONVERSÃO DE INTERFACES JAVA SWING EM HTML E JAVASCRIPT
|
|
|
- Débora Bergler Lameira
- 10 Há anos
- Visualizações:
Transcrição
1 UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIAS DA COMPUTAÇÃO BACHARELADO FERRAMENTA PARA CONVERSÃO DE INTERFACES JAVA SWING EM HTML E JAVASCRIPT MARCIELE FERNANDA SEVERO BLUMENAU /2-14
2 MARCIELE FERNANDA SEVERO FERRAMENTA PARA CONVERSÃO DE INTERFACES JAVA SWING EM HTML E JAVASCRIPT Trabalho de Conclusão de Curso submetido à Universidade Regional de Blumenau para a obtenção dos créditos na disciplina Trabalho de Conclusão de Curso II do curso de Ciências da Computação Bacharelado. Profa. Joyce Martins, Mestre - Orientadora BLUMENAU /2-14
3 FERRAMENTA PARA CONVERSÃO DE INTERFACES JAVA SWING EM HTML E JAVASCRIPT Por MARCIELE FERNANDA SEVERO Trabalho aprovado para obtenção dos créditos na disciplina de Trabalho de Conclusão de Curso II, pela banca examinadora formada por: Presidente: Membro: Membro: Prof. Joyce Martins, Mestre Orientadora, FURB Prof. Marcel Hugo, Mestre FURB Prof. Adilson Vahldick, Mestre FURB Blumenau, 11 de fevereiro de 2009
4 Dedico este trabalho aos amigos que me ajudaram diretamente na realização deste e a minha família que sempre me deu apoio.
5 AGRADECIMENTOS A Deus, pelo seu imenso amor e graça. À minha família, que sempre me deu apoio. Aos meus amigos, pelos empurrões e cobranças. À minha orientadora, Joyce Martins, pela excelente orientação.
6 O sucesso geralmente vem para aqueles que estão muito ocupados para estarem procurando por ele. Henry David Thoreau
7 RESUMO Este trabalho apresenta o desenvolvimento de uma ferramenta para conversão de componentes de interfaces Java Swing em componentes equivalentes em HTML. A ferramenta converte, dentre todos os componentes existentes, apenas os 14 mais utilizados. Também são convertidos alguns tratadores de eventos para JavaScript. Tem-se como entrada da ferramenta um arquivo de código fonte Java, contendo todas as informações necessárias para a conversão em HTML e JavaScript. No desenvolvimento da ferramenta utilizou-se análises léxica, sintática e semântica para identificação dos tokens, das estruturas sintáticas e das informações que devem ser extraídas para geração do código de saída. A saída é gerada a partir de templates, interpretados pelo motor de templates Velocity. Palavras-chave: Java Swing. HTML. Templates. JavaScript.
8 ABSTRACT This work presents the development of the tool for conversion of components of interfaces Java Swing in components equivalents in HTML. The tool does not convert all the existing components, only the most used ones. It is also converted some events handling for JavaScript. It has as an entrance of tool a file with extension.java, containing all the necessary information for the conversion in HTML and JavaScript. In the development of the tool it was used lexica, syntactic and semantic analysis for identification of the tokens, of the syntactic structures and of the informations that must be extracted to generates the exiting code. The exit is generated of templates, interpreted by the engine of templates Velocity. Keywords: Java Swing. HTML. Templates. JavaScript.
9 LISTA DE ILUSTRAÇÕES Quadro 1 Código fonte Java...17 Figura 1 Exemplo de interface...18 Quadro 2 Código HTML...19 Figura 2 Exemplo de interface...20 Quadro 3 Elementos da linguagem de templates Velocity...22 Quadro 4 Exemplo de template Velocity com diretiva (#parse)...22 Quadro 5 Exemplo de template Velocity (templatejbutton.vm)...23 Quadro 6 Exemplo de criação e inicialização do Velocity...23 Quadro 7 Exemplo de criação de contexto...23 Quadro 8 Exemplo de definição do template a ser utilizado...23 Quadro 9 Exemplo de passagem de valores às variáveis...23 Quadro 10 Exemplo de uso do método merge...23 Figura 3 Ferramenta AjaxSwing...24 Figura 4 Interface Java...25 Figura 5 Interface convertida pela ferramenta AjaxSwing...25 Figura 6 Ferramenta DelphiToWeb...26 Figura 7 Interface gerada pela ferramenta DelphiToWeb...27 Figura 8 Interface.DFM...27 Figura 9 Ferramenta Converte Forms...28 Figura 10 Interface Oracle Forms...28 Figura 11 Interface convertida pela ferramenta Converte Forms...29 Quadro 11- Requisitos funcionais...31 Quadro 12 Requisitos não funcionais...31 Quadro 13 Componentes de interface...31 Quadro 14 Tratadores de eventos...32 Quadro 15 Mapeamento eventos Java X eventos JavaScript...32 Quadro 16 Mapeamento componentes de interface Java Swing X componentes de interface HTML...33 Figura 12 Diagrama de casos de uso...34 Quadro 17 Detalhamento do caso de uso UC01 - Especificar arquivo...34 Quadro 18 Detalhamento do caso de uso UC02 - Especificar template...35
10 Quadro 19 Detalhamento do caso de uso UC03 - Converter código...35 F igura 13 Diagrama de classes para componentes de interface Java Swing...36 Figura 14 Diagrama de classes para geração de código...37 Figura 15 Diagrama de seqüência do caso de uso Converter código...38 Quadro 20 Conversão de código...40 Figura 16 Tela da ferramenta SwingToHtml...41 Figura 17 Seleção de arquivo.java...42 Figura 18 Arquivos.java selecionados...42 Figura 19 Seleção de template...43 Figura 20 Conversão de arquivos...43 Figura 21 Tela Sobre a ferramenta SwingToHtml...44 Figura 22 Interface Java Swing...44 Figura 23 Interface HTML...44 Figura 24 Interface da calculadora em Java Swing...45 Figura 25 Interface da Calculadora em HTML...45 Quadro 21 Eventos em.java...45 Quadro 22 Eventos em JavaScript...46 Quadro 23 Template utilizado na conversão da calculadora...47 Quadro 24 Template templatejbutton.vm...47 Quadro 25 Comparação SwingToHtml X trabalhos correlatos...48 Quadro 26 Código Java: Calculadora...57 Quadro 27 Código HTML e JavaScript gerado: Calculadora...60 Quadro 28 Atributos e métodos...63 Quadro 29 Métodos...66 Quadro 30 Template com todos os componentes...69 Quadro 31 Gramática do Java
11 LISTA DE SIGLAS API Application Programming Interface AJAX Asynchronous JavaScript And XML AWT Abstract Windowing Toolkit BNF Backus-Naur Form CSS Cascading Style Sheets EA Enterprise Architect HTML HyperText Markup Language JSP Java Server Pages LGPL Lesser General Public License MVC Model-View-Controller PL/SQL Procedural Language / Structured Query Language UML Unified Modeling Language VTL Velocity Template Language XML extensible Markup Language
12 SUMÁRIO 1 INTRODUÇÃO OBJETIVOS DO TRABALHO ESTRUTURA DO TRABALHO FUNDAMENTAÇÃO TEÓRICA GERADORES DE CÓDIGO COMPONENTES DE INTERFACE E TRATADORES DE EVENTO EM JAVA HTML E JAVASCRIPT MOTOR DE TEMPLATES VELOCITY TRABALHOS CORRELATOS AjaxSwing DelphiToWeb Converte Forms DESENVOLVIMENTO REQUISITOS PRINCIPAIS DO PROBLEMA A SER TRABALHADO COMPONENTES DE INTERFACE E EVENTOS CONVERTIDOS CÓDIGO DE SAÍDA ANÁLISE DO CÓDIGO DE ENTRADA ESPECIFICAÇÃO Casos de uso Diagrama de classes Diagrama de seqüência IMPLEMENTAÇÃO Técnicas e ferramentas utilizadas Implementação da ferramenta Operacionalidade da implementação RESULTADOS E DISCUSSÃO CONCLUSÕES EXTENSÕES...51 REFERÊNCIAS BIBLIOGRÁFICAS...52 APÊNDICE A Código de entrada e saída: Calculadora...54 APÊNDICE B Atributos e métodos...61
13 APÊNDICE C Template com todos os componentes...67 ANEXO A Gramática do Java
14 13 1 INTRODUÇÃO A dependência das informações torna o uso dos sistemas de informação essencial para a sobrevivência das organizações, que ultimamente, conforme afirma Souza (2005, p. 10), têm demanda por sistemas para web. Uma das vantagens oferecidas pelas aplicações web reside no fato de não exigir a instalação da aplicação nas estações de trabalho dos usuários, que necessitam apenas de um navegador. Como as aplicações são instaladas em um servidor, o desenvolvimento, a manutenção e a atualização são centralizados (MACORATTI, 2006). Além da demanda pelo desenvolvimento de sistemas computacionais para web, as empresas ainda possuem várias aplicações que foram desenvolvidas para desktop (SOUZA, 2005, p. 10), que não aproveitam a infra estrutura de comunicação da web e, às vezes, não têm interface gráfica. Isso tem levado as empresas de software a migrarem seus sistemas desktop utilizando tradutores ou geradores automáticos de código. Conforme Sommerville (2003, p. 536), o meio mais simples de proceder à reengenharia de software é a tradução do programa, quando o código-fonte em uma linguagem de programação é automaticamente traduzido para o código-fonte em uma outra linguagem. Sommerville (2003, p. 536) afirma ainda que a estrutura e a organização do programa em si permanecem inalteradas, sendo que a linguagem-alvo pode ser uma versão atualizada da linguagem original ou pode ser uma tradução para uma linguagem completamente diferente. Levando em consideração o custo exigido para migrar uma aplicação, a falta de profissionais e a falta de padrões na codificação dos sistemas, o que muitas vezes produz códigos ilegíveis, o uso de uma ferramenta automática para migração de sistemas tem se tornado uma alternativa para economia de tempo e dinheiro. Conforme observa Soares Filho (2003), estas ferramentas não fazem 100% do trabalho automaticamente, mas conseguem traduzir de 80% a 90% da antiga plataforma, restando aos programadores um trabalho de adaptação que representa 10% a 20% do total do código. Diante do exposto, propõe-se o desenvolvimento de uma ferramenta que auxilie a conversão de interfaces de aplicações desenvolvidas em Java para páginas HTML. A ferramenta proposta deverá também converter tratamentos de eventos de interface para a linguagem JavaScript.
15 OBJETIVOS DO TRABALHO O objetivo principal deste trabalho é construir uma ferramenta para conversão de interfaces de aplicações Java Swing em páginas HTML e eventos para JavaScript e JSP. Os objetivos específicos do trabalho são: a) converter alguns componentes de interface Swing, tais como JFrame, JPanel, JLabel, JButton, JTextField, JTextArea, JList, JComboBox, JCheckBox, JRadioButton, JMenu, JMenuItem, JMenuBar e JTabbedPane, mantendo o layout original; b) converter tratamentos de eventos de interface; c) utilizar templates para configurar o formato do código de saída; d) analisar o grau de compatibilidade entre o código gerado e o código de entrada da ferramenta. 1.2 ESTRUTURA DO TRABALHO Este trabalho está estruturado em 4 capítulos. O próximo capítulo apresenta a fundamentação teórica, contextualizando os temas abordados no desenvolvimento do trabalho, tais como: geradores de código, componentes de interface e tratadores de evento em Java, HTML e JavaScript, motor de templates Velocity e trabalhos correlatos. No terceiro capítulo é apresentado o desenvolvimento da ferramenta, contendo desde a especificação até a operacionalidade. O último capítulo traz os resultados alcançados com o desenvolvimento do trabalho, bem como sugestões de extensões para a ferramenta.
16 15 2 FUNDAMENTAÇÃO TEÓRICA Neste capítulo são apresentados aspectos teóricos relacionados ao trabalho. Trata de geradores de código e as etapas para o seu desenvolvimento. Na seqüência apresenta componentes de interfaces e tratamento de eventos em Java, que constituem a entrada para a ferramenta desenvolvida. Aborda ainda HTML e JavaScript, saída do gerador de código, bem como o motor de templates Velocity, utilizado para configurar a saída. Por último, relata as principais características dos trabalhos correlatos, os quais constituem a base para a criação da ferramenta desenvolvida. 2.1 GERADORES DE CÓDIGO Geradores de código são ferramentas que a partir de uma entrada geram os arquivos fontes para uma determinada aplicação. Podem ser desde simples formatadores de código até ferramentas que geram aplicações complexas a partir de modelos abstratos, auxiliando no processo de desenvolvimento de software e proporcionando ganhos de produtividade e redução de tempo e de custos. Durante muito tempo, ainda, vamos ter programadores escrevendo código fonte. Mas não há dúvida de que uma parte cada vez maior da tarefa a parte menos criativa e mais repetitiva - será construída de forma automática a partir da especificação, por um ou mais tipos de geradores. Os programadores terão que subir degraus na escada da competência e trabalhar em problemas mais abstratos do que as declarações de variáveis e trechos de código que são obrigados a repetir dia após dia, hoje. (MEIRA, 2004). Para facilitar o desenvolvimento de geradores de código, Herrington (2003, p. 77) sugere que as seguintes etapas devem ser seguidas: a) construir o código de saída: deve-se construir o código de saída manualmente, para determinar o que e como deve ser a saída do gerador. Esta etapa facilita a visualização do que deve ser extraído dos arquivos de entrada; b) projetar o gerador: deve-se determinar qual será o formato de entrada, como a entrada será analisada e como o código de saída será gerado, usando templates ou simplesmente escrevendo o código; c) analisar a entrada: deve-se implementar o código para ler o arquivo de entrada e
17 16 extrair as informações necessárias para construir a saída; d) especificar templates: uma vez que a análise da entrada está definida, o próximo passo é criar os templates que serão utilizados para gerar a saída; e) gerar a saída: este é o último passo, onde deve ser implementada a geração de código utilizando os templates especificados na etapa anterior. Para a realização da etapa (c), conforme afirma Schvepe (2006, p. 20), podem ser usados analisadores léxico, sintático e semântico. O analisador léxico tem como objetivo identificar seqüências de caracteres que formam as unidades léxicas (tokens). Para tanto, lê o programa fonte da esquerda para a direita, caractere a caractere, verificando se os caracteres lidos fazem parte da linguagem, identificando os tokens e enviando-os para o analisador sintático. Esse recebe os tokens e agrupa-os em frases gramaticais, que são usadas pelo compilador para sintetizar a saída. Já o analisador semântico tem a função de verificar o significado da estrutura hierárquica determinada pela fase de análise sintática. 2.2 COMPONENTES DE INTERFACE E TRATADORES DE EVENTO EM JAVA Java é uma linguagem de programação orientada a objeto com sintaxe similar à da linguagem C++, independente de plataforma, que foi anunciada formalmente pela Sun em 1995 (DEITEL; DEITEL, 2003, p. 59). Java fornece um extenso conjunto de bibliotecas, conhecidas também como API. Para a implementação das interfaces gráficas podem ser usadas duas APIs: AWT e Swing. Nas primeiras versões da linguagem Java, segundo Steil (2006a), a única forma de desenvolver interfaces gráficas era através da AWT, uma biblioteca de baixo nível que depende do código nativo da plataforma onde a aplicação roda. Isso traz alguns problemas de compatibilidade entre as plataformas, sendo que nem sempre a aplicação tem a mesma aparência em todos os sistemas operacionais. Apesar da AWT ainda estar disponível no Java, recomenda-se que seja usado o Swing. Ao contrário da AWT, o Swing fornece componentes de mais alto nível, possibilitando assim uma melhor compatibilidade entre os vários sistemas operacionais onde as aplicações Java são executadas. Deitel e Deitel (2003, p. 606) afirmam que os componentes Swing são inteiramente escritos em Java, não contendo uma única linha de código nativo. Além disso, é possível fornecer uma aparência e um comportamento particular para cada plataforma onde a
18 17 aplicação será executada, ou seja, a interface é configurável. No quadro 1 é apresentado o código Java correspondente a uma interface (figura 1) com componentes Swing: JFrame, janela principal da aplicação; JPanel, painel onde são colocados os demais componentes da interface; JButton, botão que aciona o evento associado, quando for pressionado. public class Exemplo extends JFrame { private JPanel jcontentpane = null; private JPanel jpanel = null; private JButton jbutton = null; public Exemplo() { super(); initialize(); private void initialize() { this.setsize(200, 65); this.setcontentpane(getjcontentpane()); this.settitle("jframe"); private javax.swing.jpanel getjcontentpane() { if (jcontentpane == null) { jcontentpane = new JPanel(); jcontentpane.setlayout(new BoxLayout(jContentPane, BoxLayout.Y_AXIS)); jcontentpane.add(getjpanel(), null); return jcontentpane; private JPanel getjpanel() { if (jpanel == null) { jpanel = new JPanel(); jpanel.add(getjbutton(), null); return jpanel; private JButton getjbutton() { if (jbutton == null) { jbutton = new JButton(); jbutton.setpreferredsize(new Dimension(66, 26)); jbutton.settext("teste"); jbutton.addmouselistener(new MouseListener(){ public void mouseclicked(mouseevent e){ public void mouseentered(mouseevent e){ public void mouseexited(mouseevent e){ public void mousepressed(mouseevent e){ jbutton.settext("ok"); public void mousereleased(mouseevent e){ ); return jbutton; public static void main(string[] args) { Exemplo e = new Exemplo(); e.setlocationrelativeto(null); e.setdefaultcloseoperation(exemplo.exit_on_close); e.setvisible(true); Quadro 1 Código fonte Java
19 18 Figura 1 Exemplo de interface Segundo Cohen (2008, p. 2), a interface gráfica em Java é orientada a eventos. Cada componente de interface tem seu conjunto específico de eventos. Assim, cada vez que um usuário clica em um botão, seleciona um item em uma lista ou pressiona uma tecla, o sistema operacional gera um evento. Quando a aplicação está interessada em determinado evento, solicita ao sistema operacional que escute o evento. Para isso faz uso de listeners (tratadores de eventos), que nada mais são do que classes que tratam eventos. Assim, segundo Deitel e Deitel (2003, p. 611), o mecanismo de tratamento de eventos em Java é formado por três partes: a) o objeto origem, isto é, o componente de interface que gerou o evento; b) o evento propriamente dito, ou seja, um objeto que encapsula as informações necessárias para processar o evento gerado; c) o objeto ouvinte (listener), ou seja, o objeto que é notificado pelo objeto origem quando ocorre um evento e que usa a informação da notificação para responder ao evento. Para um programa estar preparado para processar eventos, precisa realizar duas tarefas: registrar o listener para cada componente de interface e implementar um método de tratamento de evento. Cada listener implementa uma ou mais interfaces listeners dos pacotes java.awt.event e javax.swing.event (DEITEL; DEITEL, 2003, p. 611). Java oferece 5 tipos básicos de tratadores de eventos: WindowListener, MouseListener, MouseMotionListener, ActionListener e KeyListener. Para cada um, Java oferece uma classe ou interface que pode ser utilizada na implementação das aplicações para tratar eventos. Cada um deles possui uma série de diferentes métodos para tratar eventos específicos, sendo que o programador deve implementar apenas os métodos correspondentes ao evento que deseja tratar. 2.3 HTML E JAVASCRIPT HTML é uma linguagem de marcação utilizada para compor documentos, formatando
20 19 texto e criando ligações entre páginas web. As páginas HTML podem ser interpretadas por um navegador ou um browser (HTML, 2008), sendo que a estrutura de um documento HTML está baseada no uso de tags, normalmente definidas em pares, que delimitam o texto que sofrerá algum tipo de formatação. A estrutura básica de um documento HTML deve conter as seguintes tags (HTML, 2008): <html> e </html>, que define, respectivamente, o início e fim do documento; <head> e </head>, <body> e </body>, que delimitam, respectivamente, o cabeçalho e o conteúdo principal do documento. No quadro 2 é apresentado o código HTML de uma página (figura 2) com componentes equivalentes àqueles da figura 1. <HTML> <HEAD> <TITLE> JFrame </TITLE> </HEAD> <BODY> <script> function mousepressedjbutton(){ document.exemplo.jbutton.value='ok' </script> <fieldset name= jcontentpane style="position: absolute; font-family: dialog; font-size: 12; color: #000000; background-color: #CCCCCC; left: 0; top: 0; width: 200; height: 50;"> <form name= Exemplo> <fieldset name = jpanel style="position: absolute; font-family: dialog; font-size: 12; width: 200; height: 20; border: 0; left: 0; top: 0; text-align="> <button name = jbutton id = idjbutton style="position: relative; font-fmily: dialog; font-size: 12; width: 66; height: 26; left: 64; top: 0;" onclick=mousepressedjbutton()> Teste </button> </fieldset> </form> </fieldset> </BODY> </HTML> Quadro 2 Código HTML
21 20 Figura 2 Exemplo de interface Páginas HTML são estáticas e, por este motivo, são limitadas para o desenvolvimento de aplicações web. Para criação de páginas dinâmicas surgiram várias linguagens, como por exemplo Java, através da tecnologia dos Applets, que segundo Deitel e Deitel (2003, p.136) são programas Java que podem ser embutidos dentro de documentos HTML(Deitel e Deitel, 2003). Também foi desenvolvida, pela Netscape, uma linguagem de programação chamada LiveScript, que permitia criar pequenos programas nas páginas HTML. Antes de lançar a primeira versão da LiveScript, a Netscape fez uma aliança com a Sun Microsystems para desenvolver em conjunto essa nova linguagem. Dessa aliança originou-se o JavaScript (CRIARWEB, 2004). JavaScript é uma linguagem que permite a programação de scripts orientados a objetos, com estruturas de dados complexas, permitindo controlar cada evento que ocorre nas páginas HTML. De acordo com Alvarez (2008), entre as ações típicas que podem ser realizadas em JavaScript, existem dois tipos: os efeitos especiais sobre páginas web para criar conteúdos dinâmicos e elementos da página que tenham movimento; e as instruções executadas como resposta às ações do usuário, com as quais podem-se criar páginas interativas com programas como calculadoras, agendas ou tabelas de cálculo. Para programar em JavaScript não é necessário um kit de desenvolvimento, nem tão pouco a compilação dos scripts ou a implementação dos mesmos em arquivos externos ao código HTML, como ocorreria com os Applets. 2.4 MOTOR DE TEMPLATES VELOCITY Conforme sugerido por Herrington (2003, p. 77) e já citado neste trabalho, uma das etapas para geração de código envolve a especificação de templates. O uso de templates na
22 21 camada de apresentação de aplicações web simplifica a manutenção (SILVEIRA, 2008). Segundo Rocha (2005), templates são mecanismos de software que visam possibilitar a separação entre código dinâmico e código de interface de forma que a construção desses possa ocorrer de forma independente no desenvolvimento de aplicações. Templates são arquivos que contêm variáveis e blocos especiais que são dinamicamente transformados a partir de dados enviados pelo motor de templates. Para tanto, deve existir um programa responsável por instanciar o motor, associando valores às variáveis e aos blocos especiais do template. Várias aplicações podem utilizar motores de templates, desde a geração de um simples arquivo texto à criação de arquivos binários, tendo como restrição seguir um determinado padrão de formatação. Usar templates, segundo Silveira (2008), melhora a divisão de tarefas, pois os programadores ficam concentrados na lógica do sistema e os designers se preocupam apenas com o layout, o que reduz o risco de alterarem indevidamente o código da aplicação. Além disso, os templates ficam em arquivos separados, possibilitando mudar o visual da aplicação sem a necessidade de re-compilar ou reiniciar o sistema. Existem ferramentas disponíveis no mercado que fazem uso de motores de templates: uma delas é a ferramenta Poseidon for UML (SILVEIRA, 2008), desenvolvida em Java, utiliza templates para a geração de código a partir de diagramas UML; a outra é o Velocity, também desenvolvido em Java, é um subprojeto do projeto Jakarta, da Apache Foundation. Para desenvolvimento da ferramenta proposta optou-se pela utilização do motor de templates Velocity, o qual contém algumas diretivas bastante simples de serem usadas para escrever documentos. Projetado para ser uma ferramenta de fácil utilização e que servisse como ferramenta genérica de templates, o Velocity é ideal em qualquer tipo de programa Java que necessite de formatação de dados e apresentação dos mesmos. Segundo Steil (2006b), algumas das razões para usá-lo são: tem sintaxe clara e fácil de entender; integra-se fácil a qualquer tipo de aplicação baseada em Java; não é restrito à internet; podendo ser usado em qualquer área. Quando se utiliza templates para a geração de código, em algum momento deve-se processar o template, ou seja, deve-se desenvolver código para que algumas partes do template sejam substituídas por dados extraídos pela aplicação. Para escrever um template, além de variáveis, utiliza-se algumas diretivas ou comandos, usando uma pequena linguagem que o template deve respeitar. Em Velocity, existe a VTL, que é a linguagem utilizada para incorporar conteúdo dinâmico no template. Toda diretiva é precedida pelo caracter #. No quadro 3, são apresentadas as diretivas mais utilizadas e nos quadros 4 e 5 tem-se exemplos
23 22 de templates Velocity que podem ser utilizados para gerar o código apresentado no quadro 2. DIRETIVA #set #foreach #if #else #elseif #include #parse DESCRIÇÃO atribuição de valor à variável comando de repetição comando condicional comando condicional comando condicional inclusão de texto estático no template comando usado para interpretar o código (estático e dinâmico) contido em outro arquivo, permitindo construir templates em partes Quadro 3 Elementos da linguagem de templates Velocity <HTML> <HEAD> <TITLE> $!{JFrameGetTitle </TITLE> </HEAD> <BODY> $!{funcjavascript <fieldset name= $!{jcontentpanelgetname style="position: absolute; font-family: $!{jcontentpanelgetfont; font-size: $!{jcontentpanelgetfontsize; color: $!{jcontentpanelgetfontcolor; background-color: $!{jcontentpanelgetbackgroudcolor; left: $!{jcontentpanelgetpositionleft; top: $!{jcontentpanelgetpositiontop; width: $!{jcontentpanelgetwidth; height: $!{jcontentpanelgetheight;"> <form name= $!{JFrameGetName> #foreach ($ComponentJPanel in $arrayjpanel) <fieldset name= $!{ComponentJPanel.getName() style="position: absolute; font-family: $!{ComponentJPanel.getFontFamily(); font-size: $!{ComponentJPanel.getFontSize(); width: $!{ComponentJPanel.getSizeWidth(); height: $!{ComponentJPanel.getSizeHeight(); border: 0; left: $!{ComponentJPanel.getPositionLeft(); top: $!{ComponentJPanel.getPositionTop(); text-align= $!{style"> #if ($!{ComponentJPanel.getChildrenComponents().size() > 0) #foreach ($Component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JButton") #parse("templatejbutton.vm") </fieldset> </form> </fieldset> </BODY> </HTML> Quadro 4 Exemplo de template Velocity com diretiva (#parse)
24 23 <button name= $!{Component.getName() id= id$!{component.getname() style="position: relative; font-family: $!{Component.getFontFamily(); font-size: $!{Component.getFontSize(); width: $!{Component.getSizeWidth(); height: $!{Component.getSizeHeight(); left: $!{Component.getPositionLeft(); top: $!{Component.getPositionTop();" $!{Component.getFunctionJavaScript().getMethod()> $!{Component.getText() </button> Quadro 5 Exemplo de template Velocity (templatejbutton.vm) Depois de escrito o template, deve-se escrever o código que irá ler e processar o template. Para escrever este código, segundo Steil (2006b), alguns passos devem ser seguidos: a) cria-se e inicializa-se o Velocity (quadro 6); b) cria-se o contexto que liga o código Java ao template (quadro 7); c) define-se o template a ser usado (quadro 8); d) informa-se os valores a serem passados às variáveis do template (quadro 9); e) usa-se o método merge para substituir o código dinâmico do template (quadro 10). VelocityEngine ve = new VelocityEngine(); ve.init(); Quadro 6 Exemplo de criação e inicialização do Velocity VelocityContext context = new VelocityContext(); Quadro 7 Exemplo de criação de contexto Template templateve = ve.gettemplate("exemplo.vm"); Quadro 8 Exemplo de definição do template a ser utilizado context.put("jframegettitle", recclass.gettitle()); Quadro 9 Exemplo de passagem de valores às variáveis StringWriter writer = new StringWriter(); templateve.merge(context, writer); Quadro 10 Exemplo de uso do método merge 2.5 TRABALHOS CORRELATOS Existem aplicações com funcionalidades semelhantes às da ferramenta proposta neste trabalho: AjaxSwing, DelphiToWeb e Converte Forms. Mesmo desempenhando um papel semelhante, cada uma delas possui particularidades, descritas a seguir.
25 AjaxSwing AjaxSwing, segundo CreamTec (2008), é uma ferramenta que converte aplicações Java (Swing ou AWT) em HTML e AJAX. Vem sendo utilizada por várias empresas desde A conversão envolve a instalação da ferramenta e criação de um arquivo de configuração para a aplicação a ser convertida. Algumas das principais características da ferramenta são (CREAMTEC, 2008): a) conversão de aplicações Java em HTML com o mínimo de modificações; b) não é necessário conhecimento de HTML, CSS ou JavaScript para usar a ferramenta; c) suporte a HTML 4.0, CSS2 e JavaScript 1.2; d) conversão de aplicações para Internet Explorer 4 ou superior, FireFox 1.2 ou superior; e) customização das páginas HTML geradas (configuração de cores, fontes, estilos); f) suporte à internacionalização. Na figura 3 é apresentada a tela principal da ferramenta, a figura 4 apresenta uma interface Java e a figura 5 apresenta a mesma interface Java convertida em HTML pela ferramenta AjaxSwing. Fonte: CreamTec (2008). Figura 3 Ferramenta AjaxSwing
26 25 Fonte: CreamTec (2008). Figura 4 Interface Java Fonte: CreamTec (2008). Figura 5 Interface convertida pela ferramenta AjaxSwing
27 DelphiToWeb DelphiToWeb é uma ferramenta para converter formulários Delphi em páginas HTML (SOUZA, 2005). A ferramenta pode ser usada para gerar código da camada de interface de uma aplicação web a partir de uma aplicação desenvolvida em Delphi, sendo o resultado da conversão páginas HTML ou arquivos.lzx. Outra opção da ferramenta é a geração de uma representação intermediária em arquivos XML, contendo os dados dos formulários Delphi (SOUZA, 2005, p. 57). A entrada do gerador são arquivos com extensão.dfm, contendo as propriedades dos componentes de interface para construir código com as funcionalidades para a camada de interface de uma aplicação web. A análise dos arquivos de entrada foi feita utilizando analisadores de linguagens (léxico, sintático e semântico) e a formatação do código de saída a ser gerado está embutida no código da ferramenta, já que não foram utilizados templates. Na figura 6 é apresentada a tela da ferramenta DelphiToWeb e, em seguida, na figura 7 a interface gerada em HTML, a partir do arquivo.dfm apresentado na figura 8. Fonte: Souza (2005, p. 54). Figura 6 Ferramenta DelphiToWeb
28 27 Fonte: Souza (2005, p. 59). Figura 7 Interface gerada pela ferramenta DelphiToWeb Fonte: Souza (2005, p. 58). Figura 8 Interface.DFM Converte Forms Converte Forms é, segundo Schvepe (2006, p. 13), uma ferramenta para geração de código que permite automatizar parte do processo de migração de aplicações desenvolvidas em Oracle Forms 6i para aplicações desktop em Java. A entrada do gerador são arquivos do Oracle Forms 6i, enquanto a saída são classes Java. Observa-se que a ferramenta traduz apenas as construções procedurais do código PL/SQL, converte 18 componentes de interface e faz o mapeamento de 28 eventos de controle dos componentes de interface para eventos
29 28 Java. Desenvolvida em C++, a ferramenta utiliza analisadores de linguagens na análise dos arquivos de entrada e o motor de templates enitl para geração do código de saída. Na figura 9 é apresentada a tela principal da ferramenta, a figura 10 apresenta uma interface em Oracle Forms a ser convertida para Java (figura 11). Fonte: Schvepe (2006, p. 61). Figura 9 Ferramenta Converte Forms Fonte: Schvepe (2006, p. 63). Figura 10 Interface Oracle Forms
30 Fonte: Schvepe (2006, p. 64). Figura 11 Interface convertida pela ferramenta Converte Forms 29
31 30 3 DESENVOLVIMENTO Este capítulo contextualiza e descreve o desenvolvimento da ferramenta proposta, denominada SwingToHtml. Foram realizadas as seguintes etapas: a) elicitação dos requisitos: foram reavaliados e detalhados os requisitos funcionais e não funcionais da ferramenta inicialmente identificados; b) identificação do código a ser convertido: fez-se necessário analisar componentes de interface Java Swing, identificando as propriedades daqueles que serão traduzidos. Também foi necessário analisar o tratamento de eventos de interface para determinar quais eventos serão convertidos; c) definição do código de saída da ferramenta: foram desenvolvidos manualmente páginas HTML e scripts JavaScript com componentes de interface e tratadores de eventos equivalentes aos identificados na etapa anterior, para definir o mapeamento entre o código de saída e o código de entrada da ferramenta; d) definição da análise do código de entrada: estudou-se a estrutura da BNF do Java a fim de definir como serão extraídas, do código de entrada, as informações necessárias para gerar a saída; e) especificação dos templates: foram elaborados os templates Velocity utilizados para gerar o código de saída; f) especificação da ferramenta: foi especificada com análise orientada a objeto utilizando a UML. Com a ferramenta EA foram desenvolvidos dos diagramas de casos de uso, de classes e de seqüência; g) implementação: para ler e recuperar as informações dos arquivos de entrada (.java), foram utilizados os analisadores léxico e sintático gerados pela ferramenta JavaCC a partir da BNF adaptada de Gesser (2007). Para gerar a saída, utilizou-se o motor de templates Velocity 1.5. Na implementação da ferramenta foi usado o ambiente de desenvolvimento Eclipse 3.2.2; h) testes: os testes foram realizados durante todo o processo de desenvolvimento da ferramenta.
32 REQUISITOS PRINCIPAIS DO PROBLEMA A SER TRABALHADO A seguir são apresentados requisitos funcionais e requisitos não funcionais. O quadro 11 apresenta os requisitos funcionais e sua rastreabilidade, ou seja, vinculação com o caso de uso associado. No quadro 12 são relacionados os requisitos não funcionais. REQUISITOS FUNCIONAIS RF01: Converter componentes de interface Java Swing para HTML. RF02: Converter tratadores de eventos da linguagem Java para JavaScript. Quadro 11- Requisitos funcionais CASO DE USO UC03 UC03 REQUISITOS NÃO FUNCIONAIS RNF01: Manter o layout original dos componentes de interface e a funcionalidade dos tratadores de evento. RNF02: Utilizar templates para a geração do código de saída. RNF03: Utilizar linguagem Java 5.0 para implementação da ferramenta. RNF04: Executar em ambiente Windows XP e Vista. RNF05: Executar no navegador Internet Explorer 7. Quadro 12 Requisitos não funcionais 3.2 COMPONENTES DE INTERFACE E EVENTOS CONVERTIDOS Nesta seção são apresentados os componentes e os eventos convertidos pela ferramenta SwingToHtml. Para determinar os componentes de interface (quadro 13) e tratadores de eventos (quadro 14) que serão convertidos, identificou-se os que são mais usados e os que tinham componentes equivalentes em HTML e JavaScript. COMPONENTE DESCRIÇÃO Tag HTML JFrame formulário ou janela da aplicação <fieldset> JPanel painel para melhor organizar os componentes <fieldset> JMenuBar área destinada a armazenar menus <div> JMenu menu principal <div>, <button> JMenuItem opções do menu principal <div>, <button> JTabbedPane página que armazena painéis <table>, <div> JLabel texto descritivo. <font> JTextField caixa de digitação de texto de linha única <input> JTextArea caixa de texto com barra de rolagem <textarea> JButton botão, não há tratamento de imagens na ferramenta <button> JRadioButton botão em forma de círculo seguido de uma descrição <input> JCheckBox caixa de seleção <input> JComboBox caixa de seleção de um único item, com uma lista de opções <input> JList caixa com uma lista de opções com barra de rolagem <select> Quadro 13 Componentes de interface
33 32 EVENTOS DESCRIÇÃO JavaScript mouseclicked disparado quando o botão do mouse é clicado (pressionado e onclick liberado) em um componente mouseentered disparado quando o mouse entra na área de um componente onmouseover mouseexited disparado quando o mouse sai da área de um componente MouseOut mousereleased disparado quando o botão do mouse é liberado sobre um onclick componente focusgained invocado quando o componente recebe o foco onfocus actionperformed invocado quando uma ação ocorre onclick keytyped invocado quando uma tecla é pressionada: a ferramenta onkeypress converte apenas a chamada ao método, sendo que o evento de capturar a tecla deve ser implementado pelo programador keypressed invocado quando uma tecla é pressionada onkeypress keyreleased invocado quando uma tecla é liberada (após ser pressionada) onkeyup Quadro 14 Tratadores de eventos 3.3 CÓDIGO DE SAÍDA Para definir o código de saída da ferramenta foram desenvolvidos manualmente páginas HTML e scripts JavaScript com componentes de interface e tratadores de eventos equivalentes aos identificados na seção 3.2. Como resultado dessa etapa, tem-se o mapeamento entre o código de saída e o código de entrada da ferramenta. No quadro 15 é apresentado o código do evento mouseclicked em Java e o correspondente em JavaScript. No quadro 16 são apresentados os códigos de algums componentes mais utilizados. EVENTO EM JAVA jbutton.addmouselistener (new MouseListener() { public void mouseclicked(mouseevent e) { textfield2.settext("*"); if (op!= ""){ val1 = textfield4.gettext(); textfield1.settext(val1); textfield3.settext(""); op = "*";... EVENTO EM JAVASCRIPT function mouseclickedjbutton(){ document.frcalculator2. textfield2.value= '*' if ( op!= '' ) { val1 = document.frcalculator2. textfield4.value document.frcalculator2. textfield1.value= val1 document.frcalculator2. textfield3.value= '' op = '*' Quadro 15 Mapeamento eventos Java X eventos JavaScript
34 33 COMPONENTE CÓDIGO JAVA SWING CÓDIGO HTML EQUIVALENTE JButton jbutton = new JButton(); jbutton.settext("limpar"); jbutton.setpreferredsize (new Dimension(250, 30)); <button name=jbutton id=idjbutton style="position: absolute; font-family:dialog; font-size:12; width:250; height:30; left:2; top:0;" > Limpar JLabel JTextField jlabel = new JLabel(); jlabel.settext("nome:"); jlabel.setpreferredsize( new Dimension(64,10)); jtextfield = new JTextField(); jtextfield.setpreferredsize(new Dimension(200,20)); </button> <font name=jlabel style="position: absolute; font-family:dialog; font-size:12; font-weight:bold; width:64; height:10; left:0; top:0;"> Nome: </font> <input type="edit" name= jtextfield style= "position: absolute; font-family: dialog; font-size: 12; width: 200; height: 20; left: 69; top: 0;"></input> Quadro 16 Mapeamento componentes de interface Java Swing X componentes de interface HTML Observa-se que para criação dos componentes em HTML utiliza-se CSS para definir o estilo dos componentes, tais como, cor, tamanho, tipo de fonte e posições (top, left). 3.4 ANÁLISE DO CÓDIGO DE ENTRADA Para analisar o código de entrada, estudou-se a estrutura da BNF do Java a fim de definir como serão extraídas, do código de entrada, as informações necessárias para gerar a saída. Para tanto, utilizou-se a gramática apresentada no Anexo A, extraída do trabalho de Gesser (2007). Nela foram acrescentados métodos correspondentes a ações semânticas utilizadas para reconhecer componentes, propriedades e eventos necessários para a geração do código de código, conforme mapeamento identificado.
35 ESPECIFICAÇÃO Esta seção apresenta a especificação da ferramenta, contendo os casos de uso, os diagramas de classes e de seqüência que foram especificados utilizando a ferramenta EA Casos de uso No diagrama de casos de uso foram especificados os casos de uso que ilustram todas as etapas necessárias para a conversão de interfaces de aplicações Java Swing em páginas HTML e eventos para JavaScript. Na figura 12 são apresentados os casos de usos relevantes ao processo de conversão, que vão desde a seleção dos arquivos necessários até a conversão propriamente dita. Nos quadros 17 a 19 são apresentados os detalhamentos de cada caso de uso. Figura 12 Diagrama de casos de uso UC01 Especificar arquivo Pré-condições: deve existir ao menos um arquivo.java. Cenário principal: 1 - Usuário clica no botão Carregar arquivo. 2 - A ferramenta apresenta a relação de arquivos.java existentes. 3 - O usuário escolhe um arquivo. 4 - A ferramenta armazena o nome do arquivo selecionado. Pós- condições: um arquivo foi incluído na lista de arquivos a serem convertidos. Quadro 17 Detalhamento do caso de uso UC01 - Especificar arquivo
36 35 UC02 Especificar template Pré-condições: deve existir ao menos um template. Cenário principal: 1 - Usuário clica no botão Carregar template. 2 - A ferramenta apresenta a relação dos templates que o usuário pode utilizar. 3 - O usuário escolhe um template. 4 - A ferramenta armazena o nome do template selecionado. Pós- condições: um template foi selecionado para gerar código de saída. Quadro 18 Detalhamento do caso de uso UC02 - Especificar template UC03 Converter código Pré-condições: deve existir ao menos um arquivo.java na relação de arquivos a serem convertidos, bem como um template selecionado para gerar código de saída. Cenário principal: 1 - Usuário clica no botão Converter. 2 - A ferramenta analisa o template selecionado. 3 - A ferramenta analisa o código dos arquivos.java relacionados na lista de arquivos a serem convertidos. 4 - A ferramenta gera os arquivos de saída conforme dados extraídos do(s) arquivo(s).java e do código especificado no template. Pós- condições: um ou mais arquivos.html foram gerados no diretório base da ferramenta. Quadro 19 Detalhamento do caso de uso UC03 - Converter código Diagrama de classes No diagrama de classes da figura 13 encontram-se modeladas as classes que armazenam as informações que serão utilizadas para conversão, ou seja, classes que armazenam dados dos componentes de interface Java Swing.
37 36 Figura 13 Diagrama de classes para componentes de interface Java Swing Já no diagrama de classes da figura 14 foram modeladas as classes responsáveis pela conversão de código. A classe principal, FrMain, é responsável pela entrada dos dados (arquivos.java a serem convertidos e template a ser utilizado no processo de conversão) e pela chamada dos métodos para analisar a entrada e acionar o motor de templates Velocity para efetuar a conversão dos arquivos selecionados. Tem-se as classes ASTParser,
38 37 ASTParserConstants, ASTParserTokenManager, ParseException, JavaCharStream, Token e TokenMgrError, que efetuam a análise da entrada extraindo as informações necessárias para gerar a saída, através de analisadores léxico e sintático para a BNF do Java (Anexo A). No diagrama são apresentadas ainda as classes Function e Identifier, que armazenam, respectivamente, o corpo das funções JavaScript e os identificadores reconhecidos nos métodos Java que serão convertidos para JavaScript. Também é apresentada a classe RecClass, que guarda informações como o nome da classe (arquivo.java que será convertido) e atributos como width e heigth. Figura 14 Diagrama de classes para geração de código No Apêndice B, são relacionados os atributos e métodos das classes apresentadas nas figuras 13 e 14.
39 Diagrama de seqüência O diagrama de seqüência da figura 15 detalha o evento que ocorre ao pressionar o botão Converter. Depois de selecionado um ou mais arquivos para serem convertidos e um template para formatar o código de saída, pode-se iniciar o processo de conversão. Nesse caso, a classe FrMain invoca a classe ASTParser, que por sua vez analisa o arquivo.java a ser convertido, armazena os dados a serem utilizados na conversão em classes criadas para este fim (figura 13), invoca o motor de templates Velocity, passando os dados extraídos do arquivo.java e o template modelo. Figura 15 Diagrama de seqüência do caso de uso Converter código 3.6 IMPLEMENTAÇÃO Nesta seção são descritas as ferramentas e técnicas utilizadas, bem como a implementação do trabalho.
40 Técnicas e ferramentas utilizadas A ferramenta aqui apresentada foi construída utilizando a linguagem Java 5.0, com ambiente de desenvolvimento Eclipse e a biblioteca gráfica Swing. O motor de templates Velocity foi utilizado através da biblioteca velocity-dep-1.5.jar. Também fezse uso do JavaCC para gerar os analisadores léxico e sintático Implementação da ferramenta O primeiro passo para a implementação da ferramenta foi identificar quais propriedades dos componentes deveriam ser armazenadas para a geração do código em HTML. Para análise do código.java foram utilizados analisadores léxico e sintático. Para gerar as classes responsáveis pelos analisadores léxico e sintático foi adaptada a gramática do Java especificada por Gesser (2007, p. 77). A ferramenta assume que o arquivo.java está semanticamente correto, não faz análise semântica, apenas utiliza o analisador semântico para extrair os dados necessários para a conversão. Para tanto, definiram-se métodos para as ações semânticas, para reconhecimento de tokens utilizados na geração de código desejada. No quadro 20 é apresentado um trecho do código presente na classe FrMain. Este código é executado toda vez em que o botão Converter é pressionado.
41 40 public void mouseclicked(mouseevent arg0){ compile.astparser parser = null; try { if (files.size() == 0) { trecho 01 OptionPane.showMessageDialog(null, "Selecione um arquivo."); else { if (template == null) { trecho 02 JOptionPane.showMessageDialog(null, "Informe um template."); else { for (int i = 0; i < files.size(); i++) { trecho 03 String namefile = files.get(i); parser = new ASTParser(new java.io.fileinputstream(namefile)); try { parser.compilationunit(); try { parser.positionjpanels(); try { parser.positioncomponents(); parser.settemplate(template); parser.geravelocity(); try{ generatedfile(parser.getwriter(), parser.getrecclass().getclassname()); JOptionPane.showMessageDialog(null,"Arquivo convertido...!") catch (Exception e) { JOptionPane.showMessageDialog(null,"Erro ao converter código!"); catch (Exception e) { JOptionPane.showMessageDialog(null,"Erro ao converter código!"); catch (Exception e) { JOptionPane.showMessageDialog(null,"Erro ao converter código!"); catch (Exception e) { JOptionPane.showMessageDialog(null,Erro ao converter código!"); catch (java.io.filenotfoundexception e) { System.out.println("Arquivo não encontrado."); JOptionPane.showMessageDialog(null,"Erro ao converter código! "); return; Quadro 20 Conversão de código Primeiramente é verificado se existem arquivo(s) a ser(em) convertido(s) (trecho 01). Caso nenhum arquivo tenha sido informado, é apresentada uma mensagem, pedindo para que o usuário selecione um arquivo. Posteriormente é verificado se um template foi especificado (trecho 02). Também neste caso, caso não tenha sido especificado, é apresentada uma mensagem pedindo ao usuário para que informe um template. Tendo ao menos um arquivo e um template, a ferramenta percorre a lista de arquivos a serem convertidos, criando um stream de dados do arquivo informado (trecho 03). Logo após é efetuada a chamada ao método CompilationUnit responsável por percorrer toda a estrutura do arquivo e realizar as análises léxica e sintática do arquivo. Caso não sejam detectados erros léxicos ou sintáticos, são chamados: o método positionjpanels, para posicionar os panels dentro do formulário, e o método positioncomponents responsável por posicionar os componentes. Entende-se por posicionar panels e componentes, o cálculo para definir as posições top e left dos mesmos. Na seqüência, o template informado é setado e o método geravelocity é chamado para gerar o código de saída baseado no template informado. Por último, o método generatedfile é
42 41 chamado para gravar a saída gerada pelo Velocity em um arquivo, que possui o mesmo nome da classe.java Operacionalidade da implementação Nesta seção é apresentado um estudo de caso para demonstrar a funcionalidade da ferramenta SwingToHtml (figura 16). A ferramenta é utilizada para gerar código da camada de interface de uma aplicação web a partir de uma aplicação desenvolvida em Java Swing. O resultado são páginas HTML. Outra funcionalidade da ferramenta é a conversão de eventos Java para JavaScript. Figura 16 Tela da ferramenta SwingToHtml Ao pressionar o botão Carregar arquivo, é possível selecionar os arquivos.java que serão convertidos (figura 17). Os arquivos selecionados são listados na aba Arquivo (figura 18).
43 42 Figura 17 Seleção de arquivo.java Figura 18 Arquivos.java selecionados Antes de efetuar a conversão, o usuário deve informar qual o template modelo deverá ser usado. Para tanto, deve pressionar o botão Carregar template que abrirá a janela apresentada na figura 19.
44 43 Figura 19 Seleção de template Depois de selecionados os arquivos.java e o template, o usuário pode então pressionar o botão Converter. Existem duas situações possíveis: o arquivo.java pode ser convertido com sucesso (figura 20), ou pode ocorrer algum erro durante o processo de conversão. Quando convertido com sucesso, os arquivos são gerados no diretório principal da ferramenta. Figura 20 Conversão de arquivos Na figura 21 são apresentadas informações sobre a ferramenta.
45 44 Figura 21 Tela Sobre a ferramenta SwingToHtml Por fim, a partir de uma interface Java Swing (figura 22), foi gerado o arquivo.html correspondente (figura 23). Figura 22 Interface Java Swing Figura 23 Interface HTML Para demonstração da conversão de eventos utilizou-se um exemplo de calculadora. Na figura 24 é apresentada a interface Java Swing da calculadora e na figura 25 a interface correspondente em HTML.
46 45 Figura 24 Interface da calculadora em Java Swing Figura 25 Interface da Calculadora em HTML No quadro 21 é apresentado um trecho do código.java e no quadro 22 a conversão para JavaScript. O código completo encontra-se no Apêndice A.... textfield1.addkeylistener ( new KeyListener() {... public void keyreleased(keyevent e) { val1 = textfield1.gettext();... ); textfield3.addkeylistener ( new KeyListener() {... public void keyreleased(keyevent e) { val2 = textfield3.gettext();... ); jbutton.addmouselistener ( new MouseListener() { public void mouseclicked(mouseevent e) { textfield2.settext("+"); if (op!= ""){ val1 = textfield4.gettext(); textfield1.settext(val1); textfield3.settext(""); op = "+";... );... Quadro 21 Eventos em.java
47 46 <script> val1 = "0" val2 = "0" op = "" function keyreleasedtextfield1(){ val1 = document.frcalculator2.textfield1.value function keyreleasedtextfield3(){ val2 = document.frcalculator2.textfield3.value function mouseclickedjbutton(){ document.frcalculator2.textfield2.value= '+' if ( op!= '' ) { val1 = document.frcalculator2.textfield4.value document.frcalculator2.textfield1.value= val1 document.frcalculator2.textfield3.value= '' op = '+'... </script> Quadro 22 Eventos em JavaScript Para melhor exemplificar a utilização de templates, no quadro 23 é apresentado o template utilizado para geração do código da calculadora. Nota-se o uso da diretiva #parse, que simplifica o código. Nesse template, o código dos componentes JTextField, JLabel e JButton são interpretados a partir de outros templates. No quadro 24 é exemplificado o código do template templatejbutton.vm interpretando quando um componente JButton é identificado. <HTML> <HEAD> <TITLE> $!{JFrameGetTitle </TITLE> </HEAD> <BODY> $!{funcjavascript <fieldset name= $!{jcontentpanelgetname style="position: absolute; font-family: $!{jcontentpanelgetfont; font-size: $!{jcontentpanelgetfontsize; color: $!{jcontentpanelgetfontcolor; background-color: $!{jcontentpanelgetbackgroudcolor; left: $!{jcontentpanelgetpositionleft; top: $!{jcontentpanelgetpositiontop; width: $!{jcontentpanelgetwidth; height: $!{jcontentpanelgetheight;"> <form name= $!{JFrameGetName> #foreach ($ComponentJPanel in $arrayjpanel) <fieldset name= $!{ComponentJPanel.getName() style="position: absolute; font-family: $!{ComponentJPanel.getFontFamily(); font-size: $!{ComponentJPanel.getFontSize(); width: $!{ComponentJPanel.getSizeWidth(); height: $!{ComponentJPanel.getSizeHeight(); border: 0; left: $!{ComponentJPanel.getPositionLeft();
48 47 top: $!{ComponentJPanel.getPositionTop(); text-align= $!{style"> #if ($!{ComponentJPanel.getChildrenComponents().size() > 0) #if ($!{ComponentJPanel.getLayout() == "FlowLayout_Center") <div style="text-align:center;"> #foreach ($Component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JTextField") #parse("templatejtextfield.vm") #if ($!{Component.getType() == "JLabel") #parse("templatejlabel.vm") #if ($!{Component.getType() == "JButton") #parse("templatejbutton.vm") #if ($!{ComponentJPanel.getLayout() == "FlowLayout_Center") </div> </fieldset> </form> </fieldset> </BODY> </HTML> Quadro 23 Template utilizado na conversão da calculadora <button name= $!{Component.getName() id= id$!{component.getname() style="position: relative; font-family: $!{Component.getFontFamily(); font-size: $!{Component.getFontSize(); width: $!{Component.getSizeWidth(); height: $!{Component.getSizeHeight(); left: $!{Component.getPositionLeft(); top: $!{Component.getPositionTop();" $!{Component.getFunctionJavaScript().getMethod()> $!{Component.getText() </button> Quadro 24 Template templatejbutton.vm Salienta-se que para que a ferramenta converta o código.java corretamente, os componentes de interface devem ser adicionados nos panels conforme a ordem que aparecem na visualização. É importante frisar que não são convertidos componentes adicionados diretamente no componente JFrame, os componentes precisam estar dentro de panels. Definiu-se essa restrição porque geralmente os desenvolvedores utilizam panels para melhor organizar os componentes de interface. Para tanto, SwingToHtml assume que existe um panel principal, sendo os demais panels adicionados a esse panel principal. Também não são reconhecidos corretamente componentes que possuem pacote em sua declaração (javax.swing.jpanel), sendo que para sua correta conversão, basta apenas declarar JPanel. Definiu-se desta forma porque geralmente são importados os pacotes que contêm os componentes no início da classe. Os layouts convertidos são: FlowLayout, centralizado e alinhado à esquerda; BoxLayout, alinhado horizontalmente; e quando o layout não está definido, por default, no código gerado os componentes são alinhados à esquerda. No
49 48 Apêndice C, é apresentado um template para conversão de todos os componentes apresentados no quadro 13, exceto os componentes de menu, em função do problema relatado anteriormente. Para os eventos, são convertidas declarações de variáveis, comandos condicionais (ifelse) e expressões aritméticas. Os eventos convertidos pela ferramenta estão listados no quadro RESULTADOS E DISCUSSÃO A ferramenta proposta não atendeu completamente os objetivos inicialmente estabelecidos, uma vez que não foi gerado código JSP. Na proposta pensou-se em converter a interface Java Swing para HTML, os tratadores de eventos para JavaScript e os métodos por estes chamados para JSP. Quanto aos tratadores de eventos, a ferramenta implementada converte para JavaScript a chamada a todos os métodos relacionados no quadro 14. Não foi possível a conversão completa do código dos métodos dos tratadores de eventos em função da complexidade da linguagem Java. No quadro 25 é apresentada uma comparação entre a ferramenta SwingToHtml e os trabalhos correlatos descritos, levando em consideração suas principais características. CARACTERÍSTICAS AjaxSwing DelphiToWeb Converte SwingToHtml Forms conversão de componentes de interface sim conversão de tratamento de eventos sim não sim sim linguagem de entrada linguagem de saída uso de analisadores (léxico, sintático e semântico) para leitura dos arquivos de entrada uso de templates para geração de código arquivos.java arquivos.dfm HTML, AJAX HTML,.LZX, XML arquivos Oracle Forms.java - sim sim sim - não sim sim Quadro 25 Comparação SwingToHtml X trabalhos correlatos arquivos.java HMTL, JavaScript Realizando testes de comparação entre as ferramentas apresentadas no quadro acima, observou-se que o código gerado pela ferramenta DelphiToWeb apresenta uma interface mais
50 49 próxima da original quando se trata de espaçamentos entre componentes e até a própria localização dos componentes dentro dos formulários. Isso se deve à forma de criação de componentes de interface na linguagem Delphi, onde cada um possui como propriedade a posição dentro do formulário, o que não ocorre em Java. Das ferramentas relacionadas acima, a mais semelhante à ferramenta implementada é AjaxSwing. Embora as informações contidas no site do produto sejam superficiais (não são apresentados quais componentes são convertidos, não são citados eventos), encontrou-se uma breve descrição sobre suas limitações, podendo citar problemas de desempenho na conversão de alguns eventos, como por exemplo, o não tratamento de movimentos de mouse.
51 50 4 CONCLUSÕES Diante das vantagens apresentadas pelos sistemas web e a demanda das empresas por estes sistemas, implementou-se uma ferramenta para a conversão de interfaces de aplicações desenvolvidas em Java para páginas HTML e eventos em JavaScript. A ferramenta apresentase como uma opção para agilizar o desenvolvimento de aplicações uma vez que permite a migração de produtos desenvolvidos em Java para HTML, reduzindo assim o tempo de elaboração da interface e alguns tratamentos de eventos. As informações necessárias para gerar a saída são extraídas de arquivos Java, contendo componentes de interface Swing e tratadores de eventos. São utilizados templates para servir de modelo para o código de saída, a fim de agilizar o desenvolvimento, aumentar a produtividade e garantir a qualidade e consistência das páginas geradas. Para desenvolvimento deste trabalho, optou-se pelo motor de templates Velocity. Segundo Lozano (2003), o forte do Velocity está na facilidade de reorganizar a estrutura de navegação de uma aplicação web e modificar elementos comuns como cabeçalhos e menus. SwingToHtml gera páginas HTML e JavaScript. Foi necessário o uso da linguagem JavaScript para a criação de alguns componentes visto as limitações dos recursos da linguagem HTML. Alguns componentes, como JTabbedPane e JMenu, não têm equivalência em HTML. Dessa forma, para criação desses componentes utilizou-se a linguagem JavaScript a fim de manter as funcionalidades presentes em Java Swing, como alterar de uma tab para outra e abrir um botão de menu. Para definição de componentes como os citados anteriormente, utilizou-se como referência Souza (2005) e para análise do código de entrada baseou-se no trabalho desenvolvido por Gesser (2007). A ferramenta atingiu seu maior objetivo, a conversão de interfaces Java Swing, agregando conhecimentos em HTML, JavaScript e utilização de templates. A maior dificuldade no desenvolvimento da ferramenta foi o posicionamento dos componentes de interface nas páginas HTML equivalentes, visto que estas informações não são obtidas do código Java e tiveram de ser calculadas. Mas com a ferramenta consegue-se chegar muito próximo do layout original.
52 EXTENSÕES Como extensões para este trabalho sugere-se: a) implementar a conversão de mais componentes já que a ferramenta está limitada à conversão de 14 componentes; b) aumentar a implementação dos tratadores de eventos, a fim de que se possa ampliar a conversão do código dentro dos tratadores; c) criar templates para gerar código para tratamento de eventos (métodos); d) melhorar o posicionamento dos componentes de interface, a fim de chegar mais próximo do layout original.
53 52 REFERÊNCIAS BIBLIOGRÁFICAS ALVAREZ, M. A. Introdução a JavaScript: o que é JavaScript e as possibilidades que nos oferece em relação ao HTML. [S.l.], [2008?]. Disponível em: < Acesso em: 25 out COHEN, M. Tratamento de eventos. [Porto Alegre], Disponível em: < Acesso em: 08 jun CREAMTEC. Automatic conversion of Swing applications to AJAX websites. [S.l.], Disponível em: < Acesso em: 26 abr CRIARWEB. Programação em JavaScript. [S.l.], Disponível em: < Acesso em: 17 nov DEITEL, H. M.; DEITEL, P. J. Java: como programar. 4.ed. Tradução Carlos Arthur Lang Lisboa. Porto alegre: Bookmam, GESSER, J. V. Compilador Java 5.0 para gerar código C++ para plataforma Palm OS f. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau. HERRINGTON, J. Code generation in action. Greenwich: Manning, HTML. In: WIKIPÉDIA, a enciclopédia livre. [S.l.]: Wikimedia Foundation, Disponível em: < Acesso em: 08 jun LOZANO, F. Software livre para o desenvolvedor Java. [S.l.], Disponível em: < Acesso em: 01 maio MACORATTI, J. C. Desenvolvendo para desktop ou para web? [S.l.], [2006]. Disponível em: < Acesso em: 27 maio MEIRA, S. A nova aristocracia. [Recife], Disponível em: < Acesso em: 08 jun ROCHA, L. APE: plataforma para o desenvolvimento de aplicações web com PHP. [S.l.], Disponível em: < ores_de_templates>. Acesso em: 01 maio 2008.
54 53 SCHVEPE, C. Gerador de código Java a partir de arquivos do Oracle Forms 6i f. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau. SILVEIRA, P. E. A. Jakarta Velocity: acabe a briga com os designers. [S.l.], [2008?]. Disponível em: < Acesso em: 25 out SOARES FILHO, A. Migrar software reduz custos e economiza tempo. [S.l.], Disponível em: < Acesso em: 03 maio SOMMERVILLE, I. Engenharia de software. 6. ed. Tradução Maurício de Andrade. São Paulo: Addison Wesley, SOUZA, A. Ferramenta para conversão de formulários Delphi em páginas HTML f. Trabalho de Conclusão de Curso (Bacharelado em Sistemas de Informação) - Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau. STEIL, R. Introdução a programação gráfica em Java com Swing. [S.l.], [2006a?]. Disponível em: < Acesso em: 08 jun STEIL, R. Introdução ao Velocity. [S.l.], [2006b?]. Disponível em: < Acesso em: 01 maio 2008.
55 54 APÊNDICE A Código de entrada e saída: Calculadora Nos quadros 26 e 27 são apresentados, respectivamente, o código da calculadora em Java, entrada da ferramenta SwingToHtml, e em HTML e JavaScript, saída da ferramenta. public class FrCalculator2 extends JFrame { private JTextField textfield1 = null; private JTextField textfield2 = null; private JTextField textfield3 = null; private JTextField textfield4 = null; private JLabel jlabel = null; private String val1 = "0"; private String val2 = "0"; private String op = ""; public FrCalculator2() { this.setsize(new Dimension(260, 130)); this.settitle("calculadora"); JPanel contentpanel = new JPanel(); contentpanel.setlayout(new FlowLayout(FlowLayout.CENTER,0,0)); contentpanel.add(getpanel()); contentpanel.add(getpanel2()); contentpanel.add(getpanel3()); this.setcontentpane(contentpanel); this.setdefaultcloseoperation(frcalculator.exit_on_close); private JPanel getpanel() { JPanel panel1 = new JPanel(); panel1.setlayout(new FlowLayout(FlowLayout.CENTER,0,0)); panel1.setpreferredsize(new Dimension(260, 35)); textfield1 = new JTextField(); textfield1.setpreferredsize(new Dimension(70, 30)); textfield1.addkeylistener(new KeyListener() { public void keypressed(keyevent e) { public void keyreleased(keyevent e) { val1 = textfield1.gettext(); public void keytyped(keyevent e) { ); panel1.add(textfield1); textfield2 = new JTextField(); textfield2.setpreferredsize(new Dimension(20, 30)); textfield2.setenabled(false); panel1.add(textfield2); textfield3 = new JTextField(); textfield3.setpreferredsize(new Dimension(70, 30)); textfield3.addkeylistener(new KeyListener() { public void keypressed(keyevent e) { public void keyreleased(keyevent e) { val2 = textfield3.gettext(); public void keytyped(keyevent e) { ); panel1.add(textfield3); jlabel = new JLabel(); jlabel.setpreferredsize(new Dimension(20, 30)); jlabel.settext(" ="); panel1.add(jlabel); textfield4 = new JTextField();
56 55 textfield4.setpreferredsize(new Dimension(70, 30)); textfield4.setenabled(false); panel1.add(textfield4); return panel1; private JPanel getpanel2() { JPanel panel2 = new JPanel(); panel2.setlayout(new FlowLayout(FlowLayout.CENTER,0,0)); panel2.setpreferredsize(new Dimension(260, 35)); JButton jbutton = new JButton(); jbutton.settext("+"); jbutton.setpreferredsize(new Dimension(50, 30)); jbutton.addmouselistener(new MouseListener() { public void mouseclicked(mouseevent e) { textfield2.settext("+"); if (op!= ""){ val1 = textfield4.gettext(); textfield1.settext(val1); textfield3.settext(""); op = "+"; public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { ); panel2.add(jbutton); JButton jbutton2 = new JButton(); jbutton2.settext("-"); jbutton2.setpreferredsize(new Dimension(50, 30)); jbutton2.addmouselistener(new MouseListener() { public void mouseclicked(mouseevent e) { textfield2.settext("-"); if (op!=""){ val1 = textfield4.gettext(); textfield1.settext(val1); textfield3.settext(""); op = "-"; public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { ); panel2.add(jbutton2); JButton jbutton3 = new JButton(); jbutton3.settext("/"); jbutton3.setpreferredsize(new Dimension(50, 30)); jbutton3.addmouselistener(new MouseListener() { public void mouseclicked(mouseevent e) { textfield2.settext("/"); if (op!= ""){ val1 = textfield4.gettext(); textfield1.settext(val1); textfield3.settext(""); op = "/"; public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) {
57 56 public void mousereleased(mouseevent e) { ); panel2.add(jbutton3); JButton jbutton4 = new JButton(); jbutton4.settext("*"); jbutton4.setpreferredsize(new Dimension(50, 30)); jbutton4.addmouselistener(new MouseListener() { public void mouseclicked(mouseevent e) { textfield2.settext("*"); if (op!= ""){ val1 = textfield4.gettext(); textfield1.settext(val1); textfield3.settext(""); op = "*"; public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { ); panel2.add(jbutton4); JButton jbutton5 = new JButton(); jbutton5.settext("="); jbutton5.setpreferredsize(new Dimension(50, 30)); jbutton5.addmouselistener(new MouseListener() { public void mouseclicked(mouseevent e) { double res = 0; if (op == "+") { res = Double.parseDouble(val1) + Double.parseDouble(val2); else if (op == "-") { res = Double.parseDouble(val1) Double.parseDouble(val2); else if (op == "/") { res = Double.parseDouble(val1) / Double.parseDouble(val2); else if (op == "*") { res = Double.parseDouble(val1) * Double.parseDouble(val2); textfield4.settext(string.valueof(res)); public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { ); panel2.add(jbutton5); return panel2; private JPanel getpanel3() { JPanel panel3 = new JPanel(); panel3.setlayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); panel3.setpreferredsize(new Dimension(260, 35)); JButton jbutton6 = new JButton(); jbutton6.settext("limpar"); jbutton6.setpreferredsize(new Dimension(250, 30)); jbutton6.addmouselistener(new MouseListener() { public void mouseclicked(mouseevent e) { textfield1.settext(""); textfield2.settext(""); textfield3.settext(""); textfield4.settext("");
58 57 val1 = "0"; val2 = "0"; op=""; public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { ); panel3.add(jbutton6); return panel3; public static void main(string[] args) { FrCalculator2 c = new FrCalculator2(); c.setvisible(true); c.setlocationrelativeto(null); c.setdefaultcloseoperation(frcalculator2.exit_on_close); Quadro 26 Código Java: Calculadora <HTML> <HEAD> <TITLE> Calculadora </TITLE> </HEAD> <BODY> <script> val1 = "0" val2 = "0" op = "" function keyreleasedtextfield1(){ val1 = document.frcalculator2.textfield1.value function keyreleasedtextfield3(){ val2 = document.frcalculator2.textfield3.value function mouseclickedjbutton(){ document.frcalculator2.textfield2.value= '+' if (op!= '') { val1 = document.frcalculator2.textfield4.value document.frcalculator2.textfield1.value= val1 document.frcalculator2.textfield3.value= '' op = '+' function mouseclickedjbutton2(){ document.frcalculator2.textfield2.value= '-' if ( op!= '' ) { val1 = document.frcalculator2.textfield4.value document.frcalculator2.textfield1.value= val1 document.frcalculator2.textfield3.value= '' op = '-' function mouseclickedjbutton3(){ document.frcalculator2.textfield2.value= '/' if ( op!= '' ) { val1 = document.frcalculator2.textfield4.value document.frcalculator2.textfield1.value= val1 document.frcalculator2.textfield3.value= ''
59 58 op = '/' function mouseclickedjbutton4(){ document.frcalculator2.textfield2.value= '*' if ( op!= '' ) { val1 = document.frcalculator2.textfield4.value document.frcalculator2.textfield1.value= val1 document.frcalculator2.textfield3.value= '' op = '*' function mouseclickedjbutton5(){ var res = 0 if ( op == '+' ) { res = Number(val1) + Number(val2) else if ( op == '-' ) { res = Number(val1) - Number(val2) else if ( op == '/' ) { res = Number(val1) / Number(val2) else if ( op == '*' ) { res = Number(val1) * Number(val2) document.frcalculator2.textfield4.value= Number(res) function mouseclickedjbutton6(){ document.frcalculator2.textfield1.value= '' document.frcalculator2.textfield2.value= '' document.frcalculator2.textfield3.value= '' document.frcalculator2.textfield4.value= '' val1 = 0 val2 = 0 op = '' </script> <fieldset name= contentpanel style="position: absolute; font-family: dialog; font-size: 12; color: #000000; background-color: #CCCCCC; left: 0; top: 0; width: 260; height: 130;"> <form name= FrCalculator2> <fieldset name= panel1 style="position: absolute; font-family: dialog; font-size: 1; width: 260; height: 35; border: 0; left: 0; top: 0; text-align= center"> <div style="text-align:center;"> <input type="edit" name= textfield1 style= "position: absolute; font-family: dialog; font-size: 12; width: 70; height: 30; left: 0; top: 0;" onkeyup=keyreleasedtextfield1()> </input> <input type="edit" name= textfield2 style= "position: absolute; font-family: dialog; font-size: 12; width: 20; height: 30; left: 70; top: 0;" </input>
60 <input type="edit" name= textfield3 style= "position: absolute; font-family: dialog; font-size: 12; width: 70; height: 30; left: 90; top: 0;" onkeyup=keyreleasedtextfield3()> </input> <font name=jlabel style= "position: absolute; font-family: dialog; font-size: 12; font-weight: bold; width: 20; height: 30; left: 160; top: 0;"> = </font> <input type="edit" name= textfield4 style= "position: absolute; font-family: dialog; font-size: 12; width: 70; height: 30; left: 180; top: 0;" onkeyup=keyreleasedtextfield3()> </input> </div> </fieldset> <fieldset name= panel2 style="position: absolute; font-family: dialog; font-size: 12; width: 260; height: 35; border: 0; left: 0; top: 35; text-align= center"> <div style="text-align:center;"> <button name= jbutton id= idjbutton style="position:absolute; font-family: dialog; font-size: 12; width: 50; height: 30; left: 0; top: 0;" onclick=mouseclickedjbutton()> + </button> <button name= jbutton2 id= idjbutton2 style="position:absolute; font-family: dialog; font-size: 12; width: 50; height: 30; left: 50; top: 0;" onclick=mouseclickedjbutton2()> - </button> <button name= jbutton3 id= idjbutton3 style="position:absolute; font-family: dialog; font-size: 12; width: 50; height: 30; left: 100; top: 0;" onclick=mouseclickedjbutton3()> / </button> <button name= jbutton4 id= idjbutton4 style="position:absolute; font-family: dialog; font-size: 12; width: 50; height: 30; left: 150; top: 0;" onclick=mouseclickedjbutton4()> * 59
61 </button> <button name= jbutton5 id= idjbutton5 style="position:absolute; font-family: dialog; font-size: 12; width: 50; height: 30; left: 200; top: 0;" onclick=mouseclickedjbutton5()> = </button> </div> </fieldset> <fieldset name= panel3 style="position: absolute; font-family: dialog; font-size: 1; width: 260; height: 35; border: 0; left: 0; top: 70; text-align= center"> <div style="text-align:center;"> <button name= jbutton6 id= idjbutton6 style="position:absolute; font-family: dialog; font-size: 12; width: 250; height: 30; left: 2; top: 0;" onclick=mouseclickedjbutton6()> Limpar </button> </div> </fieldset> </form> </fieldset> </BODY> </HTML> Quadro 27 Código HTML e JavaScript gerado: Calculadora 60
62 61 APÊNDICE B Atributos e métodos Os quadros 28 e 29 apresentam, respectivamente, os atributos e métodos das classes modeladas nas figuras 13 e 14. classe Component ComponentJCombobox ComponentJMenu ComponentJMenuBar ComponentJPanel ComponentJRadioButtonGroup ComponentJTabbedPane ComponentJTextArea ComponentTab Item ASTParser atributos name : String fontfamily : String fontsize : int backgroundcolor : String fontcolor : String sizewidth : int sizeheight : int positiontop : int positionleft : int layout : String father : String childrencomponents : Stack<Object> text : String type : String style : String functionjavascript : Function funcjavascript : boolean arrayitens : ArrayList<Item> menusitens : ArrayList<ComponentJMenuItem> menus : ArrayList<ComponentJMenu> havecomponentjlabel : boolean havecomponentjtextfield : boolean havecomponentjbutton : boolean countpanelschilds : int labeljradio : ComponentJLabel namegroup : String style : String tabscontent : ArrayList<ComponentJPanel> tabs : ArrayList<ComponentTab> contentpanejtabbedpane : ComponentJPanel rows : int cols : int onclicktext : String item : String RecClass recclass boolean isclass String classname Properties dirtemplates String whatassign String newclass String classtype String identifier String idant ComponentJPanel component ComponentJPanel componentjpanel ComponentJLabel componentjlabel ComponentJTextField componentjtextfield ComponentJButton componentjbutton ComponentJCombobox componentjcombobox ComponentJRadioButtonGroup componentjradiobuttongroup ComponentJCheckBox componentjcheckbox ComponentJPasswordField componentjpasswordfield ComponentJTextArea componentjtextarea ComponentJLabel labeljradiobutton ComponentJTabbedPane componentjtabbedpane ComponentTab componenttab ComponentJMenuBar componentjmenubar
63 62 classe FrMain RecClass Identifier Function atributos ComponentJMenu componentjmenu ComponentJMenuItem componentjmenuitem ComponentJList componentjlist int counttabs int countpanelsjtabbedpane String layout ContainerView container String methodname Item item String namegroup String classfatherevent ArrayList orderjpanels String alterapanelpai Function func String template ArrayList<Identifier> identifiersjavascript ArrayList<String> identifiersmethods ArrayList<String> identifierscomponents boolean declarationjavascript String vtypeboolean String vtypechar String vtypebyte String vtypeshort String vtypeint String vtypefloat String vtypedouble String vtypelong String inimethod boolean assign boolean body String bodymethod StringWriter writer boolean finishmethody boolean haveif boolean haveelse Identifier id String typeobject jcontentpane : JPanel jpanel : JPanel jpanel1 : JPanel jpanel2 : JPanel jpanel3 : JPanel jjmenubar : JMenuBar jmenu : JMenu jmenu1 : JMenu jbutton : JButton jbutton1 : JButton jbutton2 : JButton jmenuitem : JMenuItem jmenuitem1 : JMenuItem jmenuitem2 : JMenuItem jbutton3 : JButton jtabbedpane : JTabbedPane jpanel4 : JPanel jscrollpane : JScrollPane jtextarea : JTextArea files : ArrayList<String> template : String classname : String sizewidth : int sizeheight : int title : String container : ContainerView name : String value : String namefunction : String bodyfunction : String
64 63 classe atributos method : String Quadro 28 Atributos e métodos classe métodos Component Component() getname() setname(string) getsizewidth() setsizewidth(int) getsizeheight() setsizeheight(int) getpositiontop() setpositiontop(int) getpositionleft() setpositionleft(int) getchildrencomponents() setchildrencomponents(stack<object>) getlayout() setlayout(string) getfather() setfather(string) getfontfamily() setfontfamily(string) getfontsize() setfontsize(int) getbackgroundcolor() setbackgroundcolor(string) getfontcolor() setfontcolor(string) gettext() settext(string) gettype() settype(string) getstyle() setstyle(string) getfunctionjavascript() setfunctionjavascript(function) isfuncjavascript() setfuncjavascript(boolean) ComponentJButton ComponentJButton() ComponentJCombobox ComponentJCombobox() getarrayitens() setarrayitens(arraylist) ComponentJLabel ComponentJLabel() ComponentJMenu ComponentJMenu() getmenusitens() setmenusitens(arraylist<componentjmenuitem>) ComponentJMenuBar ComponentJMenuBar() getmenus() setmenus(arraylist<componentjmenu>) ComponentJPanel ComponentJPanel() sethavecomponentjlabel(boolean) sethavecomponentjtextfield(boolean) sethavecomponentjbutton(boolean) havecomponentjlabel() havecomponentjbutton() havecomponentjtextfield() getcountpanelschilds() setcountpanelschilds(int) ComponentJRadioButtonGroup getlabel() setlabeljradio(componentjlabel) getnamegroup() setnamegroup(string)
65 64 classe métodos ComponentJTabbedPane getstyle() setstyle(string) gettabscontent() settabscontent(arraylist<componentjpanel>) gettabs() settabs(arraylist<componenttab>) getcontentpanejtabbedpane() setcontentpanejtabbedpane(componentjpanel) ComponentJTextArea getrows() setrows(int) getcols() setcols(int) ComponentJTextField ComponentJTextField() ComponentTab getonclicktext() setonclicktext(string) Item getitem() setitem(string) ASTParser setclass() setclassname(token) setassignment(token) setbodyfunctioncomponent() setidentifiername(token) inicializevariable() setmethodname(token) setconstrutorname(token) settypeobject(token) setassignment2(token) getclassname(token) getobjectname(token) verifyexistidentifier(string) verifyexistidentifiermethod(string) verifyexistidentifiercomponents(string) setintegerelement(token) positionmenus() setpositioncomponentlabelradiobutton() setlongelement(token) setfloatelement(token) setcaracterelement(token) setstringelement(token) setbooleanelement() setnullelement() positioncomponents() position() positioncomponentjtabbedpane(componentjpanel) setnewclass() positionjpanels() positiontabscontent(componentjpanel) positionchildrensjpanel(componentjpanel) incelement(token) decelement(token) sumelement(token) subelement(token) multielement(token) divelement(token) sumequalselement(token) subequalselement(token) multiequalselement(token) divequalselement(token) typeboolean(token) typechar(token) typebyte(token) typeshort(token) typeint(token) typefloat(token) typedouble(token) typelong(token) finishbodymethod(token)
66 65 classe métodos bodymethod(token) hasbody() methodkeylistener() verifynamecomponent() methodactionlistener() methodfocuslistener() methodmouselistener() bodyfunctionevents() positionjpanelsjtabbedpane() updategroupjradio() geravelocity() verifyfunctions() gettemplate() settemplate(string) getwriter() setwriter(stringwriter) getrecclass() getif(token) elseif(token) getequals(token) initif(token) finishif(token) assigmentvalue(token) FrMain getjpanel() getjpanel1() getjpanel2() getjpanel3() getjjmenubar() getjmenu() getjmenu1() getjbutton() openfileswing() openfiletemplate() getjbutton1() currentdir(int) getjbutton2() generatedfile(stringwriter,string) getjmenuitem() getjmenuitem1() getjmenuitem2() getjbutton3() getjtabbedpane() getjpanel4() getjtextarea() getjscrollpane() main(string[]) FrMain() initialize() getjcontentpane() RecClass RecClass() getclassname() setclassname(string) getsizewidth() setsizewidth(int) getsizeheight() setsizeheight(int) gettitle() settitle(string) getcontainer() setcontainer(containerview) Identifier getname() setname(string) getvalue() setvalue(string) Function getnamefunction() setnamefunction(string) getbodyfunction()
67 66 classe métodos setbodyfunction(string) getmethod() setmethod(string) Quadro 29 Métodos
68 67 APÊNDICE C Template com todos os componentes No quadro 30 é apresentado o template para conversão de todos os componentes apresentados no quadro 13, exceto componentes de menu. <HTML> <HEAD> <TITLE> $!{JFrameGetTitle </TITLE> </HEAD> <BODY> <fieldset name= $!{jcontentpanelgetname style="position: absolute; font-family: $!{jcontentpanelgetfont; font-size: $!{jcontentpanelgetfontsize; color: $!{jcontentpanelgetfontcolor; background-color: $!{jcontentpanelgetbackgroudcolor; left: $!{jcontentpanelgetpositionleft; top: $!{jcontentpanelgetpositiontop; width: $!{jcontentpanelgetwidth; height: $!{jcontentpanelgetheight;"> <STYLE TYPE="text/css" TITLE=""> #foreach ($ComponentJPanel in $arrayjpanel) #if ($!{ComponentJPanel.getChildrenComponents().size() > 0) #foreach ($Component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JTabbedPane") $!{Component.getStyle() </STYLE> <form name= $!{JFrameGetName > <script> var visible = 0; function chgtab(tabnumber) { if (tabnumber==visible) { return; var contenttohide = document.getelementbyid("tabcontent"+visible); var contenttoshow = document.getelementbyid("tabcontent"+tabnumber); var tabtohide2 = document.getelementbyid("tab"+visible); var tabtoshow2 = document.getelementbyid("tab"+tabnumber); tabtoshow2.classname = "tab"; tabtohide2.classname = "othertab"; contenttohide.style.display = "none"; contenttoshow.style.display = ""; visible = tabnumber; </script> <TABLE #foreach ($ComponentJPanel in $arrayjpanel) #if ($!{ComponentJPanel.getChildrenComponents().size() > 0) #foreach ($Component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JTabbedPane") name="$!{component.getname()" style="position: absolute;
69 68 "> <TR> <TD> <table> <tr> #foreach ($ComponentJPanel in $arrayjpanel) #set($cont = 0) #if ($!{ComponentJPanel.getChildrenComponents().size() > 0) #foreach ($Component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JTabbedPane") #foreach ($Component in $arraytabs) <td id="tab$cont" onclick="chgtab($cont)" #if ($cont == 0) class="tab"> #else class="othertab"> <font style=" font-family: dialog; font-size: 12; color: #000000; ">$!{Component.getText()</font></td> #set($cont = $cont + 1) <tr> </table> </TD> </TR> <TR> <TD> #foreach ($ComponentJPanel in $arrayjpanel) #set($cont = 0) #if ($!{ComponentJPanel.getChildrenComponents().size() > 0) #foreach ($Component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JTabbedPane") #foreach ($Component in $arraytabscontent) <div id="tabcontent$cont" style="display: ; border: 1px solid #FFFFFF; width: $!{Component.getSizeWidth(); Height: $!{Component.getSizeHeight();"> #set($cont = $cont + 1) <fieldset name= $!{Component.getName() style="position:absolute; font-family: $!{Component.getFontFamily(); font-size: $!{Component.getFontSize(); width:$!{component.getsizewidth(); Height:$!{Component.getSizeHeight(); border:0;left:$!{component.getpositionleft(); top: $!{Component.getPositionTop();"> #set($count = 0) #foreach($componentjpanel in $Component.getChildrenComponents()) <fieldset name= $!{ComponentJPanel.getName() style="position:absolute;font-family: $!{ComponentJPanel.getFontFamily(); font-size: $!{ComponentJPanel.getFontSize(); width:$!{componentjpanel.getsizewidth();
70 69 Height:$!{ComponentJPanel.getSizeHeight(); border: 0; left:$!{componentjpanel.getpositionleft(); top: $!{ComponentJPanel.getPositionTop(); text-align= $!{ComponentJPanel.getLayout();"> #foreach($component in $ComponentJPanel.getChildrenComponents()) #if ($!{Component.getType() == "JLabel") #set($count = $count + $!{Component.getPositionTop()) #parse("templatejlabel.vm") #if ($!{Component.getType() == "JTextField") #parse("templatejtextfield.vm") #if ($!{Component.getType() == "JButton") #parse("templatejbutton.vm") #if ($!{Component.getType() == "JRadioButton") #parse("templatejradiobutton.vm") #if ($!{Component.getType() == "JComboBox") #parse("templatejcombobox.vm") #if ($!{Component.getType() == "JCheckBox") #parse("templatejcheckbox.vm") #if ($!{Component.getType() == "JList") #parse("templatejlist.vm") #if ($!{Component.getType() == "JTextArea") #parse("templatejtextarea.vm") #set($count = $count + 10) </fieldset> </fieldset> </div> </TD> </TR> </TABLE> </form> </fieldset> </BODY> </HTML> Quadro 30 Template com todos os componentes
71 70 ANEXO A Gramática do Java 5.0 No quadro 31 é apresentada a gramática da linguagem Java 5.0 utilizada no desenvolvimento da ferramenta. CompilationUnit::= (PackageDeclaration)? (ImportDeclaration)* (TypeDeclaration)* PackageDeclaration::= package Name ; ImportDeclaration::= import (static)? Name (. *)? ; Modifiers::= (public static protected private final abstract native synchronized transient volatile strictfp annotation)* TypeDeclaration::= ; Modifiers (ClassOrInterfaceDeclaration EnumDeclaration AnnotationTypeDeclaration) ClassOrInterfaceDeclaration::= (class interface) <IDENTIFIER> (TypeParameters)? (ExtendsList)? (ImplementsList)? ClassOrInterfaceBody ExtendsList::= extends ClassOrInterfaceType (, ClassOrInterfaceType)* ImplementsList::= implements ClassOrInterfaceType (, ClassOrInterfaceType)* EnumDeclaration::= enum <IDENTIFIER> (ImplementsList)? { (EnumConstant (, EnumConstant)*)? (, (; (ClassOrInterfaceBodyDeclaration)*) )? EnumConstant::= <IDENTIFIER> (Arguments)? (ClassOrInterfaceBody)? TypeParameters::= < TypeParameter (, TypeParameter)* > TypeParameter::= <IDENTIFIER> (TypeBound)? TypeBound::= extends ClassOrInterfaceType (& ClassOrInterfaceType)* ClassOrInterfaceBody::= { (ClassOrInterfaceBodyDeclaration)* ClassOrInterfaceBodyDeclaration::= (Initializer Modifiers (ClassOrInterfaceDeclaration EnumDeclaration AnnotationTypeDeclaration ConstructorDeclaration FieldDeclaration MethodDeclaration) ;) FieldDeclaration::= Type VariableDeclarator (, VariableDeclarator)* ; VariableDeclarator::= VariableDeclaratorId (= VariableInitializer)? VariableDeclaratorId::= <IDENTIFIER> ([ ])* VariableInitializer::= (ArrayInitializer Expression) ArrayInitializer::= { (VariableInitializer (, VariableInitializer)*)? (,)? MethodDeclaration::= (TypeParameters)? ResultType <IDENTIFIER> FormalParameters ([ ])* (throws NameList)? (Block ;) FormalParameters::= ( (FormalParameter (, FormalParameter)*)? ) FormalParameter::= Modifiers Type (...)? VariableDeclaratorId ConstructorDeclaration::= (TypeParameters)? <IDENTIFIER> FormalParameters (throws NameList)? { (ExplicitConstructorInvocation)? Statements ExplicitConstructorInvocation::= (this Arguments ; (PrimaryExpression.)? super Arguments ; Statements::= (BlockStatement)* Initializer::= (static)? Block Type::= (ReferenceType PrimitiveType) ReferenceType::= (PrimitiveType ([ ])+ ClassOrInterfaceType ([ ])* ) ClassOrInterfaceType::= <IDENTIFIER> (TypeArguments)? (. <IDENTIFIER> (TypeArguments)? )* TypeArguments::= < TypeArgument (, TypeArgument)* > TypeArgument::= (ReferenceType Wildcard) Wildcard::=? (extends ReferenceType super ReferenceType)? PrimitiveType::= boolean char byte short int long float double ResultType::= void Type Name::= <IDENTIFIER> (. <IDENTIFIER>)* NameList::= Name (, Name)* Expression::= ConditionalExpression (AssignmentOperator Expression)? AssignmentOperator::= = *= /= %= += -= <<= >>= >>>= &= ^= = ConditionalExpression::= ConditionalOrExpression (? Expression : Expression)? ConditionalOrExpression::= ConditionalAndExpression ( ConditionalAndExpression)* ConditionalAndExpression::= InclusiveOrExpression (&& InclusiveOrExpression)* InclusiveOrExpression::= ExclusiveOrExpression ( ExclusiveOrExpression)* ExclusiveOrExpression::= AndExpression (^ AndExpression)* AndExpression::= EqualityExpression (& EqualityExpression)* EqualityExpression::= InstanceOfExpression ((==!=) InstanceOfExpression)* InstanceOfExpression::= RelationalExpression (instanceof Type)? RelationalExpression::= ShiftExpression ( (< > <= >=) ShiftExpression)* ShiftExpression::= AdditiveExpression ( (<< RSIGNEDSHIFT RUNSIGNEDSHIFT)
72 AdditiveExpression)* AdditiveExpression::= MultiplicativeExpression ( (+ -) MultiplicativeExpression)* MultiplicativeExpression::= UnaryExpression ( (* / %) UnaryExpression)* UnaryExpression::= ( (+ -) UnaryExpression PreIncrementExpression PreDecrementExpression UnaryExpressionNotPlusMinus) PreIncrementExpression::= ++ PrimaryExpression PreDecrementExpression::= -- PrimaryExpression UnaryExpressionNotPlusMinus::= ( (~!) UnaryExpression CastExpression PostfixExpression ) CastLookahead::= ( PrimitiveType ( Type [ ] ( Type ) (~! ( <IDENTIFIER> this super new Literal) PostfixExpression::= PrimaryExpression (++ --)? CastExpression::= ( Type ) UnaryExpression ( Type ) UnaryExpressionNotPlusMinus PrimaryExpression::= PrimaryPrefix (PrimarySuffix)* PrimaryPrefix::= Literal this super. <IDENTIFIER> (Arguments)? ( Expression ) AllocationExpression ResultType. class <IDENTIFIER> (Arguments)? PrimarySuffix::=. (this super AllocationExpression (TypeArguments)? <IDENTIFIER> (Arguments)? [ Expression ] Literal::= <INTEGER_LITERAL> <LONG_LITERAL> <FLOATING_POINT_LITERAL> <CHARACTER_LITERAL> <STRING_LITERAL> BooleanLiteral NullLiteral BooleanLiteral::= true false NullLiteral::= null Arguments::= ( (ArgumentList)? ) ArgumentList::= Expression (, Expression)* AllocationExpression::= (new PrimitiveType ArrayDimsAndInits new ClassOrInterfaceType (TypeArguments)? (ArrayDimsAndInits Arguments (ClassOrInterfaceBody)? ) ) ArrayDimsAndInits::= ( [ Expression ])+ ([ ])* ([ ])+ ArrayInitializer Statement::= LabeledStatement AssertStatement Block EmptyStatement StatementExpression SwitchStatement IfStatement WhileStatement DoStatement ForStatement BreakStatement ContinueStatement ReturnStatement ThrowStatement SynchronizedStatement TryStatement AssertStatement::= assert Expression (: Expression)? ; LabeledStatement::= <IDENTIFIER> : Statement Block::= { Statements BlockStatement::= Modifiers ClassOrInterfaceDeclaration VariableDeclarationExpression ; Statement VariableDeclarationExpression::= Modifiers Type VariableDeclarator (, VariableDeclarator )* EmptyStatement::= ; StatementExpression::= (PreIncrementExpression PreDecrementExpression PrimaryExpression (++ -- AssignmentOperator Expression)? ) ; SwitchStatement::= switch ( Expression ) { (SwitchEntry)* SwitchEntry::= (case Expression default) : Statements IfStatement::= if ( Expression ) Statement (else Statement)? WhileStatement::= while ( Expression ) Statement DoStatement::= do Statement while ( Expression ) ; ForStatement::= for ( (VariableDeclarationExpression : Expression (ForInit)? ; (Expression)? ; (ForUpdate)? ) ) Statement ForInit::= VariableDeclarationExpression ExpressionList ExpressionList::= Expression (, Expression)* ForUpdate::= ExpressionList BreakStatement::= break (<IDENTIFIER>)? ; ContinueStatement::= continue (<IDENTIFIER>)? ; ReturnStatement::= return (Expression)? ; ThrowStatement::= throw Expression ; SynchronizedStatement::= synchronized ( Expression ) Block TryStatement::= try Block (catch ( FormalParameter ) Block)* (finally Block)? RUNSIGNEDSHIFT::= > > > RSIGNEDSHIFT::= > > Annotation::= NormalAnnotation SingleMemberAnnotation MarkerAnnotation Name ( (MemberValuePairs)? ) Name Name ( MemberValue ) MemberValuePairs::= MemberValuePair (, MemberValuePair)* MemberValuePair::= <IDENTIFIER> = MemberValue MemberValue::= Annotation MemberValueArrayInitializer ConditionalExpression 71
73 MemberValueArrayInitializer::= { MemberValue (, MemberValue)* (,)? interface <IDENTIFIER> AnnotationTypeBody AnnotationTypeBody::= { (AnnotationBodyDeclaration)* AnnotationBodyDeclaration::= Modifiers ( (AnnotationTypeMemberDeclaration ClassOrInterfaceDeclaration EnumDeclaration AnnotationTypeDeclaration FieldDeclaration) ; ) AnnotationTypeMemberDeclaration::= Type <IDENTIFIER> ( ) (DefaultValue)? ; DefaultValue::= default MemberValue Fonte: adaptado de Gesser (2007, p. 77). Quadro 31 Gramática do Java
Curso de Aprendizado Industrial Desenvolvedor WEB
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos II Professor: Cheli dos S. Mendes da Costa Servidor de Aplicações WEB Tomcat Servidor Tomcat Foi desenvolvido
Tratamento de Eventos
Tratamento de Eventos Prof. Marcelo Cohen 1. Visão Geral Para implementar a funcionalidade de uma interface gráfica, pode-se fazer uso de uma repetição sem fim: Faz algum processamento Verifica se o mouse
Swing. Page 1. Swing. Prof. Anderson Augustinho Uniandrade
Page 1 API A API renderiza/desenha por conta própria todos os componentes visuais, ao invés de delegar essa tarefa ao sistema operacional, como a maioria das outras APIs de interface gráfica trabalham.
Java. Marcio de Carvalho Victorino www.dominandoti.eng.br
Java Marcio de Carvalho Victorino www.dominandoti.eng.br 3. Considere as instruções Java abaixo: int cont1 = 3; int cont2 = 2; int cont3 = 1; cont1 += cont3++; cont1 -= --cont2; cont3 = cont2++; Após a
PROGRAMAÇÃO ORIENTADA A OBJETOS -INTERFACES GRÁFICAS. Prof. Angelo Augusto Frozza, M.Sc. [email protected]
PROGRAMAÇÃO ORIENTADA A OBJETOS -INTERFACES GRÁFICAS Prof. Angelo Augusto Frozza, M.Sc. [email protected] ROTEIRO 2. Programação visual com a IDE Netbeans Projetos Tipos de projetos Desenvolvimento
02 - Usando o SiteMaster - Informações importantes
01 - Apresentação do SiteMaster - News Edition O SiteMaster foi desenvolvido para ser um sistema simples de gerenciamento de notícias, instalado em seu próprio computador e com configuração simplificada,
Informática I. Aula 6. http://www.ic.uff.br/~bianca/informatica1/ Aula 6-12/09/2007 1
Informática I Aula 6 http://www.ic.uff.br/~bianca/informatica1/ Aula 6-12/09/2007 1 Ementa Noções Básicas de Computação (Hardware, Software e Internet) HTML e Páginas Web Internet e a Web Javascript e
Desenvolvendo Websites com PHP
Desenvolvendo Websites com PHP Aprenda a criar Websites dinâmicos e interativos com PHP e bancos de dados Juliano Niederauer 19 Capítulo 1 O que é o PHP? O PHP é uma das linguagens mais utilizadas na Web.
Criando um script simples
Criando um script simples As ferramentas de script Diferente de muitas linguagens de programação, você não precisará de quaisquer softwares especiais para criar scripts de JavaScript. A primeira coisa
Noções de. Microsoft SQL Server. Microsoft SQL Server
Noções de 1 Considerações Iniciais Basicamente existem dois tipos de usuários do SQL Server: Implementadores Administradores 2 1 Implementadores Utilizam o SQL Server para criar e alterar base de dados
Criação de Applets Package: Class Name Base Class: Generate header comments: Can run standalone: Generate Standard methods:
Criação de Applets Após ter sido criado o projeto, ao contrário dos exemplos anteriores onde criávamos uma aplicação na guia General da janela Object Gallery, agora iremos criar uma applet que está contida
Orientação a Objetos
1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou
DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0
DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 Índice 1 - Objetivo 2 - Descrição do ambiente 2.1. Tecnologias utilizadas 2.2. Estrutura de pastas 2.3. Bibliotecas já incluídas 3 - Características gerais 4 - Criando
INTERFACE COM O USUÁRIO (em Java) Programação Orientada a Objetos
INTERFACE COM O USUÁRIO (em Java) Programação Orientada a Objetos Chegamos à interface com o usuário. Você já utilizou alguns métodos para dialogar com o usuário, quer enviando mensagens quer lendo dados.
[email protected] [email protected]
DSC/CEEI/UFCG [email protected] [email protected] 1 Realiza atividades com ênfase em Ensino, Pesquisa e Extensão (Ensino) 2 Configurando o projeto Adicionando código ao arquivo com o código-fonte
Scriptlets e Formulários
2 Scriptlets e Formulários Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Permitir ao aluno aprender a criar um novo projeto Java para web no Netbeans IDE,
Programação Gráfica em Java.
Programação Gráfica em Java. Objetivo: Ao final da aula o aluno deverá ser capaz de desenvolver a aplicação gráfica ilustrada ao lado. A interface gráfica será simples, composta por elementos de menus.
Lista de Revisão. 3. Analise a afirmativa a seguir como verdadeira ou falsa e justifique.
Lista de Revisão 1. Nos sistemas web, geralmente os usuários apresentam dois problemas típicos, a desorientação e a sobrecarga cognitiva. Discorra sobre esses problemas. 2. Apresente as principais diferenças
Programando em PHP. Conceitos Básicos
Programando em PHP www.guilhermepontes.eti.br [email protected] Conceitos Básicos Todo o escopo deste estudo estará voltado para a criação de sites com o uso dos diversos recursos de programação web
Microsoft Access XP Módulo Um
Microsoft Access XP Módulo Um Neste primeiro módulo de aula do curso completo de Access XP vamos nos dedicar ao estudo de alguns termos relacionados com banco de dados e as principais novidades do novo
SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE. Aluno: Roberto Reinert Orientador: Everaldo A. Grahl
SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE Aluno: Roberto Reinert Orientador: Everaldo A. Grahl Roteiro de apresentação Introdução Objetivos Fundamentação Teórica Workflow Processo
GERADOR DE CÓDIGO JAVA A PARTIR DE ARQUIVOS DO ORACLE FORMS 6I
UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO ALUNO:CLAUDIO SCHVEPE ORIENTADORA: JOYCE MARTINS GERADOR DE CÓDIGO JAVA A PARTIR DE ARQUIVOS
Dicas para usar melhor o Word 2007
Dicas para usar melhor o Word 2007 Quem está acostumado (ou não) a trabalhar com o Word, não costuma ter todo o tempo do mundo disponível para descobrir as funcionalidades de versões recentemente lançadas.
Sistema de Recursos Humanos
Sistema de Recursos Humanos Projeto 1 O objetivo desse sistema é gerenciar a admissão e a demissão de funcionários. Esse funcionário pode ou não ter dependentes. Esse funcionário está alocado em um departamento
Microsoft Office PowerPoint 2007
INTRODUÇÃO AO MICROSOFT POWERPOINT 2007 O Microsoft Office PowerPoint 2007 é um programa destinado à criação de apresentação através de Slides. A apresentação é um conjunto de Sides que são exibidos em
GERADOR DE CÓDIGO JSP BASEADO EM PROJETO DE SGBD. Acadêmico: Maicon Klug Orientadora: Joyce Martins
GERADOR DE CÓDIGO JSP BASEADO EM PROJETO DE SGBD Acadêmico: Maicon Klug Orientadora: Joyce Martins Roteiro Introdução Objetivos do trabalho Fundamentação teórica Desenvolvimento do trabalho Conclusão Extensões
Tecnologias para apresentação de dados - Java Script. Aécio Costa
Tecnologias para apresentação de dados - Java Script Aécio Costa Foi originalmente implementada como parte dos navegadores web para que scripts pudessem ser executados do lado do cliente e interagissem
Conteúdo Programático de PHP
Conteúdo Programático de PHP 1 Por que PHP? No mercado atual existem diversas tecnologias especializadas na integração de banco de dados com a WEB, sendo o PHP a linguagem que mais se desenvolve, tendo
Interface com o Usuário (UI) UIs Desacopladas (2/3) BSI Bacharelado em Sistemas de Informação LOO Linguagens Orientadas a Objetos
Interface com o Usuário (UI) BSI Bacharelado em Sistemas de Informação LOO Linguagens Orientadas a Objetos Humberto Mossri de Almeida [email protected] Marcelo Nassau Malta [email protected]
IDE (Integrated Development Environment) / RAD (Rapid Application Development)
IDE (Integrated Development Environment) / RAD (Rapid Application Development) Instituto Federal de Educação, Ciência e Tecnologia do Triângulo Mineiro Agosto de 2012 Prof. Edwar Saliba Júnior 1 Introdução
Lista de operadores de comparação - > Maior que - < Menor que - <= Menor ou igual a - >= Maior ou igual a - === Igual a -!
Página1 Javascript JavaScript (JS) é uma linguagem de programação client side Funciona no navegador do usuário. É uma linguagem baseada em objetos. "Walmir".length; 6 Para que serve - fazer websites responder
1. Apresentação. 1.1. Objetivos
1.1. Objetivos 1. Apresentação Neste capítulo estão descritos os objetivos gerais do livro, os requisitos desejáveis do estudante para que possa utilizá-lo eficientemente, e os recursos necessários em
Desenvolvedor Web Docente André Luiz Silva de Moraes
Roteiro 3: Layout básico e Div's: técnicas com uso de ID's e Classes Objetivos Compreender a importância do uso de Elementos de Div no desenvolvimento de Layouts de página; Explorar e aplicar o uso de
Manual de utilização do Zimbra
Manual de utilização do Zimbra Compatível com os principais navegadores web ( Firefox, Chrome e Internet Explorer ) o Zimbra Webmail é uma suíte completa de ferramentas para gerir e-mails, calendário,
HTML / JAVASCRIPT. A versão atual é o HTML5 (seus predecessores imediatos são HTML 4.01, XHTML 1.1, etc.).
HTML / JAVASCRIPT Estamos iniciando o estudo do HTML através das TAGS (comandos) para construir formulários. Isso facilitará a continuidade dos nossos estudos da linguagem de programação JavaScript, a
ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007
ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007 CURITIBA 2015 2 SUMÁRIO INTRODUÇÃO AO MICROSOFT POWERPOINT 2007... 3 JANELA PRINCIPAL... 3 1 - BOTÃO OFFICE... 4 2 - FERRAMENTAS DE ACESSO
JavaScript (Funções, Eventos e Manipulação de Formulários)
Linguagem de Programação para Web JavaScript (Funções, Eventos e Manipulação de Formulários) Prof. Mauro Lopes 1-31 23 Objetivos Iremos avançar um pouco mais em nosso estudo sobre o JavaScript. Iremos
CURSO DE PROGRAMAÇÃO EM JAVA
CURSO DE PROGRAMAÇÃO EM JAVA Introdução para Iniciantes Prof. M.Sc. Daniel Calife Índice 1 - A programação e a Linguagem Java. 1.1 1.2 1.3 1.4 Linguagens de Programação Java JDK IDE 2 - Criando o primeiro
O Windows 7 é um sistema operacional desenvolvido pela Microsoft.
Introdução ao Microsoft Windows 7 O Windows 7 é um sistema operacional desenvolvido pela Microsoft. Visualmente o Windows 7 possui uma interface muito intuitiva, facilitando a experiência individual do
Web Design. Prof. Felippe
Web Design Prof. Felippe 2015 Sobre a disciplina Fornecer ao aluno subsídios para o projeto e desenvolvimento de interfaces de sistemas Web eficientes, amigáveis e intuitivas. Conceitos fundamentais sobre
MANUAL DE INSTALAÇÃO 1) ORACLE VIRTUALBOX ; 2) MICROSOFT WINDOWS ; 3) SUMÁRIOS GENEPLUS.
PROGRAMA EMBRAPA DE MELHORAMENTO DE GADO DE CORTE MANUAL DE INSTALAÇÃO 1) ORACLE VIRTUALBOX ; 2) MICROSOFT WINDOWS ; 3) SUMÁRIOS GENEPLUS. MANUAL DE INSTALAÇÃO: 1) ORACLE VIRTUALBOX ; 2) MICROSOFT WINDOWS
AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS
UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIAS DA COMPUTAÇÃO BACHARELADO AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS Orientando: Oliver Mário
Gerador de aplicativos Oracle PL/SQL WEB baseado na estrutura das tabelas do. Wagner da Silva Orientando Prof. Alexander Roberto Valdameri Orientador
Gerador de aplicativos Oracle PL/SQL WEB baseado na estrutura das tabelas do banco de dados Oracle Wagner da Silva Orientando Prof. Alexander Roberto Valdameri Orientador Roteiro Introdução e Objetivos;
Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4.
1 Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4. Interface do sistema... 4 1.4.1. Janela Principal... 4 1.5.
Google Drive. Passos. Configurando o Google Drive
Google Drive um sistema de armazenagem de arquivos ligado à sua conta Google e acessível via Internet, desta forma você pode acessar seus arquivos a partir de qualquer dispositivo que tenha acesso à Internet.
DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES
DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES Alexandre Egleilton Araújo, Jaime Willian Dias Universidade Paranaense (Unipar) Paranavaí PR Brasil [email protected], [email protected] Resumo.
CAPÍTULO 35 Como utilizar os componentes ColdFusion
CAPÍTULO 35 Como utilizar os componentes ColdFusion Os componentes ColdFusion (CFC) permitem ao usuário encapsular lógicas de aplicação e de negócios (business logic) em unidades auto-controladas reutilizáveis.
HCT Compatibilidade Manual do Usuário
HCT Compatibilidade Manual do Usuário Índice Introdução...3 HCT Compatibilidade...3 Librix...3 Execução do Programa...4 Seleção de Testes...4 Testes Manuais...6 Teste de Teclado...6 Teste de Vídeo...7
O que é o JavaScript?
JavaScript Introdução O JavaScript é utilizado por milhões de páginas na web para melhorar o design, validar forms, e muito mais O JavaScript foi inicialmente desenvolvido pela Netscape e é a linguagem
MANUAL DE UTILIZAÇÃO
MANUAL DE UTILIZAÇÃO Módulo de operação Ativo Bem vindo à Vorage CRM! Nas próximas paginas apresentaremos o funcionamento da plataforma e ensinaremos como iniciar uma operação básica através do nosso sistema,
AULA 4 VISÃO BÁSICA DE CLASSES EM PHP
AULA 4 VISÃO BÁSICA DE CLASSES EM PHP Antes de mais nada, vamos conhecer alguns conceitos, que serão importantes para o entendimento mais efetivos dos assuntos que trataremos durante a leitura desta apostila.
2 Diagrama de Caso de Uso
Unified Modeling Language (UML) Universidade Federal do Maranhão UFMA Pós Graduação de Engenharia de Eletricidade Grupo de Computação Assunto: Diagrama de Caso de Uso (Use Case) Autoria:Aristófanes Corrêa
Aplicativo web para definição do modelo lógico no projeto de banco de dados relacional
Aplicativo web para definição do modelo lógico no projeto de banco de dados relacional Juarez Bachmann Orientador: Alexander Roberto Valdameri Roteiro Introdução Objetivos Fundamentação teórica Desenvolvimento
Especificação do 3º Trabalho
Especificação do 3º Trabalho I. Introdução O objetivo deste trabalho é abordar a prática da programação orientada a objetos usando a linguagem Java envolvendo os conceitos de classe, objeto, associação,
JSP - ORIENTADO A OBJETOS
JSP Orientação a Objetos... 2 CLASSE:... 2 MÉTODOS:... 2 Método de Retorno... 2 Método de Execução... 2 Tipos de Dados... 3 Boolean... 3 Float... 3 Integer... 4 String... 4 Array... 4 Primeira:... 4 Segunda:...
Especialização em Engenharia de Software - CEUT
Até aqui Programação com interfaces gráficas Sérgio Soares [email protected] Criamos a infra-estrutura para a aplicação bancária classes que representam os tipos de conta classe que implementa regras de
Software de segurança em redes para monitoração de pacotes em uma conexão TCP/IP
Software de segurança em redes para monitoração de pacotes em uma conexão TCP/IP Paulo Fernando da Silva [email protected] Sérgio Stringari stringari@furbbr Resumo. Este artigo apresenta a especificação
QUEM FEZ O TRABALHO?
Introdução a Linguagem HTML: Conceitos Básicos e Estrutura ANA PAULAALVES DE LIMA 1 QUEM FEZ O TRABALHO? Com as tagsaprendidas hoje, faça uma página HTML sobre você com as seguintes informações: Seu nome
Engenharia de Software III
Engenharia de Software III Casos de uso http://dl.dropbox.com/u/3025380/es3/aula6.pdf ([email protected]) 09/09/2010 O que são casos de uso? Um caso de uso procura documentar as ações necessárias,
Primeiro contato com JavaScript
Primeiro contato com JavaScript Visão Geral JavaScript É uma linguagem em formato script; Permite dinamizar funções do site e criar interatividade em páginas web. O JavaScript permite: Coletar dados dos
MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento. Toledo PR. Versão 2.0 - Atualização 26/01/2009 Depto de TI - FASUL Página 1
MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento Toledo PR Página 1 INDICE 1. O QUE É O SORE...3 2. COMO ACESSAR O SORE... 4 2.1. Obtendo um Usuário e Senha... 4 2.2. Acessando o SORE pelo
Sistema de Controle de Solicitação de Desenvolvimento
Sistema de Controle de Solicitação de Desenvolvimento Introdução O presente documento descreverá de forma objetiva as principais operações para abertura e consulta de uma solicitação ao Setor de Desenvolvimento
Acessando um Banco de Dados
Acessando um Banco de Dados Introdução Agora que você já está craque em JSP e já instalou seu servidor, vamos direto para a parte prática! Neste tutorial vamos aprender a acessar um banco de dados. Para
Técnicas de Programação II
Técnicas de Programação II Aula 03 GUI e Swing Edirlei Soares de Lima GUI Graphical User Interface A API Java fornece diversas classes destinadas a criação de interfaces gráficas.
Ferramenta de apoio a gerência de configuração de software. Aluno: Rodrigo Furlaneto Orientador: Everaldo Artur Grahl
Ferramenta de apoio a gerência de configuração de software Aluno: Rodrigo Furlaneto Orientador: Everaldo Artur Grahl Roteiro de apresentação Introdução Objetivos Fundamentação Teórica Gerência de Configuração
CONCEITOS INICIAIS. Agenda A diferença entre páginas Web, Home Page e apresentação Web;
CONCEITOS INICIAIS Agenda A diferença entre páginas Web, Home Page e apresentação Web; O que é necessário para se criar páginas para a Web; Navegadores; O que é site, Host, Provedor e Servidor Web; Protocolos.
Mais sobre uso de formulários Site sem Ajax
Mais sobre uso de formulários Site sem Ajax Página com busca padrão 1 Página com o resultado da busca carregada no local da anterior (o formulário está vazio) Site com Ajax 2 Site usando Ajax para preencher
Logo abaixo temos a Barra de Menus que é onde podemos acessar todos os recursos do PHP Editor.
Nessa aula iremos estudar: A anatomia da janela do PHP Editor Iniciando o servidor Web O primeiro exemplo de PHP Anatomia da janela do PHP Editor Barra de Títulos: É a barra azul que se encontra na parte
Análise de Dados do Financeiro
Análise de Dados do Financeiro Introdução Para reunir em um só local as informações de contas a pagar e receber cadastradas e/ou geradas no sistema TTransp existe a interface de análise de dados do financeiro.
Manual SAGe Versão 1.2 (a partir da versão 12.08.01)
Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação
UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA
Responda 1) Quem desenvolveu a linguagem C? Quando? 2) Existe alguma norma sobre a sintaxe da linguagem C? 3) Quais são os tipos básicos de dados disponíveis na linguagem C? 4) Quais são as principais
Java II. Sérgio Luiz Ruivace Cerqueira [email protected]
Java II Sérgio Luiz Ruivace Cerqueira [email protected] Por quê JSP? Com Servlets é fácil Ler dados de um formulário Recuperar dados de uma requisição Gerar informação de resposta Fazer gerenciamento
Apostilas OBJETIVA Escrevente Técnico Judiciário TJ Tribunal de Justiça do Estado de São Paulo - Concurso Público 2015. Caderno 1.
Caderno 1 Índice MS-Windows 7: conceito de pastas, diretórios, arquivos e atalhos, área de trabalho, área de transferência, manipulação de arquivos e pastas, uso dos menus, programas e aplicativos, interação
INTRODUÇÃO 12. DOCUMENTAÇÃO INTRODUÇÃO INTRODUÇÃO
INTRODUÇÃO 12. DOCUMENTAÇÃO Na plataforma Java SE 7, há cerca de 4000 classes e interfaces disponíveis para utilizarmos em nossas aplicações Podemos visualizar a documentação dessas classes e interfaces
Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL
Urano Indústria de Balanças e Equipamentos Eletrônicos Ltda. Rua Irmão Pedro 709 Vila Rosa Canoas RS Fone: (51) 3462.8700 Fax: (51) 3477.4441 Características do Software Urano Integra 2.2 Data: 12/05/2014
JTABLE STUDENT CONTROL JSC Gil Eduardo de Andrade / Emílio Rudolfo Fey Neto
JTABLE STUDENT CONTROL JSC Gil Eduardo de Andrade / Emílio Rudolfo Fey Neto INTRODUÇÃO / DESCRIÇÃO O sistema JTable Student Control - JSC disponibiliza uma interface gráfica em Java que possibilita ao
Manual do PolicyKit-kde. Daniel Nicoletti Tradução: Luiz Fernando Ranghetti
Daniel Nicoletti Tradução: Luiz Fernando Ranghetti 2 Conteúdo 1 Resumo 5 2 Como funciona 6 2.1 Resumo............................................ 6 2.2 O problema.........................................
FCT Faculdade de Ciências e Tecnologia Serviço Técnico de Informática STI SGCD Sistema Gerenciador de Conteúdos Dinâmicos
FCT Faculdade de Ciências e Tecnologia Serviço Técnico de Informática STI SGCD Sistema Gerenciador de Conteúdos Dinâmicos Manual do Usuário Presidente Prudente, outubro de 2010 Índice 1. Introdução e Instruções
LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes [email protected]
LP II Estrutura de Dados Introdução e Linguagem C Prof. José Honorato F. Nunes [email protected] Resumo da aula Considerações Gerais Introdução a Linguagem C Variáveis e C Tipos de
Upload e Download de Arquivos. Ao programador Morfik, cabe implementar em sua aplicação os mecanismos gerenciem todo o processo acima.
Upload e Download de Arquivos Considerações gerais. As aplicações Web 2 tem como uma de suas características principais, o fato de permitirem aos usuários, que eles mesmo criem conteúdo, sem depender de
Introdução. à Linguagem JAVA. Prof. Dr. Jesus, Edison O. Instituto de Matemática e Computação. Laboratório de Visão Computacional
Introdução à Linguagem JAVA Prof. Dr. Jesus, Edison O. Instituto de Matemática e Computação Laboratório de Visão Computacional Vantagens do Java Independência de plataforma; Sintaxe semelhante às linguagens
Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR
Novell Teaming - Guia de início rápido Novell Teaming 1.0 Julho de 2007 INTRODUÇÃO RÁPIDA www.novell.com Novell Teaming O termo Novell Teaming neste documento se aplica a todas as versões do Novell Teaming,
Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção
Este procedimento corresponde ao fluxo de trabalho de Indexação de OCR com separação de código de correção no programa de treinamento do Capture Pro Software. As etapas do procedimento encontram-se na
Pacote Java Swing Parte 1
Pacote Java Swing Parte 1 José Gustavo de Souza Paiva Introdução GUI (Graphical User Interface) Mecanismo amigável ao usuário para interagir com um aplicativo Proporciona a um aplicativo uma aparência
FERRAMENTA WEB PARA MODELAGEM LÓGICA EM PROJETOS DE BANCOS DE DADOS RELACIONAIS
FERRAMENTA WEB PARA MODELAGEM LÓGICA EM PROJETOS DE BANCOS DE DADOS RELACIONAIS PAULO ALBERTO BUGMANN ORIENTADOR: ALEXANDER ROBERTO VALDAMERI Roteiro Introdução Objetivos Fundamentação teórica Desenvolvimento
Procedimentos para Reinstalação do Sisloc
Procedimentos para Reinstalação do Sisloc Sumário: 1. Informações Gerais... 3 2. Criação de backups importantes... 3 3. Reinstalação do Sisloc... 4 Passo a passo... 4 4. Instalação da base de dados Sisloc...
COMO FUNCIONA UM FORMULÁRIO
FORMULÁRIOS Constitui-se numa das formas de a máquina cliente enviar informações para que um programa no servidor receba estes dados, processe-os e devolva uma resposta ao usuário, por meio do navegador,
Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo
Universidade Federal do Espírito Santo Centro Tecnológico Departamento de Informática Disciplina: INF 02810 Prof.: ([email protected]) Conteúdo 1. Introdução 2. Processo de Software 3. Gerência de
NetBeans. Conhecendo um pouco da IDE
NetBeans Conhecendo um pouco da IDE Professor: Edwar Saliba Júnior Sumário Apresentação:...1 Criando Um Novo Projeto de Software:...1 Depurando Um Código-fonte:...4 Entendendo o Código-fonte:...7 Dica
Projeto SAT-CF-e Guia de Procedimentos para uso do SGR-SAT por Software Houses (Desenvolvedor)
1 Projeto SAT-CF-e Guia de Procedimentos para uso do SGR-SAT por Software Houses (Desenvolvedor) Índice 1. Introdução... 01 2. Uso do SGR-SAT... 01 2.1 Cadastramento da empresa junto à Sefaz... 02 2.2
Associação Carioca de Ensino Superior Centro Universitário Carioca
Desenvolvimento de Aplicações Web Lista de Exercícios Métodos HTTP 1. No tocante ao protocolo de transferência de hipertexto (HTTP), esse protocolo da categoria "solicitação e resposta" possui três métodos
PÓS-GRADUAÇÃO EM MATEMÁTICA COMPUTACIONAL INFORMÁTICA INSTRUMENTAL Aula 06: Introdução Linguagem HTML
PÓS-GRADUAÇÃO EM MATEMÁTICA COMPUTACIONAL INFORMÁTICA INSTRUMENTAL Aula 06: Introdução Linguagem HTML O Desenvolvimento Web O desenvolvimento web é o termo utilizado para descrever atividade relacionada
Persistência de Classes em Tabelas de Banco de Dados
UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 1 Persistência de Classes em Tabelas de Banco de Dados 1) Introdução! Em algumas situações, pode ser necessário preservar os objetos
Informática Básica. Microsoft Word XP, 2003 e 2007
Informática Básica Microsoft Word XP, 2003 e 2007 Introdução O editor de textos Microsoft Word oferece um conjunto de recursos bastante completo, cobrindo todas as etapas de preparação, formatação e impressão
2 Geração Dinâmica de Conteúdo e Templates de Composição
2 Geração Dinâmica de Conteúdo e Templates de Composição Alguns dos aspectos mais importantes na arquitetura proposta nesta dissertação são: a geração dinâmica de conteúdo e a utilização de templates de
O Primeiro Programa em Visual Studio.net
O Primeiro Programa em Visual Studio.net Já examinamos o primeiro programa escrito em C que servirá de ponto de partida para todos os demais exemplos e exercícios do curso. Agora, aprenderemos como utilizar
Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna
O que é uma planilha eletrônica? É um aplicativo que oferece recursos para manipular dados organizados em tabelas. A partir deles pode-se gerar gráficos facilitando a análise e interpretação dos dados
Manual do Sistema "Vida Controle de Contatos" Editorial Brazil Informatica
Manual do Sistema "Vida Controle de Contatos" Editorial Brazil Informatica I Vida Controle de Contatos Conteúdo Part I Introdução 2 1 Vida Controle... de Contatos Pessoais 2 Part II Configuração 2 1 Configuração...
SCE-557. Técnicas de Programação para WEB. Rodrigo Fernandes de Mello http://www.icmc.usp.br/~mello [email protected]
SCE-557 Técnicas de Programação para WEB Rodrigo Fernandes de Mello http://www.icmc.usp.br/~mello [email protected] 1 Cronograma Fundamentos sobre servidores e clientes Linguagens Server e Client side
