Usando System.Drawing no ASP.NET

Olá Pessoal,

Na nossa lista de discussão foi gerada uma pergunta sobre como se usa System.Drawing no ASP.NET. Como a explicação desse assunto envolve vários conceitos interessantes, Daniel me incentivou a publicar este post para responder com mais detalhes.

Existem algumas diferenças básicas na utilização do System.Drawing com Windows Forms e com ASP.NET. A principal delas é que no Windows Forms a plataforma .NET pode fazer chamadas ao sistema para acessar a placa de vídeo do usuário, então você pode desenha diretamente na tela do cliente. Enquanto que no ASP.NET sua aplicação estará rodando em um servidor e o cliente estará mandando requisições e recebendo respostas da sua aplicação possivelmente a quilômetros de distância.

1º Conceito interessante: Requisições

Sabemos que quando um usuário digita o endereço de uma página HTML, o seu browser irá requisitar esta página para o servidor de destino. O que não vemos são as reuisições subsequentes: por exemplo, se nessa página tem uma tag do tipo <img src="imagem.jpg" /> o browser irá enviar uma nova solicitação ao servidor para receber esta imagem. As respostas do servidor contém em seus cabeçalhos informações inerentes à resposta que está enviando, entre elas o tipo da resposta. No caso onde o browser requisitou um documento HTML, o servidor enviou uma resposta que havia em seu cabeçalho a informaçao “content-type: text/html” enquanto que na requisição da imagem, o servidor responde informações com “content-type: image/jpeg”

2º Conceito interessante: No ASP.NET, nem tudo é HTML

No ASP.NET temos a idéia natural de que trabalhamos apenas com páginas web e HTML. Isso é verdade em 99,9% dos casos, mas é bom termos em mente o seguinte: O ASP.NET é feito para gerenciar requisições feitas ao servidor. Essas requisições podem gerar todo tipo de resposta para o cliente (arquivos de imagem, arquivos zip, arquivos pdf, arquivos XAML) e não apenas HTML. Cabe ao programador informar que tipo de resposta será gerada.

Exemplo prático

Para exemplificar o que foi dito acima vamos fazer uma pequena demonstração prática. A idéia é fazer um arquivo Drawing.aspx que, quando for enviada uma requisição a ele, irá devolver uma imagem jpg com um texto passado por parâmetros, como pode ser visto na imagem abaixo:

OlaMundo

Vale ressaltar que neste exemplo, o texto Ola Mundo não é um texto em HTML e sim uma imagem JPEG gerada dinamicamente, à partir do texto informado na barra de endereços. Pode parecer complicado, mas na verdade não é. O primeiro passo, logo após criar o arquivo Drawing.aspx é limpar todo o conteúdo HTML que é gerado automaticamente pelo visual studio, deixando apenas a primeira linha de cabeçalho:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Drawing.aspx.cs" Inherits="Drawing" %>

Depois disso, basta que adicionemos o seguinte código ao Page_Load de Drawing.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
string msg = Request.QueryString["msg"];

//Nesta parte redefinimos o tipo de resposta do servidor
Response.ContentType = "image/jpeg";

if (msg != null)
{
Font fonte = new Font("Calibri", 16, FontStyle.Bold);
Brush pincelAzul = new SolidBrush(Color.Blue);
Brush pincelBranco = new SolidBrush(Color.White);


Bitmap bmp = new Bitmap(300, 30);
Graphics graf = Graphics.FromImage(bmp);
graf.FillRectangle(pincelBranco, 0, 0, 300, 30);
graf.DrawString(msg, fonte, pincelAzul, 0, 0);

//Esta é a parte que salva o Bitmap na OutputStream
//A OutputStream é justamente um objeto que guarda tudo
//o que vai ser enviado ao usuário. No caso de requisições
//feitas para este arquivo .aspx, o que será retornado
//ao usuário será uma imagem em formato jpeg em vez de um
//documento HTML

bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
}
}

O projeto pode ser baixado aqui

Espero que tenha conseguido passar um pouco dos aspectos interessantes de se usar System.Drawing no ASP.NET. Apesar do exemplo construído aqui não ter muita utilidade em si, podemos imaginar várias situações onde este conhecimento pode vir a ser útil.

Abraços a todos!

Anúncios
Publicado em ASP.NET, C#. 1 Comment »

Introdução ao C# e ao Visual Studio 2005

Bem pessoal, para reforçar a aula da última quinta-feira, e também não deixar os que não puderam comparecer totalmente atrasados, irei escrever aqui um resumo/tutorial do que foi citado, explicado e ensinado na aula.

Para começar, a primeira informação que precisamos é o que é C#? C# é uma linguagem de programação recente, com menos de 10 anos de existência, desenvolvida pela Microsoft para o lançamento conjunto com o .NET Framework 1.0. A equipe de desenvolvimento da linguagem teve como líder Anders Hejlsberg (pronuncia-se “Rélsberg”), conhecido pela participação em projetos como o Delphi e Turbo Pascal na Borland, e do Visual J++, na Microsoft. Com toda a experiência de seus projetos anteriores, Hejlsberg conhecia as limitações das linguagens existentes até o momento, e também sabia quais características destas linguagens geralmente levavam os programadores a cometer erros. Estas limitações e excessos levaram a Microsoft à decisão de criar uma nova linguagem a ser lançada junto com seu Framework, e que fosse o mais parecida com a estrutura interna deste quanto fosse possível. Ao ser alocado como líder do desenvolvimento da nova linguagem, Hejlsberg e sua equipe decidiram que esta seria inspirada principalmente em C++, Java e Delphi, e herdaria as seguintes características destas e de outras linguagens já existentes:

  • Uso de uma sintaxe consolidada: A sintaxe utilizada em C, C++ e Java é muito difundida entre os programadores, o que torna o aprendizado da nova linguagem mais rápido e menos traumático, além do uso de “{ }” para delimitar trechos de código deixar o programa mais legível e menos suscetível a erros;
  • Orientação a Objetos: Paradigma amplamente difundido, que permite a modelagem de sistemas que refletem o mundo em que a aplicação está inserida;
  • Garbage Collecion: Tira das mãos do programador a necessidade de alocar e desalocar memória, fonte de muitos erros em programadores inexperientes, e de dores de cabeça proporcionais ao tamanho o sistema que está sendo desenvolvido;
  • Exceções: Desvia o fluxo de execução quando um erro ocorre, permitindo que este erro seja tratado de maneira elegante, e muitas vezes transparente ao usuário;
  • Tipos seguros: As atribuições devem ocorrer entre tipos compatíveis em tempo de compilação, e os casts são verificados em tempo de execução;
  • Limites dos arrays são verificados: Assim como Java, C# não permite que por exemplo, num de 5 posições, o programador tente acessar a posição 10. A não verificação dos limites de arrays é mais uma causa de frequentes erros em programadores C / C++.

Além destas características, C# também trouxe novidades, como:

  • Delegates: Funcionam como “ponteiros” de função, facilitando a implementação de eventos, e inclusive dando a possibilidade de multicast, quando um evento dispara mais de uma função;
  • Propriedades: Não é um conceito completamente novo, no entanto, a abordagem de acesso a propriedades no código-fonte não era difundida. As propriedades em C# servem por exemplo, para encapsular os atributos de uma classe, papel que seria desempenhado em Java por métodos get e set;
  • Namespace: Assim como as propriedades, a novidade não está no namespace em si, mas na maneira como são usados. Primeiramente, o namespace não está fisicamente ligado ao caminho do arquivo. Uma classe de namespace Ufpe.Cin.CinDotNet não precisa estar numa estrutura em pastas ..\Ufpe\Cin\CinDotNet. Outra diferença para o uso de namespaces, agora comparando com C++, é que os namespaces de C# não permitiriam o uso de maneira semelhante a “std::cout” (Código em C++ onde std é o namespace e cout é uma variável), pois um namespace pode conter apenas:
    • Outro namespace
    • Classes
    • Interfaces
    • Structs
    • Enums
    • Delegates
  • Partial Class: Em C#, você pode definir uma classe em mais de um arquivo. Apesar de no primeiro momento isto parecer uma regressão, onde você diminuiria a legibilidade do código por espalhar uma classe em vários arquivos, as partial classes usadas corretamente são de grande ajuda para a legibilidade. O uso de partial class ao criar páginas usando ASP.NET permite o uso de code behind de uma maneira elegante (antes da inclusão de partial class em C#, o code behind era implementado através de uma herança entre a classe que define a interface e a classe que contém a lógica. Com partial class, existe apenas uma classe, onde sua interface gráfica é definida em um arquivo e sua lógica em outro).

Para maiores informações, exemplos de código, referências e leituras complementares sobre o que foi falado acima sobre C#, recomendo vocês darem uma olhada na apresentação usada na aula, disponível em (http://www.cin.ufpe.br/~abc/cindotnet/IntroducaoCSharpVisualStudio.pptx), na solução da prática do final da apresentação (http://www.cin.ufpe.br/~abc/cindotnet/ExemploCalculadora.zip) e no material do programa Desenvolvedor 5 Estrelas (http://www.msdn.com.br/cinco_estrelas).

Agora que você já tem uma noção do que C# oferece, vamos dar uma olhada no Visual Studio.

O Visual Studio (VS) é uma ferramenta integrada de desenvolvimento, no mercado desde 1997, atualmente na versão 2008. Com o VS, podemos desenvolver qualquer tipo de aplicação, desde um sistema baseado em Console, passando por aplicações desktop em janela, e indo até jogos 3D e websites. Iremos focar na versão 2005, pois *por enquanto* é a versão que está instalada nos laboratórios do CIn, mas esperamos ansiosamente que em breve pelo menos um grad esteja com o Visual 2008 instalado.

Através do Visual Studio.NET 2005, podemos realizar a maioria das atividades referentes ao desenvolvimento de uma aplicação em um só lugar. Além de editar, compilar e debugar o código em um só lugar, podemos também visualizar bancos de dados, informações sobre servidores na rede, visualizar o log de eventos das máquinas, entre diversas outras ações. Isto reduz o tempo de desenvolvimento, pois não precisamos alternar entre aplicações, boa parte do que é necessário já está disponível no Visual Studio.

A velocidade de desenvolvimento (produtividade do programador) é um dos principais focos do VS. Esta busca por produtividade trouxe para o Visual ferramentas que reduzem muito a quantidade de código que precisa ser digitada. Entre elas, é interessante citar as seguintes:

  • Intellisense: Um sistema de autocomplete que visa minimizar a quantidade de código digitado e a quantidade de itens que o programador necessita memorizar. Através do Intellisense, o programador também tem acesso à documentação dos métodos, o que praticamente elimina o tempo “perdido” em ir ler a API. Em alguns casos, a sugestão do autocomplete é sensivel ao histórico do que vinha sendo codificado.
  • Code Snippets: Templates de código que também reduzem a quantidade de código digitado. Ao usar um code snippet, o desenvolvedor obtém a parte “invariável” do template e apenas precisa preencher as partes mais relacionadas ao seu programa. Exemplo: ao escrever um switch, caso a variável seja algum enum, o Visual irá escrever uma cláusula case para cada valor no enum, automaticamente. Para usar, digite o começo do nome de algum code snippet (como “swi” para o caso do switch) e pressione TAB duas vezes.
  • Comentários em XML: Funciona de maneira similar a JavaDocs. Após implementar um método, ao digitar “///” (três barras) na linha anterior à assinatura do método, o Visual Studio irá criar uma estrutura dentro de um comentário, já no formato do XML de documentação. Resta ao programador apenas preencher as informações inerentes a cada método. Este comentário é usado pelo Intellisense para mostrar a documentação do método.
  • Visualizador de Propriedades: Através da interface gráfica, é possível setar as propriedades dos componentes, reduzindo novamente o número de código digitado.

Outro fato interessante sobre o Visual Studio é a possibilidade de utilizar diversas linguagens (são aproximadamente 40, de acordo com http://dotnetpowered.com/languages.aspx). Além disto, é possível fazer com que projetos escritos em uma linguagem interajam com um projeto escrito em outra, devido à compilação de qualquer uma das linguagens utilizáveis com o VS ser realizada para o código IL (também conhecido como MSIL ou CIL), do .NET Framework.

O último ponto importante do VS que será tratado neste artigo é “como se desenvolver usando o Visual Studio”. Apesar de estarmos acostumados com o termo “Projeto” para designar toda a aplicação que estamos desenvolvendo, a Microsoft utiliza no VS a terminologia de Solução. Uma solução é um conjunto lógico de projetos que se propõem a resolver um determinado problema. Você pode tanto desenvolver apenas um projeto em uma solução, como pode modularizar cada parte deste projeto em outros projetos, que irão se comunicar entre si, poderão ter configurações diferentes (e inclusive ser escritos em linguagens diferentes, como já foi citado), entre outras diversas vantagens.

Além de conhecer o C# e o Visual Studio, é bom saber que apesar de C# ser uma ótima linguagem, que permite o desenvolvimento de maneira rápida e “segura”, e do VS ser um ótimo ambiente de desenvolvimento, com diversas facilidades para o programador, boa parte do que é falado e creditado a C# ou ao Visual Studio é de responsabilidade do .NET Framework.

Resumidamente, podemos dizer que o .NET Framework possui um conjunto de bibliotecas que contém diversas funcionalidades previamente implementadas de maneira eficiente, para tirar do programador a responsabilidade por implementá-las, geralmente com um código muito menos eficiente do que a implementação já existente. É interessante notar que boa parte das Class Libraries (nome dado a cada biblioteca contida no Framework) do .NET Framework foi escrita em C#.

Já existem, padronizadas pela ISO e ECMA, Class Libraries responsáveis pela manipulação de listas, dicionários e hashtables, acesso a dados, entrada e saída, manipulação de texto, desenho e diagnóstico do programa, entre inúmeras outras. Além das Class Libraries padronizadas, o .NET Framework ainda disponibiliza várias outras, para manipulação de XML, interface gráfica por meio de janelas ou interface gráfica para desenvolvimente de websites.

Bem pessoal, resumidamente, este foi o conteúdo visto na aula. Espero que vocês usem este artigo e a apresentação como referência, enquanto dão seus primeiros passos nestas tecnologias.