Atualizar combo: struct 2 - jsp - ajax (cidade por estado)

Pessoal,
Estou iniciando no estudo de java e montei um esquema struct 2 e jsp de uma tela de cadastro de usuarios para teste.
Agora estou incrementando a tela e ao tentar alimentar o combo cidade com as cidades de um determinado estado, conforme está registrado no banco de dados, aguarrei novamente.

O sistema esta atualizando legalzinho com ajax e montando o list com as cidades, mas num consigo fazer com que o combo cidade da tela seja atualizado por nada desse mundo.

Caso possam me ajudar agradeceria muito.
Grato.

Minha action

        @Action(value="CarregaCidade",results = {@Result(name=SUCCESS, location="/usuario.jsp")})		
	public String CarregaCidade() 
	{
		//Declarando as variaveis
		romulor2.dao.Cidade ciddao = new romulor2.dao.Cidade();  
		conn.iniciaTransacao();
		romulor2.bel.Cidade pesquisacidade = new romulor2.bel.Cidade();
		
		//preenchendo o filtro
		pesquisacidade.setEstado(uf);
		
		//Pesquisando as cidades
		List<romulor2.bel.Cidade> cid = ciddao.pesquisar(conn.getSessao(), pesquisacidade);
		
		//Preenchendo  List do combo
		cidade = new ArrayList<String>();
		for (Cidade cidadeEstado : cid)
			cidade.add(cidadeEstado.getNomeCidade());
		
		return SUCCESS;
	}

O jsp

<%@ 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>
		<title>teste</title>
		<script type="text/javascript" src="csjquery/jquery-1.4.2.min.js"></script>
		<script type="text/javascript" src="csjquery/jquery.ui.widget.min.js"></script>
		<script type="text/javascript" src="csjquery/jquery.ui.core.min.js"></script>
		<script type="text/javascript" src="csjquery/jquery.ui.button.min.js"></script>
	</head>
	<body >
		<s:form action="UsuarioSalvar">
			<fieldset>
				<legend>teste</legend>
				<dl>
					<s:textfield name="usuario.nomeUsuario" label="Nome:" />
					<s:textfield name="usuario.loginUsuario" label="Login:" />
					<s:textfield name="usuario.senhaUsuario" label="Senha:" />
					<s:textfield name="usuario.emailUsuario" label="E-mail:" />
					<s:textfield name="usuario.dataNascimento" label="Data:" />
					<s:select name="usuario.sexo" list="sexo" headerKey="0" label="Sexo:" />
					<s:select name="usuario.estado" list="estado" headerKey="0" label="UF:" onchange="CarregaCidade(this.value)" />
					<s:select name="usuario.cidade" list="#{cidade}" headerKey="0" label="Cidade:" />
				</dl>				
			</fieldset>	
			<script type="text/javascript">
				function CarregaCidade(estado) 
				{
					$.get("CarregaCidade.action?uf=" + estado);
				}
			</script>
			
			<fieldset>
				<center><s:submit /></center>
			</fieldset>								
		</s:form>
	</body>
	
</html>

No seu java script (carregaCidade) faça algo desse tipo.

$.getJSON("CarregaCidade.action?uf=" + estado,function(data){

       for (var i = 0; i < data.length; i++){
              str = str + '<option value="'+data[i].idCidade+'">'+data.nmCidade+'</option>';
       }
       $('#selectDasCidades').html(str);
});

mais lembre-se, sua action tem que retorna um objeto do tipo json.

espero ter ajudado!

Amigão.
Mas assim não utilizo a propriedade list do combo.
Minha ideia é não ter código no front end (como é feito no C#).

Vi a possibilidade de usar o plugin jquery-struct2, mas nesse caso ainda foi pior o sistema nem carrega o combo na primeira vez (veja o post: http://www.guj.com.br/posts/list/216685.java).

Valeu e aguardo novidades.

sem nenhum codigo no front end acho meio difícil, pelo menos algo para chamar a function que popula tem q ter.

Sim. Claro.
Isso eu até fiz.
O que não desejo fazer é colocar coisas como um for para preencher o combo.

Gostaria de trazer o objeto list da action e que o combo o interpretasse como acontece no momento que carrego a tela.

O problema é que consigo carregar a lista, mas não sei como dar o “refresh” no combo.

tenta assim:

<SCRIPT type="text/javascript">

   //Chame a função toda vez que alterar o valor
   function alterarCombo(){
      $.publish('reloadcidades');
   }

</SCRIPT>
<s:form id ="formCadPaciente" >

   <s:select "ESTADOS" />

   <s:url id="cidadeslist" action="cidade" method="listacidades" ></s:url>

   <sj:select name="paciente.cidade.idCidade" href="%{cidadeslist}" formIds="formCadPaciente" reloadTopics="reloadcidades" list="cidades" listKey="idCidade" listValue="nmCidade" />
</s:form>

Procura ver como funciona as tags onChangeTopics onCompleteTopics reloadcidades do sj:select.

Pessoal.
Desculpe a insistencia, mas ainda naum consegui fazer isso funcionar!
O action está sendo disparado, a list esta sendo preenchida mas a pagina não é atualizada. Veja que estou tentando preencher o textfield login tambem, mas nem ele está atualizando!!!

Olha meu código alterado.

<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<html>
	<head>
	    
  		<title>teste</title>
		<meta name="Description" content="R2 WebDeveloper." />
		<meta name="Keywords" content="your, keywords" />
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<meta name="Distribution" content="Global" />
		<meta name="Author" content="R2 Web - romulor2@gmail.com" />
		<meta name="Robots" content="index,follow" />
		<sj:head jqueryui="true"/>
		<script type="text/javascript">
			function cidadeslist(estado) 
			{      //a função
				$.post("CarregaCidade.action?estadoValor=" + estado);
			}
		</script>		
	</head>
	<body >
		<s:form id="form" action="UsuarioIncluir" theme="simple" cssClass="yform">
		<fieldset>
            <legend>AJAX Form</legend>    
			<div class="type-text">
	            <label for="echo">Echo: </label>
	            <s:textfield id="echo" name="echo" value="Hello World!!!"/>
	        </div>
			<dl><sj:textfield name="usuario.nomeUsuario" label="Nome:" /></dl>
			<dl>
				<sj:textfield name="usuario.loginUsuario" label="Login:" reloadTopics="CarregaCidade" />
				<sj:textfield name="usuario.senhaUsuario" label="Senha:" />
			</dl>
			<dl><sj:textfield name="usuario.emailUsuario" label="E-mail:" /></dl>
			<dl><sj:textfield name="usuario.dataNascimento" label="Data:" /></dl>
			<dl><s:select name="usuario.sexo" list="sexo" headerKey="0" label="Sexo" /></dl>
			<dl id="ufcidade">
				<s:url id="cidadeslist" action="CarregaCidade"></s:url> //o esquema do estado chamando a cidade.
				<s:select name="estadoValor" list="estado" headerKey="0" label="UF" onchange="cidadeslist(this.value)" />
				<sj:select href="%{cidadeslist}" reloadTopics="CarregaCidade" name="usuario.cidade" list="cidade" headerKey="0" label="Cidade" />
			</dl>
		</fieldset>	
		<fieldset>
			<center><sj:submit targets="formResult" value="Salvar Dados" indicator="indicator"/></center>
		</fieldset>								
		</s:form>
	</body>
	
</html>

a Action

@Action(value="CarregaCidade",results = {@Result(name=SUCCESS, location="/usuario.jsp")})		
	public String CarregaCidade() 
	{
		estado = new ArrayList<Estado>(); 
		for(Estado est : Estado.values())
			estado.add(est);

		sexo = new ArrayList<Sexo>(); 
		for(Sexo sex : Sexo.values())
			sexo.add(sex);

		romulor2.bel.Cidade cidadepesquisa = new romulor2.bel.Cidade();
		cidadepesquisa.setEstado(estadoValor);
		romulor2.dao.Cidade ciddao = new romulor2.dao.Cidade();   
		conn.iniciaTransacao();
		List<romulor2.bel.Cidade> result = ciddao.pesquisar(conn.getSessao(), cidadepesquisa);
		
		cidade = new ArrayList<String>();
		for (int i = 0; i < result.size(); i++) {
			cidade.add(result.get(i).getNomeCidade());
		}
		
		romulor2.bel.Usuario usuteste = new romulor2.bel.Usuario();
		usuteste.setLoginUsuario("refresh");
		
		this.setUsuario(usuteste);
		
		return SUCCESS;
	}

A impressão que tenho é que seja algum problema de ajax, mas até agora num descobri o que pode ser!

romulor2 você conseguiu resolver este problema??? to tentando fazer a mesma coisa e não to conseguindo.

Rapaz.
Desisti de tentar e comecei a estudar o richface

vlw romulor2 motivador rsrsr
to tentando o struts2 jquery
mas ainda nao testei