sexta-feira, 2 de dezembro de 2011

Instalação do IISExpress

Entre os diversos servidores Web "thin" para a plataforma Windows está o IISExpress.

É um produto desenvolvido sobre o framework .NET 4.0 (dotnet 4.0) capaz de executar ASP e ASP.NET necessário para pequenos testes com o protocolo HTTP. Junto com ele vem um gerenciador de extensões para instalação dos produtos "derivados" (Web Plataform Installer), como o Visual Studio 2010 SP1, Microsoft SQL Server Data Tools, Application Request Routing 2.5 e outros.

Ele funciona maravilhosamente bem no Windows 7 professional (a versão 7 não tem nada a ver com o a marca Windows Seven).

É dificílimo achar o IISExpress, pois os blogueiros comentam, comentam e não dizem onde baixar, então colocamos aqui um link para o usuário:


Ele funciona na porta HTTP 8080.

Baixe também o gerenciador de extensões WPIlauncher para obter as extensões desejadas (não é obrigatório):

Executando o IISexpress

Após instalado, podemos fazer um atalho e executar o programa em:

C:\Program Files\IIS Express

ou

C:\Arquivos de Programas\IIS Express

O executável é:

iisexpress.exe

Ao executarmos o programa, aparece uma janela do console:


A porta de execução é realmente 8080. Execute o seguinte endereço no browser:


O site fica no caminho:

C:\Users\usuario\Documents\My Web Sites\WebSite1

Bom trabalho.



quinta-feira, 8 de setembro de 2011

Servlet completo de leitura de tabela MSAccess - JSP

Como prometido, a seguir a listagem explicada do servlet J2EE para leitura de registros de uma tabela em um banco MSAccess. Ao final, basta unir os trechos em fonte de cor vermelha para obter a script. Os parâmetros a serem substituídos estão sublinhados (PRESTE BASTANTE ATENÇÃO).

Definição de pacote

package TesteServlet.servlets;

Esta declaração produz uma árvore hierarquica dentro da Workspace de um projeto, por exemplo, feito no Eclipse:


O diretório src é dos fontes (source) em java. TesteServlet é o nome do pacote, e servlets é como um grupo de assunto dentro dele. Sugerimos até que você utilize esta conveção para os servlets. TesteServlet pode ser substituído por um nome que lembre a finalidade de seu pacote de classes.

Importação de Bibliotecas

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

O primeiro bloco contém as bibliotecas java cuja responsabilidade é gerenciar as entradas e saídas (java.io) e as consultas e atualizações de bancos de dados (java.sql). O segundo bloco traz as rotinas responsáveis pela característica de servlet de nossas classes.

Estes blocos poderiam ser declarados como:

import java.io.*;
java.sql.*;
javax.servlet.*;

No entanto, muitas rotinas seriam incorporadas sem necessidade.

Corpo do Servlet

Vamos dar o esquema do servlet que vamos apresentar, e posteriormente o método que é o coração do processo.


/**
 * Servlet implementation class LeTabela
 */
public class LeTabela extends HttpServlet {
      private static final long serialVersionUID = 1L;
     
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LeTabela() {
        super();
        // TODO Auto-generated constructor stub
    }

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
               // Posteriormente vamos dar o conteúdo deste método - LOCAL DO CÓDIGO
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}

}


Nesta classe (LeTabela - que extende HttpServlet ) são declarados 3 métodos:


  • Construtor LeTabela público (se não for público, a classe não pode ser instanciada);
  • Método doGet;
  • Método doPost;


Os dois últimos métodos se confundem com o próprio "espírito HTTP". No browser estamos sempre enviando parâmetros (via formulário), ou seja, POST, ou recebendo parâmetros (via análise da requisição), ou seja, GET.

Em nosso caso, executaremos o método GET (doGet) do servlet, ou seja, chamado o servlet, ele dispara este método.

Detalhamento do método doGet


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Connection  conn;
Statement stmt;
ResultSet rs;
String S = "";
response.setContentType("text/html");
PrintWriter out = response.getWriter();

try {


   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   // URL da conexão 
                   conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=//SERVIDOR/compartilhamento/Nome do banco.mdb");
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT * FROM Nome da Tabela");
   while(rs.next()){ 
    String fname=rs.getString("Nome do Campo"); 
    S += "&bull;"+fname+"<BR>";
    }
   rs.close();
   stmt.close();
   conn.close() ;




   } catch (Exception e) {
           System.out.println(e.toString());
   }
out.println(S+"<BR>");
}

A tentativa de estabelecimento de conexão com um banco de dados e a sua manipulação deve estar dentro de um bloco de tratamento de POSSÍVEIS exceções ( try { ... } catch ( ...) { ... }. Por esta razão, declaramos as variáveis necessárias fora deste bloco, para que sejam acessíveis de qualquer lugar dentro do método, pois o bloco try ... catch PROTEGE AS VARIÁVEIS LOCAIS A ELE. Por exemplo, se você declarar a variável S dentro deste bloco, o comando final (out.println) não a conhecerá.

Abertura da conexão

Como explicado no post Conexão JDBC com banco MSAccess, a conexão é feita pelas instruções:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=//<servidor>/<compartilhamento>/<Nome do mdb>.mdb");

Aqui usamos a pior condição, ou seja, o banco Access em um outro servidor. Mas a forma recomendada é colocar o banco no servidor Web e fazer a conexão pelo nome do ODBC. A melhor prática, frisamos, é ter as scripts e banco de dados no mesmo servidor acessado pelos clientes. Se você não confia na segurança de seu servidor, coloque um outro na DMZ (zona protegida por um roteador) da qual ele faz parte, para que não possa ser devassado caso o servidor Web seja invadido.

Acesso através da linguagem SQL

    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT * FROM Nome da Tabela");

Na frase do executeQuery podem ser colocadas cláusulas WHERE (condicionais) ou ORDER BY (ordenação). Mas hoje, com bibliotecas que ordenam as tabelas HTML resultantes de pesquisa, esta ordenação deve ser feita no cliente, economizando recursos do servidor de banco de dados.

Listando os registros de forma bem básica

    while(rs.next()){ 
     String fname=rs.getString("Nome do Campo"); 
     S += "&bull;"+fname+"<BR>";
     }

Um simples loop while resolve a situação. Cada valor de campo é extraído por um tipo de instrução get da interface Java Resultset:



 Tipo de Dado Instrução 
 Blob (Memo)  getBlob()
 Data  getDate()
 Inteiro  getInt()
 String  getString()


Em nosso exemplo simplificamos tudo para a forma String.

Lembre-se que para a exibição num resultado do tipo HTML ou XHTML, o valor terá que ser convertido para o modo string, para ser concatenado com as tags.

Fechando os objetos

Ao final de seu uso, os objetos devem ser fechados, para a boa integridade da pilha de objetos da máquina virtual Java.


   rs.close();
   stmt.close();
   conn.close() ;

Armadilha da exceção do bloco try ... catch


   } catch (Exception e) {
           System.out.println(e.toString());
   }

Este catch se presta a capturar quaisquer outras exceções que não as ServletException, IOException.

Final


out.println(S+"<BR>");
} // Fecha o método

Esta instrução out.println exibe o resultado de tudo o que foi armazenado na variável S durante o loop. Se nada foi lido, pelo fato do SQL não ter achado nada, será exibido um vazio.
























quarta-feira, 7 de setembro de 2011

Conexão JDBC com banco MSaccess

Para os programadores Java e JSP que estão em dúvida com a conexão JDBC para este banco de dados tão eficiente, aqui vão os trechos de código para a conexão:

JDBC sobre ODBC


            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            conn = DriverManager.getConnection("jdbc:odbc:Teste");

JDBC puro no servidor local


    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/Users/usuario/Documents/Teste.mdb");

JDBC puro no servidor local



Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=//<servidor>/<compartilhamento>/<Nome do mdb>.mdb");



Protótipo do código


try {


    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection(...);


    .
    .
    .
    conn.close() ;




    } catch (Exception e) {
            System.out.println(e.toString());
    }

A conexão, bem como as instruções de leitura, atualização ou adição de registros devem estar dentro de um bloco de tratamento de exceções.

Lembrete Final

Em todos os casos, é preciso:

Dar permissão nas chaves de registro (via regedit.exe ou regedt32.exe) referentes a ODBC para que o usuário Web anônimo (IUSR_<nome do servidor> ou Anon_Web) possa modificá-las ou criar novas;
Dar permissão nos diretórios C:\Windows\Temp  para Todos no modo de alteração e criação;
Dar permissão no diretório onde está o banco de dados para  que o usuário Web anônimo (IUSR_<nome do servidor> ou Anon_Web) possa modificar ou criar arquivos.



Num próximo post, colocaremos o servlet completo.

quarta-feira, 27 de julho de 2011

O pernicioso null em campo numérico e a conversão em inteiro (Cint) no ASP

Ficamos perplexos com um problema em ASP ao se listar campos de números inteiros que podem ou não estar preenchidos.

O que "disse" a consulta



O campo Diâmetro é numérico, no entanto pode ou não estar preenchido. O programador está testando, em uma consulta (query), se o mesmo está em uma faixa de valores fornecidos (Expr1 e Expr2).

Na execução, vem a mensagem:

Executamos a consulta, fornecendo dois valores e dando o OK, e aparece a mensagem:


Isto ocorre porque o VB não consegue converter nulo (Null) em inteiro.

O teste com IsEmpty (ÉVazio)

Foi feito o teste com a função "IsEmpty" que testa se o campo está vazio.


No entanto, para campos preenchidos ou não a consulta apresentou o resultado:


E qual a solução para se testar a faixa de valores ?

Para resolver o problema, concatena-se um zero à esquerda (que não altera em nada o valor, tanto do Nulo quanto de qualquer número) do campo de Diâmetro:

Ampliando:


E eis que obtemos sucesso. Veja a listagem sem a condição de faixa de valores:




segunda-feira, 13 de junho de 2011

jQuery explica a diferença entre Internet Explorer e Mozilla like

Fomos motivados a escrever este post para que TODOS entendam a diferença de interpretação entre o browser Internet Explorer e os Mozilla like (Chrome, Flock, Opera, Firefox).

Para isto vamos dar um exemplo (somos objetivos):


<html>
<head>
<script type="text/javascript" src="jquery-1.6.1.js"></script>
<script type="text/javascript">

jQuery.noConflict();


function abre(){
jQuery("div").each(function(){
document.write(jQuery(this).attr("class"));
});
}

</script>

</head>
<body onLoad="abre();">
<div class="hq pagina">
<div class="hq tira">
<div class="hq quadro"><div class="hq texto">fff</div></div>
<div class="hq quadro"><div class="hq texto">ggg</div></div>
</div>
<div class="hq tira">
<div class="hq quadro duplo"><div class="hq texto">hhh</div></div>
</div>
<div class="hq tira">
<div class="hq quadro"><div class="hq texto">mmm</div></div>
<div class="hq quadro"><div class="hq texto">nnn</div></div>
</div>
</div>
</body>
</html>

O que faz este código (não esqueça de incluir o jquery-1.6.1.js) é listar as classes das tags DIV.

Resultado no Chrome/Firefox:



Resultado no Internet Explorer:


O Internet Explorer é deficiente e ingrato. Ficamos por dois dias em cima deste comportamento anômalo, até descobrir a grande contradição do Internet Explorer:

Imediatamente após colocar na tela um resultado de script javascript, ele DESTRÓI o conteúdo da página base. Ele não tem buffer.

E como resolver ?

Rescreeva o código javascript assim:


function abre(){
var s = "";
jQuery("div").each(function(){
s = s + jQuery(this).attr("class");
});
document.write(s);
}

Desta forma, como os resultados do jQuery são armazenados em um buffer (variável s), a página não é destruída en quanto o HTML é lido pelo jQuery.

Problema Resolvido, pois Deus é poderoso.

sexta-feira, 13 de maio de 2011

Qual é o melhor banco de dados: Oracle, Mysql, MSAccess, ...

Comum seria dizer que não existe banco de dados melhor ou pior que o outro.

Os anos de convívio com estes verdadeiros mastondontes, repletos de configurações, lentos e tinhosos mostraram-nos algo inegável:

Fuja de bancos de dados caros e complexos.

Um dos que atende completamente a este axioma é o banco Oracle. Mesmo com uma equipe treinada, com constante monitoramento, o mesmo pode amanhecer em "halt". Sai do ar. A arquitetura de volumes físicos e virtuais é tão flexível, que ele "estica" e rompe. Um banco que movimenta um grande número de transações precisa, como todos os outros com menos transações de capacidade, manter parâmetros na memória do servidor. Não existe processamento sem memória, e não existe memória saudável sem um fornecimento constante de energia dentro de picos razoáveis de voltagem e de corrente elétrica.

Se entre estes picos de corrente houver uma grande frequência de transações, a chance de uma perda é muito grande, como a prática confirma em nossa instalações. E não adianta reduzir a carga do banco, pois o Oracle "gosta" de trabalhar é com carga pesada.

Bancos grandes estão sendo superados por novas técnicas e pelo hardware que já vem com funções embutidas que atendem muito bem às exigências de robustez e velocidade.

Um dos bancos recentes, que aguenta, em volume menor de transações, o "tranco" é o Mysql. Em 7 anos de operação de um banco de CMS (Gerenciadores de conteúdo para Web) reparamos o banco apenas 2 vezes. E olha que ele sofre 12 mil atualizações, pelo menos, ao dia de cada requisição registrada de clientes.

E para bancos menores, em Intranet, o Microsoft Access se sai muito bem. Alguns técnicos incautos, acostumados a ouvir opiniões de outros de capacidade duvidosa e pouca experiência, falam que este banco não se presta a centenas de milhares de registros. Evidentemente se esquecem, ou nunca se deram conta, de que no servidor Web o banco de dados utilizado se comporta como se servisse a uma aplicação monousuário. Neste contexto, o usuário anônimo do servidor é o único autorizado a ler e a gravar no banco.

Já manipulamos bancos Access, via Web, com 4 milhões de registros, numa média de 8000 transações só de entrada em Intranet, e o banco não apresentou defeito em Servidor Microsoft Windows 2003.

Utilizando corretamente um banco de dados

Todo banco de dados dá uma boa resposta, se bem utilizado. Em primeiro lugar, é preciso uma boa modelagem das tabelas SEM UMA NORMALIZAÇÃO EXCESSIVA pois a recuperação dos dados fica extremamente trabalhosa para o banco. Não use excesso de códigos que precisam de tabelas de apoio para serem traduzidos. Depois, faça as suas sentenças SQL de forma a recuperar somente o que for preciso. Utilize a ordenação em suas SQLs só quando for ABSOLUTAMENTE NECESSÁRIO. A ordenação pode ficar a cargo do javascript, muito mais eficiente, e feita no lado cliente. Pense duas vezes antes de utilizar os "famintos" campos BLOB. Uma boa Gestão de Conhecimento vai possibilitar a tipificação de eventos e situações de forma a evitar o preenchimento "aberto" demais dos campos, com frases despadronizadas e cujo conteúdo talvez não seja achado em uma busca.

Um bom lembrete:

Se você não está a par do que é Gestão de Conhecimento, nem comece a definir o esquema das tabelas de seu banco de dados.

Conclusão

Para Intranets, use bancos pouco pretensiosos, programas com cache e bem feitos. Para Internet, use Mysql. Para aplicações pesadas em redes dispersas em áreas geográficas, empresas com muitas filiais e escritórios de apoio, além de centros de desenvolvimento, use Oracle, mas contrate uma boa equipe de analistas de suporte 24 horas por 7 dias na semana.

sexta-feira, 6 de maio de 2011

Controle do time out

Para o correto gerenciamento dos recursos de um servidor Web (ISP), é preciso dimensionar com muita lógica e estudo o tempo de "time out" das aplicações.

O que é "time out" ?

Time out é o tempo após o qual a sessão na qual o usuário está, dentro de uma aplicação do servidor Web (IIS, Apache, Quick'n'easy, Chitami) expira, ou seja, ela cai e perde referências internas que sustentam a digitação ou operação do usuário.

Exemplo:

Você está preenchendo um formulário com informações para a a compra de um produto e demora demais. Quando vai olhar de novo para a tela do computador, ele exibe uma mensagem em inglês, ou informa de maneira clara que a página "expirou" e portanto você deve fazer tudo de novo.

Por que é preciso fazer isto ?

Se este controle de tempo não fosse feito, o servidor não suportaria tantas pessoas abrindo telas na Internet e deixando as mesmas abertas sem estar fazendo nada. Este tempo orça entre 10 e 20 minutos. Se uma pessoa não utiliza uma tela (não digita nada ou não mexe com o mouse) por 10 minutos, é porque a tela não lhe interessa mais. No caso do preenchimento de formulários, provavelmente a pessoa desistiu da compra ou de um cadastramento.

Controle pelo ASP

O controle pelo ASP é feito por intermédio das variáveis de Sessão (Session). O local predileto e adequado para iniciar a colocação de variáveis de sessão é a script chamada pela tela de login do sistema ou aplicação. Esta script recebe os dados do formulário de login (usuário e senha) e as trata:

<%

vUsuario = Request("Usuario") 
vSenha = Request("Senha")
Session("Usuario") = vUsuario      
%>

Os nomes dentro dos parênteses são os correspondentes "names" das tags de INPUT HTML da tela de login:

<FORM method="post" action="script de destino onde estará o código ASP">
Usuário:<INPUT type="text" name="Usuario">
Senha:<INPUT type="text" name="Senha">
</FORM>

A partir do processamento da script ASP, uma variável interna, invisível para todos os outros usuários que estiverem utilizando este sistema, armazenará o nome do usuário, e estará disponível para TODAS as páginas e scripts  chamadas por esta script.

Como testar se ocorreu o time out ?

No início das scripts chamadas por esta script e pelas demais, coloque o trecho:

<%
if Session("User") = "" then
Response.redirect "nome da script ou página HTML que corresponde à tela de login"
end if

%>

Desta forma, toda vez que uma script for chamada, vai ser feita a conferência da existência desta variável de Sessão (Session("Usuario")). Se ela estiver vazia, é porque perdeu o valor. E se perdeu o valor, é porque a sessão do usuário expirou.

sábado, 30 de abril de 2011

Bordas arredondadas com CSS3

Fazer bordas com CSS3 é muito fácil. Para Internet Explorer 8.0 (os de menor versão não oferecem tanta facilidade) é preciso ter o arquivo PIE.htc (baixe neste link) para definir o behaviour, como mostrado no código abaixo:


<head>
<style>
BODY { font: 12px Arial; }
P {
behavior: url(PIE.htc);
}
#ber {
color:red;
padding: 5px;
background:rgba(0, 255, 0, 0.7); /* Mozilla */
border:1px solid gray;
border-radius: 0.80em;
-pie-background:rgba(0, 255, 0, 0.7);/* For IE*/
width: 200px;
}


</style>
</head>
<body>
<P id="ber">Eu tenho borda arredondada</P>
</body>

Como declaramos em STYLE que os parágrafos tem o comportamento definido pelo PIE.htc, não será preciso fazer esta declaração a cada vez que quisermos um parágrafo modificado. Os outros browsers não precisam do PIE.htc.

O resultado na tela é:

Cor de fundo

Definimos a cor de fundo utilizando a cláusula rgba do CSS3, mas para isto o background do estilo precisa ser declarado como -pie-background, pois o Internet Explorer 8.0 ainda não dá suporte à cláusula rgba.

quarta-feira, 27 de abril de 2011

HTML5 e CSS3

A Web está entrando em mais uma etapa de evolução estética.

É muito cansativo e dispendioso investir em softwares que acrescentem beleza e usabilidade aos sites. Os softwares mais conhecidos como Photoshop, Flash, Fireworks e congêneres são caros. A manutenção e  renovação das licenças é cansativa. Se for preciso reinstalar e aproveitar a licença, é uma burocracia estressante.

A solução é procurar soluções as mais próximas da linguagem base da Web: o HTML e as folhas de estilo CSS, além das scripts de apoio Javascript. Mas este trio não fornecia, até a pouco tempo, uma opção de apresentação pelo menos "médio artística". Mas o padrão veio sendo melhorado, pois os micros clientes estão cada vez mais rápidos, com capacidade gráfica muito alta.

O HTML5

Agora que a linguagem HTML preenche os requisitos de formação de uma teia de conhecimento (Web) no que se refere ao estabelecimento de múltiplas vias de consulta, chegou a hora de resolver o avanço do aspecto estético. E o HTML5 surgiu para resolver este problema, fornecendo, em conjunto com o CSS3:


  • Cantos arredondados
  • Desenhos (canvas)
  • Sombras
  • Transparências


Isto entre algumas coisas.

O Internet Explorer

Para quem vai ter que continuar no Windows XP, ou devido ao pouco poder de seu equipamento, ou devido às amarras de sua licença de software, a opção de browser é Firefox, Flock ou Chrome. Estes suportam o HTML5. E a Microsoft, que sempre fica atrás, só oferece o Internet Explorer 8.0, para o qual já se anunciou que não será feito nenhum patch ou upgrade.

Mas a comunidade de informática é extremamente ativa e capaz. Tem gente que consegue dar nó em pingo de água. Surgiu o PIE, um patch do tipo página "htc", com acréscimos que conseguem acrescentar aos estilos as capacidades do CSS3. Ele pode ser baixado da internet no endereço https://github.com/lojjic/PIE/downloads (este endereço pode mudar devido à maleabilidade do ambiente Web).

Em outros posts ensinaremos o programador e designer a utilizar esta funcionalidade.

terça-feira, 26 de abril de 2011

O servidor Quick'n'easy

A simplicidade de certos servidores, depois que a comunidade livre disponibilizou fontes e abriu grupos de discussão, está simplesmente nos assombrando. Primeiro foi o Tiny Web com os seus 70 Kbytes, capaz de estabelecer conexões http. Agora este Quick'n'easy.

Contido em um arquivo de 374 Kbytes apenas, este software interpreta ASP, inclusive a parte de conexão com bancos de dados, permite os "includes" de códigos e espaço de variáveis de aplicação (application) e sessão (session).

Os testes com diretórios oriundos do IIS, sem modificação nenhuma, funcionaram 100%.

Outra coisa que impressionou é a sua compatibilidade com a adição de qualquer interpretador CGI ou fastCGI como alguns são denominados. A configuração é milhões de vezes mais fácil que o IIS, afinal recomendamos o software em questão para desenvolvimento ou produção em pequenas redes.

Gerenciador


O gerenciador é extremamente simples, fornece estatísticas como servidores "maduros" e consagrados, filtro de IP e congêneres.

Configuração do PHP

Como é uma linguagem de scripts muito "querida" entre os bons desenvolvedores, a configuração do PHP merece destaque, e é de uma simplicidade franciscana:


O caminho do executável é que pode variar, de acordo com o que você digitar durante a instalação do PHP.

Realmente são 374 Kbytes que resolvem.

JSP ou PHP são realmente melhores que ASP ?

Prezados leitores, após 20 anos de instalação de IIS, PHPTriad, Jakarta e outras variantes, acrescidos de testes com formulários de entrada de dados com conexão preferencialmente em ODBC, com bancos Oracle, Mysql, Msaccess, SQLite e HSQLdb, podemos afirmar com absoluta certeza:

O ASP (até sem ser o .NET) é o mais seguro, produtivo e barato para se trabalhar.

O papel no ASP nas aplicações WEB de três camadas deve ser, sempre, o de coletar os dados oriundos da conexão com o banco de dados. Desta forma, ele trabalha muito bem. Ele também é eficiente, aliás, o mais eficiente na formulação de templates para apresentação dos dados, aliado à simplicidade dos seus arrays (mesmo sendo tão primitivos).

O médio formalismo do ASP.NET já dificulta a compreensão pela nova geração de programadores, que, pelo uso excessivo de ferramentas de modelagem a partir de templates já se afastou demasiadamente do exercício saudável de descer ao código e incrementar características.

O JSP é realmente para quem acompanhou o progresso do SDK do Java desde os seus primórdios, domina o DOS ou Bourne Shell e as entranhas de arquiteturas de memória virtual e outras coisas afins.

O poder do ASP é multiplicado infinitas vezes pelo jQuery - framework poderosa - deixando para este as críticas de campo, modificações antes da submissão, formatação, simulação de cache, autenticação e até leitura de algumas informações do banco de dados via AJAX. No nível Javascript está a verdadeira utilidade do Java, e não na leitura de banco de dados campo a campo.

O investimento em JSP e suas plataformas não compensa, além do mais em um mercado cuja mão de obra é muito rotativa. Já tivemos oportunidade de observar uns quatro casos de pequenas empresas que iniciaram projetos para plataformas Java (J2EE e parentes). Até a definição de classes, acessos, tudo muito bonito em modeladores UML foi tudo bem. Mas na hora da prática, da mão de obra e da manutenção, a solução ou foi "quarterizar" o projeto, ou "regredir" para ASP.NET.

A plataforma Linux

O Linux é excelente. No entanto, exige profissionais capazes, geralmente mais velhos, que acompanharam a evolução das versões do Kernel. E estes profissionais são tão bons, que sua ascensão na carreira acaba conduzindo-os para Universidades e projetos em empresas de porte. Resultado: projetos são interrompidos, clientes tem seu sistema adiado e empresas de serviços tem que ficar garimpando gente.