Baixe o app para aproveitar ainda mais
Prévia do material em texto
138 Unidade IV Unidade IV 7 ESTAÇÃO JAVASCRIPT 7.1 JavaScript No JavaScript, os objetos são o centro do seu desenvolvimento: quase tudo é um objeto ou age como um, sendo assim, iremos, então, examinar a criação de objetos JavaScript. 7.1.1 Objetos JavaScript Um objeto é nada mais do que um contêiner para uma coleção de valores nomeados, ou seja, antes mesmo de analisarmos qualquer código JavaScript, vamos primeiro raciocinar sobre isso, com base no exemplo da tabela a seguir. Exemplo de aplicação Tabela 5 – Alunos alocados no banco de dados Aluno Propriedade Valor da propriedade Idade 33 Gênero Masculino A palavra “aluno” na tabela é apenas um rótulo para o grupo de nomes de propriedades e valores correspondentes que compõem exatamente o que é um aluno. JavaScript, no entanto, não fala em tabelas, e sim em objetos, que são semelhantes às partes contidas na tabela, conforme ilustrado na figura a seguir. Os exemplos colocados poderão ser desenvolvidos no Visual Studio Code, Microsoft Visual Studio, Sublime Text ou no editor de sua preferência. 139 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 118 – Exemplo de código JavaScript Mantenha esse estudo em primeiro plano: os objetos são realmente apenas recipientes para propriedades, onde cada um detém um nome e um valor. Essa noção de um recipiente de propriedades com valores nomeados (ou seja, um objeto) é utilizada pelo JavaScript, como os blocos de construção, para assim expressar valores nele. O objeto “aluno” é um valor que nós expressamos como um objeto JavaScript criando-o, dando um nome e, por fim, fornecendo as suas propriedades. Até o momento, o objeto “aluno” que estamos estudando tem apenas informações estáticas, ou seja, como estamos lidando apenas com uma linguagem de programação, queremos programar nosso objeto para realmente tentar fazer alguma coisa, caso contrário, tudo o que realmente temos é um banco de dados semelhante ao JSON. Para dar vida ao objeto “aluno”, precisamos adicionar um método de propriedade, ou seja, métodos de propriedade que possibilitem a execução de uma função. Para ser mais eficaz em nossa definição, em JavaScript, métodos são propriedades que contêm um objeto Function(), cuja intenção é de simplesmente operar no objeto em que a função está contida. Se porventura atualizarmos a tabela aluno com um método getGenero, ficaria disponibilizada, conforme segue: Tabela 6 – Método getGenero apresentado na classe aluno Aluno Propriedade Valor da propriedade Idade 33 Gênero Masculino getGenero Retornar o valor do sexo 140 Unidade IV O método getGender é uma propriedade do objeto aluno, que é utilizado para retornar um dos outros valores de propriedade de aluno: o valor “masculino” armazenado na propriedade gênero. Sendo assim, podemos avaliar que, sem métodos, nosso objeto não faria muito, exceto armazenar propriedades estáticas, conforme pode ser visto a seguir. Figura 119 – Método getGenero apresentado no JavaScript Saiba mais A JSON (JavaScript object notation – notação de objetos JavaScript) é considerada uma formatação leve de alternância de dados. Leia sobre o assunto em: INTRODUÇÃO ao JSON. In: CROCKFORD, D. How JavaScript works. Califórnia, EUA: Virgule-Solidus LLC, 2018. Disponível em: https://www. json.org/json-pt.html. Acesso em: 23 set. 2020. O objeto aluno que estamos estudando é conhecido como Object(). Criamos o objeto aluno utilizando um objeto em branco que nos foi apresentado denominando essa função construtora, ou seja, podemos pensar nas funções do construtor como um modelo para produzir objetos predefinidos. No caso do objeto aluno, utilizamos a função construtora Object() para produzir um objeto vazio que chamamos de aluno. 141 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Aluno é um objeto construído a partir do Object() construtor, então chamamos aluno de um Object(). O que nós realmente precisamos definir de maneira clara, é que além da criação de um Object() simples como “aluno”, a maioria dos valores expressos em JavaScript são objetos. Vamos considerar que o objeto aluno criado a partir da função construtora Object() não seja realmente distinta de um objeto string elaborado através da função construtora String(): Figura 120 – Exemplo de construtor JavaScript Como podemos observar no exemplo anterior, myObject e myString são objetos, ou seja, ambos podem ter suas propriedades, herdar suas propriedades e são produzidos a partir de uma função construtora. A variável myString, que acopla o valor da string “foo” parece ser o mais simples possível, porém de forma surpreendente possui uma estrutura de objeto sob sua superfície. 142 Unidade IV Se nós examinarmos os dois objetos produzidos, vamos perceber que eles são objetos idênticos em substância, porém não em tipo, ou seja, mais importante, espero que possamos começar a visualizar que o JavaScript utiliza objetos para expressar valores, conforme apresentado na figura. Figura 121 – Exemplo de construtor JavaScript: pessoa A função construtora Pessoa() definida pelo usuário pode produzir objetos Pessoa, sendo assim, como a função construtora String() nativa pode produzir objetos string, o construtor Pessoa() não é inferior e não é mais ou menos maleável do que o construtor String() nativo ou qualquer um dos construtores nativos utilizados no JavaScript. É importante observar que a função construtora Object() e o novo construtor Pessoa(), demonstrado no exemplo de código anterior, podem nos dar resultados idênticos, porém ambos podem produzir um objeto semelhante com as mesmas propriedades e métodos de propriedade. 143 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET 7.1.2 Construtores JavaScript criam e retornam instâncias de objetos O papel de uma função construtora é possibilitar o desenvolvimento de vários objetos que compartilham, por exemplo, certas qualidades e comportamentos. Basicamente, uma função construtora é um cortador de frutas para produzir objetos que possuem propriedades e métodos de propriedade padrão. Se dissermos que um construtor nada mais é do que uma função, poderia ser respondido “você está correto, a menos que essa função seja chamada usando a nova palavra-chave”; por exemplo, nova String (“foo”). Quando isso tende a acontecer, uma função assume uma atribuição especial e o JavaScript a trata como especial, definindo, assim, o valor desse elemento para a função no novo objeto que está sendo construído. Além desse comportamento especial, a função retornará o objeto recém-criado por padrão, em vez do valor false. O novo objeto retornado da função pode ser considerado uma instância da função construtora que a constrói. Por exemplo, podemos considerar o construtor Pessoa() novamente, mas dessa vez gostaríamos que acompanhasse a leitura dos comentários no exemplo de código a seguir com atenção, pois destacam o efeito da nova palavra-chave, conforme apresentado: Figura 122 – Exemplo de construtor 144 Unidade IV A construção do código anterior utiliza uma função construtora definida pelo usuário, por exemplo, Pessoa(), para criar o objeto aluno, e isso não é diferente do construtor Array(), que cria um objeto Array(), conforme apresentado a seguir: Figura 123 – Exemplo de código com Array Em JavaScript, a maioria dos valores envolve objetos que foram criados, ou instanciados, a partir de uma função construtora. Um objeto retornado de um construtor é denominado de instância. Observação Array em tecnologia pode ser definido como um arranjo de uma estrutura de dados capaz de proporcionar o armazenamento de uma coleção de elementos de tal maneira que cada um dos seus itens implementados possa ser facilmente identificado por, pelo menos, um índice ou uma chave. 7.1.3 Os construtores de objetos JavaScript nativos A linguagem JavaScript tem por definição nove construtores de objetos nativos (ou internos), sendo que eles são utilizados pelo JavaScript para desenvolver a linguagem e, por “construção”, podemos dizerque esses objetos são utilizados para expressar valores de objetos no código JavaScript, além de organizar diversos recursos da linguagem. Sendo assim, os construtores de objetos nativos podem ser multifacetados, na medida em que produzem objetos, porém também são aproveitados para facilitar muitas das convenções de programação da linguagem, como, por exemplo, funções que são objetos criados a partir do construtor Function(), mas também são utilizados para gerar outros objetos quando chamados como funções de construtor utilizando a nova palavra-chave. 145 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Os nove construtores de objetos nativos que vêm predefinidos com JavaScript são: • Number() • String() • Boolean() • Object() • Array() • Function() • Date() • RegExp() • Error() Saiba mais Recomenda-se a leitura dos nove construtores de objetos nativos em: STANDARD built-in objects. JavaScript reference. Developer.Mozilla. Disponível em: https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Reference/Global_Objects. Acesso em: 2020. O JavaScript é constituído basicamente a partir desses nove objetos (além de valores primários de cadeia, número e booleano). 7.1.4 Funções Uma função é um contêiner de instruções de código que podem ser chamadas utilizando o operador parênteses (), ou seja, os parâmetros podem ser trafegados entre parênteses durante a invocação, para que as instruções na função possam acessar determinados valores quando esta é invocada. No exemplo apresentado na figura a seguir, identificaremos a construção de duas versões de um objeto de função addNumbers, um utilizando o novo operador e outro o padrão literal mais comum. Ambos estão esperando dois parâmetros, ou seja, em cada caso, invocamos a função, passando parâmetros no operador parênteses (). 146 Unidade IV Figura 124 – Exemplo de aplicação do addNumbers Uma função pode ser utilizada para retornar um valor, construir um objeto ou como um mecanismo para simplesmente executar o código, ou seja, o JavaScript tem uma utilidade para funções, mas, na sua maneira mais básica, uma função é simplesmente um escopo exclusivo de instruções executáveis. 7.1.5 Parâmetros de funções O construtor Function() utiliza-se de um número indefinido de parâmetros, porém o último parâmetro esperado pelo construtor Function() é uma sequência que contém instruções que compõem o corpo da função. Quaisquer parâmetros trafegados para o construtor antes do último estarão disponíveis para a função que está sendo criada, ou seja, também é possível enviar vários parâmetros como uma sequência separada por vírgula. No exemplo apresentado na figura a seguir, estudaremos a diferença do uso do construtor Function() com os padrões mais comuns de instanciar um objeto de função. Figura 125 – Exemplo de aplicação de function 147 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET As funções podem ser canceladas a qualquer instante durante a chamada, utilizando a palavra-chave return com ou sem um valor. No exemplo apresentado na figura a seguir, identificaremos o cancelamento da função de adição se os parâmetros forem indefinidos ou não forem um número. Figura 126 – Exemplo de cancelamento de function 7.1.6 Array Um array (matriz) é uma lista ordenada de valores, normalmente criada com a finalidade de percorrer valores indexados, iniciando com o índice zero. O que precisamos saber é que um array em posição de objeto possui uma definição de nomes e propriedades associada a valores em ordem não numérica também. Essencialmente, as matrizes utilizam números como uma chave de pesquisa, enquanto os objetos têm nomes de propriedades definidas pelo usuário. O JavaScript não possui matrizes associativas verdadeiras, mas os objetos podem ser utilizados para obter a funcionalidade das matrizes associativas. 148 Unidade IV No exemplo apresentado na figura a seguir, iremos armazenar quatro sequências de caracteres no myArray, que poderemos acessar utilizando um índice numérico. Figura 127 – Exemplo de aplicação de array 7.1.7 Parâmetros de matrizes Nós poderemos passar os valores de uma instância de matriz para o construtor como parâmetros separados por vírgula. O construtor Array() pode levar aproximadamente até 4.294.967.295 parâmetros. No entanto, se apenas um parâmetro for enviado ao construtor Array() e esse valor for um número inteiro, ele será utilizado para realizar a configuração do comprimento da matriz, e não será usado como um valor contido na matriz, conforme apresentado a seguir: Figura 128 – Exemplo de aplicação de array com parâmetros 149 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET 7.2 Uso de roteamento de soluções MVC O MVC (model→view→controller) pode ser considerado um pattern de arquitetura para o desenvolvimento de aplicativos web. Ele pode estabelecer a segregação de três camadas: model, view e controller, sendo que se pode considerar que a camada model corresponde a dados e regras determinadas para a manipulação de todos os itens. Todas as estruturas são manipuladas inicialmente por controllers, servindo como base para a implementação e apresentação de dados pela camada view. Observação O estudo de diagramação UML, bem como diagrama de sequência, agregam no entendimento do conceito de aplicação MVC, pois são recursos que se complementam na análise e desenvolvimento de aplicações em camadas web. A camada controller tem for finalidade tratar todas as requisições, sendo, assim, efetuada por meio de métodos declarados na mesma classe controller. E, por fim, a camada view tem o objetivo de centralizar todas as ações e apresentá-las dentro da página .aspx. Pode-se entender todo o fluxo da seguinte maneira: • A camada de apresentação exibe elementos da interface do cliente do site e encapsula toda a estrutura lógica que inclui desde interação até integração de cliente e regras de negócio. • A camada de controle, também conhecida como camada de negócio, retorna ao cliente o resultado de toda a regra de negócio encapsulada na classe (C#). • A camada de acesso a dados detém todos os métodos e conexões inseridas, que retornam para a camada de negócio toda a execução efetuada em banco de dados, feita em classe (C#). Observação Para o desenvolvimento de todas as classes (sejam de controle ou de acesso a dados ou modelo), recomendamos a utilização de classes C#, bem como o conhecimento em programação orientada a objetos. 150 Unidade IV A arquitetura de três camadas também pode ser estudada como uma solicitação enviada ao servidor na qual a interface com o cliente efetua processos de regras de negócio a fim de armazenar dados que são desenvolvidos e armazenados de maneira independente, ou até mesmo em plataformas separadas, conforme apresentado a seguir. Figura 129 – Exemplo de aplicação MVC Após a seleção do template (figura anterior), será criado o projeto utilizando a arquitetura ASP.NET MVC, apresentado nas figuras a seguir. Figura 130 – Identificação de projeto MVC no Visual Studio .NET 151 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 131 – Escolha de template dentro do Visual Studio Saiba mais Recomenda-se a leitura do livro-texto de Programação Orientada a Objetos II, pois esse capítulo trata sobre back-end, que usaremos como linguagem base C#. Aconselha-se também a instalação da última versão do Visual Studio, para que o exemplo apresentado em Web Forms possa ser executado com sucesso. Para verificação da última versão do Microsoft Visual Studio, consultar o link: DOWNLOADS. Visual Studio. Microsoft. 2020. Disponível em: https:// visualstudio.microsoft.com/pt-br/downloads/. Acesso em: 24 set. 2020. Atualmente, mais de 80% dos projetos são desenvolvidos utilizando a arquitetura MVC, por conta da segregação de código e principalmente do paralelismo que é feito com a parte de análise do projeto. O conceito de MVC vem ao encontro de alguns diagramas da UML (tais como o Diagrama de Caso de Uso, Sequência e Classe), que são de extremaimportância para o desenvolvimento de qualquer aplicação atualmente. 152 Unidade IV Observação O estudo de diagramas UML é essencial; por exemplo, diagrama de caso de uso e diagrama de sequência, classe e atividade, que serão a base de todo o desenvolvimento web efetuado neste livro-texto. 7.3 Razor O Razor agrega uma série de características importantes, que possibilitam, por intermédio de um objetivo natural, a construção de páginas com a estrutura de ASP.NET MVC, porém essa ideia nasceu a partir da versão 3. Uma das características importantes construídas no Razor é que ele foi desenvolvido para ser expressivo, compacto e ágil: a finalidade foi construir um mecanismo capaz de reduzir ao máximo o número de caracteres necessários para a codificação de uma página aspx. O View Engine Default do ASP.NET (aspx), é conhecido por possuir uma sintaxe muito próxima à do HTML, com abertura e fechamento de tags em páginas aspx. No Razor não conseguimos identificar esse item, reduzindo, portanto, a quantidade de texto necessário para a codificação de itens contidos em controle, ou “parte” da página aspx. Tratando exclusivamente da redução significativa de caracteres, do ponto de vista do programador da página aspx, todo o processo passa a ficar muito mais eficaz, o que significa que se perde menos tempo na codificação das páginas aspx. Ao contrário da maioria dos View Engines, com o Razor não é necessário ficar desenvolvendo abertura e fechamento dos blocos de código. O parser do Razor é inteligente e capaz de separar o que é código HTML do código C# ou VB.NET, por exemplo. Todo esse universo garante um código eficaz e limpo, facilitando não só a sua escrita inicial, mas deixando fácil a manutenção posterior nessas páginas aspx. Outra característica muito importante do Razor é a sua facilidade de aprendizagem. Como ele, podemos considerar como um dos pontos a sua composição de HTML e C# (ou vb.net); qualquer programador .NET com conhecimento básico em HTML conseguirá com grande facilidade capturar a estrutura do Razor, e em pouco tempo estará com conhecimento a escrever páginas aspx com o novo template. Provavelmente outro ponto importante do Razor é o fato de ele não ser uma “nova linguagem”, ou seja, ao contrário de todos os View Engines existentes, ele faz utilização de sua própria linguagem C#/VB, o que torna sua aderência ainda mais efetiva e eficaz. 153 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Considerando também que o Razor não depende exclusivamente de nenhuma ferramenta para ser escrito, ou seja, não dependeria também do Visual Studio. É possível desenvolver páginas com Razor em qualquer editor de texto, até mesmo no Notepad, caso seja necessário utilizar essa ferramenta para tal desenvolvimento. Levando-se em consideração ainda que, ao escolher utilizar o Razor no Visual Studio, o programador consegue ganhar todos os recursos de IntelliSense e statement completion (recurso que “completa” palavras do código que podem ser automaticamente identificadas). Pensando, claro, que com esses recursos o processo de desenvolvimento de páginas se torna ainda mais rápido e eficiente. Outro ponto interessante do Razor, é que ele é totalmente amigável para efetuar testes, trabalhando-se com testes unitários. Com o Razor é possível criar testes unitários para verificação das Views do aplicativo web, sem que haja necessidade de conhecer o Controller que renderiza a View e vice-versa. Mesmo assim, ele passa a ser apenas mais uma escolha que é necessária fazer ao criar as Views de um aplicativo web. A View Engine default do ASP.NET sempre irá funcionar e proporcionar uma grande opção. Adaptado de: Sendin (2009). 7.4 Rest Podemos definir Representational State Transfer (Rest) como um estilo de arquitetura que se assenta em uma série de princípios. A ascensão do Rest nos últimos anos está ligada ao design da API que a maioria dos aplicativos da web oferece para estender suas funcionalidades. Mesmo que não esteja vinculado ao HTTP, ele geralmente está associado aos aplicativos da web. HTTP se encaixa bem com os seus princípios. Os princípios do Rest são: interface uniforme, sem estado, armazenável em cache, cliente-servidor, sistema em camadas e código sob demanda. Essa é uma breve introdução à arquitetura Rest. O que precisamos entender é o princípio básico e uma imagem geral do aplicativo. A ideia do Rest sobre HTTP é usar a funcionalidade do protocolo o máximo possível, para que não tenhamos que reinventar a roda. Um recurso pode ser uma postagem num blog, um cliente, um documento e, em geral, qualquer coisa que desejamos expor. Um recurso tem um identificador, como um registro em um banco de dados tem uma chave primária. Da mesma maneira, um recurso possui um URI que identifica o próprio recurso, que não é uma representação do recurso que pode assumir diferentes formatos. É apenas um identificador que podemos usar para acessar o recurso. Podemos solicitar o recurso com o URI, e o que obtemos é uma representação desse recurso solicitado em um formato específico. O formato é negociado entre o cliente e o servidor e pode ser qualquer 154 Unidade IV coisa, desde os XML e JSON mais usados, até HTML, PNG, CSV ou outros formatos binários. Com a representação do recurso, o cliente pode manipular o estado e operar com o recurso usando o servidor, se tiver os direitos para fazê-lo. O servidor nunca deve armazenar informações sobre os clientes. Isso significa que, quando uma solicitação chega ao servidor, o servidor carrega o recurso do armazenamento (geralmente um banco de dados) e envia de volta a representação ao cliente. Esse é o estado do recurso. Se um segundo depois o estado no armazenamento for alterado devido a uma nova solicitação que chega, o cliente não deve saber. Sem estado também significa que o servidor nunca deve usar sessões ou outros mecanismos para armazenar informações do cliente, e todas as solicitações não estão correlacionadas com solicitações passadas ou futuras. O servidor pode estender a funcionalidade do cliente passando código executável. Por exemplo, um servidor pode enviar JavaScript ao cliente para que ele possa executar algum tipo de operação nos dados. Se lermos cuidadosamente esses princípios, notamos que o foco principal é a escalabilidade. O fato de o servidor não armazenar informações do cliente permite economizar memória. O sistema em camadas nos permite usar servidores de cache como um balanceador de carga para obter escalabilidade. Adicionar novos servidores e seguir os princípios cliente-servidor nos permite alterar a implementação (por exemplo, passando de um banco de dados SQL para o armazenamento NoSQL) sem o conhecimento do cliente. Mas como obtemos isso e como funciona? No documento original que descreve o Rest, Roy Fielding não vincula a arquitetura Rest ao HTTP, mas, como afirmado anteriormente, o HTTP parece perfeito para criar uma API REST, já que a maioria das coisas nesse estado já está construída no próprio protocolo (cache, por exemplo). A web em si é Rest: temos o URL, que é o identificador da página que precisamos, digitamos o URL no navegador para obter uma representação no formato HTML e usamos um link para transferir o estado para outra página. Um aspecto do Rest que contrasta com Soap (RPC) é que a operação no recurso é baseada no verbo HTTP usado em combinação com o URI. O HTTP tem a noção de verbos. Estamos acostumados a get e post, pois o navegador gerencia esses dois verbos, mas outros são especificados na especificação HTTP (RFC 2616) que pode ser usada para outras operações. A lista completa de verbos é: options, get, head, post, put, patch, delete, trace e connect. Eles podem ser usados com seu significado semântico; portanto, quando precisamos ler um recurso, podemos usar o método get e, quando precisamos excluir um recurso, podemos usar um delete, e assim por diante. Como ilustrado no quadro a seguir, usando o URI correto e o verbo correto, temosas operações Crud (criar, ler, atualizar, excluir) prontas para serem usadas. 155 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Quadro 11 – Verbos e significados HTTP Verbo URI Description Get /posts Obtenha a lista de postagens. Get /posts/42 Obtenha uma única postagem (com o ID 42). Delete /posts/42 Exclua a publicação 42. Post /posts Crie uma postagem. Put /posts/42 Atualize a postagem. Patch /post/42 Atualize parcialmente. Options /post/42 Recupere a operação disponível no recurso. Head /post/42 Retorne apenas o cabeçalho HTTP. Como mostrado, usando o URI correto e o verbo correto, temos as operações Crud (criar, ler, atualizar, excluir) prontas para serem usadas. Depois que uma solicitação é emitida para o servidor, este a analisa e cria a resposta para retornar os dados ou resultados ao cliente. Cada resposta é representada com um estado e um status HTTP, que deve ser usado semanticamente para informar o cliente do resultado. A operação get é usada para ler um recurso. O URI especifica o recurso que estamos lendo e podemos usar o cabeçalho accept para solicitar um formato específico. Quando o post é usado para criar um recurso, os dados do recurso são enviados ao servidor como parte do corpo da solicitação. O servidor responde com o status “201 created” se tudo correr bem. Quando um novo recurso é criado, é uma prática recomendada usar o cabeçalho location na resposta para especificar o URI do recurso recém-criado. O put é usado para modificar o recurso. O URI especifica o recurso que queremos modificar e o corpo contém os novos valores de recurso. O código de status HTTP da resposta deve ser “200 OK” ou “204 sem conteúdo” se a resposta não contiver o recurso modificado. Não é necessário retornar o URI do próprio recurso no cabeçalho location, porque o cliente já o conhece. O put deve ser idempotente, o que significa que o resultado de uma solicitação bem-sucedida é independente do número de vezes que é executada. Tem que ser possível fazer duas chamadas iguais para o servidor, e este não deve retornar erros; a segunda chamada simplesmente refaz a atualização, mesmo que não altere o recurso. Delete é usado para excluir o recurso. O resultado pode ser “200 OK” ou “204 sem conteúdo” se a resposta não contiver um corpo. Pode ser “404 não encontrado” se o URI não estiver correto e o recurso não puder ser encontrado. 156 Unidade IV 7.5 Exemplo de API Web Então um aplicativo Web ASP.NET MVC 4 é criado e, na segunda etapa, escolhe-se o modelo de API Web. Uma vez criado, o projeto é quase idêntico a um projeto clássico do ASP.NET MVC e, na verdade, mantém muitos conceitos desse tipo de projeto. Aqui está: a estrutura da solução como aparece após a criação do projeto, conforma apresentado a seguir. Figura 132 – A estrutura do projeto da API Web As coisas mais importantes a serem observadas são: • As pastas controladores, modelos e exibições são obtidas do ASP.NET MVC. Como veremos mais adiante, a API Web usa o mesmo padrão MVC, portanto teremos controladores e modelos. Também existe uma pasta views, mas não é muito útil em um contexto de API, mesmo que possamos retornar uma visualização ao nosso chamador. • Além da pasta visualizações, existem pastas imagens, scripts e conteúdo. Elas não são usadas com frequência, pois uma API geralmente é usada para retornar dados, não uma interface do usuário. • A pasta App_Start é usada para configurar a API. Ela contém vários configuradores para ajustar o comportamento da API. Essa pasta também possui algumas configurações para a parte do ASP.NET MVC. 157 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Como você pode observar com esse modelo de projeto, podemos criar aplicativos ASP.NET MVC e aplicativos API, já que os dois têm muito em comum. Vamos aprofundar um pouco, abrindo a pasta controllers e dando uma olhada na classe ValuesController, conforme apresentado nas figuras a seguir. Figura 133 – Controller: API Web Figura 134 – Continuação do controller: API Web 158 Unidade IV Após o uso e o namespace, encontramos uma declaração de classe. A classe ValuesController herda de ApiController. Ela não é relativa à classe base do controlador usada no ASP.NET MVC, embora tenha muitas semelhanças. Ela serve como uma classe base para todos os recursos que decidimos expor por meio da API. Dentro dessa classe, encontramos todos os verbos padrão para manipular o recurso value: get, post, put e delete. O nome dos métodos aqui é importante, pois o tempo de execução da API Web do ASP.NET usa convenções para encontrar a ação a ser chamada em uma solicitação HTTP. Portanto, o método get é utilizado para obter uma coleção de valores e um único valor, considerando seu ID. O método put é utilizado para inserir e modificar o recurso de valor (value), enquanto o método delete é utilizado para excluir um recurso com o ID. Como podemos observar, os cinco métodos são as ações chamadas contra uma solicitação HTTP get, post, put ou delete. Como um aplicativo Web ASP.NET MVC, os projetos de API Web usam um sistema de roteamento. A configuração das rotas está em um arquivo chamado WebApiConfig.cs na pasta App_Start. Aqui está o conteúdo desse arquivo, conforme apresentado: Figura 135 – WebApiConfig.cs Essa classe possui um método que é chamado a partir da classe WebApiApplication no global. asax. Esse método registra as rotas necessárias pelo aplicativo. Por padrão, o ValuesController definido antes responde ao URI / api / Values, como podemos ver no código anterior. Observe que essas rotas, apesar de muito semelhantes às rotas do ASP.NET MVC, são uma pilha completamente diferente. Nesse caso, o tipo de rota é IHttpRoute e a implementação está contida no assembly System.Web.Http, portanto é integralmente novo e não está vinculado ao System.Web. Mesmo se forem diferentes, eles são implementados quase da mesma maneira: cada rota possui um nome e um modelo que são “tokenizados” para corresponder aos padrões de entrada. 159 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Até agora, vimos o controlador Values, que tem o dever de gerenciar o recurso Values e um sistema de roteamento simples para rotear a solicitação para o controlador correspondente. Vamos, então, simular a execução do aplicativo API Web para ver como ele funciona. Uma vez executado, ele abre um servidor web local para uma porta específica. E em seguida, construiremos uma API Web, para tratar o retorno de informações dos alunos, tais como: nome, RA e idade em formato json. Exemplo de aplicação Este exemplo será desenvolvido de maneira sequencial em suas figuras, utilizando-se o Visual Studio 2019. Na figura a seguir, observa-se a seleção do template aplicativo Web ASP.NET (.NET Framework). Deve-se atentar à linguagem que será utilizada no back-end, que será o C#. Após validar as informações, acionar o botão próximo. Figura 136 – Criando um projeto API Web 160 Unidade IV Define-se o nome do projeto na caixa “Nome do projeto” e em qual local do computador será armazenado o exemplo. Após o preenchimento dos campos, acionar o botão “Criar”: Figura 137 – Criando um projeto API Web Escolhe-se o template API Web e aciona-se o botão “Criar”: Figura 138 – Criando um projeto API Web 161 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET A seguir, é possível visualizar um Solution Explorer (gerenciador de soluções), com as pastas “Controllers” (controle) e “Models” (modelo): Figura 139 – Estruturando um projeto API Web Nesta etapa, criaremos as classes: • AlunoController.cs na pasta Controllers. • Aluno.cs, AlunoRepositorio.cs e IAlunoRepositorio.cs na pasta Models. Nas figuras a seguir, demonstra-se como criar uma classe dentro da pasta Models, clicando com o botão direito e selecionando a opção “Adicionar”, depois Classe, e nomeando-a, no exemplo, Aluno.cs. 162 Unidade IV Este passo deve ser seguido sempre que for solicitada a criação de uma classe na pasta Models, Controller etc. Figura 140 – Adicionando uma classeFigura 141 – Adicionando uma classe 163 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Conforme indicado nas figuras a seguir, desenvolve-se dentro da classe AlunoController os seguintes métodos: • GetAllAlunos: responsável por apresentar todos os dados dos alunos cadastrados. • GetAluno: responsável por apresentar o registro de um aluno específico que foi solicitado através do seu RA. • GetAlunosPorIdade: responsável por apresentar o registro de um aluno específico que foi solicitado através da sua idade. • GetPostAluno: responsável por adicionar um registro de aluno. • GetPutAluno: responsável por atualizar os dados do aluno. • DeleteAluno: responsável por excluir o registro do aluno. Figura 142 – Implementando a classe AlunoControllers 164 Unidade IV Figura 143 – Continuação da implementação da classe AlunoControllers Figura 144 – Continuação da implementação da classe AlunoControllers 165 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Então cria-se a classe “aluno”, com os atributos nome, RA e idade. A tipagem dos atributos (string nome, int ra, int idade) tem relação com a tabela criada que recebeu os dados com as tipagens corretas: Figura 145 – Implementando a classe Aluno Assim, inicia-se a implementação na classe AlunoRepositorio, que irá herdar a interface IAlunoRepositorio, em que serão desenvolvidos os métodos: • GetAll: retorna todos os dados de alunos. • Get: retorna o dado de aluno através do filtro RA. • Add: adiciona o registro do aluno (nome, RA e idade). • Remove: exclui o registro do aluno. • Update: atualiza o registro do aluno. 166 Unidade IV Na classe AlunoRepositorio, deve-se informar os dados de alunos cadastrados (Salatiel, Dorgival, Doralice e Doracy) e seus respectivos dados de RA (registro acadêmico) e idade: Figura 146 – Implementando a classe AlunoRepositorio Figura 147 – Continuação da implementação da classe AlunoRepositorio 167 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 148 – Continuação da implementação da classe AlunoRepositorio Inicia-se a implementação na classe IAlunoRepositorio com os métodos GetAll, Get, Add, Remove e Update: Figura 149 – Implementação da classe IAlunoRepositorio 168 Unidade IV Localiza-se no Solution Explorer o arquivo WebApiConfig (dentro da pasta App_Start): Figura 150 – Implementação da classe WebApiConfig 169 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Inicia-se, então, a implementação do código que será responsável por proporcionar a inicialização da API, e configura-se a rota, conforme já mencionado: Figura 151 – Implementação da classe WebApiConfig Neste momento, deve-se clicar no botão IIS Express para iniciar a API; nas figuras a seguir pode-se observar o funcionamento de uma consulta de todos os alunos e uma consulta por um aluno específico. Figura 152 – Executando o projeto API Web 170 Unidade IV Figura 153 – Executando o projeto API Web Figura 154 – Executando o projeto API Web Nesse exemplo, utilizou-se um código do repositório definido pela classe AlunoRepositorio, para implementar a API Web 2, expondo os seguintes serviços: • GetAllAlunos: retorna todos os alunos. • GetAluno: retorna um aluno. • GetAlunosPorIdade: retorna os alunos por idade. • PostAluno: inclui um novo aluno. • PutAluno: altera um aluno. • DeleteAluno: exclui um aluno. 7.6 Desenvolvimento de aplicações MVC As imagens apresentadas a seguir são concebidas por meio de desenvolvimento MVC. Na sequência, iremos exercitar de maneira prática como podemos desenvolver um projeto WebForms, com alguns conceitos de HTML, CSS e JavaScript para o fron-end e a linguagem de programação orientada a objetos C# para o desenvolvimento do back-end. Vale ressaltar também que o banco de dados aplicado neste capítulo foi SQL Server, porém existem diversos outros no mercado, como: SQL Lite, Mongo DB etc. 171 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Caso opte por utilizar o seu banco de preferência, altere o endereçamento da linha – connectionString, conforme ilustrado a seguir. Figura 155 – Endereçamento do banco de dados Lembrete No JavaScript, os objetos são o centro do seu desenvolvimento: quase tudo é um objeto ou age como um. 8 ACESSANDO DADOS COM MS ADO.NET Existem atualmente diversas maneiras de conexão com o banco de dados: Oracle, SQL, Access, entre outros, porém, para que a conexão seja efetuada de maneira amigável, neste livro-texto teremos como base a construção de conexão utilizando a linguagem C#, que será utilizada como ponto entre a view (aspx) e a codificação de itens de conexão (C#). Observação É importante conseguir assimilar os conceitos vistos sobre bancos de dados para que este conteúdo possa ser absorvido de maneira clara e objetiva. A seguir, iremos dar sequência nas figuras que exemplificam como elaborar a aplicação em três camadas. A figura a seguir demonstra a inclusão dos registros nome, e-mail e idade: Figura 156 – Exemplo de aplicação em três camadas: página Default.aspx 172 Unidade IV Para iniciar a criação desse projeto, deve-se criar um projeto Asp.NET Web Forms no Visual Studio 2019: Figura 157 – Criando projeto Web Forms Como ilustrado, inicia-se a criação do projeto Web Forms acionando o botão “Criar um projeto”: Figura 158 – Criando projeto Web Forms: ASP.NET WebForms Então seleciona-se o Aplicativo Web ASP.NET(.NET Framework). Utilizar a caixa de busca para digitar o nome do template facilita a sua localização. Após efetuar essa seleção, aciona-se o botão “Próximo”: 173 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 159 – Criando projeto Web Forms: atribuindo o nome do Projeto Preenche-se o nome do projeto (TresCamadasAdoNet) e aciona-se o botão “Criar”: Figura 160 – Criando projeto Web Forms: selecionando Web Forms 174 Unidade IV Em seguida, deve-se escolher o Web Forms e acionar o botão “Criar”: Figura 161 – Criando projeto Web Forms: selecionando Web Forms 175 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Na figura a seguir, será apresentada a estrutura criada para o projeto Web Forms Três Camadas ADO. NET. Deve-se clicar da página Default.aspx e desenvolver o layout proposto nas próximas figuras. Essa tela será responsável por alocar os campos Nome, Idade e E-mail e o botão “Submeter” terá a função de enviar os registros preenchidos para o banco de dados. Figura 162 – Layout sugerido para a página Default.aspx Figura 163 – Continuação do layout sugerido para a página Default.aspx 176 Unidade IV Figura 164 – Continuação do layout sugerido para a página Default.aspx Em seguida a essas etapas, adiciona-se o projeto BLL (business logic layer – camada de regra de negócio). Para adicionar um projeto, deve-se selecionar o nome da solução Três Camadas ADO.NET, acionar o botão direito do mouse e selecionar “adicionar”, depois “novo projeto”: Figura 165 – Adicionar um novo projeto 177 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Localiza-se a biblioteca de classe (.NET Framework) e certifica-se de que a linguagem definida é C#. Após realizar a seleção, aciona-se o botão próximo. Figura 166 – Adicionando biblioteca de classes Escreve-se o nome do projeto BLL e aciona-se o botão “Criar”: Figura 167 – Nomeando a biblioteca como BLL 178 Unidade IV Figura 168 – Camada BLL criada com a classe Class1 Em seguida, deve-se escrever o nome do projeto BLL e novamente acionar o botão “Criar”: Figura 169 – Camada BLL criada com a classe Class1 179 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Deve-se renomear a classe para “Negócios”. Para realizar essa ação, clica-se com o botão direito do mouse sobre a Class1 e seleciona-se a opção renomear. Figura 170 – Renomeando Class1 para Negócios A figura a seguir, ilustra o momento em que terminamos de renomear a classe, então o Visual Studio “pergunta” se gostaríamos de assumir o novo nome para classe. Nesse instante, deve-se acionar o botão “Sim”. Figura 171 – Classe Negócios 180 Unidade IV Na figura a seguir, é apresentado o nome classeNegócios: Figura 172 – Incluindo summary Para acionar o summary, basta digitar acima do nome da classe ///: Figura 173 – Desenvolvimento da classe BLL 181 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Nas figuras a seguir, pode-se observar o desenvolvimento dos métodos insert, update, load e delete, que terão responsabilidade de filtrar a regra de negócio e conservar a persistência no banco de dados. Figura 174 – Desenvolvimento da classe BLL Figura 175 – Continuação do desenvolvimento efetuado na classe BLL (classe Negócio) 182 Unidade IV Figura 176 – Continuação do desenvolvimento efetuado na classe BLL (classe Negócio) Figura 177 – Camada DAL com a classe Acesso a Dados 183 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET A seguir, é apresentado o projeto DAL, do inglês data access layer (camada de acesso a dados). Esse projeto será adicionado da mesma maneira que a camada BLL foi adicionada anteriormente, e a classe será renomeada para AcessoDados: Figura 178 – Classe AcessoDados dentro da camada DAL Nas figuras a seguir, pode-se ver a criação dos métodos insert (que será utilizado na aplicação), update, load e delete. Eles serão utilizados para realizar a persistência no banco de dados SQL. Figura 179 – Desenvolvimento efetuado na classe DAL 184 Unidade IV Figura 180 – Continuação do desenvolvimento efetuado na classe DAL Na figura anterior, linha 20, pode-se observar a chave de conexão [“EADUNIPSqlServer”], que será utilizada para alocar o endereço do banco de dados SQL. 185 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 181 – Continuação do desenvolvimento efetuado na classe DAL Figura 182 – Continuação do desenvolvimento efetuado na classe DAL 186 Unidade IV Figura 183 – Continuação do desenvolvimento efetuado na classe DAL Figura 184 – Realizar referência na camada BLL 187 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Conforme pode ser visto nas figuras a seguir, clica-se com o botão direito do mouse sobre a pasta de referências e aciona-se a opção “Adicionar Referência”, em seguida, deve-se selecionar Projetos>>DAL e OK. Figura 185 – Realizar referência na camada BLL da camada DAL 188 Unidade IV Figura 186 – Realizar referência na camada TresCamadasAdoNet 189 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 187 – Realizar referência na camada BLL na camada TresCamadasAdoNet 190 Unidade IV Figura 188 – Referência da camada BLL na camada TresCamadasAdoNet Conforme demonstrado na figura a seguir, deve-se ir à página Default.aspx e efetuar um duplo clique no botão “Submeter”. Nesse instante, será criado o btnSubmit_Click. Nessa classe, tem-se que atribuir o nome da camada BLL utilizando a palavra using, e na sequência digitar o trecho do código que se encontra na figura a seguir. Esse código realiza a instância do objeto pBLL para que seja possível 191 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET acessar o método insert, que está localizado na classe Negócios, e que, por sua vez, dará acesso ao método insert, localizado na classe AcessoDados. Com as informações digitadas na tela de nome, idade e e-mail, o método insert contido na classe AcessoDados irá gravar os dados no banco de dados. Figura 189 – Evento bntSubmit_Click Observação Classe BLL é a camada de negócio, e Classe DAL é a camada de dados. O exemplo tratado nesta unidade tem por finalidade realizar a junção do front-end (tela) com o back-end (linguagem de programação C#) utilizando um projeto Web Forms. 192 Unidade IV Por fim, deve-se acessar o arquivo web.config e alocar o endereçamento do banco de dados, para que ele seja localizado dentro da aplicação quando solicitado através da chave [“EADUNIPSqlServer”]. Figura 190 – Arquivo web.config Figura 191 – ConnectionString Lembrete Criar o banco de dados EADUNIP e a tabela com os atributos código, nome, idade e e-mail é necessário para que a aplicação funcione. O banco de dados utilizado para esse exemplo é o SQL Server. 193 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET 8.1 Instalar/configurar o banco de dados SQLite Para instalar e configurar o banco de dados SQLite, é necessário acessar o link, conforme apresentado na figura a seguir. Após realizar o download, iniciar a instalação no seu computador, conforme descrito: Figura 192 – Tela de download do SQLiteStudio Figura 193 – Download realizado em formato .zip do SQLStudio 194 Unidade IV Após a extração do arquivo gerado e mencionado na figura anterior, será gerada a pasta SQLiteStudio, conforme apresentado a seguir: Figura 194 – Pasta do SQLiteStudio Após acessar a pasta SQLiteStudio, localizar o arquivo SQLiteStudio e acessá-lo conforme apresentado a seguir: Figura 195 – Executável do SQLiteStudio 195 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 196 – SQLiteStudio Para criar o banco de dados de estudo, precisa clicar em Database → Add a database, conforme apresentado a seguir: Figura 197 – Adicionar banco de dados no SQLiteStudio 196 Unidade IV Figura 198 – Criar banco de dados no SQLiteStudio Agora é necessário nomear o banco de dados, conforme apresentado a seguir: Figura 199 – Criar banco de dados unidade4 no SQLiteStudio 197 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Após adicionar o nome do banco de dados (unidade4) precisa clicar no botão Test Connection, para verificar a estabilidade da conexão local, conforme apresentado a seguir: Figura 200 – Test connection no SQLiteStudio Após o teste de conexão ter sinalizado com sucesso, clicar no botão OK. Nesse momento, o banco de dados está pronto e já é possível criar uma tabela clicando com o botão direito em cima do nome do banco de dados (unidade4) → Create a table, conforme apresentado a seguir: Figura 201 – Criar tabela aluno no SQLiteStudio 198 Unidade IV Após nomear a tabela, é preciso adicionar os campos necessários para a construção da tabela. Clicando duas vezes no espaço vazio da aba Structure será apresentado o que segue na figura: Figura 202 – Acionar coluna na tabela aluno no SQLiteStudio Figura 203 – Acionar coluna na tabela aluno no SQLiteStudio 199 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 204 – Acionar coluna na tabela aluno no SQLiteStudio Para efetivar a construção da tabela, precisa clicar no botão verde Commit structure changes, conforme apresentado a seguir: Figura 205 – Botão Commit structure changes 200 Unidade IV A seguir, a figura apresenta a mensagem de sucesso. Após essa tela, clicar no botão OK. Figura 206 – Efetivação da criação da tabela aluno Figura 207 – Tabela aluno criada 201 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET Figura 208 – Tabela aluno criada e armazenada na pasta do SQLiteStudio Figura 209 – Exemplo de ConnectionString do SQLiteStudio 202 Unidade IV Resumo Nesta unidade, vimos como podemos combinar e integrar técnicas de desenvolvimento web, tais como o JavaScript, que, de fato, enriquece todo o processo do aplicativo web, principalmente tratando de suas funções e métodos, disponibilizando, assim, praticidade e facilidades no front-end na atuação de desenvolvimento de software para internet. Vimos também conceitos de conexão com banco de dados, utilizando como base a linguagem C#. Trabalhando com desenvolvimento de aplicativos web, utilizamos recursos da linguagem C# para efetuar a codificação de banco de dados, bem como toda a lógica de botões inseridos nas páginas aspx. Finalmente, ressaltamos toda a construção de arquitetura web e sua execução, lembrando da preocupação atual em desenvolver com qualidade, agilidade e principalmente com a intenção de visualização de página em qualquer dispositivo conectado à internet. Exercícios Questão 1. (AOCP 2019) Sabendo que, nas linguagens de programação, existem diferentes palavras reservadas, é correto afirmar que são apenas palavras reservadas em linguagem de programação Java: A) Strictfp, private, byte, transient. B) Function, void, real, procedure. C) Protected, finally, if, yield. D) Public, void,del, elif. E) Void, var, int, def. Resposta correta: alternativa A. Análise das alternativas A) Alternativa correta. Justificativa: todas as palavras da alternativa são palavras reservadas para linguagem Java. 203 DESENVOLVIMENTO DE SOFTWARE PARA INTERNET B) Alternativa incorreta. Justificativa: as palavras function e real não são palavras reservadas. C) Alternativa incorreta. Justificativa: yield é nome de uma função da classe Thread, mas pode ser usada livremente. D) Alternativa incorreta. Justificativa: as palavras del e elif não são palavras reservadas. E) Alternativa incorreta. Justificativa: as palavras var e def não são palavras reservadas. Questão 2. (Cespe 2019) Assinale a opção que apresenta corretamente a saída gerada pelo código Java precedente. Figura 210 A) 36 B) 1 2 3 4 5 6 C) 1 2 3 4 5 D) 0 1 2 3 4 5 E) 0 1 2 3 4 5 6 Resposta correta: alternativa D. 204 Unidade IV Análise da questão 1ª rodada i = 0 0 × 0 = 0 (menor que 36) 2ª rodada i = 1 1 × 1= 1 (menor que 36) 3ª rodada i = 2 2 × 2 = 4 (menor que 36) 4ª rodada i = 3 3 × 3 = 9 (menor que 36) 5ª rodada i = 5 5 × 5 = 25 (menor que 36) 6ª rodada i = 6 6 × 6 = 36 ( igual a 36 ) Resposta: 0 1 2 3 4 5 205 REFERÊNCIAS Textuais APRESENTANDO o Bootstrap. GetBootstrap. Disponível em: http://twitter.github.com/bootstrap/index. html. Acesso em: 25 set. 2020. BISQUE. Colors Commutercreative. Disponível em: http://www.colors.commutercreative.com. Acesso em: 22 set. 2020. BRASIL. Presidência da República. Casa Civil. Subchefia para Assuntos Jurídicos. Lei n. 13.709, de 14 de agosto de 2018. Lei Geral de Proteção de Dados Pessoais (LGPD). Brasília, 2018. Disponível em: http:// www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm. Acesso em: 17 set. 2020. COYIER, C. Named colors and hex equivalentes. CSS-Tricks, janeiro de 2012. Disponível em: https://css- tricks.com/snippets/css/named-colors-and-hex-equivalents/. Acesso em: 22 set. 2020. DOWNLOADS. Visual Studio. Microsoft. 2020. Disponível em: https://visualstudio.microsoft.com/pt-br/ downloads/. Acesso em: 24 set. 2020. DURÃES, R. Desenvolvendo para web usando o Visual Studio 2008. Rio de Janeiro: Brasport, 2011. FAÇA mais com o novo Chrome. Google. Disponível em: https://www.google.pt/intl/pt-PT/chrome/. Acesso em: 21 set. 2020. FONT Squirrel. Webfont Generator. Disponível em: https://www.fontsquirrel.com/tools/webfont- generator. Acesso em: 22 set. 2020. FORMULÁRIOS HTML. w3schools. 2020. Disponível em: https://www.w3schools.com/html/html_forms. asp. Acesso em: 21 set. 2020. GETBOOTSTRAP. Introdução. Disponível em: https://getbootstrap.com/docs/4.4/getting-started/ introduction/. Acesso em: 22 set. 2020. GROFFE, R. J. ASP.NET MVC: desenvolvendo soluções para web. DevMedia, Rio de Janeiro, 2011. Disponível em: http://www.devmedia.com.br/asp-net-mvc-desenvolvendo-solucoes-para-web-revista- net-magazine-91/22878. Acesso em: 15 set. 2020. GT acessibilidade. W3C. 2011. Disponível em: https://www.w3c.br/GT/GrupoAcessibilidade. Acesso em: 15 set. 2020. INTRODUÇÃO ao JSON. In: CROCKFORD, D. How JavaScript works. Califórnia, EUA: Virgule-Solidus LLC, 2018. Disponível em: https://www.json.org/json-pt.html. Acesso em: 23 set. 2020. 206 ISHIDA, R. Servindo HTML & XHTML. Internacionalização. Traduzido por Maurício Samy Silva. W3C. 2016. Disponível em: https://www.w3.org/International/articles/serving-xhtml/index.pt-br. Acesso em: 21 set. 2020. JANONES, R. de S. Qualidade de software: uma questão de eficiência. DevMedia, Rio de Janeiro, 2010. Disponível em: http://www.devmedia.com.br/qualidade-de-software-uma-questao-de- eficiencia/17803. Acesso em: 15 set. 2020. KLEINA, N. A história da internet: pré-década de 60 até anos 80 [infográfico]. Tecmundo, Curitiba, 29 abr. 2011. Disponível em: http://www.tecmundo.com.br/infografico/9847-a-historia-da-internet-pre- decada-de-60-ate-anos-80-infografico-.htm. Acesso em: 15 set. 2020. LOTAR, A. Programando com ASP.NET MVC. São Paulo: Novatec, 2011. MANZANO, J. A. N.; TOLEDO, S. A. Guia de orientação e desenvolvimento de sites: HTML, XHTML, CSS e JavaScript/JScript. 2. ed. São Paulo: Erica, 2010. MATERIALIZE. Materializecss. Disponível em: https://materializecss.com/. Acesso em: 22 set. 2020. ROBERT, M. C. Código limpo. São Paulo: Alta Books, 2020. SENDIN, R. Artigo.net Magazine 65. ASP.NET: WebForms X MVC. Comparando as duas formas de desenvolver aplicações ASP.NET com WebForms e MVC. DevMedia. Rio de Janeiro, 2009. Disponível em: http://www.devmedia.com.br/artigo-net-magazine-65-asp-net-webforms-x-mvc/13896. Acesso em: 25 set. 2020. SERVIÇO de validação de marcação. Validator. W3C. 2013. Disponível em: http://validator.w3.org/. Acesso em: 21 set. 2020. SILVA, M. S. CSS Grid layout: Criando layouts CSS profissionais. São Paulo: Novatec, 2019. SILVA, M. S. HTML5: A linguagem de marcação que revolucionou a web. São Paulo: Novatec, 2019. SILVA, M. S. Servindo HTML & XHTML. W3, fev. 2016. Disponível em: https://www.w3.org/International/ articles/serving-xhtml/index.pt-br. Acesso em: 25 set. 2020. SOBRE O W3C. W3C. 2011. Disponível em: https://www.w3c.br/Sobre/. Acesso em: 15 set. 2020. STANDARD built-in objects. JavaScript reference. Developer.Mozilla. Disponível em: https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects. Acesso em: 23 set. 2020. USE as ferramentas de desenvolvedor do Google Chrome para verificar tags. Ajuda do Campaign Manager. Support Google. 2020. Disponível em: https://support.google.com/dcm/answer/2828688?hl=pt- BR. Acesso em: 21 set. 2020. 207 W3C PRESS RELEASES. Novo roteiro para o futuro das publicações está em andamento: W3C e IDPF estão agora oficialmente unificados. W3C, fev. 2017. Disponível em: https://www.w3c.br/Noticias/ NovoRoteiroParaFuturoDasPublicacoes. Acesso em: 24 set. 2020. Sites http://www.colors.commutercreative.com http://www.microsoft.com/pt-br https://code.visualstudio.com https://github.com/ https://www.dafont.com/pt/ https://www.iso.org/home.html https://www.lgpdbrasil.com.br https://www.sqlite.org/index.html https://www.sublimetext.com Exercícios Unidade II – Questão 1: CENTRO DE SELEÇÃO E DE PROMOÇÃO DE EVENTOS (CESPE). Tribunal de Justiça do Pará (TJ-PA) 2020: Analista Judiciário. Questão 46. Disponível em: https://arquivos.qconcursos. com/prova/arquivo_prova/67268/cespe-2020-tj-pa-analista-judiciario-programador-prova.pdf?_ ga=2.35186337.1627829085.1601481671-441665092.1601481671. Acesso em: 30 set. 2020. Unidade II – Questão 2: FUNDAÇÃO CARLOS CHAGAS (FCC). Técnico Judiciário – Área Apoio Especializado Especialidade Informática 2019: Concurso Público. Questão 56. Disponível em: https://arquivos. qconcursos.com/prova/arquivo_prova/66072/fcc-2019-trf-3-regiao-tecnico-judiciario-informatica- prova.pdf?_ga=2.26914621.1627829085.1601481671-441665092.1601481671. Acesso em: 30 set. 2020. Unidade III – Questão 1: CENTRO DE SELEÇÃO E DE PROMOÇÃO DE EVENTOS (CESPE). Tribunal de Justiça do Pará (TJ-PA) 2020: Analista Judiciário. Questão 47. Disponível em: https://arquivos. qconcursos.com/prova/arquivo_prova/67268/cespe-2020-tj-pa-analista-judiciario-programador-prova. pdf?_ga=2.35186337.1627829085.1601481671-441665092.1601481671. Acesso em: 30 set. 2020. Unidade III – Questão 2: AOCP. Prefeitura de Juiz de Fora 2016: Programador. Questão 30. Disponível em: https://arquivos.qconcursos.com/prova/arquivo_prova/66099/aocp-2016-prefeitura-de-juiz-de- fora-mg-programador-prova.pdf?_ga=2.68717329.1627829085.1601481671-441665092.1601481671. Acesso em: 30 set. 2020. Unidade IV – Questão 1: AOCP. Empresa Municipal de Informática (EMPREL) 2019: Analista de Sistemas. Questão 32. Disponível em: https://questoes.grancursosonline.com.br/prova/emprel-pe- 2019-aocp-2-analista-de-sistemas/1178180. Acesso em: 30 set. 2020. 208 Unidade IV – Questão 2: CENTRO DE SELEÇÃO E DE PROMOÇÃO DE EVENTOS (CESPE). Tribunal de Justiça do Pará (TJ-PA) 2019: Analista Judiciário. Questão 44. Disponívelem: https://cdn.cebraspe.org. br/concursos/tj_pa_19_servidor/arquivos/MATRIZ_507_TJPA013_PAG_4.PDF. Acesso em: 30 set. 2020. Informações: www.sepi.unip.br ou 0800 010 9000
Compartilhar