oi meus amigos, segue abaixo um exemplo de como não fazer as coisas…
Acho que esse é o primeiro passo para que eu consiga melhorar 
Abraços
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sistaxi - Gerar Corrida</title>
<link type="text/css" href="css/autocomplete.css" rel="stylesheet" />
<link type="text/css" href="http://code.jquery.com/ui/jquery-ui-git.css" rel="stylesheet" />
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="js/geocode.js"></script>
</head>
<body>
<%@ include file="/jsp/menuPage.jsp"%>
//ao carregar essa pagina ela recebe um arraylist de clientes automaticamente
// se usar a forma que mostro abaixo de como ler esse array vc nem precisa recupera-lo do "response" graças ao struts 2
//agora se quiser recuperar do response e fazer como faria em um javascript, ok o array está no response do mesmo jeito
//pra não precisar recuperar do response o array pode ser lido assim:
// listaCliente[i].{variavel} que quero recuperar ex. nome, id, telefone etc...
// listaCliente[i].{nome} recupera o nome na posição i
//por exemplo listaCorrida[#i].nome recupera o nome do cliente na posição i
//esta notação estranha pra recuperar é pq uso struts 2 mas na verdade pode ser usada qualquer notação q leia um array
//o campo de pesquisa abaixo está tosco e faz refresh na pagina
//deveria poder pesquisar por nome ou telefone e atualizar o form abaixo sem dar refresh
// se um taxi que estava ocupado ficar livre o operador não vai saber se não der refresh
//inicio do campo pesquisa
//note que após escolher o cliente no combobox eu aperto em preencher campos que envia o nome do cliente para
//a url gerarCorrida e passa como parametro funcao=clienteSelecionado
// a servlet recebe o nome do cliente, faz uma busca no banco por um cliente q tenha aquele nome
//(tosco, se dois cliente tiverem o mesmo nome ferrou)
// a servlet chama esta mesma pagina aqui, mas agora no response
//vem as informacoes do cliente selecionado então posso preencher o form com esses dados
//assim o operador do sistema confirma os dados altera algo que queira e gera a corrida
<s:form action="gerarCorrida" theme="simple">
//coloca todo os nomes de clientes em uma combobox
<s:select list="listaCliente.{nome}" name="cliente.nome"
label="Selecionar Cliente" headerValue="-- Selecione --"
headerKey="-1" />
//ao clicar em submit chama a sevlet passando a função clienteSelecionado
//seria a mesma coisa q gerarCorrida?funcao=clienteSelecionado
<s:hidden name="funcao" value="clienteSelecionado" />
<s:submit type="button" label="Preencher campos" theme="simple" />
</s:form>
//esse form recebe os dados do cliente selecionado no combobox após o refresh da página
//sim, tosco, a página faz refresh
// o campo value="%{cliente.nome} e similares servem pra pegar a informação sem precisar fazer request.getParameter
<s:form action="gerarCorrida" id="formulario">
<s:textfield name="cliente.nome" label="Nome" value="%{cliente.nome}" />
<s:textfield id="address" name="cliente.rua" label="Rua" value="%{cliente.rua}" />
<s:textfield id = "numero" name="cliente.numero" label="Número"
value="%{cliente.numero}" />
<s:textfield name="cliente.complemento" label="Complemento"
value="%{cliente.complemento}" />
<s:textfield id = "cidade" name="cliente.cidade" label="Cidade"
value="%{cliente.cidade}" />
<s:textfield name="cliente.telefone" label="Telefone"
value="%{cliente.telefone}" />
<s:textarea name="cliente.observacao" label="Observações do Cliente"
value="%{cliente.observacao}" />
<s:textarea name="corridaObservacao" label="Observações da Corrida" />
<s:hidden id="latitude" name="cliente.latitude" label="Latitude"
value="%{cliente.latitude}" />
<s:hidden id="longitude" name="cliente.longitude" label="Longitude"
value="%{cliente.longitude}" />
<s:hidden name="funcao" value="gerarCorrida" />
<s:hidden name="cliente.id" value="%{Cliente.id}" />
<s:hidden id = "latLong" name="latLong" />
</s:form>
//ao enviar este formulario para gerarCorrida?funcao=gerarCorrida
// a servlet grava a nova corrida no banco, procura por um taxi livre
//que esteja próximo ao endereço do cliente graças a calculos que tranformam
//o endereço do cliente em coordenada e compara com a coordenada de cada taxi
//enviada pelo GPS a cada segundo
// se nao tiver nenhum taxi livre o sistema deve avisar nenhum taxi livre, mas continuar aguardando
//algum taxista clicar em livre na tela do GPS
<input type="button" value="Nova Corrida" onclick="codeAddress()">
//sempre que o gerarCorrida é chamado, independente da funcao passada
//ele tbm sempre retorna um array listaCorrida com os dados atualizados da corrida
// esta tabela tosca não se altera até que a página tenha tido um refresh por algum motivo qualquer
//do usuario ter apertado F5 ou ter gerado uma nova corrida
//o funcionamento desse array com struts 2 é exatamente igual o caso do cliente
<table border=3 align="center">
<tr>
<th colspan=3 align="center">
<h1>Corridas Ativas</h1></th>
</tr>
<tr>
<th align="center">Cliente</th>
<th align="center">RT</th>
<th align="center">Ação</th>
</tr>
<s:iterator value="listaCorrida">
<tr>
<td width="33%" align="center"><s:property value="cliente.nome" />
</td>
<td width="33%" align="center"><s:property value="taxi.rt" />
</td>
<td width="33%" align="center"><s:set name="id"
value="listaCorrida[#stat.index].id" /> <input name=""
type="button"
onclick="parent.location.href='gerarCorrida.action?corrida.id=<s:property value="id" />&funcao=cancelarCorrida' "
value="Cancelar"></td>
</tr>
</s:iterator>
</table>
</body>
</html>