Interfaces Unidade3
Interfaces Unidade3
3.1 Conceitos
Quando pensamos no desenvolvimento de interfaces para WeB, não podemos deixar
de pensar em questões de performance. Mesmo com o aumento constante da
velocidade da difusão da banda larga, a Internet ainda possui um volume significativo
de usuários que ainda possuem conexões de baixa performance.
Alem disso, o uso cada vez mais comum dos meios digitais para comercio eletrônico,
tem elevado o grau de importância dado a performance. Neste âmbito, apenas alguns
segundos podem ser cruciais para a definição da concretização ou não de um volume
maior de vendas.
Existem várias tecnologias que se popularizaram para este tipo de aplicação, dentre
elas podemos citar .net, php, jsp, javascript, XML, mas cada uma delas tem sua
participação no desenvolvimento de sistemas para web.
A combinação de linguagens mais popular é a chamada Ajax, da qual veremos mais
detalhes nas próximas unidades.
1
Interfaces - Desempenho
Como sabemos devido ao Javascript ser uma linguagem Client Side não é possível
realizar a leitura de um arquivo texto comum pelo Javascript, pelo menos de forma que
este reflita as informações e comportamentos retornados pelo servidor, desta maneira
ficamos apegados à uma forma de poder executar um arquivo dinâmico do outro lado,
sem que este seja exibido, ou sequer acessado diretamente pelo cliente.
A forma que estes dados serão retornados será em XML ou através de uma String que
será tratada por nós no Javascript.
Exemplos simples de aplicações com Ajax, são simples formulários web que não
necessitam ser recarregados para buscarem determinadas informações do servidor,
como o caso de o usuário selecionar um estado e logo após aparecem as opções de
seleção de cidades do respectivo estado selecionado no processo anterior. Desta
forma ganhamos tempo de navegação e satisfação do usuário que está navegando
em nosso site.
Veja abaixo alguns outros exemplos práticos:
Carrinho de compras: utilizando-se da manipulação em DOM o usuário pode arrastar
e soltar produtos diretamente dentro do carrinho, sem a necessidade de esperar por
inúmeras requisições da pagina ao servidor.
Formulários com grande número de campos: possibilidade de selecionar os
campos que serão preenchidos e estes já auto formularem os dados disponíveis em
outros elementos do formulário, sem o recarregamento da página.
Auto completar: recurso já disponível em aplicativos que são executados no desktop
também pode ser implementado em um site da internet, sugerindo palavras conforme
os caracteres que o usuário digita no teclado em determinado campo do formulário.
2
Interfaces - Desempenho
3
Interfaces - Desempenho
4
Interfaces - Desempenho
var s;
var a = new Array("maçã", "banana")
s = a[3].substring(0,4);
document.write(s);
O exemplo acima se executado irá retornar um erro dizendo que o vetor não possui a
posição solicitada, e que não é possível executar a função substring no elemento
desejado.
Caso quiséssemos executar este mesmo processo de forma que caso algo de errado
seja retornado um erro coerente para o usuário poderíamos usar o TRY and CATCH.
5
Interfaces - Desempenho
try{
s = a[3].substring(0,4);
}catch(e){
s = “Ocorreu um erro no script!”;
}
document.write(s);
O TRY and CATCH é um teste seqüencial que sempre retorna um valor e que visa
tratar um erro que possa interromper a execução do script de forma grosseira.
NOTA: Apesar de estas instruções não fazerem parte do padrão ECMAScript, elas são
suportadas por todos os browsers importantes e são de grande utilidade para a
construção de código robusto.
Em qual circunstância será usado o TRY and CATCH?
6
Interfaces - Desempenho
Onde:
XMLHTTP: Objeto Javascript que torna possível a comunicação assíncrona com o
servidor, sem a necessidade de recarregara página por completo. Este objeto fazer
parte da especificação DOM nível 3.
Veja um exemplo da função abaixo:
function criaxmlhttp(){
try{
xmlhttp = new XMLHttpRequest();
}catch(e){
try{
xmlhttp = new
ActiveXObject("Microsoft.XMLHTTP");
}catch(e1){
try{
xmlhttp = new
ActiveXObject("Msxml2.XMLHTTP");
}catch(e2){
xmlhttp = false;
document.write("Navegador não da
suporte a Ajax!");
}
}
}
}
7
Interfaces - Desempenho
Com esta função iremos ao longo do curso prosseguir com a consulta assíncrona de
dados no servidor, sendo que como podemos analisar em ultimo caso é retornado um
erro informado que o navegador do usuário não é compatível com AJAX.
8
Interfaces - Desempenho
Para realizar a requisição utilizaremos do método OPEN no qual serão passados três
parâmetros:
Onde:
Objeto: objeto XmlHTTP gerado pela função anteriormente vista.
Método: GET ou POST.
Assíncrona: valor booleano no qual TRUE representa que a conexão é assíncrona, e
necessita de um retorno dado pelo servidor, e FALSE caso contrário.
Vejamos então como ficará a nossa função juntamente de alguns outros métodos
essenciais no Ajax:
function acessa(elemento,valor){
criaxmlhttp();
xmlhttp.open("GET",”arquivo01.php,true);
xmlhttp.send(null);
}
Logo após é chamado o método “send” o qual podemos retornar algum tipo de valor
para o servidor, mas neste caso simplesmente retornamos como NULL significando
assim que não há mais nada a ser realizado no processo.
9
Interfaces - Desempenho
Logo, devemos então incorporar estes métodos em nossa função, ficando a mesma da
seguinte maneira:
function acessa(){
criaxmlhttp();
xmlhttp.open("GET","arquivo01.php,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4)
alert(‘Dados Carregados!’);
}
xmlhttp.send(null);
}
Observe que neste caso só nos interessa o estado de leitura “4”, ou seja, estamos
executando determinada ação somente quando o servidor tiver retornado por completo
os dados do documento dinâmico e sua execução estiver sido completada do outro
lado.
10
Interfaces - Desempenho
Laboratório:
Tendo em vista o que foi ensinado até o momento já temos idéia de como são
analisadas as requisições em Ajax de uma forma macro.
Elabore um script aproveitando as funções vistas anteriormente de forma que seja
solicitada a execução de um script dinâmico em no servidor e enquanto este não
estiver completamente carregado seja exibida em uma DIV a mensagem: “Aguarde:
carregando...”
<?php
echo “Curso de AJAX”;
?>
11
Interfaces - Desempenho
Crie então uma nova função a qual chamaremos de monta(), ficando ela como
mostrado abaixo:
function monta(){
var dados = xmlhttp.responseText;
}
Como você pode observar é criada uma variável “dados” na qual o método
responseText é chamado em conjunto com o objeto já criado anteriormente xmlhttp.
Todos os dados retornados pelo servidor estão agora armazenados dentro desta
variável, podendo ser tratados como uma variável simples Javascript.
Criaremos no mesmo documento uma DIV com o nome de CONTEUDO e injetaremos
dentro dela o conteúdo retornado pelo servidor:
function monta(){
var dados = xmlhttp.responseText;
document.getElementById(“CONTEUDO”).innerHTML = dados;
}
function acessa(){
criaxmlhttp();
xmlhttp.open("GET","arquivo01.php”,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
monta();
else
document.getElementById(“CONTEUDO”).innerHTML =
"Carregando...";
}
xmlhttp.send(null);
}
12
Interfaces - Desempenho
xmlhttp.open(“GET”,”arquivo01.php?id_pessoa=”+15,true);
Só não se esqueça de setar o método correto acima para que o script interprete e
receba as variáveis enviadas pelo Javascript no momento de execução.
Exemplo:
Utilizando um pouco mais de manipulação de elementos em DOM, realize o seguinte
exercício:
Monte um documento em HTML que possua dois componentes do tipo SELECT em
um formulário, sendo que no primeiro serão listados alguns estados brasileiros e no
outro ao selecionar-se o estado serão apresentadas as respectivas cidades deste
estado, conforme mostrado na imagem abaixo:
Solução:
Para resolver este exercício você necessitará de 4 arquivos:
cidades.php: arquivo onde ficará o formulário HTML.
ajax01.js: Java script que será responsável pela execução assíncrona do arquivo
dinâmico no servidor e recuperação dos dados para o cliente.
conexão.php: arquivo simples em php que simplesmente fará a conexão com o banco
de dados.
13
Interfaces - Desempenho
Agora que possuímos os dados que serão acessados no banco de dados, criamos o
arquivo de conexão com o banco:
CONEXAO.PHP
<?php
mysql_connect('localhost','root','') or die(mysql_error());
mysql_select_db('alfamidia');
?>
A seguir o arquivo CIDADES.PHP o qual será a interface para o usuário:
14
Interfaces - Desempenho
<?php
include('includes/conexao.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-
8859-1" />
<script src="ajax01.js" type="text/javascript">
</script>
<title>Exercicio Ajax</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<table width="400" border="0" cellspacing="2" cellpadding="2">
<tr>
<td colspan="2">Formulário:</td>
</tr>
<tr>
<td width="55">Estado:</td>
<td width="331">
<select name="estado" id="estado"
onchange="acessa('cidades',this.value);" >
<option value="00">Selecione</option>
<?php
$sql = "select * from estados order by nome";
$rs = mysql_query($sql) or die(mysql_error());
$total = mysql_num_rows($rs);
for($x = 0; $x < $total; $x++)
{
$id_estado = mysql_result($rs, $x, 'id_estado');
$nome = mysql_result($rs, $x, 'nome');
?>
<option value="<?php echo $id_estado; ?>"><?php echo $nome;
?></option>
15
Interfaces - Desempenho
<?php
}
?>
</select>
</td>
</tr>
<tr>
<td>Cidade:</td>
<td>
<select name="cidades" id="cidades">
</select>
</td>
</tr>
</table>
</form>
</body>
</html>
$id_estado = $_GET["id_estado"];
$resultado = '';
for($x = 0; $x < $total; $x++){
16
Interfaces - Desempenho
function acessa(elemento,valor){
criaxmlhttp();
xmlhttp.open("GET","ajax01.php?id_estado="+valor,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
monta(elemento);
}else{
17
Interfaces - Desempenho
document.getElementById(elemento).innerHTML
="Carregando...";
}
}
xmlhttp.send(null);
}
function monta(elemento){
var dados = xmlhttp.responseText;
campo = document.getElementById(elemento);
campo.options.length = 0;
Laboratório:
1. Crie dois selects: O primeiro deve conter uma lista de tipos de filme que seja
carregada a partir de um banco de dados. Ao clicar duas vezes sobre o tipos
de filme o mesmo deve ser deslocado para o select 2.
2. Crie um select com uma lista de 3 páginas que ao ser alterado mudará o
conteúdo de uma div para a página montada com algum parâmetro.
3. Monte uma caixa de texto que pesquise o que for digitado e mostre o que for
encontrado em uma tabela em uma div logo abaixo(como um “auto-
completar”)
4. Crie uma lista de categorias de produtos que exiba em uma textarea a lista dos
produtos desta categoria.
18